Subversion Repositories SmartDukaan

Rev

Rev 35701 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
20644 amit.gupta 1
# -*- coding: utf-8 -*-
2
 
3
'''
4
Created on 29-Mar-2010
5
 
6
@author: Chandranshu
7
'''
8
 
9
from datetime import date, timedelta
10
from decimal import Decimal
11
from elixir import *
12
from math import ceil
13
from random import randrange
14
from reportlab.lib import colors
15
from reportlab.lib.enums import TA_CENTER, TA_JUSTIFY
16
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
17
from reportlab.lib.units import inch, mm
18
from reportlab.pdfgen.canvas import Canvas
19
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, \
20
    BaseDocTemplate, Frame, PageTemplate, Table, TableStyle
21
from shop2020.clients.CRMClient import CRMClient
22
from shop2020.clients.CatalogClient import CatalogClient
23
from shop2020.clients.HelperClient import HelperClient
24
from shop2020.clients.InventoryClient import InventoryClient
25
from shop2020.clients.LogisticsClient import LogisticsClient
26
from shop2020.clients.PaymentClient import PaymentClient
27
from shop2020.clients.PromotionClient import PromotionClient
28
from shop2020.clients.UserClient import UserClient
29
from shop2020.clients.WarehouseClient import WarehouseClient
30
from shop2020.config.client.ConfigClient import ConfigClient
31
from shop2020.model.v1 import order
32
from shop2020.model.v1.order.impl import DataService, RechargeService
33
from shop2020.model.v1.order.impl.Convertors import to_t_emi_scheme, to_t_order, \
34
    cutoff_date, to_t_warehouse_address
35
from shop2020.model.v1.order.impl.DataAccessors import get_order, \
36
    get_transaction, get_orders_by_mobile_number, __clone_order, delhi_pincodes, \
37
    __create_recharge_voucher_tracker, __push_store_collection_to_hotspot, \
38
    get_hotspot_store, get_source_detail
39
from shop2020.model.v1.order.impl.DataService import Transaction, LineItem, \
40
    Order, BatchNoGenerator, InvoiceIDGenerator, TransactionRequiringExtraProcessing, \
41
    OrderInventory, Alert, PaymentSettlement, EBSSettlementSummary, \
42
    CodVerificationAgent, Attribute, RechargeVoucherTracker, EmiScheme, MiscCharges, \
43
    BlockedIpRange, DeniedIpAddress, InsuranceDetailForOrder, DocumentStore, \
44
    RechargeTransaction, HotspotStore, WalletForCompany, WalletHistoryForCompany, \
45
    FRC, OperatorSeries, SourceDetail, Company, EbayOrder, AmazonFbaSalesSnapshot, \
46
    AmazonOrder, StoreOrderDetail, EdcBank, StoreOrderCollection, \
47
    HotspotServiceMatrix, SnapdealOrder, FlipkartOrder, DataInsuranceDetailForOrder, \
48
    AmazonFbaOrderReturns, FlipkartAdvantageOrder, InvoiceCounterGenerator, \
49
    TransactionShipmentSequence, HsOrder, Creditor, UserSanction, CreditHistory, \
50
    LoanHistory, ShipmentLogisticsCostDetail, ReturnOrderInfo, ReturnTransaction, \
51
    ReturnPickupRequest, SellerWarehouse, Seller, Organisation, \
52
    WarehouseAddressMapping, WarehouseAddressMaster
53
from shop2020.model.v1.order.impl.model.BaseOrder import BaseOrder
54
from shop2020.model.v1.order.impl.model.DTHRechargeOrder import DTHRechargeOrder
55
from shop2020.model.v1.order.impl.model.MobileRechargeOrder import \
56
    MobileRechargeOrder
57
from shop2020.model.v1.order.impl.model.RechargeDenomination import \
58
    RechargeDenomination
59
from shop2020.model.v1.order.impl.model.RechargeOrder import RechargeOrder
60
from shop2020.model.v1.order.impl.model.RechargePlan import RechargePlan
61
from shop2020.model.v1.order.impl.model.ReturnOrder import ReturnOrder
62
from shop2020.model.v1.order.impl.model.ServiceAvailability import \
63
    ServiceAvailability
64
from shop2020.model.v1.order.impl.model.ServiceProvider import ServiceProvider
65
from shop2020.model.v1.order.impl.model.TelecomCircle import TelecomCircle
66
from shop2020.model.v1.order.impl.model.UserWallet import UserWallet
67
from shop2020.model.v1.order.impl.model.UserWalletHistory import \
68
    UserWalletHistory
69
from shop2020.model.v1.user.impl.Converters import to_t_address
70
from shop2020.thriftpy.alert.ttypes import MonitoredEntity, EntityType
71
from shop2020.thriftpy.crm.ttypes import *
72
from shop2020.thriftpy.logistics.ttypes import DeliveryType, PickUpType
73
from shop2020.thriftpy.model.v1.catalog.ttypes import ItemType, ItemCondition
74
from shop2020.thriftpy.model.v1.inventory.ttypes import BillingType, \
75
    InventoryServiceException, WarehouseType, InventoryType, VatType, ItemInventory
76
from shop2020.thriftpy.model.v1.order.ttypes import TransactionServiceException, \
77
    TransactionStatus, OrderStatus, DelayReason, ExtraTransactionProcessingType, \
78
    HotspotAction, TimeoutSummary, OrderStatusGroups, OrderType, RechargeOrderStatus, \
79
    RechargeType, RechargeStatistics, DeviceNumberInfo, EmiChargeType, PayMethod, \
80
    OrderSource, StorePaymentStatus, ProductCondition, TaxType, \
81
    AmazonFCWarehouseLocation, RechargeMode, CreditTxnType, \
82
    CreditHistory as TCreditHistory, LoanHistory as TLoanHistory, \
83
    ShipmentLogisticsCostDetail as TShipmentLogisticsCostDetail, \
84
    ReturnTransactionStatus, ReturnAction, ReturnTxnResolutionStatus, \
85
    ReplacementShippingType, ReturnTxnPickupStatus, ReceivedReturnType, \
86
    ReturnPickupType, RefundType, SellerInfo, BuyerInfo
87
from shop2020.thriftpy.model.v1.user.ttypes import VoucherType, CouponCategory, \
88
    User, Sex
89
from shop2020.thriftpy.payments.ttypes import PaymentException
90
from shop2020.thriftpy.utils.ttypes import UserSmsInfo, SmsType
91
from shop2020.thriftpy.warehouse.ttypes import ScanType, \
92
    WarehouseServiceException
93
from shop2020.utils.EmailAttachmentSender import mail, get_attachment_part, \
94
    mail_html
95
from shop2020.utils.Utils import to_py_date, to_java_date, \
96
    getSyncOperatorsForRecharge
97
from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
98
from sqlalchemy.sql import func
99
from sqlalchemy.sql.expression import and_, or_, desc, not_, distinct, cast, \
100
    between
101
from string import Template
102
from suds.client import Client
103
from textwrap import dedent
104
from xml.dom.minidom import parseString
105
import MySQLdb
106
import base64
107
import datetime
108
import httplib
109
import logging
110
import math
111
import os
112
import re
113
import sys
114
import time
115
import traceback
116
import urllib
117
 
118
 
119
 
120
#Start:- Added By Manish Sharma for Creating a new Ticket: Category- RTO Refund on 21-Jun-2013
121
#End:- Added By Manish Sharma for Creating a new Ticket: Category- RTO Refund on 21-Jun-2013
122
#Start:- Added By Manish Sharma for Creating a new Ticket: Category- RTO Refund on 21-Jun-2013
123
#End:- Added By Manish Sharma for Creating a new Ticket: Category- RTO Refund on 21-Jun-2013
35701 amit 124
logging.basicConfig(level=logging.WARNING)
20644 amit.gupta 125
 
