Subversion Repositories SmartDukaan

Rev

Rev 12685 | Rev 12707 | 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
1936
 
7397 kshitij.so 1937
    elif (amazonItem.asin!=amazonlisted.asin):
1938
        if amazonlisted.asin:
1939
            amazonItem.asin=amazonlisted.asin
1940
        if amazonlisted.brand:
1941
            amazonItem.brand=amazonlisted.brand
1942
        else:
1943
            amazonItem.brand=''
1944
        if amazonlisted.model:
1945
            amazonItem.model=amazonlisted.model
1946
        else:
1947
            amazonItem.model=''
1948
        if amazonlisted.manufacturer_name:
1949
            amazonItem.manufacturer_name=amazonlisted.manufacturer_name
1950
        else:
1951
            amazonItem.manufacturer_name=''
1952
        if amazonlisted.name:
1953
            amazonItem.name=amazonlisted.name
1954
        else:
1955
            amazonItem.name=''
1956
        if amazonlisted.part_number:
1957
            amazonItem.part_number=amazonlisted.part_number
1958
        else:
1959
            amazonItem.part_number=''
1960
        if amazonlisted.ean:
1961
            amazonItem.ean=amazonlisted.ean
1962
        else:
1963
            amazonItem.ean=''
1964
        if amazonlisted.upc:
1965
            amazonItem.upc=amazonlisted.upc
1966
        else:
1967
            amazonItem.upc=''
1968
        if amazonlisted.sellingPrice:
8188 kshitij.so 1969
            amazonItem.sellingPrice=amazonlisted.sellingPrice
7397 kshitij.so 1970
        if amazonlisted.fbaPrice:
8188 kshitij.so 1971
            amazonItem.fbaPrice=amazonlisted.fbaPrice
7397 kshitij.so 1972
        if amazonlisted.isFba:
1973
            amazonItem.isFba=amazonlisted.isFba
1974
        if amazonlisted.isNonFba:
1975
            amazonItem.isNonFba=amazonlisted.isNonFba
1976
        if amazonlisted.isInventoryOverride:
1977
            amazonItem.isInventoryOverride=amazonlisted.isInventoryOverride
1978
        if amazonlisted.category:
1979
            amazonItem.category=amazonlisted.category
1980
        else:
1981
            amazonItem.category=''
1982
        if amazonlisted.color:
1983
            amazonItem.color=amazonlisted.color
1984
        else:
7404 kshitij.so 1985
            amazonItem.color=''
7316 kshitij.so 1986
    else:
7397 kshitij.so 1987
        return
7281 kshitij.so 1988
    session.commit()
7770 kshitij.so 1989
 
7291 vikram.rag 1990
def get_asin_items():
7296 amit.gupta 1991
    from_date=datetime.datetime.now() - datetime.timedelta(days=10)
7291 vikram.rag 1992
    return Item.query.filter(Item.updatedOn > from_date).all()
7770 kshitij.so 1993
 
7291 vikram.rag 1994
def get_all_fba_listed_items():
1995
    return Amazonlisted.query.filter(Amazonlisted.isFba==True).all()
7770 kshitij.so 1996
 
7291 vikram.rag 1997
def get_all_nonfba_listed_items():
1998
    return Amazonlisted.query.filter(Amazonlisted.isNonFba==True).all()
7460 kshitij.so 1999
 
2000
def update_item_inventory(itemId,holdInventory,defaultInventory):
2001
    item = get_item(itemId)
2002
    item.holdInventory = holdInventory
2003
    item.defaultInventory = defaultInventory
2004
    session.commit()
7770 kshitij.so 2005
 
2006
def update_timestamp_for_amazon_feeds(feedType,skuList,timestamp):
2007
    #amazonListed = get_all_amazon_listed_items()
7782 kshitij.so 2008
    #fbaItems = []
2009
    #mfnItems = []
7770 kshitij.so 2010
    if feedType == 'NonFbaPricing':
7782 kshitij.so 2011
        for sku in skuList:
7770 kshitij.so 2012
            amazonItem = Amazonlisted.get_by(itemId=sku)
2013
            amazonItem.mfnPriceLastUpdatedOnSc = to_py_date(timestamp)
2014
            session.commit()
2015
        return True
2016
    elif feedType == 'FbaPricing':
7782 kshitij.so 2017
        for sku in skuList:
7770 kshitij.so 2018
            amazonItem = Amazonlisted.get_by(itemId=sku)
2019
            amazonItem.fbaPriceLastUpdatedOnSc = to_py_date(timestamp)
2020
            session.commit()
2021
        return True
10924 vikram.rag 2022
    elif feedType == 'FbbPricing':
2023
        for sku in skuList:
2024
            amazonItem = Amazonlisted.get_by(itemId=sku)
2025
            amazonItem.fbbPriceLastUpdatedOnSc = to_py_date(timestamp)
2026
            session.commit()
2027
        return True
7770 kshitij.so 2028
    elif feedType== 'FullFbaPricing':
7782 kshitij.so 2029
        for sku in skuList:
7770 kshitij.so 2030
            amazonItem = Amazonlisted.get_by(itemId=sku)
2031
            amazonItem.fbaPriceLastUpdatedOnSc = to_py_date(timestamp)
2032
            session.commit()
2033
        return True
2034
    elif feedType== 'FullNonFbaPricing':
7782 kshitij.so 2035
        for sku in skuList:
7770 kshitij.so 2036
            amazonItem = Amazonlisted.get_by(itemId=sku)
2037
            amazonItem.mfnPriceLastUpdatedOnSc = to_py_date(timestamp)
2038
            session.commit()
12701 kshitij.so 2039
        return True
8386 vikram.rag 2040
    elif (feedType=='FbaListingFeed'):
2041
        for sku in skuList:
2042
            amazonItem = Amazonlisted.get_by(itemId=sku)
2043
            amazonItem.isFba = True
2044
            session.commit()
12701 kshitij.so 2045
        return True
8386 vikram.rag 2046
    elif (feedType=='NonFbaListingFeed'):
2047
        for sku in skuList:
2048
            amazonItem = Amazonlisted.get_by(itemId=sku)
2049
            amazonItem.isNonFba = True 
2050
            session.commit()
12701 kshitij.so 2051
        return True
10920 vikram.rag 2052
    elif (feedType=='FbbListingFeed'):
2053
        for sku in skuList:
2054
            amazonItem = Amazonlisted.get_by(itemId=sku)
2055
            amazonItem.fbbListedOn = to_py_date(timestamp) 
2056
            session.commit()
12701 kshitij.so 2057
        return True
7770 kshitij.so 2058
    else:
2059
        return False
7281 kshitij.so 2060
 
7897 amar.kumar 2061
def get_all_parent_categories():
2062
    return Category.query.filter_by(parent_category_id=10000).all()
7977 kshitij.so 2063
 
2064
def add_page_view_event(pageEvent):
2065
    page_view_event = PageViewEvents()
2066
    page_view_event.catalogId = pageEvent.catalogId
2067
    page_view_event.url = pageEvent.url
2068
    page_view_event.sellingPrice = pageEvent.sellingPrice
2069
    page_view_event.ip = pageEvent.ip
2070
    page_view_event.sessionId = pageEvent.sessionId
2071
    page_view_event.comingSoon = pageEvent.comingSoon
2072
    page_view_event.eventTimestamp = to_py_date(pageEvent.eventDate)
2073
    session.commit()
2074
 
2075
def add_cart_event(cartEvent):
2076
    cart_event = CartEvents()
2077
    cart_event.catalogId = cartEvent.catalogId
2078
    cart_event.itemId = cartEvent.itemId
