Subversion Repositories SmartDukaan

Rev

Rev 1137 | Rev 1504 | 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,\
1137 chandransh 10
    get_providers, close_session, get_free_awb_count
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
 
1248 chandransh 21
    def __init__(self, dbname='logistics'):
22
        initialize(dbname)
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:
1137 chandransh 43
            provider = get_provider(providerId)
44
            if provider:
45
                return to_t_provider(provider)
46
            else:
47
                raise LogisticsServiceException(101, "No Provider found for the given id")
796 rajveer 48
        finally:
49
            close_session()
50
 
675 chandransh 51
    def getAllProviders(self, ):
52
        """
53
        Returns a list containing all the providers.
54
        """
796 rajveer 55
        try:
56
            return [to_t_provider(provider) for provider in get_providers()]
57
        finally:
58
            close_session()
59
 
644 chandransh 60
    def getLogisticsInfo(self, destination_pincode, itemId):
483 rajveer 61
        """
62
        Parameters:
63
         - destination_pincode
716 rajveer 64
         - item_id
483 rajveer 65
        """
796 rajveer 66
        try:
67
            logistics_info = self.getLogisticsEstimation(itemId, destination_pincode)
68
            logistics_info.airway_billno = get_empty_AWB(logistics_info.providerId)
69
            return logistics_info
70
        finally:
71
            close_session()
72
 
412 ashish 73
    def getEmptyAWB(self, provider_id):
74
        """
75
        Parameters:
76
         - provider_id
77
        """
796 rajveer 78
        try:
79
            return get_empty_AWB(provider_id)
80
        finally:
81
            close_session()
82
 
644 chandransh 83
    def getShipmentInfo(self, awb, providerId):
412 ashish 84
        """
85
        Parameters:
86
         - awb
766 rajveer 87
         - providerId
412 ashish 88
        """
796 rajveer 89
        try:
90
            awb_updates = get_shipment_info(awb, providerId)
91
            t_updates = []
92
            for update in awb_updates:
93
                t_updates.append(to_t_awbupdate(update))
94
            return t_updates
95
        finally:
96
            close_session()
97
 
644 chandransh 98
    def getLogisticsEstimation(self, itemId, destination_pin):
472 rajveer 99
        """
100
        Parameters:
101
         - itemId
102
         - destination_pin
103
        """
644 chandransh 104
        try:
796 rajveer 105
            if not destination_pin:
106
                destination_pin = self.default_pincode
107
            delivery_estimate = get_logistics_estimation(destination_pin)
108
            if delivery_estimate is None:
109
                raise LogisticsServiceException(103, "Unable to fetch delivery estimate for this pincode.")
110
            delivery_time = 24*delivery_estimate.delivery_time
111
            if self.cutoff_time <= datetime.datetime.now().hour:
112
                delivery_time = delivery_time + 24
113
            warehouse_loc = delivery_estimate.warehouse_location
114
            try:
115
                client = InventoryClient().get_client()
116
                warehouse_id, items_in_inventory = client.getItemAvailabilityAtLocation(warehouse_loc, itemId)
117
            except:
118
                raise LogisticsServiceException(103, "Unable to fetch inventory information about this item.") 
119
            if items_in_inventory < self.stock_threshold :
120
                delivery_time = delivery_time + self.time_to_producre
121
            delivery_time = int(math.ceil(delivery_time/24.0))
122
 
123
            logistics_info = LogisticsInfo()
124
            logistics_info.deliveryTime = delivery_time
125
            logistics_info.providerId = delivery_estimate.provider_id
126
            logistics_info.warehouseId = warehouse_id
127
 
128
            return logistics_info
129
        finally:
130
            close_session()
131
 
731 chandransh 132
    def getDestinationCode(self, providerId, pinCode):
133
        """
134
        Returns the short three letter code of a pincode for the given provider.
135
        Raises an exception if the pin code is not serviced by the given provider.
136
 
137
        Parameters:
138
         - providerId
139
         - pinCode
140
        """
796 rajveer 141
        try:
142
            sld = ServiceableLocationDetails.get_by(provider_id = providerId, dest_pincode = pinCode)
143
            if sld != None:
144
                return sld.dest_code
145
            else:
146
                raise LogisticsServiceException(101, "The pincode " + pinCode + " is not serviced by this provider: " + str(providerId))
147
        finally:
148
            close_session()
1137 chandransh 149
 
150
    def getFreeAwbCount(self, providerId):
151
        """
152
        Returns the number of unused AWB numbers for the given provider
796 rajveer 153
 
1137 chandransh 154
        Parameters:
155
         - providerId
156
        """
157
        try:
158
            return get_free_awb_count(providerId)
159
        finally:
160
            close_session()
161
 
766 rajveer 162
    def closeSession(self, ):
163
        close_session()