126
sourceId = int(ConfigClient().get_property("sourceid"))
127
capitalFloatPayMethod = 456789 
128
SaholicHelpEmailId = "Saholic <help@saholic.com>"
129
mail_user = 'cnc.center@shop2020.in'
130
mail_password = '5h0p2o2o'
131
help_user = 'help@shop2020.in'
132
help_password = '5h0p2o2o'
133
source_url = 'www.saholic.com'
134
source_name = 'Saholic'
135
hotspot_store_url ='http://125.19.98.100/loaddetect/service.asmx?WSDL'
136
aclient = None
137
 
138
PREPAID_SHIPPING_CUTOFF_TIME = 15
139
COD_SHIPPING_CUTOFF_TIME = 12
140
 
141
billedOrdersColorMap = {}
142
 
143
ORDER_STATUS_TO_USER_TRUST_LEVEL_DELTA_DICT = {
144
        OrderStatus.RTO_RESHIPPED    :  3,
145
        OrderStatus.RTO_IN_TRANSIT   : -5,
146
        OrderStatus.DELIVERY_SUCCESS :  1,
147
        OrderStatus.DOA_CERT_INVALID : -5
148
}
149
 
150
creditTxnMultiplierMap = {
151
    CreditTxnType.BLOCKED : 1,
152
    CreditTxnType.BLOCKED_REVERSED : -1, 
153
    CreditTxnType.LOAN : -1,
154
    CreditTxnType.CORRECTION : 1                  
155
}
156
 
157
loanTxnMultplierMap = {
158
    CreditTxnType.LOAN : 1, 
159
    CreditTxnType.LOAN_CANCELLED : -1, 
160
    CreditTxnType.PAID : -1,
161
    CreditTxnType.CORRECTION : -1
162
}
163
 
164
refund_status_transition = { OrderStatus.LOST_IN_TRANSIT : OrderStatus.LOST_IN_TRANSIT_REFUNDED,
165
                     OrderStatus.RTO_RECEIVED_PRESTINE : OrderStatus.RTO_REFUNDED,
166
                     OrderStatus.RTO_RECEIVED_DAMAGED : OrderStatus.RTO_DAMAGED_REFUNDED,
167
                     OrderStatus.RTO_LOST_IN_TRANSIT : OrderStatus.RTO_LOST_IN_TRANSIT_REFUNDED,
168
                     OrderStatus.DOA_CERT_INVALID : OrderStatus.DOA_INVALID_REFUNDED,
169
                     OrderStatus.DOA_CERT_VALID : OrderStatus.DOA_VALID_REFUNDED,
170
                     OrderStatus.DOA_RECEIVED_DAMAGED : OrderStatus.DOA_REFUNDED_RCVD_DAMAGED,
171
                     OrderStatus.DOA_LOST_IN_TRANSIT : OrderStatus.DOA_REFUNDED_LOST_IN_TRANSIT,
172
                     OrderStatus.RET_PRODUCT_UNUSABLE : OrderStatus.RET_PRODUCT_UNUSABLE_REFUNDED,
173
                     OrderStatus.RET_PRODUCT_USABLE : OrderStatus.RET_PRODUCT_USABLE_REFUNDED,
174
                     OrderStatus.RET_RECEIVED_DAMAGED : OrderStatus.RET_REFUNDED_RCVD_DAMAGED,
175
                     OrderStatus.RET_LOST_IN_TRANSIT : OrderStatus.RET_REFUNDED_LOST_IN_TRANSIT,
176
                     OrderStatus.COD_VERIFICATION_PENDING : OrderStatus.COD_VERIFICATION_FAILED,
177
                     OrderStatus.SUBMITTED_FOR_PROCESSING : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
178
                     OrderStatus.INVENTORY_LOW : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
179
                     OrderStatus.LOW_INV_PO_RAISED : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
180
                     OrderStatus.LOW_INV_REVERSAL_IN_PROCESS : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
181
                     OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
182
                     OrderStatus.ACCEPTED : OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY,
183
                     OrderStatus.BILLED : OrderStatus.CANCELLED_ON_CUSTOMER_REQUEST,
184
                     OrderStatus.CANCEL_REQUEST_CONFIRMED : OrderStatus.CANCELLED_ON_CUSTOMER_REQUEST
185
                     }
186
 
187
creditorTicketSizeMap = {}
188
creditorDueDateMap = {}
189
 
190
stateIdMap = {}
191
 
192
def create_ebay_order(ebay_order):
193
    ebayOrder = EbayOrder()
194
    ebayOrder.orderId =  ebay_order.orderId
195
    ebayOrder.paisaPayId =  ebay_order.paisaPayId
196
    ebayOrder.salesRecordNumber = ebay_order.salesRecordNumber
197
    ebayOrder.ebayListingId =  ebay_order.ebayListingId
198
    ebayOrder.subsidyAmount =  ebay_order.subsidyAmount
199
    ebayOrder.ebayTxnDate =  to_py_date(ebay_order.ebayTxnDate)
200
    ebayOrder.transactionId = ebay_order.transactionId
201
    ebayOrder.listingName = ebay_order.listingName
202
    ebayOrder.listingPrice = ebay_order.listingPrice
203
    session.commit()
204
 
205
def get_ebay_order_by_sales_rec_number(sales_rec_number):
206
    return EbayOrder.query.filter(EbayOrder.salesRecordNumber == sales_rec_number).one()
207
 
208
def get_ebay_order(sales_rec_number, listingId, paisa_pay_id):
209
    query = EbayOrder.query
210
    if sales_rec_number:
211
        query = query.filter(EbayOrder.salesRecordNumber == sales_rec_number)
212
    if listingId:
213
        query = query.filter(EbayOrder.ebayListingId == listingId)
214
    if paisa_pay_id:
215
        query = query.filter(EbayOrder.paisaPayId == paisa_pay_id)
216
    return query.all()
217
    #return EbayOrder.query.filter(EbayOrder.salesRecordNumber == sales_rec_number).filter(EbayOrder.ebayListingId == listingId).one()
218
 
219
def get_ebay_order_by_orderId(order_id):
220
    return EbayOrder.query.filter(EbayOrder.orderId == order_id).one()
221
 
222
def update_ebay_order(ebay_order):
223
    ebayOrder = get_ebay_order_by_orderId(ebay_order.orderId)
224
    ebayOrder.subsidyAmount = ebay_order.subsidyAmount
225
    ebayOrder.transactionId = ebay_order.transactionId
226
    ebayOrder.ebayTxnDate = to_py_date(ebay_order.ebayTxnDate)
227
    ebayOrder.bluedartPaisaPayRef = ebay_order.bluedartPaisaPayRef
228
    ebayOrder.listingPrice = ebay_order.listingPrice
229
    session.commit()
230
 
231
def ebay_order_exists(sales_rec_number, ebay_listing_id):
232
    try:
233
        ebayOrder = get_ebay_order_by_sales_rec_number(sales_rec_number)
234
        if ebayOrder.ebayListingId == ebay_listing_id:
235
            return True
236
        else:
237
            return False
238
    except Exception as e:
239
        return False
240
def update_order_for_ebay(t_order):
241
    order = get_order(t_order.id)
242
    order.customer_id = t_order.customer_id
243
    order.customer_name = t_order.customer_name
244
    order.customer_city = t_order.customer_city
245
    order.customer_state = t_order.customer_state
246
    order.customer_mobilenumber = t_order.customer_mobilenumber
247
    order.customer_pincode = t_order.customer_pincode
248
    order.customer_address1 = t_order.customer_address1
249
    order.customer_address2 = t_order.customer_address2
250
    order.customer_email = t_order.customer_email
251
    order.logistics_provider_id = t_order.logistics_provider_id
252
    order.airwaybill_no = t_order.airwaybill_no
253
    order.tracking_id = t_order.tracking_id
254
    order.status = t_order.status  
255
    order.statusDescription = t_order.statusDescription
256
    order.cod = 0
257
    order.otg = False
258
    order.freebieItemId = 0
259
    order.orderType = OrderType.B2C
260
    order.source = 6
261
 
262
    transaction = get_transaction(order.transaction_id)
263
    transaction.status = TransactionStatus.AUTHORIZED
264
    transaction.customer_id = t_order.customer_id
265
    session.commit()
