Subversion Repositories SmartDukaan

Rev

Rev 776 | Rev 1137 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
412 ashish 1
'''
2
Created on 05-Aug-2010
3
 
4
@author: ashish
5
'''
644 chandransh 6
from shop2020.thriftpy.logistics.ttypes import LogisticsInfo,\
7
    LogisticsServiceException
8
from shop2020.logistics.service.impl.DataAccessor import get_empty_AWB,\
675 chandransh 9
    get_shipment_info, initialize, get_logistics_estimation, get_provider,\
766 rajveer 10
    get_providers, close_session
669 chandransh 11
from shop2020.logistics.service.impl.Converters import to_t_awbupdate,\
12
    to_t_provider
494 rajveer 13
from shop2020.clients.InventoryClient import InventoryClient
14
from shop2020.config.client.ConfigClient import ConfigClient
15
import datetime
644 chandransh 16
import math
731 chandransh 17
from shop2020.logistics.service.impl.DataService import ServiceableLocationDetails
472 rajveer 18
 
412 ashish 19
class LogisticsServiceHandler:
20
 
442 rajveer 21
    def __init__(self):
22
        initialize()
746 rajveer 23
        try:
24
            config_client = ConfigClient()
25
            self.cutoff_time = int(config_client.get_property('delivery_cutoff_time'))
26
            self.stock_threshold = int(config_client.get_property('inventory_stock_threshold'))
27
            self.time_to_producre = int(config_client.get_property('inventory_time_to_procure'))
776 rajveer 28
            self.default_pincode = int(config_client.get_property('default_pincode'))
746 rajveer 29
        except:    
30
            self.cutoff_time = 15
31
            self.stock_threshold = 2
776 rajveer 32
            self.time_to_producre = 48
33
            self.default_pincode = "110001" 
746 rajveer 34
 
669 chandransh 35
    def getProvider(self, providerId):
675 chandransh 36
        """
37
        Returns a provider for a given provider ID. Throws an exception if none found.
38
 
39
        Parameters:
40
         - providerId
41
        """
796 rajveer 42
        try:
43
            return to_t_provider(get_provider(providerId))
44
        finally:
45
            close_session()
46
 
675 chandransh 47
    def getAllProviders(self, ):
48
        """
49
        Returns a list containing all the providers.
50
        """
796 rajveer 51
        try:
52
            return [to_t_provider(provider) for provider in get_providers()]
53
        finally:
54
            close_session()
55
 
644 chandransh 56
    def getLogisticsInfo(self, destination_pincode, itemId):
483 rajveer 57
        """
58
        Parameters:
59
         - destination_pincode
716 rajveer 60
         - item_id
483 rajveer 61
        """
796 rajveer 62
        try:
63
            logistics_info = self.getLogisticsEstimation(itemId, destination_pincode)
64
            logistics_info.airway_billno = get_empty_AWB(logistics_info.providerId)
65
            return logistics_info
66
        finally:
67
            close_session()
68
 
412 ashish 69
    def getEmptyAWB(self, provider_id):
70
        """
71
        Parameters:
72
         - provider_id
73
        """
796 rajveer 74
        try:
75
            return get_empty_AWB(provider_id)
76
        finally:
77
            close_session()
78
 
644 chandransh 79
    def getShipmentInfo(self, awb, providerId):
412 ashish 80
        """
81
        Parameters:
82
         - awb
766 rajveer 83
         - providerId
412 ashish 84
        """
796 rajveer 85
        try:
86
            awb_updates = get_shipment_info(awb, providerId)
87
            t_updates = []
88
            for update in awb_updates:
89
                t_updates.append(to_t_awbupdate(update))
90
            return t_updates
91
        finally:
92
            close_session()
93
 
644 chandransh 94
    def getLogisticsEstimation(self, itemId, destination_pin):
472 rajveer 95
        """
96
        Parameters:
97
         - itemId
98
         - destination_pin
99
        """
644 chandransh 100
        try:
796 rajveer 101
            if not destination_pin:
102
                destination_pin = self.default_pincode
103
            delivery_estimate = get_logistics_estimation(destination_pin)
104
            if delivery_estimate is None:
105
                raise LogisticsServiceException(103, "Unable to fetch delivery estimate for this pincode.")
106
            delivery_time = 24*delivery_estimate.delivery_time
107
            if self.cutoff_time <= datetime.datetime.now().hour:
108
                delivery_time = delivery_time + 24
109
            warehouse_loc = delivery_estimate.warehouse_location
110
            try:
111
                client = InventoryClient().get_client()
112
                warehouse_id, items_in_inventory = client.getItemAvailabilityAtLocation(warehouse_loc, itemId)
113
            except:
114
                raise LogisticsServiceException(103, "Unable to fetch inventory information about this item.") 
115
            if items_in_inventory < self.stock_threshold :
116
                delivery_time = delivery_time + self.time_to_producre
117
            delivery_time = int(math.ceil(delivery_time/24.0))
118
 
119
            logistics_info = LogisticsInfo()
120
            logistics_info.deliveryTime = delivery_time
121
            logistics_info.providerId = delivery_estimate.provider_id
122
            logistics_info.warehouseId = warehouse_id
123
 
124
            return logistics_info
125
        finally:
126
            close_session()
127
 
731 chandransh 128
    def getDestinationCode(self, providerId, pinCode):
129
        """
130
        Returns the short three letter code of a pincode for the given provider.
131
        Raises an exception if the pin code is not serviced by the given provider.
132
 
133
        Parameters:
134
         - providerId
135
         - pinCode
136
        """
796 rajveer 137
        try:
138
            sld = ServiceableLocationDetails.get_by(provider_id = providerId, dest_pincode = pinCode)
139
            if sld != None:
140
                return sld.dest_code
141
            else:
142
                raise LogisticsServiceException(101, "The pincode " + pinCode + " is not serviced by this provider: " + str(providerId))
143
        finally:
144
            close_session()
145
 
766 rajveer 146
    def closeSession(self, ):
147
        close_session()