Subversion Repositories SmartDukaan

Rev

Rev 483 | Rev 669 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 483 Rev 644
Line 3... Line 3...
3
 
3
 
4
@author: rajveer
4
@author: rajveer
5
'''
5
'''
6
 
6
 
7
from shop2020.logistics.service.impl import DataService
7
from shop2020.logistics.service.impl import DataService
8
from shop2020.logistics.service.impl.DataService import AWB, Provider, Shipment,\
8
from shop2020.logistics.service.impl.DataService import Awb, AwbUpdate, Provider, \
9
    ShipmentUpdate, DeliveryEstimate, PincodeWarehouseMapping
9
     DeliveryEstimate, WarehouseAllocation
10
from shop2020.thriftpy.logistics.ttypes import LogisticsServiceException
10
from shop2020.thriftpy.logistics.ttypes import LogisticsServiceException
11
from shop2020.utils.Utils import log_entry, to_py_date, to_java_date
11
from shop2020.utils.Utils import log_entry, to_py_date, to_java_date
12
from elixir import session
12
from elixir import session
13
import datetime
13
import datetime
14
 
14
 
15
def initialize():
15
def initialize():
16
    log_entry("initialize@DataAccessor", "Initializing data service")
16
    log_entry("initialize@DataAccessor", "Initializing data service")
17
    DataService.initialize()
17
    DataService.initialize()
18
 
18
 
19
def get_logistics_info(destination_pincode, sku_id):
19
def get_provider(provider_id):
20
    query = PincodeWarehouseMapping.query.filter_by(pincode = destination_pincode)
20
        return Provider.get_by(id=provider_id)
-
 
21
 
-
 
22
def get_providers():
-
 
23
    return Provider.query.all()
-
 
24
 
-
 
25
def get_logistics_estimation(destination_pin):
21
    try:
26
    try:
22
        mapping = query.one()
-
 
23
    except:
-
 
24
        raise LogisticsServiceException(101, "no warehouse assigned to pincode")
-
 
25
    warehouse_id = mapping.warehouse_id
-
 
26
    warehouse_pincode = mapping.warehouse_pin
-
 
27
 
-
 
28
    query = DeliveryEstimate.query.filter_by(source_pin = warehouse_pincode)
-
 
29
    query = query.filter_by(destination_pin = destination_pincode)
27
        warehouse_location = WarehouseAllocation.get_by(pincode = destination_pin).primary_warehouse_location
30
    try: 
-
 
31
        delivery_estimate = query.one()
-
 
32
    except:
28
    except:
33
        raise LogisticsServiceException(102, "no provider to deliver to destination pincode")
29
        raise LogisticsServiceException(101, "No Warehouse assigned to this pincode.")
34
    provider_id = delivery_estimate.provider_id
-
 
35
    airway_billno = get_empty_AWB(provider_id)
-
 
36
    
-
 
37
    query = query.filter_by(provider_id = provider_id)
-
 
38
    
-
 
39
    return warehouse_id, provider_id, airway_billno, delivery_estimate.delivery_time 
-
 
40
 
30
 
-
 
31
    query = DeliveryEstimate.query.filter_by(warehouse_location = warehouse_location)
41
def get_provider_by_id(provider_id):
32
    query = query.filter_by(destination_pin = destination_pin)
42
    query = Provider.query.filter_by(id=provider_id)
33
    query = query.order_by(DeliveryEstimate.delivery_time)
43
    try:
34
    try:
44
        return query.one()
35
        return query.first()
45
    except:
36
    except:
46
        provider = Provider()
-
 
47
        provider.name = "Default"
37
        raise LogisticsServiceException(103, "No Logistics partner listed for this destination pincode and the primary warehouse")
48
        session.commit()
-
 
49
        return provider
-
 
50
    
38
 
51
def add_empty_AWBs(numbers, provider_id):
39
def add_empty_AWBs(numbers, provider_id, type):
52
    provider = get_provider_by_id(provider_id)
-
 
53
    for number in numbers:
40
    for number in numbers:
54
        query = AWB.query.filter(AWB.awb_number == number)
-
 
55
        query = query.filter(AWB.provider_id == provider_id)
41
        query = Awb.query.filter_by(awb_number = number, provider_id = provider_id)
