Subversion Repositories SmartDukaan

Rev

Rev 12665 | Rev 12668 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
94 ashish 1
'''
2
Created on 23-Mar-2010
3
 
4
@author: ashish
5
'''
6
from elixir import *
5393 mandeep.dh 7
from functools import partial
5944 mandeep.dh 8
from shop2020.clients.CatalogClient import CatalogClient
4748 mandeep.dh 9
from shop2020.clients.HelperClient import HelperClient
5944 mandeep.dh 10
from shop2020.clients.InventoryClient import InventoryClient
4748 mandeep.dh 11
from shop2020.config.client.ConfigClient import ConfigClient
94 ashish 12
from shop2020.model.v1.catalog.impl import DataService
4748 mandeep.dh 13
from shop2020.model.v1.catalog.impl.CategoryManager import CategoryManager
8274 amit.gupta 14
from shop2020.model.v1.catalog.impl.Convertors import to_t_item, to_t_source, \
12620 amit.gupta 15
    to_t_brand_info, to_t_private_deal, to_t_exclusive_affiliate_item_info
5944 mandeep.dh 16
from shop2020.model.v1.catalog.impl.DataService import Item, ItemChangeLog, \
17
    Category, EntityIDGenerator, SimilarItems, ProductNotification, Source, \
6531 vikram.rag 18
    SourceItemPricing, AuthorizationLog, VoucherItemMapping, CategoryVatMaster, \
7340 amit.gupta 19
    OOSTracker, EntityTag, ItemInsurerMapping, Insurer, Banner, BannerMap, \
7977 kshitij.so 20
    FreebieItem, BrandInfo, Amazonlisted, StorePricing, ItemVatMaster, \
9242 kshitij.so 21
    PageViewEvents, CartEvents, EbayItem, BannerUriMapping, Campaign, SnapdealItem, \
10097 kshitij.so 22
    ProductFeedSubmit, MarketplaceItems, MarketPlaceItemPrice, \
12620 amit.gupta 23
    SourcePercentageMaster, SourceItemPercentage, FlipkartItem, \
24
    MarketPlaceUpdateHistory, SourceCategoryPercentage, MarketPlaceHistory, \
25
    PrivateDeals, AmazonOutOfSync, PrivateDealsPriceComparison, \
26
    SourceReturnPercentage, CompetitorPricing, CompetitorPricingRequest, \
27
    AmazonPromotion, ExclusiveAffiliateItemInfo, OutboundAffiliateMaster
5944 mandeep.dh 28
from shop2020.thriftpy.model.v1.catalog.ttypes import status, ItemShippingInfo, \
7340 amit.gupta 29
    ItemType, PremiumType, FreebieItem as t_FreebieItem, \
12663 kshitij.so 30
    StorePricing as tStorePricing, CatalogServiceException, \
31
    BannerType, InsurerType, Banner as t_banner, CompetitorPricing as TCompetitorPricing, \
32
    AmazonPromotionType
12567 amit.gupta 33
from shop2020.thriftpy.model.v1.inventory.ttypes import VatType, \
12663 kshitij.so 34
    InventoryServiceException, IgnoredInventoryUpdateItems,SnapdealInventoryItem
10097 kshitij.so 35
from shop2020.thriftpy.model.v1.order.ttypes import OrderSource
4873 mandeep.dh 36
from shop2020.utils import EmailAttachmentSender
4748 mandeep.dh 37
from shop2020.utils.EmailAttachmentSender import mail
5318 rajveer 38
from shop2020.utils.Utils import to_py_date, log_risky_flag
621 chandransh 39
from sqlalchemy import desc, asc
12663 kshitij.so 40
from sqlalchemy.sql.expression import or_, distinct, func, and_ 
11630 amit.gupta 41
from sqlalchemy.sql.functions import now
3086 rajveer 42
from string import Template
4748 mandeep.dh 43
import datetime
8274 amit.gupta 44
import math
4748 mandeep.dh 45
import sys
5393 mandeep.dh 46
import threading
3924 rajveer 47
import urllib2
94 ashish 48
 
5978 rajveer 49
sourceId = int(ConfigClient().get_property("sourceid"))
10687 rajveer 50
to_addresses = ["khushal.bhatia@shop2020.in", "chandan.kumar@shop2020.in",  "chaitnaya.vats@shop2020.in",'manoj.kumar@shop2020.in']
7777 kshitij.so 51
to_store_addresses = ["rajveer.singh@shop2020.in"]
6029 rajveer 52
mail_user = "cnc.center@shop2020.in"
53
mail_password = "5h0p2o2o"
54
source_name = "Saholic"
55
source_url = "www.saholic.com"
5885 mandeep.dh 56
skippedItems = { 175 : [27, 2160, 2175, 2163, 2158, 7128, 26, 2154],
57
                 193 : [5839] }
12567 amit.gupta 58
stateIdMap = {}
59
def fetchStateMaster():
60
    global stateIdMap
61
    if stateIdMap:
62
        return stateIdMap
63
    else:
64
        try:
65
            glob_inventory_client = InventoryClient().get_client()
66
            stateIdMap = glob_inventory_client.getStateMaster()
67
            return stateIdMap
68
        except:
69
            print "Could not fetch"
70
 
5295 rajveer 71
def initialize(dbname='catalog', db_hostname="localhost"):
72
    DataService.initialize(dbname, db_hostname)
7770 kshitij.so 73
 
3849 chandransh 74
def get_all_items_by_status(status, offset=0, limit=None):
75
    query = Item.query
4539 rajveer 76
    if status is not None:
3849 chandransh 77
        query = query.filter_by(status=status)
78
    query = query.order_by(Item.product_group, Item.brand, Item.model_number, Item.model_name).offset(offset)
79
    if limit:
80
        query = query.limit(limit)
81
    items = query.all()
82
    return items
83
 
6821 amar.kumar 84
def get_all_alive_items():
85
    query = Item.query
10403 rajveer 86
    query = query.filter(or_(Item.status==status.ACTIVE, Item.status==status.PAUSED, Item.status==status.PAUSED_BY_RISK, Item.status==status.PARTIALLY_ACTIVE))
6821 amar.kumar 87
    items = query.all()
88
    return items
89
 
90
 
3849 chandransh 91
def get_all_items(is_active, offset=0, limit=None):
103 ashish 92
    if is_active:
3849 chandransh 93
        items = get_all_items_by_status(status.ACTIVE, offset, limit)
103 ashish 94
    else:
3849 chandransh 95
        items = get_all_items_by_status(None, offset, limit)
766 rajveer 96
    return items
97
 
3849 chandransh 98
def get_item_count_by_status(use_status, status):
99
    if use_status:
100
        return Item.query.filter_by(status=status).count()
103 ashish 101
    else:
3849 chandransh 102
        return Item.query.count()
103 ashish 103
 
635 rajveer 104
def get_item(item_id):
766 rajveer 105
    item = Item.get_by(id=item_id)
106
    return item
94 ashish 107
 
635 rajveer 108
def get_items_by_catalog_id(catalog_id):
447 rajveer 109
    query = Item.query.filter_by(catalog_item_id=catalog_id)
437 rajveer 110
    try:
635 rajveer 111
        items = query.all()
4934 amit.gupta 112
        return items
1399 rajveer 113
    except Exception as ex:
114
        print ex
437 rajveer 115
        raise InventoryServiceException(109, "Item not found")
5586 phani.kuma 116
 
117
def is_valid_catalog_id(catalog_id):
118
    item = Item.query.filter_by(catalog_item_id=catalog_id).first()
119
    if item is not None:
120
        return True
121
    else:
122
        return False
123
 
576 chandransh 124
def is_active(item_id):
2983 chandransh 125
    t_item_shipping_info = ItemShippingInfo()
576 chandransh 126
    try:
635 rajveer 127
        item = get_item(item_id)
3281 chandransh 128
        t_item_shipping_info.isRisky = item.risky
5944 mandeep.dh 129
        client = InventoryClient().get_client()
5978 rajveer 130
        itemInfo = client.getItemAvailabilityAtLocation(item.id, sourceId)
5944 mandeep.dh 131
        warehouse_id = itemInfo[0]
5393 mandeep.dh 132
        if item.risky and item.status == status.ACTIVE:
5944 mandeep.dh 133
            availability = client.getItemAvailibilityAtWarehouse(warehouse_id, item_id)
134
            if availability <= 0:
5393 mandeep.dh 135
                add_status_change_log(item, status.PAUSED_BY_RISK)
136
                item.status = status.PAUSED_BY_RISK
137
                item.status_description = "This item is currently out of stock"
138
                session.commit()
139
                __send_mail_for_oos_item(item)
140
                #This will clear cache from tomcat
10223 amit.gupta 141
                #__clear_homepage_cache()
5393 mandeep.dh 142
        else:
5944 mandeep.dh 143
            availability = itemInfo[4]
2983 chandransh 144
        t_item_shipping_info.isActive = (item.status == status.ACTIVE)
3281 chandransh 145
        t_item_shipping_info.quantity = availability
576 chandransh 146
    except InventoryServiceException:
2983 chandransh 147
        print "[ERROR] Unexpected error:", sys.exc_info()[0]
148
    return t_item_shipping_info
149
 
7438 amit.gupta 150
def get_items_status(item_ids):
151
    itemsStatus = dict()
152
    for item_id in item_ids:
153
        try:
154
            item = get_item(item_id)
7520 amit.gupta 155
            if item is None:
156
                continue
7438 amit.gupta 157
            client = InventoryClient().get_client()
158
            itemInfo = client.getItemAvailabilityAtLocation(item.id, sourceId)
159
            warehouse_id = itemInfo[0]
160
            if item.risky and item.status == status.ACTIVE:
161
                availability = client.getItemAvailibilityAtWarehouse(warehouse_id, item_id)
162
                if availability <= 0:
163
                    item.status = status.PAUSED_BY_RISK
164
            itemsStatus[item_id] = (item.status == status.ACTIVE)
165
        except InventoryServiceException:
166
            print "[ERROR] Unexpected error:", sys.exc_info()[0]
167
    return itemsStatus
168
 
2035 rajveer 169
def get_item_status_description(itemId):
170
    item = get_item(itemId)
171
    return item.status_description
94 ashish 172
 
122 ashish 173
def update_item(item):
174
    if not item:
175
        raise InventoryServiceException(108, "Bad item in request")
7770 kshitij.so 176
 
122 ashish 177
    if not item.id:
609 chandransh 178
        raise InventoryServiceException(101, "Missing id for update")
7770 kshitij.so 179
 
2120 ankur.sing 180
    validate_item_prices(item)
7770 kshitij.so 181
 
635 rajveer 182
    ds_item = get_item(item.id)
5047 amit.gupta 183
    message = ""
7384 rajveer 184
    store_message = ""
122 ashish 185
    if not ds_item:
609 chandransh 186
        raise InventoryServiceException(101, "Item missing in our database")
7770 kshitij.so 187
 
963 chandransh 188
    if item.productGroup:
7770 kshitij.so 189
        ds_item.product_group = item.productGroup
963 chandransh 190
    if item.brand:
191
        ds_item.brand = item.brand
511 rajveer 192
    if item.modelNumber:
193
        ds_item.model_number = item.modelNumber
2497 ankur.sing 194
    ds_item.color = item.color
195
    ds_item.model_name = item.modelName
196
    ds_item.category = item.category
9253 rajveer 197
    if item.category == 10006:
9299 kshitij.so 198
        itemInsurerMapping = ItemInsurerMapping.query.filter(ItemInsurerMapping.itemId == item.id).filter(ItemInsurerMapping.insurerType == InsurerType._NAMES_TO_VALUES.get("DEVICE")).first()
199
        if itemInsurerMapping is None:
200
            itemInsurerMapping = ItemInsurerMapping()
201
            itemInsurerMapping.itemId = item.id
202
            itemInsurerMapping.insurerId = 1
203
            itemInsurerMapping.insurerType = 1
7770 kshitij.so 204
 
2497 ankur.sing 205
    ds_item.comments = item.comments
7770 kshitij.so 206
 
2497 ankur.sing 207
    ds_item.catalog_item_id = item.catalogItemId
483 rajveer 208
 
7384 rajveer 209
    if ds_item.activeOnStore and ds_item.mrp and item.mrp and ds_item.mrp != item.mrp:
210
        sp = get_store_pricing(item.id)
211
        if sp.maxPrice > item.mrp:
212
            sp.maxPrice = item.mrp
213
            store_message += "MRP is changed from {0} to {1}.\n".format(sp.maxPrice, item.mrp)
7770 kshitij.so 214
 
7384 rajveer 215
 
216
    if ds_item.activeOnStore and ds_item.sellingPrice and item.sellingPrice and ds_item.sellingPrice != item.sellingPrice:
217
        sp = get_store_pricing(item.id)
218
        if sp.minPrice < item.sellingPrice:
219
            store_message += "Saholic MOP Changed. DP {0} is less than Saholic MOP.\n".format(sp.minPrice)
7770 kshitij.so 220
 
2129 ankur.sing 221
    ds_item.mrp = item.mrp
5047 amit.gupta 222
    if ds_item.sellingPrice or item.sellingPrice:
223
        if ds_item.sellingPrice != item.sellingPrice:
12407 kshitij.so 224
            amazonItem = (get_amazon_item_details(item.id))[0]
7761 kshitij.so 225
            if amazonItem is not None:
11816 kshitij.so 226
                outOfSync = AmazonOutOfSync.get_by(item_id=item.id)
227
                if outOfSync is None:
228
                    amazonItem.fbaPrice = item.sellingPrice
229
                    amazonItem.sellingPrice=item.sellingPrice
230
                    amazonItem.fbbPrice=item.sellingPrice 
231
                    amazonItem.mfnPriceLastUpdatedOn = datetime.datetime.now()
232
                    amazonItem.fbaPriceLastUpdatedOn = datetime.datetime.now()
233
                    amazonItem.fbbPriceLastUpdatedOn = datetime.datetime.now()
234
                    message +="Amazon Prices Synced."
235
                else:
236
                    if not outOfSync.mfn:
237
                        amazonItem.sellingPrice=item.sellingPrice
238
                        amazonItem.mfnPriceLastUpdatedOn = datetime.datetime.now()
239
                        message +="MFN Price Synced."
240
                    if not outOfSync.fba:
241
                        amazonItem.fbaPrice=item.sellingPrice
242
                        amazonItem.fbaPriceLastUpdatedOn = datetime.datetime.now()
243
                        message +="FBA Price Synced."
244
                    if not outOfSync.fbb:
245
                        amazonItem.fbbPrice=item.sellingPrice
246
                        amazonItem.fbbPriceLastUpdatedOn = datetime.datetime.now()
247
                        message +="FBB Price Synced."
248
 
5047 amit.gupta 249
            message += "Selling Price is changed from {0} to {1}.\n".format(ds_item.sellingPrice, item.sellingPrice)
7770 kshitij.so 250
 
2129 ankur.sing 251
    ds_item.sellingPrice = item.sellingPrice
2174 ankur.sing 252
    ds_item.weight = item.weight
6241 amit.gupta 253
    ds_item.showSellingPrice = item.showSellingPrice
7770 kshitij.so 254
 
7291 vikram.rag 255
    if item.asin:
256
        ds_item.asin = item.asin
257
    ds_item.holdInventory = item.holdInventory
258
    ds_item.defaultInventory = item.defaultInventory
9841 rajveer 259
    ds_item.holdOverride = item.holdOverride 
7770 kshitij.so 260
 
6826 amit.gupta 261
    if item.startDate:
262
        ds_item.startDate = to_py_date(item.startDate)
263
        ds_item.startDate = ds_item.startDate.replace(hour=0,second=0,minute=0)
264
        if item.itemStatus == status.COMING_SOON and ds_item.startDate < datetime.datetime.now()  :
265
            item.itemStatus = status.ACTIVE
266
            item.status_description = "This item is active"
267
    else:
268
        ds_item.startDate = None
269
 
2358 ankur.sing 270
    if ds_item.status != item.itemStatus:
2402 rajveer 271
        add_status_change_log(ds_item, item.itemStatus)
5047 amit.gupta 272
        if item.itemStatus == status.PHASED_OUT:
273
            message += "Item is phased out."
2358 ankur.sing 274
        ds_item.status = item.itemStatus
2035 rajveer 275
    if item.status_description:
276
        ds_item.status_description = item.status_description
7770 kshitij.so 277
 
511 rajveer 278
    if item.retireDate:
2116 ankur.sing 279
        ds_item.retireDate = to_py_date(item.retireDate)
2497 ankur.sing 280
    else:
281
        ds_item.retireDate = None
5217 amit.gupta 282
 
283
    if item.expectedArrivalDate:
284
        ds_item.expectedArrivalDate = to_py_date(item.expectedArrivalDate)
285
    else:
286
        ds_item.expectedArrivalDate = None
7770 kshitij.so 287
 
5217 amit.gupta 288
    if item.comingSoonStartDate:
289
        ds_item.comingSoonStartDate = to_py_date(item.comingSoonStartDate)
6696 rajveer 290
        ds_item.comingSoonStartDate = ds_item.comingSoonStartDate.replace(hour=0,second=0,minute=0)
5217 amit.gupta 291
    else:
292
        ds_item.comingSoonStartDate = None
7770 kshitij.so 293
 
294
 
2497 ankur.sing 295
    ds_item.feature_id = item.featureId
296
    ds_item.feature_description = item.featureDescription
7770 kshitij.so 297
 
5047 amit.gupta 298
    if ds_item.bestDealText or item.bestDealText:
299
        if item.bestDealText != ds_item.bestDealText:
5080 amit.gupta 300
            message += "Promotion text is changed from '{0}' to '{1}'.\n".format(ds_item.bestDealText, item.bestDealText)
2129 ankur.sing 301
    ds_item.bestDealText = item.bestDealText
302
    ds_item.bestDealValue = item.bestDealValue
2065 ankur.sing 303
    ds_item.bestSellingRank = item.bestSellingRank
7770 kshitij.so 304
 
6777 vikram.rag 305
    if ds_item.bestDealsDetailsText or item.bestDealsDetailsText:
306
        if item.bestDealsDetailsText != ds_item.bestDealsDetailsText:
307
            message += "Best deals details text is changed from '{0}' to '{1}'.\n".format(ds_item.bestDealsDetailsText, item.bestDealsDetailsText)
308
    ds_item.bestDealsDetailsText = item.bestDealsDetailsText
7770 kshitij.so 309
 
6777 vikram.rag 310
    if ds_item.bestDealsDetailsLink or item.bestDealsDetailsLink:
311
        if item.bestDealsDetailsLink != ds_item.bestDealsDetailsLink:
312
            message += "Best deals details link is changed from '{0}' to '{1}'.\n".format(ds_item.bestDealsDetailsLink, item.bestDealsDetailsLink)
313
    ds_item.bestDealsDetailsLink = item.bestDealsDetailsLink
7770 kshitij.so 314
 
315
 
2065 ankur.sing 316
    ds_item.defaultForEntity = item.defaultForEntity
7770 kshitij.so 317
 
5047 amit.gupta 318
    if ds_item.risky or item.risky:
319
        if ds_item.risky != item.risky:
5080 amit.gupta 320
            message += "Risky flag is changed to '{0}'.\n".format(set)
7770 kshitij.so 321
 
2251 ankur.sing 322
    ds_item.risky = item.risky
7770 kshitij.so 323
 
5385 phani.kuma 324
    ds_item.type = ItemType._VALUES_TO_NAMES[item.type]
325
    ds_item.hasItemNo = item.hasItemNo
7770 kshitij.so 326
 
3459 chandransh 327
    if item.expectedDelay is not None:
3359 chandransh 328
        ds_item.expectedDelay = item.expectedDelay
7770 kshitij.so 329
 
4506 phani.kuma 330
    if item.preferredVendor:
5080 amit.gupta 331
        if item.preferredVendor != ds_item.preferredVendor:
5944 mandeep.dh 332
            inventoryClient = InventoryClient().get_client()
333
            newPreferredVendorName = inventoryClient.getVendor(item.preferredVendor).name
5080 amit.gupta 334
            oldPreferredVendorName = 'None'
335
            if ds_item.preferredVendor:
5944 mandeep.dh 336
                oldPreferredVendorName = inventoryClient.getVendor(ds_item.preferredVendor).name
7770 kshitij.so 337
            message += "Preferred vendor is changed from '{0}' to '{1}'.\n".format(oldPreferredVendorName, newPreferredVendorName)       
4506 phani.kuma 338
        ds_item.preferredVendor = item.preferredVendor
7770 kshitij.so 339
 
5080 amit.gupta 340
    if item.isWarehousePreferenceSticky != ds_item.isWarehousePreferenceSticky:
341
        flag = "ON" if item.isWarehousePreferenceSticky else "OFF"
342
        message += "Warehouse preference sticky is {0}.\n".format(flag)
343
 
4413 anupam.sin 344
    ds_item.isWarehousePreferenceSticky = item.isWarehousePreferenceSticky
7770 kshitij.so 345
 
7296 amit.gupta 346
    ds_item.updatedOn = datetime.datetime.now()
7770 kshitij.so 347
 
7382 rajveer 348
 
7519 rajveer 349
    ds_item.activeOnStore = item.activeOnStore
122 ashish 350
    session.commit();
8867 rajveer 351
 
11817 kshitij.so 352
    subject = "Item '{0}' is updated in Catalog. Id is {1}".format(__get_product_name(ds_item),ds_item.id)
353
    if message:
354
        __send_mail(subject, message)
355
    if store_message:
356
        __send_mail(subject, store_message, to_store_addresses)
8867 rajveer 357
 
122 ashish 358
    return ds_item.id
