Subversion Repositories SmartDukaan

Rev

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

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