2079
    cart_event.inStock = cartEvent.inStock
2080
    cart_event.ip = cartEvent.ip
2081
    cart_event.sessionId = cartEvent.sessionId
2082
    cart_event.comingSoon = cartEvent.comingSoon
2083
    cart_event.sellingPrice = cartEvent.sellingPrice
2084
    cart_event.eventTimestamp = to_py_date(cartEvent.eventDate)
2085
    session.commit()
8168 kshitij.so 2086
 
2087
def update_amazon_attributes_in_bulk(amazonlistedMap):
2088
    for itemId,amazonlisted in amazonlistedMap.iteritems():
12407 kshitij.so 2089
        amazon_item = (get_amazon_item_details(itemId))[0]
8168 kshitij.so 2090
        if amazon_item is not None:
2091
            if amazon_item.sellingPrice != amazonlisted.sellingPrice:
2092
                amazon_item.mfnPriceLastUpdatedOn = datetime.datetime.now()
2093
                amazon_item.sellingPrice = amazonlisted.sellingPrice
2094
            if amazon_item.fbaPrice != amazonlisted.fbaPrice:
2095
                amazon_item.fbaPriceLastUpdatedOn = datetime.datetime.now()
2096
                amazon_item.fbaPrice = amazonlisted.fbaPrice
10909 vikram.rag 2097
            if amazon_item.fbbPrice != amazonlisted.fbbPrice:
2098
                amazon_item.fbbPriceLastUpdatedOn = datetime.datetime.now()
2099
                amazon_item.fbbPrice = amazonlisted.fbbPrice
10929 vikram.rag 2100
            amazon_item.fbbtaxCode = amazonlisted.fbbtaxCode    
8619 kshitij.so 2101
            amazon_item.taxCode = amazonlisted.taxCode
10909 vikram.rag 2102
            amazon_item.isFbb = amazonlisted.isFbb
8168 kshitij.so 2103
            amazon_item.isFba = amazonlisted.isFba
2104
            amazon_item.isNonFba = amazonlisted.isNonFba
2105
            amazon_item.isInventoryOverride = amazonlisted.isInventoryOverride
2106
            amazon_item.suppressMfnPriceUpdate = amazonlisted.suppressMfnPriceUpdate
2107
            amazon_item.suppressFbaPriceUpdate = amazonlisted.suppressFbaPriceUpdate
10909 vikram.rag 2108
            amazon_item.suppressFbbPriceUpdate = amazonlisted.suppressFbbPriceUpdate
12505 kshitij.so 2109
            amazon_item.otherCost = amazonlisted.otherCost
8168 kshitij.so 2110
            session.commit()
2111
    return True
2112
 
7977 kshitij.so 2113
 
8182 amar.kumar 2114
def insert_ebay_item(ebayItem):
8241 amar.kumar 2115
    ebay_item = EbayItem.get_by(ebayListingId = ebayItem.ebayListingId)
2116
    if ebay_item is None:
2117
        ebay_item = EbayItem()
8182 amar.kumar 2118
    ebay_item.ebayListingId = ebayItem.ebayListingId
2119
    ebay_item.itemId = ebayItem.itemId
2120
    ebay_item.listingName = ebayItem.listingName
2121
    ebay_item.listingPrice = ebayItem.listingPrice
8281 amar.kumar 2122
    ebay_item.listingExpiryDate = to_py_date(ebayItem.listingExpiryDate)
8182 amar.kumar 2123
    ebay_item.subsidy = ebayItem.subsidy
2124
    ebay_item.defaultWarehouseId = ebayItem.defaultWarehouseId
2125
    session.commit()
2126
 
7977 kshitij.so 2127
 
8182 amar.kumar 2128
def get_ebay_item(listing_id):
2129
    ebay_item = EbayItem.get_by(ebayListingId = listing_id)
2130
    return ebay_item
7977 kshitij.so 2131
 
8182 amar.kumar 2132
 
2133
def update_ebay_item(ebayItem):
2134
    ebay_item = EbayItem.get_by(ebayListingId = ebayItem.ebayListingId)
2135
    #if ebay_item.listingExpiryDate < datetime.datetime.now():
2136
    ebay_item.listingName = ebayItem.listingName
2137
    ebay_item.listingPrice = ebayItem.listingPrice
2138
    ebay_item.listingExpiryDate = ebayItem.listingExpiryDate
2139
    ebay_item.subsidy = ebayItem.subsidy
2140
    ebay_item.defaultWarehouseId = ebayItem.defaultWarehouseId
2141
    session.commit()
8379 vikram.rag 2142
 
2143
def get_all_items_to_list_on_fba():
2144
    return Amazonlisted.query.filter(Amazonlisted.isFba==False).all()
2145
 
2146
def get_all_items_to_list_on_nonfba():
2147
    return Amazonlisted.query.filter(Amazonlisted.isNonFba==False).all()
8182 amar.kumar 2148
 
8619 kshitij.so 2149
def get_amazon_listed_items(offset,limit):
2150
    return session.query(Amazonlisted).offset(offset).limit(limit).all()
2151
 
2152
def search_amazon_items(search_terms, offset, limit):
2153
    query = Amazonlisted.query
2154
 
2155
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2156
 
2157
    for search_term in search_terms:
2158
        query_clause = []
2159
        query_clause.append(Amazonlisted.itemId.like(search_term))
2160
        query_clause.append(Amazonlisted.brand.like(search_term))
2161
        query_clause.append(Amazonlisted.model.like(search_term))
2162
        query_clause.append(Amazonlisted.name.like(search_term))
2163
        query_clause.append(Amazonlisted.asin.like(search_term))
2164
        query = query.filter(or_(*query_clause))
2165
 
2166
    query = query.offset(offset)
2167
    if limit:
2168
        query = query.limit(limit)
2169
    amazon_items = query.all()
2170
    return amazon_items
2171
 
2172
def get_amazon_search_result_count(search_terms):
2173
    query = Amazonlisted.query
2174
 
2175
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2176
 
2177
    for search_term in search_terms:
2178
        query_clause = []
2179
        query_clause.append(Amazonlisted.itemId.like(search_term))
2180
        query_clause.append(Amazonlisted.brand.like(search_term))
2181
        query_clause.append(Amazonlisted.model.like(search_term))
2182
        query_clause.append(Amazonlisted.name.like(search_term))
2183
        query_clause.append(Amazonlisted.asin.like(search_term))
2184
        query = query.filter(or_(*query_clause))
2185
 
2186
    return query.count()
2187
 
2188
def get_count_for_amazonlisted_items():
2189
    return session.query(func.count(Amazonlisted.itemId)).scalar()
2190
 
8739 vikram.rag 2191
def add_or_update_snapdeal_item(snapdealitem):
2192
    item = SnapdealItem.get_by(item_id=snapdealitem.item_id)
9779 kshitij.so 2193
    if not __validateSnapdealObject(snapdealitem):
2194
        print "Bad object"
2195
        return False
8739 vikram.rag 2196
    try:
2197
        if item is not None:
10097 kshitij.so 2198
            itemHistory = MarketPlaceUpdateHistory()
9242 kshitij.so 2199
            itemHistory.item_id = snapdealitem.item_id
10097 kshitij.so 2200
            itemHistory.source = OrderSource.SNAPDEAL
9242 kshitij.so 2201
            itemHistory.exceptionPrice = item.exceptionPrice
2202
            itemHistory.warehouseId = item.warehouseId
10097 kshitij.so 2203
            itemHistory.isListedOnSource = item.isListedOnSnapdeal
9242 kshitij.so 2204
            itemHistory.transferPrice = item.transferPrice