94 ashish 359
 
103 ashish 360
def add_item(item):
361
    if not item:
122 ashish 362
        raise InventoryServiceException(108, "Bad item in request")
635 rajveer 363
    if get_item(item.id):
122 ashish 364
        raise InventoryServiceException(101, "Item already exists")
7770 kshitij.so 365
 
2120 ankur.sing 366
    validate_item_prices(item)
7770 kshitij.so 367
 
103 ashish 368
    ds_item = Item()
12567 amit.gupta 369
 
370
    if item.id:
371
        ds_item.id = item.id
963 chandransh 372
    if item.productGroup:
373
        ds_item.product_group = item.productGroup
374
    if item.brand:
375
        ds_item.brand = item.brand
515 rajveer 376
    if item.modelName:
377
        ds_item.model_name = item.modelName
378
    if item.modelNumber:
379
        ds_item.model_number = item.modelNumber
609 chandransh 380
    if item.color:
381
        ds_item.color = item.color
483 rajveer 382
    if item.category:
383
        ds_item.category = item.category
384
    if item.comments:
385
        ds_item.comments = item.comments
7291 vikram.rag 386
    if item.asin:
387
        ds_item.asin = item.asin
388
    ds_item.holdInventory = item.holdInventory
9841 rajveer 389
    ds_item.defaultInventory = item.defaultInventory
390
    ds_item.holdOverride = item.holdOverride   
7296 amit.gupta 391
    ds_item.addedOn = datetime.datetime.now()
392
    ds_item.updatedOn = datetime.datetime.now()
2116 ankur.sing 393
    if item.startDate:
394
        ds_item.startDate = to_py_date(item.startDate)
6696 rajveer 395
        ds_item.startDate = ds_item.startDate.replace(hour=0,second=0,minute=0)
2116 ankur.sing 396
    if item.retireDate:
397
        ds_item.retireDate = to_py_date(item.retireDate)
5217 amit.gupta 398
    if item.comingSoonStartDate:
399
        ds_item.comingSoonStartDate = to_py_date(item.comingSoonStartDate)
400
    if item.expectedArrivalDate:
7770 kshitij.so 401
        ds_item.expectedArrivalDate = to_py_date(item.expectedArrivalDate)   
483 rajveer 402
    if item.mrp:
403
        ds_item.mrp = item.mrp
404
    if item.sellingPrice:
405
        ds_item.sellingPrice = item.sellingPrice
122 ashish 406
    if item.weight:
407
        ds_item.weight = item.weight
7770 kshitij.so 408
 
122 ashish 409
    if item.featureId:
410
        ds_item.feature_id = item.featureId
411
    if item.featureDescription:
412
        ds_item.feature_description = item.featureDescription
7770 kshitij.so 413
 
414
 
103 ashish 415
    #check if categories present. If yes, add them to system
7770 kshitij.so 416
 
609 chandransh 417
    if item.bestDealValue:
418
        ds_item.bestDealValue = item.bestDealValue
419
    if item.bestDealText:
420
        ds_item.bestDealText = item.bestDealText
6777 vikram.rag 421
    if item.bestDealsDetailsText:
422
        ds_item.bestDealsDetailsText = item.bestDealsDetailsText
423
    if item.bestDealsDetailsLink:
7770 kshitij.so 424
        ds_item.bestDealsDetailsLink = item.bestDealsDetailsLink   
2116 ankur.sing 425
    if item.bestSellingRank:
426
        ds_item.bestSellingRank = item.bestSellingRank
427
    ds_item.defaultForEntity = item.defaultForEntity
2251 ankur.sing 428
    ds_item.risky = item.risky
7770 kshitij.so 429
 
5385 phani.kuma 430
    ds_item.type = ItemType._VALUES_TO_NAMES[item.type]
431
    ds_item.hasItemNo = item.hasItemNo
7256 rajveer 432
    ds_item.activeOnStore = item.activeOnStore
7770 kshitij.so 433
 
3467 chandransh 434
    if item.expectedDelay is not None:
3359 chandransh 435
        ds_item.expectedDelay = item.expectedDelay
3467 chandransh 436
    else:
437
        ds_item.expectedDelay = 0
7770 kshitij.so 438
 
5408 amit.gupta 439
    preferredVendorName = "None"
4881 phani.kuma 440
    if item.preferredVendor:
441
        ds_item.preferredVendor = item.preferredVendor
5944 mandeep.dh 442
        inventoryClient = InventoryClient().get_client()
6838 vikram.rag 443
        preferredVendorName = inventoryClient.getVendor(item.preferredVendor).name
7770 kshitij.so 444
 
6838 vikram.rag 445
    if item.preferredInsurer is not None:
7770 kshitij.so 446
        ds_item.preferredInsurer = item.preferredInsurer            
447
 
5586 phani.kuma 448
    if item.catalogItemId:
449
        catalog_client = CatalogClient("catalog_service_server_host_master", "catalog_service_server_port").get_client()
450
        master_items = catalog_client.getItemsByCatalogId(item.catalogItemId)
451
        itemStatus = status.IN_PROCESS
452
        for masterItem in master_items:
453
            if masterItem.itemStatus in [status.CONTENT_COMPLETE, status.COMING_SOON, status.ACTIVE, status.PAUSED]:
454
                itemStatus = status.CONTENT_COMPLETE
455
                ds_item.category = masterItem.category
456
                break
457
        ds_item.catalog_item_id = item.catalogItemId
458
        ds_item.status = itemStatus
2116 ankur.sing 459
        ds_item.status_description = "This item is in process."
460
    else:
5586 phani.kuma 461
        # Check if a similar item already exists in our database
462
        similar_item = Item.query.filter_by(brand=item.brand, model_number=item.modelNumber, model_name=item.modelName).first()
463
        print "[SIMILAR ITEM FOUND:] FOR {0} {1} {2}".format(item.brand, item.modelNumber, item.modelName)
7770 kshitij.so 464
 
5586 phani.kuma 465
        if similar_item is None or similar_item.catalog_item_id is None:
466
            # If there is no similar item in the database from before,
467
            # use the entity_id_generator
468
            entity_id = EntityIDGenerator.query.first()
469
            ds_item.catalog_item_id = entity_id.id + 1
12641 amit.gupta 470
            if item.itemStatus:
471
                ds_item.status = item.itemStatus
12648 amit.gupta 472
                ds_item.status_description = status._VALUES_TO_NAMES[item.itemStatus]
12640 amit.gupta 473
            else:
474
                ds_item.status = status.IN_PROCESS
475
                ds_item.status_description = "This item is in process."
5586 phani.kuma 476
            entity_id.id = entity_id.id  + 1
477
            if similar_item is not None and similar_item.catalog_item_id is None:
478
                similar_item.catalog_item_id = entity_id.id
479
        else:
480
            #If a similar item already exists for a product group, brand and model_number, set it as same.
481
            ds_item.catalog_item_id = similar_item.catalog_item_id
482
            ds_item.category = similar_item.category
483
            ds_item.product_group = similar_item.product_group
484
            ds_item.status = similar_item.status
485
            ds_item.status_description = similar_item.status_description
7770 kshitij.so 486
 
103 ashish 487
    session.commit();
5052 amit.gupta 488
    subject = "New item is added. Id is {0}".format(str(ds_item.id))
6777 vikram.rag 489
    message = "Category : {6}, Brand : {0}, Model : {1}, Model Number : {2}\nColor : {3}, Selling Price : {4}, Mrp : {5}, \nPromotion Text : {7}, Preferred Vendor: {8}".format(item.brand, item.modelNumber, item.modelName, item.color, item.sellingPrice, item.mrp, item.category, item.bestDealText,item.bestDealsDetailsText,item.bestDealsDetailsLink, preferredVendorName)
5047 amit.gupta 490
    __send_mail(subject, message)
3325 chandransh 491
    return ds_item.id
492
 
103 ashish 493
def retire_item(item_id):
494
    if not item_id:
122 ashish 495
        raise InventoryServiceException(101, "bad item id")
635 rajveer 496
    item = get_item(item_id)
103 ashish 497
    if not item:
122 ashish 498
        raise InventoryServiceException(108, "item id not present")
499
    item.status = status.PHASED_OUT
500
    item.retireDate = datetime.datetime.now()
103 ashish 501
    session.commit()
7770 kshitij.so 502
 
122 ashish 503
#need to implement threads based solution here
103 ashish 504
def start_item_on(item_id, timestamp):
505
    if not item_id:
122 ashish 506
        raise InventoryServiceException(101, "bad item id")
635 rajveer 507
    item = get_item(item_id)
103 ashish 508
    if not item:
122 ashish 509
        raise InventoryServiceException(108, "item id not present")
7770 kshitij.so 510
 
122 ashish 511
    item.status = status.ACTIVE
512
    item.startDate = datetime.datetime.fromtimestamp(to_py_date(timestamp))
513
    add_status_change_log(item, status.ACTIVE)
103 ashish 514
    session.commit()
7770 kshitij.so 515
 
122 ashish 516
#need to implement threads here
103 ashish 517
def retire_item_on(item_id, timestamp):
518
    if not item_id:
122 ashish 519
        raise InventoryServiceException(101, "bad item id")
635 rajveer 520
    item = get_item(item_id)
103 ashish 521
    if not item:
122 ashish 522
        raise InventoryServiceException(108, "item id not present")
7770 kshitij.so 523
 
122 ashish 524
    item.status = status.PHASED_OUT
525
    item.retireDate = datetime.datetime.fromtimestamp(to_py_date(timestamp))
526
    add_status_change_log(item, status.PHASED_OUT)
103 ashish 527
    session.commit()
7770 kshitij.so 528
 
103 ashish 529
def add_status_change_log(item, new_status):
530
    item_change_log = ItemChangeLog()
531
    item_change_log.new_status = new_status
532
    item_change_log.old_status = item.status
533
    item_change_log.timestamp = datetime.datetime.now()
534
    item_change_log.item = item
535
    session.commit()
7770 kshitij.so 536
 
103 ashish 537
def change_item_status(item_id, new_status):
538
    if not item_id:
122 ashish 539
        raise InventoryServiceException(101, "bad item id")
635 rajveer 540
    item = get_item(item_id)
103 ashish 541
    if not item:
122 ashish 542
        raise InventoryServiceException(108, "item id not present")
2116 ankur.sing 543
    add_status_change_log(item, new_status)
122 ashish 544
    item.status = new_status
2251 ankur.sing 545
    if item.status == status.PHASED_OUT:
546
        item.status_description = "This item has been phased out"
5047 amit.gupta 547
        __send_mail("Item '{0}' is Phased-Out. Item id is {1}".format(__get_product_name(item), item_id), "")
2251 ankur.sing 548
    elif item.status == status.DELETED:
549
        item.status_description = "This item has been deleted"
3924 rajveer 550
    elif item.status == status.PAUSED:
7770 kshitij.so 551
        item.status_description = "This item is currently out of stock"     
3924 rajveer 552
    elif item.status == status.PAUSED_BY_RISK:
553
        item.status_description = "This item is currently out of stock"
554
        #This will clear cache from tomcat
10223 amit.gupta 555
        #__clear_homepage_cache() 
2251 ankur.sing 556
    elif item.status == status.ACTIVE:
557
        item.status_description = "This item is active"
558
    elif item.status == status.IN_PROCESS:
559
        item.status_description = "This item is in process"
560
    elif item.status == status.CONTENT_COMPLETE:
561
        item.status_description = "This item is in process"
103 ashish 562
    session.commit()
7770 kshitij.so 563
 
5944 mandeep.dh 564
def check_risky_item(item_id):
635 rajveer 565
    item = get_item(item_id)
2251 ankur.sing 566
    if not item.risky:
567
        return
5944 mandeep.dh 568
    client = InventoryClient().get_client()
7770 kshitij.so 569
    itemInfo = client.getItemAvailabilityAtLocation(item.id, sourceId)   
5944 mandeep.dh 570
    warehouse_id = itemInfo[0]
571
    availability = client.getItemAvailibilityAtWarehouse(warehouse_id, item.id)
572
    if availability <= 0:
2251 ankur.sing 573
        if item.status == status.ACTIVE:
2984 rajveer 574
            change_item_status(item.id, status.PAUSED_BY_RISK)
4797 rajveer 575
            __send_mail_for_oos_item(item)
2251 ankur.sing 576
    else:
2984 rajveer 577
        if item.status == status.PAUSED_BY_RISK:
2251 ankur.sing 578
            change_item_status(item.id, status.ACTIVE)
6255 rajveer 579
            __send_mail_for_active_item(item.id, "Item '{0}' is Active. Item id is {1}".format(__get_product_name(item), item_id), "")
2368 ankur.sing 580
    session.commit()
7770 kshitij.so 581
 
9253 rajveer 582
def mark_item_as_content_complete(entity_id, category, brand, modelName, modelNumber, isAndroid):
2828 rajveer 583
    '''
584
    Get all the items for this entityID and update category, brand, modelName and modelNumber for all.
585
    Update Status for only IN_PROCESS items to CONTENT_COMPLETE
586
    '''
723 chandransh 587
    content_complete_status = status.CONTENT_COMPLETE
2828 rajveer 588
    items = Item.query.filter_by(catalog_item_id=entity_id).all()
723 chandransh 589
    current_timestamp = datetime.datetime.now()
590
    for item in items:
2828 rajveer 591
        if item.status == status.IN_PROCESS:
592
            item.status = content_complete_status
593
            item_change_log = ItemChangeLog()
594
            item_change_log.old_status = item.status
595
            item_change_log.new_status = content_complete_status
596
            item_change_log.timestamp = current_timestamp
597
            item_change_log.item = item
9299 kshitij.so 598
            if isAndroid:
599
                itemInsurerMapping = ItemInsurerMapping.query.filter(ItemInsurerMapping.itemId == item.id).filter(ItemInsurerMapping.insurerType == InsurerType._NAMES_TO_VALUES.get("DATA")).first()
600
                if itemInsurerMapping is None:
601
                    itemInsurerMapping = ItemInsurerMapping()
602
                    itemInsurerMapping.itemId = item.id
603
                    itemInsurerMapping.insurerId = 2
604
                    itemInsurerMapping.insurerType = 2
7770 kshitij.so 605
 
4762 phani.kuma 606
        category_object = get_category(category)
607
        if category_object is not None:
608
            item.category = category
609
            item.product_group = category_object.display_name
2075 rajveer 610
        item.brand = brand
2081 rajveer 611
        item.model_name = modelName
612
        item.model_number = modelNumber
723 chandransh 613
        item.updatedOn = current_timestamp
614
    session.commit()
615
    return True
1294 chandransh 616
 
2404 chandransh 617
def get_child_categories(category):
618
    cm = CategoryManager()
2621 varun.gupt 619
    cat = cm.getCategory(category)
620
    return cat.children_category_ids if cat else None
2404 chandransh 621
 
626 chandransh 622
def get_best_sellers(start_index, stop_index, category=-1):
2404 chandransh 623
    '''
624
    Returns the Best Sellers between the start and the stop index in the given category
625
    '''
1926 rajveer 626
    query = get_best_sellers_query(category, None)
1098 chandransh 627
    best_sellers = query.all()[start_index:stop_index]
621 chandransh 628
    return get_thrift_item_list(best_sellers)
629
 
2093 chandransh 630
def get_best_sellers_count(category=-1):
2404 chandransh 631
    '''
632
    Returns the number of best sellers in the given category
633
    '''
1926 rajveer 634
    count = get_best_sellers_query(category, None).count()
1120 rajveer 635
    if count is None:
636
        count = 0
766 rajveer 637
    return count
621 chandransh 638
 
1926 rajveer 639
def get_best_sellers_catalog_ids(start_index, stop_index, brand, category=-1):
2404 chandransh 640
    '''
641
    Returns the Best sellers for the given brand and category between the start and the stop index.
7770 kshitij.so 642
    Ignores the category if it's passed as -1 and the brand if it's passed as None.
2404 chandransh 643
    '''
1926 rajveer 644
    query = get_best_sellers_query(category, brand)
1098 chandransh 645
    best_sellers = query.all()[start_index:stop_index]
621 chandransh 646
    return [item.catalog_item_id for item in best_sellers]
7770 kshitij.so 647
 
1926 rajveer 648
def get_best_sellers_query(category, brand):
2404 chandransh 649
    '''
650
    Returns the query to be used for getting Best Sellers.
651
    Ignores the category if it's passed as -1 and the brand if it's passed as None.
652
    '''
1098 chandransh 653
    query = Item.query.filter_by(status=status.ACTIVE).filter(Item.bestSellingRank != None)
626 chandransh 654
    if category != -1:
1970 rajveer 655
        all_categories = [category]
656
        child_categories = get_child_categories(category)
657
        if child_categories is not None:
7770 kshitij.so 658
            all_categories = all_categories + child_categories
1970 rajveer 659
        query = query.filter(Item.category.in_(all_categories))
1926 rajveer 660
    if brand is not None:
661
        query = query.filter_by(brand=brand)
7202 amit.gupta 662
    query = query.group_by(Item.catalog_item_id).order_by(asc(Item.bestSellingRank))
621 chandransh 663
    return query
609 chandransh 664
 
1098 chandransh 665
def get_best_deals(category=-1):
2404 chandransh 666
    '''
667
    Returns the Best deals in the given category. Ignores the category if it's passed as -1.
668
    '''
669
    query = get_best_deals_query(Item, category, None)
1098 chandransh 670
    items = query.all()
609 chandransh 671
    return get_thrift_item_list(items)
672
 
1098 chandransh 673
def get_best_deals_count(category=-1):
2404 chandransh 674
    '''
675
    Returns the count of best deals in the given category.
676
    Ignores the category if it's -1.
677
    '''
678
    count = get_best_deals_counting_query(func.count(distinct(Item.catalog_item_id)), category, None).scalar()
1120 rajveer 679
    if count is None:
680
        count = 0
766 rajveer 681
    return count
7770 kshitij.so 682
 
1926 rajveer 683
def get_best_deals_catalog_ids(start_index, stop_index, brand, category=-1):
2404 chandransh 684
    '''
685
    Returns the catalog_item_ids of best deal items for the given brand and category.
686
    Ignores the category if it's passed as -1 and the brand if it's passed as None.
687
    '''
688
    query = get_best_deals_query(Item, category, brand)
1098 chandransh 689
    best_deal_items = query.all()[start_index:stop_index]
690
    return [item.catalog_item_id for item in best_deal_items]
691
 
2404 chandransh 692
def get_best_deals_counting_query(obj, category, brand):
693
    '''
694
    Returns the query to be used to select the best deals in the given brand and category.
7770 kshitij.so 695
    Ignores the category if it's passed as -1 and the brand if it's passed as None.
2404 chandransh 696
    '''
697
    query = session.query(obj).filter_by(status=status.ACTIVE).filter(Item.bestDealValue != None)
626 chandransh 698
    if category != -1:
1970 rajveer 699
        all_categories = [category]
700
        child_categories = get_child_categories(category)
701
        if child_categories is not None:
7770 kshitij.so 702
            all_categories = all_categories + child_categories
1970 rajveer 703
        query = query.filter(Item.category.in_(all_categories))
1926 rajveer 704
    if brand is not None:
705
        query = query.filter_by(brand=brand)
2404 chandransh 706
    return query
707
 
708
def get_best_deals_query(obj, category, brand):
709
    '''
710
    Returns the query to be used to get the best deals in the given category and brand.
711
    Ignores the category if it's passed as -1 and the brand if it's passed as None.
712
    '''
713
    query = get_best_deals_counting_query(obj, category, brand)
1098 chandransh 714
    query = query.group_by(Item.catalog_item_id).order_by(desc(Item.bestDealValue))
715
    return query
609 chandransh 716
 
5217 amit.gupta 717
def get_coming_soon(category=-1):
718
    '''
719
    Returns the Coming Soon items in the given category. Ignores the category if it's passed as -1.
720
    '''
721
    query = get_coming_soon_query(Item, category, None)
722
    items = query.all()
723
    return get_thrift_item_list(items)
724
 
725
def get_coming_soon_count(category=-1):
726
    '''
727
    Returns the count of coming in the given category.
728
    Ignores the category if it's -1.
729
    '''
730
    count = get_coming_soon_counting_query(func.count(distinct(Item.catalog_item_id)), category, None).scalar()
731
    if count is None:
732
        count = 0
733
    return count
734
 
735
def get_coming_soon_catalog_ids(start_index, stop_index, brand, category=-1):
736
    '''
737
    Returns the catalog_item_ids of coming soon items for the given brand and category.
738
    Ignores the category if it's passed as -1 and the brand if it's passed as None.
739
    '''
740
    query = get_coming_soon_query(Item, category, brand)
741
    coming_soon_items = query.all()[start_index:stop_index]
742
    return [item.catalog_item_id for item in coming_soon_items]
743
 
744
def get_coming_soon_counting_query(obj, category, brand):
745
    '''
746
    Returns the query to be used to select the coming soon product in the given brand and category.
7770 kshitij.so 747
    Ignores the category if it's passed as -1 and the brand if it's passed as None.
5217 amit.gupta 748
    '''
749
    query = session.query(obj).filter_by(status=status.COMING_SOON)
750
    if category != -1:
751
        all_categories = [category]
752
        child_categories = get_child_categories(category)
753
        if child_categories is not None:
7770 kshitij.so 754
            all_categories = all_categories + child_categories
5217 amit.gupta 755
        query = query.filter(Item.category.in_(all_categories))
756
    if brand is not None:
757
        query = query.filter_by(brand=brand)
758
    return query
759
 
