Subversion Repositories SmartDukaan

Rev

Rev 12133 | Rev 12256 | 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, \
25
    CompetitorPricing
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
6039 amit.gupta 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:
7761 kshitij.so 209
            amazonItem = get_amazon_item_details(item.id)
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)
1799
    return amazonlisted
1800
 
8168 kshitij.so 1801
def update_amazon_item_details(amazonlisted):
1802
    amazon_listed = Amazonlisted.get_by(itemId = amazonlisted.itemid)
1803
    amazon_listed.isFba=amazonlisted.isFba
10909 vikram.rag 1804
    amazon_listed.isFbb=amazonlisted.isFbb
8168 kshitij.so 1805
    amazon_listed.isNonFba=amazonlisted.isNonFba
1806
    amazon_listed.isInventoryOverride=amazonlisted.isInventoryOverride
1807
    amazon_listed.handlingTime=amazonlisted.handlingTime
1808
    amazon_listed.isCustomTime=amazonlisted.isCustomTime
8619 kshitij.so 1809
    amazon_listed.taxCode=amazonlisted.taxCode
10909 vikram.rag 1810
    amazon_listed.fbbtaxCode=amazonlisted.fbbtaxCode
8619 kshitij.so 1811
    if (amazon_listed.sellingPrice != amazonlisted.sellingPrice) and amazonlisted.sellingPrice > 0:
8168 kshitij.so 1812
        amazon_listed.mfnPriceLastUpdatedOn = datetime.datetime.now()
1813
        amazon_listed.sellingPrice=amazonlisted.sellingPrice
8619 kshitij.so 1814
    if (amazon_listed.fbaPrice != amazonlisted.fbaPrice) and amazonlisted.fbaPrice > 0:
8168 kshitij.so 1815
        amazon_listed.fbaPriceLastUpdatedOn = datetime.datetime.now()
1816
        amazon_listed.fbaPrice=amazonlisted.fbaPrice
10909 vikram.rag 1817
    if (amazon_listed.fbbPrice != amazonlisted.fbbPrice) and amazonlisted.fbbPrice > 0:
1818
        amazon_listed.fbbPriceLastUpdatedOn = datetime.datetime.now()
1819
        amazon_listed.fbbPrice=amazonlisted.fbbPrice
8168 kshitij.so 1820
    amazon_listed.suppressMfnPriceUpdate=amazonlisted.suppressMfnPriceUpdate
10909 vikram.rag 1821
    amazon_listed.suppressFbaPriceUpdate=amazonlisted.suppressFbaPriceUpdate
1822
    amazon_listed.suppressFbbPriceUpdate=amazonlisted.suppressFbbPriceUpdate 
7281 kshitij.so 1823
    session.commit()
7770 kshitij.so 1824
 
7281 kshitij.so 1825
def add_amazon_item(amazonlisted):
1826
    if (not amazonlisted) or (not amazonlisted.itemid) or (not amazonlisted.asin):
1827
        return
7397 kshitij.so 1828
    amazonItem = Amazonlisted.get_by(itemId=amazonlisted.itemid)
1829
    if amazonItem is None:
1830
        amazon_item = Amazonlisted()
1831
        if amazonlisted.itemid:
1832
            amazon_item.itemId=amazonlisted.itemid
1833
        if amazonlisted.asin:
1834
            amazon_item.asin=amazonlisted.asin
1835
        if amazonlisted.brand:
1836
            amazon_item.brand=amazonlisted.brand
1837
        else:
1838
            amazon_item.brand=''
1839
        if amazonlisted.model:
1840
            amazon_item.model=amazonlisted.model
1841
        else:
1842
            amazon_item.model=''
1843
        if amazonlisted.manufacturer_name:
1844
            amazon_item.manufacturer_name=amazonlisted.manufacturer_name
1845
        else:
1846
            amazon_item.manufacturer_name=''
1847
        if amazonlisted.name:
1848
            amazon_item.name=amazonlisted.name
1849
        else:
1850
            amazon_item.name=''
1851
        if amazonlisted.part_number:
1852
            amazon_item.part_number=amazonlisted.part_number
1853
        else:
1854
            amazon_item.part_number=''
1855
        if amazonlisted.ean:
1856
            amazon_item.ean=amazonlisted.ean
1857
        else:
1858
            amazon_item.ean=''
1859
        if amazonlisted.upc:
1860
            amazon_item.upc=amazonlisted.upc
1861
        else:
1862
            amazon_item.upc=''
7770 kshitij.so 1863
        if amazonlisted.fbaPrice:
1864
            amazon_item.fbaPrice=amazonlisted.fbaPrice
7782 kshitij.so 1865
            amazon_item.fbaPriceLastUpdatedOnSc =  datetime.datetime.now()
7770 kshitij.so 1866
            amazon_item.fbaPriceLastUpdatedOn = datetime.datetime.now()
7397 kshitij.so 1867
        if amazonlisted.sellingPrice:
1868
            amazon_item.sellingPrice=amazonlisted.sellingPrice
7782 kshitij.so 1869
            amazon_item.mfnPriceLastUpdatedOnSc = datetime.datetime.now()
7770 kshitij.so 1870
            amazon_item.mfnPriceLastUpdatedOn = datetime.datetime.now()
7397 kshitij.so 1871
        if amazonlisted.category:
1872
            amazon_item.category=amazonlisted.category
1873
        else:
1874
            amazon_item.category=''
1875
        if amazonlisted.color:
1876
            amazon_item.color=amazonlisted.color
1877
        else:
7404 kshitij.so 1878
            amazon_item.color=''
8139 kshitij.so 1879
        amazon_item.suppressMfnPriceUpdate=False
8140 kshitij.so 1880
        amazon_item.suppressFbaPriceUpdate=False
8379 vikram.rag 1881
        amazon_item.isFba = False
1882
        amazon_item.isNonFba = False
1883
        amazon_item.isInventoryOverride = False
10947 vikram.rag 1884
        if amazonlisted.fbbPrice: 
1885
            amazon_item.fbbPrice = amazonlisted.fbbPrice 
1886
            amazon_item.fbbPriceLastUpdatedOnSc = datetime.datetime.now()
1887
            amazon_item.fbbPriceLastUpdatedOn = datetime.datetime.now()
10921 vikram.rag 1888
        amazon_item.isFbb = False
10909 vikram.rag 1889
        amazon_item.suppressFbbPriceUpdate = False
1890
 
7397 kshitij.so 1891
    elif (amazonItem.asin!=amazonlisted.asin):
1892
        if amazonlisted.asin:
1893
            amazonItem.asin=amazonlisted.asin
1894
        if amazonlisted.brand:
1895
            amazonItem.brand=amazonlisted.brand
1896
        else:
1897
            amazonItem.brand=''
1898
        if amazonlisted.model:
1899
            amazonItem.model=amazonlisted.model
1900
        else:
1901
            amazonItem.model=''
1902
        if amazonlisted.manufacturer_name:
1903
            amazonItem.manufacturer_name=amazonlisted.manufacturer_name
1904
        else:
1905
            amazonItem.manufacturer_name=''
1906
        if amazonlisted.name:
1907
            amazonItem.name=amazonlisted.name
1908
        else:
1909
            amazonItem.name=''
1910
        if amazonlisted.part_number:
1911
            amazonItem.part_number=amazonlisted.part_number
1912
        else:
1913
            amazonItem.part_number=''
1914
        if amazonlisted.ean:
1915
            amazonItem.ean=amazonlisted.ean
1916
        else:
1917
            amazonItem.ean=''