266
def split_ebay_order(order_id, split_order_qty, split_order_item_id, use_power_ship):
267
    #In case of split now order is always assigned based on the website logic...Also itemId won't work for now
268
    order = get_order(order_id)
269
    if split_order_qty >=order.lineitems[0].quantity:
270
        raise TransactionServiceException(108, "Split Quantity is greater than or equal to order quantity")
271
    if order.status not in [OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.CAPTURE_IN_PROCESS, OrderStatus.REJECTED, OrderStatus.ACCEPTED]:
272
        raise TransactionServiceException(108, "Order not allowed to be split")
273
    new_order = __clone_order(order, False, False)
274
    new_order.expected_delivery_time = order.expected_delivery_time
275
    new_order.promised_delivery_time = order.promised_delivery_time
276
    new_order.expected_shipping_time = order.expected_shipping_time
277
    new_order.promised_shipping_time = order.promised_shipping_time
278
    if use_power_ship:
279
        new_order.logistics_provider_id = order.logistics_provider_id
280
        new_order.airwaybill_no = order.airwaybill_no
281
        new_order.tracking_id = order.tracking_id
282
 
283
    new_order.lineitems[0].quantity = split_order_qty
284
    new_order.lineitems[0].total_price = new_order.lineitems[0].unit_price*split_order_qty
285
    new_order.total_amount = new_order.lineitems[0].total_price
286
 
287
    order.lineitems[0].quantity = order.lineitems[0].quantity - split_order_qty
288
    order.lineitems[0].total_price = order.lineitems[0].unit_price * order.lineitems[0].quantity
289
    order.total_amount = order.lineitems[0].total_price
290
 
291
    session.commit()
292
    return new_order
293
 
294
def add_or_update_amazon_fba_sales_snapshot(amazonfbasalessnapshot):
295
    salesnapshotfordate = AmazonFbaSalesSnapshot.get_by(item_id = amazonfbasalessnapshot.item_id,dateOfSale=to_py_date(amazonfbasalessnapshot.dateOfSale).date(),fcLocation=amazonfbasalessnapshot.fcLocation)
296
    if salesnapshotfordate is None:
297
        amazon_fba_sales_snapshot = AmazonFbaSalesSnapshot()
298
        amazon_fba_sales_snapshot.dateOfSale = to_py_date(amazonfbasalessnapshot.dateOfSale).date()
299
        amazon_fba_sales_snapshot.item_id = amazonfbasalessnapshot.item_id
300
        amazon_fba_sales_snapshot.totalOrderCount = amazonfbasalessnapshot.totalOrderCount
301
        amazon_fba_sales_snapshot.amazonFbaInventory = amazonfbasalessnapshot.amazonFbaInventory
302
        amazon_fba_sales_snapshot.isOutOfStock = amazonfbasalessnapshot.isOutOfStock
303
        amazon_fba_sales_snapshot.promotionOrderCount = amazonfbasalessnapshot.promotionOrderCount
304
        amazon_fba_sales_snapshot.totalSale = amazonfbasalessnapshot.totalSale
305
        amazon_fba_sales_snapshot.promotionSale = amazonfbasalessnapshot.promotionSale
306
        #if amazonfbasalessnapshot.ourPrice is not None:
307
        amazon_fba_sales_snapshot.ourPriceSnapshotDate = to_py_date(amazonfbasalessnapshot.ourPriceSnapshotDate)
308
        amazon_fba_sales_snapshot.ourPrice = amazonfbasalessnapshot.ourPrice
309
        #if amazonfbasalessnapshot.salePrice is not None:
310
        amazon_fba_sales_snapshot.salePriceSnapshotDate = to_py_date(amazonfbasalessnapshot.salePriceSnapshotDate)
311
        amazon_fba_sales_snapshot.salePrice = amazonfbasalessnapshot.salePrice
312
        #if amazonfbasalessnapshot.minFbaPrice is not None:
313
        amazon_fba_sales_snapshot.minFbaPriceSnapshotDate = to_py_date(amazonfbasalessnapshot.minFbaPriceSnapshotDate)
314
        amazon_fba_sales_snapshot.minFbaPrice = amazonfbasalessnapshot.minFbaPrice
315
        #if amazonfbasalessnapshot.minMfnPrice is not None:
316
        amazon_fba_sales_snapshot.minMfnPriceSnapshotDate = to_py_date(amazonfbasalessnapshot.minMfnPriceSnapshotDate)
317
        amazon_fba_sales_snapshot.minMfnPrice = amazonfbasalessnapshot.minMfnPrice
318
        amazon_fba_sales_snapshot.fcLocation = amazonfbasalessnapshot.fcLocation 
319
 
320
    else:
321
        if(amazonfbasalessnapshot.totalOrderCount > 0):
322
            salesnapshotfordate.isOutOfStock = 0
323
        salesnapshotfordate.promotionOrderCount = amazonfbasalessnapshot.promotionOrderCount
324
        salesnapshotfordate.totalSale = amazonfbasalessnapshot.totalSale
325
        salesnapshotfordate.promotionSale = amazonfbasalessnapshot.promotionSale
326
        salesnapshotfordate.totalOrderCount = amazonfbasalessnapshot.totalOrderCount
327
        salesnapshotfordate.fcLocation = amazonfbasalessnapshot.fcLocation
328
    session.commit()    
329
 
330
def get_amazon_fba_sales_snapshot_for_days(interval):
331
    query = session.query(Order.status, func.count(Order.id)).group_by(Order.status)
332
    date = datetime.datetime.now()
333
    toDate = date-timedelta(days = 1)
334
    fromDate = toDate-timedelta(days = interval)
335
    fbasalessnapshot = AmazonFbaSalesSnapshot.query.filter(AmazonFbaSalesSnapshot.dateOfSale.between (fromDate.date(),toDate.date())).order_by(AmazonFbaSalesSnapshot.dateOfSale).all()
336
    return fbasalessnapshot        
337
 
338
def create_snapdeal_order(t_snapdeal_order):
339
    snapdealOrder = SnapdealOrder()
340
    snapdealOrder.orderId = t_snapdeal_order.orderId
341
    snapdealOrder.subOrderId = t_snapdeal_order.subOrderId
342
    snapdealOrder.referenceCode = t_snapdeal_order.referenceCode
343
    snapdealOrder.productName = t_snapdeal_order.productName
344
    snapdealOrder.listingPrice = t_snapdeal_order.listingPrice
345
    snapdealOrder.snapdealTxnDate = to_py_date(t_snapdeal_order.snapdealTxnDate)
346
    snapdealOrder.maxNlc = t_snapdeal_order.maxNlc
347
    order = Order.get_by(id=t_snapdeal_order.orderId)
348
    order.status = OrderStatus.ACCEPTED
349
    user = None
350
    try:
351
        user_client = UserClient().get_client()
352
        user_to_add = User()
353
        user_to_add.email = 'SD.'+ str(t_snapdeal_order.orderId) + '@mailinator.com'
354
        user_to_add.password = 'hSp5gvCsrrhZcceE6mzzOQ'
355
        user_to_add.communicationEmail = user_to_add.email
356
        user_to_add.sourceStartTime = int(round(time.time() * 1000))
357
        user_to_add.sourceId = OrderSource.SNAPDEAL
358
        user_to_add.sex = Sex.WONT_SAY
359
        user_to_add = user_client.createUser(user_to_add)
360
        user = user_to_add
361
    except:
362
        pass
363
 
364
    if user:
365
        order.customer_id = user.userId
366
        order.customer_email = user.email
367
    session.commit()
368
 
369
def get_snapdeal_order(order_id, reference_code, subOrder_id):
370
    query = SnapdealOrder.query
371
    if order_id:
372
        query = query.filter(SnapdealOrder.orderId == order_id)
373
    elif reference_code==subOrder_id:
374
        if reference_code is None:
375
            reference_code=''
376
        query = query.filter(or_(SnapdealOrder.referenceCode == reference_code, SnapdealOrder.subOrderId== subOrder_id))
377
    else:
378
        query = query.filter(and_(SnapdealOrder.referenceCode == reference_code, SnapdealOrder.subOrderId== subOrder_id))
