Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
442 rajveer 1
'''
2
Created on 13-Sep-2010
3
 
4
@author: rajveer
5
'''
6
 
21096 amit.gupta 7
from collections import namedtuple
16025 amit.gupta 8
from elixir import session
9
from shop2020.clients.CatalogClient import CatalogClient
10
from shop2020.clients.InventoryClient import InventoryClient
20724 kshitij.so 11
from shop2020.clients.TransactionClient import TransactionClient
22636 amit.gupta 12
from shop2020.logistics.service.impl import BluedartService, DataService,\
13
    EcomExpressService
644 chandransh 14
from shop2020.logistics.service.impl.DataService import Awb, AwbUpdate, Provider, \
16025 amit.gupta 15
    DeliveryEstimate, WarehouseAllocation, PublicHolidays, \
21096 amit.gupta 16
    ServiceableLocationDetails, PickupStore, Locations, ProviderCosting, \
17
    BluedartAttribute, PincodeStates
16025 amit.gupta 18
from shop2020.thriftpy.logistics.ttypes import LogisticsServiceException, \
21096 amit.gupta 19
    DeliveryType, LogisticsLocationInfo, LocationInfo, ProviderInfo, \
20
    DeliveryEstimateAndCosting
19413 amit.gupta 21
from shop2020.thriftpy.model.v1.inventory.ttypes import Warehouse, BillingType, \
16025 amit.gupta 22
    WarehouseType
442 rajveer 23
from shop2020.utils.Utils import log_entry, to_py_date, to_java_date
5964 amar.kumar 24
from sqlalchemy.sql import or_
16025 amit.gupta 25
import datetime
3355 chandransh 26
import logging
21096 amit.gupta 27
import math
13146 manish.sha 28
import os
16025 amit.gupta 29
import sys
30
import time
20724 kshitij.so 31
import traceback
19413 amit.gupta 32
 
3355 chandransh 33
logging.basicConfig(level=logging.DEBUG)
442 rajveer 34
 
19413 amit.gupta 35
PincodeProvider = namedtuple("PincodeProvider", ["dest_pin", "provider"])
36
 
3217 rajveer 37
warehouse_allocation_cache = {}
38
serviceable_location_cache = {}
39
delivery_estimate_cache = {}
16025 amit.gupta 40
warehouse_location_cache = {}
19413 amit.gupta 41
location_state={}
20275 amit.gupta 42
 
43
'Delhivery Bluedart, Fedex Surface, Fedex Air'
19413 amit.gupta 44
state_locations = {}
19421 manish.sha 45
provider_costing_sheet = {}
46
DELHIVERY = 3
6370 rajveer 47
 
19413 amit.gupta 48
#pincode location map is ab
49
#{'110001':{1:{"sameState":False, "providerInfo":{1:(1,1), 2:(1,1)}}},}
50
pincode_locations = {}
51
#{(dest_pin, provider):(otgAvailable,providerCodLimit, websiteCodLimit, storeCodLimit, providerPrepaidLimit)} 
52
serviceable_map = {}
53
 
54
#Need to identify a better way
55
statepinmap={'11':0, 
56
             '40':1,'41':1,'42':1,'43':1,'44':1,
57
             '56':2, '57':2, '58':2, '59':2,
58
             '12':3, '13':3, 
59
             '30':4, '31':4, '32':4, '33':4, '34':4,
60
             '36':6,'37':6,'38':6,'39':6
61
             }
62
 
3218 rajveer 63
'''
64
This class is for only data transfer. Never used outside this module.
65
'''
66
class _DeliveryEstimateObject:
6537 rajveer 67
    def __init__(self, delivery_time, delivery_delay, provider_id, codAllowed, otgAvailable):
3218 rajveer 68
        self.delivery_time = delivery_time
6537 rajveer 69
        self.delivery_delay = delivery_delay
3218 rajveer 70
        self.provider_id = provider_id
4866 rajveer 71
        self.codAllowed = codAllowed
6524 rajveer 72
        self.otgAvailable = otgAvailable
3218 rajveer 73
 
3187 rajveer 74
def initialize(dbname="logistics", db_hostname="localhost"):
442 rajveer 75
    log_entry("initialize@DataAccessor", "Initializing data service")
3187 rajveer 76
    DataService.initialize(dbname, db_hostname)
3218 rajveer 77
    print "Starting cache population at: " + str(datetime.datetime.now())
16025 amit.gupta 78
    #__cache_warehouse_allocation_table()
79
    __cache_warehouse_locations()
3217 rajveer 80
    __cache_serviceable_location_details_table()
81
    __cache_delivery_estimate_table()
20275 amit.gupta 82
    __cache_pincode_provider_serviceability()
19413 amit.gupta 83
    __cache_locations()
84
    __cache_pincode_estimates()    
19421 manish.sha 85
    __cache_courier_costing_table()
3217 rajveer 86
    close_session()
3218 rajveer 87
    print "Done cache population at: " + str(datetime.datetime.now())
442 rajveer 88
 
19413 amit.gupta 89
def __cache_locations():
90
    locations = Locations.query.all()
91
    for location in locations:
92
        location_state[location.id] = location.state_id
93
        if not state_locations.has_key(location.state_id):
94
            state_locations[location.state_id] = []
95
        state_locations[location.state_id] = state_locations[location.state_id].append(location.state_id)
96
 
97
def __cache_pincode_estimates():
98
    delivery_estimates = DeliveryEstimate.query.all()
99
    for delivery_estimate in delivery_estimates:
100
        if not pincode_locations.has_key(delivery_estimate.destination_pin):
101
            pincode_locations[delivery_estimate.destination_pin] = {}
102
        destination_pinMap = pincode_locations[delivery_estimate.destination_pin] 
103
        if not destination_pinMap.has_key(delivery_estimate.warehouse_location):
104
            destination_pinMap[delivery_estimate.warehouse_location] = {}
105
            state_id = location_state.get(delivery_estimate.warehouse_location)
106
            sameState = __getStateFromPin(delivery_estimate.destination_pin) == state_id
107
            destination_pinMap[delivery_estimate.warehouse_location]['sameState']=sameState
108
            destination_pinMap[delivery_estimate.warehouse_location]['providerInfo'] = {} 
109
        destination_pinMap[delivery_estimate.warehouse_location]['providerInfo'][delivery_estimate.provider_id] = delivery_estimate.delivery_time + delivery_estimate.delivery_delay
110
 
111
 
112
 
113
def __cache_pincode_provider_serviceability():
114
    pincode_providers = ServiceableLocationDetails.query.filter(ServiceableLocationDetails.exp==1)
115
    for pp in pincode_providers:
116
        serviceable_map[PincodeProvider(pp.dest_pincode, pp.provider_id)] = (pp.cod, pp.otgAvailable,pp.providerCodLimit, pp.websiteCodLimit, pp.storeCodLimit, pp.providerPrepaidLimit)
117
 
118
 
