Subversion Repositories SmartDukaan

Rev

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