Subversion Repositories SmartDukaan

Rev

Rev 494 | Rev 642 | 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,\
483 rajveer 7
    Payment, Alerts, Order
104 ashish 8
from shop2020.thriftpy.model.v1.order.ttypes import Transaction as T_Transaction,\
9
    TransactionServiceException
10
import datetime
483 rajveer 11
from shop2020.utils.OrderStatus import status_transaction_init, get_c_status
122 ashish 12
from elixir import *
104 ashish 13
from shop2020.utils.Utils import to_py_date
14
from sqlalchemy.sql.expression import and_
483 rajveer 15
from shop2020.model.v1 import order
104 ashish 16
 
17
 
483 rajveer 18
 
104 ashish 19
def get_new_transaction():
20
    transaction = Transaction()
21
    transaction.createdOn = datetime.datetime.now()
353 ashish 22
    transaction.status = status_transaction_init 
104 ashish 23
    transaction.status_message = "New transaction"
483 rajveer 24
 
25
    return transaction
26
 
27
'''
28
    customer_id = Field(Integer)
29
    shopping_cart_id = Field(Integer)
30
    payments = OneToMany("Payment")
31
    orders = OneToMany("Order")
32
'''
33
 
34
def create_order(t_order):
35
    order = Order()
36
    if t_order.warehouse_id:
37
        order.warehouse_id = t_order.warehouse_id
509 rajveer 38
    if t_order.logistics_provider_id:    
483 rajveer 39
        order.logistics_provider_id = t_order.logistics_provider_id
40
        order.airwaybill_no = t_order.airwaybill_no
41
        order.tracking_id = t_order.tracking_id
42
    if t_order.expected_delivery_time:    
43
        order.expected_delivery_time = to_py_date(t_order.expected_delivery_time)
44
    if t_order.customer_id:    
45
        order.customer_id = t_order.customer_id
46
        order.customer_name = t_order.customer_name
47
        order.customer_mobilenumber = t_order.customer_mobilenumber
48
        order.customer_pincode = t_order.customer_pincode
49
        order.customer_address = t_order.customer_address
50
        order.customer_email = t_order.customer_email
51
    #new status and status description to be added    
509 rajveer 52
    order.status = get_c_status(t_order.status)  
483 rajveer 53
    order.statusDescription = t_order.statusDescription
54
    order.total_amount = t_order.total_amount
55
    order.total_weight = t_order.total_weight
56
    if t_order.created_timestamp:
57
        order.created_timestamp = to_py_date(t_order.created_timestamp)
58
    else:
59
        order.created_timestamp = datetime.datetime.now()    
60
    #these fields will not be populated in initial
61
    """
62
    order.invoice_number = order.invoice_number
63
    order.billed_by = order.billed_by
64
    order.accepted_timestamp = order.accepted_timestamp
65
    order.billing_timestamp = order.billing_timestamp
66
    order.shipping_timestamp = order.shipping_timestamp
67
    order.delivery_timestamp = order.delivery_timestamp
68
    """
69
    return order
70
 
71
def create_transaction(t_transaction):
72
    t_orders = t_transaction.orders
73
    if not t_orders:
74
        raise TransactionServiceException(101, "Orders missing from the transaction")
75
    transaction = get_new_transaction()
76
    transaction.customer_id = t_transaction.customer_id 
77
    transaction.shopping_cart_id = t_transaction.shoppingCartid
78
 
79
    for t_order in t_orders:
80
        order = create_order(t_order)
81
        order.transaction = transaction 
82
        for line_item in t_order.lineitems:
83
            litem = LineItem()
84
            litem.sku_id = line_item.sku_id
85
            litem.brand = line_item.brand
86
            if line_item.model_number:
87
                litem.model_number = line_item.model_number
88
            if line_item.model_name:    
89
                litem.model_name = line_item.model_name
90
            if line_item.extra_info:
91
                litem.extra_info = line_item.extra_info
92
            litem.quantity = line_item.quantity
93
            litem.unit_price = line_item.unit_price
94
            litem.unit_weight = line_item.unit_weight
95
            litem.total_price = line_item.total_price