760
def get_coming_soon_query(obj, category, brand):
761
    '''
762
    Returns the query to be used to get the coming soon products in the given category and brand.
763
    Ignores the category if it's passed as -1 and the brand if it's passed as None.
764
    '''
765
    query = get_coming_soon_counting_query(obj, category, brand)
766
    query = query.group_by(Item.catalog_item_id).order_by(asc(Item.comingSoonStartDate))
767
    return query
768
 
1098 chandransh 769
def get_latest_arrivals(limit, category=-1):
2404 chandransh 770
    '''
771
    Returns up to limit number of Latest Arrivals in the given category.
772
    '''
2975 chandransh 773
    categories = []
774
    if category != -1:
775
        categories = [category]
776
    query = get_latest_arrivals_query(Item, categories, None)
1098 chandransh 777
    items = query.all()[0:limit]
609 chandransh 778
    return get_thrift_item_list(items)
7770 kshitij.so 779
 
1098 chandransh 780
def get_latest_arrivals_count(limit, category=-1):
2404 chandransh 781
    '''
782
    Returns the number of latest arrivals which will be displayed on the website.
3016 chandransh 783
    To ignore the categories, pass the list as empty. To ignore brand, pass it as null.
2404 chandransh 784
    '''
2975 chandransh 785
    categories = []
786
    if category != -1:
787
        categories = [category]
788
    count = get_latest_arrivals_counting_query(func.count(distinct(Item.catalog_item_id)), categories, None).scalar()
1120 rajveer 789
    if count is None:
790
        count = 0
791
    count = min(count, limit)
766 rajveer 792
    return count
7770 kshitij.so 793
 
2975 chandransh 794
def get_latest_arrivals_catalog_ids(start_index, stop_index, brand, categories=[]):
2404 chandransh 795
    '''
796
    Returns the catalog_item_ids of the latest arrivals between the start and the stop index
3016 chandransh 797
    To ignore the categories, pass the list as empty. To ignore brand, pass it as null.
2404 chandransh 798
    '''
2975 chandransh 799
    query = get_latest_arrivals_query(Item, categories, brand)
1098 chandransh 800
    latest_arrivals = query.all()[start_index:stop_index]
801
    return [item.catalog_item_id for item in latest_arrivals]
802
 
2975 chandransh 803
def get_latest_arrivals_counting_query(obj, categories, brand):
2404 chandransh 804
    '''
805
    Returns the query to be used to count Latest arrivals.
3016 chandransh 806
    To ignore the categories, pass the list as empty. To ignore brand, pass it as null.
2404 chandransh 807
    '''
808
    query = session.query(obj).filter_by(status=status.ACTIVE)
7770 kshitij.so 809
 
2975 chandransh 810
    all_categories = []
811
    for category in categories:
812
        all_categories.append(category)
1970 rajveer 813
        child_categories = get_child_categories(category)
2975 chandransh 814
        if child_categories:
815
            all_categories = all_categories + child_categories
7770 kshitij.so 816
    if all_categories:
1970 rajveer 817
        query = query.filter(Item.category.in_(all_categories))
7770 kshitij.so 818
 
1926 rajveer 819
    if brand is not None:
820
        query = query.filter_by(brand=brand)
2404 chandransh 821
    return query
822
 
2975 chandransh 823
def get_latest_arrivals_query(obj, categories, brand):
2404 chandransh 824
    '''
825
    Returns the query to be used to retrieve Latest Arrivals.
826
    Ignores the category if it's passed as -1 and the brand if it's passed as None.
827
    '''
2975 chandransh 828
    query = get_latest_arrivals_counting_query(obj, categories, brand)
5167 rajveer 829
    query = query.group_by(Item.catalog_item_id).order_by(desc(Item.startDate)).order_by(Item.catalog_item_id)
1098 chandransh 830
    return query
609 chandransh 831
 
832
def get_thrift_item_list(items):
1098 chandransh 833
    return [to_t_item(item) for item in items if item != None]
635 rajveer 834
 
1155 rajveer 835
def generate_new_entity_id():
836
    generator =  EntityIDGenerator.query.one()
837
    id = generator.id + 1
838
    generator.id = id
839
    session.commit()
840
    return id
841
 
635 rajveer 842
def put_category_object(object):
843
    category = Category.get_by(id=1)
844
    if category is None:
845
        category = Category()
7770 kshitij.so 846
    category.object = object   
635 rajveer 847
    session.commit()
848
    return True
849
 
850
def get_category_object():
766 rajveer 851
    object = Category.get_by(id=1).object
852
    return object
853
 
1970 rajveer 854
def add_category(t_category):
855
    category = Category.get_by(id=t_category.id)
856
    if category is None:
857
        category = Category()
7770 kshitij.so 858
    category.id = t_category.id
1970 rajveer 859
    category.label = t_category.label
860
    category.description = t_category.description
4762 phani.kuma 861
    category.display_name = t_category.display_name
7770 kshitij.so 862
    category.parent_category_id = t_category.parent_category_id
1970 rajveer 863
    session.commit()
864
    return True
865
 
866
def get_category(id):
867
    return Category.query.filter_by(id=id).first()
868
 
869
def get_all_categories():
870
    return Category.query.all()
871
 
2120 ankur.sing 872
def validate_item_prices(item):
2129 ankur.sing 873
    if item.mrp == None or item.sellingPrice == None or item.mrp == "" or item.sellingPrice == "":
874
        return
875
    if item.mrp < item.sellingPrice:
2120 ankur.sing 876
        print "[BAD MRP and SP:] for {0} {1} {2} {3}. MRP={4}, SP={5}".format(item.productGroup, item.brand, item.modelNumber, item.color, str(item.mrp), str(item.sellingPrice))
877
        raise InventoryServiceException(101, "[BAD MRP and SP:] for {0} {1} {2} {3}. MRP={4}, SP={5}".format(item.productGroup, item.brand, item.modelNumber, item.color, str(item.mrp), str(item.sellingPrice)))
2065 ankur.sing 878
    return
7770 kshitij.so 879
 
2120 ankur.sing 880
def validate_vendor_prices(item, vendorPrices):
2129 ankur.sing 881
    if item.mrp != None and item.mrp != "" and vendorPrices.mop != "" and item.mrp <  vendorPrices.mop:
2120 ankur.sing 882
        print "[BAD MRP and MOP:] for {0} {1} {2} {3}. MRP={4}. MOP={5}, Vendor={6}".format(item.productGroup, item.brand, item.modelNumber, item.color, str(item.mrp), str(vendorPrices.mop), str(vendorPrices.vendorId))
883
        raise InventoryServiceException(101, "[BAD MRP and MOP:] for {0} {1} {2} {3}. MRP={4}. MOP={5}, Vendor={6}".format(item.productGroup, item.brand, item.modelNumber, item.color, str(item.mrp), str(vendorPrices.mop), str(vendorPrices.vendorId)))
884
    if vendorPrices.mop != "" and vendorPrices.transferPrice != "" and vendorPrices.transferPrice > vendorPrices.mop:
885
        print "[BAD MOP and TP:] for {0} {1} {2} {3}. TP={4}. MOP={5}, Vendor={6}".format(item.productGroup, item.brand, item.modelNumber, item.color, str(vendorPrices.transferPrice), str(vendorPrices.mop), str(vendorPrices.vendorId))
886
        raise InventoryServiceException(101, "[BAD MOP and TP:] for {0} {1} {2} {3}. TP={4}. MOP={5}, Vendor={6}".format(item.productGroup, item.brand, item.modelNumber, item.color, str(vendorPrices.transferPrice), str(vendorPrices.mop), str(vendorPrices.vendorId)))
887
    return
2065 ankur.sing 888
 
4725 phani.kuma 889
def check_color_valid(color):
890
    if color is not None:
891
        color = color.strip().lower()
892
        if color != '' and color != 'na' and color != 'blank' and color != '(blank)':
893
            return True
894
    return False
895
 
896
def check_similar_item(brand, model_number, model_name, color):
2129 ankur.sing 897
    query = Item.query
2428 ankur.sing 898
    query = query.filter_by(brand=brand)
899
    query = query.filter_by(model_number=model_number)
4725 phani.kuma 900
    query = query.filter_by(model_name=model_name)
901
    similar_items = query.all()
902
    item = None
903
    # Check if a similar item already exists in our database
904
    for old_item in similar_items:
905
        if old_item.color != None and old_item.color.strip().lower() == color.strip().lower():
906
            item = old_item
907
            break
7770 kshitij.so 908
 
4725 phani.kuma 909
    # Check if a similar item already exists in our database with out valid color if similar item with same color is not found
2116 ankur.sing 910
    if item is None:
4725 phani.kuma 911
        for old_item in similar_items:
912
            if not check_color_valid(old_item.color):
913
                item = old_item
914
                break
915
    i = 0
916
    color_of_similar_item = None
917
    # Check if a similar item already exists in our database to be used to get catalog_item_id
918
    for old_item in similar_items:
919
        # get a similar item already existing in our database with valid color
920
        if check_color_valid(old_item.color):
921
            similar_item = old_item
922
            color_of_similar_item = similar_item.color
923
            break
924
        i = i + 1
925
        # get a similar item already existing in our database if similar item with valid color is not found
926
        if i == len(similar_items):
927
            similar_item = old_item
928
            color_of_similar_item = similar_item.color
7770 kshitij.so 929
 
4725 phani.kuma 930
    # Check if a similar item that is obtained above is having a valid color
931
    if check_color_valid(color_of_similar_item):
932
        # if a similar item that is obtained above is having a valid color and new item is about to be created with out valid color it is not done.
933
        # since for example if their is a item with red color in our database and we are creating a new item with no color for the same product which is wrong.
934
        if item is None and not check_color_valid(color):
935
            return similar_item.id
7770 kshitij.so 936
 
4725 phani.kuma 937
    if item is None:
2116 ankur.sing 938
        return 0
939
    else:
940
        return item.id
7770 kshitij.so 941
 
2286 ankur.sing 942
def change_risky_flag(item_id, risky):
943
    item = get_item(item_id)
944
    if not item:
945
        raise InventoryServiceException(101, "Item missing in our database")
946
    try:
947
        log_risky_flag(item_id, risky)
948
    except:
949
        print "Not able to log risky flag change"
950
    item.risky = risky
4295 varun.gupt 951
    if not risky and item.status == status.PAUSED_BY_RISK:
2368 ankur.sing 952
        change_item_status(item.id, status.ACTIVE)
6255 rajveer 953
        __send_mail_for_active_item(item.id, "Item '{0}' is Active. Item id is {1}".format(__get_product_name(item), item_id), "")
2286 ankur.sing 954
    session.commit()
5047 amit.gupta 955
    flag = "ON" if risky else "OFF"
956
    subject = "Risky flag is {0} for Item {1}.".format(flag, __get_product_name(item))
957
    __send_mail(subject,"")
7770 kshitij.so 958
 
4957 phani.kuma 959
def get_items_for_mastersheet(categoryName, brand):
960
    if not categoryName or not brand:
961
        raise InventoryServiceException(101, "Invalid category or brand in request")
7770 kshitij.so 962
 
4762 phani.kuma 963
    categories = ["Handsets", "Tablets", "Laptops"]
4957 phani.kuma 964
    query = Item.query.filter(Item.status != status.PHASED_OUT)
965
    if categoryName == "ALL":
966
        pass
967
    elif categoryName == "ALL Accessories":
968
        query = query.filter(~Item.product_group.in_(categories))
969
    elif categoryName == "ALL Handsets":
970
        query = query.filter(Item.product_group.in_(categories))
971
    elif categoryName == "Mobile Accessories":
972
        child_categories = get_child_categories(10011)
973
        if child_categories is not None:
974
            child_categories.append(0)
975
            query = query.filter(Item.category.in_(child_categories))
976
    elif categoryName == "Laptop Accessories":
977
        child_categories = get_child_categories(10070)
978
        if child_categories is not None:
979
            child_categories.append(0)
980
            query = query.filter(Item.category.in_(child_categories))
981
    else:
982
        query = query.filter(Item.product_group == categoryName)
7770 kshitij.so 983
 
4957 phani.kuma 984
    if brand == "ALL":
985
        pass
986
    else:
987
        query = query.filter(Item.brand == brand)
2358 ankur.sing 988
    items = query.all()
989
    return items
2116 ankur.sing 990
 
2358 ankur.sing 991
def get_risky_items():
992
    items = Item.query.filter_by(risky=True).all()
993
    return items
3008 rajveer 994
 
2809 rajveer 995
def get_similar_items_catalog_ids(start_index, stop_index, itemId):
3008 rajveer 996
    query = SimilarItems.query.filter_by(item_id=itemId).limit(stop_index-start_index)
997
    similar_items = query.all()
3289 rajveer 998
    return_list = []
999
    for similar_item in similar_items:
1000
        isActive = False
1001
        try:
1002
            all_items = Item.query.filter_by(catalog_item_id=similar_item.catalog_item_id).all()
1003
        except:
1004
            continue
1005
        for item in all_items:
1006
            isActive = isActive or item.status == status.ACTIVE
1007
        if isActive:
1008
            return_list.append(similar_item.catalog_item_id)
1009
    return return_list
4423 phani.kuma 1010
 
1011
def get_all_similar_items_catalog_ids(itemId):
1012
    query = SimilarItems.query.filter_by(item_id=itemId)
1013
    similar_items = query.all()
1014
    return_list = []
1015
    for similar_item in similar_items:
1016
        item_query = Item.query.filter_by(catalog_item_id=similar_item.catalog_item_id).limit(1)
1017
        item = item_query.one()
1018
        return_list.append(item)
7770 kshitij.so 1019
 
4423 phani.kuma 1020
    return get_thrift_item_list(return_list)
1021
 
1022
def add_similar_item_catalog_id(itemId, catalog_item_id):
1023
    if not itemId or not catalog_item_id:
1024
        raise InventoryServiceException(101, "Bad itemId or catalogItemId in request")
1025
    items_for_entity = get_items_by_catalog_id(catalog_item_id)
1026
    if not len(items_for_entity):
1027
        raise InventoryServiceException(101, "catalogItemId does not exists in database")
7770 kshitij.so 1028
 
4423 phani.kuma 1029
    s_items = SimilarItems.query.filter_by(item_id=itemId, catalog_item_id=catalog_item_id).all()
1030
    if not len(s_items):
1031
        s_item = SimilarItems()
1032
        s_item.item_id=itemId
1033
        s_item.catalog_item_id=catalog_item_id
1034
        session.commit()
1035
        return items_for_entity[0]
1036
    else:
1037
        raise InventoryServiceException(101, "Already exists")
7770 kshitij.so 1038
 
4423 phani.kuma 1039
def delete_similar_item_catalog_id(itemId, catalog_item_id):
1040
    if not itemId or not catalog_item_id:
1041
        raise InventoryServiceException(101, "Bad itemId or catalogItemId in request")
7770 kshitij.so 1042
 
4423 phani.kuma 1043
    similar_item = SimilarItems.query.filter_by(item_id=itemId, catalog_item_id=catalog_item_id).all()
1044
    if len(similar_item):
1045
        similar_item[0].delete()
1046
    session.commit()
1047
    return True
5504 phani.kuma 1048
 
1049
def get_all_vouchers_for_item(itemId):
1050
    vouchers = VoucherItemMapping.query.filter_by(item_id=itemId).all()
1051
    return vouchers
1052
 
1053
def get_voucher_amount(itemId, voucher_type):
1054
    voucher = VoucherItemMapping.query.filter_by(item_id=itemId, voucherType=voucher_type).all()
1055
    if len(voucher):
1056
        return voucher[0].amount
1057
    else:
5518 rajveer 1058
        return 0
5504 phani.kuma 1059
 
1060
def add_update_voucher_for_item(catalog_item_id, voucher_type, voucher_amount):
1061
    if not catalog_item_id or not voucher_type or not voucher_amount:
1062
        raise InventoryServiceException(101, "Bad catalogItemId or voucherType or voucherAmount in request")
7770 kshitij.so 1063
 
5504 phani.kuma 1064
    items_for_entity = get_items_by_catalog_id(catalog_item_id)
1065
    if not len(items_for_entity):
1066
        raise InventoryServiceException(101, "catalogItemId does not exists in database")
7770 kshitij.so 1067
 
5504 phani.kuma 1068
    for item in items_for_entity:
1069
        itemId = item.id
1070
        voucher = VoucherItemMapping.query.filter_by(item_id=itemId, voucherType=voucher_type).all()
1071
        if not len(voucher):
1072
            voucher = VoucherItemMapping()
1073
            voucher.item_id=itemId
1074
            voucher.voucherType=voucher_type
1075
            voucher.amount=voucher_amount
1076
        else:
1077
            voucher[0].amount=voucher_amount
1078
    session.commit()
1079
    return True
7770 kshitij.so 1080
 
5504 phani.kuma 1081
def delete_voucher_for_item(catalog_item_id, voucher_type):
1082
    if not catalog_item_id or not voucher_type:
1083
        raise InventoryServiceException(101, "Bad catalogItemId or voucherType in request")
7770 kshitij.so 1084
 
5504 phani.kuma 1085
    items_for_entity = get_items_by_catalog_id(catalog_item_id)
1086
    if not len(items_for_entity):
1087
        raise InventoryServiceException(101, "catalogItemId does not exists in database")
7770 kshitij.so 1088
 
5504 phani.kuma 1089
    for item in items_for_entity:
1090
        itemId = item.id
1091
        voucher = VoucherItemMapping.query.filter_by(item_id=itemId, voucherType=voucher_type).all()
1092
        if len(voucher):
1093
            voucher[0].delete()
1094
    session.commit()
1095
    return True
1096
 
3079 rajveer 1097
def add_product_notification(itemId, email):
1098
    try:
3470 rajveer 1099
        try:
1100
            product_notification = ProductNotification.query.filter_by(item_id=itemId, email=email).one()
1101
        except:
1102
            product_notification = ProductNotification()
1103
            product_notification.email = email
1104
            product_notification.item_id = itemId
3079 rajveer 1105
        product_notification.addedOn = datetime.datetime.now()
1106
        session.commit()
1107
        return True
1108
    except:
1109
        return False
3086 rajveer 1110
 
1111
 
1112
def send_product_notifications():
7134 rajveer 1113
    product_notifications = ProductNotification.query.order_by(ProductNotification.addedOn).all()
1114
    itemcountmap = {}
1115
    itemstatusmap = {}
8182 amar.kumar 1116
    #print "size of prduct notifications = " + str(len(product_notifications))
3086 rajveer 1117
    for product_notification in product_notifications:
1118
        item = product_notification.item
7134 rajveer 1119
        if itemcountmap.has_key(item.id):
1120
            itemcountmap[item.id] = itemcountmap.get(item.id) + 1
1121
        else:
1122
            client = InventoryClient().get_client()
1123
            availability = client.getItemAvailabilityAtLocation(item.id, sourceId)[4]
8182 amar.kumar 1124
            #print "Item status " + str(item.status) + " item.risky " + str(item.risky) + " availability = " + str(availability)
1125
            if item.status == status.ACTIVE and (not item.risky or availability > 0):  
1126
                #print "item status map has new entry " + str(item.id)     
7134 rajveer 1127
                itemstatusmap[item.id] = True
1128
            else:
1129
                itemstatusmap[item.id] = False
1130
            itemcountmap[item.id] = 1
1131
        if itemcountmap[item.id] > 1000:
1132
            continue
7770 kshitij.so 1133
 
7134 rajveer 1134
        if itemstatusmap[item.id]:
8182 amar.kumar 1135
            #print product_notification.email, __get_product_name(item) , product_notification.addedOn, __get_product_url(item), item.id
3086 rajveer 1136
            __enque_product_notification_email(product_notification.email, __get_product_name(item) , product_notification.addedOn, __get_product_url(item), item.id)
1137
            product_notification.delete()
1138
    session.commit()
1139
    return True
7770 kshitij.so 1140
 
3086 rajveer 1141
def __get_product_name(item):
1142
    product_name = item.brand + " " + item.model_name + " " + item.model_number
1143
    color = item.color
1144
    if color is not None and color != 'NA':
1145
        product_name = product_name + " (" + color + ")"
3201 rajveer 1146
    product_name = product_name.replace("  "," ")
3086 rajveer 1147
    return product_name
1148
 
1149
 
1150
def __get_product_url(item):
6029 rajveer 1151
    product_url = "http://" + source_url + "/mobile-phones/" + item.brand + "-" + item.model_name + "-" + item.model_number + "-" + str(item.catalog_item_id)
3086 rajveer 1152
    product_url = product_url.replace("--","-")
1153
    product_url = product_url.replace(" ","")
1154
    return product_url
1155
 
3348 varun.gupt 1156
def get_all_brands_by_category(category_id):
1157
    catm = CategoryManager()
1158
    child_categories = catm.getCategory(category_id).children_category_ids
1159
    brands = session.query(distinct(Item.brand)).filter(Item.category.in_(child_categories)).all()
7770 kshitij.so 1160
 
3348 varun.gupt 1161
    return [brand[0] for brand in brands]
3086 rajveer 1162
 
4957 phani.kuma 1163
def get_all_brands():
1164
    brands = session.query(distinct(Item.brand)).order_by(Item.brand).all()
7770 kshitij.so 1165
 
4957 phani.kuma 1166
    return [brand[0] for brand in brands]
1167
 
3086 rajveer 1168
def __enque_product_notification_email(email, product, date, url, itemId):
7770 kshitij.so 1169
 
