Subversion Repositories SmartDukaan

Rev

Rev 9784 | Rev 20020 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package in.shop2020.serving.services;

import in.shop2020.config.ConfigException;
import in.shop2020.model.v1.inventory.WarehouseLocation;
import in.shop2020.model.v1.order.Order;
import in.shop2020.serving.model.ShipmentUpdate;
import in.shop2020.thrift.clients.config.ConfigClient;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.TrackWebServiceClient;
import com.fedex.track.stub.ClientDetail;
import com.fedex.track.stub.TrackDetail;
import com.fedex.track.stub.TrackEvent;
import com.fedex.track.stub.TrackReply;
import com.fedex.track.stub.WebAuthenticationCredential;
import com.fedex.track.stub.WebAuthenticationDetail;

public class FedExTrackingService {
        
        private static final Log log = LogFactory.getLog(FedExTrackingService.class);
        private ClientDetail clientDetails;
        private WebAuthenticationDetail waDetails;
        private String endPointAddress;
        /**
         * @param args
         */
        
        public FedExTrackingService(WarehouseLocation location){
                clientDetails = getFedExClientDetails(location);
                waDetails = getFedExWebAuthenticationDetails(location);
                endPointAddress = getFedExEndpointAddress();
        }
        
        public ClientDetail getFedExClientDetails(WarehouseLocation whlocation){
                ClientDetail clientDetail = new ClientDetail();
        String accountNumber ="";
        String meterNumber ="";
                try {
                        if(WarehouseLocation.Mumbai==whlocation){
                                accountNumber = ConfigClient.getClient().get("fedex_account_number_mumbai");
                                meterNumber = ConfigClient.getClient().get("fedex_meter_number_mumbai");
                        }
                        else{
                                accountNumber = ConfigClient.getClient().get("fedex_account_number");
                                meterNumber = ConfigClient.getClient().get("fedex_meter_number");
                        }
                } catch (ConfigException e) {
                        log.error("Could not fetch Client Detail", e);
                }
                log.info("fedex_account_number in Tracking Service"+accountNumber);
                log.info("fedex_meter_number in Tracking Service"+meterNumber);
        clientDetail.setAccountNumber(accountNumber);
        clientDetail.setMeterNumber(meterNumber);
                return clientDetail;
        }
        
        public WebAuthenticationDetail getFedExWebAuthenticationDetails(WarehouseLocation whlocation){
        WebAuthenticationCredential wac = new WebAuthenticationCredential();
        String key="";
        String password="";
                try {
                        if(WarehouseLocation.Mumbai==whlocation){
                                key = ConfigClient.getClient().get("fedex_authenication_key_mumbai");
                                password = ConfigClient.getClient().get("fedex_authenication_password_mumbai");
                        }
                        else{
                                key = ConfigClient.getClient().get("fedex_authenication_key");
                                password = ConfigClient.getClient().get("fedex_authenication_password");
                        }
                } catch (ConfigException e) {
                        log.error("Could not fetch Web Authenication Detail", e);
                }
                log.info("fedex_authenication_key in Tracking Service"+key);
                log.info("fedex_authenication_password in Tracking Service"+password);
        wac.setKey(key);
        wac.setPassword(password);
                return new WebAuthenticationDetail(wac);
        }
        
        public String getFedExEndpointAddress(){
                String endPoint="";
                try {
                        endPoint = ConfigClient.getClient().get("fedex_endpoint_address_track");
                } catch (ConfigException e) {
                        log.error("Could not fetch enpoint Address", e);
                }
                log.info("fedex_endpoint_address_track in Tracking Service"+endPoint);
                return endPoint;
        }
        
