Subversion Repositories SmartDukaan

Rev

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