2205
            itemHistory.sellingPrice = item.sellingPrice
2206
            itemHistory.courierCost = item.courierCost
2207
            itemHistory.commission = item.commission
2208
            itemHistory.serviceTax = item.serviceTax
2209
            itemHistory.suppressPriceFeed = item.suppressPriceFeed
2210
            itemHistory.suppressInventoryFeed = item.suppressInventoryFeed
2211
            itemHistory.updatedOn = item.updatedOn
9478 kshitij.so 2212
            itemHistory.maxNlc = item.maxNlc
10097 kshitij.so 2213
            itemHistory.skuAtSource = item.skuAtSnapdeal
2214
            itemHistory.marketPlaceSerialNumber = item.supc
9779 kshitij.so 2215
            itemHistory.priceUpdatedBy = item.priceUpdatedBy
11095 kshitij.so 2216
            itemHistory.courierCostMarketplace = item.courierCostMarketplace
9242 kshitij.so 2217
 
9779 kshitij.so 2218
            if (item.sellingPrice!=snapdealitem.sellingPrice):
2219
                item.priceUpdatedBy = snapdealitem.updatedBy
2220
 
8739 vikram.rag 2221
            if snapdealitem.exceptionPrice is not None:
2222
                item.exceptionPrice = snapdealitem.exceptionPrice
2223
            if snapdealitem.warehouseId is not None:     
2224
                item.warehouseId = snapdealitem.warehouseId
2225
            if snapdealitem.isListedOnSnapdeal is not None:    
9242 kshitij.so 2226
                item.isListedOnSnapdeal = snapdealitem.isListedOnSnapdeal
2227
            if snapdealitem.transferPrice is not None:
2228
                item.transferPrice = snapdealitem.transferPrice
2229
            if snapdealitem.sellingPrice is not None:
2230
                item.sellingPrice = snapdealitem.sellingPrice
2231
            if snapdealitem.courierCost is not None:
2232
                item.courierCost = snapdealitem.courierCost    
2233
            if snapdealitem.commission is not None:
2234
                item.commission = snapdealitem.commission
2235
            if snapdealitem.serviceTax is not None:
2236
                item.serviceTax = snapdealitem.serviceTax
2237
            item.suppressPriceFeed =snapdealitem.suppressPriceFeed
9478 kshitij.so 2238
            item.suppressInventoryFeed =snapdealitem.suppressInventoryFeed
9581 kshitij.so 2239
            if snapdealitem.maxNlc is not None:
2240
                item.maxNlc = snapdealitem.maxNlc
9478 kshitij.so 2241
            item.skuAtSnapdeal = snapdealitem.skuAtSnapdeal
9242 kshitij.so 2242
            item.updatedOn = datetime.datetime.now()
9568 kshitij.so 2243
            item.supc = snapdealitem.supc
11095 kshitij.so 2244
            item.courierCostMarketplace = snapdealitem.courierCostMarketplace
9779 kshitij.so 2245
            __markStatusForMarketplaceItems(snapdealitem,item)
2246
            return update_marketplace_attributes_for_item(snapdealitem.marketplaceItems)
8739 vikram.rag 2247
        else:
2248
            item = SnapdealItem()
2249
            if snapdealitem.item_id is not None:
2250
                item.item_id = snapdealitem.item_id
2251
                if snapdealitem.exceptionPrice is not None:
2252
                    item.exceptionPrice = snapdealitem.exceptionPrice
2253
                if snapdealitem.warehouseId is not None:    
2254
                    item.warehouseId = snapdealitem.warehouseId
2255
                if snapdealitem.isListedOnSnapdeal is not None: 
9242 kshitij.so 2256
                    item.isListedOnSnapdeal = snapdealitem.isListedOnSnapdeal
2257
                if snapdealitem.transferPrice is not None:
2258
                    item.transferPrice = snapdealitem.transferPrice
2259
                if snapdealitem.sellingPrice is not None:
2260
                    item.sellingPrice = snapdealitem.sellingPrice
2261
                if snapdealitem.courierCost is not None:
2262
                    item.courierCost = snapdealitem.courierCost    
2263
                if snapdealitem.commission is not None:
2264
                    item.commission = snapdealitem.commission
2265
                if snapdealitem.serviceTax is not None:
2266
                    item.serviceTax = snapdealitem.serviceTax
2267
                item.suppressPriceFeed =snapdealitem.suppressPriceFeed
2268
                item.suppressInventoryFeed =snapdealitem.suppressInventoryFeed 
9595 kshitij.so 2269
                item.maxNlc = snapdealitem.maxNlc
9478 kshitij.so 2270
                item.skuAtSnapdeal = snapdealitem.skuAtSnapdeal
9568 kshitij.so 2271
                item.supc = snapdealitem.supc
9779 kshitij.so 2272
                item.updatedOn = datetime.datetime.now()  
2273
                item.priceUpdatedBy = snapdealitem.updatedBy
11095 kshitij.so 2274
                item.courierCostMarketplace = snapdealitem.courierCostMarketplace
9779 kshitij.so 2275
                __markStatusForMarketplaceItems(snapdealitem,item)
2276
                return update_marketplace_attributes_for_item(snapdealitem.marketplaceItems)  
2277
    except Exception as ex:
2278
        print "Unable to addOrupdate snapdealItem"
2279
        print ex
9242 kshitij.so 2280
        return False
8739 vikram.rag 2281
 
2282
def get_snapdeal_item(itemid):
8755 vikram.rag 2283
    item = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).filter(SnapdealItem.item_id==itemid).first()
8747 vikram.rag 2284
    return item
9724 kshitij.so 2285
 
2286
def get_snapdeal_item_detail(itemid):
2287
    item = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).filter(SnapdealItem.item_id==itemid).first()
2288
    try:
2289
        client = InventoryClient().get_client()
2290
        SnapdealInventoryItem = client.getSnapdealInventoryForItem(itemid)
2291
        return item, SnapdealInventoryItem
2292
    except Exception as e:
2293
        print e
2294
        return item,None
8739 vikram.rag 2295
 
2296
def get_all_snapdeal_items():
8754 vikram.rag 2297
    items = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).all()
8739 vikram.rag 2298
    return items
2299
 
9242 kshitij.so 2300
def get_snapdeal_items(offset,limit):
2301
    return session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).offset(offset).limit(limit).all()
2302
 
8619 kshitij.so 2303
def update_asin(amazonAsinMap):
2304
    for item_id,t_item in amazonAsinMap.iteritems():
2305
        item = get_item(item_id)
2306
        item.asin=t_item.asin
2307
        item.defaultInventory = t_item.defaultInventory
2308
        item.holdInventory = t_item.holdInventory
2309
        item.updatedOn = datetime.datetime.now()
2310
    session.commit()
9242 kshitij.so 2311
 
2312
def search_snapdeal_items(search_terms,offset,limit):
2313
    query = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id))
2314
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2315
    for search_term in search_terms:
2316
        query_clause = []
2317
        query_clause.append(Item.id.like(search_term))
2318
        query_clause.append(Item.brand.like(search_term))
2319
        query_clause.append(Item.model_name.like(search_term))
2320
        query_clause.append(Item.model_number.like(search_term))
2321
        query_clause.append(Item.color.like(search_term))
2322
        query = query.filter(or_(*query_clause))
2323
 
2324
    query = query.offset(offset)
2325
    if limit:
2326
        query = query.limit(limit)
2327
    snapdeal_items = query.all()
2328
    return snapdeal_items
2329
 
2330
def get_snapdeal_search_result_count(search_terms):
2331
    query = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id))
