Subversion Repositories SmartDukaan

Rev

Rev 122 | Rev 194 | 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,\
12
    status_shipment_shipped, status_shipment_delivered
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)
52
    transaction.status = t_transaction.transactionStatus
53
    transaction.status_message = t_transaction.statusDescription
54
    transaction.createdOn = to_py_date(t_transaction.createdOn)
104 ashish 55
 
132 ashish 56
    #add payment info
57
    #transaction.payments=[]
58
    if t_transaction.paymentInfo:
59
        if not t_transaction.paymentInfo.payments:
60
            raise TransactionServiceException(108, "no payments found")
61
 
62
        for k,v in t_transaction.paymentInfo.payments.iteritems():
63
            payment = Payment()
64
            payment.merchant_tx_id = v.merchant_tx_id
65
            payment.bank_tx_id = v.bank_tx_id
66
            payment.mode = v.mode
67
            payment.amount = v.amount
68
            payment.payment_id = v.id
69
            payment.status = v.status
70
            payment.status_message = v.description
71
            payment.start_time = to_py_date(v.submissionTimestamp)
72
            payment.finish_time = to_py_date(v.completionTimestamp)
73
            transaction.payments.append(payment)
104 ashish 74
    session.commit()
75
    return transaction.id
76
 
77
 
78
def get_transaction(transaction_id):
79
    transaction = Transaction.get_by(id=transaction_id)
80
    if not transaction:
81
        raise TransactionServiceException(108, "no such transaction")
82
 
83
    return transaction
84
 
85
def get_all_transactions(status, from_date, to_date):
86
    if not status:
87
        if not from_date and not to_date:
88
            #get all between from_date and to_date
89
            return Transaction.query.all()
90
 
91
        if not from_date:
92
            return Transaction.query.filter(Transaction.createdOn < to_date).all()
93
 
94
        if not to_date:
95
            return Transaction.query.filter(Transaction.createdOn > to_date).all()
96
        return Transaction.query.filter(and_(Transaction.createdOn < to_date , Transaction.createdOn > from_date)).all()
97
 
98
 
99
    if not from_date and not to_date:
100
        return Transaction.query.filter(Transaction.status == status).all()
101
    if not from_date:
102
        return Transaction.query.filter(and_(Transaction.status == status, Transaction.createdOn <to_date)).all()
103
    if not from_date:
104
        return Transaction.query.filter(and_(Transaction.status == status, Transaction.createdOn >from_date)).all()
105
    if not from_date:
106
        return Transaction.query.filter(and_(Transaction.status == status, and_(Transaction.createdOn <to_date, Transaction.createdOn > from_date))).all()
107
 
108
 
109
def get_transactions_for_shipment_status(status, from_date, to_date):
110
 
111
    if not status:
112
        raise TransactionServiceException(101, "unknown status")
113
 
114
    query = Shipment.query.filter(Shipment.status == status)
115
 
116
    if from_date:
117
        query = query.filter(Shipment.shipment_time >from_date)
118
    if to_date:
119
        query = query.filter(Shipment.shipment_time <to_date)
120
 
121
    shipments =  query.all()
122
 
123
    transactions = {}
124
    for shipment in shipments:
125
        if not transactions[shipment.transaction.id]:
126
            transactions.append(shipment.transaction)
127
    return transactions.values()
128
 
129
 
130
def get_transactions_for_customer(customer_id, from_date, to_date, status):
131
    if not customer_id:
132
        raise TransactionServiceException(101, "bas customer id")
133
    query = Transaction.query.filter(Transaction.customer_id == customer_id)
134
    if status:
135
        query = query.filter(Transaction.status == status)
136
    if from_date:
137
        query = query.filter(Transaction.createdOn >from_date)
138
    if to_date:
139
        query = query.filter(Transaction.createdOn < to_date)
140
    return query.all()
141
 
142
def get_transactions_for_customer_shipment(customer_id, from_date, to_date, status):
143
 
144
    if not customer_id:
145
        raise TransactionServiceException(101, "unknown customer id")
146
 
147
    query = Shipment.query.filter(Shipment.transaction.customerId == customer_id)
148
 
149
    if status:
150
        query = query.filter(Shipment.status == status)
151
 
152
    if from_date:
153
        query = query.filter(Shipment.shipment_time >from_date)
154
 
155
    if to_date:
156
        query = query.filter(Shipment.shipment_time <to_date)
157
 
158
    shipments =  query.all()
159
 
160
    transactions = {}
161
    for shipment in shipments:
162
        if not transactions[shipment.transaction.id]:
163
            transactions.append(shipment.transaction)
164
    return transactions.values()
165
 
166
def get_transaction_status(transaction_id):
167
 
168
    if not transaction_id:
169
        raise TransactionServiceException(101, "bad transaction id")
170
 
171
    transaction = get_transaction(transaction_id)
172
 
173
    return transaction.status
174
 
175
def change_transaction_status(transaction_id, new_status, description):
176
    transaction = get_transaction(transaction_id)
177
    trail = TransactionTrail()
178
    trail.old_value = str(transaction.status)
179
    trail.new_value = str(new_status)
180
    transaction.status = new_status
181
    trail.transaction = transaction
182
    trail.timestamp = datetime.datetime.now()
183
    trail.description = description
184
    transaction.status_message = description
185
    session.commit()