56
        try:
42
        try:
57
            query.one()
43
            query.one()
58
        except:    
44
        except:    
59
            awb = AWB()
45
            awb = Awb()
60
            awb.awb_number = number
46
            awb.awb_number = number
61
            awb.provider = provider
47
            awb.provider_id = provider_id
62
            awb.is_available = True
48
            awb.is_available = True
-
 
49
            awb.type = type
63
    session.commit()    
50
    session.commit()
64
 
51
 
65
def set_AWB_as_used(awb_number):
52
def set_AWB_as_used(awb_number):
66
    query = AWB.query.filter_by(awb_number = awb_number)
53
    query = Awb.query.filter_by(awb_number = awb_number)
67
    awb = query.one() 
54
    awb = query.one() 
68
    awb.is_available=False
55
    awb.is_available=False
69
    session.commit()
56
    session.commit()
70
    
57
    
71
def get_empty_AWB(provider_id):
58
def get_empty_AWB(provider_id):
72
    query = AWB.query.filter_by(provider_id = provider_id)  #check the provider thing
59
    query = Awb.query.filter_by(provider_id = provider_id, is_available = True)  #check the provider thing
73
    query = query.filter_by(is_available=True)
-
 
74
    try:
60
    try:
75
        awbs = query.all()
61
        awb = query.first()
76
        awb = awbs[0]
62
        awb.is_available = False
77
        set_AWB_as_used(awb.awb_number)
63
        session.commit()
78
        return awb.awb_number
64
        return awb.awb_number
79
    except:
65
    except:
80
        return "129102" #generate new exception
-
 
81
 
-
 
82
def get_providers():
-
 
83
    return Provider.query.all()
-
 
84
 
-
 
85
def get_provider(provider_id):
-
 
86
        return Provider.get_by(id=provider_id)
66
        raise LogisticsServiceException(103, "Unable to get an AWB for the given Provider: " + str(provider_id))
87
   
67
   
88
def get_shipment_info(awb_number):
-
 
89
    shipment = Shipment.get_by(awb = awb_number)
-
 
90
    query = ShipmentUpdate.query.filter_by(shipment = shipment)
-
 
91
    return query.all()
-
 
92
 
-
 
93
def create_shipment(shipment): #add date for the shipment
-
 
94
    new_shipment = Shipment()
-
 
95
    
-
 
96
    new_shipment.destination = shipment.destination 
-
 
97
    new_shipment.origin = shipment.origin
-
 
98
    new_shipment.recepient_address = shipment.recepient_address
-
 
99
    new_shipment.recepient_name = shipment.recepient_name
-
 
100
    new_shipment.recepient_phone = shipment.recepient_phone
-
 
101
    new_shipment.recepient_pincode = shipment.recepient_pincode
-
 
102
    new_shipment.shipment_contents = shipment.shipment_contents
-
 
103
    new_shipment.shipment_weight = shipment.shipment_weight
-
 
104
    new_shipment.warehouse_name = shipment.warehouse_name
-
 
105
    #new_shipment.timestamp = shipment.timestamp 
-
 
106
    if shipment.timestamp is None: 
-
 
107
        new_shipment.timestamp = datetime.datetime.today()
-
 
108
    else:
-
 
109
        new_shipment.timestamp = shipment.timestamp
-
 
110
        
-
 
111
    new_shipment.awb = shipment.awb
-
 
112
        
-
 
113
    session.commit() 
-
 
114
    return
-
 
115
        
-
 
116
def update_shipment_status(awb, shipment_update):
-
 
117
    shipment = Shipment.get_by(awb = awb)
-
 
118
    
-
 
119
    new_shipment_update = ShipmentUpdate()
-
 
120
    
-
 
121
    new_shipment_update.shipment = shipment
-
 
122
    new_shipment_update.description = shipment_update.description
-
 
123
    new_shipment_update.pin = shipment_update.pin
-
 
124
    
-
 
125
    new_shipment_update.shipment 
-
 
126
    
-
 
127
    if shipment_update.timestamp is None:
-
 
128
        new_shipment_update.timestamp = datetime.datetime.today()
-
 
129
    else:
-
 
130
        new_shipment_update.timestamp = shipment_update.timestamp    