2332
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2333
    for search_term in search_terms:
2334
        query_clause = []
2335
        query_clause.append(Item.id.like(search_term))
2336
        query_clause.append(Item.brand.like(search_term))
2337
        query_clause.append(Item.model_name.like(search_term))
2338
        query_clause.append(Item.model_number.like(search_term))
2339
        query_clause.append(Item.color.like(search_term))
2340
        query = query.filter(or_(*query_clause))
2341
    return query.count()
2342
 
2343
def get_count_for_snapdeal_items():
2344
    return session.query(func.count(SnapdealItem.item_id)).scalar()
2345
 
9456 vikram.rag 2346
def get_snapdealitem_by_skuatsnapdeal(sku):
2347
    snapdeal_item = SnapdealItem.get_by(skuAtSnapdeal=sku)
2348
    if snapdeal_item is not None: 
2349
        item = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).filter(SnapdealItem.item_id==snapdeal_item.item_id).first()
2350
    else:
2351
        return None    
2352
    return item
9242 kshitij.so 2353
 
9621 manish.sha 2354
def get_product_feed_submit(catalog_itemId):
2355
    product_feedsubmit = ProductFeedSubmit.get_by(catalogItemId=catalog_itemId)
2356
    return product_feedsubmit
9456 vikram.rag 2357
 
9621 manish.sha 2358
def add_product_feed_submit(productFeedSubmit):
2359
    feedSubmit = ProductFeedSubmit()
2360
    feedSubmit.catalogItemId = productFeedSubmit.catalogItemId
2361
    feedSubmit.stockLinkedFeed = productFeedSubmit.stockLinkedFeed
2362
    session.commit()
2363
    return True
2364
 
2365
def update_product_feed_submit(productFeedSubmit):
2366
    feedSubmit = get_product_feed_submit(productFeedSubmit.catalogItemId)
2367
    if feedSubmit:
2368
        feedSubmit.catalogItemId = productFeedSubmit.catalogItemId
2369
        feedSubmit.stockLinkedFeed = productFeedSubmit.stockLinkedFeed
2370
        session.commit()
2371
        return True
2372
    return False
2373
 
2374
def delete_product_feed_submit(catalog_itemId):
2375
    feedSubmit = get_product_feed_submit(catalog_itemId)
2376
    if feedSubmit:
2377
        feedSubmit.delete()
2378
        session.commit()
2379
        return True
2380
    return False
2381
 
2382
def get_all_product_feed_submit():
2383
    print session.query(ProductFeedSubmit).all()
2384
    return session.query(ProductFeedSubmit).all()
2385
 
9724 kshitij.so 2386
def get_marketplace_details_for_item(item_id, sourceId):
2387
    return MarketplaceItems.get_by(itemId=item_id,source=sourceId)
2388
 
2389
def update_marketplace_attributes_for_item(t_marketplaceItem):
2390
    if t_marketplaceItem.source is None or t_marketplaceItem.itemId is None:
2391
        return False
2392
    try:
2393
        marketplaceItem = get_marketplace_details_for_item(t_marketplaceItem.itemId,t_marketplaceItem.source)
2394
        if marketplaceItem is None:
2395
            marketplaceItem = MarketplaceItems()
2396
            marketplaceItem.itemId = t_marketplaceItem.itemId
2397
            marketplaceItem.source = t_marketplaceItem.source
9779 kshitij.so 2398
            marketplaceItem.emiFee = t_marketplaceItem.emiFee
2399
            marketplaceItem.closingFee = t_marketplaceItem.closingFee
2400
            marketplaceItem.returnProvision = t_marketplaceItem.returnProvision
2401
            marketplaceItem.commission = t_marketplaceItem.commission
9724 kshitij.so 2402
            marketplaceItem.vat = t_marketplaceItem.vat
12133 kshitij.so 2403
            if marketplaceItem.source == OrderSource.SNAPDEAL:
2404
                marketplaceItem.packagingCost = t_marketplaceItem.packagingCost
2405
            else:
2406
                marketplaceItem.packagingCost = 15.0
9779 kshitij.so 2407
            marketplaceItem.serviceTax = t_marketplaceItem.serviceTax
9724 kshitij.so 2408
            marketplaceItem.courierCost = t_marketplaceItem.courierCost
2409
            marketplaceItem.otherCost = t_marketplaceItem.otherCost
2410
            marketplaceItem.autoIncrement = t_marketplaceItem.autoIncrement
2411
            marketplaceItem.autoDecrement = t_marketplaceItem.autoDecrement
2412
            marketplaceItem.manualFavourite = t_marketplaceItem.manualFavourite
2413
            marketplaceItem.currentSp = t_marketplaceItem.currentSp
2414
            marketplaceItem.currentTp = t_marketplaceItem.currentTp
2415
            marketplaceItem.minimumPossibleSp = t_marketplaceItem.minimumPossibleSp
2416
            marketplaceItem.minimumPossibleTp = t_marketplaceItem.minimumPossibleTp
9923 kshitij.so 2417
            marketplaceItem.maximumSellingPrice = t_marketplaceItem.maximumSellingPrice
10287 kshitij.so 2418
            marketplaceItem.pgFee = t_marketplaceItem.pgFee
11095 kshitij.so 2419
            marketplaceItem.courierCostMarketplace = t_marketplaceItem.courierCostMarketplace
9724 kshitij.so 2420
        else:
2421
            marketplaceItem.courierCost = t_marketplaceItem.courierCost
2422
            marketplaceItem.otherCost = t_marketplaceItem.otherCost
2423
            marketplaceItem.autoIncrement = t_marketplaceItem.autoIncrement
2424
            marketplaceItem.autoDecrement = t_marketplaceItem.autoDecrement
2425
            marketplaceItem.manualFavourite = t_marketplaceItem.manualFavourite
2426
            marketplaceItem.currentSp = t_marketplaceItem.currentSp
2427
            marketplaceItem.currentTp = t_marketplaceItem.currentTp
2428
            marketplaceItem.minimumPossibleSp = t_marketplaceItem.minimumPossibleSp
2429
            marketplaceItem.minimumPossibleTp = t_marketplaceItem.minimumPossibleTp
9779 kshitij.so 2430
            marketplaceItem.emiFee = t_marketplaceItem.emiFee
2431
            marketplaceItem.closingFee = t_marketplaceItem.closingFee
2432
            marketplaceItem.returnProvision = t_marketplaceItem.returnProvision
2433
            marketplaceItem.commission = t_marketplaceItem.commission
12133 kshitij.so 2434
            if marketplaceItem.source == OrderSource.SNAPDEAL:
2435
                marketplaceItem.packagingCost = t_marketplaceItem.packagingCost
2436
            else:
2437
                marketplaceItem.packagingCost = 15.0
9779 kshitij.so 2438
            marketplaceItem.vat = t_marketplaceItem.vat
2439
            marketplaceItem.serviceTax = t_marketplaceItem.serviceTax
9923 kshitij.so 2440
            marketplaceItem.maximumSellingPrice = t_marketplaceItem.maximumSellingPrice
10287 kshitij.so 2441
            marketplaceItem.pgFee = t_marketplaceItem.pgFee
11095 kshitij.so 2442
            marketplaceItem.courierCostMarketplace = t_marketplaceItem.courierCostMarketplace
9724 kshitij.so 2443
        session.commit()
2444
        return True
2445
    except Exception as ex:
9779 kshitij.so 2446
        print "Unable to addOrupdate MarketplaceItem"
9724 kshitij.so 2447
        print ex
2448
        return False
9779 kshitij.so 2449
 
2450
def __markStatusForMarketplaceItems(snapdealItem,item):
2451
    try:
2452
        marketplaceItem = snapdealItem.marketplaceItems
2453
        markUpdatedItem = MarketPlaceItemPrice.query.filter(MarketPlaceItemPrice.item_id==snapdealItem.item_id).filter(MarketPlaceItemPrice.source==marketplaceItem.source).first()
2454
        if markUpdatedItem is None:
2455
            marketPlaceItemPrice = MarketPlaceItemPrice()
2456
            marketPlaceItemPrice.item_id = snapdealItem.item_id
2457
            marketPlaceItemPrice.source = marketplaceItem.source
2458
            marketPlaceItemPrice.lastUpdatedOn = item.updatedOn
2459
            marketPlaceItemPrice.sellingPrice = item.sellingPrice 
2460
            marketPlaceItemPrice.suppressPriceFeed = item.suppressPriceFeed
2461
            marketPlaceItemPrice.isListedOnSource = item.isListedOnSnapdeal
2462
        else:
2463
            if (markUpdatedItem.sellingPrice!=snapdealItem.sellingPrice or markUpdatedItem.suppressPriceFeed!=item.suppressPriceFeed or markUpdatedItem.isListedOnSource!=item.isListedOnSnapdeal):
2464
                markUpdatedItem.lastUpdatedOn = item.updatedOn
2465
            markUpdatedItem.sellingPrice = snapdealItem.sellingPrice
2466
            markUpdatedItem.suppressPriceFeed = item.suppressPriceFeed
2467
            markUpdatedItem.isListedOnSource = item.isListedOnSnapdeal
2468
        return True
2469
    except Exception as e:
2470
        print e
2471
        return False
9724 kshitij.so 2472
 
10097 kshitij.so 2473
def __markStatusForFlipkartItems(flipkartItem,item):
2474
    try:
2475
        marketplaceItem = flipkartItem.marketplaceItems
2476
        markUpdatedItem = MarketPlaceItemPrice.query.filter(MarketPlaceItemPrice.item_id==flipkartItem.item_id).filter(MarketPlaceItemPrice.source==marketplaceItem.source).first()
2477
        if markUpdatedItem is None:
2478
            marketPlaceItemPrice = MarketPlaceItemPrice()
2479
            marketPlaceItemPrice.item_id = flipkartItem.item_id
2480
            marketPlaceItemPrice.source = marketplaceItem.source
2481
            marketPlaceItemPrice.lastUpdatedOn = item.updatedOn
2482
            marketPlaceItemPrice.sellingPrice = marketplaceItem.currentSp 
2483
            marketPlaceItemPrice.suppressPriceFeed = item.suppressPriceFeed
2484
            marketPlaceItemPrice.isListedOnSource = item.isListedOnFlipkart
2485
        else:
2486
            if (markUpdatedItem.sellingPrice!=marketplaceItem.currentSp or markUpdatedItem.suppressPriceFeed!=item.suppressPriceFeed or markUpdatedItem.isListedOnSource!=item.isListedOnFlipkart):
2487
                markUpdatedItem.lastUpdatedOn = item.updatedOn
2488
            markUpdatedItem.sellingPrice = marketplaceItem.currentSp
2489
            markUpdatedItem.suppressPriceFeed = item.suppressPriceFeed
2490
            markUpdatedItem.isListedOnSource = item.isListedOnFlipkart
2491
        return True
2492
    except Exception as e:
2493
        print e
2494
        return False
2495
 
2496
 
9779 kshitij.so 2497
def get_costing_for_marketplace(source_id,itemId):
12133 kshitij.so 2498
    d_item = get_item(itemId)
10097 kshitij.so 2499
    time = datetime.datetime.now()
2500
    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 2501
    srm = SourceReturnPercentage.get_by(source=source_id,brand=d_item.brand,category_id=d_item.category)
10097 kshitij.so 2502
    if sip is not None:
12133 kshitij.so 2503
        sip.returnProvision = srm.returnProvision
10097 kshitij.so 2504
        return sip
9779 kshitij.so 2505
    else:
10097 kshitij.so 2506
        item = get_item(itemId)
2507
        scp = SourceCategoryPercentage.query.filter(SourceCategoryPercentage.category_id==item.category).filter(SourceCategoryPercentage.source==source_id).filter(SourceCategoryPercentage.startDate<=time).filter(SourceCategoryPercentage.expiryDate>=time).first()
2508
        if scp is not None:
12133 kshitij.so 2509
            scp.returnProvision = srm.returnProvision
10097 kshitij.so 2510
            return scp
2511
        else:
2512
            spm = SourcePercentageMaster.get_by(source=source_id)
12133 kshitij.so 2513
            spm.returnProvision = srm.returnProvision
10097 kshitij.so 2514
            return spm
9779 kshitij.so 2515
 
2516
def __validateSnapdealObject(snapdealItem):
2517
    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:
2518
        return False
2519
    else:
2520
        return True
10097 kshitij.so 2521
 
2522
def __validateFlipkartObject(flipkartitem):
2523
    mpItem = flipkartitem.marketplaceItems
2524
    print mpItem
10116 kshitij.so 2525
    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 2526
        return False
2527
    else:
2528
        return True
9779 kshitij.so 2529
 
2530
 
9776 vikram.rag 2531
def get_all_marketplace_items_for_priceupdate(source):
2532
    marketPlaceItemsPrices = MarketPlaceItemPrice.query.filter(MarketPlaceItemPrice.source == source).filter(MarketPlaceItemPrice.lastUpdatedOn > MarketPlaceItemPrice.lastUpdatedOnMarketplace).all()
2533
    return marketPlaceItemsPrices
9724 kshitij.so 2534
 
9816 kshitij.so 2535
def update_marketplace_priceupdate_status(skuList,timestamp,source_id):
9776 vikram.rag 2536
    for sku in skuList:
9816 kshitij.so 2537
            item = MarketPlaceItemPrice.get_by(item_id=sku,source=source_id)
9776 vikram.rag 2538
            if item is not None:
2539
                item.lastUpdatedOnMarketplace = to_py_date(timestamp)
9816 kshitij.so 2540
                mp_item = get_marketplace_details_for_item(sku,source_id)
2541
                if mp_item is not None:
2542
                    mp_item.lastCheckedTimestamp = to_py_date(timestamp)
9776 vikram.rag 2543
    session.commit()
9895 vikram.rag 2544
 
9907 vikram.rag 2545
def update_item_hold_inventory(itemHoldMap):
2546
    items = get_all_alive_items()
2547
    for item in items:
2548
        if item.holdOverride:
2549
            continue
2550
        if itemHoldMap.__contains__(item.id):
2551
            item.holdInventory = itemHoldMap[item.id]
2552
        else:
2553
            item.holdInventory = 1
2554
    session.commit()
2555
 
9895 vikram.rag 2556
def update_nlc_at_marketplaces(itemid,vendor_id,nlc):
2557
    try:
2558
        item = SnapdealItem.get_by(item_id=itemid)
2559
        if item is not None:
2560
            marketplaceitem =  MarketplaceItems.get_by(itemId=itemid,source=7)
2561
            ic = InventoryClient().get_client()
2562
            warehouse = ic.getWarehouse(item.warehouseId)
2563
            if(warehouse.vendor.id==vendor_id):
2564
                item.maxNlc = nlc
2565
                vat = (item.sellingPrice/(1+(marketplaceitem.vat/100))-(nlc/(1+(marketplaceitem.vat/100))))*(marketplaceitem.vat/100)
12133 kshitij.so 2566
                inHouseCost = marketplaceitem.packagingCost + vat + (marketplaceitem.returnProvision/100)*item.sellingPrice + marketplaceitem.otherCost