3217 rajveer 119
def __cache_delivery_estimate_table():
120
    delivery_estimates = DeliveryEstimate.query.all()
121
    for delivery_estimate in delivery_estimates:
7857 rajveer 122
        delivery_estimate_cache[delivery_estimate.destination_pin, delivery_estimate.provider_id, delivery_estimate.warehouse_location]\
19421 manish.sha 123
        =delivery_estimate.delivery_time, delivery_estimate.delivery_delay, delivery_estimate.providerZoneCode
3217 rajveer 124
 
125
def __cache_serviceable_location_details_table():
5964 amar.kumar 126
    serviceable_locations = ServiceableLocationDetails.query.filter(or_("exp!=0","cod!=0"))
3217 rajveer 127
    for serviceable_location in serviceable_locations:
22147 amit.gupta 128
        #Bluedart is temporarily not serviceable
129
        if serviceable_location.provider_id==1:
130
            continue
3217 rajveer 131
        try:
132
            provider_pincodes = serviceable_location_cache[serviceable_location.provider_id]
133
        except:
134
            provider_pincodes = {}
135
            serviceable_location_cache[serviceable_location.provider_id] = provider_pincodes 
19474 manish.sha 136
        provider_pincodes[serviceable_location.dest_pincode] = serviceable_location.dest_code, serviceable_location.exp, serviceable_location.cod, serviceable_location.otgAvailable, serviceable_location.websiteCodLimit, serviceable_location.storeCodLimit, serviceable_location.providerPrepaidLimit, serviceable_location.providerCodLimit
3217 rajveer 137
 
138
def __cache_warehouse_allocation_table():
139
    warehouse_allocations = WarehouseAllocation.query.all()
140
    for warehouse_allocation in warehouse_allocations:
141
        warehouse_allocation_cache[warehouse_allocation.pincode]=warehouse_allocation.primary_warehouse_location
142
 
16025 amit.gupta 143
def __cache_warehouse_locations():
144
    client = InventoryClient().get_client()
19413 amit.gupta 145
    #client.getAllWarehouses(True)
16025 amit.gupta 146
    for warehouse in client.getAllWarehouses(True):
22636 amit.gupta 147
        if warehouse.billingWarehouseId == warehouse.id:
148
            warehouse_location_cache[warehouse.billingWarehouseId]=warehouse.logisticsLocation
19421 manish.sha 149
 
150
def __cache_courier_costing_table():
151
    allCostings = ProviderCosting.query.all()
152
    for costing in allCostings:
153
        if provider_costing_sheet.has_key(costing.provider_id):
154
            costingMap = provider_costing_sheet.get(costing.provider_id)
155
            costingMap[costing.zoneCode] = costing
156
            provider_costing_sheet[costing.provider_id] = costingMap
157
        else:
158
            costingMap = {}
159
            costingMap[costing.zoneCode] = costing
160
            provider_costing_sheet[costing.provider_id] = costingMap
161
 
16025 amit.gupta 162
 
644 chandransh 163
def get_provider(provider_id):
766 rajveer 164
    provider =  Provider.get_by(id=provider_id)
165
    return provider
644 chandransh 166
 
167
def get_providers():
5387 rajveer 168
    providers = Provider.query.filter_by(isActive = 1).all()
19413 amit.gupta 169
    return providers
644 chandransh 170
 
19413 amit.gupta 171
#it would return only states where our warehouses are present else return -1
172
def __getStateFromPin(pin):
173
    if pin[:3] in ['744', '682']:
174
        return -1
175
    elif statepinmap.has_key(pin[:2]):
176
        return statepinmap[pin[:2]]
177
    else:
178
        return -1
179
 
180
 
181
def get_logistics_locations(destination_pin, selling_price_list):
182
    #pincode_locations = {1:{"sameState":False, "providerInfo":{<provider_id>:<delay_days>}},}
183
    #pp.otgAvailable,pp.providerCodLimit, pp.websiteCodLimit, pp.storeCodLimit, pp.providerPrepaidLimit
184
    returnMap = {}
185
    if pincode_locations.has_key(destination_pin):
186
        locations = pincode_locations[destination_pin]
187
        for item_selling_price in selling_price_list:
188
            returnMap[item_selling_price] = {}
189
            for location_id, value in locations.iteritems():
190
                #put weight logic here
191
                otgAvailable = False
192
                codAvailable = False
193
                minDelay = -1
194
                maxDelay = -1
195
                serviceable = False
196
                for provider_id, delay_days in value['providerInfo'].iteritems():
19420 amit.gupta 197
                    pp = PincodeProvider(destination_pin, provider_id)
198
                    if not serviceable_map.has_key(pp):
199
                        continue
200
                    iscod, isotg, providerCodLimit, websiteCodLimit, storeCodLimit, providerPrepaidLimit = serviceable_map[pp]  
19413 amit.gupta 201
                    if item_selling_price <= providerPrepaidLimit:
202
                        if not serviceable:
20275 amit.gupta 203
                            returnMap[item_selling_price][location_id] = LocationInfo(locationId = location_id, sameState=value['sameState'])
19413 amit.gupta 204
                            serviceable = True
205
                            minDelay = delay_days
206
                            maxDelay = delay_days
207
                        else:
208
                            minDelay = min(delay_days,minDelay)
209
                            maxDelay = max(delay_days,maxDelay)
210
                        iscod = iscod and item_selling_price <= min(providerCodLimit, websiteCodLimit)
211
                        isotg = (isotg and item_selling_price >= 2000)
212
                        otgAvailable = otgAvailable or isotg
213
                        codAvailable = codAvailable or iscod
214
                if serviceable:        
20275 amit.gupta 215
                    returnMap[item_selling_price][location_id].isOtg = otgAvailable
216
                    returnMap[item_selling_price][location_id].isCod = codAvailable
19413 amit.gupta 217
                    returnMap[item_selling_price][location_id].minDelay = minDelay
218
                    returnMap[item_selling_price][location_id].maxDelay = maxDelay
219
    return returnMap
220
 
7608 rajveer 221
def get_logistics_estimation(destination_pin, item_selling_price, weight, type, billingWarehouseId):
5692 rajveer 222
    logging.info("Getting logistics estimation for pincode:" + destination_pin )
1504 ankur.sing 223
 
7608 rajveer 224
    provider_id, codAllowed, otgAvailable = __get_logistics_provider_for_destination_pincode(destination_pin, item_selling_price, weight, type, billingWarehouseId)
9964 anupam.sin 225
 
17530 manish.sha 226
    logging.info("Provider Id:  " + str(provider_id) +" codAllowed: "+str(codAllowed)+" otgAvailable: "+str(otgAvailable)+ " item_selling_price: "+str(item_selling_price))
227
 
228
    if item_selling_price > 60000:# or item_selling_price <= 250:
9964 anupam.sin 229
        codAllowed = False
230
 
