Subversion Repositories SmartDukaan

Rev

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