1918
        if amazonlisted.upc:
1919
            amazonItem.upc=amazonlisted.upc
1920
        else:
1921
            amazonItem.upc=''
1922
        if amazonlisted.sellingPrice:
8188 kshitij.so 1923
            amazonItem.sellingPrice=amazonlisted.sellingPrice
7397 kshitij.so 1924
        if amazonlisted.fbaPrice:
8188 kshitij.so 1925
            amazonItem.fbaPrice=amazonlisted.fbaPrice
7397 kshitij.so 1926
        if amazonlisted.isFba:
1927
            amazonItem.isFba=amazonlisted.isFba
1928
        if amazonlisted.isNonFba:
1929
            amazonItem.isNonFba=amazonlisted.isNonFba
1930
        if amazonlisted.isInventoryOverride:
1931
            amazonItem.isInventoryOverride=amazonlisted.isInventoryOverride
1932
        if amazonlisted.category:
1933
            amazonItem.category=amazonlisted.category
1934
        else:
1935
            amazonItem.category=''
1936
        if amazonlisted.color:
1937
            amazonItem.color=amazonlisted.color
1938
        else:
7404 kshitij.so 1939
            amazonItem.color=''
7316 kshitij.so 1940
    else:
7397 kshitij.so 1941
        return
7281 kshitij.so 1942
    session.commit()
7770 kshitij.so 1943
 
7291 vikram.rag 1944
def get_asin_items():
7296 amit.gupta 1945
    from_date=datetime.datetime.now() - datetime.timedelta(days=10)
7291 vikram.rag 1946
    return Item.query.filter(Item.updatedOn > from_date).all()
7770 kshitij.so 1947
 
7291 vikram.rag 1948
def get_all_fba_listed_items():
1949
    return Amazonlisted.query.filter(Amazonlisted.isFba==True).all()
7770 kshitij.so 1950
 
7291 vikram.rag 1951
def get_all_nonfba_listed_items():
1952
    return Amazonlisted.query.filter(Amazonlisted.isNonFba==True).all()
7460 kshitij.so 1953
 
1954
def update_item_inventory(itemId,holdInventory,defaultInventory):
1955
    item = get_item(itemId)
1956
    item.holdInventory = holdInventory
1957
    item.defaultInventory = defaultInventory
1958
    session.commit()
7770 kshitij.so 1959
 
1960
def update_timestamp_for_amazon_feeds(feedType,skuList,timestamp):
1961
    #amazonListed = get_all_amazon_listed_items()
7782 kshitij.so 1962
    #fbaItems = []
1963
    #mfnItems = []
7770 kshitij.so 1964
    if feedType == 'NonFbaPricing':
7782 kshitij.so 1965
        for sku in skuList:
7770 kshitij.so 1966
            amazonItem = Amazonlisted.get_by(itemId=sku)
1967
            amazonItem.mfnPriceLastUpdatedOnSc = to_py_date(timestamp)
1968
            session.commit()
1969
        return True
1970
    elif feedType == 'FbaPricing':
7782 kshitij.so 1971
        for sku in skuList:
7770 kshitij.so 1972
            amazonItem = Amazonlisted.get_by(itemId=sku)
1973
            amazonItem.fbaPriceLastUpdatedOnSc = to_py_date(timestamp)
1974
            session.commit()
1975
        return True
10924 vikram.rag 1976
    elif feedType == 'FbbPricing':
1977
        for sku in skuList:
1978
            amazonItem = Amazonlisted.get_by(itemId=sku)
1979
            amazonItem.fbbPriceLastUpdatedOnSc = to_py_date(timestamp)
1980
            session.commit()
1981
        return True
7770 kshitij.so 1982
    elif feedType== 'FullFbaPricing':
7782 kshitij.so 1983
        for sku in skuList:
7770 kshitij.so 1984
            amazonItem = Amazonlisted.get_by(itemId=sku)
1985
            amazonItem.fbaPriceLastUpdatedOnSc = to_py_date(timestamp)
1986
            session.commit()
1987
        return True
1988
    elif feedType== 'FullNonFbaPricing':
7782 kshitij.so 1989
        for sku in skuList:
7770 kshitij.so 1990
            amazonItem = Amazonlisted.get_by(itemId=sku)
1991
            amazonItem.mfnPriceLastUpdatedOnSc = to_py_date(timestamp)
1992
            session.commit()
8386 vikram.rag 1993
    elif (feedType=='FbaListingFeed'):
1994
        for sku in skuList:
1995
            amazonItem = Amazonlisted.get_by(itemId=sku)
1996
            amazonItem.isFba = True
1997
            session.commit()
1998
    elif (feedType=='NonFbaListingFeed'):
1999
        for sku in skuList:
2000
            amazonItem = Amazonlisted.get_by(itemId=sku)
2001
            amazonItem.isNonFba = True 
2002
            session.commit()
10920 vikram.rag 2003
    elif (feedType=='FbbListingFeed'):
2004
        for sku in skuList:
2005
            amazonItem = Amazonlisted.get_by(itemId=sku)
2006
            amazonItem.fbbListedOn = to_py_date(timestamp) 
2007
            session.commit()
7770 kshitij.so 2008
    else:
2009
        return False
7281 kshitij.so 2010
 
7897 amar.kumar 2011
def get_all_parent_categories():
2012
    return Category.query.filter_by(parent_category_id=10000).all()
7977 kshitij.so 2013
 
2014
def add_page_view_event(pageEvent):
2015
    page_view_event = PageViewEvents()
2016
    page_view_event.catalogId = pageEvent.catalogId
2017
    page_view_event.url = pageEvent.url
2018
    page_view_event.sellingPrice = pageEvent.sellingPrice
2019
    page_view_event.ip = pageEvent.ip
2020
    page_view_event.sessionId = pageEvent.sessionId
2021
    page_view_event.comingSoon = pageEvent.comingSoon
2022
    page_view_event.eventTimestamp = to_py_date(pageEvent.eventDate)
2023
    session.commit()
2024
 
2025
def add_cart_event(cartEvent):
2026
    cart_event = CartEvents()
2027
    cart_event.catalogId = cartEvent.catalogId
2028
    cart_event.itemId = cartEvent.itemId
2029
    cart_event.inStock = cartEvent.inStock
2030
    cart_event.ip = cartEvent.ip
2031
    cart_event.sessionId = cartEvent.sessionId
2032
    cart_event.comingSoon = cartEvent.comingSoon
2033
    cart_event.sellingPrice = cartEvent.sellingPrice
2034
    cart_event.eventTimestamp = to_py_date(cartEvent.eventDate)
2035
    session.commit()
8168 kshitij.so 2036
 
2037
def update_amazon_attributes_in_bulk(amazonlistedMap):
2038
    for itemId,amazonlisted in amazonlistedMap.iteritems():
2039
        amazon_item = get_amazon_item_details(itemId)
2040
        if amazon_item is not None:
2041
            if amazon_item.sellingPrice != amazonlisted.sellingPrice:
2042
                amazon_item.mfnPriceLastUpdatedOn = datetime.datetime.now()
2043
                amazon_item.sellingPrice = amazonlisted.sellingPrice
2044
            if amazon_item.fbaPrice != amazonlisted.fbaPrice:
2045
                amazon_item.fbaPriceLastUpdatedOn = datetime.datetime.now()
2046
                amazon_item.fbaPrice = amazonlisted.fbaPrice
10909 vikram.rag 2047
            if amazon_item.fbbPrice != amazonlisted.fbbPrice:
2048
                amazon_item.fbbPriceLastUpdatedOn = datetime.datetime.now()
2049
                amazon_item.fbbPrice = amazonlisted.fbbPrice
10929 vikram.rag 2050
            amazon_item.fbbtaxCode = amazonlisted.fbbtaxCode    
8619 kshitij.so 2051
            amazon_item.taxCode = amazonlisted.taxCode
10909 vikram.rag 2052
            amazon_item.isFbb = amazonlisted.isFbb
8168 kshitij.so 2053
            amazon_item.isFba = amazonlisted.isFba
2054
            amazon_item.isNonFba = amazonlisted.isNonFba
2055
            amazon_item.isInventoryOverride = amazonlisted.isInventoryOverride
2056
            amazon_item.suppressMfnPriceUpdate = amazonlisted.suppressMfnPriceUpdate
2057
            amazon_item.suppressFbaPriceUpdate = amazonlisted.suppressFbaPriceUpdate
10909 vikram.rag 2058
            amazon_item.suppressFbbPriceUpdate = amazonlisted.suppressFbbPriceUpdate
8168 kshitij.so 2059
            session.commit()
2060
    return True
2061
 
7977 kshitij.so 2062
 
8182 amar.kumar 2063
def insert_ebay_item(ebayItem):
8241 amar.kumar 2064
    ebay_item = EbayItem.get_by(ebayListingId = ebayItem.ebayListingId)
2065
    if ebay_item is None:
2066
        ebay_item = EbayItem()
8182 amar.kumar 2067
    ebay_item.ebayListingId = ebayItem.ebayListingId
2068
    ebay_item.itemId = ebayItem.itemId
2069
    ebay_item.listingName = ebayItem.listingName
2070
    ebay_item.listingPrice = ebayItem.listingPrice
8281 amar.kumar 2071
    ebay_item.listingExpiryDate = to_py_date(ebayItem.listingExpiryDate)
8182 amar.kumar 2072
    ebay_item.subsidy = ebayItem.subsidy
2073
    ebay_item.defaultWarehouseId = ebayItem.defaultWarehouseId
2074
    session.commit()
2075
 
7977 kshitij.so 2076
 
8182 amar.kumar 2077
def get_ebay_item(listing_id):
2078
    ebay_item = EbayItem.get_by(ebayListingId = listing_id)
2079
    return ebay_item
7977 kshitij.so 2080
 
8182 amar.kumar 2081
 
2082
def update_ebay_item(ebayItem):
2083
    ebay_item = EbayItem.get_by(ebayListingId = ebayItem.ebayListingId)
2084
    #if ebay_item.listingExpiryDate < datetime.datetime.now():
2085
    ebay_item.listingName = ebayItem.listingName
2086
    ebay_item.listingPrice = ebayItem.listingPrice
2087
    ebay_item.listingExpiryDate = ebayItem.listingExpiryDate
2088
    ebay_item.subsidy = ebayItem.subsidy
2089
    ebay_item.defaultWarehouseId = ebayItem.defaultWarehouseId
2090
    session.commit()
8379 vikram.rag 2091
 
2092
def get_all_items_to_list_on_fba():
2093
    return Amazonlisted.query.filter(Amazonlisted.isFba==False).all()
2094
 
2095
def get_all_items_to_list_on_nonfba():
2096
    return Amazonlisted.query.filter(Amazonlisted.isNonFba==False).all()
8182 amar.kumar 2097
 
8619 kshitij.so 2098
def get_amazon_listed_items(offset,limit):
2099
    return session.query(Amazonlisted).offset(offset).limit(limit).all()
2100
 
2101
def search_amazon_items(search_terms, offset, limit):
2102
    query = Amazonlisted.query
2103
 
2104
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2105
 
2106
    for search_term in search_terms:
2107
        query_clause = []
2108
        query_clause.append(Amazonlisted.itemId.like(search_term))
2109
        query_clause.append(Amazonlisted.brand.like(search_term))
2110
        query_clause.append(Amazonlisted.model.like(search_term))
2111
        query_clause.append(Amazonlisted.name.like(search_term))
2112
        query_clause.append(Amazonlisted.asin.like(search_term))
2113
        query = query.filter(or_(*query_clause))
2114
 
2115
    query = query.offset(offset)
2116
    if limit:
2117
        query = query.limit(limit)
2118
    amazon_items = query.all()
2119
    return amazon_items
2120
 
2121
def get_amazon_search_result_count(search_terms):
2122
    query = Amazonlisted.query
2123
 
2124
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2125
 
2126
    for search_term in search_terms:
2127
        query_clause = []
2128
        query_clause.append(Amazonlisted.itemId.like(search_term))
2129
        query_clause.append(Amazonlisted.brand.like(search_term))
2130
        query_clause.append(Amazonlisted.model.like(search_term))
2131
        query_clause.append(Amazonlisted.name.like(search_term))
2132
        query_clause.append(Amazonlisted.asin.like(search_term))
2133
        query = query.filter(or_(*query_clause))
2134
 
2135
    return query.count()
2136
 
2137
def get_count_for_amazonlisted_items():
2138
    return session.query(func.count(Amazonlisted.itemId)).scalar()
2139
 
8739 vikram.rag 2140
def add_or_update_snapdeal_item(snapdealitem):
2141
    item = SnapdealItem.get_by(item_id=snapdealitem.item_id)
9779 kshitij.so 2142
    if not __validateSnapdealObject(snapdealitem):
2143
        print "Bad object"
2144
        return False
8739 vikram.rag 2145
    try:
2146
        if item is not None:
10097 kshitij.so 2147
            itemHistory = MarketPlaceUpdateHistory()
9242 kshitij.so 2148
            itemHistory.item_id = snapdealitem.item_id
10097 kshitij.so 2149
            itemHistory.source = OrderSource.SNAPDEAL
9242 kshitij.so 2150
            itemHistory.exceptionPrice = item.exceptionPrice
2151
            itemHistory.warehouseId = item.warehouseId
10097 kshitij.so 2152
            itemHistory.isListedOnSource = item.isListedOnSnapdeal
9242 kshitij.so 2153
            itemHistory.transferPrice = item.transferPrice
2154
            itemHistory.sellingPrice = item.sellingPrice
2155
            itemHistory.courierCost = item.courierCost
2156
            itemHistory.commission = item.commission
2157
            itemHistory.serviceTax = item.serviceTax
2158
            itemHistory.suppressPriceFeed = item.suppressPriceFeed
2159
            itemHistory.suppressInventoryFeed = item.suppressInventoryFeed
2160
            itemHistory.updatedOn = item.updatedOn
9478 kshitij.so 2161
            itemHistory.maxNlc = item.maxNlc
10097 kshitij.so 2162
            itemHistory.skuAtSource = item.skuAtSnapdeal
2163
            itemHistory.marketPlaceSerialNumber = item.supc
9779 kshitij.so 2164
            itemHistory.priceUpdatedBy = item.priceUpdatedBy
11095 kshitij.so 2165
            itemHistory.courierCostMarketplace = item.courierCostMarketplace
9242 kshitij.so 2166
 
9779 kshitij.so 2167
            if (item.sellingPrice!=snapdealitem.sellingPrice):
2168
                item.priceUpdatedBy = snapdealitem.updatedBy
2169
 
8739 vikram.rag 2170
            if snapdealitem.exceptionPrice is not None:
2171
                item.exceptionPrice = snapdealitem.exceptionPrice
2172
            if snapdealitem.warehouseId is not None:     
2173
                item.warehouseId = snapdealitem.warehouseId