9895 vikram.rag 2567
                marketplaceitem.minimumPossibleTp  = nlc + inHouseCost
10287 kshitij.so 2568
                if (marketplaceitem.pgFee/100)*item.sellingPrice>=20:
12133 kshitij.so 2569
                    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 2570
                else:
12133 kshitij.so 2571
                    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 2572
                session.commit()
10287 kshitij.so 2573
        flipkartitem = FlipkartItem.get_by(item_id=itemid)
2574
        if flipkartitem is not None:
2575
            ic = InventoryClient().get_client()
2576
            fmarketplaceitem =  MarketplaceItems.get_by(itemId=itemid,source=8)
2577
            warehouse = ic.getWarehouse(flipkartitem.warehouseId)
2578
            if(warehouse.vendor.id==vendor_id):
2579
                print 'Inside Flipkart maxnlc change'
2580
                flipkartitem.maxNlc = nlc
2581
                vat = (fmarketplaceitem.currentSp/(1+(fmarketplaceitem.vat/100))-(nlc/(1+(fmarketplaceitem.vat/100))))*(fmarketplaceitem.vat/100)
2582
                inHouseCost = 15 + vat + (fmarketplaceitem.returnProvision/100)*fmarketplaceitem.currentSp + fmarketplaceitem.otherCost
2583
                fmarketplaceitem.minimumPossibleTp  = nlc + inHouseCost
2584
                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))
2585
                session.commit()
9895 vikram.rag 2586
    finally:
9945 vikram.rag 2587
        close_session()
2588
 
2589
def get_all_flipkart_items():
10103 kshitij.so 2590
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).all()
10097 kshitij.so 2591
 
2592
def get_flipkart_item(itemid):
2593
    item = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).filter(FlipkartItem.item_id==itemid).first()
2594
    return item
2595
 
2596
def add_or_update_flipkart_item(flipkartitem):
2597
    item = FlipkartItem.get_by(item_id=flipkartitem.item_id)
2598
    mpItem = get_marketplace_details_for_item(flipkartitem.item_id,OrderSource.FLIPKART)
2599
    t_mpItem = flipkartitem.marketplaceItems
2600
    if not __validateFlipkartObject(flipkartitem):
2601
        return False
2602
    try:
2603
        if item is not None:
2604
            itemHistory = MarketPlaceUpdateHistory()
2605
            itemHistory.item_id = flipkartitem.item_id
2606
            itemHistory.source = OrderSource.FLIPKART
2607
            itemHistory.exceptionPrice = item.exceptionPrice
2608
            itemHistory.warehouseId = item.warehouseId
2609
            itemHistory.isListedOnSource = item.isListedOnFlipkart
2610
            itemHistory.transferPrice = mpItem.currentTp
2611
            itemHistory.sellingPrice = mpItem.currentSp
2612
            itemHistory.courierCost = mpItem.courierCost
2613
            itemHistory.commission = item.commissionValue
2614
            itemHistory.serviceTax = item.serviceTaxValue
2615
            itemHistory.suppressPriceFeed = item.suppressPriceFeed
2616
            itemHistory.suppressInventoryFeed = item.suppressInventoryFeed
2617
            itemHistory.updatedOn = item.updatedOn
2618
            itemHistory.maxNlc = item.maxNlc
2619
            itemHistory.skuAtSource = item. skuAtFlipkart
2620
            itemHistory.marketPlaceSerialNumber = item.flipkartSerialNumber
2621
            itemHistory.priceUpdatedBy = item.updatedBy
2622
            if (mpItem.currentSp!=t_mpItem.currentSp):
2623
                item.updatedBy = flipkartitem.updatedBy
2624
            item.exceptionPrice = flipkartitem.exceptionPrice
2625
            item.warehouseId = flipkartitem.warehouseId
2626
            item.isListedOnFlipkart = flipkartitem.isListedOnFlipkart
2627
            item.commissionValue = flipkartitem.commissionValue
2628
            item.serviceTaxValue = flipkartitem.serviceTaxValue
2629
            item.suppressPriceFeed =flipkartitem.suppressPriceFeed
2630
            item.suppressInventoryFeed =flipkartitem.suppressInventoryFeed
2631
            item.maxNlc = flipkartitem.maxNlc
2632
            item.skuAtFlipkart = flipkartitem.skuAtFlipkart
2633
            item.flipkartSerialNumber = flipkartitem.flipkartSerialNumber
2634
            item.updatedOn = datetime.datetime.now()
2635
            __markStatusForFlipkartItems(flipkartitem,item)
2636
            return update_marketplace_attributes_for_item(flipkartitem.marketplaceItems)
2637
        else:
2638
            item = FlipkartItem()
2639
            if flipkartitem.item_id is not None:
2640
                item.item_id = flipkartitem.item_id
2641
                item.exceptionPrice = flipkartitem.exceptionPrice
2642
                item.warehouseId = flipkartitem.warehouseId
2643
                item.isListedOnFlipkart = flipkartitem.isListedOnFlipkart
2644
                item.commissionValue = flipkartitem.commissionValue
2645
                item.serviceTaxValue = flipkartitem.serviceTaxValue
2646
                item.suppressPriceFeed =flipkartitem.suppressPriceFeed
2647
                item.suppressInventoryFeed =flipkartitem.suppressInventoryFeed 
2648
                item.maxNlc = flipkartitem.maxNlc
2649
                item.skuAtFlipkart = flipkartitem.skuAtFlipkart
2650
                item.flipkartSerialNumber = flipkartitem.flipkartSerialNumber
2651
                item.updatedOn = datetime.datetime.now()  
2652
                item.updatedBy = flipkartitem.updatedBy
2653
                __markStatusForFlipkartItems(flipkartitem,item)
2654
                return update_marketplace_attributes_for_item(flipkartitem.marketplaceItems)  
2655
    except Exception as ex:
2656
        print "Unable to addOrupdate flipkart"
2657
        print ex
2658
        return False
2659
 
2660
def get_flipkart_item_detail(itemid):
2661
    item = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).filter(FlipkartItem.item_id==itemid).first()
2662
    try:
2663
        client = InventoryClient().get_client()
2664
        FlipkartInventoryItem = client.getFlipkartlInventoryForItem(itemid)
2665
        return item, FlipkartInventoryItem
2666
    except Exception as e:
2667
        print e
2668
        return item,None
2669
 
2670
def get_flipkart_items(offset,limit):
2671
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).offset(offset).limit(limit).all()
2672
 
2673
def search_flipkart_items(search_terms,offset,limit):
2674
    query = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id))
2675
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2676
    for search_term in search_terms:
2677
        query_clause = []
2678
        query_clause.append(Item.id.like(search_term))
2679
        query_clause.append(Item.brand.like(search_term))
2680
        query_clause.append(Item.model_name.like(search_term))
2681
        query_clause.append(Item.model_number.like(search_term))
2682
        query_clause.append(Item.color.like(search_term))
2683
        query = query.filter(or_(*query_clause))
2684
 
2685
    query = query.offset(offset)
2686
    if limit:
2687
        query = query.limit(limit)
2688
    flipkart_items = query.all()
2689
    return flipkart_items
2690
 
2691
def get_flipkart_search_result_count(search_terms):
2692
    query = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id))
2693
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2694
    for search_term in search_terms:
2695
        query_clause = []
2696
        query_clause.append(Item.id.like(search_term))
2697
        query_clause.append(Item.brand.like(search_term))
2698
        query_clause.append(Item.model_name.like(search_term))
2699
        query_clause.append(Item.model_number.like(search_term))