96
            litem.total_weight = line_item.total_weight
97
            """
98
            if line_item.addedOn:
99
                litem.added_on = to_py_date(line_item.addedOn)
100
            else:
101
                litem.added_on = datetime.datetime.now()
102
            """
103
            litem.order = order
104
 
105
    #add payment info
106
    #transaction.payments=[]
509 rajveer 107
    """
483 rajveer 108
    if t_transaction.paymentInfo:
109
        if not t_transaction.paymentInfo.payments:
110
            raise TransactionServiceException(108, "no payments found")
111
 
112
        for k,v in t_transaction.paymentInfo.payments.iteritems():
113
            payment = Payment()
114
            payment.merchant_tx_id = v.merchant_tx_id
115
            payment.bank_tx_id = v.bank_tx_id
116
            payment.mode = v.mode
117
            payment.amount = v.amount
118
            payment.payment_id = v.id
119
            payment.status = v.status
120
            payment.status_message = v.description
121
            payment.start_time = to_py_date(v.submissionTimestamp)
122
            payment.finish_time = to_py_date(v.completionTimestamp)
123
            transaction.payments.append(payment)
509 rajveer 124
    """
483 rajveer 125
    session.commit()
126
    return transaction.id
127
 
128
def get_transaction(transaction_id):
129
    transaction = Transaction.get_by(id=transaction_id)
130
    if not transaction:
131
        raise TransactionServiceException(108, "no such transaction")
132
 
133
    return transaction
134
 
135
def get_transactions_for_customer(customer_id, from_date, to_date, status):
136
    if not customer_id:
137
        raise TransactionServiceException(101, "bad customer id")
138
    query = Transaction.query.filter(Transaction.customer_id == customer_id)
139
    if status:
140
        query = query.filter(Transaction.status == status)
141
    if from_date:
142
        query = query.filter(Transaction.createdOn >from_date)
143
    if to_date:
144
        query = query.filter(Transaction.createdOn < to_date)
145
    return query.all()
146
 
147
def get_transactions_for_shopping_cart_id(shopping_cart_id):
148
    transactions = Transaction.query.filter_by(shopping_cart_id=shopping_cart_id).all()
149
    if not transactions:
150
        raise TransactionServiceException(108, "transactions for this shopping cart")
151
    return transactions
152
 
153
def get_transaction_status(transaction_id):
154
    if not transaction_id:
155
        raise TransactionServiceException(101, "bad transaction id")
156
 
157
    transaction = get_transaction(transaction_id)
158
 
159
    return transaction.status
160
 
161
def change_transaction_status(transaction_id, new_status, description):
162
    transaction = get_transaction(transaction_id)
163
    transaction.status = new_status
164
    transaction.status_message = description
165
    session.commit()
166
    return True
167
 
168
 
169
def get_order(order_id):
170
    order = Order.get_by(id=order_id)
171
    if not order:
172
        raise TransactionServiceException(108, "no such order")
173
 
174
    return order
175
 
176
def get_orders_for_customer(customer_id, from_date, to_date, status):
177
    if not customer_id:
178
        raise TransactionServiceException(101, "bad customer id")
179
    query = Order.query.filter(Order.customer_id == customer_id)
180
    if status:
181
        query = query.filter(Order.status == status)
182
    if from_date:
183
        query = query.filter(Order.created_timestamp >from_date)
184
    if to_date:
185
        query = query.filter(Order.created_timestamp < to_date)
186
    return query.all()
187
 
188
def get_all_orders(status, from_date, to_date, warehouse_id):
189
    if not warehouse_id:
190
        raise TransactionServiceException(101, "bad warehouse id")
191
    query = Order.query.filter(Order.warehouse_id == warehouse_id)
192
    if status:
193
        query = query.filter(Order.status == status)
194
    if from_date:
195
        query = query.filter(Order.created_timestamp >from_date)
196
    if to_date:
197
        query = query.filter(Order.created_timestamp < to_date)
198
    return query.all()
199
 
200
 
201
def change_order_status(self, orderId, status, description):
202
    order = get_order(orderId)
203
    order.status = status