2174
            if snapdealitem.isListedOnSnapdeal is not None:    
9242 kshitij.so 2175
                item.isListedOnSnapdeal = snapdealitem.isListedOnSnapdeal
2176
            if snapdealitem.transferPrice is not None:
2177
                item.transferPrice = snapdealitem.transferPrice
2178
            if snapdealitem.sellingPrice is not None:
2179
                item.sellingPrice = snapdealitem.sellingPrice
2180
            if snapdealitem.courierCost is not None:
2181
                item.courierCost = snapdealitem.courierCost    
2182
            if snapdealitem.commission is not None:
2183
                item.commission = snapdealitem.commission
2184
            if snapdealitem.serviceTax is not None:
2185
                item.serviceTax = snapdealitem.serviceTax
2186
            item.suppressPriceFeed =snapdealitem.suppressPriceFeed
9478 kshitij.so 2187
            item.suppressInventoryFeed =snapdealitem.suppressInventoryFeed
9581 kshitij.so 2188
            if snapdealitem.maxNlc is not None:
2189
                item.maxNlc = snapdealitem.maxNlc
9478 kshitij.so 2190
            item.skuAtSnapdeal = snapdealitem.skuAtSnapdeal
9242 kshitij.so 2191
            item.updatedOn = datetime.datetime.now()
9568 kshitij.so 2192
            item.supc = snapdealitem.supc
11095 kshitij.so 2193
            item.courierCostMarketplace = snapdealitem.courierCostMarketplace
9779 kshitij.so 2194
            __markStatusForMarketplaceItems(snapdealitem,item)
2195
            return update_marketplace_attributes_for_item(snapdealitem.marketplaceItems)
8739 vikram.rag 2196
        else:
2197
            item = SnapdealItem()
2198
            if snapdealitem.item_id is not None:
2199
                item.item_id = snapdealitem.item_id
2200
                if snapdealitem.exceptionPrice is not None:
2201
                    item.exceptionPrice = snapdealitem.exceptionPrice
2202
                if snapdealitem.warehouseId is not None:    
2203
                    item.warehouseId = snapdealitem.warehouseId
2204
                if snapdealitem.isListedOnSnapdeal is not None: 
9242 kshitij.so 2205
                    item.isListedOnSnapdeal = snapdealitem.isListedOnSnapdeal
2206
                if snapdealitem.transferPrice is not None:
2207
                    item.transferPrice = snapdealitem.transferPrice
2208
                if snapdealitem.sellingPrice is not None:
2209
                    item.sellingPrice = snapdealitem.sellingPrice
2210
                if snapdealitem.courierCost is not None:
2211
                    item.courierCost = snapdealitem.courierCost    
2212
                if snapdealitem.commission is not None:
2213
                    item.commission = snapdealitem.commission
2214
                if snapdealitem.serviceTax is not None:
2215
                    item.serviceTax = snapdealitem.serviceTax
2216
                item.suppressPriceFeed =snapdealitem.suppressPriceFeed
2217
                item.suppressInventoryFeed =snapdealitem.suppressInventoryFeed 
9595 kshitij.so 2218
                item.maxNlc = snapdealitem.maxNlc
9478 kshitij.so 2219
                item.skuAtSnapdeal = snapdealitem.skuAtSnapdeal
9568 kshitij.so 2220
                item.supc = snapdealitem.supc
9779 kshitij.so 2221
                item.updatedOn = datetime.datetime.now()  
2222
                item.priceUpdatedBy = snapdealitem.updatedBy
11095 kshitij.so 2223
                item.courierCostMarketplace = snapdealitem.courierCostMarketplace
9779 kshitij.so 2224
                __markStatusForMarketplaceItems(snapdealitem,item)
2225
                return update_marketplace_attributes_for_item(snapdealitem.marketplaceItems)  
2226
    except Exception as ex:
2227
        print "Unable to addOrupdate snapdealItem"
2228
        print ex
9242 kshitij.so 2229
        return False
8739 vikram.rag 2230
 
2231
def get_snapdeal_item(itemid):
8755 vikram.rag 2232
    item = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).filter(SnapdealItem.item_id==itemid).first()
8747 vikram.rag 2233
    return item
9724 kshitij.so 2234
 
2235
def get_snapdeal_item_detail(itemid):
2236
    item = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).filter(SnapdealItem.item_id==itemid).first()
2237
    try:
2238
        client = InventoryClient().get_client()
2239
        SnapdealInventoryItem = client.getSnapdealInventoryForItem(itemid)
2240
        return item, SnapdealInventoryItem
2241
    except Exception as e:
2242
        print e
2243
        return item,None
8739 vikram.rag 2244
 
2245
def get_all_snapdeal_items():
8754 vikram.rag 2246
    items = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).all()
8739 vikram.rag 2247
    return items
2248
 
9242 kshitij.so 2249
def get_snapdeal_items(offset,limit):
2250
    return session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).offset(offset).limit(limit).all()
2251
 
8619 kshitij.so 2252
def update_asin(amazonAsinMap):
2253
    for item_id,t_item in amazonAsinMap.iteritems():
2254
        item = get_item(item_id)
2255
        item.asin=t_item.asin
2256
        item.defaultInventory = t_item.defaultInventory
2257
        item.holdInventory = t_item.holdInventory
2258
        item.updatedOn = datetime.datetime.now()
2259
    session.commit()
9242 kshitij.so 2260
 
2261
def search_snapdeal_items(search_terms,offset,limit):
2262
    query = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id))
2263
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2264
    for search_term in search_terms:
2265
        query_clause = []
2266
        query_clause.append(Item.id.like(search_term))
2267
        query_clause.append(Item.brand.like(search_term))
2268
        query_clause.append(Item.model_name.like(search_term))
2269
        query_clause.append(Item.model_number.like(search_term))
2270
        query_clause.append(Item.color.like(search_term))
2271
        query = query.filter(or_(*query_clause))
2272
 
2273
    query = query.offset(offset)
2274
    if limit:
2275
        query = query.limit(limit)
2276
    snapdeal_items = query.all()
2277
    return snapdeal_items
2278
 
2279
def get_snapdeal_search_result_count(search_terms):
2280
    query = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id))
2281
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2282
    for search_term in search_terms:
2283
        query_clause = []
2284
        query_clause.append(Item.id.like(search_term))
2285
        query_clause.append(Item.brand.like(search_term))
2286
        query_clause.append(Item.model_name.like(search_term))
2287
        query_clause.append(Item.model_number.like(search_term))
2288
        query_clause.append(Item.color.like(search_term))
2289
        query = query.filter(or_(*query_clause))
2290
    return query.count()
2291
 
2292
def get_count_for_snapdeal_items():
2293
    return session.query(func.count(SnapdealItem.item_id)).scalar()
2294
 
9456 vikram.rag 2295
def get_snapdealitem_by_skuatsnapdeal(sku):
2296
    snapdeal_item = SnapdealItem.get_by(skuAtSnapdeal=sku)
2297
    if snapdeal_item is not None: 
2298
        item = session.query(SnapdealItem,Item).join((Item,SnapdealItem.item_id==Item.id)).filter(SnapdealItem.item_id==snapdeal_item.item_id).first()
2299
    else:
2300
        return None    
2301
    return item
9242 kshitij.so 2302
 
9621 manish.sha 2303
def get_product_feed_submit(catalog_itemId):
2304
    product_feedsubmit = ProductFeedSubmit.get_by(catalogItemId=catalog_itemId)
2305
    return product_feedsubmit
9456 vikram.rag 2306
 
