Subversion Repositories SmartDukaan

Rev

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