Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
104 ashish 1
'''
2
Created on 29-Mar-2010
3
 
4
@author: ashish
5
'''
6
from shop2020.model.v1.order.impl.DataService import Transaction, LineItem,\
304 ashish 7
    AdditionalInfo, Payment, Shipment, TransactionTrail, Billing, ItemInfo,\
8
    Alerts, ExtraItemInfo
104 ashish 9
from shop2020.thriftpy.model.v1.order.ttypes import Transaction as T_Transaction,\
10
    TransactionServiceException
11
import datetime
12
from shop2020.utils.OrderStatus import status_transaction_init,\
194 ashish 13
    status_shipment_shipped, status_shipment_delivered, get_c_status
122 ashish 14
from elixir import *
104 ashish 15
from shop2020.utils.Utils import to_py_date
16
from sqlalchemy.sql.expression import and_
17
 
18
 
19
def get_new_transaction():
20
    transaction = Transaction()
21
    transaction.createdOn = datetime.datetime.now()
22
    transaction.status = status_transaction_init
23
    transaction.status_message = "New transaction"
24
    transaction.trails = []
25
    session.commit()
26
    return transaction
27
 
28
def create_transaction(t_transaction):
29
    orderinfo = t_transaction.orderInfo
30
    if not orderinfo:
31
        raise TransactionServiceException(101, "Orderinfo missing from the transaction")
32
    transaction = get_new_transaction()
33
    for line_item in orderinfo.lineitems:
34
        litem = LineItem()
132 ashish 35
        if line_item.item.id:
36
            litem.item_id = line_item.item.id
37
            item_info = ItemInfo()
38
            item_info.price = line_item.item.price
39
            item_info.weight = line_item.item.weight
40
            litem.item_info = item_info
104 ashish 41
        litem.added_on = to_py_date(line_item.addedOn)
42
        transaction.lineitems.append(litem)
43
        if line_item.additionalInfo:
44
            for k,v in line_item.additionalInfo.iteritems():
45
                additional_info = AdditionalInfo()
46
                additional_info.key = k
47
                additional_info.value = v
48
                litem.additional_info.append(additional_info)
132 ashish 49
    if t_transaction.shoppingCartid:
50
        transaction.shopping_cart_id = t_transaction.shoppingCartid
51
    transaction.customer_id = t_transaction.customer_id
52
    transaction.expected_delivery_time = to_py_date(t_transaction.expectedDeliveryTime)
194 ashish 53
    #no need to set status. It is already set.
54
    #transaction.status = t_transaction.transactionStatus
132 ashish 55
    transaction.status_message = t_transaction.statusDescription
56
    transaction.createdOn = to_py_date(t_transaction.createdOn)
104 ashish 57
 
132 ashish 58
    #add payment info
59
    #transaction.payments=[]
60
    if t_transaction.paymentInfo:
61
        if not t_transaction.paymentInfo.payments:
62
            raise TransactionServiceException(108, "no payments found")
63
 
64
        for k,v in t_transaction.paymentInfo.payments.iteritems():
65
            payment = Payment()
66
            payment.merchant_tx_id = v.merchant_tx_id
67
            payment.bank_tx_id = v.bank_tx_id
68
            payment.mode = v.mode
69
            payment.amount = v.amount
70
            payment.payment_id = v.id
71
            payment.status = v.status
72
            payment.status_message = v.description
73
            payment.start_time = to_py_date(v.submissionTimestamp)
74
            payment.finish_time = to_py_date(v.completionTimestamp)
75
            transaction.payments.append(payment)
194 ashish 76
    if not t_transaction.shipmentInfo:
77
        raise TransactionServiceException(109, "no shipping info attached with this")
78
    transaction.shipments = []
79
    for v in t_transaction.shipmentInfo.shipments:
80
        shipment = Shipment()
81
        shipment.weight = v.weight
82
        shipment.insurance_value = v.insurance
83
        shipment.status = get_c_status(v.status);
304 ashish 84
        shipment.address = v.address
194 ashish 85
        transaction.shipments.append(shipment)
104 ashish 86
    session.commit()
87
    return transaction.id
88
 
89
 
90
def get_transaction(transaction_id):
91
    transaction = Transaction.get_by(id=transaction_id)
92
    if not transaction:
93
        raise TransactionServiceException(108, "no such transaction")
94
 
95
    return transaction
96
 
97
def get_all_transactions(status, from_date, to_date):
98
    if not status:
99
        if not from_date and not to_date:
100
            #get all between from_date and to_date
101
            return Transaction.query.all()
102
 
103
        if not from_date:
104
            return Transaction.query.filter(Transaction.createdOn < to_date).all()
105
 
106
        if not to_date:
107
            return Transaction.query.filter(Transaction.createdOn > to_date).all()
108
        return Transaction.query.filter(and_(Transaction.createdOn < to_date , Transaction.createdOn > from_date)).all()
109
 
110
 
111
    if not from_date and not to_date:
112
        return Transaction.query.filter(Transaction.status == status).all()