9621 manish.sha 2307
def add_product_feed_submit(productFeedSubmit):
2308
    feedSubmit = ProductFeedSubmit()
2309
    feedSubmit.catalogItemId = productFeedSubmit.catalogItemId
2310
    feedSubmit.stockLinkedFeed = productFeedSubmit.stockLinkedFeed
2311
    session.commit()
2312
    return True
2313
 
2314
def update_product_feed_submit(productFeedSubmit):
2315
    feedSubmit = get_product_feed_submit(productFeedSubmit.catalogItemId)
2316
    if feedSubmit:
2317
        feedSubmit.catalogItemId = productFeedSubmit.catalogItemId
2318
        feedSubmit.stockLinkedFeed = productFeedSubmit.stockLinkedFeed
2319
        session.commit()
2320
        return True
2321
    return False
2322
 
2323
def delete_product_feed_submit(catalog_itemId):
2324
    feedSubmit = get_product_feed_submit(catalog_itemId)
2325
    if feedSubmit:
2326
        feedSubmit.delete()
2327
        session.commit()
2328
        return True
2329
    return False
2330
 
2331
def get_all_product_feed_submit():
2332
    print session.query(ProductFeedSubmit).all()
2333
    return session.query(ProductFeedSubmit).all()
2334
 
9724 kshitij.so 2335
def get_marketplace_details_for_item(item_id, sourceId):
2336
    return MarketplaceItems.get_by(itemId=item_id,source=sourceId)
2337
 
2338
def update_marketplace_attributes_for_item(t_marketplaceItem):
2339
    if t_marketplaceItem.source is None or t_marketplaceItem.itemId is None:
2340
        return False
2341
    try:
2342
        marketplaceItem = get_marketplace_details_for_item(t_marketplaceItem.itemId,t_marketplaceItem.source)
2343
        if marketplaceItem is None:
2344
            marketplaceItem = MarketplaceItems()
2345
            marketplaceItem.itemId = t_marketplaceItem.itemId
2346
            marketplaceItem.source = t_marketplaceItem.source
9779 kshitij.so 2347
            marketplaceItem.emiFee = t_marketplaceItem.emiFee
2348
            marketplaceItem.closingFee = t_marketplaceItem.closingFee
2349
            marketplaceItem.returnProvision = t_marketplaceItem.returnProvision
2350
            marketplaceItem.commission = t_marketplaceItem.commission
9724 kshitij.so 2351
            marketplaceItem.vat = t_marketplaceItem.vat
12133 kshitij.so 2352
            if marketplaceItem.source == OrderSource.SNAPDEAL:
2353
                marketplaceItem.packagingCost = t_marketplaceItem.packagingCost
2354
            else:
2355
                marketplaceItem.packagingCost = 15.0
9779 kshitij.so 2356
            marketplaceItem.serviceTax = t_marketplaceItem.serviceTax
9724 kshitij.so 2357
            marketplaceItem.courierCost = t_marketplaceItem.courierCost
2358
            marketplaceItem.otherCost = t_marketplaceItem.otherCost
2359
            marketplaceItem.autoIncrement = t_marketplaceItem.autoIncrement
2360
            marketplaceItem.autoDecrement = t_marketplaceItem.autoDecrement
2361
            marketplaceItem.manualFavourite = t_marketplaceItem.manualFavourite
2362
            marketplaceItem.currentSp = t_marketplaceItem.currentSp
2363
            marketplaceItem.currentTp = t_marketplaceItem.currentTp
2364
            marketplaceItem.minimumPossibleSp = t_marketplaceItem.minimumPossibleSp
2365
            marketplaceItem.minimumPossibleTp = t_marketplaceItem.minimumPossibleTp
9923 kshitij.so 2366
            marketplaceItem.maximumSellingPrice = t_marketplaceItem.maximumSellingPrice
10287 kshitij.so 2367
            marketplaceItem.pgFee = t_marketplaceItem.pgFee
11095 kshitij.so 2368
            marketplaceItem.courierCostMarketplace = t_marketplaceItem.courierCostMarketplace
9724 kshitij.so 2369
        else:
2370
            marketplaceItem.courierCost = t_marketplaceItem.courierCost
2371
            marketplaceItem.otherCost = t_marketplaceItem.otherCost
2372
            marketplaceItem.autoIncrement = t_marketplaceItem.autoIncrement
2373
            marketplaceItem.autoDecrement = t_marketplaceItem.autoDecrement
2374
            marketplaceItem.manualFavourite = t_marketplaceItem.manualFavourite
2375
            marketplaceItem.currentSp = t_marketplaceItem.currentSp
2376
            marketplaceItem.currentTp = t_marketplaceItem.currentTp
2377
            marketplaceItem.minimumPossibleSp = t_marketplaceItem.minimumPossibleSp
2378
            marketplaceItem.minimumPossibleTp = t_marketplaceItem.minimumPossibleTp
9779 kshitij.so 2379
            marketplaceItem.emiFee = t_marketplaceItem.emiFee
2380
            marketplaceItem.closingFee = t_marketplaceItem.closingFee
2381
            marketplaceItem.returnProvision = t_marketplaceItem.returnProvision
2382
            marketplaceItem.commission = t_marketplaceItem.commission
12133 kshitij.so 2383
            if marketplaceItem.source == OrderSource.SNAPDEAL:
2384
                marketplaceItem.packagingCost = t_marketplaceItem.packagingCost
2385
            else:
2386
                marketplaceItem.packagingCost = 15.0
9779 kshitij.so 2387
            marketplaceItem.vat = t_marketplaceItem.vat
2388
            marketplaceItem.serviceTax = t_marketplaceItem.serviceTax
9923 kshitij.so 2389
            marketplaceItem.maximumSellingPrice = t_marketplaceItem.maximumSellingPrice
10287 kshitij.so 2390
            marketplaceItem.pgFee = t_marketplaceItem.pgFee
11095 kshitij.so 2391
            marketplaceItem.courierCostMarketplace = t_marketplaceItem.courierCostMarketplace
9724 kshitij.so 2392
        session.commit()
2393
        return True
2394
    except Exception as ex:
9779 kshitij.so 2395
        print "Unable to addOrupdate MarketplaceItem"
9724 kshitij.so 2396
        print ex
2397
        return False
9779 kshitij.so 2398
 
2399
def __markStatusForMarketplaceItems(snapdealItem,item):
2400
    try:
2401
        marketplaceItem = snapdealItem.marketplaceItems
2402
        markUpdatedItem = MarketPlaceItemPrice.query.filter(MarketPlaceItemPrice.item_id==snapdealItem.item_id).filter(MarketPlaceItemPrice.source==marketplaceItem.source).first()
2403
        if markUpdatedItem is None:
2404
            marketPlaceItemPrice = MarketPlaceItemPrice()
2405
            marketPlaceItemPrice.item_id = snapdealItem.item_id
2406
            marketPlaceItemPrice.source = marketplaceItem.source
2407
            marketPlaceItemPrice.lastUpdatedOn = item.updatedOn
2408
            marketPlaceItemPrice.sellingPrice = item.sellingPrice 
2409
            marketPlaceItemPrice.suppressPriceFeed = item.suppressPriceFeed
2410
            marketPlaceItemPrice.isListedOnSource = item.isListedOnSnapdeal
2411
        else:
2412
            if (markUpdatedItem.sellingPrice!=snapdealItem.sellingPrice or markUpdatedItem.suppressPriceFeed!=item.suppressPriceFeed or markUpdatedItem.isListedOnSource!=item.isListedOnSnapdeal):