16025 amit.gupta 231
    warehouse_location = warehouse_location_cache.get(billingWarehouseId)
232
    if warehouse_location is None:
233
        warehouse_location = 0
7857 rajveer 234
 
3217 rajveer 235
    if not provider_id:
5692 rajveer 236
        raise LogisticsServiceException(101, "No provider assigned for pincode: " + str(destination_pin))
644 chandransh 237
    try:
16025 amit.gupta 238
        logging.info( "destination_pin %s, provider_id %s, warehouse_location %s"%(destination_pin, provider_id, warehouse_location))
19481 manish.sha 239
        logging.info( "Estimates %s, %s, %s"%(delivery_estimate_cache[destination_pin, provider_id, warehouse_location]))
7857 rajveer 240
        delivery_time = delivery_estimate_cache[destination_pin, provider_id, warehouse_location][0]
241
        delivery_delay = delivery_estimate_cache[destination_pin, provider_id, warehouse_location][1]
6537 rajveer 242
        delivery_estimate = _DeliveryEstimateObject(delivery_time, delivery_delay, provider_id, codAllowed, otgAvailable)
3218 rajveer 243
        return delivery_estimate
1504 ankur.sing 244
    except Exception as ex:
245
        print ex
644 chandransh 246
        raise LogisticsServiceException(103, "No Logistics partner listed for this destination pincode and the primary warehouse")
3150 rajveer 247
 
7608 rajveer 248
def __get_logistics_provider_for_destination_pincode(destination_pin, item_selling_price, weight, type, billingWarehouseId):
22753 amit.gupta 249
    #As of now we are dealing with Aramex and RQucikExpress. i.e. 2 and 47 and we have just one location i.e. gurgaon will generailise this 
20641 amit.gupta 250
    #Once bandwidth is available these things will be derived through improved logic.
22753 amit.gupta 251
    #As of now otg is set to False, Use rquick if it is serviceable else use aramex
20641 amit.gupta 252
    otg=False
22753 amit.gupta 253
    PRIMARY_PROVIDER = 47
254
    SECONDARY_PROVIDER = 2
255
    aramexServiceable = serviceable_location_cache.has_key(SECONDARY_PROVIDER) and serviceable_location_cache.get(SECONDARY_PROVIDER).has_key(destination_pin)
256
    rquickServiceable =  serviceable_location_cache.has_key(PRIMARY_PROVIDER) and serviceable_location_cache.get(PRIMARY_PROVIDER).has_key(destination_pin)
22147 amit.gupta 257
 
258
    #blueDartServiceable =  False
22753 amit.gupta 259
    if rquickServiceable and aramexServiceable:
260
        dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(PRIMARY_PROVIDER).get(destination_pin)
261
        if item_selling_price <= providerPrepaidLimit:
262
            iscod = iscod and item_selling_price <= websiteCodLimit
263
            if iscod:
264
                return PRIMARY_PROVIDER, True, otg
265
            else:
266
                dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(SECONDARY_PROVIDER).get(destination_pin)
267
                if item_selling_price <= providerPrepaidLimit:
268
                    iscod = iscod and item_selling_price <= websiteCodLimit
269
                    if iscod:
270
                        return SECONDARY_PROVIDER, True, otg
271
                    else:
272
                        return PRIMARY_PROVIDER, False, otg
21096 amit.gupta 273
        else:
22753 amit.gupta 274
            dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(SECONDARY_PROVIDER).get(destination_pin)
21096 amit.gupta 275
            if item_selling_price <= providerPrepaidLimit:
276
                iscod = iscod and item_selling_price <= websiteCodLimit
22753 amit.gupta 277
                return SECONDARY_PROVIDER, iscod, otg
21096 amit.gupta 278
 
279
    else:
22753 amit.gupta 280
        if rquickServiceable:
281
            provider=PRIMARY_PROVIDER
22237 amit.gupta 282
        elif aramexServiceable:
22753 amit.gupta 283
            provider=SECONDARY_PROVIDER
22237 amit.gupta 284
        else:
285
            provider = None
22753 amit.gupta 286
 
22237 amit.gupta 287
        if provider:
22238 amit.gupta 288
            dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(provider).get(destination_pin)
22237 amit.gupta 289
            if item_selling_price <= providerPrepaidLimit:
290
                iscod = iscod and item_selling_price <= websiteCodLimit
291
                return provider, iscod, otg
292
 
20641 amit.gupta 293
 
294
    return None, False, False
295
 
21096 amit.gupta 296
def __getStateByPin(destination_pin):
297
    pinCodeState = PincodeStates.get_by(pin=destination_pin)
298
    if pinCodeState is not None:
299
        return pinCodeState.statename
300
    else:
301
        return None 
302
 
20641 amit.gupta 303
def __get_logistics_provider_for_destination_pincode_old(destination_pin, item_selling_price, weight, type, billingWarehouseId):
13357 manish.sha 304
    '''
305
    if serviceable_location_cache.get(6).has_key(destination_pin):
306
        if weight < 480 and serviceable_location_cache.get(3).has_key(destination_pin) and type == DeliveryType.PREPAID:
307
            dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit = serviceable_location_cache.get(3).get(destination_pin)
308
            if item_selling_price <= providerPrepaidLimit:
309
                iscod = iscod and item_selling_price <= websiteCodLimit
310
                otgAvailable = otgAvailable and item_selling_price >= 2000
311
                return 3, iscod, otgAvailable
312
        else:
313
            dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit = serviceable_location_cache.get(6).get(destination_pin)
314
            if item_selling_price <= providerPrepaidLimit:
315
                iscod = iscod and item_selling_price <= websiteCodLimit
316
                otgAvailable = otgAvailable and item_selling_price >= 2000
317
                return 6, iscod, otgAvailable
20641 amit.gupta 318
    '''        
319
    if serviceable_location_cache.has_key(3) and serviceable_location_cache.get(3).has_key(destination_pin):
320
        dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(3).get(destination_pin)
321
        if item_selling_price <= providerPrepaidLimit:
322
            iscod = iscod and item_selling_price <= websiteCodLimit
323
            otgAvailable = otgAvailable and item_selling_price >= 2000
324
            return 3, iscod, otgAvailable
8575 rajveer 325
 
17992 manish.sha 326
    if billingWarehouseId not in [12,13] and serviceable_location_cache.has_key(7) and serviceable_location_cache.get(7).has_key(destination_pin):
19533 manish.sha 327
        if item_selling_price < 3000 and serviceable_location_cache.has_key(1) and serviceable_location_cache.get(1).has_key(destination_pin):
19476 manish.sha 328
            dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(1).get(destination_pin)
8575 rajveer 329
            if item_selling_price <= providerPrepaidLimit:
330
                iscod = iscod and item_selling_price <= websiteCodLimit
331
                otgAvailable = otgAvailable and item_selling_price >= 2000
20275 amit.gupta 332
                if iscod:
333
                    return 1, iscod, otgAvailable
