Subversion Repositories SmartDukaan

Rev

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