Subversion Repositories SmartDukaan

Rev

Rev 477 | Rev 644 | 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
 
7
from shop2020.logistics.service.impl import DataService
8
from shop2020.logistics.service.impl.DataService import AWB, Provider, Shipment,\
477 rajveer 9
    ShipmentUpdate, DeliveryEstimate, PincodeWarehouseMapping
483 rajveer 10
from shop2020.thriftpy.logistics.ttypes import LogisticsServiceException
442 rajveer 11
from shop2020.utils.Utils import log_entry, to_py_date, to_java_date
12
from elixir import session
13
import datetime
14
 
15
def initialize():
16
    log_entry("initialize@DataAccessor", "Initializing data service")
17
    DataService.initialize()
18
 
483 rajveer 19
def get_logistics_info(destination_pincode, sku_id):
20
    query = PincodeWarehouseMapping.query.filter_by(pincode = destination_pincode)
21
    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)
30
    try: 
31
        delivery_estimate = query.one()
32
    except:
33
        raise LogisticsServiceException(102, "no provider to deliver to destination 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
 
442 rajveer 41
def get_provider_by_id(provider_id):
42
    query = Provider.query.filter_by(id=provider_id)
43
    try:
44
        return query.one()
45
    except:
46
        provider = Provider()
47
        provider.name = "Default"
48
        session.commit()
49
        return provider
50
 
51
def add_empty_AWBs(numbers, provider_id):
52
    provider = get_provider_by_id(provider_id)
53
    for number in numbers:
444 rajveer 54
        query = AWB.query.filter(AWB.awb_number == number)
55
        query = query.filter(AWB.provider_id == provider_id)
56
        try:
57
            query.one()
58
        except:    
59
            awb = AWB()
60
            awb.awb_number = number
61
            awb.provider = provider
62
            awb.is_available = True
442 rajveer 63
    session.commit()    
64
 
444 rajveer 65
def set_AWB_as_used(awb_number):
66
    query = AWB.query.filter_by(awb_number = awb_number)
67
    awb = query.one() 
68
    awb.is_available=False
69
    session.commit()
70
 
442 rajveer 71
def get_empty_AWB(provider_id):
444 rajveer 72
    query = AWB.query.filter_by(provider_id = provider_id)  #check the provider thing
442 rajveer 73
    query = query.filter_by(is_available=True)
74
    try:
444 rajveer 75
        awbs = query.all()
76
        awb = awbs[0]
77
        set_AWB_as_used(awb.awb_number)
78
        return awb.awb_number
442 rajveer 79
    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)
87
 
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)
472 rajveer 159
 
160
def get_logistics_estimation(item_id, destination_pin, provider_id):
477 rajveer 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)
472 rajveer 171
    query = query.filter_by(provider_id = provider_id)
172
    try:
477 rajveer 173
        return query.one(), warehouse.warehouse_id
472 rajveer 174
    except:
175
        return None
176
    # need to check the availability in another service before returning estimation.
177
 
477 rajveer 178
def add_delivery_estimate(warehouse_id, destination_pin, provider_id, delivery_time, reliability):
472 rajveer 179
    query = Provider.query.filter_by(id=provider_id)
180
    try:
181
        provider = query.one()
182
    except:
477 rajveer 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
 
472 rajveer 193
    delivery_estimate = DeliveryEstimate()
477 rajveer 194
    delivery_estimate.source_pin = warehouse_pin
472 rajveer 195
    delivery_estimate.destination_pin = destination_pin
196
    delivery_estimate.provider = provider
197
    delivery_estimate.delivery_time = delivery_time
477 rajveer 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()