8575 rajveer 334
        else:
19476 manish.sha 335
            dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(7).get(destination_pin)
8575 rajveer 336
            if item_selling_price <= providerPrepaidLimit:
337
                iscod = iscod and item_selling_price <= websiteCodLimit
338
                otgAvailable = otgAvailable and item_selling_price >= 2000
20275 amit.gupta 339
                if iscod:
340
                    return 7, iscod, otgAvailable
19533 manish.sha 341
 
342
    if billingWarehouseId not in [12,13] and serviceable_location_cache.has_key(46) and serviceable_location_cache.get(46).has_key(destination_pin):
343
        if item_selling_price < 3000 and serviceable_location_cache.has_key(1) and serviceable_location_cache.get(1).has_key(destination_pin):
344
            dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(1).get(destination_pin)
345
            if item_selling_price <= providerPrepaidLimit:
346
                iscod = iscod and item_selling_price <= websiteCodLimit
347
                otgAvailable = otgAvailable and item_selling_price >= 2000
20275 amit.gupta 348
                if iscod:
349
                    return 1, iscod, otgAvailable
19533 manish.sha 350
        else:
351
            dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(46).get(destination_pin)
352
            if item_selling_price <= providerPrepaidLimit:
353
                iscod = iscod and item_selling_price <= websiteCodLimit
354
                otgAvailable = otgAvailable and item_selling_price >= 2000
20275 amit.gupta 355
                if iscod:
356
                    return 46, iscod, otgAvailable
8575 rajveer 357
 
19533 manish.sha 358
    if serviceable_location_cache.has_key(1) and serviceable_location_cache.get(1).has_key(destination_pin):
19476 manish.sha 359
        dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(1).get(destination_pin)
7627 rajveer 360
        if item_selling_price <= providerPrepaidLimit:
7608 rajveer 361
            iscod = iscod and item_selling_price <= websiteCodLimit
362
            otgAvailable = otgAvailable and item_selling_price >= 2000
20275 amit.gupta 363
            if iscod:
364
                return 1, iscod, otgAvailable
7981 rajveer 365
 
20275 amit.gupta 366
    if serviceable_location_cache.has_key(3) and serviceable_location_cache.get(3).has_key(destination_pin):
367
        dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(3).get(destination_pin)
368
        if item_selling_price <= providerPrepaidLimit:
369
            iscod = iscod and item_selling_price <= websiteCodLimit
370
            otgAvailable = otgAvailable and item_selling_price >= 2000
371
            return 3, iscod, otgAvailable
10185 amit.gupta 372
    return None, False, False    
5278 rajveer 373
 
6017 amar.kumar 374
def get_destination_code(providerId, pinCode):
375
    serviceableLocationDetail = ServiceableLocationDetails.query.filter_by(provider_id = providerId, dest_pincode = pinCode).one()
376
    return serviceableLocationDetail.dest_code
377
 
644 chandransh 378
def add_empty_AWBs(numbers, provider_id, type):
442 rajveer 379
    for number in numbers:
644 chandransh 380
        query = Awb.query.filter_by(awb_number = number, provider_id = provider_id)
444 rajveer 381
        try:
382
            query.one()
383
        except:    
644 chandransh 384
            awb = Awb()
444 rajveer 385
            awb.awb_number = number
644 chandransh 386
            awb.provider_id = provider_id
444 rajveer 387
            awb.is_available = True
644 chandransh 388
            awb.type = type
22636 amit.gupta 389
            awb.awbUsedFor = 2
644 chandransh 390
    session.commit()
442 rajveer 391
 
444 rajveer 392
def set_AWB_as_used(awb_number):
644 chandransh 393
    query = Awb.query.filter_by(awb_number = awb_number)
444 rajveer 394
    awb = query.one() 
395
    awb.is_available=False
396
    session.commit()
397
 
20924 kshitij.so 398
def get_awb(provider_id, logisticsTransactionId, type):
399
    query = Awb.query.with_lockmode("update").filter_by(provider_id = provider_id, is_available = True)  #check the provider thing
400
    if type == DeliveryType.PREPAID:
401
        query = query.filter_by(type="Prepaid")
402
    if type == DeliveryType.COD:
403
        query = query.filter_by(type="COD")
404
 
405
    additionalQuery = query
406
    query = query.filter_by(awbUsedFor=0)
407
 
408
    try:
409
        awb = query.first()
410
        if awb is None:
411
            additionalQuery = additionalQuery.filter_by(awbUsedFor=2)
412
            awb = additionalQuery.first()
22749 amit.gupta 413
        print "-------", awb.awb_number, awb.is_available
20924 kshitij.so 414
        awb.is_available = False
415
        session.commit()
416
        return awb.awb_number
417
    except:
22749 amit.gupta 418
        session.close()
419
        print "oops"
22636 amit.gupta 420
        #In case of missing awb for EComExpress fetch new awbs using their api
22749 amit.gupta 421
        if provider_id==49:
22636 amit.gupta 422
            awbs = EcomExpressService.generate_awb(type)
423
            #add_new_awbs(provider_id, isCod, awbs, awbUsedFor)
22749 amit.gupta 424
            add_empty_AWBs(awbs, provider_id, DeliveryType._VALUES_TO_NAMES[type])
22636 amit.gupta 425
            return get_awb(provider_id, logisticsTransactionId, type)
22749 amit.gupta 426
        return
22636 amit.gupta 427
 
428
 
20924 kshitij.so 429
        raise LogisticsServiceException(103, "Unable to get an AWB for the given Provider: " + str(provider_id))
20724 kshitij.so 430
 
431
def get_empty_AWB(provider_id, logisticsTransactionId):
442 rajveer 432
    try:
20724 kshitij.so 433
        if logisticsTransactionId is None:
434
            return ""
435
        if provider_id ==1:
20745 kshitij.so 436
            bluedartAttribute = BluedartAttribute.get_by(logisticsTransactionId=logisticsTransactionId,name="awb")
437
            if bluedartAttribute is None:
438
                client = TransactionClient().get_client()
439
                orders_list = client.getGroupOrdersByLogisticsTxnId(logisticsTransactionId)
440
                bluedartResponse = BluedartService.generate_awb(orders_list)
441
                bluedartAttribute = BluedartAttribute()
442
                bluedartAttribute.logisticsTransactionId = logisticsTransactionId
443
                bluedartAttribute.name = "awb"
444
                bluedartAttribute.value = bluedartResponse.awbNo
445
                bluedartAttribute_destcode = BluedartAttribute()
446
                bluedartAttribute_destcode.logisticsTransactionId = logisticsTransactionId
447
                bluedartAttribute_destcode.name = "destCode"
448
                bluedartAttribute_destcode.value = bluedartResponse.destArea +"/"+ bluedartResponse.destLocation
449
                session.commit()
450
            return bluedartAttribute.value
22636 amit.gupta 451
        else :
22750 amit.gupta 452
            client = TransactionClient().get_client()