204
    order.statusDescription = description
205
    session.commit()
206
    return True
207
 
208
 
209
def get_orders_for_transaction(transaction_id):
210
    orders = Order.query.filter_by(transaction_id=transaction_id).all()
211
    if not orders:
212
        raise TransactionServiceException(101, "No order for the transaction")
213
    return orders
214
 
215
def get_line_items_for_order(order_id):
216
    query = LineItem.query.filter(LineItem.order_id == order_id)
217
    return query.all()
218
 
219
 
494 rajveer 220
def add_billing_details(orderId, invoice_number, billed_by):
221
    order = Order.get_by(id=orderId)
222
    if not order:
223
        raise TransactionServiceException(101, "No order found for the givem orderid")
224
    order.invoice_number = invoice_number
225
    order.billed_by = billed_by
226
    session.commit()
227
    return True
228
 
483 rajveer 229
def get_alerts(order_id, all):
230
    query = Alerts.query.filter_by(order_id=order_id)
231
    if not all:
232
        query = query.filter_by(valid=True)
233
    return query.all()
234
 
235
def set_alert(order_id, unset, type, comment):
236
    #get existing alert
237
    if unset:
238
        query = Alerts.query.filter_by(order_id=order_id)
239
        query = query.filter_by(type=type)
240
        alerts = query.all()
241
        for alert in alerts:
242
            if alert.valid:
243
                alert.valid = False
244
                alert.comment = comment
245
                alert.time_unset = datetime.datetime.now()
246
    else:
247
        alert = Alerts()
248
        alert.order_id = order_id
249
        alert.valid = True
250
        alert.type = type
251
        alert.comment = comment
252
        alert.time_set = datetime.datetime.now()
253
    session.commit()
254
 
