Subversion Repositories SmartDukaan

Rev

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