Subversion Repositories SmartDukaan

Rev

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