Rev 509 | Rev 690 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
'''Created on 29-Mar-2010@author: ashish'''from shop2020.model.v1.order.impl.DataService import Transaction, LineItem,\Payment, Alerts, Orderfrom shop2020.thriftpy.model.v1.order.ttypes import Transaction as T_Transaction,\TransactionServiceExceptionimport datetimefrom shop2020.utils.OrderStatus import status_transaction_init, get_c_statusfrom elixir import *from shop2020.utils.Utils import to_py_datefrom sqlalchemy.sql.expression import and_from shop2020.model.v1 import orderdef get_new_transaction():transaction = Transaction()transaction.createdOn = datetime.datetime.now()transaction.status = status_transaction_inittransaction.status_message = "New transaction"return transaction'''customer_id = Field(Integer)shopping_cart_id = Field(Integer)payments = OneToMany("Payment")orders = OneToMany("Order")'''def create_order(t_order):order = Order()if t_order.warehouse_id:order.warehouse_id = t_order.warehouse_idif t_order.logistics_provider_id:order.logistics_provider_id = t_order.logistics_provider_idorder.airwaybill_no = t_order.airwaybill_noorder.tracking_id = t_order.tracking_idif t_order.expected_delivery_time:order.expected_delivery_time = to_py_date(t_order.expected_delivery_time)if t_order.customer_id:order.customer_id = t_order.customer_idorder.customer_name = t_order.customer_nameorder.customer_mobilenumber = t_order.customer_mobilenumberorder.customer_pincode = t_order.customer_pincodeorder.customer_address = t_order.customer_addressorder.customer_email = t_order.customer_email#new status and status description to be addedorder.status = get_c_status(t_order.status)order.statusDescription = t_order.statusDescriptionorder.total_amount = t_order.total_amountorder.total_weight = t_order.total_weightif t_order.created_timestamp:order.created_timestamp = to_py_date(t_order.created_timestamp)else:order.created_timestamp = datetime.datetime.now()#these fields will not be populated in initial"""order.invoice_number = order.invoice_numberorder.billed_by = order.billed_byorder.accepted_timestamp = order.accepted_timestamporder.billing_timestamp = order.billing_timestamporder.shipping_timestamp = order.shipping_timestamporder.delivery_timestamp = order.delivery_timestamp"""return orderdef create_transaction(t_transaction):t_orders = t_transaction.ordersif not t_orders:raise TransactionServiceException(101, "Orders missing from the transaction")transaction = get_new_transaction()transaction.customer_id = t_transaction.customer_idtransaction.shopping_cart_id = t_transaction.shoppingCartidfor t_order in t_orders:order = create_order(t_order)order.transaction = transactionfor line_item in t_order.lineitems:litem = LineItem()litem.sku_id = line_item.sku_idlitem.brand = line_item.brandif line_item.model_number:litem.model_number = line_item.model_numberif line_item.model_name:litem.model_name = line_item.model_nameif line_item.extra_info:litem.extra_info = line_item.extra_infolitem.quantity = line_item.quantitylitem.unit_price = line_item.unit_pricelitem.unit_weight = line_item.unit_weightlitem.total_price = line_item.total_pricelitem.total_weight = line_item.total_weight"""if line_item.addedOn:litem.added_on = to_py_date(line_item.addedOn)else:litem.added_on = datetime.datetime.now()"""litem.order = order#add payment info#transaction.payments=[]"""if t_transaction.paymentInfo:if not t_transaction.paymentInfo.payments:raise TransactionServiceException(108, "no payments found")for k,v in t_transaction.paymentInfo.payments.iteritems():payment = Payment()payment.merchant_tx_id = v.merchant_tx_idpayment.bank_tx_id = v.bank_tx_idpayment.mode = v.modepayment.amount = v.amountpayment.payment_id = v.idpayment.status = v.statuspayment.status_message = v.descriptionpayment.start_time = to_py_date(v.submissionTimestamp)payment.finish_time = to_py_date(v.completionTimestamp)transaction.payments.append(payment)"""session.commit()return transaction.iddef get_transaction(transaction_id):transaction = Transaction.get_by(id=transaction_id)if not transaction:raise TransactionServiceException(108, "no such transaction")return transactiondef get_transactions_for_customer(customer_id, from_date, to_date, status):if not customer_id:raise TransactionServiceException(101, "bad customer id")query = Transaction.query.filter(Transaction.customer_id == customer_id)if status:query = query.filter(Transaction.status == status)if from_date:query = query.filter(Transaction.createdOn >from_date)if to_date:query = query.filter(Transaction.createdOn < to_date)return query.all()def get_transactions_for_shopping_cart_id(shopping_cart_id):transactions = Transaction.query.filter_by(shopping_cart_id=shopping_cart_id).all()if not transactions:raise TransactionServiceException(108, "transactions for this shopping cart")return transactionsdef get_transaction_status(transaction_id):if not transaction_id:raise TransactionServiceException(101, "bad transaction id")transaction = get_transaction(transaction_id)return transaction.statusdef change_transaction_status(transaction_id, new_status, description):transaction = get_transaction(transaction_id)transaction.status = new_statustransaction.status_message = descriptionsession.commit()return Truedef get_order(order_id):order = Order.get_by(id=order_id)if not order:raise TransactionServiceException(108, "no such order")return orderdef get_orders_for_customer(customer_id, from_date, to_date, status):if not customer_id:raise TransactionServiceException(101, "bad customer id")query = Order.query.filter(Order.customer_id == customer_id)if status:query = query.filter(Order.status == status)if from_date:query = query.filter(Order.created_timestamp >from_date)if to_date:query = query.filter(Order.created_timestamp < to_date)return query.all()def get_all_orders(status, from_date, to_date, warehouse_id):if not warehouse_id:raise TransactionServiceException(101, "bad warehouse id")query = Order.query.filter(Order.warehouse_id == warehouse_id)if status:query = query.filter(Order.status == status)if from_date:query = query.filter(Order.created_timestamp >from_date)if to_date:query = query.filter(Order.created_timestamp < to_date)return query.all()def change_order_status(self, orderId, status, description):order = get_order(orderId)order.status = statusorder.statusDescription = descriptionsession.commit()return Truedef get_orders_for_transaction(transaction_id):orders = Order.query.filter_by(transaction_id=transaction_id).all()if not orders:raise TransactionServiceException(101, "No order for the transaction")return ordersdef get_line_items_for_order(order_id):query = LineItem.query.filter(LineItem.order_id == order_id)return query.all()def add_billing_details(orderId, invoice_number, jacket_number, billed_by):order = Order.get_by(id=orderId)if not order:raise TransactionServiceException(101, "No order found for the givem orderid")order.invoice_number = invoice_numberorder.jacket_number = jacket_numberorder.billed_by = billed_bysession.commit()return Truedef get_alerts(order_id, all):query = Alerts.query.filter_by(order_id=order_id)if not all:query = query.filter_by(valid=True)return query.all()def set_alert(order_id, unset, type, comment):#get existing alertif unset:query = Alerts.query.filter_by(order_id=order_id)query = query.filter_by(type=type)alerts = query.all()for alert in alerts:if alert.valid:alert.valid = Falsealert.comment = commentalert.time_unset = datetime.datetime.now()else:alert = Alerts()alert.order_id = order_idalert.valid = Truealert.type = typealert.comment = commentalert.time_set = datetime.datetime.now()session.commit()"""def get_new_transaction():transaction = Transaction()transaction.createdOn = datetime.datetime.now()transaction.status = status_transaction_inittransaction.status_message = "New transaction"transaction.trails = []session.commit()return transactiondef create_transaction(t_transaction):orderinfo = t_transaction.orderInfoif not orderinfo:raise TransactionServiceException(101, "Orderinfo missing from the transaction")transaction = get_new_transaction()for line_item in orderinfo.lineitems:litem = LineItem()if line_item.item.id:litem.item_id = line_item.item.iditem_info = ItemInfo()item_info.price = line_item.item.priceitem_info.weight = line_item.item.weightlitem.item_info = item_infolitem.added_on = to_py_date(line_item.addedOn)transaction.lineitems.append(litem)if line_item.additionalInfo:for k,v in line_item.additionalInfo.iteritems():additional_info = AdditionalInfo()additional_info.key = kadditional_info.value = vlitem.additional_info.append(additional_info)if t_transaction.warehouse_id:transaction.warehouse_id = t_transaction.warehouse_idif t_transaction.shoppingCartid:transaction.shopping_cart_id = t_transaction.shoppingCartidtransaction.customer_id = t_transaction.customer_idtransaction.expected_delivery_time = to_py_date(t_transaction.expectedDeliveryTime)#no need to set status. It is already set.#transaction.status = t_transaction.transactionStatustransaction.status_message = t_transaction.statusDescriptiontransaction.createdOn = to_py_date(t_transaction.createdOn)#add payment info#transaction.payments=[]if t_transaction.paymentInfo:if not t_transaction.paymentInfo.payments:raise TransactionServiceException(108, "no payments found")for k,v in t_transaction.paymentInfo.payments.iteritems():payment = Payment()payment.merchant_tx_id = v.merchant_tx_idpayment.bank_tx_id = v.bank_tx_idpayment.mode = v.modepayment.amount = v.amountpayment.payment_id = v.idpayment.status = v.statuspayment.status_message = v.descriptionpayment.start_time = to_py_date(v.submissionTimestamp)payment.finish_time = to_py_date(v.completionTimestamp)transaction.payments.append(payment)if not t_transaction.shipmentInfo:raise TransactionServiceException(109, "no shipping info attached with this")transaction.shipments = []for v in t_transaction.shipmentInfo.shipments:shipment = Shipment()shipment.weight = v.weightshipment.insurance_value = v.insuranceshipment.status = get_c_status(v.status);shipment.address = v.addresstransaction.shipments.append(shipment)session.commit()return transaction.iddef get_transaction(transaction_id):transaction = Transaction.get_by(id=transaction_id)if not transaction:raise TransactionServiceException(108, "no such transaction")return transactiondef get_all_transactions(status, from_date, to_date, warehouse_id):query = Transaction.queryif warehouse_id:query = query.filter_by(warehouse_id=warehouse_id)if not status:if not from_date and not to_date:#get all between from_date and to_datereturn query.all()if not from_date:return query.filter(Transaction.createdOn < to_date).all()if not to_date:return query.filter(Transaction.createdOn > to_date).all()return query.filter(and_(Transaction.createdOn < to_date , Transaction.createdOn > from_date)).all()if not from_date and not to_date:return query.filter(Transaction.status == status).all()if not from_date:return query.filter(and_(Transaction.status == status, Transaction.createdOn <to_date)).all()if not from_date:return query.filter(and_(Transaction.status == status, Transaction.createdOn >from_date)).all()if not from_date:return query.filter(and_(Transaction.status == status, and_(Transaction.createdOn <to_date, Transaction.createdOn > from_date))).all()def get_transactions_for_shipment_status(status, from_date, to_date):if not status:raise TransactionServiceException(101, "unknown status")query = Shipment.query.filter(Shipment.status == status)if from_date:query = query.filter(Shipment.shipment_time >from_date)if to_date:query = query.filter(Shipment.shipment_time <to_date)shipments = query.all()transactions = {}for shipment in shipments:if not transactions[shipment.transaction.id]:transactions.append(shipment.transaction)return transactions.values()def get_transactions_for_customer(customer_id, from_date, to_date, status):if not customer_id:raise TransactionServiceException(101, "bas customer id")query = Transaction.query.filter(Transaction.customer_id == customer_id)if status:query = query.filter(Transaction.status == status)if from_date:query = query.filter(Transaction.createdOn >from_date)if to_date:query = query.filter(Transaction.createdOn < to_date)return query.all()def get_transactions_for_customer_shipment(customer_id, from_date, to_date, status):if not customer_id:raise TransactionServiceException(101, "unknown customer id")query = Shipment.query.filter(Shipment.transaction.customerId == customer_id)if status:query = query.filter(Shipment.status == status)if from_date:query = query.filter(Shipment.shipment_time >from_date)if to_date:query = query.filter(Shipment.shipment_time <to_date)shipments = query.all()transactions = {}for shipment in shipments:if not transactions[shipment.transaction.id]:transactions.append(shipment.transaction)return transactions.values()def get_transaction_status(transaction_id):if not transaction_id:raise TransactionServiceException(101, "bad transaction id")transaction = get_transaction(transaction_id)return transaction.statusdef change_transaction_status(transaction_id, new_status, description):transaction = get_transaction(transaction_id)trail = TransactionTrail()trail.old_value = str(transaction.status)trail.new_value = str(new_status)transaction.status = new_statustrail.transaction = transactiontrail.timestamp = datetime.datetime.now()trail.description = descriptiontransaction.status_message = descriptionsession.commit()return Truedef set_shipping_tracker_info(transaction_id, shipping_id, tracking_id, airwayBillNo, provider):shipment = Shipment.get_by(id=shipping_id)if not shipment:raise TransactionServiceException(101, "not such shipment found")transaction = shipment.transactionif transaction.id != transaction_id:raise TransactionServiceException(108, "Looks like this is invalid transaction")shipment.tracking_id = tracking_idshipment.airway_bill_no = airwayBillNoshipment.provider = providertrail = TransactionTrail()trail.timestamp = datetime.datetime.now()trail.description = "shipping_id %d:tracking_id %s:airwayBill %s: provider %s" %(shipping_id, tracking_id, airwayBillNo, provider)trail.transaction = transactionsession.commit()return Truedef change_shipping_status(transaction_id, shipping_id, status, description):shipment = Shipment.get_by(id=shipping_id)if not shipment:raise TransactionServiceException(101, "not such shipment found")transaction = shipment.transactionif transaction.id != transaction_id:raise TransactionServiceException(108, "Looks like this is invalid transaction")trail = TransactionTrail()trail.old_value = str(shipment.status)trail.new_value = str(status)shipment.status = statustrail.transaction = transactiontrail.timestamp = datetime.datetime.now()trail.description = "Shipping status change : %s"%(description)shipment.status_message = descriptionsession.commit()return Truedef set_shipping_date(transaction_id, shipping_id, timestamp):shipment = Shipment.get_by(id=shipping_id)if not shipment:raise TransactionServiceException(101, "not such shipment found")transaction = shipment.transactionif transaction.id != transaction_id:raise TransactionServiceException(108, "Looks like this is invalid transaction")trail = TransactionTrail()trail.old_value = str(shipment.status)trail.new_value = str(status_shipment_shipped)shipment.status = status_shipment_shippedtrail.transaction = transactiontrail.timestamp = datetime.datetime.now()trail.description = "Shipping status change : %s"%(shipment.id)shipment.status_message = "Shipment dispatched"shipment.shipment_time = timestampsession.commit()return Truedef set_delivery_date(transaction_id, shipping_id, timestamp):shipment = Shipment.get_by(id=shipping_id)if not shipment:raise TransactionServiceException(101, "not such shipment found")transaction = shipment.transactionif transaction.id != transaction_id:raise TransactionServiceException(108, "Looks like this is invalid transaction")trail = TransactionTrail()trail.old_value = str(shipment.status)trail.new_value = str(status_shipment_delivered)shipment.status = status_shipment_deliveredtrail.transaction = transactiontrail.timestamp = datetime.datetime.now()trail.description = "Shipping status change : %s"%(shipment.id)shipment.status_message = "Shipment delivered"shipment.delivery_time = timestampsession.commit()return Truedef set_billing(transaction_id, t_billing):transaction = get_transaction(transaction_id)line_item = LineItem.query.filter_by(transaction_id=transaction_id).all()#line_item = LineItem.get_by(id = t_billing.lineItem.id)if not line_item:raise TransactionServiceException(101, "unable to get this line item for id %d" % (t_billing.lineItem.id))billing = Billing()billing.line_item = line_itembilling.bill_number = t_billing.billNumbertry:billing.created_on = to_py_date(t_billing.generatedTimestamp)except:raise TransactionServiceException(108, "bad time stamp found while adding billing for transaction id %d" %(transaction.id))billing.generated_by = t_billing.generatedBysession.commit()return Truedef get_line_items(transaction_id):transaction = get_transaction(transaction_id)if not transaction.lineitems:raise TransactionServiceException(108, "no lineitems with transaction %d"%(transaction_id))return transaction.lineitemsdef get_shipments(transaction_id):transaction = get_transaction(transaction_id)if not transaction.shipments:raise TransactionServiceException(108, "no shipments with transaction %d"%(transaction_id))return transaction.shipmentsdef get_billings(transaction_id):transaction = get_transaction(transaction_id)if not transaction.lineitems:raise TransactionServiceException(108, "no lineitems, hence no billing with transaction %d"%(transaction_id))billings = []for lineitem in transaction.lineitems:billings.append(lineitem.billing)return billingsreturn transaction.shipmentsdef get_transactions_for_shopping_cart_id(shopping_cart_id):transactions = Transaction.query.filter_by(shopping_cart_id=shopping_cart_id).all()if not transactions:raise TransactionServiceException(108, "transactions for this shopping cart")return transactionsdef get_alerts(transaction_id, all):query = Alerts.query.filter_by(transaction_id=transaction_id)if not all:query = query.filter_by(valid=True)return query.all()def set_alert(transaction_id, unset, type, comment):#get existing alertif unset:query = Alerts.query.filter_by(transaction_id=transaction_id)query = query.filter_by(type=type)alerts = query.all()for alert in alerts:if alert.valid:alert.valid = Falsealert.comment = commentalert.time_unset = datetime.datetime.now()else:alert = Alerts()alert.transaction_id = transaction_idalert.valid = Truealert.type = typealert.comment = commentalert.time_set = datetime.datetime.now()session.commit()def get_extra_info(transaction_id):return ExtraItemInfo.get_by(transaction_id=transaction_id)def set_extra_info(transaction_id, sku_id, model, vendor, colour):extra_item_info = ExtraItemInfo()extra_item_info.transaction_id = transaction_idextra_item_info.sku_id = sku_idextra_item_info.model = modelextra_item_info.vendor = vendorextra_item_info.colour = coloursession.commit()"""