Subversion Repositories SmartDukaan

Rev

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