Subversion Repositories SmartDukaan

Rev

Rev 17216 | Rev 18048 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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