3086 rajveer 1170
    html = """
1171
        <html>
1172
        <body>
1173
        <div>
1174
        <p>
1175
            Hi,<br /><br />
6029 rajveer 1176
            The product requested by you on $date is now available on $source_url.
7103 amar.kumar 1177
            <br />
1178
            We have limited stocks of this model at this moment. If you don't want to miss out, please place your order as soon as possible.
3086 rajveer 1179
        </p>
7770 kshitij.so 1180
 
1181
        <p>   
3086 rajveer 1182
        <strong>Product: $product </strong>
1183
        </p>
7770 kshitij.so 1184
 
3086 rajveer 1185
        <p>
7770 kshitij.so 1186
        Click the link below to visit the product:
3086 rajveer 1187
        <br/>
1188
        $url
1189
        </p>
1190
        <p>
1191
        Regards,<br/>
6029 rajveer 1192
        $source_name Customer Support Team<br/>
1193
        $source_url<br/>
3086 rajveer 1194
        Email: help@saholic.com<br/>
1195
        </p>
1196
        </div>
1197
        </body>
1198
        </html>
1199
        """
1200
 
6029 rajveer 1201
    html = Template(html).substitute(dict(product=product,date=date,url=url,source_url=source_url,source_name=source_name))
7770 kshitij.so 1202
 
3086 rajveer 1203
    try:
1204
        helper_client = HelperClient().get_client()
8464 amar.kumar 1205
        helper_client.saveUserEmailForSending([email], "", "Product requested by you is available now.", html, str(itemId), "ProductNotification", [], [],sourceId)
3086 rajveer 1206
    except Exception as e:
1207
        print e
8182 amar.kumar 1208
        print sys.exc_info()[0]
3086 rajveer 1209
 
3557 rajveer 1210
def get_all_sources():
1211
    sources = Source.query.all()
1212
    return [to_t_source(source) for source in sources]
3086 rajveer 1213
 
3557 rajveer 1214
def get_item_pricing_by_source(itemId, sourceId):
1215
    item = Item.query.filter_by(id=itemId).first()
1216
    if item is None:
1217
        raise InventoryServiceException(101, "Bad Item")
7770 kshitij.so 1218
 
3557 rajveer 1219
    source = Source.query.filter_by(id=sourceId).first()
1220
    if source is None:
1221
        raise InventoryServiceException(101, "Source not found for sourceId " + str(sourceId))
7770 kshitij.so 1222
 
3557 rajveer 1223
    item_pricing = SourceItemPricing.query.filter_by(source=source, item=item).first()
1224
    if item_pricing is None:
1225
        raise InventoryServiceException(101, "Pricing information not found for sourceId " + str(sourceId))
1226
    return item_pricing
7770 kshitij.so 1227
 
3557 rajveer 1228
def add_source_item_pricing(sourceItemPricing):
1229
    if not sourceItemPricing:
1230
        raise InventoryServiceException(108, "Bad sourceItemPricing in request")
7770 kshitij.so 1231
 
3557 rajveer 1232
    if not sourceItemPricing.sellingPrice:
4326 mandeep.dh 1233
        raise InventoryServiceException(101, "Selling Price is not defined for sourceId " + str(sourceItemPricing.sourceId))
7770 kshitij.so 1234
 
3557 rajveer 1235
    sourceId = sourceItemPricing.sourceId
1236
    itemId = sourceItemPricing.itemId
7770 kshitij.so 1237
 
3557 rajveer 1238
    item = Item.query.filter_by(id=itemId).first()
1239
    if item is None:
1240
        raise InventoryServiceException(101, "Bad Item")
7770 kshitij.so 1241
 
3557 rajveer 1242
    source = Source.query.filter_by(id=sourceId).first()
1243
    if source is None:
1244
        raise InventoryServiceException(101, "Source not found for sourceId " + str(sourceId))
7770 kshitij.so 1245
 
3564 rajveer 1246
    ds_sourceItemPricing = SourceItemPricing.get_by(source=source, item=item)
3557 rajveer 1247
    if ds_sourceItemPricing is None:
1248
        ds_sourceItemPricing = SourceItemPricing()
1249
        ds_sourceItemPricing.source = source
1250
        ds_sourceItemPricing.item = item
7770 kshitij.so 1251
 
3557 rajveer 1252
    if sourceItemPricing.mrp:
1253
        ds_sourceItemPricing.mrp = sourceItemPricing.mrp
1254
    ds_sourceItemPricing.sellingPrice = sourceItemPricing.sellingPrice
1255
 
1256
    session.commit()
1257
    return
1258
 
1259
def get_all_source_pricing(itemId):
1260
    item = Item.query.filter_by(id=itemId).first()
1261
    if item is None:
1262
        raise InventoryServiceException(101, "Bad Item")
1263
    source_pricing = SourceItemPricing.query.filter_by(item=item).all()
1264
    return source_pricing
7770 kshitij.so 1265
 
3557 rajveer 1266
 
1267
def get_item_for_source(item_id, sourceId):
1268
    item = get_item(item_id)
1269
    if sourceId == -1:
1270
        return item
1271
    try:
1272
        sip = get_item_pricing_by_source(item_id, sourceId)
1273
        item.sellingPrice = sip.sellingPrice
1274
        if sip.mrp:
1275
            item.mrp = sip.mrp
1276
    except:
1277
        print "No source pricing"
1278
    return item
1279
 
3872 chandransh 1280
def search_items(search_terms, offset, limit):
1281
    query = Item.query
7770 kshitij.so 1282
 
3872 chandransh 1283
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
8139 kshitij.so 1284
    print search_terms
7770 kshitij.so 1285
 
3872 chandransh 1286
    for search_term in search_terms:
6661 rajveer 1287
        query_clause = []
3872 chandransh 1288
        query_clause.append(Item.brand.like(search_term))
1289
        query_clause.append(Item.model_number.like(search_term))
1290
        query_clause.append(Item.model_name.like(search_term))
6661 rajveer 1291
        query = query.filter(or_(*query_clause))
8139 kshitij.so 1292
 
1293
    print query
3872 chandransh 1294
    query = query.order_by(Item.product_group, Item.brand, Item.model_number, Item.model_name).offset(offset)
1295
    if limit:
1296
        query = query.limit(limit)
1297
    items = query.all()
1298
    return items
1299
 
1300
def get_search_result_count(search_terms):
1301
    query = Item.query
7770 kshitij.so 1302
 
3872 chandransh 1303
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
7770 kshitij.so 1304
 
3872 chandransh 1305
    for search_term in search_terms:
6661 rajveer 1306
        query_clause = []
3872 chandransh 1307
        query_clause.append(Item.brand.like(search_term))
1308
        query_clause.append(Item.model_number.like(search_term))
1309
        query_clause.append(Item.model_name.like(search_term))
6661 rajveer 1310
        query = query.filter(or_(*query_clause))
7770 kshitij.so 1311
 
3872 chandransh 1312
    return query.count()
1313
 
3924 rajveer 1314
def __clear_homepage_cache():
1315
    try:
1316
        # create a password manager
1317
        password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
1318
        # Add the username and password.
1319
        configclient = ConfigClient()
4310 rajveer 1320
        ips = configclient.get_property("production_servers_private_ips");
3924 rajveer 1321
        ips = ips.split(" ")
7770 kshitij.so 1322
 
3924 rajveer 1323
        for ip in ips:
4310 rajveer 1324
            try:
1325
                top_level_url = "http://" + ip + ":8080/"
1326
                password_mgr.add_password(None, top_level_url, "saholic", "shop2020")
1327
                handler = urllib2.HTTPBasicAuthHandler(password_mgr)
7770 kshitij.so 1328
 
4310 rajveer 1329
                opener = urllib2.build_opener(handler)
7770 kshitij.so 1330
 
4310 rajveer 1331
                # use the opener to fetch a URL
1332
                res = opener.open(top_level_url + "cache-admin/HomePageSnippets?_method=delete")
1333
                print "Successfully cleared home page cache" + res.read()
1334
            except:
1335
                print "Unable to clear home page cache" + res.read()
3924 rajveer 1336
    except:
1337
        print "Unable to clear cache, still should continue with other operations"
7770 kshitij.so 1338
 
4295 varun.gupt 1339
def get_product_notifications(start_datetime):
1340
    '''
1341
    Returns a list of Product Notification objects each representing user requests for notification
1342
    '''
1343
    query = ProductNotification.query
7770 kshitij.so 1344
 
4295 varun.gupt 1345
    if start_datetime:
1346
        query = query.filter(ProductNotification.addedOn > start_datetime)
7770 kshitij.so 1347
 
4295 varun.gupt 1348
    notifications = query.order_by(desc('addedOn')).all()
1349
    return notifications
1350
 
7897 amar.kumar 1351
def get_product_notification_request_count(start_datetime, categoryId):
4295 varun.gupt 1352
    '''
1353
    Returns list of items and the counts of product notification requests
1354
    '''
7897 amar.kumar 1355
    if categoryId:
1356
        categories = get_child_categories(categoryId)
1357
        items = Item.query.filter(Item.category.in_(categories)).all()
1358
        item_ids = [item.id for item in items]
1359
 
4295 varun.gupt 1360
    print start_datetime
1361
    query = session.query(ProductNotification, func.count(ProductNotification.email).label('count'))
7770 kshitij.so 1362
 
4295 varun.gupt 1363
    if start_datetime:
1364
        query = query.filter(ProductNotification.addedOn > start_datetime)
7897 amar.kumar 1365
    if categoryId:
1366
        query = query.filter(ProductNotification.item_id.in_(item_ids))
4295 varun.gupt 1367
    counts = query.group_by(ProductNotification.item_id).order_by(desc('count')).all()
1368
    return counts
1369
 
766 rajveer 1370
def close_session():
1371
    if session.is_active:
1372
        print "session is active. closing it."
1399 rajveer 1373
        session.close()
3376 rajveer 1374
 
1375
def is_alive():
1376
    try:
1377
        session.query(Item.id).limit(1).one()
1378
        return True
1379
    except:
1380
        return False
4332 anupam.sin 1381
 
4649 phani.kuma 1382
def add_authorization_log_for_item(itemId, username, reason):
1383
    if not itemId or not username:
1384
        raise InventoryServiceException(101, "Bad itemId or Invalid username in request")
1385
    authorize_log = AuthorizationLog()
1386
    authorize_log.item_id = itemId
1387
    authorize_log.username = username
1388
    authorize_log.reason = reason
1389
    session.commit()
4797 rajveer 1390
    return True
1391
 
6255 rajveer 1392
def __send_mail_for_oos_item(item):
1393
    oos = OOSTracker.get_by(itemId = item.id)
1394
    if oos is None:
1395
        oos = OOSTracker()
1396
        oos.itemId = item.id
1397
        session.commit()
1398
        try:
6962 rajveer 1399
            EmailAttachmentSender.mail(mail_user, mail_password, to_addresses + ["pramit.singh@shop2020.in"], "Item is out of stock. ID: " + str(item.id)  + " " + str(item.brand) +  " " + str(item.model_name) + " " + str(item.model_number)+ " " + str(item.color), None)
6255 rajveer 1400
        except Exception as e:
1401
            print e
4985 mandeep.dh 1402
 
6255 rajveer 1403
def __send_mail_for_active_item(itemId, subject, message):
1404
    oos = OOSTracker.get_by(itemId = itemId)
1405
    if oos is not None:
1406
        oos.delete()
1407
        session.commit()
1408
    __send_mail(subject, message)
1409
 
7384 rajveer 1410
def __send_mail(subject, message, send_to  = to_addresses):
5080 amit.gupta 1411
    try:
7384 rajveer 1412
        thread = threading.Thread(target=partial(mail, mail_user, mail_password, send_to, subject, message))
5080 amit.gupta 1413
        thread.start()
1414
    except Exception as ex:
7770 kshitij.so 1415
        print ex   
5185 mandeep.dh 1416
 
6039 amit.gupta 1417
def get_vat_amount_for_item(itemId, price):
1418
    item = Item.query.filter_by(id=itemId).first()
1419
    vatPercentage = item.vatPercentage
1420
    if vatPercentage is None:
1421
        vatMaster = CategoryVatMaster.query.filter(and_(CategoryVatMaster.categoryId==item.category, CategoryVatMaster.minVal<=price,  CategoryVatMaster.maxVal>=price)).first()
1422
        vatPercentage = vatMaster.vatPercent
1423
        if  vatPercentage is None:
1424
            vatPercentage = 0
1425
    return (price*vatPercentage)/100
7770 kshitij.so 1426
 
7340 amit.gupta 1427
def get_vat_percentage_for_item(itemId, stateId, price):
7330 amit.gupta 1428
    itemVatMaster = ItemVatMaster.query.filter(and_(ItemVatMaster.itemId==itemId, ItemVatMaster.stateId==stateId)).first()
7340 amit.gupta 1429
    if itemVatMaster is None:
7330 amit.gupta 1430
            item = Item.query.filter_by(id=itemId).first()
7340 amit.gupta 1431
            if item is None:
1432
                raise CatalogServiceException(itemId, "Could not find item in catalog")
1433
            vatMaster = CategoryVatMaster.query.filter(and_(CategoryVatMaster.categoryId==item.category, CategoryVatMaster.minVal<=price,  CategoryVatMaster.maxVal>=price,  CategoryVatMaster.stateId == stateId)).first()
7330 amit.gupta 1434
            if vatMaster is None:
8589 amar.kumar 1435
                raise CatalogServiceException(stateId, "Could not find vat rate for this state." + str(stateId) + " for " + str(itemId))
7340 amit.gupta 1436
            return vatMaster.vatPercent
7330 amit.gupta 1437
    else:
7340 amit.gupta 1438
        return itemVatMaster.vatPercentage
6511 kshitij.so 1439
 
12567 amit.gupta 1440
def get_vat_percentage_for_item_category(itemId, stateId, price, categoryId):
1441
    itemVatMaster = ItemVatMaster.query.filter(and_(ItemVatMaster.itemId==itemId, ItemVatMaster.stateId==stateId)).first()
1442
    if itemVatMaster is None:
1443
            vatMaster = CategoryVatMaster.query.filter(and_(CategoryVatMaster.categoryId==categoryId, CategoryVatMaster.minVal<=price,  CategoryVatMaster.maxVal>=price,  CategoryVatMaster.stateId == stateId)).first()
1444
            if vatMaster is None:
1445
                return -1
1446
            return vatMaster.vatPercent
1447
    else:
1448
        return itemVatMaster.vatPercentage
1449
 
6531 vikram.rag 1450
def get_all_ignored_inventoryupdate_items_list(offset,limit):
1451
    client = InventoryClient().get_client()
1452
    itemids = client.getIgnoredInventoryUpdateItemids(offset,limit)
6532 amit.gupta 1453
    result = []
1454
    if itemids is not None and len(itemids)>0:
1455
        query = Item.query.filter(Item.id.in_(itemids))
1456
        query = query.order_by(Item.product_group, Item.brand, Item.model_number, Item.model_name)
1457
        result = [to_t_item(item) for item in query.all()]
1458
    return result
6531 vikram.rag 1459
 
1460
 
6511 kshitij.so 1461
def add_tag (displayName, catalogId):
1462
    ent_tag = None
7770 kshitij.so 1463
    if catalogId is None or (not is_valid_catalog_id(catalogId)):           
6511 kshitij.so 1464
        raise InventoryServiceException(id, "Invalid CatalogId")
1465
    else:
1466
        ent_tag = EntityTag()
1467
        ent_tag.entityId = catalogId
1468
    if displayName is None:
1469
        raise InventoryServiceException(id, "Tag should not be empty")
7770 kshitij.so 1470
    else:
6511 kshitij.so 1471
        ent_tag.tag = displayName
1472
    session.commit()
1473
    return True
1474
 
8590 kshitij.so 1475
def add_banner(bannerCongregate):
1476
    banner = bannerCongregate.banner
9155 kshitij.so 1477
    antecedent = bannerCongregate.antecedent
8590 kshitij.so 1478
    t_bannerMaps = bannerCongregate.bannerMaps
1479
    t_bannerUriMappings = bannerCongregate.bannerUriMappings
9178 kshitij.so 1480
    if antecedent.bannerName is not None :
1481
        delete_banner(antecedent.bannerName,antecedent.bannerType)
9155 kshitij.so 1482
    try:
1483
        banner_details=Banner()
1484
        banner_details.bannerName=banner.bannerName
1485
        banner_details.imageName=banner.imageName
1486
        banner_details.link=banner.link
1487
        banner_details.hasMap=banner.hasMap
1488
        banner_details.priority = banner.priority
1489
        banner_details.bannerType = banner.bannerType
10097 kshitij.so 1490
        add_banner_map(t_bannerMaps,banner.bannerType)
1491
        add_banner_uri(t_bannerUriMappings,banner.bannerType)
9155 kshitij.so 1492
        session.commit()
10097 kshitij.so 1493
        return True
9155 kshitij.so 1494
    except:
10097 kshitij.so 1495
        return False
6848 kshitij.so 1496
def get_all_banners():
8579 kshitij.so 1497
    return session.query(Banner).all()
6848 kshitij.so 1498
 
9155 kshitij.so 1499
def delete_banner(name,bType):
8579 kshitij.so 1500
    try:
9155 kshitij.so 1501
        session.query(Banner.bannerName).filter_by(bannerName=name).filter_by(bannerType=bType).delete()
1502
        delete_banner_map(name,bType)
1503
        delete_uri_mapping(name,bType)
10097 kshitij.so 1504
        session.commit()
8579 kshitij.so 1505
        return True
1506
    except:
1507
        return False
6848 kshitij.so 1508
 
9155 kshitij.so 1509
def get_banner_details(name,bType):
1510
    banner = session.query(Banner).filter(Banner.bannerName==name).filter(Banner.bannerType==bType).one()
10097 kshitij.so 1511
    return banner
6848 kshitij.so 1512
 
10494 kshitij.so 1513
def __t_banner_details(banner,target):
10097 kshitij.so 1514
    bannerObj = t_banner()
1515
    bannerObj.bannerName = banner.bannerName
1516
    bannerObj.imageName = banner.imageName
1517
    bannerObj.link = banner.link
1518
    bannerObj.priority = banner.priority
1519
    bannerObj.hasMap = banner.hasMap
1520
    bannerObj.bannerType = banner.bannerType
1521
    bannerObj.target = target
1522
    return bannerObj
1523
 
1524
 
6848 kshitij.so 1525
def get_active_banners():
8579 kshitij.so 1526
    bannerUriMap = {}
9155 kshitij.so 1527
    bannerType = [1,2]
1528
    all_active = session.query(BannerUriMapping,Banner).filter(BannerUriMapping.bannerType.in_(bannerType)).filter(BannerUriMapping.isActive==True).filter(BannerUriMapping.bannerName==Banner.bannerName).filter(BannerUriMapping.bannerType==Banner.bannerType).order_by(desc(Banner.priority)).all()
8579 kshitij.so 1529
    for bannerUriMapping in all_active:
1530
        bannerObj = []
9155 kshitij.so 1531
        if (bannerUriMapping[0].bannerType == BannerType.SIDE_BANNER):
1532
            if 'side-banner' in bannerUriMap:
1533
                for obj in bannerUriMap['side-banner']:
1534
                    bannerObj.append(obj)
10494 kshitij.so 1535
            bannerObj.append(__t_banner_details(bannerUriMapping[1],bannerUriMapping[0].target))
9155 kshitij.so 1536
            bannerUriMap['side-banner'] = bannerObj
1537
            continue
8579 kshitij.so 1538
        if bannerUriMapping[0].uri not in bannerUriMap:
10494 kshitij.so 1539
            bannerObj.append(__t_banner_details(bannerUriMapping[1],bannerUriMapping[0].target))
8579 kshitij.so 1540
            bannerUriMap[bannerUriMapping[0].uri] = bannerObj
1541
        else:
1542
            for obj in bannerUriMap[bannerUriMapping[0].uri]:
1543
                bannerObj.append(obj)
10494 kshitij.so 1544
            bannerObj.append(__t_banner_details(bannerUriMapping[1],bannerUriMapping[0].target))
8579 kshitij.so 1545
            bannerUriMap[bannerUriMapping[0].uri] = bannerObj
1546
    return bannerUriMap
1547
 
6848 kshitij.so 1548
 
9155 kshitij.so 1549
def add_banner_map(bannerMaps,bannerType):
10097 kshitij.so 1550
    for bannerMap in bannerMaps:
1551
        banner_map_details=BannerMap()
1552
        banner_map_details.bannerName=bannerMap.bannerName
1553
        banner_map_details.mapLink=bannerMap.mapLink
1554
        banner_map_details.coordinates=bannerMap.coordinates
1555
        banner_map_details.bannerType = bannerType
8579 kshitij.so 1556
 
6848 kshitij.so 1557
 
9155 kshitij.so 1558
def delete_banner_map(name,bType):
10097 kshitij.so 1559
    session.query(BannerMap.bannerName).filter_by(bannerName=name).filter_by(bannerType=bType).delete()
6848 kshitij.so 1560
 
9155 kshitij.so 1561
def delete_uri_mapping(name,bType):
10097 kshitij.so 1562
    session.query(BannerUriMapping.bannerName).filter_by(bannerName=name).filter_by(bannerType=bType).delete()
8579 kshitij.so 1563
 
9155 kshitij.so 1564
def get_banner_map_details(name,bType):
6848 kshitij.so 1565
    query= session.query(BannerMap)
9155 kshitij.so 1566
    return query.filter_by(bannerName=name).filter_by(bannerType=bType).all()
8579 kshitij.so 1567
 
1568
def update_banner(banner):
1569
    banner_details = Banner.get_by(bannerName=banner.bannerName)
1570
    try:
1571
        if banner_details is not None:
1572
            banner_details.imageName = banner.imageName
1573
            banner_details.link = banner.link
1574
            banner_details.priority = banner.priority
1575
            banner_details.hasMap = banner.hasMap
