Subversion Repositories SmartDukaan

Rev

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