2700
        query_clause.append(Item.color.like(search_term))
2701
        query = query.filter(or_(*query_clause))
2702
    return query.count()
2703
 
2704
def get_count_for_flipkart_items():
2705
    return session.query(func.count(FlipkartItem.item_id)).scalar()
2706
 
2707
def get_all_fk_items():
2708
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).all()
2709
 
10140 vikram.rag 2710
def get_flipkart_item_by_sku_at_flipkart(sku):
10141 vikram.rag 2711
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).filter(FlipkartItem.skuAtFlipkart==sku).first()
10909 vikram.rag 2712
 
11015 kshitij.so 2713
def get_marketplace_history(source,offset,itemId):
2714
    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()
2715
 
10909 vikram.rag 2716
def get_all_fbb_listed_items():
12701 kshitij.so 2717
    return Amazonlisted.query.filter(Amazonlisted.isFbb==False).filter(Amazonlisted.fbbListedOn==None).all()
11015 kshitij.so 2718
 
10924 vikram.rag 2719
def get_all_fbb_pricing_items():
12663 kshitij.so 2720
    return Amazonlisted.query.filter(Amazonlisted.isFbb==True).filter(Amazonlisted.suppressFbbPriceUpdate==False).filter(Amazonlisted.fbbListedOn != None).all()
11015 kshitij.so 2721
 
2722
def get_count_for_marketplaceHistory(source,itemId):
2723
    return len(session.query(MarketPlaceHistory).filter(MarketPlaceHistory.item_id==itemId).filter(MarketPlaceHistory.source==source).filter(or_(MarketPlaceHistory.toGroup==True,MarketPlaceHistory.toGroup==None)).all())   
2724
 
2725
def get_marketplace_history_by_date(source,startDate,endDate,offset,limit,itemId):
2726
    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()
2727
 
11531 vikram.rag 2728
def get_private_deal_details(itemid):
2729
    return PrivateDeals.get_by(item_id=itemid)
2730
 
2731
def get_private_deal_items(offset,limit):
12124 kshitij.so 2732
    if offset==0 and limit==0:
2733
        return session.query(Item).join((PrivateDeals,Item.id==PrivateDeals.item_id)).filter(PrivateDeals.isActive==True).all()
11614 vikram.rag 2734
    return session.query(Item).join((PrivateDeals,Item.id==PrivateDeals.item_id)).filter(PrivateDeals.isActive==True).offset(offset).limit(limit).all()
11531 vikram.rag 2735
 
11653 amit.gupta 2736
def get_all_active_private_deals(itemIds, daysDelta):
2737
        dealsMap = dict()
2738
        all_active_items_query =  session.query(PrivateDeals).filter(PrivateDeals.isActive==True).filter(now().between(PrivateDeals.startDate, PrivateDeals.endDate + datetime.timedelta(days=daysDelta)))
2739
        if itemIds is not None:  
11667 amit.gupta 2740
            all_active_items_query = all_active_items_query.filter(PrivateDeals.item_id.in_(itemIds))
11653 amit.gupta 2741
 
2742
        all_active_private_deals = all_active_items_query.all()
2743
        if all_active_private_deals is not None or all_active_private_deals!=[]:
11592 amit.gupta 2744
            for active_private_deal in all_active_private_deals:
2745
                dealsMap[active_private_deal.item_id] = to_t_private_deal(active_private_deal)
2746
        return dealsMap 
2747
 
11531 vikram.rag 2748
def add_or_update_private_deal(privatedeal):
11606 vikram.rag 2749
    print 'Inside update private deals'
11531 vikram.rag 2750
    try:
2751
        deal =  PrivateDeals.get_by(item_id=privatedeal.item_id)
2752
        if deal is None:
2753
            deal = PrivateDeals()
2754
            deal.item_id = privatedeal.item_id
2755
            deal.dealFreebieItemId = privatedeal.dealFreebieItemId  
2756
            deal.dealPrice = privatedeal.dealPrice
11838 amit.gupta 2757
            deal.startDate =  to_py_date(privatedeal.startDate).replace(hour=0,second=0,minute=0)
2758
            deal.endDate = to_py_date(privatedeal.endDate).replace(hour=0,second=0,minute=0)
11566 vikram.rag 2759
            deal.dealTextOption = privatedeal.dealTextOption
11531 vikram.rag 2760
            deal.dealText = privatedeal.dealText
2761
            deal.isCod =  privatedeal.isCod
2762
            deal.rank = privatedeal.rank
11566 vikram.rag 2763
            deal.dealFreebieOption = privatedeal.dealFreebieOption
11606 vikram.rag 2764
            deal.isActive = privatedeal.isActive  
11531 vikram.rag 2765
        else:
2766
            deal.dealFreebieItemId = privatedeal.dealFreebieItemId  
2767
            deal.dealPrice = privatedeal.dealPrice
11896 amit.gupta 2768
            deal.startDate =  to_py_date(privatedeal.startDate).replace(hour=0,second=0,minute=0)
2769
            deal.endDate = to_py_date(privatedeal.endDate).replace(hour=0,second=0,minute=0)
11606 vikram.rag 2770
            deal.dealTextOption = privatedeal.dealTextOption
11531 vikram.rag 2771
            deal.dealText = privatedeal.dealText
2772
            deal.isCod =  privatedeal.isCod
2773
            deal.rank = privatedeal.rank
11566 vikram.rag 2774
            deal.dealFreebieOption = privatedeal.dealFreebieOption
11606 vikram.rag 2775
            deal.isActive = privatedeal.isActive
11531 vikram.rag 2776
        session.commit()
2777
        return True
2778
    except Exception as e:
11606 vikram.rag 2779
        print 'Exception in updating private deals'
11531 vikram.rag 2780
        print e
11606 vikram.rag 2781
        return False
11645 amit.gupta 2782
 
2783
def get_private_deals_query():
11857 amit.gupta 2784
    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 2785
 
11645 amit.gupta 2786
def get_private_deals_count():
11857 amit.gupta 2787
    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 2788
 
11635 vikram.rag 2789
def get_private_deals_catalog_ids(offset,limit):
11645 amit.gupta 2790
    private_deal_items = get_private_deals_query().offset(offset).limit(limit).all()
11635 vikram.rag 2791
    if private_deal_items is None:
11645 amit.gupta 2792
        return []
11635 vikram.rag 2793
    else:
11908 kshitij.so 2794
        return [item.catalog_item_id for item in private_deal_items]
2795
 
2796
def get_amazon_out_of_sync(itemId):
2797
    return AmazonOutOfSync.get_by(item_id=itemId)
2798
 
2799
def get_all_private_deals_comparison():
12133 kshitij.so 2800
    return session.query(PrivateDealsPriceComparison,Item).join((Item,PrivateDealsPriceComparison.item_id==Item.id)).all()
2801
 
2802
def get_all_snapdeal_marketplaceItem():
2803
    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()
2804
 
2805
def get_all_flipkart_marketplaceItem():
2806
    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()
2807
 
12243 kshitij.so 2808
def add_competitor_scraping(competitorScrapingMap):
12256 kshitij.so 2809
    cpr = __add_request_competitor_scraping(competitorScrapingMap.itervalues().next())
12243 kshitij.so 2810
    for competitorScraping in competitorScrapingMap.itervalues():
2811
        cp = CompetitorPricing()
2812
        cp.item_id = competitorScraping.item_id
2813
        cp.snapdealScraping = competitorScraping.isSnapdeal
2814
        cp.flipkartScraping = competitorScraping.isFlipkart
2815
        cp.amazonScraping = competitorScraping.isAmazon