1576
            session.commit()
1577
            return True
1578
        else:
1579
            return False
1580
    except:
1581
        return False
1582
 
9155 kshitij.so 1583
def add_banner_uri(bannerUriMappings,bannerType):
8579 kshitij.so 1584
    for bannerUriMapping in bannerUriMappings:
1585
        banner_uri = BannerUriMapping()
1586
        banner_uri.bannerName = bannerUriMapping.bannerName
1587
        banner_uri.uri = bannerUriMapping.uri
1588
        banner_uri.isActive = bannerUriMapping.isActive
9155 kshitij.so 1589
        banner_uri.bannerType = bannerType
10097 kshitij.so 1590
        banner_uri.target = bannerUriMapping.target
8579 kshitij.so 1591
 
9155 kshitij.so 1592
def get_uri_mapping(name,bType):
8579 kshitij.so 1593
    query= session.query(BannerUriMapping)
9155 kshitij.so 1594
    return query.filter_by(bannerName=name).filter_by(bannerType=bType).all()
8579 kshitij.so 1595
 
1596
def add_campaign(campaign):
1597
    new_campaign = Campaign()
1598
    new_campaign.campaignName = campaign.campaignName
1599
    new_campaign.imageName = campaign.imageName
1600
    session.commit() 
1601
 
1602
def get_campaigns(name):
1603
    query= session.query(Campaign)
1604
    return query.filter_by(campaignName=name).all()
1605
 
1606
def delete_campaign(campaign_id):
1607
    campaign = Campaign.get_by(id = campaign_id)
1608
    if campaign is not None:
1609
        campaign.delete()
1610
        session.commit()
1611
 
1612
def get_all_campaigns():
1613
    return session.query(distinct(Campaign.campaignName)).all()
1614
 
9155 kshitij.so 1615
def get_active_banners_for_mobile_site():
1616
    bannerType = [3]
1617
    bannerMap = {}
1618
    all_active = session.query(BannerUriMapping,Banner).filter(BannerUriMapping.bannerType.in_(bannerType)).filter(BannerUriMapping.isActive==True).filter(BannerUriMapping.bannerName==Banner.bannerName).filter(BannerUriMapping.bannerType==Banner.bannerType).order_by(desc(Banner.priority)).all()
1619
    for bannerUriMapping in all_active:
1620
        bannerObj = []
1621
        if bannerUriMapping[0].uri not in bannerMap:
1622
            bannerObj.append(get_banner_details(bannerUriMapping[0].bannerName,bannerUriMapping[0].bannerType))
1623
            bannerMap[bannerUriMapping[0].uri] = bannerObj
1624
        else:
1625
            for obj in bannerMap[bannerUriMapping[0].uri]:
1626
                bannerObj.append(obj)
1627
            bannerObj.append(get_banner_details(bannerUriMapping[0].bannerName,bannerUriMapping[0].bannerType))
1628
            bannerMap[bannerUriMapping[0].uri] = bannerObj
1629
    return bannerMap
1630
 
1631
 
7770 kshitij.so 1632
 
6511 kshitij.so 1633
def get_all_tags ():
1634
    return [tuple[0] for tuple in session.query(EntityTag.tag).distinct().all()]
1635
 
1636
def get_all_entities_by_tag_name(displayName):
1637
    return [tuple[0] for tuple in session.query(EntityTag.entityId).filter_by(tag=displayName).all()]
7770 kshitij.so 1638
 
6511 kshitij.so 1639
def delete_tag(displayName):
1640
    session.query(EntityTag.entityId).filter_by(tag=displayName).delete()
1641
    session.commit()
1642
    return True
6518 kshitij.so 1643
 
1644
def delete_entity_tag(displayName, catalogId):
1645
    session.query(EntityTag.tag).filter_by(tag=displayName,entityId=catalogId).delete()
1646
    session.commit()
6805 anupam.sin 1647
    return True
1648
 
6921 anupam.sin 1649
def get_insurance_amount(itemId, price, insurerId, quantity):
9299 kshitij.so 1650
    if insurerId ==1:
1651
        #itemInsurerMapping = ItemInsurerMapping.query.filter(ItemInsurerMapping.itemId == itemId).filter(ItemInsurerMapping.insurerId == insurerId).first()
1652
        #if itemInsurerMapping:
1653
            #Default insurance premium is 1.5%
1654
        #    return round(price * (1.5/100) * quantity)
6921 anupam.sin 1655
        return round(price * (1.5/100) * quantity)
9299 kshitij.so 1656
        '''insuranceAmount = 0.0
1657
        if itemInsurerMapping.premiumType == PremiumType._NAMES_TO_VALUES.get("PERCENT"):
1658
            insuranceAmount = price * (itemInsurerMapping.premiumAmount/100) * quantity
1659
        else :
1660
            insuranceAmount = itemInsurerMapping.premiumAmount * quantity
1661
        '''
1662
    if insurerId ==2:
1663
        return 0.0 #FOR PROMOTION PURPOSE
1664
        #return 449.0 * quantity
7770 kshitij.so 1665
 
9299 kshitij.so 1666
    return 0.0
1667
 
1668
def get_preffered_insurer_for_item(itemId, insurerType):
1669
    itemInsurerMapping = ItemInsurerMapping.query.filter(ItemInsurerMapping.itemId == itemId).filter(ItemInsurerMapping.insurerType == insurerType).first()
1670
    if not itemInsurerMapping:
1671
        return 0
1672
    else:
1673
        return itemInsurerMapping.insurerId
1674
 
6805 anupam.sin 1675
def get_insurer(insurerId):
6838 vikram.rag 1676
    return Insurer.get_by(id = insurerId)
7770 kshitij.so 1677
 
6845 amit.gupta 1678
def get_all_entity_tags():
1679
    entitiesTag = EntityTag.query.all()
1680
    entityMap = {}
1681
    for e in entitiesTag:
1682
        if not entityMap.has_key(e.entityId):
1683
            entityMap[e.entityId] = []
7770 kshitij.so 1684
        entityMap[e.entityId].append(e.tag)  
6845 amit.gupta 1685
    return entityMap
6838 vikram.rag 1686
 
1687
 
1688
def get_all_insurers():
1689
    return session.query(Insurer).all()
7770 kshitij.so 1690
 
6962 rajveer 1691
def update_insurance_declared_amount(insurerId, amount):
1692
    insurer = Insurer.get_by(id = insurerId)
1693
    insurer.declaredAmount += amount
1694
    session.commit()
1695
    if insurer.declaredAmount > 0.9*insurer.creditedAmount:
7770 kshitij.so 1696
        __send_mail("CRITICAL: Declared Insurance Amount is critical (Declared Amount - " + str(insurer.declaredAmount) + " and Credited Amount - " + str(insurer.creditedAmount) +")", "Please top up credited amount")   
6962 rajveer 1697
    elif insurer.declaredAmount > 0.8*insurer.creditedAmount:
7770 kshitij.so 1698
        __send_mail("WARNING: Declared Insurance Amount is warning (Declared Amount - " + str(insurer.declaredAmount) + " and Credited Amount - " + str(insurer.creditedAmount) +")", "Please top up credited amount")   
1699
 
7190 amar.kumar 1700
def get_freebie_for_item(itemId):
1701
    freebie = FreebieItem.get_by(itemId = itemId)
1702
    if freebie is None:
1703
        return 0
1704
    else:
1705
        return freebie.freebieItemId
7770 kshitij.so 1706
 
7190 amar.kumar 1707
def add_or_update_freebie_for_item(freebieItem):
1708
    freebie = FreebieItem.get_by(itemId = freebieItem.itemId)
1709
    if freebie is None:
1710
        freebie = FreebieItem()
1711
        freebie.itemId = freebieItem.itemId
1712
    freebie.freebieItemId = freebieItem.freebieItemId
7256 rajveer 1713
    session.commit()
1714
 
7272 amit.gupta 1715
 
1716
def add_or_update_brand_info(brandInfo):
1717
    brandinfo = BrandInfo.get_by(name = brandInfo.name)
1718
    if brandinfo is None:
1719
        brandinfo = BrandInfo()
1720
        brandinfo.itemId = brandInfo.itemId
1721
        brandinfo.freebieItemId = brandInfo.freebieItemId
1722
    session.commit()
7770 kshitij.so 1723
 
7272 amit.gupta 1724
def get_brand_info():
1725
    brandInfoMap = dict()
8274 amit.gupta 1726
    brandInfoList = BrandInfo.query.all()
7272 amit.gupta 1727
    for brandInfo in brandInfoList:
1728
        brandInfoMap[brandInfo.name] = to_t_brand_info(brandInfo)
1729
    return brandInfoMap
1730
 
7382 rajveer 1731
def update_store_pricing(tsp, allColors):
7306 rajveer 1732
    validate_store_pricing(tsp)
7382 rajveer 1733
    item = get_item(tsp.itemId)
7419 rajveer 1734
    activeOnStore = item.activeOnStore
7382 rajveer 1735
    if allColors:
1736
        items = get_items_by_catalog_id(item.catalog_item_id)
1737
    else:
1738
        items = [item]
1739
    for item in items:
1740
        sp = StorePricing.get_by(item_id = item.id)
1741
        if not sp:
1742
            sp = StorePricing()
7419 rajveer 1743
        item.activeOnStore = activeOnStore
7382 rajveer 1744
        sp.recommendedPrice = tsp.recommendedPrice
1745
        sp.minPrice = tsp.minPrice
1746
        sp.minAdvancePrice = tsp.minAdvancePrice
1747
        sp.maxPrice = tsp.maxPrice
1748
        sp.item_id = item.id
1749
        sp.freebieItemId = tsp.freebieItemId
1750
        sp.bestDealText = tsp.bestDealText
1751
        sp.absoluteMinPrice = tsp.absoluteMinPrice
7265 rajveer 1752
    session.commit()
7770 kshitij.so 1753
 
1754
 
7306 rajveer 1755
def validate_store_pricing(tsp):
1756
    if tsp.minPrice > tsp.maxPrice:
7770 kshitij.so 1757
        raise InventoryServiceException(101, "DP is more than MRP")  
1758
 
7306 rajveer 1759
    item = get_item(tsp.itemId)
7770 kshitij.so 1760
 
7384 rajveer 1761
    if item.mrp and tsp.maxPrice > item.mrp:
1762
        raise InventoryServiceException(101, "MRP is more than Saholic MRP")
7770 kshitij.so 1763
 
7306 rajveer 1764
    if tsp.recommendedPrice < item.sellingPrice:
7770 kshitij.so 1765
        raise InventoryServiceException(101, "MOP is less than Saholic MOP.")  
1766
 
7306 rajveer 1767
    if tsp.recommendedPrice < tsp.minPrice or tsp.recommendedPrice >  tsp.maxPrice:
7770 kshitij.so 1768
        raise InventoryServiceException(101, "MOP price must be in the range")
8867 rajveer 1769
 
1770
#    if tsp.minPrice < item.sellingPrice:
1771
#        store_message = "Saholic MOP Changed. DP {0} is less than Saholic MOP.\n".format(tsp.minPrice)
1772
#        subject = "Item '{0}' is updated in Catalog. Id is {1}".format(__get_product_name(item),item.id)
1773
#        __send_mail(subject, store_message, to_store_addresses)
7770 kshitij.so 1774
 
7306 rajveer 1775
    return True
7770 kshitij.so 1776
 
1777
 
7306 rajveer 1778
 
1779
def get_defalut_store_pricing(itemId):
7256 rajveer 1780
    inventoryClient = InventoryClient().get_client()
7306 rajveer 1781
    pricings = inventoryClient.getAllItemPricing(itemId)
1782
    item = get_item(itemId)
7382 rajveer 1783
    maxp = item.sellingPrice
1784
    if item.mrp:
1785
        maxp = item.mrp
7770 kshitij.so 1786
 
7256 rajveer 1787
    minp = 0
7265 rajveer 1788
    rp = item.sellingPrice
7256 rajveer 1789
    for pricing in pricings:
7770 kshitij.so 1790
        if not minp or minp > pricing.dealerPrice:
7256 rajveer 1791
            minp = pricing.dealerPrice
1792
 
7770 kshitij.so 1793
 
7426 anupam.sin 1794
    minap = math.ceil(min(max(500, rp*0.1),rp))
7306 rajveer 1795
 
7431 rajveer 1796
    if minp > rp:
1797
        minp = rp
7306 rajveer 1798
    sp = tStorePricing()
1799
    sp.itemId = itemId
7256 rajveer 1800
    sp.recommendedPrice = rp
7351 rajveer 1801
    sp.absoluteMinPrice = minp
7256 rajveer 1802
    sp.minPrice = minp
1803
    sp.minAdvancePrice = minap
1804
    sp.maxPrice = maxp
7308 rajveer 1805
    sp.freebieItemId = 0
1806
    sp.bestDealText = ""
7306 rajveer 1807
    return sp
7770 kshitij.so 1808
 
1809
 
7256 rajveer 1810
def get_store_pricing(itemId):
7270 rajveer 1811
    store = StorePricing.get_by(item_id = itemId)
7306 rajveer 1812
    if store is None:
1813
        return get_defalut_store_pricing(itemId)
1814
 
7256 rajveer 1815
    sp = tStorePricing()
7770 kshitij.so 1816
    sp.itemId = itemId   
7256 rajveer 1817
    sp.recommendedPrice = store.recommendedPrice
1818
    sp.minPrice = store.minPrice
1819
    sp.minAdvancePrice = store.minAdvancePrice
1820
    sp.maxPrice = store.maxPrice
7351 rajveer 1821
    sp.absoluteMinPrice = store.absoluteMinPrice
7308 rajveer 1822
    sp.freebieItemId = store.freebieItemId
1823
    sp.bestDealText = store.bestDealText
7281 kshitij.so 1824
    return sp
1825
 
1826
def get_all_amazon_listed_items():
1827
    return session.query(Amazonlisted).all()
1828
 
1829
def get_amazon_item_details(amazonItemId):
1830
    amazonlisted = Amazonlisted.get_by(itemId=amazonItemId)
12363 kshitij.so 1831
    fbaPromo, fbbPromo = __get_amazon_promotion_attributes_for_item(amazonItemId)
1832
    return amazonlisted, fbaPromo, fbbPromo
7281 kshitij.so 1833
 
12663 kshitij.so 1834
 
8168 kshitij.so 1835
def update_amazon_item_details(amazonlisted):
1836
    amazon_listed = Amazonlisted.get_by(itemId = amazonlisted.itemid)
1837
    amazon_listed.isFba=amazonlisted.isFba
10909 vikram.rag 1838
    amazon_listed.isFbb=amazonlisted.isFbb
8168 kshitij.so 1839
    amazon_listed.isNonFba=amazonlisted.isNonFba
1840
    amazon_listed.isInventoryOverride=amazonlisted.isInventoryOverride
1841
    amazon_listed.handlingTime=amazonlisted.handlingTime
1842
    amazon_listed.isCustomTime=amazonlisted.isCustomTime
8619 kshitij.so 1843
    amazon_listed.taxCode=amazonlisted.taxCode
10909 vikram.rag 1844
    amazon_listed.fbbtaxCode=amazonlisted.fbbtaxCode
8619 kshitij.so 1845
    if (amazon_listed.sellingPrice != amazonlisted.sellingPrice) and amazonlisted.sellingPrice > 0:
8168 kshitij.so 1846
        amazon_listed.mfnPriceLastUpdatedOn = datetime.datetime.now()
1847
        amazon_listed.sellingPrice=amazonlisted.sellingPrice
8619 kshitij.so 1848
    if (amazon_listed.fbaPrice != amazonlisted.fbaPrice) and amazonlisted.fbaPrice > 0:
8168 kshitij.so 1849
        amazon_listed.fbaPriceLastUpdatedOn = datetime.datetime.now()
1850
        amazon_listed.fbaPrice=amazonlisted.fbaPrice
10909 vikram.rag 1851
    if (amazon_listed.fbbPrice != amazonlisted.fbbPrice) and amazonlisted.fbbPrice > 0:
1852
        amazon_listed.fbbPriceLastUpdatedOn = datetime.datetime.now()
1853
        amazon_listed.fbbPrice=amazonlisted.fbbPrice
8168 kshitij.so 1854
    amazon_listed.suppressMfnPriceUpdate=amazonlisted.suppressMfnPriceUpdate
10909 vikram.rag 1855
    amazon_listed.suppressFbaPriceUpdate=amazonlisted.suppressFbaPriceUpdate
12363 kshitij.so 1856
    amazon_listed.suppressFbbPriceUpdate=amazonlisted.suppressFbbPriceUpdate
1857
    amazon_listed.overrrideWanlc = amazonlisted.overrrideWanlc
1858
    amazon_listed.exceptionalWanlc = amazonlisted.exceptionalWanlc
12396 kshitij.so 1859
    amazon_listed.autoDecrement = amazonlisted.autoDecrement
1860
    amazon_listed.autoIncrement = amazonlisted.autoIncrement
1861
    amazon_listed.autoFavourite = amazonlisted.autoFavourite
1862
    amazon_listed.manualFavourite = amazonlisted.manualFavourite
12448 kshitij.so 1863
    amazon_listed.otherCost = amazonlisted.otherCost
12663 kshitij.so 1864
    if amazon_listed.fbaPromoPrice != amazonlisted.fbaPromoPrice and amazonlisted.fbaPromoPrice > 0:
1865
        amazon_listed.fbaPromoPrice = amazonlisted.fbaPromoPrice
1866
        amazon_listed.fbaPriceLastUpdatedOn = datetime.datetime.now()
1867
    if amazon_listed.fbbPromoPrice != amazonlisted.fbbPromoPrice and amazonlisted.fbbPromoPrice > 0:
1868
        amazon_listed.fbbPromoPrice = amazonlisted.fbbPromoPrice
1869
        amazon_listed.fbbPriceLastUpdatedOn = datetime.datetime.now()
7281 kshitij.so 1870
    session.commit()
7770 kshitij.so 1871
 
7281 kshitij.so 1872
def add_amazon_item(amazonlisted):
1873
    if (not amazonlisted) or (not amazonlisted.itemid) or (not amazonlisted.asin):
1874
        return
7397 kshitij.so 1875
    amazonItem = Amazonlisted.get_by(itemId=amazonlisted.itemid)
1876
    if amazonItem is None:
1877
        amazon_item = Amazonlisted()
1878
        if amazonlisted.itemid:
1879
            amazon_item.itemId=amazonlisted.itemid
1880
        if amazonlisted.asin:
1881
            amazon_item.asin=amazonlisted.asin
1882
        if amazonlisted.brand:
1883
            amazon_item.brand=amazonlisted.brand
1884
        else:
1885
            amazon_item.brand=''
1886
        if amazonlisted.model:
1887
            amazon_item.model=amazonlisted.model
1888
        else:
1889
            amazon_item.model=''
1890
        if amazonlisted.manufacturer_name:
1891
            amazon_item.manufacturer_name=amazonlisted.manufacturer_name
1892
        else:
1893
            amazon_item.manufacturer_name=''
1894
        if amazonlisted.name:
1895
            amazon_item.name=amazonlisted.name
1896
        else:
1897
            amazon_item.name=''
1898
        if amazonlisted.part_number:
1899
            amazon_item.part_number=amazonlisted.part_number
1900
        else:
1901
            amazon_item.part_number=''
1902
        if amazonlisted.ean:
1903
            amazon_item.ean=amazonlisted.ean
1904
        else:
1905
            amazon_item.ean=''
1906
        if amazonlisted.upc:
1907
            amazon_item.upc=amazonlisted.upc
1908
        else:
1909
            amazon_item.upc=''
7770 kshitij.so 1910
        if amazonlisted.fbaPrice:
1911
            amazon_item.fbaPrice=amazonlisted.fbaPrice
7782 kshitij.so 1912
            amazon_item.fbaPriceLastUpdatedOnSc =  datetime.datetime.now()
7770 kshitij.so 1913
            amazon_item.fbaPriceLastUpdatedOn = datetime.datetime.now()
7397 kshitij.so 1914
        if amazonlisted.sellingPrice:
1915
            amazon_item.sellingPrice=amazonlisted.sellingPrice
7782 kshitij.so 1916
            amazon_item.mfnPriceLastUpdatedOnSc = datetime.datetime.now()
7770 kshitij.so 1917
            amazon_item.mfnPriceLastUpdatedOn = datetime.datetime.now()
7397 kshitij.so 1918
        if amazonlisted.category:
1919
            amazon_item.category=amazonlisted.category
1920
        else:
1921
            amazon_item.category=''
1922
        if amazonlisted.color:
1923
            amazon_item.color=amazonlisted.color
1924
        else:
7404 kshitij.so 1925
            amazon_item.color=''
8139 kshitij.so 1926
        amazon_item.suppressMfnPriceUpdate=False
8140 kshitij.so 1927
        amazon_item.suppressFbaPriceUpdate=False
8379 vikram.rag 1928
        amazon_item.isFba = False
1929
        amazon_item.isNonFba = False
1930
        amazon_item.isInventoryOverride = False
10947 vikram.rag 1931
        if amazonlisted.fbbPrice: 
1932
            amazon_item.fbbPrice = amazonlisted.fbbPrice 
1933
            amazon_item.fbbPriceLastUpdatedOnSc = datetime.datetime.now()
1934
            amazon_item.fbbPriceLastUpdatedOn = datetime.datetime.now()
10921 vikram.rag 1935
        amazon_item.isFbb = False
10909 vikram.rag 1936
        amazon_item.suppressFbbPriceUpdate = False
1937
 
7397 kshitij.so 1938
    elif (amazonItem.asin!=amazonlisted.asin):
1939
        if amazonlisted.asin:
1940
            amazonItem.asin=amazonlisted.asin
1941
        if amazonlisted.brand:
1942
            amazonItem.brand=amazonlisted.brand
1943
        else:
1944
            amazonItem.brand=''
1945
        if amazonlisted.model:
1946
            amazonItem.model=amazonlisted.model
1947
        else:
1948
            amazonItem.model=''
1949
        if amazonlisted.manufacturer_name:
1950
            amazonItem.manufacturer_name=amazonlisted.manufacturer_name
1951
        else:
1952
            amazonItem.manufacturer_name=''
1953
        if amazonlisted.name:
1954
            amazonItem.name=amazonlisted.name
1955
        else:
1956
            amazonItem.name=''
1957
        if amazonlisted.part_number:
1958
            amazonItem.part_number=amazonlisted.part_number
1959
        else:
1960
            amazonItem.part_number=''
1961
        if amazonlisted.ean:
1962
            amazonItem.ean=amazonlisted.ean
1963
        else:
1964
            amazonItem.ean=''
1965
        if amazonlisted.upc:
1966
            amazonItem.upc=amazonlisted.upc
1967
        else:
1968
            amazonItem.upc=''
1969
        if amazonlisted.sellingPrice:
8188 kshitij.so 1970
            amazonItem.sellingPrice=amazonlisted.sellingPrice
7397 kshitij.so 1971
        if amazonlisted.fbaPrice:
8188 kshitij.so 1972
            amazonItem.fbaPrice=amazonlisted.fbaPrice
7397 kshitij.so 1973
        if amazonlisted.isFba:
1974
            amazonItem.isFba=amazonlisted.isFba
1975
        if amazonlisted.isNonFba:
1976
            amazonItem.isNonFba=amazonlisted.isNonFba
1977
        if amazonlisted.isInventoryOverride:
1978
            amazonItem.isInventoryOverride=amazonlisted.isInventoryOverride
1979
        if amazonlisted.category:
1980
            amazonItem.category=amazonlisted.category
1981
        else:
1982
            amazonItem.category=''
1983
        if amazonlisted.color:
1984
            amazonItem.color=amazonlisted.color
1985
        else:
7404 kshitij.so 1986
            amazonItem.color=''
7316 kshitij.so 1987
    else:
7397 kshitij.so 1988
        return
7281 kshitij.so 1989
    session.commit()
7770 kshitij.so 1990
 
7291 vikram.rag 1991
def get_asin_items():
7296 amit.gupta 1992
    from_date=datetime.datetime.now() - datetime.timedelta(days=10)
7291 vikram.rag 1993
    return Item.query.filter(Item.updatedOn > from_date).all()
7770 kshitij.so 1994
 
7291 vikram.rag 1995
def get_all_fba_listed_items():
1996
    return Amazonlisted.query.filter(Amazonlisted.isFba==True).all()
7770 kshitij.so 1997
 
7291 vikram.rag 1998
def get_all_nonfba_listed_items():
1999
    return Amazonlisted.query.filter(Amazonlisted.isNonFba==True).all()
7460 kshitij.so 2000
 
2001
def update_item_inventory(itemId,holdInventory,defaultInventory):
2002
    item = get_item(itemId)
2003
    item.holdInventory = holdInventory
2004
    item.defaultInventory = defaultInventory
2005
    session.commit()
7770 kshitij.so 2006
 
2007
def update_timestamp_for_amazon_feeds(feedType,skuList,timestamp):
2008
    #amazonListed = get_all_amazon_listed_items()
7782 kshitij.so 2009
    #fbaItems = []
2010
    #mfnItems = []
7770 kshitij.so 2011
    if feedType == 'NonFbaPricing':
7782 kshitij.so 2012
        for sku in skuList:
7770 kshitij.so 2013
            amazonItem = Amazonlisted.get_by(itemId=sku)
2014
            amazonItem.mfnPriceLastUpdatedOnSc = to_py_date(timestamp)
2015
            session.commit()
2016
        return True
2017
    elif feedType == 'FbaPricing':
7782 kshitij.so 2018
        for sku in skuList:
7770 kshitij.so 2019
            amazonItem = Amazonlisted.get_by(itemId=sku)
2020
            amazonItem.fbaPriceLastUpdatedOnSc = to_py_date(timestamp)
2021
            session.commit()
2022
        return True
10924 vikram.rag 2023
    elif feedType == 'FbbPricing':
2024
        for sku in skuList:
2025
            amazonItem = Amazonlisted.get_by(itemId=sku)
2026
            amazonItem.fbbPriceLastUpdatedOnSc = to_py_date(timestamp)
2027
            session.commit()
2028
        return True
7770 kshitij.so 2029
    elif feedType== 'FullFbaPricing':
7782 kshitij.so 2030
        for sku in skuList:
7770 kshitij.so 2031
            amazonItem = Amazonlisted.get_by(itemId=sku)
2032
            amazonItem.fbaPriceLastUpdatedOnSc = to_py_date(timestamp)
2033
            session.commit()
2034
        return True
2035
    elif feedType== 'FullNonFbaPricing':
7782 kshitij.so 2036
        for sku in skuList:
7770 kshitij.so 2037
            amazonItem = Amazonlisted.get_by(itemId=sku)
2038
            amazonItem.mfnPriceLastUpdatedOnSc = to_py_date(timestamp)
2039
            session.commit()
8386 vikram.rag 2040
    elif (feedType=='FbaListingFeed'):
2041
        for sku in skuList:
2042
            amazonItem = Amazonlisted.get_by(itemId=sku)
2043
            amazonItem.isFba = True
2044
            session.commit()
2045
    elif (feedType=='NonFbaListingFeed'):
2046
        for sku in skuList:
2047
            amazonItem = Amazonlisted.get_by(itemId=sku)
2048
            amazonItem.isNonFba = True 
2049
            session.commit()
10920 vikram.rag 2050
    elif (feedType=='FbbListingFeed'):
2051
        for sku in skuList:
2052
            amazonItem = Amazonlisted.get_by(itemId=sku)
2053
            amazonItem.fbbListedOn = to_py_date(timestamp) 
2054
            session.commit()
7770 kshitij.so 2055
    else:
2056
        return False
7281 kshitij.so 2057
 
7897 amar.kumar 2058
def get_all_parent_categories():
2059
    return Category.query.filter_by(parent_category_id=10000).all()
7977 kshitij.so 2060
 
2061
def add_page_view_event(pageEvent):
2062
    page_view_event = PageViewEvents()
2063
    page_view_event.catalogId = pageEvent.catalogId
2064
    page_view_event.url = pageEvent.url
2065
    page_view_event.sellingPrice = pageEvent.sellingPrice
2066
    page_view_event.ip = pageEvent.ip
2067
    page_view_event.sessionId = pageEvent.sessionId
2068
    page_view_event.comingSoon = pageEvent.comingSoon
2069
    page_view_event.eventTimestamp = to_py_date(pageEvent.eventDate)
2070
    session.commit()
2071
 
2072
def add_cart_event(cartEvent):
2073
    cart_event = CartEvents()
2074
    cart_event.catalogId = cartEvent.catalogId
2075
    cart_event.itemId = cartEvent.itemId
2076
    cart_event.inStock = cartEvent.inStock
2077
    cart_event.ip = cartEvent.ip
2078
    cart_event.sessionId = cartEvent.sessionId
2079
    cart_event.comingSoon = cartEvent.comingSoon
2080
    cart_event.sellingPrice = cartEvent.sellingPrice
2081
    cart_event.eventTimestamp = to_py_date(cartEvent.eventDate)
2082
    session.commit()
8168 kshitij.so 2083
 
2084
def update_amazon_attributes_in_bulk(amazonlistedMap):
2085
    for itemId,amazonlisted in amazonlistedMap.iteritems():
12407 kshitij.so 2086
        amazon_item = (get_amazon_item_details(itemId))[0]
8168 kshitij.so 2087
        if amazon_item is not None:
2088
            if amazon_item.sellingPrice != amazonlisted.sellingPrice:
2089
                amazon_item.mfnPriceLastUpdatedOn = datetime.datetime.now()
2090
                amazon_item.sellingPrice = amazonlisted.sellingPrice
2091
            if amazon_item.fbaPrice != amazonlisted.fbaPrice:
2092
                amazon_item.fbaPriceLastUpdatedOn = datetime.datetime.now()
2093
                amazon_item.fbaPrice = amazonlisted.fbaPrice
10909 vikram.rag 2094
            if amazon_item.fbbPrice != amazonlisted.fbbPrice:
2095
                amazon_item.fbbPriceLastUpdatedOn = datetime.datetime.now()
2096
                amazon_item.fbbPrice = amazonlisted.fbbPrice
10929 vikram.rag 2097
            amazon_item.fbbtaxCode = amazonlisted.fbbtaxCode    
8619 kshitij.so 2098
            amazon_item.taxCode = amazonlisted.taxCode
10909 vikram.rag 2099
            amazon_item.isFbb = amazonlisted.isFbb
8168 kshitij.so 2100
            amazon_item.isFba = amazonlisted.isFba
2101
            amazon_item.isNonFba = amazonlisted.isNonFba
2102
            amazon_item.isInventoryOverride = amazonlisted.isInventoryOverride
2103
            amazon_item.suppressMfnPriceUpdate = amazonlisted.suppressMfnPriceUpdate
2104
            amazon_item.suppressFbaPriceUpdate = amazonlisted.suppressFbaPriceUpdate
10909 vikram.rag 2105
            amazon_item.suppressFbbPriceUpdate = amazonlisted.suppressFbbPriceUpdate
12505 kshitij.so 2106
            amazon_item.otherCost = amazonlisted.otherCost
8168 kshitij.so 2107
            session.commit()
2108
    return True
2109
 
7977 kshitij.so 2110
 
8182 amar.kumar 2111
def insert_ebay_item(ebayItem):
8241 amar.kumar 2112
    ebay_item = EbayItem.get_by(ebayListingId = ebayItem.ebayListingId)
2113
    if ebay_item is None:
2114
        ebay_item = EbayItem()
8182 amar.kumar 2115
    ebay_item.ebayListingId = ebayItem.ebayListingId
2116
    ebay_item.itemId = ebayItem.itemId
2117
    ebay_item.listingName = ebayItem.listingName
2118
    ebay_item.listingPrice = ebayItem.listingPrice
8281 amar.kumar 2119
    ebay_item.listingExpiryDate = to_py_date(ebayItem.listingExpiryDate)
8182 amar.kumar 2120
    ebay_item.subsidy = ebayItem.subsidy
2121
    ebay_item.defaultWarehouseId = ebayItem.defaultWarehouseId
2122
    session.commit()
2123
 
7977 kshitij.so 2124
 
8182 amar.kumar 2125
def get_ebay_item(listing_id):
2126
    ebay_item = EbayItem.get_by(ebayListingId = listing_id)
2127
    return ebay_item
7977 kshitij.so 2128
 
8182 amar.kumar 2129
 
2130
def update_ebay_item(ebayItem):
2131
    ebay_item = EbayItem.get_by(ebayListingId = ebayItem.ebayListingId)
2132
    #if ebay_item.listingExpiryDate < datetime.datetime.now():
2133
    ebay_item.listingName = ebayItem.listingName
2134
    ebay_item.listingPrice = ebayItem.listingPrice
2135
    ebay_item.listingExpiryDate = ebayItem.listingExpiryDate
2136
    ebay_item.subsidy = ebayItem.subsidy
2137
    ebay_item.defaultWarehouseId = ebayItem.defaultWarehouseId
2138
    session.commit()
8379 vikram.rag 2139
 
2140
def get_all_items_to_list_on_fba():
2141
    return Amazonlisted.query.filter(Amazonlisted.isFba==False).all()
2142
 
2143
def get_all_items_to_list_on_nonfba():
2144
    return Amazonlisted.query.filter(Amazonlisted.isNonFba==False).all()
8182 amar.kumar 2145
 
8619 kshitij.so 2146
def get_amazon_listed_items(offset,limit):
2147
    return session.query(Amazonlisted).offset(offset).limit(limit).all()
2148
 
2149
def search_amazon_items(search_terms, offset, limit):
2150
    query = Amazonlisted.query
2151
 
2152
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2153
 
2154
    for search_term in search_terms:
2155
        query_clause = []
2156
        query_clause.append(Amazonlisted.itemId.like(search_term))
2157
        query_clause.append(Amazonlisted.brand.like(search_term))
2158
        query_clause.append(Amazonlisted.model.like(search_term))
2159
        query_clause.append(Amazonlisted.name.like(search_term))
2160
        query_clause.append(Amazonlisted.asin.like(search_term))
2161
        query = query.filter(or_(*query_clause))
2162
 
2163
    query = query.offset(offset)
2164
    if limit:
2165
        query = query.limit(limit)
2166
    amazon_items = query.all()
2167
    return amazon_items
2168
 
2169
def get_amazon_search_result_count(search_terms):
2170
    query = Amazonlisted.query
2171
 
2172
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2173
 
2174
    for search_term in search_terms:
2175
        query_clause = []
2176
        query_clause.append(Amazonlisted.itemId.like(search_term))
2177
        query_clause.append(Amazonlisted.brand.like(search_term))
2178
        query_clause.append(Amazonlisted.model.like(search_term))
2179
        query_clause.append(Amazonlisted.name.like(search_term))
2180
        query_clause.append(Amazonlisted.asin.like(search_term))
2181
        query = query.filter(or_(*query_clause))
2182
 
2183
    return query.count()
2184
 
2185
def get_count_for_amazonlisted_items():
2186
    return session.query(func.count(Amazonlisted.itemId)).scalar()
2187
 
8739 vikram.rag 2188
def add_or_update_snapdeal_item(snapdealitem):
2189
    item = SnapdealItem.get_by(item_id=snapdealitem.item_id)
9779 kshitij.so 2190
    if not __validateSnapdealObject(snapdealitem):
2191
        print "Bad object"
2192
        return False
8739 vikram.rag 2193
    try:
2194
        if item is not None:
10097 kshitij.so 2195
            itemHistory = MarketPlaceUpdateHistory()
9242 kshitij.so 2196
            itemHistory.item_id = snapdealitem.item_id
10097 kshitij.so 2197
            itemHistory.source = OrderSource.SNAPDEAL
9242 kshitij.so 2198
            itemHistory.exceptionPrice = item.exceptionPrice
2199
            itemHistory.warehouseId = item.warehouseId
10097 kshitij.so 2200
            itemHistory.isListedOnSource = item.isListedOnSnapdeal
9242 kshitij.so 2201
            itemHistory.transferPrice = item.transferPrice
2202
            itemHistory.sellingPrice = item.sellingPrice
2203
            itemHistory.courierCost = item.courierCost
2204
            itemHistory.commission = item.commission
2205
            itemHistory.serviceTax = item.serviceTax
2206
            itemHistory.suppressPriceFeed = item.suppressPriceFeed
2207
            itemHistory.suppressInventoryFeed = item.suppressInventoryFeed
2208
            itemHistory.updatedOn = item.updatedOn
9478 kshitij.so 2209
            itemHistory.maxNlc = item.maxNlc
10097 kshitij.so 2210
            itemHistory.skuAtSource = item.skuAtSnapdeal
2211
            itemHistory.marketPlaceSerialNumber = item.supc
9779 kshitij.so 2212
            itemHistory.priceUpdatedBy = item.priceUpdatedBy
11095 kshitij.so 2213
            itemHistory.courierCostMarketplace = item.courierCostMarketplace
9242 kshitij.so 2214
 
9779 kshitij.so 2215
            if (item.sellingPrice!=snapdealitem.sellingPrice):
2216
                item.priceUpdatedBy = snapdealitem.updatedBy
2217
 
8739 vikram.rag 2218
            if snapdealitem.exceptionPrice is not None:
2219
                item.exceptionPrice = snapdealitem.exceptionPrice
2220
            if snapdealitem.warehouseId is not None:     
2221
                item.warehouseId = snapdealitem.warehouseId
2222
            if snapdealitem.isListedOnSnapdeal is not None:    
9242 kshitij.so 2223
                item.isListedOnSnapdeal = snapdealitem.isListedOnSnapdeal
2224
            if snapdealitem.transferPrice is not None:
2225
                item.transferPrice = snapdealitem.transferPrice
2226
            if snapdealitem.sellingPrice is not None:
2227
                item.sellingPrice = snapdealitem.sellingPrice
2228
            if snapdealitem.courierCost is not None:
2229
                item.courierCost = snapdealitem.courierCost    
2230
            if snapdealitem.commission is not None:
2231
                item.commission = snapdealitem.commission
2232
            if snapdealitem.serviceTax is not None:
2233
                item.serviceTax = snapdealitem.serviceTax
2234
            item.suppressPriceFeed =snapdealitem.suppressPriceFeed
9478 kshitij.so 2235
            item.suppressInventoryFeed =snapdealitem.suppressInventoryFeed
9581 kshitij.so 2236
            if snapdealitem.maxNlc is not None:
2237
                item.maxNlc = snapdealitem.maxNlc
9478 kshitij.so 2238
            item.skuAtSnapdeal = snapdealitem.skuAtSnapdeal
9242 kshitij.so 2239
            item.updatedOn = datetime.datetime.now()
9568 kshitij.so 2240
            item.supc = snapdealitem.supc
11095 kshitij.so 2241
            item.courierCostMarketplace = snapdealitem.courierCostMarketplace
9779 kshitij.so 2242
            __markStatusForMarketplaceItems(snapdealitem,item)
2243
            return update_marketplace_attributes_for_item(snapdealitem.marketplaceItems)
8739 vikram.rag 2244
        else:
2245
            item = SnapdealItem()
2246
            if snapdealitem.item_id is not None:
2247
                item.item_id = snapdealitem.item_id
2248
                if snapdealitem.exceptionPrice is not None:
2249
                    item.exceptionPrice = snapdealitem.exceptionPrice
2250
                if snapdealitem.warehouseId is not None:    
2251
                    item.warehouseId = snapdealitem.warehouseId
2252
                if snapdealitem.isListedOnSnapdeal is not None: 
9242 kshitij.so 2253
                    item.isListedOnSnapdeal = snapdealitem.isListedOnSnapdeal
2254
                if snapdealitem.transferPrice is not None:
2255
                    item.transferPrice = snapdealitem.transferPrice
2256
                if snapdealitem.sellingPrice is not None:
2257
                    item.sellingPrice = snapdealitem.sellingPrice
2258
                if snapdealitem.courierCost is not None:
2259
                    item.courierCost = snapdealitem.courierCost    
2260
                if snapdealitem.commission is not None:
2261
                    item.commission = snapdealitem.commission
2262
                if snapdealitem.serviceTax is not None:
2263
                    item.serviceTax = snapdealitem.serviceTax
2264
                item.suppressPriceFeed =snapdealitem.suppressPriceFeed
2265
                item.suppressInventoryFeed =snapdealitem.suppressInventoryFeed 
9595 kshitij.so 2266
                item.maxNlc = snapdealitem.maxNlc
9478 kshitij.so 2267
                item.skuAtSnapdeal = snapdealitem.skuAtSnapdeal
9568 kshitij.so 2268
                item.supc = snapdealitem.supc
9779 kshitij.so 2269
                item.updatedOn = datetime.datetime.now()  
2270
                item.priceUpdatedBy = snapdealitem.updatedBy
11095 kshitij.so 2271
                item.courierCostMarketplace = snapdealitem.courierCostMarketplace
9779 kshitij.so 2272
                __markStatusForMarketplaceItems(snapdealitem,item)
2273
                return update_marketplace_attributes_for_item(snapdealitem.marketplaceItems)  
2274
    except Exception as ex:
2275
        print "Unable to addOrupdate snapdealItem"
2276
        print ex
9242 kshitij.so 2277
        return False
8739 vikram.rag 2278
 
2279
def get_snapdeal_item(itemid):
8755 vikram.rag 2280
    item = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).filter(SnapdealItem.item_id==itemid).first()
8747 vikram.rag 2281
    return item
9724 kshitij.so 2282
 
2283
def get_snapdeal_item_detail(itemid):
2284
    item = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).filter(SnapdealItem.item_id==itemid).first()
2285
    try:
2286
        client = InventoryClient().get_client()
2287
        SnapdealInventoryItem = client.getSnapdealInventoryForItem(itemid)
2288
        return item, SnapdealInventoryItem
2289
    except Exception as e:
2290
        print e
2291
        return item,None
8739 vikram.rag 2292
 
2293
def get_all_snapdeal_items():
8754 vikram.rag 2294
    items = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).all()
8739 vikram.rag 2295
    return items
2296
 
9242 kshitij.so 2297
def get_snapdeal_items(offset,limit):
2298
    return session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).offset(offset).limit(limit).all()
2299
 
8619 kshitij.so 2300
def update_asin(amazonAsinMap):
2301
    for item_id,t_item in amazonAsinMap.iteritems():
2302
        item = get_item(item_id)
2303
        item.asin=t_item.asin
2304
        item.defaultInventory = t_item.defaultInventory
2305
        item.holdInventory = t_item.holdInventory
2306
        item.updatedOn = datetime.datetime.now()
2307
    session.commit()
9242 kshitij.so 2308
 
2309
def search_snapdeal_items(search_terms,offset,limit):
2310
    query = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id))
2311
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2312
    for search_term in search_terms:
2313
        query_clause = []
2314
        query_clause.append(Item.id.like(search_term))
2315
        query_clause.append(Item.brand.like(search_term))
2316
        query_clause.append(Item.model_name.like(search_term))
2317
        query_clause.append(Item.model_number.like(search_term))
2318
        query_clause.append(Item.color.like(search_term))