113
    if not from_date:
114
        return Transaction.query.filter(and_(Transaction.status == status, Transaction.createdOn <to_date)).all()
115
    if not from_date:
116
        return Transaction.query.filter(and_(Transaction.status == status, Transaction.createdOn >from_date)).all()
117
    if not from_date:
118
        return Transaction.query.filter(and_(Transaction.status == status, and_(Transaction.createdOn <to_date, Transaction.createdOn > from_date))).all()
119
 
120
 
121
def get_transactions_for_shipment_status(status, from_date, to_date):
122
 
123
    if not status:
124
        raise TransactionServiceException(101, "unknown status")
125
 
126
    query = Shipment.query.filter(Shipment.status == status)
127
 
128
    if from_date:
129
        query = query.filter(Shipment.shipment_time >from_date)
130
    if to_date:
131
        query = query.filter(Shipment.shipment_time <to_date)
132
 
133
    shipments =  query.all()
134
 
135
    transactions = {}
136
    for shipment in shipments:
137
        if not transactions[shipment.transaction.id]:
138
            transactions.append(shipment.transaction)
139
    return transactions.values()
140
 
141
 
142
def get_transactions_for_customer(customer_id, from_date, to_date, status):
143
    if not customer_id:
144
        raise TransactionServiceException(101, "bas customer id")
145
    query = Transaction.query.filter(Transaction.customer_id == customer_id)
146
    if status:
147
        query = query.filter(Transaction.status == status)
148
    if from_date:
149
        query = query.filter(Transaction.createdOn >from_date)
150
    if to_date:
151
        query = query.filter(Transaction.createdOn < to_date)
152
    return query.all()
153
 
154
def get_transactions_for_customer_shipment(customer_id, from_date, to_date, status):
155
 
156
    if not customer_id:
157
        raise TransactionServiceException(101, "unknown customer id")
158
 
159
    query = Shipment.query.filter(Shipment.transaction.customerId == customer_id)
160
 
161
    if status:
162
        query = query.filter(Shipment.status == status)
163
 
164
    if from_date:
165
        query = query.filter(Shipment.shipment_time >from_date)
166
 
167
    if to_date:
168
        query = query.filter(Shipment.shipment_time <to_date)
169
 
170
    shipments =  query.all()
171
 
172
    transactions = {}
173
    for shipment in shipments:
174
        if not transactions[shipment.transaction.id]:
175
            transactions.append(shipment.transaction)
176
    return transactions.values()
177
 
178
def get_transaction_status(transaction_id):
179
 
180
    if not transaction_id:
181
        raise TransactionServiceException(101, "bad transaction id")
182
 
183
    transaction = get_transaction(transaction_id)
184
 
185
    return transaction.status
186
 
187
def change_transaction_status(transaction_id, new_status, description):
188
    transaction = get_transaction(transaction_id)
189
    trail = TransactionTrail()
190
    trail.old_value = str(transaction.status)
191
    trail.new_value = str(new_status)
192
    transaction.status = new_status
193
    trail.transaction = transaction
194
    trail.timestamp = datetime.datetime.now()
195
    trail.description = description
196
    transaction.status_message = description
197
    session.commit()
198
    return True
199
 
200
def set_shipping_tracker_info(transaction_id, shipping_id, tracking_id, airwayBillNo, provider):
201
    shipment = Shipment.get_by(id=shipping_id)
202
    if not shipment:
203
        raise TransactionServiceException(101, "not such shipment found")
204
 
205
    transaction = shipment.transaction
206
    if transaction.id != transaction_id:
207
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
208
    shipment.tracking_id = tracking_id
209
    shipment.airway_bill_no = airwayBillNo
210
    shipment.provider = provider
211
    trail = TransactionTrail()
212
    trail.timestamp = datetime.datetime.now()
213
    trail.description = "shipping_id %d:tracking_id %s:airwayBill %s: provider %s" %(shipping_id, tracking_id, airwayBillNo, provider)
214
    trail.transaction = transaction
215
    session.commit()
216
    return True
217
 
218
def change_shipping_status(transaction_id, shipping_id, status, description):
219
    shipment = Shipment.get_by(id=shipping_id)
220
    if not shipment:
221
        raise TransactionServiceException(101, "not such shipment found")
222
 
223
    transaction = shipment.transaction
224
    if transaction.id != transaction_id:
225
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
226
 
227
    trail = TransactionTrail()
228
    trail.old_value = str(shipment.status)
229
    trail.new_value = str(status)
230
    shipment.status = status
231
    trail.transaction = transaction
232
    trail.timestamp = datetime.datetime.now()
233
    trail.description = "Shipping status change : %s"%(description)
234
    shipment.status_message = description
235
    session.commit()
236
    return True
237
 
238
def set_shipping_date(transaction_id, shipping_id, timestamp):
239
    shipment = Shipment.get_by(id=shipping_id)
240
    if not shipment:
241
        raise TransactionServiceException(101, "not such shipment found")
242
 
243
    transaction = shipment.transaction
