Subversion Repositories SmartDukaan

Rev

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