Subversion Repositories SmartDukaan

Rev

Rev 908 | Rev 963 | 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,\
685 chandransh 7
    Alerts, Order
104 ashish 8
from shop2020.thriftpy.model.v1.order.ttypes import Transaction as T_Transaction,\
690 chandransh 9
    TransactionServiceException, TransactionStatus, OrderStatus
104 ashish 10
import datetime
122 ashish 11
from elixir import *
855 rajveer 12
from shop2020.utils.Utils import to_py_date, to_java_date
104 ashish 13
from sqlalchemy.sql.expression import and_
483 rajveer 14
from shop2020.model.v1 import order
743 rajveer 15
from shop2020.clients.LogisticsClient import LogisticsClient
871 chandransh 16
from shop2020.clients.InventoryClient import InventoryClient
104 ashish 17
 
18
def get_new_transaction():
19
    transaction = Transaction()
20
    transaction.createdOn = datetime.datetime.now()
738 chandransh 21
    transaction.status = TransactionStatus.INIT
104 ashish 22
    transaction.status_message = "New transaction"
483 rajveer 23
    return transaction
24
 
25
def create_order(t_order):
26
    order = Order()
27
    if t_order.warehouse_id:
28
        order.warehouse_id = t_order.warehouse_id
509 rajveer 29
    if t_order.logistics_provider_id:    
483 rajveer 30
        order.logistics_provider_id = t_order.logistics_provider_id
31
        order.airwaybill_no = t_order.airwaybill_no
32
        order.tracking_id = t_order.tracking_id
33
    if t_order.expected_delivery_time:    
34
        order.expected_delivery_time = to_py_date(t_order.expected_delivery_time)
35
    if t_order.customer_id:    
36
        order.customer_id = t_order.customer_id
37
        order.customer_name = t_order.customer_name
860 rajveer 38
        order.customer_city = t_order.customer_city
39
        order.customer_state = t_order.customer_state
483 rajveer 40
        order.customer_mobilenumber = t_order.customer_mobilenumber
41
        order.customer_pincode = t_order.customer_pincode
738 chandransh 42
        order.customer_address1 = t_order.customer_address1
43
        order.customer_address2 = t_order.customer_address2
483 rajveer 44
        order.customer_email = t_order.customer_email
45
    #new status and status description to be added    
716 rajveer 46
    order.status = t_order.status  
483 rajveer 47
    order.statusDescription = t_order.statusDescription
48
    order.total_amount = t_order.total_amount
49
    order.total_weight = t_order.total_weight
50
    if t_order.created_timestamp:
51
        order.created_timestamp = to_py_date(t_order.created_timestamp)
52
    else:
685 chandransh 53
        order.created_timestamp = datetime.datetime.now()
483 rajveer 54
    return order
55
 
56
def create_transaction(t_transaction):
57
    t_orders = t_transaction.orders
58
    if not t_orders:
59
        raise TransactionServiceException(101, "Orders missing from the transaction")
60
    transaction = get_new_transaction()
61
    transaction.customer_id = t_transaction.customer_id 
62
    transaction.shopping_cart_id = t_transaction.shoppingCartid
63
 
64
    for t_order in t_orders:
65
        order = create_order(t_order)
66
        order.transaction = transaction 
67
        for line_item in t_order.lineitems:
68
            litem = LineItem()
716 rajveer 69
            litem.item_id = line_item.item_id
483 rajveer 70
            litem.brand = line_item.brand
71
            if line_item.model_number:
72
                litem.model_number = line_item.model_number
73
            if line_item.model_name:    
74
                litem.model_name = line_item.model_name
908 chandransh 75
            if line_item.color:
76
                litem.color = line_item.color
483 rajveer 77
            if line_item.extra_info:
78
                litem.extra_info = line_item.extra_info
79
            litem.quantity = line_item.quantity
80
            litem.unit_price = line_item.unit_price
81
            litem.unit_weight = line_item.unit_weight
82
            litem.total_price = line_item.total_price
83
            litem.total_weight = line_item.total_weight
84
            """
85
            if line_item.addedOn:
86
                litem.added_on = to_py_date(line_item.addedOn)
87
            else:
88
                litem.added_on = datetime.datetime.now()
89
            """
90
            litem.order = order
91
    session.commit()
92
    return transaction.id
93
 
94
def get_transaction(transaction_id):
95
    transaction = Transaction.get_by(id=transaction_id)
96
    if not transaction:
97
        raise TransactionServiceException(108, "no such transaction")
98
 
99
    return transaction
100
 
101
def get_transactions_for_customer(customer_id, from_date, to_date, status):
102
    if not customer_id:
103
        raise TransactionServiceException(101, "bad customer id")
104
    query = Transaction.query.filter(Transaction.customer_id == customer_id)
105
    if status:
106
        query = query.filter(Transaction.status == status)
107
    if from_date:
108
        query = query.filter(Transaction.createdOn >from_date)
109
    if to_date:
110
        query = query.filter(Transaction.createdOn < to_date)
111
    return query.all()
112
 
113
def get_transactions_for_shopping_cart_id(shopping_cart_id):
114
    transactions = Transaction.query.filter_by(shopping_cart_id=shopping_cart_id).all()
115
    if not transactions:
116
        raise TransactionServiceException(108, "transactions for this shopping cart")
117
    return transactions
118
 
