Subversion Repositories SmartDukaan

Rev

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