379
        return query.one()
380
    return query.all()
381
 
382
def snapdeal_order_exists(suborder_id, reference_code):
383
    exists = SnapdealOrder.query.filter_by(subOrderId=suborder_id,referenceCode=reference_code).first()
384
    if exists is not None:
385
        return True
386
    else:
387
        return False
388
 
389
def get_amazon_fba_sales_latest_snapshot_for_item(item_id):
390
    return AmazonFbaSalesSnapshot.query.filter(AmazonFbaSalesSnapshot.item_id==item_id).filter(AmazonFbaSalesSnapshot.dateOfSale!=datetime.datetime.now().date()).order_by(desc(AmazonFbaSalesSnapshot.dateOfSale)).first()
391
 
392
def update_latest_fba_prices_for_item(fbaitemprices):
393
    fbasalessnapshot = AmazonFbaSalesSnapshot.query.filter(AmazonFbaSalesSnapshot.item_id==fbaitemprices.item_id).order_by(desc(AmazonFbaSalesSnapshot.dateOfSale)).first()
394
    if(fbasalessnapshot.ourPriceSnapshotDate < to_java_date(fbaitemprices.ourPriceSnapshotDate) and fbaitemprices.ourPrice is not None):
395
        fbasalessnapshot.ourPriceSnapshotDate = to_py_date(fbaitemprices.ourPriceSnapshotDate)
396
        fbasalessnapshot.ourPrice = fbaitemprices.ourPrice
397
    if(fbasalessnapshot.salePriceSnapshotDate < to_java_date(fbaitemprices.salePriceSnapshotDate) and fbaitemprices.salePrice is not None):
398
            fbasalessnapshot.salePriceSnapshotDate = to_py_date(fbaitemprices.salePriceSnapshotDate)
399
            fbasalessnapshot.salePrice = fbaitemprices.salePrice
400
    if(fbasalessnapshot.minFbaPriceSnapshotDate < to_java_date(fbaitemprices.minFbaPriceSnapshotDate) and fbaitemprices.minFbaPrice is not None):
401
            fbasalessnapshot.minFbaPriceSnapshotDate = to_py_date(fbaitemprices.minFbaPriceSnapshotDate)
402
            fbasalessnapshot.minFbaPrice = fbaitemprices.minFbaPrice
403
    if(fbasalessnapshot.minMfnPriceSnapshotDate < to_java_date(fbaitemprices.minMfnPriceSnapshotDate) and fbaitemprices.minMfnPrice is not None):
404
        fbasalessnapshot.minMfnPriceSnapshotDate = to_py_date(fbaitemprices.minMfnPriceSnapshotDate)
405
        fbasalessnapshot.minMfnPrice = fbaitemprices.minMfnPrice
406
    session.commit()
407
 
408
def flipkart_order_exists(orderid,suborderid):
409
    exists = FlipkartOrder.query.filter_by(flipkartOrderId=orderid,flipkartSubOrderId=suborderid).first()
410
    if exists is not None:
411
        return True
412
    else:
413
        return False
414
 
415
def create_flipkart_order(flipkartorder):
416
    order = FlipkartOrder()
417
    order.orderId = flipkartorder.orderId
418
    order.flipkartSubOrderId = flipkartorder.flipkartSubOrderId
419
    order.flipkartOrderId = flipkartorder.flipkartOrderId
420
    order.flipkartTxnDate = to_py_date(flipkartorder.flipkartTxnDate)
421
    order.shippingPrice = flipkartorder.shippingPrice 
422
    order.octroiFee = flipkartorder.octroiFee
423
    order.emiFee = flipkartorder.emiFee
424
    order.maxNlc = flipkartorder.maxNlc
425
    s_order = Order.get_by(id=flipkartorder.orderId)
426
    if s_order.cod:
427
        s_order.status = OrderStatus.COD_VERIFICATION_PENDING
428
    else:
429
        s_order.status = OrderStatus.ACCEPTED
430
        s_order.accepted_timetsmap = datetime.datetime.now()
431
    user = None
432
    try:
433
        user_client = UserClient().get_client()
434
        user_to_add = User()
435
        user_to_add.email = 'FK.'+ str(flipkartorder.orderId) + '@mailinator.com'
436
        user_to_add.password = 'gR9zF-Ish2im6tbYFNivgA'
437
        user_to_add.communicationEmail = user_to_add.email
438
        user_to_add.sourceStartTime = int(round(time.time() * 1000))
439
        user_to_add.sourceId = OrderSource.FLIPKART
440
        user_to_add.sex = Sex.WONT_SAY
441
        user_to_add = user_client.createUser(user_to_add)
442
        user = user_to_add
443
    except:
444
        pass
445
 
446
    if user:
447
        s_order.customer_id = user.userId
448
        s_order.customer_email = user.email
449
 
450
    session.commit()
451
 
452
def get_flipkart_order(orderid):
453
    flipkartorder = FlipkartOrder.query.filter_by(orderId=orderid).first()
454
    if not flipkartorder:
455
        print "No found order for orderid " + str(orderid)
456
        raise TransactionServiceException(108, "no such order")
457
    return flipkartorder    
458
 
459
def get_flipkart_order_by_subOrderId(flipkartOrderItemId):
460
    flipkartorder = FlipkartOrder.query.filter_by(flipkartSubOrderId=flipkartOrderItemId).first()
461
    if not flipkartorder:
462
        raise TransactionServiceException(108, "no such flipkart order " + str(flipkartOrderItemId))
463
    return flipkartorder
464
 
465
def update_flipkart_order_dates_and_awb(orderid,suborderid,date,awb):
466
    flipkartorder = FlipkartOrder.query.filter_by(flipkartOrderId=orderid,flipkartSubOrderId=suborderid).first()
467
    print flipkartorder 
468
    order = get_order(flipkartorder.orderId)
469
    if not order:
470
        print "No found order for orderid " + str(orderid)
471
        raise TransactionServiceException(108, "no such order")
472
    order.tracking_id = awb
473
    order.expected_delivery_time = to_py_date(date + 4*24*60*60*1000)
474
    order.promised_delivery_time = to_py_date(date + 4*24*60*60*1000)
475
    order.expected_shipping_time = to_py_date(date)
476
    order.promised_shipping_time = to_py_date(date)
477
    session.commit()
478
 
479
def update_snapdeal_orders_status(orders):
480
    for statusString, orderList in orders.iteritems():
481
        if statusString == "Cancelled":
482
            try:
483
                for cancel_order in orderList:
484
                    ref_code = cancel_order[0]
485
                    sub_order_code = cancel_order[1]
486
                    snapdeal_order = None 
487
                    try:
488
                        snapdeal_order = get_snapdeal_order(None, ref_code, sub_order_code)
489
                    except Exception as e:
490
                        print 'Caught in Updation of Cancelled Orders Getting Snapdeal Order'
491
                        pass
492
                    if snapdeal_order:
493
                        order = get_order(snapdeal_order.orderId)
494
                        if order.status == OrderStatus.SHIPPED_FROM_WH:
495
                            order.status = OrderStatus.SHIPPED_TO_LOGST
496
                            session.commit()
497
            except Exception as e:
498
                print 'Caught in Updation of Cancelled Orders'
499
                print e
500
                print sys.exc_info()
501
 
502
 
503
        if statusString == "Delivered":
504
            try:
505
                for del_order in orderList:
506
                    ref_code = del_order[0]
507
                    sub_order_code = del_order[1]
508
                    dlvry_timestamp = del_order[2]
509
                    snapdeal_order = None                    
510
                    try:
511
                        snapdeal_order = get_snapdeal_order(None, ref_code, sub_order_code)
512
                    except Exception as e:
513
                        print 'Caught in Updation of Delivered Orders Getting Snapdeal Order'
514
                        pass
515
                    if snapdeal_order:
516
                        order = get_order(snapdeal_order.orderId)
517
                        if order.status == OrderStatus.SHIPPED_FROM_WH:
518
                            order.delivery_timestamp = datetime.datetime.strptime(dlvry_timestamp, "%Y-%m-%d %H:%M:%S")