2413
                markUpdatedItem.lastUpdatedOn = item.updatedOn
2414
            markUpdatedItem.sellingPrice = snapdealItem.sellingPrice
2415
            markUpdatedItem.suppressPriceFeed = item.suppressPriceFeed
2416
            markUpdatedItem.isListedOnSource = item.isListedOnSnapdeal
2417
        return True
2418
    except Exception as e:
2419
        print e
2420
        return False
9724 kshitij.so 2421
 
10097 kshitij.so 2422
def __markStatusForFlipkartItems(flipkartItem,item):
2423
    try:
2424
        marketplaceItem = flipkartItem.marketplaceItems
2425
        markUpdatedItem = MarketPlaceItemPrice.query.filter(MarketPlaceItemPrice.item_id==flipkartItem.item_id).filter(MarketPlaceItemPrice.source==marketplaceItem.source).first()
2426
        if markUpdatedItem is None:
2427
            marketPlaceItemPrice = MarketPlaceItemPrice()
2428
            marketPlaceItemPrice.item_id = flipkartItem.item_id
2429
            marketPlaceItemPrice.source = marketplaceItem.source
2430
            marketPlaceItemPrice.lastUpdatedOn = item.updatedOn
2431
            marketPlaceItemPrice.sellingPrice = marketplaceItem.currentSp 
2432
            marketPlaceItemPrice.suppressPriceFeed = item.suppressPriceFeed
2433
            marketPlaceItemPrice.isListedOnSource = item.isListedOnFlipkart
2434
        else:
2435
            if (markUpdatedItem.sellingPrice!=marketplaceItem.currentSp or markUpdatedItem.suppressPriceFeed!=item.suppressPriceFeed or markUpdatedItem.isListedOnSource!=item.isListedOnFlipkart):
2436
                markUpdatedItem.lastUpdatedOn = item.updatedOn
2437
            markUpdatedItem.sellingPrice = marketplaceItem.currentSp
2438
            markUpdatedItem.suppressPriceFeed = item.suppressPriceFeed
2439
            markUpdatedItem.isListedOnSource = item.isListedOnFlipkart
2440
        return True
2441
    except Exception as e:
2442
        print e
2443
        return False
2444
 
2445
 
9779 kshitij.so 2446
def get_costing_for_marketplace(source_id,itemId):
12133 kshitij.so 2447
    d_item = get_item(itemId)
10097 kshitij.so 2448
    time = datetime.datetime.now()
2449
    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 2450
    srm = SourceReturnPercentage.get_by(source=source_id,brand=d_item.brand,category_id=d_item.category)
10097 kshitij.so 2451
    if sip is not None:
12133 kshitij.so 2452
        sip.returnProvision = srm.returnProvision
10097 kshitij.so 2453
        return sip
9779 kshitij.so 2454
    else:
10097 kshitij.so 2455
        item = get_item(itemId)
2456
        scp = SourceCategoryPercentage.query.filter(SourceCategoryPercentage.category_id==item.category).filter(SourceCategoryPercentage.source==source_id).filter(SourceCategoryPercentage.startDate<=time).filter(SourceCategoryPercentage.expiryDate>=time).first()
2457
        if scp is not None:
12133 kshitij.so 2458
            scp.returnProvision = srm.returnProvision
10097 kshitij.so 2459
            return scp
2460
        else:
2461
            spm = SourcePercentageMaster.get_by(source=source_id)
12133 kshitij.so 2462
            spm.returnProvision = srm.returnProvision
10097 kshitij.so 2463
            return spm
9779 kshitij.so 2464
 
2465
def __validateSnapdealObject(snapdealItem):
2466
    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:
2467
        return False
2468
    else:
2469
        return True
10097 kshitij.so 2470
 
2471
def __validateFlipkartObject(flipkartitem):
2472
    mpItem = flipkartitem.marketplaceItems
2473
    print mpItem
10116 kshitij.so 2474
    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 2475
        return False
2476
    else:
2477
        return True
9779 kshitij.so 2478
 
2479
 
9776 vikram.rag 2480
def get_all_marketplace_items_for_priceupdate(source):
2481
    marketPlaceItemsPrices = MarketPlaceItemPrice.query.filter(MarketPlaceItemPrice.source == source).filter(MarketPlaceItemPrice.lastUpdatedOn > MarketPlaceItemPrice.lastUpdatedOnMarketplace).all()
2482
    return marketPlaceItemsPrices
9724 kshitij.so 2483
 
9816 kshitij.so 2484
def update_marketplace_priceupdate_status(skuList,timestamp,source_id):
9776 vikram.rag 2485
    for sku in skuList:
9816 kshitij.so 2486
            item = MarketPlaceItemPrice.get_by(item_id=sku,source=source_id)
9776 vikram.rag 2487
            if item is not None:
2488
                item.lastUpdatedOnMarketplace = to_py_date(timestamp)
9816 kshitij.so 2489
                mp_item = get_marketplace_details_for_item(sku,source_id)
2490
                if mp_item is not None:
2491
                    mp_item.lastCheckedTimestamp = to_py_date(timestamp)
9776 vikram.rag 2492
    session.commit()
9895 vikram.rag 2493
 
9907 vikram.rag 2494
def update_item_hold_inventory(itemHoldMap):
2495
    items = get_all_alive_items()
2496
    for item in items:
2497
        if item.holdOverride:
2498
            continue
2499
        if itemHoldMap.__contains__(item.id):
2500
            item.holdInventory = itemHoldMap[item.id]
2501
        else:
2502
            item.holdInventory = 1
2503
    session.commit()
2504
 
9895 vikram.rag 2505
def update_nlc_at_marketplaces(itemid,vendor_id,nlc):
2506
    try:
2507
        item = SnapdealItem.get_by(item_id=itemid)
2508
        if item is not None:
2509
            marketplaceitem =  MarketplaceItems.get_by(itemId=itemid,source=7)
2510
            ic = InventoryClient().get_client()
2511
            warehouse = ic.getWarehouse(item.warehouseId)
2512
            if(warehouse.vendor.id==vendor_id):
2513
                item.maxNlc = nlc
2514
                vat = (item.sellingPrice/(1+(marketplaceitem.vat/100))-(nlc/(1+(marketplaceitem.vat/100))))*(marketplaceitem.vat/100)
12133 kshitij.so 2515
                inHouseCost = marketplaceitem.packagingCost + vat + (marketplaceitem.returnProvision/100)*item.sellingPrice + marketplaceitem.otherCost
9895 vikram.rag 2516
                marketplaceitem.minimumPossibleTp  = nlc + inHouseCost
10287 kshitij.so 2517
                if (marketplaceitem.pgFee/100)*item.sellingPrice>=20:
12133 kshitij.so 2518
                    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 2519
                else:
12133 kshitij.so 2520
                    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 2521
                session.commit()
10287 kshitij.so 2522
        flipkartitem = FlipkartItem.get_by(item_id=itemid)
2523
        if flipkartitem is not None:
2524
            ic = InventoryClient().get_client()
2525
            fmarketplaceitem =  MarketplaceItems.get_by(itemId=itemid,source=8)
2526
            warehouse = ic.getWarehouse(flipkartitem.warehouseId)
2527
            if(warehouse.vendor.id==vendor_id):
2528
                print 'Inside Flipkart maxnlc change'
2529
                flipkartitem.maxNlc = nlc
2530
                vat = (fmarketplaceitem.currentSp/(1+(fmarketplaceitem.vat/100))-(nlc/(1+(fmarketplaceitem.vat/100))))*(fmarketplaceitem.vat/100)
