Subversion Repositories SmartDukaan

Rev

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