Subversion Repositories SmartDukaan

Rev

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