Subversion Repositories SmartDukaan

Rev

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