Subversion Repositories SmartDukaan

Rev

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