Subversion Repositories SmartDukaan

Rev

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