519
                            order.receiver = order.customer_name
520
                            order.status = OrderStatus.DELIVERY_SUCCESS
521
                            order.statusDescription = "Order delivered"
522
                            session.commit()
523
            except Exception as e:
524
                print 'Caught in Updation of Delivered Orders'
525
                print e
526
                print sys.exc_info()
527
    '''
528
    try:
529
        for del_order in delivered_orders:
530
            ref_code = del_order[0]
531
            sub_order_code = del_order[1]
532
            dlvry_timestamp = del_order[2]
533
 
534
            if snapdeal_order_exists(sub_order_code, ref_code):
535
                snapdeal_order = get_snapdeal_order(None, None, sub_order_code)
536
                if snapdeal_order:
537
                    order = get_order(snapdeal_order.orderId)
538
                    if order.status == OrderStatus.SHIPPED_FROM_WH:
539
                        order.delivery_timestamp = datetime.datetime.strptime(dlvry_timestamp, "%Y-%m-%d %H:%M:%S")
540
                        order.receiver = order.customer_name
541
                        order.status = OrderStatus.DELIVERY_SUCCESS
542
                        order.statusDescription = "Order delivered"
543
                        session.commit()
544
    except Exception as e:
545
        print e
546
        print sys.exc_info()
547
    '''
548
 
549
def update_flipkart_orders_status(delivered_orders):
550
    try:
551
        for del_order in delivered_orders:
552
            flipkart_order_id = del_order[0]
553
            sub_order_code = del_order[1]
554
            dlvry_timestamp = del_order[2]  
555
 
556
            if flipkart_order_exists(flipkart_order_id,sub_order_code):
557
                flipkart_order = get_flipkart_order_by_subOrderId(sub_order_code)
558
                if flipkart_order:
559
                    order = get_order(flipkart_order.orderId)
560
                    if order.status == OrderStatus.SHIPPED_FROM_WH:
561
                        order.delivery_timestamp = datetime.datetime.strptime(dlvry_timestamp, "%Y-%m-%d %H:%M:%S")
562
                        order.receiver = order.customer_name
563
                        order.status = OrderStatus.DELIVERY_SUCCESS
564
                        order.statusDescription = "Order delivered"
565
                        session.commit()
566
    except Exception as e:
567
        print e
568
        print sys.exc_info()
569
 
570
    '''    
571
    order_ids = delivered_orders.keys()
572
    for orderId in order_ids:
573
        order = Order.query.filter(Order.id == orderId).first()
574
        order.status = OrderStatus.DELIVERY_SUCCESS
575
        order.statusDescription = "Order delivered"
576
        order.delivery_timestamp = datetime.datetime.strptime(delivered_orders.get(orderId), "%Y-%m-%d %H:%M:%S")
577
        session.commit()
578
    '''
579
 
580
def bulk_add_or_update_amazon_fba_sales_snapshot(amazonfbasalessnapshotlist):
581
    for amazonfbasalessnapshot in amazonfbasalessnapshotlist:
582
        salesnapshotfordate = AmazonFbaSalesSnapshot.get_by(item_id = amazonfbasalessnapshot.item_id,dateOfSale=to_py_date(amazonfbasalessnapshot.dateOfSale).date(),fcLocation=amazonfbasalessnapshot.fcLocation)
583
        if salesnapshotfordate is None:
584
            amazon_fba_sales_snapshot = AmazonFbaSalesSnapshot()
585
            amazon_fba_sales_snapshot.dateOfSale = to_py_date(amazonfbasalessnapshot.dateOfSale).date()
586
            amazon_fba_sales_snapshot.item_id = amazonfbasalessnapshot.item_id
587
            amazon_fba_sales_snapshot.totalOrderCount = amazonfbasalessnapshot.totalOrderCount
588
            amazon_fba_sales_snapshot.amazonFbaInventory = amazonfbasalessnapshot.amazonFbaInventory
589
            amazon_fba_sales_snapshot.isOutOfStock = amazonfbasalessnapshot.isOutOfStock
590
            amazon_fba_sales_snapshot.promotionOrderCount = amazonfbasalessnapshot.promotionOrderCount
591
            amazon_fba_sales_snapshot.totalSale = amazonfbasalessnapshot.totalSale
592
            amazon_fba_sales_snapshot.promotionSale = amazonfbasalessnapshot.promotionSale
593
            #if amazonfbasalessnapshot.ourPrice is not None:
594
            amazon_fba_sales_snapshot.ourPriceSnapshotDate = to_py_date(amazonfbasalessnapshot.ourPriceSnapshotDate)
595
            amazon_fba_sales_snapshot.ourPrice = amazonfbasalessnapshot.ourPrice
596
            #if amazonfbasalessnapshot.salePrice is not None:
597
            amazon_fba_sales_snapshot.salePriceSnapshotDate = to_py_date(amazonfbasalessnapshot.salePriceSnapshotDate)
598
            amazon_fba_sales_snapshot.salePrice = amazonfbasalessnapshot.salePrice
599
            #if amazonfbasalessnapshot.minFbaPrice is not None:
600
            amazon_fba_sales_snapshot.minFbaPriceSnapshotDate = to_py_date(amazonfbasalessnapshot.minFbaPriceSnapshotDate)
601
            amazon_fba_sales_snapshot.minFbaPrice = amazonfbasalessnapshot.minFbaPrice
602
            #if amazonfbasalessnapshot.minMfnPrice is not None:
603
            amazon_fba_sales_snapshot.minMfnPriceSnapshotDate = to_py_date(amazonfbasalessnapshot.minMfnPriceSnapshotDate)
604
            amazon_fba_sales_snapshot.minMfnPrice = amazonfbasalessnapshot.minMfnPrice
605
            amazon_fba_sales_snapshot.fcLocation = amazonfbasalessnapshot.fcLocation
606
        else:
607
            if(amazonfbasalessnapshot.totalOrderCount > 0):
608
                salesnapshotfordate.isOutOfStock = 0
609
            salesnapshotfordate.promotionOrderCount = amazonfbasalessnapshot.promotionOrderCount
610
            salesnapshotfordate.totalSale = amazonfbasalessnapshot.totalSale
611
            salesnapshotfordate.promotionSale = amazonfbasalessnapshot.promotionSale
612
            salesnapshotfordate.totalOrderCount = amazonfbasalessnapshot.totalOrderCount
613
            salesnapshotfordate.fcLocation = amazonfbasalessnapshot.fcLocation
614
    session.commit()
615
 
616
def get_created_orders_for_flipkart(flipkartorderids):
617
    item_ordercount = dict()
618
    orders = []
619
    flipkart_orders = session.query(FlipkartOrder).filter(FlipkartOrder.flipkartOrderId.in_(tuple(flipkartorderids))).all()
620
    print flipkart_orders 
621
    if len(flipkart_orders)!=0:
622
        for order in flipkart_orders:
623
            print order.orderId 
624
            orders.append(order.orderId)
625
        items =session.query(LineItem.item_id,func.count(LineItem.quantity)).join((Order,LineItem.order_id==Order.id)).filter(Order.id.in_(tuple(orders))).filter(Order.status >=3).filter(Order.shipping_timestamp==None).group_by(LineItem.item_id).all()    
626
    else:
627
        return item_ordercount
628
    print "items map after query"     
629
    print items
630
    for item in items:
631
        print "item id"
632
        print item[0]
633
        print "order count"
634
        print item[1]
635
        item_ordercount[item[0]] = item[1]
636
    print item_ordercount    
637
    return item_ordercount    
638
 
639
def change_easyship_mfn_order_txn_status(transaction_id, new_status, description, pickUp, orderType, source, shipTimestamp, deliveryTimeStamp):
640
    transaction = get_transaction(transaction_id)
641
    transaction.status = new_status
642
    transaction.status_message = description
643
    ## Assign runner in case of delhi pincodes
644
    if transaction.orders[0].pickupStoreId:
645
        logistics_client = LogisticsClient().get_client() 
646
        store = logistics_client.getPickupStore(transaction.orders[0].pickupStoreId)