453
            return get_awb(provider_id, logisticsTransactionId, DeliveryType.COD if client.isShipmentCod(logisticsTransactionId) else DeliveryType.PREPAID)
442 rajveer 454
    except:
20724 kshitij.so 455
        traceback.print_exc()
644 chandransh 456
        raise LogisticsServiceException(103, "Unable to get an AWB for the given Provider: " + str(provider_id))
20724 kshitij.so 457
 
1137 chandransh 458
 
3103 chandransh 459
def get_free_awb_count(provider_id, type):
460
    count = Awb.query.filter_by(provider_id = provider_id, is_available = True, type=type).count()
1137 chandransh 461
    if count == None:
462
        count = 0
463
    return count
442 rajveer 464
 
644 chandransh 465
def get_shipment_info(awb_number, provider_id):
466
    awb = Awb.get_by(awb_number = awb_number, provider_id = provider_id)
467
    query = AwbUpdate.query.filter_by(awb = awb)
766 rajveer 468
    info = query.all()
469
    return info
470
 
6643 rajveer 471
def store_shipment_info(update):
472
    updates = AwbUpdate.query.filter_by(providerId = update.providerId, awbNumber  = update.awbNumber, location = update.location, date = to_py_date(update.date), status = update.status, description = update.description).all()
473
    if not updates:
474
        dupdate = AwbUpdate()
475
        dupdate.providerId = update.providerId
476
        dupdate.awbNumber  = update.awbNumber
477
        dupdate.location = update.location
478
        dupdate.date = to_py_date(update.date)
479
        dupdate.status = update.status
480
        dupdate.description = update.description
481
        session.commit()
482
 
1730 ankur.sing 483
def get_holidays(start_date, end_date):
484
    query = PublicHolidays.query
485
    if start_date != -1:
486
        query = query.filter(PublicHolidays.date >= to_py_date(start_date))
487
    if end_date != -1:
488
        query = query.filter(PublicHolidays.date <= to_py_date(end_date))
489
    holidays = query.all()
490
    holiday_dates = [to_java_date(datetime.datetime(*time.strptime(str(holiday.date), '%Y-%m-%d')[:3])) for holiday in holidays] 
491
    return holiday_dates
492
 
5527 anupam.sin 493
def get_provider_for_pickup_type(pickUp):
494
    return Provider.query.filter(Provider.pickup == pickUp).first().id
495
 
766 rajveer 496
def close_session():
497
    if session.is_active:
498
        print "session is active. closing it."
2823 chandransh 499
        session.close()
3376 rajveer 500
 
501
def is_alive():
502
    try:
503
        session.query(Awb.id).limit(1).one()
504
        return True
505
    except:
5555 rajveer 506
        return False
507
 
508
def get_all_pickup_stores():
5572 anupam.sin 509
    pickupStores = PickupStore.query.all()
510
    return pickupStores
5555 rajveer 511
 
512
def get_pickup_store(storeId):
5719 rajveer 513
    return PickupStore.query.filter_by(id = storeId).one()
514
 
515
def get_pickup_store_by_hotspot_id(hotspotId):
516
    return PickupStore.query.filter_by(hotspotId = hotspotId).one()
6322 amar.kumar 517
 
6524 rajveer 518
def add_pincode(provider, pincode, destCode, exp, cod, stationType, otgAvailable):
7914 rajveer 519
    provider = Provider.query.filter_by(id = provider).one()
6322 amar.kumar 520
    serviceableLocationDetails = ServiceableLocationDetails()
521
    serviceableLocationDetails.provider = provider
522
    serviceableLocationDetails.dest_pincode = pincode
523
    serviceableLocationDetails.dest_code = destCode
524
    serviceableLocationDetails.exp = exp
525
    serviceableLocationDetails.cod = cod
526
    serviceableLocationDetails.station_type = stationType
6524 rajveer 527
    serviceableLocationDetails.otgAvailable = otgAvailable
7733 manish.sha 528
    if provider.id == 1:
7627 rajveer 529
        codlimit = 10000
530
        prepaidlimit = 50000
7733 manish.sha 531
    elif provider.id == 3:
7627 rajveer 532
        codlimit = 25000
533
        prepaidlimit = 100000
7733 manish.sha 534
    elif provider.id == 6:
7627 rajveer 535
        codlimit = 25000
536
        prepaidlimit = 100000
537
    serviceableLocationDetails.providerPrepaidLimit = prepaidlimit
538
    serviceableLocationDetails.providerCodLimit = codlimit
539
    serviceableLocationDetails.websiteCodLimit = codlimit
540
    serviceableLocationDetails.storeCodLimit = codlimit
6322 amar.kumar 541
    session.commit()
542
 
6524 rajveer 543
def update_pincode(providerId, pincode, exp, cod, otgAvailable):
6615 amar.kumar 544
    serviceableLocationDetails = ServiceableLocationDetails.get_by(provider_id = providerId, dest_pincode = pincode)
6322 amar.kumar 545
    serviceableLocationDetails.exp = exp
546
    serviceableLocationDetails.cod = cod
6524 rajveer 547
    serviceableLocationDetails.otgAvailable = otgAvailable
7256 rajveer 548
    session.commit()
7567 rajveer 549
 
13146 manish.sha 550
def add_new_awbs(provider_id, isCod, awbs, awbUsedFor):
7567 rajveer 551
    provider = get_provider(provider_id)
552
    if isCod:
553
        dtype = 'Cod'
554
    else:
555
        dtype = 'Prepaid'
556
    for awb in awbs:
557
        a = Awb()
558
        a.type =  dtype
559
        a.is_available = True
560
        a.awb_number = awb
13146 manish.sha 561
        a.awbUsedFor = awbUsedFor
7567 rajveer 562
        a.provider = provider 
563
    session.commit()
7608 rajveer 564
    return True
7256 rajveer 565
 
566
def adjust_delivery_time(start_time, delivery_days):
567
    '''
568
    Returns the actual no. of days which will pass while 'delivery_days'
569
    no. of business days will pass since 'order_time'. 
570
    '''
571
    start_date = start_time.date()
572
    end_date = start_date + datetime.timedelta(days = delivery_days)
7272 amit.gupta 573
    holidays = get_holidays(to_java_date(start_time), -1)
7256 rajveer 574
    holidays = [to_py_date(holiday).date() for holiday in holidays]
575
 
576
    while start_date <= end_date:
577
        if start_date.weekday() == 6 or start_date in holidays:
578
            delivery_days = delivery_days + 1
579
            end_date = end_date + datetime.timedelta(days = 1)
580
        start_date = start_date + datetime.timedelta(days = 1)
581
 
582
    return delivery_days
7275 rajveer 583
 
584
def get_min_advance_amount(itemId, destination_pin, providerId, codAllowed):
585
    client = CatalogClient().get_client()
586
    sp = client.getStorePricing(itemId)
587
 
588
    if codAllowed:
589
        return sp.minAdvancePrice, True
590
    else:
20275 amit.gupta 591
        dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit  = serviceable_location_cache.get(providerId).get(destination_pin)
7275 rajveer 592
        if iscod:
593
            if providerId == 6:
7489 rajveer 594
                return max(sp.minAdvancePrice, sp.recommendedPrice - storeCodLimit), True
7275 rajveer 595
            if providerId == 3:
7489 rajveer 596
                return max(sp.minAdvancePrice, sp.recommendedPrice - storeCodLimit), True
7275 rajveer 597
            if providerId == 1:
7489 rajveer 598
                return max(sp.minAdvancePrice, sp.recommendedPrice - storeCodLimit), True
7275 rajveer 599
        else:
7425 rajveer 600
            return sp.recommendedPrice, False
7733 manish.sha 601
#Start:- Added by Manish Sharma for Multiple Pincode Updation on 05-Jul-2013
602
 
7786 manish.sha 603
def run_Logistics_Location_Info_Update(logisticsLocationInfoList, runCompleteUpdate):
604
    if runCompleteUpdate == True :
605
        serviceableLocationDetails = ServiceableLocationDetails.query.all()
606
        for serviceableLocationDetail in serviceableLocationDetails:
7841 manish.sha 607
            serviceableLocationDetail.exp = False
608
            serviceableLocationDetail.cod = False
7786 manish.sha 609
    for logisticsLocationInfo in logisticsLocationInfoList:
7841 manish.sha 610
        serviceableLocationDetail = ServiceableLocationDetails.get_by(provider_id = logisticsLocationInfo.providerId, dest_pincode = logisticsLocationInfo.pinCode)
7914 rajveer 611
        provider = Provider.query.filter_by(id = logisticsLocationInfo.providerId).one()
7841 manish.sha 612
        if serviceableLocationDetail:
613
            serviceableLocationDetail.exp = logisticsLocationInfo.expAvailable
614
            serviceableLocationDetail.cod = logisticsLocationInfo.codAvailable
615
            serviceableLocationDetail.otgAvailable = logisticsLocationInfo.otgAvailable
616
            serviceableLocationDetail.providerCodLimit = logisticsLocationInfo.codLimit
617
            serviceableLocationDetail.providerPrepaidLimit = logisticsLocationInfo.prepaidLimit
618
            serviceableLocationDetail.storeCodLimit = logisticsLocationInfo.codLimit
8219 manish.sha 619
            serviceableLocationDetail.websiteCodLimit = min(26000,logisticsLocationInfo.codLimit)
7841 manish.sha 620
        else:
621
            serviceableLocationDetail= ServiceableLocationDetails()
622
            serviceableLocationDetail.provider = provider
623
            serviceableLocationDetail.dest_pincode = logisticsLocationInfo.pinCode
624
            serviceableLocationDetail.dest_code = logisticsLocationInfo.destinationCode
625
            serviceableLocationDetail.exp = logisticsLocationInfo.expAvailable
626
            serviceableLocationDetail.cod = logisticsLocationInfo.codAvailable
627
            serviceableLocationDetail.station_type = 0
628
            serviceableLocationDetail.otgAvailable = logisticsLocationInfo.otgAvailable
629
            serviceableLocationDetail.providerCodLimit = logisticsLocationInfo.codLimit
630
            serviceableLocationDetail.providerPrepaidLimit = logisticsLocationInfo.prepaidLimit
631
            serviceableLocationDetail.storeCodLimit = logisticsLocationInfo.codLimit
8219 manish.sha 632
            serviceableLocationDetail.websiteCodLimit = min(26000,logisticsLocationInfo.codLimit)
7841 manish.sha 633
 
7870 rajveer 634
        deliveryEstimate = DeliveryEstimate.get_by(provider_id = logisticsLocationInfo.providerId, destination_pin = logisticsLocationInfo.pinCode, warehouse_location = logisticsLocationInfo.warehouseId) 
7841 manish.sha 635
        if deliveryEstimate:
636
            deliveryEstimate.warehouse_location= logisticsLocationInfo.warehouseId
637
            deliveryEstimate.delivery_time= logisticsLocationInfo.deliveryTime
638
            deliveryEstimate.delivery_delay= logisticsLocationInfo.delivery_delay
19421 manish.sha 639
            deliveryEstimate.providerZoneCode = logisticsLocationInfo.zoneCode
7841 manish.sha 640
        else:
641
            deliveryEstimate = DeliveryEstimate()
642
            deliveryEstimate.destination_pin= logisticsLocationInfo.pinCode
643
            deliveryEstimate.provider = provider
644
            deliveryEstimate.warehouse_location= logisticsLocationInfo.warehouseId
645
            deliveryEstimate.delivery_time= logisticsLocationInfo.deliveryTime
646
            deliveryEstimate.delivery_delay= logisticsLocationInfo.delivery_delay
19421 manish.sha 647
            deliveryEstimate.providerZoneCode = logisticsLocationInfo.zoneCode
7733 manish.sha 648
    session.commit()
7786 manish.sha 649
 
7733 manish.sha 650
#End:- Added by Manish Sharma for Multiple Pincode Updation on 05-Jul-2013             
7275 rajveer 651
 
12895 manish.sha 652
def get_first_delivery_estimate_for_wh_location(pincode, whLocation):
653
    delEstimate = DeliveryEstimate.query.filter(DeliveryEstimate.destination_pin == pincode).filter(DeliveryEstimate.warehouse_location == whLocation).first()
654
    if delEstimate is None:
655
        return -1
656
    else:
657
        return 1
13146 manish.sha 658
 
659
def get_provider_limit_details_for_pincode(provider, pincode):
660
    serviceAbleDetails = ServiceableLocationDetails.get_by(provider_id = provider, dest_pincode = pincode)
661
    returnDataMap = {}
662
    if serviceAbleDetails:
663
        returnDataMap["websiteCodLimit"] = str(serviceAbleDetails.websiteCodLimit)
19230 manish.sha 664
        returnDataMap["providerCodLimit"] = str(serviceAbleDetails.providerCodLimit)
13146 manish.sha 665
        returnDataMap["providerPrepaidLimit"] = str(serviceAbleDetails.providerPrepaidLimit)
666
 
667
    return returnDataMap
668
 
669
def get_new_empty_awb(providerId, type, orderQuantity):
670
    query = Awb.query.with_lockmode("update").filter_by(provider_id = providerId, is_available = True)  #check the provider thing
671
    if type == DeliveryType.PREPAID:
672
        query = query.filter_by(type="Prepaid")
673
    if type == DeliveryType.COD:
674
        query = query.filter_by(type="COD")
675
 
676
    additionalQuery = query
677
    if orderQuantity == 1:
678
        query = query.filter_by(awbUsedFor=0)
679
    if orderQuantity >1:
680
        query = query.filter_by(awbUsedFor=1) 
681
 
682
    try:
683
        awb = query.first()
684
        if awb is None:
685
            additionalQuery = additionalQuery.filter_by(awbUsedFor=2)
686
            awb = additionalQuery.first()
687
        awb.is_available = False
688
        session.commit()
689
        return awb.awb_number
690
    except:
691
        raise LogisticsServiceException(103, "Unable to get an AWB for the given Provider: " + str(providerId))
19421 manish.sha 692
 
19474 manish.sha 693
def get_costing_and_delivery_estimate_for_pincode(pincode, transactionAmount, isCod, weight, billingWarehouseId, isCompleteTxn):
694
    print pincode, transactionAmount, isCod, weight, billingWarehouseId
19421 manish.sha 695
    deliveryEstimate = {}
696
    logsiticsCosting = {}
697
    providerCostingMap = {}
698
    serviceability = {}
699
 
700
    for providerId in serviceable_location_cache.keys():
701
        if serviceable_location_cache.has_key(providerId) and serviceable_location_cache.get(providerId).has_key(pincode):
19474 manish.sha 702
            dest_code, exp, iscod, otgAvailable, websiteCodLimit, storeCodLimit, providerPrepaidLimit, providerCodLimit = serviceable_location_cache.get(providerId).get(pincode)
19421 manish.sha 703
            if isCod and iscod:
19474 manish.sha 704
                if not isCompleteTxn:
705
                    if transactionAmount <= providerCodLimit:
706
                        serviceability[providerId] = serviceable_location_cache.get(providerId).get(pincode)
707
                    else:
708
                        continue
709
                else:
710
                    serviceability[providerId] = serviceable_location_cache.get(providerId).get(pincode)
19421 manish.sha 711
            elif isCod and not iscod:
712
                continue
713
            else:
19474 manish.sha 714
                if not isCompleteTxn:
715
                    if transactionAmount <= providerPrepaidLimit:
716
                        serviceability[providerId] = serviceable_location_cache.get(providerId).get(pincode)
717
                    else:
718
                        continue
719
                else:
720
                    serviceability[providerId] = serviceable_location_cache.get(providerId).get(pincode)
19421 manish.sha 721
 
722
    warehouse_location = warehouse_location_cache.get(billingWarehouseId)
723
    if warehouse_location is None:
724
        warehouse_location = 0
725
 
726
    noCostFoundCount = 0
727
    if len(serviceability)>0:
728
        for providerId, serviceableDetails in serviceability.items():
729
            delivery_time = delivery_estimate_cache[pincode, providerId, warehouse_location][0]
730
            delivery_delay = delivery_estimate_cache[pincode, providerId, warehouse_location][1]
731
            zoneCode = delivery_estimate_cache[pincode, providerId, warehouse_location][2]
732
            sla = delivery_time + delivery_delay
733
            if deliveryEstimate.has_key(sla):
734
                estimate = deliveryEstimate.get(sla)
735
                estimate.append(providerId)
736
                deliveryEstimate[sla] = estimate
737
            else:
738
                estimate = []
739
                estimate.append(providerId)
740
                deliveryEstimate[sla] = estimate
741
 
742
            logisticsCost = 0
743
            codCollectionCharges = 0    
744
            logisticsCostObj = None 
745
            if provider_costing_sheet.has_key(providerId) and provider_costing_sheet.get(providerId).has_key(zoneCode):
746
                logisticsCostObj = provider_costing_sheet.get(providerId).get(zoneCode)
747
                logisticsCost = logisticsCostObj.initialLogisticsCost
748
                if weight > logisticsCostObj.initialWeightUpperLimit:
749
                    additionalWeight = weight-logisticsCostObj.initialWeightUpperLimit
19663 manish.sha 750
                    additionalWeight = round(additionalWeight,0)
19483 manish.sha 751
                    additionalCostMultiplier = math.ceil(additionalWeight/logisticsCostObj.additionalUnitWeight)
19421 manish.sha 752
                    additionalCost = additionalCostMultiplier*logisticsCostObj.additionalUnitLogisticsCost
753
                    logisticsCost = logisticsCost + additionalCost
754
                if isCod:
755
                    if logisticsCostObj.codCollectionFactor:
19474 manish.sha 756
                        codCollectionCharges = max(logisticsCostObj.minimumCodCollectionCharges, (transactionAmount*logisticsCostObj.codCollectionFactor)/100)
757
                        logisticsCost = logisticsCost + max(logisticsCostObj.minimumCodCollectionCharges, (transactionAmount*logisticsCostObj.codCollectionFactor)/100)
19421 manish.sha 758
                    else:
759
                        codCollectionCharges = logisticsCostObj.minimumCodCollectionCharges
760
                        logisticsCost = logisticsCost + logisticsCostObj.minimumCodCollectionCharges
761
 
19474 manish.sha 762
                if logsiticsCosting.has_key(round(logisticsCost,0)):
763
                    costingList = logsiticsCosting.get(round(logisticsCost,0))
19421 manish.sha 764
                    costingList.append(providerId)
19474 manish.sha 765
                    logsiticsCosting[round(logisticsCost,0)] = costingList
19421 manish.sha 766
                else:
767
                    costingList = []
768
                    costingList.append(providerId)
19474 manish.sha 769
                    logsiticsCosting[round(logisticsCost,0)] = costingList                    
19421 manish.sha 770
 
771
                providerCostingMap[providerId] = [logisticsCost,codCollectionCharges]
772
            else:
773
                noCostFoundCount = noCostFoundCount +1
774
                continue
775
    else:
19474 manish.sha 776
        print "No provider assigned for pincode: " + str(pincode)
19535 manish.sha 777
        raise LogisticsServiceException(103, "Unable to get Provider for given pincode: " + str(pincode)+" Amount:- "+str(transactionAmount)+" Weight:- "+ str(weight))
19421 manish.sha 778
 
779
 
780
    if noCostFoundCount == len(serviceability):
19474 manish.sha 781
        print "No Costing Found for this pincode: " + str(pincode) +" for any of the provider"
19535 manish.sha 782
        raise LogisticsServiceException(103, "Unable to get Provider for given pincode: " + str(pincode)+" Amount:- "+str(transactionAmount)+" Weight:- "+ str(weight)+". Due to no costing found")
19421 manish.sha 783
 
784
    allSla = sorted(deliveryEstimate.keys())
785
    if len(allSla)==1:
786
        allEligibleProviders = deliveryEstimate.get(allSla[0])
787
        if len(allEligibleProviders)==1:
19474 manish.sha 788
            try:
19421 manish.sha 789
                costingDetails = providerCostingMap.get(allEligibleProviders[0])
790
                delEstCostObj = DeliveryEstimateAndCosting()
791
                delEstCostObj.logistics_provider_id = allEligibleProviders[0]
792
                delEstCostObj.pincode = pincode
793
                delEstCostObj.deliveryTime = delivery_estimate_cache[pincode, allEligibleProviders[0], warehouse_location][0]