2319
        query = query.filter(or_(*query_clause))
2320
 
2321
    query = query.offset(offset)
2322
    if limit:
2323
        query = query.limit(limit)
2324
    snapdeal_items = query.all()
2325
    return snapdeal_items
2326
 
2327
def get_snapdeal_search_result_count(search_terms):
2328
    query = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id))
2329
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2330
    for search_term in search_terms:
2331
        query_clause = []
2332
        query_clause.append(Item.id.like(search_term))
2333
        query_clause.append(Item.brand.like(search_term))
2334
        query_clause.append(Item.model_name.like(search_term))
2335
        query_clause.append(Item.model_number.like(search_term))
2336
        query_clause.append(Item.color.like(search_term))
2337
        query = query.filter(or_(*query_clause))
2338
    return query.count()
2339
 
2340
def get_count_for_snapdeal_items():
2341
    return session.query(func.count(SnapdealItem.item_id)).scalar()
2342
 
9456 vikram.rag 2343
def get_snapdealitem_by_skuatsnapdeal(sku):
2344
    snapdeal_item = SnapdealItem.get_by(skuAtSnapdeal=sku)
2345
    if snapdeal_item is not None: 
2346
        item = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).filter(SnapdealItem.item_id==snapdeal_item.item_id).first()
2347
    else:
2348
        return None    
2349
    return item
9242 kshitij.so 2350
 
9621 manish.sha 2351
def get_product_feed_submit(catalog_itemId):
2352
    product_feedsubmit = ProductFeedSubmit.get_by(catalogItemId=catalog_itemId)
2353
    return product_feedsubmit
9456 vikram.rag 2354
 
9621 manish.sha 2355
def add_product_feed_submit(productFeedSubmit):
2356
    feedSubmit = ProductFeedSubmit()
2357
    feedSubmit.catalogItemId = productFeedSubmit.catalogItemId
2358
    feedSubmit.stockLinkedFeed = productFeedSubmit.stockLinkedFeed
2359
    session.commit()
2360
    return True
2361
 
2362
def update_product_feed_submit(productFeedSubmit):
2363
    feedSubmit = get_product_feed_submit(productFeedSubmit.catalogItemId)
2364
    if feedSubmit:
2365
        feedSubmit.catalogItemId = productFeedSubmit.catalogItemId
2366
        feedSubmit.stockLinkedFeed = productFeedSubmit.stockLinkedFeed
2367
        session.commit()
2368
        return True
2369
    return False
2370
 
2371
def delete_product_feed_submit(catalog_itemId):
2372
    feedSubmit = get_product_feed_submit(catalog_itemId)
2373
    if feedSubmit:
2374
        feedSubmit.delete()
2375
        session.commit()
2376
        return True
2377
    return False
2378
 
2379
def get_all_product_feed_submit():
2380
    print session.query(ProductFeedSubmit).all()
2381
    return session.query(ProductFeedSubmit).all()
2382
 
9724 kshitij.so 2383
def get_marketplace_details_for_item(item_id, sourceId):
2384
    return MarketplaceItems.get_by(itemId=item_id,source=sourceId)
2385
 
2386
def update_marketplace_attributes_for_item(t_marketplaceItem):
2387
    if t_marketplaceItem.source is None or t_marketplaceItem.itemId is None:
2388
        return False
2389
    try:
2390
        marketplaceItem = get_marketplace_details_for_item(t_marketplaceItem.itemId,t_marketplaceItem.source)
2391
        if marketplaceItem is None:
2392
            marketplaceItem = MarketplaceItems()
2393
            marketplaceItem.itemId = t_marketplaceItem.itemId
2394
            marketplaceItem.source = t_marketplaceItem.source
9779 kshitij.so 2395
            marketplaceItem.emiFee = t_marketplaceItem.emiFee
2396
            marketplaceItem.closingFee = t_marketplaceItem.closingFee
2397
            marketplaceItem.returnProvision = t_marketplaceItem.returnProvision
2398
            marketplaceItem.commission = t_marketplaceItem.commission
9724 kshitij.so 2399
            marketplaceItem.vat = t_marketplaceItem.vat
12133 kshitij.so 2400
            if marketplaceItem.source == OrderSource.SNAPDEAL:
2401
                marketplaceItem.packagingCost = t_marketplaceItem.packagingCost
2402
            else:
2403
                marketplaceItem.packagingCost = 15.0
9779 kshitij.so 2404
            marketplaceItem.serviceTax = t_marketplaceItem.serviceTax
9724 kshitij.so 2405
            marketplaceItem.courierCost = t_marketplaceItem.courierCost
2406
            marketplaceItem.otherCost = t_marketplaceItem.otherCost
2407
            marketplaceItem.autoIncrement = t_marketplaceItem.autoIncrement
2408
            marketplaceItem.autoDecrement = t_marketplaceItem.autoDecrement
2409
            marketplaceItem.manualFavourite = t_marketplaceItem.manualFavourite
2410
            marketplaceItem.currentSp = t_marketplaceItem.currentSp
2411
            marketplaceItem.currentTp = t_marketplaceItem.currentTp
2412
            marketplaceItem.minimumPossibleSp = t_marketplaceItem.minimumPossibleSp
2413
            marketplaceItem.minimumPossibleTp = t_marketplaceItem.minimumPossibleTp
9923 kshitij.so 2414
            marketplaceItem.maximumSellingPrice = t_marketplaceItem.maximumSellingPrice
10287 kshitij.so 2415
            marketplaceItem.pgFee = t_marketplaceItem.pgFee
11095 kshitij.so 2416
            marketplaceItem.courierCostMarketplace = t_marketplaceItem.courierCostMarketplace
9724 kshitij.so 2417
        else:
2418
            marketplaceItem.courierCost = t_marketplaceItem.courierCost
2419
            marketplaceItem.otherCost = t_marketplaceItem.otherCost
2420
            marketplaceItem.autoIncrement = t_marketplaceItem.autoIncrement
2421
            marketplaceItem.autoDecrement = t_marketplaceItem.autoDecrement
2422
            marketplaceItem.manualFavourite = t_marketplaceItem.manualFavourite
2423
            marketplaceItem.currentSp = t_marketplaceItem.currentSp
2424
            marketplaceItem.currentTp = t_marketplaceItem.currentTp
2425
            marketplaceItem.minimumPossibleSp = t_marketplaceItem.minimumPossibleSp
2426
            marketplaceItem.minimumPossibleTp = t_marketplaceItem.minimumPossibleTp
9779 kshitij.so 2427
            marketplaceItem.emiFee = t_marketplaceItem.emiFee
2428
            marketplaceItem.closingFee = t_marketplaceItem.closingFee
2429
            marketplaceItem.returnProvision = t_marketplaceItem.returnProvision
2430
            marketplaceItem.commission = t_marketplaceItem.commission
12133 kshitij.so 2431
            if marketplaceItem.source == OrderSource.SNAPDEAL:
2432
                marketplaceItem.packagingCost = t_marketplaceItem.packagingCost
2433
            else:
2434
                marketplaceItem.packagingCost = 15.0
9779 kshitij.so 2435
            marketplaceItem.vat = t_marketplaceItem.vat
2436
            marketplaceItem.serviceTax = t_marketplaceItem.serviceTax
9923 kshitij.so 2437
            marketplaceItem.maximumSellingPrice = t_marketplaceItem.maximumSellingPrice
10287 kshitij.so 2438
            marketplaceItem.pgFee = t_marketplaceItem.pgFee
11095 kshitij.so 2439
            marketplaceItem.courierCostMarketplace = t_marketplaceItem.courierCostMarketplace
9724 kshitij.so 2440
        session.commit()
2441
        return True
2442
    except Exception as ex:
9779 kshitij.so 2443
        print "Unable to addOrupdate MarketplaceItem"
9724 kshitij.so 2444
        print ex
2445
        return False
9779 kshitij.so 2446
 
2447
def __markStatusForMarketplaceItems(snapdealItem,item):
2448
    try:
2449
        marketplaceItem = snapdealItem.marketplaceItems
2450
        markUpdatedItem = MarketPlaceItemPrice.query.filter(MarketPlaceItemPrice.item_id==snapdealItem.item_id).filter(MarketPlaceItemPrice.source==marketplaceItem.source).first()
2451
        if markUpdatedItem is None:
2452
            marketPlaceItemPrice = MarketPlaceItemPrice()
2453
            marketPlaceItemPrice.item_id = snapdealItem.item_id
2454
            marketPlaceItemPrice.source = marketplaceItem.source
2455
            marketPlaceItemPrice.lastUpdatedOn = item.updatedOn
2456
            marketPlaceItemPrice.sellingPrice = item.sellingPrice 
2457
            marketPlaceItemPrice.suppressPriceFeed = item.suppressPriceFeed
2458
            marketPlaceItemPrice.isListedOnSource = item.isListedOnSnapdeal
2459
        else:
2460
            if (markUpdatedItem.sellingPrice!=snapdealItem.sellingPrice or markUpdatedItem.suppressPriceFeed!=item.suppressPriceFeed or markUpdatedItem.isListedOnSource!=item.isListedOnSnapdeal):
2461
                markUpdatedItem.lastUpdatedOn = item.updatedOn
2462
            markUpdatedItem.sellingPrice = snapdealItem.sellingPrice
2463
            markUpdatedItem.suppressPriceFeed = item.suppressPriceFeed
2464
            markUpdatedItem.isListedOnSource = item.isListedOnSnapdeal
2465
        return True
2466
    except Exception as e:
2467
        print e
2468
        return False
9724 kshitij.so 2469
 
10097 kshitij.so 2470
def __markStatusForFlipkartItems(flipkartItem,item):
2471
    try:
2472
        marketplaceItem = flipkartItem.marketplaceItems
2473
        markUpdatedItem = MarketPlaceItemPrice.query.filter(MarketPlaceItemPrice.item_id==flipkartItem.item_id).filter(MarketPlaceItemPrice.source==marketplaceItem.source).first()
2474
        if markUpdatedItem is None:
2475
            marketPlaceItemPrice = MarketPlaceItemPrice()
2476
            marketPlaceItemPrice.item_id = flipkartItem.item_id
2477
            marketPlaceItemPrice.source = marketplaceItem.source
2478
            marketPlaceItemPrice.lastUpdatedOn = item.updatedOn
2479
            marketPlaceItemPrice.sellingPrice = marketplaceItem.currentSp 
2480
            marketPlaceItemPrice.suppressPriceFeed = item.suppressPriceFeed
2481
            marketPlaceItemPrice.isListedOnSource = item.isListedOnFlipkart
2482
        else:
2483
            if (markUpdatedItem.sellingPrice!=marketplaceItem.currentSp or markUpdatedItem.suppressPriceFeed!=item.suppressPriceFeed or markUpdatedItem.isListedOnSource!=item.isListedOnFlipkart):
2484
                markUpdatedItem.lastUpdatedOn = item.updatedOn
2485
            markUpdatedItem.sellingPrice = marketplaceItem.currentSp
2486
            markUpdatedItem.suppressPriceFeed = item.suppressPriceFeed
2487
            markUpdatedItem.isListedOnSource = item.isListedOnFlipkart
2488
        return True
2489
    except Exception as e:
2490
        print e
2491
        return False
2492
 
2493
 
9779 kshitij.so 2494
def get_costing_for_marketplace(source_id,itemId):
12133 kshitij.so 2495
    d_item = get_item(itemId)
10097 kshitij.so 2496
    time = datetime.datetime.now()
2497
    sip = SourceItemPercentage.query.filter(SourceItemPercentage.item_id==itemId).filter(SourceItemPercentage.source==source_id).filter(SourceItemPercentage.startDate<=time).filter(SourceItemPercentage.expiryDate>=time).first()
12133 kshitij.so 2498
    srm = SourceReturnPercentage.get_by(source=source_id,brand=d_item.brand,category_id=d_item.category)
10097 kshitij.so 2499
    if sip is not None:
12133 kshitij.so 2500
        sip.returnProvision = srm.returnProvision
10097 kshitij.so 2501
        return sip
9779 kshitij.so 2502
    else:
10097 kshitij.so 2503
        item = get_item(itemId)
2504
        scp = SourceCategoryPercentage.query.filter(SourceCategoryPercentage.category_id==item.category).filter(SourceCategoryPercentage.source==source_id).filter(SourceCategoryPercentage.startDate<=time).filter(SourceCategoryPercentage.expiryDate>=time).first()
2505
        if scp is not None:
12133 kshitij.so 2506
            scp.returnProvision = srm.returnProvision
10097 kshitij.so 2507
            return scp
2508
        else:
2509
            spm = SourcePercentageMaster.get_by(source=source_id)
12133 kshitij.so 2510
            spm.returnProvision = srm.returnProvision
10097 kshitij.so 2511
            return spm
9779 kshitij.so 2512
 
2513
def __validateSnapdealObject(snapdealItem):
2514
    if len(snapdealItem.supc)==0 or snapdealItem.supc is None or len(snapdealItem.skuAtSnapdeal)==0 or snapdealItem.skuAtSnapdeal is None or snapdealItem.sellingPrice==0 or snapdealItem.maxNlc==0:
2515
        return False
2516
    else:
2517
        return True
10097 kshitij.so 2518
 
2519
def __validateFlipkartObject(flipkartitem):
2520
    mpItem = flipkartitem.marketplaceItems
2521
    print mpItem
10116 kshitij.so 2522
    if mpItem.currentSp==0 or flipkartitem.maxNlc==0 or len(flipkartitem.flipkartSerialNumber)==0 or flipkartitem.flipkartSerialNumber is None or len(flipkartitem.skuAtFlipkart)==0 or flipkartitem.skuAtFlipkart is None:
10097 kshitij.so 2523
        return False
2524
    else:
2525
        return True
9779 kshitij.so 2526
 
2527
 
9776 vikram.rag 2528
def get_all_marketplace_items_for_priceupdate(source):
2529
    marketPlaceItemsPrices = MarketPlaceItemPrice.query.filter(MarketPlaceItemPrice.source == source).filter(MarketPlaceItemPrice.lastUpdatedOn > MarketPlaceItemPrice.lastUpdatedOnMarketplace).all()
2530
    return marketPlaceItemsPrices
9724 kshitij.so 2531
 
9816 kshitij.so 2532
def update_marketplace_priceupdate_status(skuList,timestamp,source_id):
9776 vikram.rag 2533
    for sku in skuList:
9816 kshitij.so 2534
            item = MarketPlaceItemPrice.get_by(item_id=sku,source=source_id)
9776 vikram.rag 2535
            if item is not None:
2536
                item.lastUpdatedOnMarketplace = to_py_date(timestamp)
9816 kshitij.so 2537
                mp_item = get_marketplace_details_for_item(sku,source_id)
2538
                if mp_item is not None:
2539
                    mp_item.lastCheckedTimestamp = to_py_date(timestamp)
9776 vikram.rag 2540
    session.commit()
9895 vikram.rag 2541
 
9907 vikram.rag 2542
def update_item_hold_inventory(itemHoldMap):
2543
    items = get_all_alive_items()
2544
    for item in items:
2545
        if item.holdOverride:
2546
            continue
2547
        if itemHoldMap.__contains__(item.id):
2548
            item.holdInventory = itemHoldMap[item.id]
2549
        else:
2550
            item.holdInventory = 1
2551
    session.commit()
2552
 
9895 vikram.rag 2553
def update_nlc_at_marketplaces(itemid,vendor_id,nlc):
2554
    try:
2555
        item = SnapdealItem.get_by(item_id=itemid)
2556
        if item is not None:
2557
            marketplaceitem =  MarketplaceItems.get_by(itemId=itemid,source=7)
2558
            ic = InventoryClient().get_client()
2559
            warehouse = ic.getWarehouse(item.warehouseId)
2560
            if(warehouse.vendor.id==vendor_id):
2561
                item.maxNlc = nlc
2562
                vat = (item.sellingPrice/(1+(marketplaceitem.vat/100))-(nlc/(1+(marketplaceitem.vat/100))))*(marketplaceitem.vat/100)
12133 kshitij.so 2563
                inHouseCost = marketplaceitem.packagingCost + vat + (marketplaceitem.returnProvision/100)*item.sellingPrice + marketplaceitem.otherCost
9895 vikram.rag 2564
                marketplaceitem.minimumPossibleTp  = nlc + inHouseCost
10287 kshitij.so 2565
                if (marketplaceitem.pgFee/100)*item.sellingPrice>=20:
12133 kshitij.so 2566
                    marketplaceitem.minimumPossibleSp = (nlc+(item.courierCostMarketplace+marketplaceitem.closingFee)*(1+(marketplaceitem.serviceTax/100))*(1+(marketplaceitem.vat/100))+(marketplaceitem.packagingCost+marketplaceitem.otherCost)*(1+(marketplaceitem.vat)/100))/(1-(marketplaceitem.commission/100+marketplaceitem.emiFee/100+marketplaceitem.pgFee/100)*(1+(marketplaceitem.serviceTax/100))*(1+(marketplaceitem.vat)/100)-(marketplaceitem.returnProvision/100)*(1+(marketplaceitem.vat)/100))
10287 kshitij.so 2567
                else:
12133 kshitij.so 2568
                    marketplaceitem.minimumPossibleSp = (nlc+(item.courierCostMarketplace+marketplaceitem.closingFee+20)*(1+(marketplaceitem.serviceTax/100))*(1+(marketplaceitem.vat/100))+(marketplaceitem.packagingCost+marketplaceitem.otherCost)*(1+(marketplaceitem.vat)/100))/(1-(marketplaceitem.commission/100+marketplaceitem.emiFee/100)*(1+(marketplaceitem.serviceTax/100))*(1+(marketplaceitem.vat)/100)-(marketplaceitem.returnProvision/100)*(1+(marketplaceitem.vat)/100))
9895 vikram.rag 2569
                session.commit()
10287 kshitij.so 2570
        flipkartitem = FlipkartItem.get_by(item_id=itemid)
2571
        if flipkartitem is not None:
2572
            ic = InventoryClient().get_client()
2573
            fmarketplaceitem =  MarketplaceItems.get_by(itemId=itemid,source=8)
2574
            warehouse = ic.getWarehouse(flipkartitem.warehouseId)
2575
            if(warehouse.vendor.id==vendor_id):
2576
                print 'Inside Flipkart maxnlc change'
2577
                flipkartitem.maxNlc = nlc
2578
                vat = (fmarketplaceitem.currentSp/(1+(fmarketplaceitem.vat/100))-(nlc/(1+(fmarketplaceitem.vat/100))))*(fmarketplaceitem.vat/100)
2579
                inHouseCost = 15 + vat + (fmarketplaceitem.returnProvision/100)*fmarketplaceitem.currentSp + fmarketplaceitem.otherCost
2580
                fmarketplaceitem.minimumPossibleTp  = nlc + inHouseCost
2581
                fmarketplaceitem.minimumPossibleSp = (nlc+(fmarketplaceitem.courierCost+fmarketplaceitem.closingFee)*(1+(fmarketplaceitem.serviceTax/100))*(1+(fmarketplaceitem.vat/100))+(15+fmarketplaceitem.otherCost)*(1+(fmarketplaceitem.vat)/100))/(1-(fmarketplaceitem.commission/100+fmarketplaceitem.emiFee/100)*(1+(fmarketplaceitem.serviceTax/100))*(1+(fmarketplaceitem.vat)/100)-(fmarketplaceitem.returnProvision/100)*(1+(fmarketplaceitem.vat)/100))
2582
                session.commit()
9895 vikram.rag 2583
    finally:
9945 vikram.rag 2584
        close_session()
2585
 
2586
def get_all_flipkart_items():
10103 kshitij.so 2587
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).all()
10097 kshitij.so 2588
 
2589
def get_flipkart_item(itemid):
2590
    item = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).filter(FlipkartItem.item_id==itemid).first()
2591
    return item
2592
 
2593
def add_or_update_flipkart_item(flipkartitem):
2594
    item = FlipkartItem.get_by(item_id=flipkartitem.item_id)
2595
    mpItem = get_marketplace_details_for_item(flipkartitem.item_id,OrderSource.FLIPKART)
2596
    t_mpItem = flipkartitem.marketplaceItems
2597
    if not __validateFlipkartObject(flipkartitem):
2598
        return False
2599
    try:
2600
        if item is not None:
2601
            itemHistory = MarketPlaceUpdateHistory()
2602
            itemHistory.item_id = flipkartitem.item_id
2603
            itemHistory.source = OrderSource.FLIPKART
2604
            itemHistory.exceptionPrice = item.exceptionPrice
2605
            itemHistory.warehouseId = item.warehouseId
2606
            itemHistory.isListedOnSource = item.isListedOnFlipkart
2607
            itemHistory.transferPrice = mpItem.currentTp
2608
            itemHistory.sellingPrice = mpItem.currentSp
2609
            itemHistory.courierCost = mpItem.courierCost
2610
            itemHistory.commission = item.commissionValue
2611
            itemHistory.serviceTax = item.serviceTaxValue
2612
            itemHistory.suppressPriceFeed = item.suppressPriceFeed
2613
            itemHistory.suppressInventoryFeed = item.suppressInventoryFeed
2614
            itemHistory.updatedOn = item.updatedOn
2615
            itemHistory.maxNlc = item.maxNlc
2616
            itemHistory.skuAtSource = item. skuAtFlipkart
2617
            itemHistory.marketPlaceSerialNumber = item.flipkartSerialNumber
2618
            itemHistory.priceUpdatedBy = item.updatedBy
2619
            if (mpItem.currentSp!=t_mpItem.currentSp):
2620
                item.updatedBy = flipkartitem.updatedBy
2621
            item.exceptionPrice = flipkartitem.exceptionPrice