255
"""
256
def get_new_transaction():
257
    transaction = Transaction()
258
    transaction.createdOn = datetime.datetime.now()
259
    transaction.status = status_transaction_init 
260
    transaction.status_message = "New transaction"
104 ashish 261
    transaction.trails = []
262
    session.commit()
263
    return transaction
264
 
265
def create_transaction(t_transaction):
266
    orderinfo = t_transaction.orderInfo
267
    if not orderinfo:
268
        raise TransactionServiceException(101, "Orderinfo missing from the transaction")
269
    transaction = get_new_transaction()
270
    for line_item in orderinfo.lineitems:
271
        litem = LineItem()
132 ashish 272
        if line_item.item.id:
273
            litem.item_id = line_item.item.id
274
            item_info = ItemInfo()
275
            item_info.price = line_item.item.price
276
            item_info.weight = line_item.item.weight
277
            litem.item_info = item_info
104 ashish 278
        litem.added_on = to_py_date(line_item.addedOn)
279
        transaction.lineitems.append(litem)
280
        if line_item.additionalInfo:
281
            for k,v in line_item.additionalInfo.iteritems():
282
                additional_info = AdditionalInfo()
283
                additional_info.key = k
284
                additional_info.value = v
285
                litem.additional_info.append(additional_info)
358 ashish 286
    if t_transaction.warehouse_id:
287
        transaction.warehouse_id = t_transaction.warehouse_id
132 ashish 288
    if t_transaction.shoppingCartid:
289
        transaction.shopping_cart_id = t_transaction.shoppingCartid
290
    transaction.customer_id = t_transaction.customer_id
291
    transaction.expected_delivery_time = to_py_date(t_transaction.expectedDeliveryTime)
194 ashish 292
    #no need to set status. It is already set.
293
    #transaction.status = t_transaction.transactionStatus
132 ashish 294
    transaction.status_message = t_transaction.statusDescription
295
    transaction.createdOn = to_py_date(t_transaction.createdOn)
104 ashish 296
 
132 ashish 297
    #add payment info
298
    #transaction.payments=[]
299
    if t_transaction.paymentInfo:
300
        if not t_transaction.paymentInfo.payments:
301
            raise TransactionServiceException(108, "no payments found")
302
 
303
        for k,v in t_transaction.paymentInfo.payments.iteritems():
304
            payment = Payment()
305
            payment.merchant_tx_id = v.merchant_tx_id
306
            payment.bank_tx_id = v.bank_tx_id
307
            payment.mode = v.mode
308
            payment.amount = v.amount
309
            payment.payment_id = v.id
310
            payment.status = v.status
311
            payment.status_message = v.description
312
            payment.start_time = to_py_date(v.submissionTimestamp)
313
            payment.finish_time = to_py_date(v.completionTimestamp)
314
            transaction.payments.append(payment)
194 ashish 315
    if not t_transaction.shipmentInfo:
316
        raise TransactionServiceException(109, "no shipping info attached with this")
317
    transaction.shipments = []
318
    for v in t_transaction.shipmentInfo.shipments:
319
        shipment = Shipment()
320
        shipment.weight = v.weight
321
        shipment.insurance_value = v.insurance
322
        shipment.status = get_c_status(v.status);
304 ashish 323
        shipment.address = v.address
194 ashish 324
        transaction.shipments.append(shipment)
104 ashish 325
    session.commit()
326
    return transaction.id
327
 
328
 
329
def get_transaction(transaction_id):
330
    transaction = Transaction.get_by(id=transaction_id)
331
    if not transaction:
332
        raise TransactionServiceException(108, "no such transaction")
333
 
334
    return transaction
335
 
358 ashish 336
def get_all_transactions(status, from_date, to_date, warehouse_id):
337
 
338
    query = Transaction.query
339
    if warehouse_id:
340
        query = query.filter_by(warehouse_id=warehouse_id)
341
 
104 ashish 342
    if not status:
343
        if not from_date and not to_date:
344
            #get all between from_date and to_date
358 ashish 345
            return query.all()
104 ashish 346
 
347
        if not from_date:
358 ashish 348
            return query.filter(Transaction.createdOn < to_date).all()
104 ashish 349
 
350
        if not to_date:
358 ashish 351
            return query.filter(Transaction.createdOn > to_date).all()
352
        return query.filter(and_(Transaction.createdOn < to_date , Transaction.createdOn > from_date)).all()
104 ashish 353
 
354
 
355
    if not from_date and not to_date:
358 ashish 356
        return query.filter(Transaction.status == status).all()
104 ashish 357
    if not from_date:
358 ashish 358
        return query.filter(and_(Transaction.status == status, Transaction.createdOn <to_date)).all()
104 ashish 359
    if not from_date:
358 ashish 360
        return query.filter(and_(Transaction.status == status, Transaction.createdOn >from_date)).all()
104 ashish 361
    if not from_date:
358 ashish 362
        return query.filter(and_(Transaction.status == status, and_(Transaction.createdOn <to_date, Transaction.createdOn > from_date))).all()
104 ashish 363
 
364
 
365
def get_transactions_for_shipment_status(status, from_date, to_date):
366
 
367
    if not status:
368
        raise TransactionServiceException(101, "unknown status")
369
 
370
    query = Shipment.query.filter(Shipment.status == status)
371
 
372
    if from_date:
373
        query = query.filter(Shipment.shipment_time >from_date)
374
    if to_date:
375
        query = query.filter(Shipment.shipment_time <to_date)
376
 
377
    shipments =  query.all()
378
 
379
    transactions = {}
380
    for shipment in shipments:
381
        if not transactions[shipment.transaction.id]:
382
            transactions.append(shipment.transaction)
383
    return transactions.values()
384
 
385
 
386
def get_transactions_for_customer(customer_id, from_date, to_date, status):
387
    if not customer_id:
388
        raise TransactionServiceException(101, "bas customer id")
389
    query = Transaction.query.filter(Transaction.customer_id == customer_id)
390
    if status:
391
        query = query.filter(Transaction.status == status)
392
    if from_date:
393
        query = query.filter(Transaction.createdOn >from_date)
394
    if to_date:
395
        query = query.filter(Transaction.createdOn < to_date)
396
    return query.all()
397
 
398
def get_transactions_for_customer_shipment(customer_id, from_date, to_date, status):
399
 
400
    if not customer_id:
401
        raise TransactionServiceException(101, "unknown customer id")
402
 
403
    query = Shipment.query.filter(Shipment.transaction.customerId == customer_id)
404
 
405
    if status:
406
        query = query.filter(Shipment.status == status)
407
 
408
    if from_date:
409
        query = query.filter(Shipment.shipment_time >from_date)
410
 
411
    if to_date:
412
        query = query.filter(Shipment.shipment_time <to_date)
413
 
414
    shipments =  query.all()
415
 
416
    transactions = {}
417
    for shipment in shipments:
418
        if not transactions[shipment.transaction.id]:
419
            transactions.append(shipment.transaction)
420
    return transactions.values()
421
 
422
def get_transaction_status(transaction_id):
423
 
424
    if not transaction_id:
425
        raise TransactionServiceException(101, "bad transaction id")
426
 
427
    transaction = get_transaction(transaction_id)
428
 
429
    return transaction.status
430
 
431
def change_transaction_status(transaction_id, new_status, description):
432
    transaction = get_transaction(transaction_id)
433
    trail = TransactionTrail()
434
    trail.old_value = str(transaction.status)
435
    trail.new_value = str(new_status)
436
    transaction.status = new_status
437
    trail.transaction = transaction
438
    trail.timestamp = datetime.datetime.now()
439
    trail.description = description
440
    transaction.status_message = description
441
    session.commit()
442
    return True
443
 
444
def set_shipping_tracker_info(transaction_id, shipping_id, tracking_id, airwayBillNo, provider):
445
    shipment = Shipment.get_by(id=shipping_id)
446
    if not shipment:
447
        raise TransactionServiceException(101, "not such shipment found")
448
 
449
    transaction = shipment.transaction
450
    if transaction.id != transaction_id:
451
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
452
    shipment.tracking_id = tracking_id
453
    shipment.airway_bill_no = airwayBillNo
454
    shipment.provider = provider
455
    trail = TransactionTrail()
456
    trail.timestamp = datetime.datetime.now()
457
    trail.description = "shipping_id %d:tracking_id %s:airwayBill %s: provider %s" %(shipping_id, tracking_id, airwayBillNo, provider)
458
    trail.transaction = transaction
459
    session.commit()
460
    return True
461
 
462
def change_shipping_status(transaction_id, shipping_id, status, description):
463
    shipment = Shipment.get_by(id=shipping_id)
464
    if not shipment:
465
        raise TransactionServiceException(101, "not such shipment found")
466
 
467
    transaction = shipment.transaction
468
    if transaction.id != transaction_id:
469
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
470
 
471
    trail = TransactionTrail()
472
    trail.old_value = str(shipment.status)
473
    trail.new_value = str(status)
474
    shipment.status = status
475
    trail.transaction = transaction
476
    trail.timestamp = datetime.datetime.now()
477
    trail.description = "Shipping status change : %s"%(description)
478
    shipment.status_message = description
479
    session.commit()
480
    return True
481
 
482
def set_shipping_date(transaction_id, shipping_id, timestamp):
483
    shipment = Shipment.get_by(id=shipping_id)
484
    if not shipment:
485
        raise TransactionServiceException(101, "not such shipment found")
486
 
487
    transaction = shipment.transaction
488
    if transaction.id != transaction_id:
489
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
490
 
491
    trail = TransactionTrail()
492
    trail.old_value = str(shipment.status)
493
    trail.new_value = str(status_shipment_shipped)
494
    shipment.status = status_shipment_shipped
495
    trail.transaction = transaction
496
    trail.timestamp = datetime.datetime.now()
497
    trail.description = "Shipping status change : %s"%(shipment.id)
498
    shipment.status_message = "Shipment dispatched"
499
    shipment.shipment_time = timestamp
500
    session.commit()
501
    return True
502
 
503
 
504
def set_delivery_date(transaction_id, shipping_id, timestamp):
505
    shipment = Shipment.get_by(id=shipping_id)
506
    if not shipment:
507
        raise TransactionServiceException(101, "not such shipment found")
508
 
509
    transaction = shipment.transaction
510
    if transaction.id != transaction_id:
511
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
512
 
513
    trail = TransactionTrail()
514
    trail.old_value = str(shipment.status)
515
    trail.new_value = str(status_shipment_delivered)
516
    shipment.status = status_shipment_delivered
517
    trail.transaction = transaction
518
    trail.timestamp = datetime.datetime.now()
519
    trail.description = "Shipping status change : %s"%(shipment.id)
520
    shipment.status_message = "Shipment delivered"
521
    shipment.delivery_time = timestamp
522
    session.commit()
523
    return True
524
 
525
def set_billing(transaction_id, t_billing):
526
    transaction = get_transaction(transaction_id)
194 ashish 527
    line_item = LineItem.query.filter_by(transaction_id=transaction_id).all()
528
    #line_item = LineItem.get_by(id = t_billing.lineItem.id)
104 ashish 529
    if not line_item:
530
        raise TransactionServiceException(101, "unable to get this line item for id %d" % (t_billing.lineItem.id))
531
    billing = Billing()
532
    billing.line_item = line_item
533
    billing.bill_number = t_billing.billNumber
534
    try:
535
        billing.created_on = to_py_date(t_billing.generatedTimestamp)
536
    except:
537
        raise TransactionServiceException(108, "bad time stamp found while adding billing for transaction id %d" %(transaction.id))
194 ashish 538
    billing.generated_by = t_billing.generatedBy
104 ashish 539
    session.commit()
540
    return True
541
 
542
def get_line_items(transaction_id):
543
    transaction = get_transaction(transaction_id)
544
    if not transaction.lineitems:
545
        raise TransactionServiceException(108, "no lineitems with transaction %d"%(transaction_id))
546
    return transaction.lineitems
547
 
548
def get_shipments(transaction_id):
549
    transaction = get_transaction(transaction_id)
550
    if not transaction.shipments:
551
        raise TransactionServiceException(108, "no shipments with transaction %d"%(transaction_id))
552
    return transaction.shipments
553
 
554
def get_billings(transaction_id):
555
    transaction = get_transaction(transaction_id)
556
    if not transaction.lineitems:
557
        raise TransactionServiceException(108, "no lineitems, hence no billing with transaction %d"%(transaction_id))
558
    billings = []
559
    for lineitem in transaction.lineitems:
560
        billings.append(lineitem.billing)
561
    return billings
132 ashish 562
    return transaction.shipments
563
 
564
def get_transactions_for_shopping_cart_id(shopping_cart_id):
565
    transactions = Transaction.query.filter_by(shopping_cart_id=shopping_cart_id).all()
566
    if not transactions:
567
        raise TransactionServiceException(108, "transactions for this shopping cart")
304 ashish 568
    return transactions
569
 
570
def get_alerts(transaction_id, all):
571
    query = Alerts.query.filter_by(transaction_id=transaction_id)
572
    if not all:
573
        query = query.filter_by(valid=True)
574
    return query.all()
575
 
576
def set_alert(transaction_id, unset, type, comment):
577
    #get existing alert
578
    if unset:
579
        query = Alerts.query.filter_by(transaction_id=transaction_id)
580
        query = query.filter_by(type=type)
581
        alerts = query.all()
582
        for alert in alerts:
583
            if alert.valid:
584
                alert.valid = False
585
                alert.comment = comment
586
                alert.time_unset = datetime.datetime.now()
587
    else:
588
        alert = Alerts()
589
        alert.transaction_id = transaction_id
590
        alert.valid = True
591
        alert.type = type
592
        alert.comment = comment
593
        alert.time_set = datetime.datetime.now()
594
    session.commit()
595
 
596
def get_extra_info(transaction_id):
597
    return ExtraItemInfo.get_by(transaction_id=transaction_id)
598
 
599
def set_extra_info(transaction_id, sku_id, model, vendor, colour):
600
    extra_item_info = ExtraItemInfo()
601
    extra_item_info.transaction_id = transaction_id
602
    extra_item_info.sku_id = sku_id
603
    extra_item_info.model = model
604
    extra_item_info.vendor = vendor
605
    extra_item_info.colour = colour
483 rajveer 606
    session.commit()
607
"""