794
                delEstCostObj.delivery_delay = delivery_estimate_cache[pincode, allEligibleProviders[0], warehouse_location][1]
795
                delEstCostObj.codAllowed = serviceability[allEligibleProviders[0]][2]
796
                delEstCostObj.otgAvailable = serviceability[allEligibleProviders[0]][3]
797
                delEstCostObj.logisticsCost = costingDetails[0]-costingDetails[1]
798
                delEstCostObj.codCollectionCharges = costingDetails[1]
799
                return delEstCostObj
19474 manish.sha 800
            except:
19535 manish.sha 801
                raise LogisticsServiceException(103, "Unable to get Provider for given pincode: " + str(pincode)+" Amount:- "+str(transactionAmount)+" Weight:- "+ str(weight)+".")
19421 manish.sha 802
        else:
803
            costingListOrder = []
804
            for providerId in allEligibleProviders:
19474 manish.sha 805
                costingDetails = providerCostingMap.get(providerId)
806
                if costingDetails and costingDetails[0] not in costingListOrder:
807
                    costingListOrder.append(round(costingDetails[0],0))
808
 
809
            costingListOrder = sorted(costingListOrder)
810
            eligibleProviders = logsiticsCosting.get(costingListOrder[0])
811
            for providerId in eligibleProviders:
812
                if providerCostingMap.has_key(providerId):
813
                    costingDetails = providerCostingMap.get(providerId)
19421 manish.sha 814
                    delEstCostObj = DeliveryEstimateAndCosting()
19474 manish.sha 815
                    delEstCostObj.logistics_provider_id = providerId
19421 manish.sha 816
                    delEstCostObj.pincode = pincode
19474 manish.sha 817
                    delEstCostObj.deliveryTime = delivery_estimate_cache[pincode, providerId, warehouse_location][0]
818
                    delEstCostObj.delivery_delay = delivery_estimate_cache[pincode, providerId, warehouse_location][1]
819
                    delEstCostObj.codAllowed = serviceability[providerId][2]
820
                    delEstCostObj.otgAvailable = serviceability[providerId][3]
19421 manish.sha 821
                    delEstCostObj.logisticsCost = costingDetails[0]-costingDetails[1]
822
                    delEstCostObj.codCollectionCharges = costingDetails[1]
823
                    return delEstCostObj
19474 manish.sha 824
                else:
825
                    continue
19535 manish.sha 826
            raise LogisticsServiceException(103, "Unable to get Provider for given pincode: " + str(pincode)+" Amount:- "+str(transactionAmount)+" Weight:- "+ str(weight)+".")
19474 manish.sha 827
    else:
828
        allEligibleProviders = []
829
        virtualDelayCostMap = {}
830
        virtualCommercialsCostMap = {} 
831
        for sla in allSla:
832
            if sla-allSla[0]<=1:
833
                consideredProviders = deliveryEstimate.get(sla)
834
                for providerId in consideredProviders:
835
                    if isCod and providerId in [7,46]:
836
                        virtualCommercialsCostMap[providerId] = 10
837
                    if providerId not in allEligibleProviders:
838
                        allEligibleProviders.append(providerId)
839
                    virtualDelayCostMap[providerId] = 0
840
            elif sla-allSla[0]==2:
841
                consideredProviders = deliveryEstimate.get(sla)
842
                for providerId in consideredProviders:
843
                    if isCod and providerId in [7,46]:
844
                        virtualCommercialsCostMap[providerId] = 10
845
                    if providerId not in allEligibleProviders:
846
                        allEligibleProviders.append(providerId)
847
                    virtualDelayCostMap[providerId] = 20+round((0.3*transactionAmount)/100,0)
848
            elif sla-allSla[0]==3:
849
                consideredProviders = deliveryEstimate.get(sla)
850
                for providerId in consideredProviders:
851
                    if isCod and providerId in [7,46]:
852
                        virtualCommercialsCostMap[providerId] = 10
853
                    if providerId not in allEligibleProviders:
854
                        allEligibleProviders.append(providerId)
855
                    virtualDelayCostMap[providerId] = 40+round((0.6*transactionAmount)/100,0)
856
 
857
        costingListOrder = []
858
        costingListMap = {}
859
        for providerId in allEligibleProviders:
860
            costingDetails = providerCostingMap.get(providerId)
861
            if costingDetails:
862
                cost = round(costingDetails[0],0)
863
                if virtualDelayCostMap.has_key(providerId):
864
                    cost = cost + virtualDelayCostMap.get(providerId)
865
                if virtualCommercialsCostMap.has_key(providerId):
866
                    cost = cost + virtualCommercialsCostMap.get(providerId)
867
                if costingListMap.has_key(cost):
868
                    providers = costingListMap.get(cost)
869
                    providers.append(providerId)                       
870
                    costingListMap[cost] = providers 
871
                else:
872
                    providers = []
873
                    providers.append(providerId)                       
874
                    costingListMap[cost] = providers  
875
                if cost not in costingListOrder:
876
                    costingListOrder.append(cost)
877
 
878
        costingListOrder = sorted(costingListOrder)
879
 
880
        print costingListMap
881
        eligibleProviders = costingListMap.get(costingListOrder[0])
882
        for providerId in eligibleProviders:
883
            if providerCostingMap.has_key(providerId):
884
                costingDetails = providerCostingMap.get(providerId)
19421 manish.sha 885
                delEstCostObj = DeliveryEstimateAndCosting()
19474 manish.sha 886
                delEstCostObj.logistics_provider_id = providerId
19421 manish.sha 887
                delEstCostObj.pincode = pincode
19474 manish.sha 888
                delEstCostObj.deliveryTime = delivery_estimate_cache[pincode, providerId, warehouse_location][0]
889
                delEstCostObj.delivery_delay = delivery_estimate_cache[pincode, providerId, warehouse_location][1]
890
                delEstCostObj.codAllowed = serviceability[providerId][2]
891
                delEstCostObj.otgAvailable = serviceability[providerId][3]
19421 manish.sha 892
                delEstCostObj.logisticsCost = costingDetails[0]-costingDetails[1]
893
                delEstCostObj.codCollectionCharges = costingDetails[1]
894
                return delEstCostObj
19474 manish.sha 895
            else:
896
                continue
20745 kshitij.so 897
        raise LogisticsServiceException(103, "Unable to get Provider for given pincode: " + str(pincode)+" Amount:- "+str(transactionAmount)+" Weight:- "+ str(weight)+".")
898
 
899
def get_bluedart_attributes_for_logistics_txn_id(logisticsTxnId, name):
900
    bluedartAttr =  BluedartAttribute.get_by(logisticsTransactionId=logisticsTxnId,name=name)
901
    if bluedartAttr is None:
902
        raise LogisticsServiceException(103, "Unable to get bluedart attributes for logisticsTxnId "+logisticsTxnId+" and name "+name)
903
    return bluedartAttr