2531
                inHouseCost = 15 + vat + (fmarketplaceitem.returnProvision/100)*fmarketplaceitem.currentSp + fmarketplaceitem.otherCost
2532
                fmarketplaceitem.minimumPossibleTp  = nlc + inHouseCost
2533
                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))
2534
                session.commit()
9895 vikram.rag 2535
    finally:
9945 vikram.rag 2536
        close_session()
2537
 
2538
def get_all_flipkart_items():
10103 kshitij.so 2539
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).all()
10097 kshitij.so 2540
 
2541
def get_flipkart_item(itemid):
2542
    item = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).filter(FlipkartItem.item_id==itemid).first()
2543
    return item
2544
 
2545
def add_or_update_flipkart_item(flipkartitem):
2546
    item = FlipkartItem.get_by(item_id=flipkartitem.item_id)
2547
    mpItem = get_marketplace_details_for_item(flipkartitem.item_id,OrderSource.FLIPKART)
2548
    t_mpItem = flipkartitem.marketplaceItems
2549
    if not __validateFlipkartObject(flipkartitem):
2550
        return False
2551
    try:
2552
        if item is not None:
2553
            itemHistory = MarketPlaceUpdateHistory()
2554
            itemHistory.item_id = flipkartitem.item_id
2555
            itemHistory.source = OrderSource.FLIPKART
2556
            itemHistory.exceptionPrice = item.exceptionPrice
2557
            itemHistory.warehouseId = item.warehouseId
2558
            itemHistory.isListedOnSource = item.isListedOnFlipkart
2559
            itemHistory.transferPrice = mpItem.currentTp
2560
            itemHistory.sellingPrice = mpItem.currentSp
2561
            itemHistory.courierCost = mpItem.courierCost
2562
            itemHistory.commission = item.commissionValue
2563
            itemHistory.serviceTax = item.serviceTaxValue
2564
            itemHistory.suppressPriceFeed = item.suppressPriceFeed
2565
            itemHistory.suppressInventoryFeed = item.suppressInventoryFeed
2566
            itemHistory.updatedOn = item.updatedOn
2567
            itemHistory.maxNlc = item.maxNlc
2568
            itemHistory.skuAtSource = item. skuAtFlipkart
2569
            itemHistory.marketPlaceSerialNumber = item.flipkartSerialNumber
2570
            itemHistory.priceUpdatedBy = item.updatedBy
2571
            if (mpItem.currentSp!=t_mpItem.currentSp):
2572
                item.updatedBy = flipkartitem.updatedBy
2573
            item.exceptionPrice = flipkartitem.exceptionPrice
2574
            item.warehouseId = flipkartitem.warehouseId
2575
            item.isListedOnFlipkart = flipkartitem.isListedOnFlipkart
2576
            item.commissionValue = flipkartitem.commissionValue
2577
            item.serviceTaxValue = flipkartitem.serviceTaxValue
2578
            item.suppressPriceFeed =flipkartitem.suppressPriceFeed
2579
            item.suppressInventoryFeed =flipkartitem.suppressInventoryFeed
2580
            item.maxNlc = flipkartitem.maxNlc
2581
            item.skuAtFlipkart = flipkartitem.skuAtFlipkart
2582
            item.flipkartSerialNumber = flipkartitem.flipkartSerialNumber
2583
            item.updatedOn = datetime.datetime.now()
2584
            __markStatusForFlipkartItems(flipkartitem,item)
2585
            return update_marketplace_attributes_for_item(flipkartitem.marketplaceItems)
2586
        else:
2587
            item = FlipkartItem()
2588
            if flipkartitem.item_id is not None:
2589
                item.item_id = flipkartitem.item_id
2590
                item.exceptionPrice = flipkartitem.exceptionPrice
2591
                item.warehouseId = flipkartitem.warehouseId
2592
                item.isListedOnFlipkart = flipkartitem.isListedOnFlipkart
2593
                item.commissionValue = flipkartitem.commissionValue
2594
                item.serviceTaxValue = flipkartitem.serviceTaxValue
2595
                item.suppressPriceFeed =flipkartitem.suppressPriceFeed
2596
                item.suppressInventoryFeed =flipkartitem.suppressInventoryFeed 
2597
                item.maxNlc = flipkartitem.maxNlc
2598
                item.skuAtFlipkart = flipkartitem.skuAtFlipkart
2599
                item.flipkartSerialNumber = flipkartitem.flipkartSerialNumber
2600
                item.updatedOn = datetime.datetime.now()  
2601
                item.updatedBy = flipkartitem.updatedBy
2602
                __markStatusForFlipkartItems(flipkartitem,item)
2603
                return update_marketplace_attributes_for_item(flipkartitem.marketplaceItems)  
2604
    except Exception as ex:
2605
        print "Unable to addOrupdate flipkart"
2606
        print ex
2607
        return False
2608
 
2609
def get_flipkart_item_detail(itemid):
2610
    item = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).filter(FlipkartItem.item_id==itemid).first()
2611
    try:
2612
        client = InventoryClient().get_client()
2613
        FlipkartInventoryItem = client.getFlipkartlInventoryForItem(itemid)
2614
        return item, FlipkartInventoryItem
2615
    except Exception as e:
2616
        print e
2617
        return item,None
2618
 
2619
def get_flipkart_items(offset,limit):
2620
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).offset(offset).limit(limit).all()
2621
 
2622
def search_flipkart_items(search_terms,offset,limit):
2623
    query = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id))
2624
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2625
    for search_term in search_terms:
2626
        query_clause = []
2627
        query_clause.append(Item.id.like(search_term))
2628
        query_clause.append(Item.brand.like(search_term))
2629
        query_clause.append(Item.model_name.like(search_term))
2630
        query_clause.append(Item.model_number.like(search_term))
2631
        query_clause.append(Item.color.like(search_term))
2632
        query = query.filter(or_(*query_clause))
2633
 
2634
    query = query.offset(offset)
2635
    if limit:
2636
        query = query.limit(limit)
2637
    flipkart_items = query.all()
2638
    return flipkart_items
2639
 
2640
def get_flipkart_search_result_count(search_terms):
2641
    query = session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id))
2642
    search_terms = ['%' + search_term + '%' for search_term in search_terms]
2643
    for search_term in search_terms:
2644
        query_clause = []
2645
        query_clause.append(Item.id.like(search_term))
2646
        query_clause.append(Item.brand.like(search_term))
2647
        query_clause.append(Item.model_name.like(search_term))
2648
        query_clause.append(Item.model_number.like(search_term))
2649
        query_clause.append(Item.color.like(search_term))
2650
        query = query.filter(or_(*query_clause))
2651
    return query.count()
2652
 
2653
def get_count_for_flipkart_items():
2654
    return session.query(func.count(FlipkartItem.item_id)).scalar()
2655
 
2656
def get_all_fk_items():
2657
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).all()
2658
 
10140 vikram.rag 2659
def get_flipkart_item_by_sku_at_flipkart(sku):
10141 vikram.rag 2660
    return session.query(FlipkartItem,Item).join((Item,FlipkartItem.item_id==Item.id)).filter(FlipkartItem.skuAtFlipkart==sku).first()
10909 vikram.rag 2661
 
11015 kshitij.so 2662
def get_marketplace_history(source,offset,itemId):
2663
    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()
2664
 
10909 vikram.rag 2665
def get_all_fbb_listed_items():
10927 vikram.rag 2666
    return Amazonlisted.query.filter(Amazonlisted.isFbb==True).filter(Amazonlisted.fbbListedOn==None).all()