        public Map<String,String> readFedExPickupOrdersMap(List<Order> ordersList){
                log.info("Into Method to Read Fedex Pickup Orders.... "+ ordersList.size());
                Map<String,String> fedexPickupOrdersMap= new HashMap<String,String>();
                for(Order ord: ordersList){
                        String awbNumber= ord.getAirwaybill_no();
                        System.out.println("Order Id.... "+ord.getId()+".....Airwaybill No..... "+awbNumber);
                        TrackReply trackreply = TrackWebServiceClient.getTrackingUpdates(awbNumber, clientDetails, waDetails, endPointAddress);
                        if(trackreply!=null){
                                log.info("Successfully get Fedex Pickup Orders Reply");
                                TrackDetail[] trackDetails=trackreply.getTrackDetails();
                                SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
                                SimpleDateFormat timeformat = new SimpleDateFormat("HH:mm:ss");
trackDetailsLoop:for (int i=0; i< trackDetails.length; i++) {
                                        TrackEvent trackEvents[]= trackDetails[i].getEvents();
                                        if(trackEvents!=null && trackEvents.length > 0){
                                                for(TrackEvent te : trackEvents){
                                                        if("PU".equalsIgnoreCase(te.getEventType()) || "OC".equalsIgnoreCase(te.getEventType())){
                                                                fedexPickupOrdersMap.put(awbNumber, dateformat.format(te.getTimestamp().getTime())+" "+timeformat.format(te.getTimestamp().getTime()));
                                                                break trackDetailsLoop;
                                                        }       
                                                }
                                        }
                                }
                        }
                }
                log.info("Read Fedex Pickup Orders");
                return fedexPickupOrdersMap;
        }
        
        public Map<String,String> readFedExReachedDestinationOrdersMap(List<Order> ordersList){
                log.info("Into Method to Read Fedex Reached Destination Orders.... "+ ordersList.size());
                Map<String,String> fedexReachedDestinationOrdersMap= new HashMap<String,String>();
                for(Order ord: ordersList){
                        String awbNumber= ord.getAirwaybill_no();
                        System.out.println("Order Id.... "+ord.getId()+".....Airwaybill No..... "+awbNumber);
                        TrackReply trackreply = TrackWebServiceClient.getTrackingUpdates(awbNumber, clientDetails, waDetails, endPointAddress);
                        if(trackreply!=null){
                                log.info("Successfully get Fedex Reached Destination Orders");
                                TrackDetail[] trackDetails=trackreply.getTrackDetails();
                                SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
                                SimpleDateFormat timeformat = new SimpleDateFormat("HH:mm:ss");
trackDetailsLoop:for (int i=0; i< trackDetails.length; i++) {
                                        TrackEvent trackEvents[]= trackDetails[i].getEvents();
                                        if(trackEvents!=null && trackEvents.length > 0){
                                                for(TrackEvent te : trackEvents){
                                                        if("AR".equalsIgnoreCase(te.getEventType())){
                                                                fedexReachedDestinationOrdersMap.put(awbNumber, dateformat.format(te.getTimestamp().getTime())+" "+timeformat.format(te.getTimestamp().getTime()));
                                                                break trackDetailsLoop;
                                                        }       
                                                }
                                        }
                                }
                        }
                }
                log.info("Read Fedex Reached Destination Orders");
                return fedexReachedDestinationOrdersMap;
        }
        
        public Map<String,String> readFedExDeliveredOrdersMap(List<Order> ordersList){
                log.info("Into Method to Read Fedex Delivered Orders.... "+ ordersList.size());
                Map<String,String> fedexDeliveredOrdersMap= new HashMap<String,String>();
                for(Order ord: ordersList){
                        String awbNumber= ord.getAirwaybill_no();
                        System.out.println("Order Id.... "+ord.getId()+".....Airwaybill No..... "+awbNumber);
                        TrackReply trackreply = TrackWebServiceClient.getTrackingUpdates(awbNumber, clientDetails, waDetails, endPointAddress);
                        if(trackreply!=null){
                                log.info("Successfully get Fedex Delivered Orders");
                                TrackDetail[] trackDetails=trackreply.getTrackDetails();
                                SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
                                SimpleDateFormat timeformat = new SimpleDateFormat("HH:mm:ss");
trackDetailsLoop:for (int i=0; i< trackDetails.length; i++) {
                                        TrackEvent trackEvents[]= trackDetails[i].getEvents();
                                        if(trackEvents!=null && trackEvents.length > 0){
                                                for(TrackEvent te : trackEvents){
                                                        if("DL".equalsIgnoreCase(te.getEventType())){
                                                                if(trackDetails[i].getDeliverySignatureName()!=null && !trackDetails[i].getDeliverySignatureName().isEmpty()){
                                                                        fedexDeliveredOrdersMap.put(awbNumber, dateformat.format(te.getTimestamp().getTime())+" "+timeformat.format(te.getTimestamp().getTime())+"|"+trackDetails[i].getDeliverySignatureName());
                                                                }
                                                                else{
                                                                        fedexDeliveredOrdersMap.put(awbNumber, dateformat.format(te.getTimestamp().getTime())+" "+timeformat.format(te.getTimestamp().getTime())+"|"+ord.getCustomer_name());
                                                                }
                                                                break trackDetailsLoop;
                                                        }       
                                                }
                                        }
                                }
                        }
                }
                log.info("Read Fedex Delivered Orders");
                return fedexDeliveredOrdersMap;
        }
        
