Subversion Repositories SmartDukaan

Rev

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