647
        if delhi_pincodes.__contains__(store.pin):
648
            pickUp = PickUpType.RUNNER  
649
 
650
    if new_status == TransactionStatus.FAILED:
651
        for order in transaction.orders:
652
            order.status = OrderStatus.PAYMENT_FAILED
653
            order.statusDescription = "Payment Failed"
654
    elif new_status == TransactionStatus.AUTHORIZED or new_status == TransactionStatus.FLAGGED:
655
        for order in transaction.orders:
656
            if new_status == TransactionStatus.AUTHORIZED:
657
                order.status = OrderStatus.SUBMITTED_FOR_PROCESSING
658
                order.statusDescription = "Submitted to warehouse"
659
            elif new_status == TransactionStatus.FLAGGED:
660
                order.status = OrderStatus.PAYMENT_FLAGGED
661
                order.statusDescription = "Payment flagged by gateway"
662
            order.cod = False
663
            order.orderType = orderType
664
            #After we got payment success, we will set logistics info also 
665
            logistics_client = LogisticsClient().get_client()
666
            #FIXME line item is only one now. If multiple will come, need to fix.
667
            item_id = order.lineitems[0].item_id
668
            logistics_info = logistics_client.getLogisticsInfo(order.customer_pincode, item_id, DeliveryType.PREPAID, pickUp)
669
 
670
            #current_time = datetime.datetime.now()
671
 
672
            #logistics_info.deliveryTime = adjust_delivery_time(to_py_date(deliveryTimeStamp), 0)
673
            #logistics_info.shippingTime = adjust_delivery_time(to_py_date(shipTimestamp), 0)
674
            #logistics_info.deliveryDelay = 0
675
 
676
 
677
            order.otg = logistics_info.otgAvailable
678
            order.warehouse_id = logistics_info.warehouseId
679
            order.fulfilmentWarehouseId = logistics_info.fulfilmentWarehouseId
680
            order.logistics_provider_id = 45
681
            #Start:- Added by Manish Sharma for FedEx Integration - Shipment Creation on 31-Jul-2013
682
            #order.airwaybill_no = logistics_info.airway_billno
683
            #order.tracking_id = order.airwaybill_no
684
            #End:- Added by Manish Sharma for FedEx Integration- Shipment Creation on 31-Jul-2013
685
 
686
            order.courier_delivery_time = to_py_date(deliveryTimeStamp).replace(hour=PREPAID_SHIPPING_CUTOFF_TIME, minute=0, second=0)
687
            order.expected_shipping_time = to_py_date(shipTimestamp).replace(hour=PREPAID_SHIPPING_CUTOFF_TIME, minute=0, second=0)
688
            order.promised_shipping_time = order.expected_shipping_time
689
            order.expected_delivery_time = to_py_date(deliveryTimeStamp).replace(hour=PREPAID_SHIPPING_CUTOFF_TIME, minute=0, second=0)
690
            order.promised_delivery_time = order.expected_delivery_time 
691
 
692
            if order.pickupStoreId:
693
                order.otg = False
694
 
695
            inventory_client = InventoryClient().get_client()
696
            if order.productCondition != ProductCondition.BAD:
697
                inventory_client.reserveItemInWarehouse(item_id, logistics_info.fulfilmentWarehouseId, sourceId, order.id, to_java_date(order.created_timestamp), to_java_date(order.promised_shipping_time), order.lineitems[0].quantity)
698
 
699
            try:
700
                item_pricing = inventory_client.getItemPricing(item_id, -1)
701
                order.lineitems[0].transfer_price = item_pricing.transferPrice
702
                order.lineitems[0].nlc = item_pricing.nlc
703
            except:
704
                print "Not able to get transfer price. Skipping"
705
 
706
            catalog_client = CatalogClient().get_client() 
707
            voucherAmount = catalog_client.getVoucherAmount(item_id, VoucherType.SPICEDECK_MOBILE)
708
            if voucherAmount:
709
                __create_recharge_voucher_tracker(order, voucherAmount, VoucherType.SPICEDECK_MOBILE)
710
            #Note 2 Buy back Offer
711
            if item_id in (7974, 7558) and transaction.coupon_code is not None and transaction.coupon_code.lower() == "note2buyback":    
712
                order.status = OrderStatus.COD_VERIFICATION_PENDING
713
                order.statusDescription = "Note 2 Buy Back Offer - Approval Pending from CRM Team"
714
                order.otg = False
715
 
716
    elif new_status == TransactionStatus.COD_IN_PROCESS:
717
        for order in transaction.orders:
718
            order.status = OrderStatus.COD_VERIFICATION_PENDING
719
            order.statusDescription = "Verification Pending"
720
            order.cod = True
721
            order.orderType = orderType
722
            #After we got payment success, we will set logistics info also 
723
            logistics_client = LogisticsClient().get_client()
724
            #FIXME line item is only one now. If multiple will come, need to fix.
725
            item_id = order.lineitems[0].item_id
726
            if order.pickupStoreId:
727
                # Need to send prepaid awb number for store pick up orders
728
                logistics_info = logistics_client.getLogisticsEstimation(item_id, order.customer_pincode, DeliveryType.COD)
729
                #//Start:- Added by Manish Sharma for FedEx Integration- Shipment Creation on 31-Jul-2013
730
                #prepaid_logistics_info = logistics_client.getLogisticsInfo(order.customer_pincode, item_id, DeliveryType.PREPAID, pickUp)
731
                #logistics_info.airway_billno = prepaid_logistics_info.airway_billno
732
                #logistics_info.providerId = prepaid_logistics_info.providerId
733
                #End:- Added by Manish Sharma for FedEx Integration- Shipment Creation on 31-Jul-2013
734
                # Will not provide OTG in pickup store
735
                order.otg = False
736
            else:
737
                logistics_info = logistics_client.getLogisticsInfo(order.customer_pincode, item_id, DeliveryType.COD, pickUp)
738
                order.otg = logistics_info.otgAvailable
739
 
740
 
741
            #current_time = datetime.datetime.now()
742
            #logistics_info.deliveryTime = adjust_delivery_time(current_time, logistics_info.deliveryTime)
743
            #logistics_info.shippingTime = adjust_delivery_time(current_time, logistics_info.shippingTime)
744
            #logistics_info.deliveryDelay = adjust_delivery_time(current_time, (logistics_info.shippingTime+logistics_info.deliveryDelay))
745
 
746
 
747
            order.warehouse_id = logistics_info.warehouseId
748
            order.fulfilmentWarehouseId = logistics_info.fulfilmentWarehouseId
749
            order.logistics_provider_id = 45
750
            #Start:- Added by Manish Sharma for FedEx Integration- Shipment Creation on 31-Jul-2013
751
            #order.airwaybill_no = logistics_info.airway_billno
752
            #order.tracking_id = order.airwaybill_no
753
            #End:- Added by Manish Sharma for FedEx Integration- Shipment Creation on 31-Jul-2013
754
            order.courier_delivery_time = to_py_date(deliveryTimeStamp).replace(hour=PREPAID_SHIPPING_CUTOFF_TIME, minute=0, second=0)
755
            order.expected_shipping_time = to_py_date(shipTimestamp).replace(hour=PREPAID_SHIPPING_CUTOFF_TIME, minute=0, second=0)
756
            order.promised_shipping_time = order.expected_shipping_time
757
            order.expected_delivery_time = to_py_date(deliveryTimeStamp).replace(hour=PREPAID_SHIPPING_CUTOFF_TIME, minute=0, second=0)
758
            order.promised_delivery_time = order.expected_delivery_time
759
 
760
            inventory_client = InventoryClient().get_client()
761
            if order.productCondition != ProductCondition.BAD:
762
                inventory_client.reserveItemInWarehouse(item_id, logistics_info.fulfilmentWarehouseId, sourceId, order.id, to_java_date(order.created_timestamp), to_java_date(order.promised_shipping_time), order.lineitems[0].quantity)
763
 
764
            try:
765
                item_pricing = inventory_client.getItemPricing(item_id, -1)
766
                order.lineitems[0].transfer_price = item_pricing.transferPrice