        public Map<String,String> readFedExReturnedOrdersMap(List<Order> ordersList){
                log.info("Into Method to Read Fedex Returned Orders.... "+ ordersList.size());
                Map<String,String> fedexReturnedOrdersMap= new HashMap<String,String>();
                for(Order ord: ordersList){
                        String awbNumber= ord.getAirwaybill_no();
                        System.out.println("Order Id.... "+ord.getId()+".....Airwaybill No..... "+awbNumber);
                        TrackReply trackreply = TrackWebServiceClient.getTrackingUpdates(awbNumber, clientDetails, waDetails, endPointAddress);
                        if(trackreply!=null){
                                log.info("Successfully get Fedex Returned Orders");
                                TrackDetail[] trackDetails=trackreply.getTrackDetails();
                                SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
                                SimpleDateFormat timeformat = new SimpleDateFormat("HH:mm:ss");
trackDetailsLoop:for (int i=0; i< trackDetails.length; i++) {
                                        TrackEvent trackEvents[]= trackDetails[i].getEvents();
                                        if(trackEvents!=null && trackEvents.length > 0){
                                                for(TrackEvent te : trackEvents){
                                                        if("RS".equalsIgnoreCase(te.getEventType())){
                                                                fedexReturnedOrdersMap.put(awbNumber, dateformat.format(te.getTimestamp().getTime())+" "+timeformat.format(te.getTimestamp().getTime())+"|"+te.getEventDescription());
                                                                break trackDetailsLoop;
                                                        }
                                                }
                                        }
                                }
                        }
                }
                log.info("Read Fedex Returned Orders");
                return fedexReturnedOrdersMap;
        }
        
        public Map<String,String> readFedExUnDeliveredOrdersMap(List<Order> ordersList){
                log.info("Into Method to Read Fedex Undelivered Orders.... "+ ordersList.size());
                Map<String,String> fedexUnDeliveredOrdersMap= new HashMap<String,String>();
                orderLoop:for(Order ord: ordersList){
                        String awbNumber= ord.getAirwaybill_no();
                        System.out.println("Order Id.... "+ord.getId()+".....Airwaybill No..... "+awbNumber);
                        TrackReply trackreply = TrackWebServiceClient.getTrackingUpdates(awbNumber, clientDetails, waDetails, endPointAddress);
                        if(trackreply!=null){
                                log.info("Successfully Get Fedex Undelivered Orders");
                                TrackDetail[] trackDetails=trackreply.getTrackDetails();
trackDetailsLoop:for (int i=0; i< trackDetails.length; i++) {
                                        TrackEvent trackEvents[]= trackDetails[i].getEvents();
                                        if(trackEvents!=null && trackEvents.length > 0){
                                                for(TrackEvent tevent : trackEvents){
                                                        if("DL".equalsIgnoreCase(tevent.getEventType())){
                                                                continue orderLoop;
                                                        }
                                                }
                                                for(TrackEvent te : trackEvents){
                                                        if("DE".equalsIgnoreCase(te.getEventType())){
                                                                fedexUnDeliveredOrdersMap.put(awbNumber, te.getEventDescription());
                                                                break trackDetailsLoop;
                                                        }
                                                }
                                        }
                                }
                        }
                }
                log.info("Read Fedex Undelivered Orders");
                return fedexUnDeliveredOrdersMap;
        }
        