11015 kshitij.so 2667
 
10924 vikram.rag 2668
def get_all_fbb_pricing_items():
10927 vikram.rag 2669
    return Amazonlisted.query.filter(Amazonlisted.isFbb==True).filter(Amazonlisted.suppressFbbPriceUpdate==False).filter(Amazonlisted.fbbPriceLastUpdatedOn > Amazonlisted.fbbPriceLastUpdatedOnSc).filter(Amazonlisted.fbbListedOn != None).all()
11015 kshitij.so 2670
 
2671
 
2672
def get_count_for_marketplaceHistory(source,itemId):
2673
    return len(session.query(MarketPlaceHistory).filter(MarketPlaceHistory.item_id==itemId).filter(MarketPlaceHistory.source==source).filter(or_(MarketPlaceHistory.toGroup==True,MarketPlaceHistory.toGroup==None)).all())   
2674
 
2675
def get_marketplace_history_by_date(source,startDate,endDate,offset,limit,itemId):
2676
    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()
2677
 
11531 vikram.rag 2678
def get_private_deal_details(itemid):
2679
    return PrivateDeals.get_by(item_id=itemid)
2680
 
2681
def get_private_deal_items(offset,limit):
12124 kshitij.so 2682
    if offset==0 and limit==0:
2683
        return session.query(Item).join((PrivateDeals,Item.id==PrivateDeals.item_id)).filter(PrivateDeals.isActive==True).all()
11614 vikram.rag 2684
    return session.query(Item).join((PrivateDeals,Item.id==PrivateDeals.item_id)).filter(PrivateDeals.isActive==True).offset(offset).limit(limit).all()
11531 vikram.rag 2685
 
11653 amit.gupta 2686
def get_all_active_private_deals(itemIds, daysDelta):
2687
        dealsMap = dict()
2688
        all_active_items_query =  session.query(PrivateDeals).filter(PrivateDeals.isActive==True).filter(now().between(PrivateDeals.startDate, PrivateDeals.endDate + datetime.timedelta(days=daysDelta)))
2689
        if itemIds is not None:  
11667 amit.gupta 2690
            all_active_items_query = all_active_items_query.filter(PrivateDeals.item_id.in_(itemIds))
11653 amit.gupta 2691
 
2692
        all_active_private_deals = all_active_items_query.all()
2693
        if all_active_private_deals is not None or all_active_private_deals!=[]:
11592 amit.gupta 2694
            for active_private_deal in all_active_private_deals:
2695
                dealsMap[active_private_deal.item_id] = to_t_private_deal(active_private_deal)
2696
        return dealsMap 
2697
 
11531 vikram.rag 2698
def add_or_update_private_deal(privatedeal):
11606 vikram.rag 2699
    print 'Inside update private deals'
11531 vikram.rag 2700
    try:
2701
        deal =  PrivateDeals.get_by(item_id=privatedeal.item_id)
2702
        if deal is None:
2703
            deal = PrivateDeals()
2704
            deal.item_id = privatedeal.item_id
2705
            deal.dealFreebieItemId = privatedeal.dealFreebieItemId  
2706
            deal.dealPrice = privatedeal.dealPrice
11838 amit.gupta 2707
            deal.startDate =  to_py_date(privatedeal.startDate).replace(hour=0,second=0,minute=0)
2708
            deal.endDate = to_py_date(privatedeal.endDate).replace(hour=0,second=0,minute=0)
11566 vikram.rag 2709
            deal.dealTextOption = privatedeal.dealTextOption
11531 vikram.rag 2710
            deal.dealText = privatedeal.dealText
2711
            deal.isCod =  privatedeal.isCod
2712
            deal.rank = privatedeal.rank
11566 vikram.rag 2713
            deal.dealFreebieOption = privatedeal.dealFreebieOption
11606 vikram.rag 2714
            deal.isActive = privatedeal.isActive  
11531 vikram.rag 2715
        else:
2716
            deal.dealFreebieItemId = privatedeal.dealFreebieItemId  
2717
            deal.dealPrice = privatedeal.dealPrice
11896 amit.gupta 2718
            deal.startDate =  to_py_date(privatedeal.startDate).replace(hour=0,second=0,minute=0)
2719
            deal.endDate = to_py_date(privatedeal.endDate).replace(hour=0,second=0,minute=0)
11606 vikram.rag 2720
            deal.dealTextOption = privatedeal.dealTextOption
11531 vikram.rag 2721
            deal.dealText = privatedeal.dealText
2722
            deal.isCod =  privatedeal.isCod
2723
            deal.rank = privatedeal.rank
11566 vikram.rag 2724
            deal.dealFreebieOption = privatedeal.dealFreebieOption
11606 vikram.rag 2725
            deal.isActive = privatedeal.isActive
11531 vikram.rag 2726
        session.commit()
2727
        return True
2728
    except Exception as e:
11606 vikram.rag 2729
        print 'Exception in updating private deals'
11531 vikram.rag 2730
        print e
11606 vikram.rag 2731
        return False
11645 amit.gupta 2732
 
2733
def get_private_deals_query():
11857 amit.gupta 2734
    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 2735
 
11645 amit.gupta 2736
def get_private_deals_count():
11857 amit.gupta 2737
    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 2738
 
11635 vikram.rag 2739
def get_private_deals_catalog_ids(offset,limit):
11645 amit.gupta 2740
    private_deal_items = get_private_deals_query().offset(offset).limit(limit).all()
11635 vikram.rag 2741
    if private_deal_items is None:
11645 amit.gupta 2742
        return []
11635 vikram.rag 2743
    else:
11908 kshitij.so 2744
        return [item.catalog_item_id for item in private_deal_items]
2745
 
2746
def get_amazon_out_of_sync(itemId):
2747
    return AmazonOutOfSync.get_by(item_id=itemId)
2748
 
2749
def get_all_private_deals_comparison():
12133 kshitij.so 2750
    return session.query(PrivateDealsPriceComparison,Item).join((Item,PrivateDealsPriceComparison.item_id==Item.id)).all()
2751
 
2752
def get_all_snapdeal_marketplaceItem():
2753
    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()
2754
 
2755
def get_all_flipkart_marketplaceItem():
2756
    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()
2757
 
12243 kshitij.so 2758
def add_competitor_scraping(competitorScrapingMap):
2759
    for competitorScraping in competitorScrapingMap.itervalues():
2760
        cp = CompetitorPricing()
2761
        cp.item_id = competitorScraping.item_id
2762
        cp.snapdealScraping = competitorScraping.isSnapdeal
2763
        cp.flipkartScraping = competitorScraping.isFlipkart
2764
        cp.amazonScraping = competitorScraping.isAmazon
2765
        cp.uploadId = competitorScraping.uploadId
2766
    session.commit()
12133 kshitij.so 2767
 
12243 kshitij.so 2768
def get_previous_competitor_scraping(delta):
2769
    result = []
2770
    items = session.query(func.count(CompetitorPricing.item_id),CompetitorPricing.uploadId,CompetitorPricing.isProcessed).group_by(CompetitorPricing.uploadId).order_by(desc(CompetitorPricing.uploadId)).limit(delta).all()
2771
    for item in items:
2772
        t_competitorPricing = TCompetitorPricing()
2773
        t_competitorPricing.item_id = item[0]
2774
        t_competitorPricing.uploadId = item[1]
2775
        t_competitorPricing.processed = item[2]
2776
        result.append(t_competitorPricing)
2777
    return result
2778
 
2779
 
2780