767
                order.lineitems[0].nlc = item_pricing.nlc        
768
            except:
769
                print "Not able to get transfer price. Skipping"
770
 
771
            catalog_client = CatalogClient().get_client()
772
            voucherAmount = catalog_client.getVoucherAmount(item_id, VoucherType.SPICEDECK_MOBILE)
773
            if voucherAmount:
774
                __create_recharge_voucher_tracker(order, voucherAmount, VoucherType.SPICEDECK_MOBILE)
775
 
776
 
777
    session.commit()
778
 
779
    if new_status in (TransactionStatus.AUTHORIZED, TransactionStatus.FLAGGED, TransactionStatus.COD_IN_PROCESS):
780
        try:
781
            if order.source == OrderSource.WEBSITE:    
782
                if new_status == TransactionStatus.COD_IN_PROCESS:
783
                    transaction_requiring_extra_processing = TransactionRequiringExtraProcessing()
784
                    transaction_requiring_extra_processing.category = 'COD_VERIFICATION'
785
                    transaction_requiring_extra_processing.transaction_id = transaction_id
786
                    session.commit()
787
                elif new_status == TransactionStatus.FLAGGED:
788
                    transaction_requiring_extra_processing = TransactionRequiringExtraProcessing()
789
                    transaction_requiring_extra_processing.category = 'PAYMENT_FLAGGED'
790
                    transaction_requiring_extra_processing.transaction_id = transaction_id
791
                    session.commit()
792
            elif order.source == OrderSource.STORE:
793
                order.otg = False
794
                session.commit()
795
                catalog_client = CatalogClient().get_client() 
796
                sourcePricing = catalog_client.getStorePricing(order.lineitems[0].item_id)
797
                if order.total_amount >= sourcePricing.minPrice:
798
                    order.status = OrderStatus.SUBMITTED_FOR_PROCESSING
799
                    order.statusDescription = "Order Accepted"
800
                    session.commit()
801
                    sod = StoreOrderDetail.get_by(orderId = order.id)
802
                    __push_store_collection_to_hotspot(order, "advance", sod.cashAmount, sod.cardAmount)
803
 
804
                else: 
805
                    order.status = OrderStatus.COD_VERIFICATION_PENDING
806
                    order.statusDescription = "Approval Pending"
807
                    content = "<html><body>"
808
                    content += "<h4>Order Id:  " + str(order.id) + "</h4>"
809
                    content += "<h4>Product:  " + str(order.lineitems[0]) + "</h4>"
810
                    content += "<h4>Min Price: " +  str(sourcePricing.minPrice) + "</h4>"
811
                    content += "<h4>Recommended Price: " +  str(sourcePricing.recommendedPrice) + "</h4>"
812
                    content += "<h2>Approval Requested for Price: " +  str(order.total_amount) + "</h2>"
813
                    content += "<h2>Note 1: If this discount price is approved then reply 'Approved' otherwise 'Not Approved' without changing anythig in the Mail.</h2>"  
814
                    content += "<h2>Note 2: For Quick approval using browser <a href='http://support.shop2020.in:8080/Support/price-approval?xszbg=" + base64.b64encode(str(order.id))  + "'>Click Here</a></h2>"
815
                    content += "<br><br></body></html>"
816
                    store = get_hotspot_store(order.storeId, "")
817
                    helper_client = HelperClient().get_client()
818
                    helper_client.saveUserEmailForSending(store.approvalEmail.split(';'), SaholicHelpEmailId, "Price approval requested for " + str(order.lineitems[0]) + " order Id " + str(order.id) + " in store " + store.hotspotId , content, str(transaction_id), "PriceApproval", [], [], order.source)
819
                    session.commit()
820
            else:
821
                order.otg = False
822
                session.commit()
823
        except Exception as e:
824
            print "Error inserting transaction Id: " + str(transaction_id) + " due to " + str(e)
825
 
826
    return True
827
 
828
def update_amazon_fba_order_returns(fbaOrderReturns):
829
    for order_return in fbaOrderReturns:
830
        orderReturn = AmazonFbaOrderReturns.query.filter(AmazonFbaOrderReturns.amazonOrderId==order_return.amazonOrderId).filter(AmazonFbaOrderReturns.insertionTimestamp == to_py_date(order_return.insertionTimestamp)).filter(AmazonFbaOrderReturns.sku==order_return.sku).first()
831
        if orderReturn:
832
            orderReturn.sellableReturnQuantity = order_return.sellableReturnQuantity
833
            orderReturn.nonSellableReturnQuantity = order_return.nonSellableReturnQuantity
834
            session.commit()
835
        else:
836
            orderReturn = AmazonFbaOrderReturns()
837
            orderReturn.amazonOrderId = order_return.amazonOrderId
838
            orderReturn.insertionTimestamp = to_py_date(order_return.insertionTimestamp)
839
            orderReturn.sku = order_return.sku
840
            orderReturn.creationTimestamp = to_py_date(order_return.creationTimestamp)
841
            orderReturn.shippedQuantity = order_return.shippedQuantity
842
            orderReturn.sellableReturnQuantity = order_return.sellableReturnQuantity
843
            orderReturn.nonSellableReturnQuantity = order_return.nonSellableReturnQuantity
844
            session.commit()
845
 
846
def get_all_amazon_fba_order_returns(insertionTimestamp):
847
    returns = AmazonFbaOrderReturns.query.filter(AmazonFbaOrderReturns.insertionTimestamp==to_py_date(insertionTimestamp)).all()
848
    if not returns:
849
        returns = []
850
    return returns  
851
 
852
def get_total_sale_returns_fba_skus_curent_time(insertionTimestamp):  
853
    allFbaSkuDetails = session.query(AmazonFbaOrderReturns.sku, func.sum(AmazonFbaOrderReturns.shippedQuantity), func.sum(AmazonFbaOrderReturns.sellableReturnQuantity), func.sum(AmazonFbaOrderReturns.nonSellableReturnQuantity)).group_by(AmazonFbaOrderReturns.sku).filter(AmazonFbaOrderReturns.insertionTimestamp == to_py_date(insertionTimestamp)).all()
854
 
855
    returnAllFbaSkuDetails = {}
856
 
857
    for fbaSkuDetail in allFbaSkuDetails:
858
        saleReturnDetail = {}
859
        saleReturnDetail['Sale'] = fbaSkuDetail[1]
860
        saleReturnDetail['SaleableReturn'] = fbaSkuDetail[2]
861
        saleReturnDetail['NonSaleableReturn'] = fbaSkuDetail[3]
862
        returnAllFbaSkuDetails[fbaSkuDetail[0]]= saleReturnDetail
863
 
864
    return returnAllFbaSkuDetails
865
 
866
def get_amazon_fba_sales_latest_snapshot_for_item_location_wise(item_id,location):
867
    return AmazonFbaSalesSnapshot.query.filter(AmazonFbaSalesSnapshot.item_id==item_id).filter(AmazonFbaSalesSnapshot.fcLocation==location).filter(AmazonFbaSalesSnapshot.dateOfSale!=datetime.datetime.now().date()).order_by(desc(AmazonFbaSalesSnapshot.dateOfSale)).first()
868
 
869
def get_verification_pending_orders_fk():
870
    retOrders = Order.query.filter(Order.source==OrderSource.FLIPKART).filter(Order.status==OrderStatus.COD_VERIFICATION_PENDING).all()
871
    retFkOrders = []
872
    order_ids = []
873
    if not retOrders:
874
        return retFkOrders
875
    else:
876
        for order in retOrders:
877
            order_ids.append(order.id)
878
        retFkOrders = FlipkartOrder.query.filter(FlipkartOrder.orderId.in_(tuple(order_ids)))
879
        if not retFkOrders:
880
            retFkOrders = []
881
    return retFkOrders
882
 
883
def get_fa_order_by_fk_order_id(fk_OrderId,fk_OrderItemId):
884
    faOrder = FlipkartAdvantageOrder.query.filter_by(fkOrderId=fk_OrderId,fkOrderItemId=fk_OrderItemId).first()
885
    if not faOrder:
886
        print "Not found order for orderId " + str(fk_OrderId)
887
        raise TransactionServiceException(108, "no such order")
888
 
889
    return faOrder
890
 
891
def flipkart_fa_order_exists(fk_OrderId,fk_OrderItemId):
892
    faOrder = FlipkartAdvantageOrder.query.filter_by(fkOrderId=fk_OrderId,fkOrderItemId=fk_OrderItemId).first()
893
    if not faOrder:
894
        return False
895
    else:
896
        return True
897
 
898
def get_all_fa_orders_list(status):
899
    faOrders = None
900
    if status == 'all':
901
        faOrders = FlipkartAdvantageOrder.query.all()
902
    else:
903
        faOrders = FlipkartAdvantageOrder.query.filter(FlipkartAdvantageOrder.status==status).all()
904
    if not faOrders:
905
        faOrders = []   
906
    return faOrders
907
 
908
def add_update_fa_orders_bulk(faOrdersList):
909
    for faOrder in faOrdersList:
910
        if faOrder.status == 'approved':
911
            fa_Order = FlipkartAdvantageOrder()
912
            fa_Order.fkOrderId = faOrder.fkOrderId
913
            fa_Order.fkOrderItemId = faOrder.fkOrderItemId
914
            fa_Order.sku = faOrder.sku
915
            fa_Order.creationTimestamp = to_py_date(faOrder.creationTimestamp)
916
            fa_Order.customerName = faOrder.customerName
917
            fa_Order.customerAddress = faOrder.customerAddress
918
            fa_Order.pincode = faOrder.pincode
919
            fa_Order.customerCity = faOrder.customerCity
920
            fa_Order.customerState = faOrder.customerState
921
            fa_Order.customerPhone = faOrder.customerPhone
922
            fa_Order.status = faOrder.status
923
            fa_Order.quantity = faOrder.quantity
924
            fa_Order.totalPrice = faOrder.totalPrice
925
            fa_Order.listPrice = faOrder.listPrice
926
            fa_Order.modifiedDate = to_py_date(faOrder.modifiedDate)
927
            fa_Order.listingId = faOrder.listingId
928
            fa_Order.cancelReason = faOrder.cancelReason
929
            fa_Order.returnReason = faOrder.returnReason
930
            fa_Order.freebieItemId = faOrder.freebieItemId
931
            fa_Order.productTitle = faOrder.productTitle
932
        else:
933
            fa_Order = FlipkartAdvantageOrder.query.filter_by(fkOrderId=faOrder.fkOrderId,fkOrderItemId=faOrder.fkOrderItemId).first()
934
            if fa_Order:
935
                if fa_Order.status !=faOrder.status:
936
                    fa_Order.status = faOrder.status
937
                    fa_Order.cancelReason = faOrder.cancelReason
938
                    fa_Order.returnReason = faOrder.returnReason
939
                    fa_Order.modifiedDate = to_py_date(faOrder.modifiedDate)
940
            else:
941
                fa_Order = FlipkartAdvantageOrder()
942
                fa_Order.fkOrderId = faOrder.fkOrderId
943
                fa_Order.fkOrderItemId = faOrder.fkOrderItemId
944
                fa_Order.sku = faOrder.sku
945
                fa_Order.creationTimestamp = to_py_date(faOrder.creationTimestamp)
946
                fa_Order.customerName = faOrder.customerName
947
                fa_Order.customerAddress = faOrder.customerAddress
948
                fa_Order.pincode = faOrder.pincode
949
                fa_Order.customerCity = faOrder.customerCity
950
                fa_Order.customerState = faOrder.customerState
951
                fa_Order.customerPhone = faOrder.customerPhone
952
                fa_Order.status = faOrder.status
953
                fa_Order.quantity = faOrder.quantity
954
                fa_Order.totalPrice = faOrder.totalPrice
955
                fa_Order.listPrice = faOrder.listPrice
956
                fa_Order.modifiedDate = to_py_date(faOrder.modifiedDate)
957
                fa_Order.listingId = faOrder.listingId
958
                fa_Order.cancelReason = faOrder.cancelReason
959
                fa_Order.returnReason = faOrder.returnReason
960
                fa_Order.freebieItemId = faOrder.freebieItemId
961
                fa_Order.productTitle = faOrder.productTitle
962
    session.commit()
963
 
964
def create_homeshop_order(hsOrder):
965
    hs_Order = HsOrder()
966
    hs_Order.orderId = hsOrder.orderId
967
    hs_Order.catalogueName = hsOrder.catalogueName
968
    hs_Order.courierName = hsOrder.courierName
969
    hs_Order.hsItemId = hsOrder.hsItemId
970
    hs_Order.hsOrderDate = to_py_date(hsOrder.hsOrderDate)
971
    hs_Order.hsOrderNo = hsOrder.hsOrderNo
972
    hs_Order.hsProductId = hsOrder.hsProductId
973
    hs_Order.hsSubOrderNo = hsOrder.hsSubOrderNo
974
    hs_Order.paymentMode = hsOrder.paymentMode
975
    hs_Order.sellerSku = hsOrder.sellerSku
976
    hs_Order.slaDays = hsOrder.slaDays
977
    hs_Order.shippingName = hsOrder.shippingName
978
    order = Order.get_by(id=hsOrder.orderId)
979
    order.status = OrderStatus.ACCEPTED
980
    order.accepted_timestamp = datetime.datetime.now()
981
    user = None
982
    try:
983
        user_client = UserClient().get_client()
984
        user_to_add = User()
985
        user_to_add.email = 'HS.'+ str(hsOrder.orderId) + '@mailinator.com'
986
        user_to_add.password = 'ouBPONyDYWfeAFtXeaYRkQ'
987
        user_to_add.communicationEmail = user_to_add.email
988
        user_to_add.sourceStartTime = int(round(time.time() * 1000))
989
        user_to_add.sourceId = OrderSource.HOMESHOP18
990
        user_to_add.sex = Sex.WONT_SAY
991
        user_to_add = user_client.createUser(user_to_add)
992
        user = user_to_add
993
    except:
994
        pass
995
 
996
    if user:
997
        order.customer_id = user.userId
998
        order.customer_email = user.email
999
    session.commit()
1000
 
1001
def get_homeshop_order(order_id, hsOrderNo, hsSubOrderNo):
1002
    query = HsOrder.query
1003
    if order_id:
1004
        query = query.filter(HsOrder.orderId == order_id)
1005
    if hsOrderNo:
1006
        query = query.filter(HsOrder.hsOrderNo == hsOrderNo)
1007
    if hsSubOrderNo:
1008
        query = query.filter(HsOrder.hsSubOrderNo == hsSubOrderNo)
1009
    return query.all()
1010
 
1011
def homeshop_order_exists(hs_OrderNo, hs_SubOrderNo):
1012
    exists = HsOrder.query.filter_by(hsOrderNo=hs_OrderNo,hsSubOrderNo=hs_SubOrderNo).first()
1013
    if exists is not None:
1014
        return True
1015
    else:
1016
        return False
1017
 
1018
def update_timestamp_for_amazon_order(orderDeliveryMap):
1019
    for orderId,dateMap in orderDeliveryMap.iteritems():
1020
        order = get_order(orderId)
1021
        order.expected_delivery_time = datetime.datetime.strptime(dateMap.values()[0]+' 15:00:00', '%d-%m-%Y %H:%M:%S') 
1022
        order.promised_delivery_time = datetime.datetime.strptime(dateMap.values()[0]+' 15:00:00', '%d-%m-%Y %H:%M:%S')
1023
        promisedShipping = datetime.datetime.strptime(dateMap.keys()[0]+' 15:00:00', '%d-%m-%Y %H:%M:%S')
1024
        order.expected_shipping_time = promisedShipping
1025
        order.promised_shipping_time = promisedShipping
1026
        session.commit()
1027
    return True
1028
 
1029
def update_source_detail_timestamp(id,lastUpdatedOn):
1030
    detail = get_source_detail(id)
1031
    detail.lastUpdatedOn = to_py_date(lastUpdatedOn)
1032
    session.commit()
1033
    return True