12256 kshitij.so 2816
        cp.competitorPricing = cpr
12243 kshitij.so 2817
    session.commit()
12133 kshitij.so 2818
 
12256 kshitij.so 2819
def __add_request_competitor_scraping(data):
2820
    cpr = CompetitorPricingRequest()
2821
    cpr.requestId = data.uploadId
2822
    cpr.user = data.userEmail
2823
    return cpr
2824
 
2825
 
12243 kshitij.so 2826
def get_previous_competitor_scraping(delta):
2827
    result = []
12256 kshitij.so 2828
    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 2829
    for item in items:
2830
        t_competitorPricing = TCompetitorPricing()
2831
        t_competitorPricing.item_id = item[0]
2832
        t_competitorPricing.uploadId = item[1]
2833
        t_competitorPricing.processed = item[2]
12256 kshitij.so 2834
        t_competitorPricing.userEmail = item[3]
12243 kshitij.so 2835
        result.append(t_competitorPricing)
2836
    return result
12256 kshitij.so 2837
 
2838
def get_upload_result_by_id(uploadId):
2839
    return session.query(CompetitorPricing,Item).join((Item,CompetitorPricing.item_id==Item.id)).filter(CompetitorPricing.competitorPricing_requestId==uploadId).all()
12363 kshitij.so 2840
 
2841
def add_amazon_promotion(amazonPromotions):
2842
    for sku, amazonPromotion in amazonPromotions.iteritems():
2843
        d_amazonPromotion = AmazonPromotion()
12663 kshitij.so 2844
        d_amazonPromotion.sku = sku.strip().upper()
12363 kshitij.so 2845
        d_amazonPromotion.standardPrice = amazonPromotion.standardPrice
2846
        d_amazonPromotion.salePrice = amazonPromotion.salePrice
12464 kshitij.so 2847
        d_amazonPromotion.subsidy = amazonPromotion.subsidyAmount
12363 kshitij.so 2848
        d_amazonPromotion.startDate = to_py_date(amazonPromotion.startDate)
2849
        d_amazonPromotion.endDate = to_py_date(amazonPromotion.endDate)
12663 kshitij.so 2850
        d_amazonPromotion.addedOn = to_py_date(amazonPromotion.addedOn)
2851
        d_amazonPromotion.promotionActive = False
2852
        if d_amazonPromotion.sku.startswith('FBA'):
12363 kshitij.so 2853
            d_amazonPromotion.stateId = 1
12663 kshitij.so 2854
        elif d_amazonPromotion.sku.startswith('FBB'):
12363 kshitij.so 2855
            d_amazonPromotion.stateId = 2
2856
        else:
12663 kshitij.so 2857
            raise CatalogServiceException(101, "Amazon Promotion Illegal sku id "+sku)
12363 kshitij.so 2858
        d_amazonPromotion.promotionType = amazonPromotion.promotionType
12663 kshitij.so 2859
        if d_amazonPromotion.promotionType == AmazonPromotionType._NAMES_TO_VALUES.get('LONGTERM'):
2860
            amazonItem = get_amazon_item_details(int(d_amazonPromotion.sku[3:]))
2861
            if amazonItem[0] is None:
2862
                raise CatalogServiceException(102, "Item doesnot exist in amazonlisted sku id "+sku)
2863
            if d_amazonPromotion.stateId == 1:
2864
                amazonItem[0].fbaPromoPrice =  amazonPromotion.salePrice
2865
                amazonItem[0].fbaPromoStartDate = to_py_date(amazonPromotion.startDate)
2866
                amazonItem[0].fbaPromoEndDate =  to_py_date(amazonPromotion.endDate)
2867
                amazonItem[0].fbaPromoActive = False
2868
            else:
2869
                amazonItem[0].fbbPromoPrice =  amazonPromotion.salePrice
2870
                amazonItem[0].fbbPromoStartDate = to_py_date(amazonPromotion.startDate)
2871
                amazonItem[0].fbbPromoEndDate =  to_py_date(amazonPromotion.endDate)
2872
                amazonItem[0].fbbPromoActive = False
2873
        else:
2874
            d_amazonPromotion.promotionActive = True
12363 kshitij.so 2875
    session.commit()
2876
    return True
2877
 
2878
 
12567 amit.gupta 2879
def get_vat_rates(itemId, categoryId):
2880
    vatRates = {}
2881
    item = get_item(itemId)
2882
    for stateinfo in fetchStateMaster().values():
2883
        price = item.sellingPrice
2884
        if VatType.MRP == stateinfo.vatType:
2885
            price = item.mrp
2886
        vatRates[stateinfo.id] = get_vat_percentage_for_item_category(itemId, stateinfo.id, price, categoryId)
2887
    return vatRates
2888
 
2889
def update_item_state_vat(itemId, stateVat):
2890
    for k,v in stateVat.iteritems():
2891
        itemVat = ItemVatMaster.query.filter(and_(ItemVatMaster.itemId==itemId, ItemVatMaster.stateId==k)).first()
2892
        if itemVat:
2893
            itemVat.vatPercentage = v
2894
        else:
2895
            itemVat = ItemVatMaster()
2896
            itemVat.itemId = itemId
2897
            itemVat.stateId = k
2898
            itemVat.vatPercentage = v
2899
    session.commit()
2900
    return True
2901
 
2902
def mark_partially_active(itemId, categoryId):
2903
    item = get_item(itemId)
2904
    item.category = categoryId
2905
    item.status = 8
2906
    item.status_description = 'Partially Active'
2907
    session.commit()
2908
    return True
2909
 
12363 kshitij.so 2910
def get_amazon_promotion(startDate,endDate):
2911
    return AmazonPromotion.query.filter(AmazonPromotion.startDate>=(to_py_date(startDate))).filter(AmazonPromotion.endDate<=(to_py_date(endDate))).all()
2912
 
2913
def update_amazon_promotion(amazonPromotions):
2914
    for amazonPromotion in amazonPromotions:
12666 kshitij.so 2915
        amp = AmazonPromotion.get_by(sku=amazonPromotion.sku,addedOn=to_py_date(amazonPromotion.addedOn), promotionType = amazonPromotion.promotionType )
12663 kshitij.so 2916
        amp.promotionActive = True
2917
        amp.updatedOnMarketplace = datetime.datetime.now()
12670 kshitij.so 2918
        if amp.promotionType == 1:
12663 kshitij.so 2919
            amazonItem = get_amazon_item_details(int(amp.sku[3:]))
2920
            if amp.stateId == 1:
12670 kshitij.so 2921
                amazonItem[0].fbaPromotionActive = True
12663 kshitij.so 2922
            else:
12670 kshitij.so 2923
                amazonItem[0].fbbPromotionActive = True
12363 kshitij.so 2924
    session.commit()
12668 kshitij.so 2925
    return True
12363 kshitij.so 2926
 
2927
def __get_amazon_promotion_attributes_for_item(item_id):
2928
    timestamp = datetime.datetime.now()
12665 kshitij.so 2929
    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()
2930
    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()
2931
    return fbaPromo, fbbPromo
2932
 
2933
def get_ex_affiliate_item_info():
2934
        query = session.query(ExclusiveAffiliateItemInfo, OutboundAffiliateMaster.name).join((OutboundAffiliateMaster, ExclusiveAffiliateItemInfo.affiliateId==OutboundAffiliateMaster.id)).filter(ExclusiveAffiliateItemInfo.isActive == True).all()
2935
        close_session()
2936
        map = {}
2937
        for q in query:
2938
            map[q[0].itemId]=to_t_exclusive_affiliate_item_info(q) 
2939
        return map