119
def get_transaction_status(transaction_id):
120
    if not transaction_id:
121
        raise TransactionServiceException(101, "bad transaction id")
122
 
123
    transaction = get_transaction(transaction_id)
124
 
125
    return transaction.status
126
 
127
def change_transaction_status(transaction_id, new_status, description):
128
    transaction = get_transaction(transaction_id)
129
    transaction.status = new_status
130
    transaction.status_message = description
690 chandransh 131
    if new_status == TransactionStatus.FAILED:
132
        for order in transaction.orders:
133
            order.status = OrderStatus.PAYMENT_FAILED
134
    elif new_status == TransactionStatus.IN_PROCESS:
135
        for order in transaction.orders:
136
            order.status = OrderStatus.SUBMITTED_FOR_PROCESSING
743 rajveer 137
            #After we got payment success, we will set logistics info also 
138
            logistics_client = LogisticsClient().get_client()
139
            #FIXME line item is only one now. If multiple will come, need to fix.
871 chandransh 140
            item_id = order.lineitems[0].item_id
141
            logistics_info = logistics_client.getLogisticsInfo(order.customer_pincode, item_id)
743 rajveer 142
 
143
            order.warehouse_id = logistics_info.warehouseId
144
            order.logistics_provider_id = logistics_info.providerId
145
            order.airwaybill_no = logistics_info.airway_billno
146
            order.tracking_id = order.airwaybill_no
855 rajveer 147
            order.expected_delivery_time = datetime.datetime.now() + datetime.timedelta(days=logistics_info.deliveryTime)
871 chandransh 148
 
149
            catalog_client = InventoryClient().get_client()
150
            catalog_client.reserveItemInWarehouse(item_id, logistics_info.warehouseId, order.lineitems[0].quantity)
483 rajveer 151
    session.commit()
152
    return True
153
 
154
 
155
def get_order(order_id):
156
    order = Order.get_by(id=order_id)
157
    if not order:
158
        raise TransactionServiceException(108, "no such order")
159
 
160
    return order
161
 
162
def get_orders_for_customer(customer_id, from_date, to_date, status):
163
    if not customer_id:
164
        raise TransactionServiceException(101, "bad customer id")
165
    query = Order.query.filter(Order.customer_id == customer_id)
166
    if status:
167
        query = query.filter(Order.status == status)
168
    if from_date:
169
        query = query.filter(Order.created_timestamp >from_date)
170
    if to_date:
171
        query = query.filter(Order.created_timestamp < to_date)
172
    return query.all()
173
 
174
def get_all_orders(status, from_date, to_date, warehouse_id):
175
    if not warehouse_id:
176
        raise TransactionServiceException(101, "bad warehouse id")
177
    query = Order.query.filter(Order.warehouse_id == warehouse_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 change_order_status(self, orderId, status, description):
187
    order = get_order(orderId)
188
    order.status = status
189
    order.statusDescription = description
190
    session.commit()
191
    return True
192
 
921 rajveer 193
def accept_order(self, orderId):
194
    order = get_order(orderId)
195
    order.status = OrderStatus.ACCEPTED
196
    order.statusDescription = "Order Accepted"
197
    order.accepted_timestamp = datetime.datetime.now()
198
    session.commit()
199
    return True
200
 
201
def bill_order(self, orderId):
202
    order = get_order(orderId)
203
    order.status = OrderStatus.BILLED
204
    order.statusDescription = "Order Billed"
205
    order.billing_timestamp = datetime.datetime.now()
206
    session.commit()
207
    return True    
208
 
483 rajveer 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
 
642 chandransh 220
def add_billing_details(orderId, invoice_number, jacket_number, billed_by):
494 rajveer 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
642 chandransh 225
    order.jacket_number = jacket_number
494 rajveer 226
    order.billed_by = billed_by
227
    session.commit()
228
    return True
759 chandransh 229
 
230
def mark_orders_as_manifested(warehouse_id, provider_id):
231
    try:
852 chandransh 232
        orders = Order.query.filter_by(warehouse_id = warehouse_id, logistics_provider_id = provider_id, status = OrderStatus.BILLED).all()
759 chandransh 233
        for order in orders:
234
            order.status = OrderStatus.SHIPPED_FROM_WH
235
        session.commit()
236
        return True
237
    except:
238
        return False
494 rajveer 239
 
759 chandransh 240
 
483 rajveer 241
def get_alerts(order_id, all):
242
    query = Alerts.query.filter_by(order_id=order_id)
243
    if not all:
244
        query = query.filter_by(valid=True)
245
    return query.all()
246
 
247
def set_alert(order_id, unset, type, comment):
248
    #get existing alert
249
    if unset:
250
        query = Alerts.query.filter_by(order_id=order_id)
251
        query = query.filter_by(type=type)
252
        alerts = query.all()
253
        for alert in alerts:
254
            if alert.valid:
255
                alert.valid = False
256
                alert.comment = comment
257
                alert.time_unset = datetime.datetime.now()
258
    else:
259
        alert = Alerts()
260
        alert.order_id = order_id
261
        alert.valid = True
262
        alert.type = type
263
        alert.comment = comment
264
        alert.time_set = datetime.datetime.now()
766 rajveer 265
    session.commit()    
266
 
267
def close_session():
268
    if session.is_active:
269
        print "session is active. closing it."
270
        session.close()