244
    if transaction.id != transaction_id:
245
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
246
 
247
    trail = TransactionTrail()
248
    trail.old_value = str(shipment.status)
249
    trail.new_value = str(status_shipment_shipped)
250
    shipment.status = status_shipment_shipped
251
    trail.transaction = transaction
252
    trail.timestamp = datetime.datetime.now()
253
    trail.description = "Shipping status change : %s"%(shipment.id)
254
    shipment.status_message = "Shipment dispatched"
255
    shipment.shipment_time = timestamp
256
    session.commit()
257
    return True
258
 
259
 
260
def set_delivery_date(transaction_id, shipping_id, timestamp):
261
    shipment = Shipment.get_by(id=shipping_id)
262
    if not shipment:
263
        raise TransactionServiceException(101, "not such shipment found")
264
 
265
    transaction = shipment.transaction
266
    if transaction.id != transaction_id:
267
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
268
 
269
    trail = TransactionTrail()
270
    trail.old_value = str(shipment.status)
271
    trail.new_value = str(status_shipment_delivered)
272
    shipment.status = status_shipment_delivered
273
    trail.transaction = transaction
274
    trail.timestamp = datetime.datetime.now()
275
    trail.description = "Shipping status change : %s"%(shipment.id)
276
    shipment.status_message = "Shipment delivered"
277
    shipment.delivery_time = timestamp
278
    session.commit()
279
    return True
280
 
281
def set_billing(transaction_id, t_billing):
282
    transaction = get_transaction(transaction_id)
194 ashish 283
    line_item = LineItem.query.filter_by(transaction_id=transaction_id).all()
284
    #line_item = LineItem.get_by(id = t_billing.lineItem.id)
104 ashish 285
    if not line_item:
286
        raise TransactionServiceException(101, "unable to get this line item for id %d" % (t_billing.lineItem.id))
287
    billing = Billing()
288
    billing.line_item = line_item
289
    billing.bill_number = t_billing.billNumber
290
    try:
291
        billing.created_on = to_py_date(t_billing.generatedTimestamp)
292
    except:
293
        raise TransactionServiceException(108, "bad time stamp found while adding billing for transaction id %d" %(transaction.id))
194 ashish 294
    billing.generated_by = t_billing.generatedBy
104 ashish 295
    session.commit()
296
    return True
297
 
298
def get_line_items(transaction_id):
299
    transaction = get_transaction(transaction_id)
300
    if not transaction.lineitems:
301
        raise TransactionServiceException(108, "no lineitems with transaction %d"%(transaction_id))
302
    return transaction.lineitems
303
 
304
def get_shipments(transaction_id):
305
    transaction = get_transaction(transaction_id)
306
    if not transaction.shipments:
307
        raise TransactionServiceException(108, "no shipments with transaction %d"%(transaction_id))
308
    return transaction.shipments
309
 
310
def get_billings(transaction_id):
311
    transaction = get_transaction(transaction_id)
312
    if not transaction.lineitems:
313
        raise TransactionServiceException(108, "no lineitems, hence no billing with transaction %d"%(transaction_id))
314
    billings = []
315
    for lineitem in transaction.lineitems:
316
        billings.append(lineitem.billing)
317
    return billings
132 ashish 318
    return transaction.shipments
319
 
320
def get_transactions_for_shopping_cart_id(shopping_cart_id):
321
    transactions = Transaction.query.filter_by(shopping_cart_id=shopping_cart_id).all()
322
    if not transactions:
323
        raise TransactionServiceException(108, "transactions for this shopping cart")
304 ashish 324
    return transactions
325
 
326
def get_alerts(transaction_id, all):
327
    query = Alerts.query.filter_by(transaction_id=transaction_id)
328
    if not all:
329
        query = query.filter_by(valid=True)
330
    return query.all()
331
 
332
def set_alert(transaction_id, unset, type, comment):
333
    #get existing alert
334
    if unset:
335
        query = Alerts.query.filter_by(transaction_id=transaction_id)
336
        query = query.filter_by(type=type)
337
        alerts = query.all()
338
        for alert in alerts:
339
            if alert.valid:
340
                alert.valid = False
341
                alert.comment = comment
342
                alert.time_unset = datetime.datetime.now()
343
    else:
344
        alert = Alerts()
345
        alert.transaction_id = transaction_id
346
        alert.valid = True
347
        alert.type = type
348
        alert.comment = comment
349
        alert.time_set = datetime.datetime.now()
350
    session.commit()
351
 
352
def get_extra_info(transaction_id):
353
    return ExtraItemInfo.get_by(transaction_id=transaction_id)
354
 
355
def set_extra_info(transaction_id, sku_id, model, vendor, colour):
356
    extra_item_info = ExtraItemInfo()
357
    extra_item_info.transaction_id = transaction_id
358
    extra_item_info.sku_id = sku_id
359
    extra_item_info.model = model
360
    extra_item_info.vendor = vendor
361
    extra_item_info.colour = colour
362
    session.commit()