Subversion Repositories SmartDukaan

Rev

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