Subversion Repositories SmartDukaan

Rev

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