186
    return True
187
 
188
def set_shipping_tracker_info(transaction_id, shipping_id, tracking_id, airwayBillNo, provider):
189
    shipment = Shipment.get_by(id=shipping_id)
190
    if not shipment:
191
        raise TransactionServiceException(101, "not such shipment found")
192
 
193
    transaction = shipment.transaction
194
    if transaction.id != transaction_id:
195
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
196
    shipment.tracking_id = tracking_id
197
    shipment.airway_bill_no = airwayBillNo
198
    shipment.provider = provider
199
    trail = TransactionTrail()
200
    trail.timestamp = datetime.datetime.now()
201
    trail.description = "shipping_id %d:tracking_id %s:airwayBill %s: provider %s" %(shipping_id, tracking_id, airwayBillNo, provider)
202
    trail.transaction = transaction
203
    session.commit()
204
    return True
205
 
206
def change_shipping_status(transaction_id, shipping_id, status, description):
207
    shipment = Shipment.get_by(id=shipping_id)
208
    if not shipment:
209
        raise TransactionServiceException(101, "not such shipment found")
210
 
211
    transaction = shipment.transaction
212
    if transaction.id != transaction_id:
213
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
214
 
215
    trail = TransactionTrail()
216
    trail.old_value = str(shipment.status)
217
    trail.new_value = str(status)
218
    shipment.status = status
219
    trail.transaction = transaction
220
    trail.timestamp = datetime.datetime.now()
221
    trail.description = "Shipping status change : %s"%(description)
222
    shipment.status_message = description
223
    session.commit()
224
    return True
225
 
226
def set_shipping_date(transaction_id, shipping_id, timestamp):
227
    shipment = Shipment.get_by(id=shipping_id)
228
    if not shipment:
229
        raise TransactionServiceException(101, "not such shipment found")
230
 
231
    transaction = shipment.transaction
232
    if transaction.id != transaction_id:
233
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
234
 
235
    trail = TransactionTrail()
236
    trail.old_value = str(shipment.status)
237
    trail.new_value = str(status_shipment_shipped)
238
    shipment.status = status_shipment_shipped
239
    trail.transaction = transaction
240
    trail.timestamp = datetime.datetime.now()
241
    trail.description = "Shipping status change : %s"%(shipment.id)
242
    shipment.status_message = "Shipment dispatched"
243
    shipment.shipment_time = timestamp
244
    session.commit()
245
    return True
246
 
247
 
248
def set_delivery_date(transaction_id, shipping_id, timestamp):
249
    shipment = Shipment.get_by(id=shipping_id)
250
    if not shipment:
251
        raise TransactionServiceException(101, "not such shipment found")
252
 
253
    transaction = shipment.transaction
254
    if transaction.id != transaction_id:
255
        raise TransactionServiceException(108, "Looks like this is invalid transaction")
256
 
257
    trail = TransactionTrail()
258
    trail.old_value = str(shipment.status)
259
    trail.new_value = str(status_shipment_delivered)
260
    shipment.status = status_shipment_delivered
261
    trail.transaction = transaction
262
    trail.timestamp = datetime.datetime.now()
263
    trail.description = "Shipping status change : %s"%(shipment.id)
264
    shipment.status_message = "Shipment delivered"
265
    shipment.delivery_time = timestamp
266
    session.commit()
267
    return True
268
 
269
def set_billing(transaction_id, t_billing):
270
    transaction = get_transaction(transaction_id)
271
    line_item = LineItem.get_by(id = t_billing.lineItem.id)
272
    if not line_item:
273
        raise TransactionServiceException(101, "unable to get this line item for id %d" % (t_billing.lineItem.id))
274
    billing = Billing()
275
    billing.line_item = line_item
276
    billing.bill_number = t_billing.billNumber
277
    try:
278
        billing.created_on = to_py_date(t_billing.generatedTimestamp)
279
    except:
280
        raise TransactionServiceException(108, "bad time stamp found while adding billing for transaction id %d" %(transaction.id))
281
    billing.generated_by = t_billing.generatedby
282
    session.commit()
283
    return True
284
 
285
def get_line_items(transaction_id):
286
    transaction = get_transaction(transaction_id)
287
    if not transaction.lineitems:
288
        raise TransactionServiceException(108, "no lineitems with transaction %d"%(transaction_id))
289
    return transaction.lineitems
290
 
291
def get_shipments(transaction_id):
292
    transaction = get_transaction(transaction_id)
293
    if not transaction.shipments:
294
        raise TransactionServiceException(108, "no shipments with transaction %d"%(transaction_id))
295
    return transaction.shipments
296
 
297
def get_billings(transaction_id):
298
    transaction = get_transaction(transaction_id)
299
    if not transaction.lineitems:
300
        raise TransactionServiceException(108, "no lineitems, hence no billing with transaction %d"%(transaction_id))
301
    billings = []
302
    for lineitem in transaction.lineitems:
303
        billings.append(lineitem.billing)
304
    return billings
132 ashish 305
    return transaction.shipments
306
 
307
def get_transactions_for_shopping_cart_id(shopping_cart_id):
308
    transactions = Transaction.query.filter_by(shopping_cart_id=shopping_cart_id).all()
309
    if not transactions:
310
        raise TransactionServiceException(108, "transactions for this shopping cart")
311
    return transactions