2622
            item.warehouseId = flipkartitem.warehouseId
2623
            item.isListedOnFlipkart = flipkartitem.isListedOnFlipkart
2624
            item.commissionValue = flipkartitem.commissionValue
2625
            item.serviceTaxValue = flipkartitem.serviceTaxValue
2626
            item.suppressPriceFeed =flipkartitem.suppressPriceFeed
2627
            item.suppressInventoryFeed =flipkartitem.suppressInventoryFeed
2628
            item.maxNlc = flipkartitem.maxNlc
2629
            item.skuAtFlipkart = flipkartitem.skuAtFlipkart
2630
            item.flipkartSerialNumber = flipkartitem.flipkartSerialNumber
2631
            item.updatedOn = datetime.datetime.now()
2632
            __markStatusForFlipkartItems(flipkartitem,item)
2633
            return update_marketplace_attributes_for_item(flipkartitem.marketplaceItems)
2634
        else:
2635
            item = FlipkartItem()
2636
            if flipkartitem.item_id is not None:
2637
                item.item_id = flipkartitem.item_id
2638
                item.exceptionPrice = flipkartitem.exceptionPrice
2639
                item.warehouseId = flipkartitem.warehouseId
2640
                item.isListedOnFlipkart = flipkartitem.isListedOnFlipkart
2641
                item.commissionValue = flipkartitem.commissionValue
2642
                item.serviceTaxValue = flipkartitem.serviceTaxValue
2643
                item.suppressPriceFeed =flipkartitem.suppressPriceFeed
2644
                item.suppressInventoryFeed =flipkartitem.suppressInventoryFeed 
2645
                item.maxNlc = flipkartitem.maxNlc
2646
                item.skuAtFlipkart = flipkartitem.skuAtFlipkart
2647
                item.flipkartSerialNumber = flipkartitem.flipkartSerialNumber
2648
                item.updatedOn = datetime.datetime.now()  
2649
                item.updatedBy = flipkartitem.updatedBy
2650
                __markStatusForFlipkartItems(flipkartitem,item)
2651
                return update_marketplace_attributes_for_item(flipkartitem.marketplaceItems)  
2652
    except Exception as ex:
2653
        print "Unable to addOrupdate flipkart"
2654
        print ex
2655
        return False
2656
 
2657
def get_flipkart_item_detail(itemid):
2658
    item = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).filter(FlipkartItem.item_id==itemid).first()
2659
    try:
2660
        client = InventoryClient().get_client()
2661
        FlipkartInventoryItem = client.getFlipkartlInventoryForItem(itemid)
2662
        return item, FlipkartInventoryItem
2663
    except Exception as e:
2664
        print e
2665
        return item,None
2666
 
2667
def get_flipkart_items(offset,limit):
2668
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).offset(offset).limit(limit).all()
2669
 
2670
def search_flipkart_items(search_terms,offset,limit):
2671
    query = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id))
2672
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2673
    for search_term in search_terms:
2674
        query_clause = []
2675
        query_clause.append(Item.id.like(search_term))
2676
        query_clause.append(Item.brand.like(search_term))
2677
        query_clause.append(Item.model_name.like(search_term))
2678
        query_clause.append(Item.model_number.like(search_term))
2679
        query_clause.append(Item.color.like(search_term))
2680
        query = query.filter(or_(*query_clause))
2681
 
2682
    query = query.offset(offset)
2683
    if limit:
2684
        query = query.limit(limit)
2685
    flipkart_items = query.all()
2686
    return flipkart_items
2687
 
2688
def get_flipkart_search_result_count(search_terms):
2689
    query = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id))
2690
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2691
    for search_term in search_terms:
2692
        query_clause = []
2693
        query_clause.append(Item.id.like(search_term))
2694
        query_clause.append(Item.brand.like(search_term))
2695
        query_clause.append(Item.model_name.like(search_term))
2696
        query_clause.append(Item.model_number.like(search_term))
2697
        query_clause.append(Item.color.like(search_term))
2698
        query = query.filter(or_(*query_clause))
2699
    return query.count()
2700
 
2701
def get_count_for_flipkart_items():
2702
    return session.query(func.count(FlipkartItem.item_id)).scalar()
2703
 
2704
def get_all_fk_items():
2705
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).all()
2706
 
10140 vikram.rag 2707
def get_flipkart_item_by_sku_at_flipkart(sku):
10141 vikram.rag 2708
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).filter(FlipkartItem.skuAtFlipkart==sku).first()
10909 vikram.rag 2709
 
11015 kshitij.so 2710
def get_marketplace_history(source,offset,itemId):
2711
    return session.query(MarketPlaceHistory).filter(MarketPlaceHistory.item_id==itemId).filter(MarketPlaceHistory.source==source).filter(or_(MarketPlaceHistory.toGroup==True,MarketPlaceHistory.toGroup==None)).order_by(desc(MarketPlaceHistory.timestamp)).limit(11).offset(offset).all()
2712
 
10909 vikram.rag 2713
def get_all_fbb_listed_items():
10927 vikram.rag 2714
    return Amazonlisted.query.filter(Amazonlisted.isFbb==True).filter(Amazonlisted.fbbListedOn==None).all()
11015 kshitij.so 2715
 
10924 vikram.rag 2716
def get_all_fbb_pricing_items():
12663 kshitij.so 2717
    return Amazonlisted.query.filter(Amazonlisted.isFbb==True).filter(Amazonlisted.suppressFbbPriceUpdate==False).filter(Amazonlisted.fbbListedOn != None).all()
11015 kshitij.so 2718
 
2719
def get_count_for_marketplaceHistory(source,itemId):
2720
    return len(session.query(MarketPlaceHistory).filter(MarketPlaceHistory.item_id==itemId).filter(MarketPlaceHistory.source==source).filter(or_(MarketPlaceHistory.toGroup==True,MarketPlaceHistory.toGroup==None)).all())   
2721
 
2722
def get_marketplace_history_by_date(source,startDate,endDate,offset,limit,itemId):
2723
    return session.query(MarketPlaceHistory).filter(MarketPlaceHistory.item_id==itemId).filter(MarketPlaceHistory.source==source).filter(MarketPlaceHistory.timestamp > to_py_date(startDate)).filter(MarketPlaceHistory.timestamp < to_py_date(endDate)).order_by(desc(MarketPlaceHistory.timestamp)).all()
2724
 
11531 vikram.rag 2725
def get_private_deal_details(itemid):
2726
    return PrivateDeals.get_by(item_id=itemid)
2727
 
2728
def get_private_deal_items(offset,limit):
12124 kshitij.so 2729
    if offset==0 and limit==0:
2730
        return session.query(Item).join((PrivateDeals,Item.id==PrivateDeals.item_id)).filter(PrivateDeals.isActive==True).all()
11614 vikram.rag 2731
    return session.query(Item).join((PrivateDeals,Item.id==PrivateDeals.item_id)).filter(PrivateDeals.isActive==True).offset(offset).limit(limit).all()
11531 vikram.rag 2732
 
11653 amit.gupta 2733
def get_all_active_private_deals(itemIds, daysDelta):
2734
        dealsMap = dict()
2735
        all_active_items_query =  session.query(PrivateDeals).filter(PrivateDeals.isActive==True).filter(now().between(PrivateDeals.startDate, PrivateDeals.endDate + datetime.timedelta(days=daysDelta)))
2736
        if itemIds is not None:  
11667 amit.gupta 2737
            all_active_items_query = all_active_items_query.filter(PrivateDeals.item_id.in_(itemIds))
11653 amit.gupta 2738
 
2739
        all_active_private_deals = all_active_items_query.all()
2740
        if all_active_private_deals is not None or all_active_private_deals!=[]:
11592 amit.gupta 2741
            for active_private_deal in all_active_private_deals:
2742
                dealsMap[active_private_deal.item_id] = to_t_private_deal(active_private_deal)
2743
        return dealsMap 
2744
 
11531 vikram.rag 2745
def add_or_update_private_deal(privatedeal):
11606 vikram.rag 2746
    print 'Inside update private deals'
11531 vikram.rag 2747
    try:
2748
        deal =  PrivateDeals.get_by(item_id=privatedeal.item_id)
2749
        if deal is None:
2750
            deal = PrivateDeals()
2751
            deal.item_id = privatedeal.item_id
2752
            deal.dealFreebieItemId = privatedeal.dealFreebieItemId  
2753
            deal.dealPrice = privatedeal.dealPrice
11838 amit.gupta 2754
            deal.startDate =  to_py_date(privatedeal.startDate).replace(hour=0,second=0,minute=0)
2755
            deal.endDate = to_py_date(privatedeal.endDate).replace(hour=0,second=0,minute=0)
11566 vikram.rag 2756
            deal.dealTextOption = privatedeal.dealTextOption
11531 vikram.rag 2757
            deal.dealText = privatedeal.dealText
2758
            deal.isCod =  privatedeal.isCod
2759
            deal.rank = privatedeal.rank
11566 vikram.rag 2760
            deal.dealFreebieOption = privatedeal.dealFreebieOption
11606 vikram.rag 2761
            deal.isActive = privatedeal.isActive  
11531 vikram.rag 2762
        else:
2763
            deal.dealFreebieItemId = privatedeal.dealFreebieItemId  
2764
            deal.dealPrice = privatedeal.dealPrice
11896 amit.gupta 2765
            deal.startDate =  to_py_date(privatedeal.startDate).replace(hour=0,second=0,minute=0)
2766
            deal.endDate = to_py_date(privatedeal.endDate).replace(hour=0,second=0,minute=0)
11606 vikram.rag 2767
            deal.dealTextOption = privatedeal.dealTextOption
11531 vikram.rag 2768
            deal.dealText = privatedeal.dealText
2769
            deal.isCod =  privatedeal.isCod
2770
            deal.rank = privatedeal.rank
11566 vikram.rag 2771
            deal.dealFreebieOption = privatedeal.dealFreebieOption
11606 vikram.rag 2772
            deal.isActive = privatedeal.isActive
11531 vikram.rag 2773
        session.commit()
2774
        return True
2775
    except Exception as e:
11606 vikram.rag 2776
        print 'Exception in updating private deals'
11531 vikram.rag 2777
        print e
11606 vikram.rag 2778
        return False
11645 amit.gupta 2779
 
2780
def get_private_deals_query():
11857 amit.gupta 2781
    return session.query(Item).join((PrivateDeals,Item.id==PrivateDeals.item_id)).filter(Item.status==status.ACTIVE).filter(PrivateDeals.isActive==True).filter(now().between(PrivateDeals.startDate, PrivateDeals.endDate)).group_by(Item.catalog_item_id).order_by(asc(PrivateDeals.rank))
11635 vikram.rag 2782
 
11645 amit.gupta 2783
def get_private_deals_count():
11857 amit.gupta 2784
    return session.query(func.count(distinct(Item.catalog_item_id))).join((PrivateDeals,Item.id==PrivateDeals.item_id)).filter(Item.status==status.ACTIVE).filter(PrivateDeals.isActive==True).filter(now().between(PrivateDeals.startDate, PrivateDeals.endDate)).scalar()
11645 amit.gupta 2785
 
11635 vikram.rag 2786
def get_private_deals_catalog_ids(offset,limit):
11645 amit.gupta 2787
    private_deal_items = get_private_deals_query().offset(offset).limit(limit).all()
11635 vikram.rag 2788
    if private_deal_items is None:
11645 amit.gupta 2789
        return []
11635 vikram.rag 2790
    else:
11908 kshitij.so 2791
        return [item.catalog_item_id for item in private_deal_items]
2792
 
2793
def get_amazon_out_of_sync(itemId):
2794
    return AmazonOutOfSync.get_by(item_id=itemId)
2795
 
2796
def get_all_private_deals_comparison():
12133 kshitij.so 2797
    return session.query(PrivateDealsPriceComparison,Item).join((Item,PrivateDealsPriceComparison.item_id==Item.id)).all()
2798
 
2799
def get_all_snapdeal_marketplaceItem():
2800
    return session.query(SnapdealItem,MarketplaceItems,Item).join((MarketplaceItems,SnapdealItem.item_id==MarketplaceItems.itemId)).join((Item,SnapdealItem.item_id==Item.id)).filter(MarketplaceItems.source==OrderSource.SNAPDEAL).all()
2801
 
2802
def get_all_flipkart_marketplaceItem():
2803
    return session.query(FlipkartItem,MarketplaceItems,Item).join((MarketplaceItems,FlipkartItem.item_id==MarketplaceItems.itemId)).join((Item,FlipkartItem.item_id==Item.id)).filter(MarketplaceItems.source==OrderSource.FLIPKART).all()
2804
 
12243 kshitij.so 2805
def add_competitor_scraping(competitorScrapingMap):
12256 kshitij.so 2806
    cpr = __add_request_competitor_scraping(competitorScrapingMap.itervalues().next())
12243 kshitij.so 2807
    for competitorScraping in competitorScrapingMap.itervalues():
2808
        cp = CompetitorPricing()
2809
        cp.item_id = competitorScraping.item_id
2810
        cp.snapdealScraping = competitorScraping.isSnapdeal
2811
        cp.flipkartScraping = competitorScraping.isFlipkart
2812
        cp.amazonScraping = competitorScraping.isAmazon
12256 kshitij.so 2813
        cp.competitorPricing = cpr
12243 kshitij.so 2814
    session.commit()
12133 kshitij.so 2815
 
12256 kshitij.so 2816
def __add_request_competitor_scraping(data):
2817
    cpr = CompetitorPricingRequest()
2818
    cpr.requestId = data.uploadId
2819
    cpr.user = data.userEmail
2820
    return cpr
2821
 
2822
 
12243 kshitij.so 2823
def get_previous_competitor_scraping(delta):
2824
    result = []
12256 kshitij.so 2825
    items = session.query(func.count(CompetitorPricing.item_id),CompetitorPricing.competitorPricing_requestId,CompetitorPricingRequest.isProcessed,CompetitorPricingRequest.user).join((CompetitorPricingRequest,CompetitorPricingRequest.requestId==CompetitorPricing.competitorPricing_requestId)).group_by(CompetitorPricing.competitorPricing_requestId).order_by(desc(CompetitorPricing.competitorPricing_requestId)).limit(delta).all()
12243 kshitij.so 2826
    for item in items:
2827
        t_competitorPricing = TCompetitorPricing()
2828
        t_competitorPricing.item_id = item[0]
2829
        t_competitorPricing.uploadId = item[1]
2830
        t_competitorPricing.processed = item[2]
12256 kshitij.so 2831
        t_competitorPricing.userEmail = item[3]
12243 kshitij.so 2832
        result.append(t_competitorPricing)
2833
    return result
12256 kshitij.so 2834
 
2835
def get_upload_result_by_id(uploadId):
2836
    return session.query(CompetitorPricing,Item).join((Item,CompetitorPricing.item_id==Item.id)).filter(CompetitorPricing.competitorPricing_requestId==uploadId).all()
12363 kshitij.so 2837
 
2838
def add_amazon_promotion(amazonPromotions):
2839
    for sku, amazonPromotion in amazonPromotions.iteritems():
2840
        d_amazonPromotion = AmazonPromotion()
12663 kshitij.so 2841
        d_amazonPromotion.sku = sku.strip().upper()
12363 kshitij.so 2842
        d_amazonPromotion.standardPrice = amazonPromotion.standardPrice
2843
        d_amazonPromotion.salePrice = amazonPromotion.salePrice
12464 kshitij.so 2844
        d_amazonPromotion.subsidy = amazonPromotion.subsidyAmount
12363 kshitij.so 2845
        d_amazonPromotion.startDate = to_py_date(amazonPromotion.startDate)
2846
        d_amazonPromotion.endDate = to_py_date(amazonPromotion.endDate)
12663 kshitij.so 2847
        d_amazonPromotion.addedOn = to_py_date(amazonPromotion.addedOn)
2848
        d_amazonPromotion.promotionActive = False
2849
        if d_amazonPromotion.sku.startswith('FBA'):
12363 kshitij.so 2850
            d_amazonPromotion.stateId = 1
12663 kshitij.so 2851
        elif d_amazonPromotion.sku.startswith('FBB'):
12363 kshitij.so 2852
            d_amazonPromotion.stateId = 2
2853
        else:
12663 kshitij.so 2854
            raise CatalogServiceException(101, "Amazon Promotion Illegal sku id "+sku)
12363 kshitij.so 2855
        d_amazonPromotion.promotionType = amazonPromotion.promotionType
12663 kshitij.so 2856
        if d_amazonPromotion.promotionType == AmazonPromotionType._NAMES_TO_VALUES.get('LONGTERM'):
2857
            amazonItem = get_amazon_item_details(int(d_amazonPromotion.sku[3:]))
2858
            if amazonItem[0] is None:
2859
                raise CatalogServiceException(102, "Item doesnot exist in amazonlisted sku id "+sku)
2860
            if d_amazonPromotion.stateId == 1:
2861
                amazonItem[0].fbaPromoPrice =  amazonPromotion.salePrice
2862
                amazonItem[0].fbaPromoStartDate = to_py_date(amazonPromotion.startDate)
2863
                amazonItem[0].fbaPromoEndDate =  to_py_date(amazonPromotion.endDate)
2864
                amazonItem[0].fbaPromoActive = False
2865
            else:
2866
                amazonItem[0].fbbPromoPrice =  amazonPromotion.salePrice
2867
                amazonItem[0].fbbPromoStartDate = to_py_date(amazonPromotion.startDate)
2868
                amazonItem[0].fbbPromoEndDate =  to_py_date(amazonPromotion.endDate)
2869
                amazonItem[0].fbbPromoActive = False
2870
        else:
2871
            d_amazonPromotion.promotionActive = True
12363 kshitij.so 2872
    session.commit()
2873
    return True
2874
 
2875
 
12567 amit.gupta 2876
def get_vat_rates(itemId, categoryId):
2877
    vatRates = {}
2878
    item = get_item(itemId)
2879
    for stateinfo in fetchStateMaster().values():
2880
        price = item.sellingPrice
2881
        if VatType.MRP == stateinfo.vatType:
2882
            price = item.mrp
2883
        vatRates[stateinfo.id] = get_vat_percentage_for_item_category(itemId, stateinfo.id, price, categoryId)
2884
    return vatRates
2885
 
2886
def update_item_state_vat(itemId, stateVat):
2887
    for k,v in stateVat.iteritems():
2888
        itemVat = ItemVatMaster.query.filter(and_(ItemVatMaster.itemId==itemId, ItemVatMaster.stateId==k)).first()
2889
        if itemVat:
2890
            itemVat.vatPercentage = v
2891
        else:
2892
            itemVat = ItemVatMaster()
2893
            itemVat.itemId = itemId
2894
            itemVat.stateId = k
2895
            itemVat.vatPercentage = v
2896
    session.commit()
2897
    return True
2898
 
2899
def mark_partially_active(itemId, categoryId):
2900
    item = get_item(itemId)
2901
    item.category = categoryId
2902
    item.status = 8
2903
    item.status_description = 'Partially Active'
2904
    session.commit()
2905
    return True
2906
 
12363 kshitij.so 2907
def get_amazon_promotion(startDate,endDate):
2908
    return AmazonPromotion.query.filter(AmazonPromotion.startDate>=(to_py_date(startDate))).filter(AmazonPromotion.endDate<=(to_py_date(endDate))).all()
2909
 
2910
def update_amazon_promotion(amazonPromotions):
2911
    for amazonPromotion in amazonPromotions:
12666 kshitij.so 2912
        amp = AmazonPromotion.get_by(sku=amazonPromotion.sku,addedOn=to_py_date(amazonPromotion.addedOn), promotionType = amazonPromotion.promotionType )
12663 kshitij.so 2913
        amp.promotionActive = True
2914
        amp.updatedOnMarketplace = datetime.datetime.now()
2915
        if amp.promotionType==1:
2916
            amazonItem = get_amazon_item_details(int(amp.sku[3:]))
2917
            if amp.stateId == 1:
2918
                amazonItem[0].fbaPromoActive = True
2919
            else:
2920
                amazonItem[0].fbbPromoActive = True
12363 kshitij.so 2921
    session.commit()
2922
 
2923
def __get_amazon_promotion_attributes_for_item(item_id):
2924
    timestamp = datetime.datetime.now()
12665 kshitij.so 2925
    fbaPromo = AmazonPromotion.query.filter(AmazonPromotion.sku=='FBA'+str(item_id)).filter(AmazonPromotion.startDate<=timestamp).filter(AmazonPromotion.endDate>=timestamp).filter(AmazonPromotion.updatedOnMarketplace>to_py_date(0)).order_by(desc(AmazonPromotion.updatedOnMarketplace)).limit(1).all()
2926
    fbbPromo = AmazonPromotion.query.filter(AmazonPromotion.sku=='FBB'+str(item_id)).filter(AmazonPromotion.startDate<=timestamp).filter(AmazonPromotion.endDate>=timestamp).filter(AmazonPromotion.updatedOnMarketplace>to_py_date(0)).order_by(desc(AmazonPromotion.updatedOnMarketplace)).limit(1).all()
2927
    return fbaPromo, fbbPromo
2928
 
2929
def get_ex_affiliate_item_info():
2930
        query = session.query(ExclusiveAffiliateItemInfo, OutboundAffiliateMaster.name).join((OutboundAffiliateMaster, ExclusiveAffiliateItemInfo.affiliateId==OutboundAffiliateMaster.id)).filter(ExclusiveAffiliateItemInfo.isActive == True).all()
2931
        close_session()
2932
        map = {}
2933
        for q in query:
2934
            map[q[0].itemId]=to_t_exclusive_affiliate_item_info(q) 
2935
        return map