        public Map<String,String> readFedExFirstDeliveryAttemptedOrdersMap(List<Order> ordersList){
                log.info("Into Method to Read Fedex First Delivery Attempted Orders.... "+ ordersList.size());
                Map<String,String> fedexFirstDeliveryAttemptedOrdersMap= new HashMap<String,String>();
                for(Order ord: ordersList){
                        String awbNumber= ord.getAirwaybill_no();
                        System.out.println("Order Id.... "+ord.getId()+".....Airwaybill No..... "+awbNumber);
                        TrackReply trackreply = TrackWebServiceClient.getTrackingUpdates(awbNumber, clientDetails, waDetails, endPointAddress);
                        if(trackreply!=null){
                                log.info("Successfully get Fedex First Delivery Attempted Orders");
                                TrackDetail[] trackDetails=trackreply.getTrackDetails();
                                SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
                                SimpleDateFormat timeformat = new SimpleDateFormat("HH:mm:ss");
trackDeatilsLoop:for (int i=0; i< trackDetails.length; i++) {
                                        TrackEvent trackEvents[]= trackDetails[i].getEvents();
                                        if(trackEvents!=null && trackEvents.length > 0){
                                                for(TrackEvent te : trackEvents){
                                                        if("OD".equalsIgnoreCase(te.getEventType())){
                                                                if(te.getStatusExceptionCode()!=null){
                                                                        fedexFirstDeliveryAttemptedOrdersMap.put(awbNumber, dateformat.format(te.getTimestamp().getTime())+" "+timeformat.format(te.getTimestamp().getTime())+"|"+te.getStatusExceptionDescription());
                                                                }
                                                                else{
                                                                        fedexFirstDeliveryAttemptedOrdersMap.put(awbNumber, dateformat.format(te.getTimestamp().getTime())+" "+timeformat.format(te.getTimestamp().getTime())+"|"+te.getEventDescription());
                                                                }
                                                                break trackDeatilsLoop;
                                                        }
                                                        else if("DE".equalsIgnoreCase(te.getEventType())){
                                                                fedexFirstDeliveryAttemptedOrdersMap.put(awbNumber, dateformat.format(te.getTimestamp().getTime())+" "+timeformat.format(te.getTimestamp().getTime())+"|"+te.getEventDescription());
                                                                break trackDeatilsLoop;
                                                        }
                                                }
                                        }
                                }
                        }
                }
                log.info("Read Fedex First Delivery Attempted Orders");
                return fedexFirstDeliveryAttemptedOrdersMap;
        }
        
        public List<ShipmentUpdate> getUpdates(String awbNumber){
                List<ShipmentUpdate> updates = new ArrayList<ShipmentUpdate>();
                TrackReply trackreply = TrackWebServiceClient.getTrackingUpdates(awbNumber, clientDetails, waDetails, endPointAddress);
                if(trackreply!=null){
                        TrackDetail[] trackDetails=trackreply.getTrackDetails();
                        SimpleDateFormat dateformat = new SimpleDateFormat("dd-MMM-yyyy");
                        SimpleDateFormat timeformat = new SimpleDateFormat("HH:mm:ss");
                        for (int i=0; i< trackDetails.length; i++) {
                                TrackEvent trackEvents[]= trackDetails[i].getEvents();
                                if(trackEvents!=null && trackEvents.length > 0){
                                        for(TrackEvent te : trackEvents){
                                                ShipmentUpdate shipUpdate = new ShipmentUpdate();
                                                if(te.getAddress()!=null){
                                                        if(te.getAddress().getCity()!=null){
                                                                shipUpdate.city= te.getAddress().getCity();
                                                        }
                                                        else{
                                                                shipUpdate.city="Unknown";
                                                        }
                                                }
                                                else{
                                                        shipUpdate.city="Unknown";
                                                }
                                                shipUpdate.date= dateformat.format(te.getTimestamp().getTime());
                                                shipUpdate.time= timeformat.format(te.getTimestamp().getTime());
                                                shipUpdate.description= te.getEventDescription();
                                                updates.add(shipUpdate);
                                        }
                                }
                        }
                        return updates;
                }
                else{
                        return null;
                }
        }
        
        public static void main(String[] args) {
                FedExTrackingService trackClient = new FedExTrackingService(WarehouseLocation.Delhi);
                List<ShipmentUpdate> updates = trackClient.getUpdates("796869788166");
                for(ShipmentUpdate update: updates){
                        System.out.println(update.toString());
                }
        }

}