-
 
131
    
-
 
132
    session.commit()
-
 
133
    
-
 
134
 
-
 
135
    
-
 
136
def get_shipments(warehouse_id, from_date, to_date, provider_id):
-
 
137
    awbs = AWB.query.filter_by(provider_id = provider_id).all()
-
 
138
    
-
 
139
    shipments = []
-
 
140
    for awb in awbs:
-
 
141
        awb_number = awb.awb_number
-
 
142
        query =  Shipment.query.filter(Shipment.awb == awb_number)
-
 
143
        query = query.filter(Shipment.timestamp > from_date)
-
 
144
        query = query.filter(Shipment.timestamp < to_date)
-
 
145
        try:
-
 
146
            shipment = query.one()
-
 
147
            shipments.append(shipment)
-
 
148
        except:
-
 
149
            continue    
-
 
150
    return shipments
-
 
151
 
-
 
152
def get_todays_shipments(warehouse_id, provider_id):
-
 
153
    from_date = datetime.date.today()
-
 
154
    from_datetime = datetime.datetime(from_date.year, from_date.month, from_date.day)
-
 
155
    to_date = from_date + datetime.timedelta(days=1)
-
 
156
    to_datetime = datetime.datetime(to_date.year, to_date.month, to_date.day)
-
 
157
 
-
 
158
    return get_shipments(warehouse_id, from_datetime, to_datetime, provider_id)
-
 
159
 
-
 
160
def get_logistics_estimation(item_id, destination_pin, provider_id):
-
 
161
    query = PincodeWarehouseMapping.query.filter_by(pincode = destination_pin)
-
 
162
    try:
-
 
163
        warehouse = query.one()
-
 
164
    except:
-
 
165
        warehouse = None
-
 
166
        #need to throw exception
-
 
167
            
-
 
168
    warehouse_pin = warehouse.warehouse_pin
-
 
169
    query = DeliveryEstimate.query.filter_by(source_pin = warehouse_pin)
-
 
170
    query = query.filter_by(destination_pin = destination_pin)
-
 
171
    query = query.filter_by(provider_id = provider_id)
-
 
172
    try:
-
 
173
        return query.one(), warehouse.warehouse_id
-
 
174
    except:
-
 
175
        return None
-
 
176
    # need to check the availability in another service before returning estimation.
-
 
177
    
-
 
178
def add_delivery_estimate(warehouse_id, destination_pin, provider_id, delivery_time, reliability):
-
 
179
    query = Provider.query.filter_by(id=provider_id)
-
 
180
    try:
-
 
181
        provider = query.one()
-
 
182
    except:
-
 
183
        print "provider not found"
-
 
184
 
-
 
185
    query = PincodeWarehouseMapping.query.filter_by(warehouse_id = warehouse_id)
-
 
186
    try:
-
 
187
        warehouse = query.one()
-
 
188
        warehouse_pin = warehouse.warehouse_pin
-
 
189
    except:
-
 
190
        warehouse_pin = 0
-
 
191
        print "warehouse pin not found"
-
 
192
 
-
 
193
    delivery_estimate = DeliveryEstimate()
-
 
194
    delivery_estimate.source_pin = warehouse_pin
-
 
195
    delivery_estimate.destination_pin = destination_pin
-
 
196
    delivery_estimate.provider = provider
-
 
197
    delivery_estimate.delivery_time = delivery_time
-
 
198
    delivery_estimate.relibility = reliability
-
 
199
    session.commit()
-
 
200
    
-
 
201
def add_pincode_warehouse_mapping(pincode, warehouse_id, warehouse_pin):
-
 
202
    mapper = PincodeWarehouseMapping()
-
 
203
    mapper.pincode = pincode
-
 
204
    mapper.warehouse_id = warehouse_id
-
 
205
    if warehouse_pin:
-
 
206
        mapper.warehouse_name = warehouse_pin
-
 
207
    session.commit()    
-
 
208
68
def get_shipment_info(awb_number, provider_id):
-
 
69
    awb = Awb.get_by(awb_number = awb_number, provider_id = provider_id)
-
 
70
    query = AwbUpdate.query.filter_by(awb = awb)
-
 
71
    return query.all()
-
 
72
209
73