Subversion Repositories SmartDukaan

Rev

Rev 5894 | Rev 5950 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5894 Rev 5944
Line 4... Line 4...
4
@author: Chandranshu
4
@author: Chandranshu
5
'''
5
'''
6
 
6
 
7
from datetime import date, timedelta
7
from datetime import date, timedelta
8
from elixir import *
8
from elixir import *
-
 
9
from random import randrange
9
from reportlab.lib.units import inch
10
from reportlab.lib.units import inch
10
from reportlab.pdfgen.canvas import Canvas
11
from reportlab.pdfgen.canvas import Canvas
11
from reportlab.rl_config import defaultPageSize
12
from reportlab.rl_config import defaultPageSize
-
 
13
from shop2020.clients.AlertClient import AlertClient
12
from shop2020.clients.CatalogClient import CatalogClient
14
from shop2020.clients.CatalogClient import CatalogClient
13
from shop2020.clients.HelperClient import HelperClient
15
from shop2020.clients.HelperClient import HelperClient
-
 
16
from shop2020.clients.InventoryClient import InventoryClient
14
from shop2020.clients.LogisticsClient import LogisticsClient
17
from shop2020.clients.LogisticsClient import LogisticsClient
15
from shop2020.clients.PaymentClient import PaymentClient
18
from shop2020.clients.PaymentClient import PaymentClient
16
from shop2020.clients.UserClient import UserClient
19
from shop2020.clients.UserClient import UserClient
17
from shop2020.clients.WarehouseClient import WarehouseClient
20
from shop2020.clients.WarehouseClient import WarehouseClient
18
from shop2020.model.v1 import order
21
from shop2020.model.v1 import order
19
from shop2020.model.v1.order.impl.DataService import Transaction, LineItem, \
22
from shop2020.model.v1.order.impl.DataService import Transaction, LineItem, \
20
    Order, BatchNoGenerator, InvoiceIDGenerator, TransactionRequiringExtraProcessing, \
23
    Order, BatchNoGenerator, InvoiceIDGenerator, TransactionRequiringExtraProcessing, \
21
    OrderInventory, Alert, PaymentSettlement, EBSSettlementSummary, \
24
    OrderInventory, Alert, PaymentSettlement, EBSSettlementSummary, \
22
    CodVerificationAgent, Attribute, RechargeVoucherTracker
25
    CodVerificationAgent, Attribute, RechargeVoucherTracker
23
 
-
 
24
from shop2020.model.v1.order.impl.model.ReturnOrder import ReturnOrder
26
from shop2020.model.v1.order.impl.model.ReturnOrder import ReturnOrder
25
from shop2020.thriftpy.generic.ttypes import ExceptionType
-
 
26
from shop2020.thriftpy.alert.ttypes import MonitoredEntity, EntityType
27
from shop2020.thriftpy.alert.ttypes import MonitoredEntity, EntityType
-
 
28
from shop2020.thriftpy.generic.ttypes import ExceptionType
27
from shop2020.thriftpy.logistics.ttypes import DeliveryType, PickUpType
29
from shop2020.thriftpy.logistics.ttypes import DeliveryType, PickUpType
28
from shop2020.thriftpy.model.v1.catalog.ttypes import BillingType, \
30
from shop2020.thriftpy.model.v1.inventory.ttypes import BillingType, \
29
    InventoryServiceException, WarehouseType, ItemType, InventoryType
31
    InventoryServiceException, WarehouseType, InventoryType
-
 
32
from shop2020.thriftpy.model.v1.catalog.ttypes import ItemType
30
from shop2020.thriftpy.model.v1.order.ttypes import TransactionServiceException, \
33
from shop2020.thriftpy.model.v1.order.ttypes import TransactionServiceException, \
31
    TransactionStatus, OrderStatus, DelayReason, ExtraTransactionProcessingType, \
34
    TransactionStatus, OrderStatus, DelayReason, ExtraTransactionProcessingType, \
32
    HotspotAction, TimeoutSummary, OrderStatusGroups, OrderType
35
    HotspotAction, TimeoutSummary, OrderStatusGroups, OrderType
-
 
36
from shop2020.thriftpy.model.v1.user.ttypes import VoucherType
33
from shop2020.thriftpy.payments.ttypes import PaymentException
37
from shop2020.thriftpy.payments.ttypes import PaymentException
34
from shop2020.thriftpy.warehouse.ttypes import ScanType, \
38
from shop2020.thriftpy.warehouse.ttypes import ScanType, \
35
    WarehouseServiceException
39
    WarehouseServiceException
36
from shop2020.utils.EmailAttachmentSender import mail, get_attachment_part,\
40
from shop2020.utils.EmailAttachmentSender import mail, get_attachment_part, \
37
    mail_html
41
    mail_html
38
from shop2020.utils.Utils import to_py_date, to_java_date
42
from shop2020.utils.Utils import to_py_date, to_java_date
39
from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
43
from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
40
from sqlalchemy.sql import func
44
from sqlalchemy.sql import func
41
from sqlalchemy.sql.expression import and_, or_, desc, not_, distinct, select
45
from sqlalchemy.sql.expression import and_, or_, desc, not_, distinct, select
42
from string import Template
46
from string import Template
43
from textwrap import dedent
47
from textwrap import dedent
44
import datetime
48
import datetime
-
 
49
import httplib
45
import logging
50
import logging
46
import os
51
import os
47
import sys
52
import sys
48
import time
53
import time
49
import traceback
54
import traceback
50
from shop2020.thriftpy.model.v1.user.ttypes import VoucherType
-
 
51
from random import randrange
-
 
52
from shop2020.clients.AlertClient import AlertClient
-
 
53
import httplib
-
 
54
import urllib
55
import urllib
-
 
56
 
55
logging.basicConfig(level=logging.DEBUG)
57
logging.basicConfig(level=logging.DEBUG)
56
 
58
 
57
 
59
 
58
PREPAID_SHIPPING_CUTOFF_TIME = 15
60
PREPAID_SHIPPING_CUTOFF_TIME = 15
59
COD_SHIPPING_CUTOFF_TIME = 12
61
COD_SHIPPING_CUTOFF_TIME = 12
Line 245... Line 247...
245
            order.expected_shipping_time = (current_time + datetime.timedelta(days=logistics_info.shippingTime)).replace(hour=PREPAID_SHIPPING_CUTOFF_TIME, minute=0, second=0)
247
            order.expected_shipping_time = (current_time + datetime.timedelta(days=logistics_info.shippingTime)).replace(hour=PREPAID_SHIPPING_CUTOFF_TIME, minute=0, second=0)
246
            order.promised_shipping_time = order.expected_shipping_time
248
            order.promised_shipping_time = order.expected_shipping_time
247
            order.expected_delivery_time = (current_time + datetime.timedelta(days=logistics_info.deliveryTime)).replace(hour=PREPAID_SHIPPING_CUTOFF_TIME, minute=0, second=0)
249
            order.expected_delivery_time = (current_time + datetime.timedelta(days=logistics_info.deliveryTime)).replace(hour=PREPAID_SHIPPING_CUTOFF_TIME, minute=0, second=0)
248
            order.promised_delivery_time = order.expected_delivery_time 
250
            order.promised_delivery_time = order.expected_delivery_time 
249
            
251
            
250
            catalog_client = CatalogClient().get_client()
252
            inventory_client = InventoryClient().get_client()
251
            catalog_client.reserveItemInWarehouse(item_id, logistics_info.fulfilmentWarehouseId, order.lineitems[0].quantity)
253
            inventory_client.reserveItemInWarehouse(item_id, logistics_info.fulfilmentWarehouseId, order.lineitems[0].quantity)
252
 
254
 
253
            try:
255
            try:
254
                item_pricing = catalog_client.getItemPricing(item_id, -1)
256
                item_pricing = inventory_client.getItemPricing(item_id, -1)
255
                order.lineitems[0].transfer_price = item_pricing.transferPrice
257
                order.lineitems[0].transfer_price = item_pricing.transferPrice
256
            except:
258
            except:
257
                print "Not able to get transfer price. Skipping"
259
                print "Not able to get transfer price. Skipping"
258
             
260
            
-
 
261
            catalog_client = CatalogClient().get_client() 
259
            voucherAmount = catalog_client.getVoucherAmount(item_id, VoucherType.SPICEDECK_MOBILE)
262
            voucherAmount = catalog_client.getVoucherAmount(item_id, VoucherType.SPICEDECK_MOBILE)
260
            if voucherAmount:
263
            if voucherAmount:
261
                __create_recharge_voucher_tracker(order, voucherAmount, VoucherType.SPICEDECK_MOBILE)
264
                __create_recharge_voucher_tracker(order, voucherAmount, VoucherType.SPICEDECK_MOBILE)
262
                                
265
                                
263
    elif new_status == TransactionStatus.COD_IN_PROCESS:
266
    elif new_status == TransactionStatus.COD_IN_PROCESS:
Line 291... Line 294...
291
            order.expected_shipping_time = (current_time + datetime.timedelta(days=logistics_info.shippingTime)).replace(hour=COD_SHIPPING_CUTOFF_TIME, minute=0, second=0)
294
            order.expected_shipping_time = (current_time + datetime.timedelta(days=logistics_info.shippingTime)).replace(hour=COD_SHIPPING_CUTOFF_TIME, minute=0, second=0)
292
            order.promised_shipping_time = order.expected_shipping_time
295
            order.promised_shipping_time = order.expected_shipping_time
293
            order.expected_delivery_time = (current_time + datetime.timedelta(days=logistics_info.deliveryTime)).replace(hour=COD_SHIPPING_CUTOFF_TIME, minute=0, second=0)
296
            order.expected_delivery_time = (current_time + datetime.timedelta(days=logistics_info.deliveryTime)).replace(hour=COD_SHIPPING_CUTOFF_TIME, minute=0, second=0)
294
            order.promised_delivery_time = order.expected_delivery_time
297
            order.promised_delivery_time = order.expected_delivery_time
295
            
298
            
296
            catalog_client = CatalogClient().get_client()
299
            inventory_client = InventoryClient().get_client()
297
            catalog_client.reserveItemInWarehouse(item_id, logistics_info.fulfilmentWarehouseId, order.lineitems[0].quantity)
300
            inventory_client.reserveItemInWarehouse(item_id, logistics_info.fulfilmentWarehouseId, order.lineitems[0].quantity)
298
 
301
 
299
            try:
302
            try:
300
                item_pricing = catalog_client.getItemPricing(item_id, -1)
303
                item_pricing = inventory_client.getItemPricing(item_id, -1)
301
                order.lineitems[0].transfer_price = item_pricing.transferPrice        
304
                order.lineitems[0].transfer_price = item_pricing.transferPrice        
302
            except:
305
            except:
303
                print "Not able to get transfer price. Skipping"
306
                print "Not able to get transfer price. Skipping"
304
            
307
            
-
 
308
            catalog_client = CatalogClient().get_client()
305
            voucherAmount = catalog_client.getVoucherAmount(item_id, VoucherType.SPICEDECK_MOBILE)
309
            voucherAmount = catalog_client.getVoucherAmount(item_id, VoucherType.SPICEDECK_MOBILE)
306
            if voucherAmount:
310
            if voucherAmount:
307
                __create_recharge_voucher_tracker(order, voucherAmount, VoucherType.SPICEDECK_MOBILE)
311
                __create_recharge_voucher_tracker(order, voucherAmount, VoucherType.SPICEDECK_MOBILE)
308
    session.commit()
312
    session.commit()
309
 
313
 
Line 951... Line 955...
951
        else:
955
        else:
952
            raise TransactionServiceException(115, "Payment capture failed.")
956
            raise TransactionServiceException(115, "Payment capture failed.")
953
 
957
 
954
def __amend_fulfilment_warehouse(order):
958
def __amend_fulfilment_warehouse(order):
955
    itemId = order.lineitems[0].item_id
959
    itemId = order.lineitems[0].item_id
956
    catalogClient = CatalogClient().get_client()
960
    inventoryClient = InventoryClient().get_client()
957
    inventory = catalogClient.getItemInventoryByItemId(itemId)
961
    inventory = inventoryClient.getItemInventoryByItemId(itemId)
958
    if not (inventory.availability.has_key(order.fulfilmentWarehouseId) and inventory.availability[order.fulfilmentWarehouseId]):
962
    if not (inventory.availability.has_key(order.fulfilmentWarehouseId) and inventory.availability[order.fulfilmentWarehouseId]):
959
        for warehouse in catalogClient.getWarehouses(WarehouseType.OURS, InventoryType.GOOD, 0, order.warehouse_id, 0):
963
        for warehouse in inventoryClient.getWarehouses(WarehouseType.OURS, InventoryType.GOOD, 0, order.warehouse_id, 0):
960
            if inventory.availability.has_key(warehouse.id) and inventory.availability[warehouse.id] >= inventory.reserved[warehouse.id] + order.lineitems[0].quantity:
964
            if inventory.availability.has_key(warehouse.id) and inventory.availability[warehouse.id] >= inventory.reserved[warehouse.id] + order.lineitems[0].quantity:
961
                catalogClient.reduceReservationCount(itemId, order.fulfilmentWarehouseId, order.lineitems[0].quantity)
965
                inventoryClient.reduceReservationCount(itemId, order.fulfilmentWarehouseId, order.lineitems[0].quantity)
962
                catalogClient.reserveItemInWarehouse(itemId, warehouse.id, order.lineitems[0].quantity)
966
                inventoryClient.reserveItemInWarehouse(itemId, warehouse.id, order.lineitems[0].quantity)
963
                order.fulfilmentWarehouseId = warehouse.id
967
                order.fulfilmentWarehouseId = warehouse.id
964
                break
968
                break
965
 
969
 
966
def add_billing_details(orderId, invoice_number, serialNumbers, itemNumbers, billedBy, jacketNumber, billingType, fulfilmentWarehouseId, authorize):
970
def add_billing_details(orderId, invoice_number, serialNumbers, itemNumbers, billedBy, jacketNumber, billingType, fulfilmentWarehouseId, authorize):
967
    if jacketNumber is None or jacketNumber <= 0:
971
    if jacketNumber is None or jacketNumber <= 0:
Line 1007... Line 1011...
1007
        order.billed_by = billedBy
1011
        order.billed_by = billedBy
1008
 
1012
 
1009
        # Letting the billing process fail in cases where we are unable to 
1013
        # Letting the billing process fail in cases where we are unable to 
1010
        # fill in transfer price
1014
        # fill in transfer price
1011
        try:
1015
        try:
1012
            catalog_client = CatalogClient().get_client()
1016
            inventory_client = InventoryClient().get_client()
1013
            warehouse = catalog_client.getWarehouse(fulfilmentWarehouseId)
1017
            warehouse = inventory_client.getWarehouse(fulfilmentWarehouseId)
1014
            item_pricing = catalog_client.getItemPricing(item_id, warehouse.vendor.id)
1018
            item_pricing = inventory_client.getItemPricing(item_id, warehouse.vendor.id)
1015
            lineitem.transfer_price = item_pricing.transferPrice
1019
            lineitem.transfer_price = item_pricing.transferPrice
1016
            order.vendorId = warehouse.vendor.id
1020
            order.vendorId = warehouse.vendor.id
1017
        except InventoryServiceException as e:
1021
        except InventoryServiceException as e:
1018
            print sys.exc_info()[0]
1022
            print sys.exc_info()[0]
1019
            print e.message
1023
            print e.message
Line 1052... Line 1056...
1052
                    print sys.exc_info()[0]
1056
                    print sys.exc_info()[0]
1053
                    print 'Could not scan out orders due to: ' + e.message
1057
                    print 'Could not scan out orders due to: ' + e.message
1054
                    raise TransactionServiceException(110, e.message)
1058
                    raise TransactionServiceException(110, e.message)
1055
        else:
1059
        else:
1056
            if not warehouse.isAvailabilityMonitored:
1060
            if not warehouse.isAvailabilityMonitored:
1057
                catalog_client = CatalogClient().get_client()
1061
                inventory_client = InventoryClient().get_client()
1058
                catalog_client.addInventory(item.id, warehouse.id, -1 * lineitem.quantity)
1062
                inventory_client.addInventory(item.id, warehouse.id, -1 * lineitem.quantity)
1059
 
1063
 
1060
        __update_inventory_reservation(order)
1064
        __update_inventory_reservation(order)
1061
        order.fulfilmentWarehouseId = warehouse.id
1065
        order.fulfilmentWarehouseId = warehouse.id
1062
        session.commit()
1066
        session.commit()
1063
        return True
1067
        return True
Line 1648... Line 1652...
1648
    from_user = 'cnc.center@shop2020.in'
1652
    from_user = 'cnc.center@shop2020.in'
1649
    from_pwd = '5h0p2o2o'
1653
    from_pwd = '5h0p2o2o'
1650
    
1654
    
1651
    subject = "Pickup request from " + order.customer_city
1655
    subject = "Pickup request from " + order.customer_city
1652
    try:
1656
    try:
1653
        catalog_client = CatalogClient().get_client()
1657
        inventory_client = InventoryClient().get_client()
1654
        warehouse = catalog_client.getWarehouse(order.warehouse_id)
1658
        warehouse = inventory_client.getWarehouse(order.warehouse_id)
1655
        
1659
        
1656
        logistics_client = LogisticsClient().get_client()
1660
        logistics_client = LogisticsClient().get_client()
1657
        provider = logistics_client.getProvider(providerId)
1661
        provider = logistics_client.getProvider(providerId)
1658
        to_addr = provider.details[DeliveryType.PREPAID].email
1662
        to_addr = provider.details[DeliveryType.PREPAID].email
1659
        raw_message = '''
1663
        raw_message = '''
Line 1715... Line 1719...
1715
    from_user = 'help@shop2020.in'
1719
    from_user = 'help@shop2020.in'
1716
    from_pwd = '5h0p2o2o'
1720
    from_pwd = '5h0p2o2o'
1717
    subject = 'Pickup details'
1721
    subject = 'Pickup details'
1718
    filename = "/tmp/" +  str(order.id) +".pdf" 
1722
    filename = "/tmp/" +  str(order.id) +".pdf" 
1719
    try:
1723
    try:
1720
        catalog_client = CatalogClient().get_client()
1724
        inventory_client = InventoryClient().get_client()
1721
        warehouse = catalog_client.getWarehouse(order.warehouse_id)
1725
        warehouse = inventory_client.getWarehouse(order.warehouse_id)
1722
        
1726
        
1723
        logistics_client = LogisticsClient().get_client()
1727
        logistics_client = LogisticsClient().get_client()
1724
        provider = logistics_client.getProvider(providerId)
1728
        provider = logistics_client.getProvider(providerId)
1725
        provider_name = provider.name
1729
        provider_name = provider.name
1726
        
1730
        
Line 1872... Line 1876...
1872
        order.received_return_timestamp = datetime.datetime.now()
1876
        order.received_return_timestamp = datetime.datetime.now()
1873
    else:
1877
    else:
1874
        return False
1878
        return False
1875
 
1879
 
1876
    # For OUR warehouses, we need to scan in items for every return
1880
    # For OUR warehouses, we need to scan in items for every return
1877
    catalogClient = CatalogClient().get_client()
1881
    inventoryClient = InventoryClient().get_client()
1878
    warehouse = catalogClient.getWarehouse(order.warehouse_id)
1882
    warehouse = inventoryClient.getWarehouse(order.warehouse_id)
1879
    if warehouse.billingType == BillingType.OURS:
1883
    if warehouse.billingType == BillingType.OURS:
1880
        scanMap = {
1884
        scanMap = {
1881
            OrderStatus.RTO_RECEIVED_PRESTINE : ScanType.SALE_RET,
1885
            OrderStatus.RTO_RECEIVED_PRESTINE : ScanType.SALE_RET,
1882
            OrderStatus.RTO_RECEIVED_DAMAGED  : ScanType.SALE_RET_UNUSABLE,
1886
            OrderStatus.RTO_RECEIVED_DAMAGED  : ScanType.SALE_RET_UNUSABLE,
1883
            OrderStatus.RTO_LOST_IN_TRANSIT   : ScanType.LOST_IN_TRANSIT,
1887
            OrderStatus.RTO_LOST_IN_TRANSIT   : ScanType.LOST_IN_TRANSIT,
Line 1887... Line 1891...
1887
        }
1891
        }
1888
 
1892
 
1889
        if scanMap.has_key(order.status):
1893
        if scanMap.has_key(order.status):
1890
            scanType = scanMap[order.status]
1894
            scanType = scanMap[order.status]
1891
            lineitem = order.lineitems[0]
1895
            lineitem = order.lineitems[0]
-
 
1896
            catalogClient = CatalogClient().get_client()
1892
            item = catalogClient.getItem(lineitem.item_id)
1897
            item = catalogClient.getItem(lineitem.item_id)
1893
            warehouseClient = WarehouseClient().get_client()
1898
            warehouseClient = WarehouseClient().get_client()
1894
            if item.type == ItemType.SERIALIZED:
1899
            if item.type == ItemType.SERIALIZED:
1895
                warehouseClient.scanSerializedItemForOrder(lineitem.serial_number, scanType, order.id, order.fulfilmentWarehouseId, lineitem.quantity, order.warehouse_id)
1900
                warehouseClient.scanSerializedItemForOrder(lineitem.serial_number, scanType, order.id, order.fulfilmentWarehouseId, lineitem.quantity, order.warehouse_id)
1896
            else:
1901
            else:
Line 1928... Line 1933...
1928
        order.statusDescription = "Return product unusable"
1933
        order.statusDescription = "Return product unusable"
1929
        update_trust_level(order)
1934
        update_trust_level(order)
1930
    session.commit()
1935
    session.commit()
1931
 
1936
 
1932
    # For OUR warehouses, we need to scan in items for every return
1937
    # For OUR warehouses, we need to scan in items for every return
1933
    catalogClient = CatalogClient().get_client()
1938
    inventoryClient = InventoryClient().get_client()
1934
    warehouse = catalogClient.getWarehouse(order.warehouse_id)
1939
    warehouse = inventoryClient.getWarehouse(order.warehouse_id)
1935
    if warehouse.billingType == BillingType.OURS:
1940
    if warehouse.billingType == BillingType.OURS:
1936
        lineitem = order.lineitems[0]
1941
        lineitem = order.lineitems[0]
-
 
1942
        catalogClient = CatalogClient().get_client()
1937
        item = catalogClient.getItem(lineitem.item_id)
1943
        item = catalogClient.getItem(lineitem.item_id)
1938
        warehouse_client = WarehouseClient().get_client()
1944
        warehouse_client = WarehouseClient().get_client()
1939
        if item.type == ItemType.SERIALIZED:
1945
        if item.type == ItemType.SERIALIZED:
1940
            warehouse_client.scanSerializedItemForOrder(lineitem.serial_number, scanType, order.id, order.fulfilmentWarehouseId, lineitem.quantity, order.warehouse_id)
1946
            warehouse_client.scanSerializedItemForOrder(lineitem.serial_number, scanType, order.id, order.fulfilmentWarehouseId, lineitem.quantity, order.warehouse_id)
1941
        else:
1947
        else:
Line 2188... Line 2194...
2188
            __update_inventory_reservation(order)
2194
            __update_inventory_reservation(order)
2189
            order.statusDescription = "Order Cancelled due to payment flagged"
2195
            order.statusDescription = "Order Cancelled due to payment flagged"
2190
 
2196
 
2191
    # For orders that are cancelled after being billed, we need to scan in the scanned out
2197
    # For orders that are cancelled after being billed, we need to scan in the scanned out
2192
    # inventory item and change availability accordingly
2198
    # inventory item and change availability accordingly
2193
    catalogClient = CatalogClient().get_client()
2199
    inventoryClient = InventoryClient().get_client()
2194
    warehouse = catalogClient.getWarehouse(order.warehouse_id)
2200
    warehouse = inventoryClient.getWarehouse(order.warehouse_id)
2195
    if warehouse.billingType == BillingType.OURS:
2201
    if warehouse.billingType == BillingType.OURS:
2196
        if order.status in [OrderStatus.BILLED, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_FROM_WH] or (order.status == OrderStatus.CANCEL_REQUEST_CONFIRMED and order.previousStatus in [OrderStatus.BILLED, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_FROM_WH]):
2202
        if order.status in [OrderStatus.BILLED, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_FROM_WH] or (order.status == OrderStatus.CANCEL_REQUEST_CONFIRMED and order.previousStatus in [OrderStatus.BILLED, OrderStatus.SHIPPED_TO_LOGST, OrderStatus.SHIPPED_FROM_WH]):
2197
            lineitem = order.lineitems[0]
2203
            lineitem = order.lineitems[0]
-
 
2204
            catalogClient = CatalogClient().get_client()
2198
            item = catalogClient.getItem(lineitem.item_id)
2205
            item = catalogClient.getItem(lineitem.item_id)
2199
            warehouseClient = WarehouseClient().get_client()
2206
            warehouseClient = WarehouseClient().get_client()
2200
            if ItemType.SERIALIZED == item.type:
2207
            if ItemType.SERIALIZED == item.type:
2201
                warehouseClient.scanSerializedItemForOrder(lineitem.serial_number, ScanType.SALE_RET, order.id, order.fulfilmentWarehouseId, lineitem.quantity, order.warehouse_id)
2208
                warehouseClient.scanSerializedItemForOrder(lineitem.serial_number, ScanType.SALE_RET, order.id, order.fulfilmentWarehouseId, lineitem.quantity, order.warehouse_id)
2202
            else:
2209
            else:
Line 2213... Line 2220...
2213
def __update_inventory_reservation(order):
2220
def __update_inventory_reservation(order):
2214
    '''
2221
    '''
2215
    Reduce the reservation count for all line items of the given order.
2222
    Reduce the reservation count for all line items of the given order.
2216
    '''
2223
    '''
2217
    try:
2224
    try:
2218
        catalog_client = CatalogClient().get_client()
2225
        inventoryClient = InventoryClient().get_client()
2219
        for lineitem in order.lineitems:
2226
        for lineitem in order.lineitems:
2220
            catalog_client.reduceReservationCount(lineitem.item_id, order.fulfilmentWarehouseId, lineitem.quantity)
2227
            inventoryClient.reduceReservationCount(lineitem.item_id, order.fulfilmentWarehouseId, lineitem.quantity)
2221
    except:
2228
    except:
2222
        print "Unable to reduce reservation count"
2229
        print "Unable to reduce reservation count"
2223
 
2230
 
2224
def __clone_order(order, should_copy_billing_info, is_cod):
2231
def __clone_order(order, should_copy_billing_info, is_cod):
2225
    current_time = datetime.datetime.now()
2232
    current_time = datetime.datetime.now()
Line 2290... Line 2297...
2290
        new_order.accepted_timestamp = current_time
2297
        new_order.accepted_timestamp = current_time
2291
        new_order.billing_timestamp = current_time    
2298
        new_order.billing_timestamp = current_time    
2292
        new_order.status = OrderStatus.BILLED
2299
        new_order.status = OrderStatus.BILLED
2293
        new_order.statusDescription = 'Order Billed'
2300
        new_order.statusDescription = 'Order Billed'
2294
    else:       
2301
    else:       
2295
        catalog_client = CatalogClient().get_client()
2302
        inventoryClient = InventoryClient().get_client()
2296
        catalog_client.reserveItemInWarehouse(item_id, logistics_info.fulfilmentWarehouseId, new_order.lineitems[0].quantity)
2303
        inventoryClient.reserveItemInWarehouse(item_id, logistics_info.fulfilmentWarehouseId, new_order.lineitems[0].quantity)
2297
 
2304
 
2298
    return new_order
2305
    return new_order
2299
 
2306
 
2300
def __create_return_order(order):
2307
def __create_return_order(order):
2301
    ret_order = ReturnOrder(order)
2308
    ret_order = ReturnOrder(order)
Line 2514... Line 2521...
2514
    old_item = catalog_client.getItem(lineitem.item_id)
2521
    old_item = catalog_client.getItem(lineitem.item_id)
2515
    item = catalog_client.getItem(item_id)
2522
    item = catalog_client.getItem(item_id)
2516
    if old_item.catalogItemId != item.catalogItemId:
2523
    if old_item.catalogItemId != item.catalogItemId:
2517
        raise TransactionServiceException(121, "You can't ship a different item. You can only ship the same item in a different color.")
2524
        raise TransactionServiceException(121, "You can't ship a different item. You can only ship the same item in a different color.")
2518
    
2525
    
-
 
2526
    inventoryClient = InventoryClient().get_client()
2519
    catalog_client.reserveItemInWarehouse(item_id, order.fulfilmentWarehouseId, lineitem.quantity)
2527
    inventoryClient.reserveItemInWarehouse(item_id, order.fulfilmentWarehouseId, lineitem.quantity)
2520
    __update_inventory_reservation(order)
2528
    __update_inventory_reservation(order)
2521
    #TODO: Check that this new item has the same price
2529
    #TODO: Check that this new item has the same price
2522
        
2530
        
2523
    lineitem.item_id = item_id
2531
    lineitem.item_id = item_id
2524
    lineitem.color = item.color
2532
    lineitem.color = item.color
Line 2539... Line 2547...
2539
    if warehouse_id == order.warehouse_id:
2547
    if warehouse_id == order.warehouse_id:
2540
        raise TransactionServiceException(118, "You have selected the current warehouse again. Nothing to do")
2548
        raise TransactionServiceException(118, "You have selected the current warehouse again. Nothing to do")
2541
 
2549
 
2542
    lineitem = order.lineitems[0]
2550
    lineitem = order.lineitems[0]
2543
    catalog_client = CatalogClient().get_client()
2551
    catalog_client = CatalogClient().get_client()
-
 
2552
    inventoryClient = InventoryClient().get_client()
2544
    try:
2553
    try:
2545
        warehouse = catalog_client.getWarehouse(warehouse_id)
2554
        warehouse = inventoryClient.getWarehouse(warehouse_id)
2546
    except:
2555
    except:
2547
        raise TransactionServiceException(119, "No warehouse with id" + str(warehouse_id))
2556
        raise TransactionServiceException(119, "No warehouse with id" + str(warehouse_id))
2548
 
2557
 
2549
    if warehouse.billingWarehouseId is None:
2558
    if warehouse.billingWarehouseId is None:
2550
        raise TransactionServiceException(119, "Shifting of warehouse allowed to warehouse with billing support only")
2559
        raise TransactionServiceException(119, "Shifting of warehouse allowed to warehouse with billing support only")
2551
 
2560
 
2552
    # If One gives a billing warehouse for warehouse shift, we should assign order to the GOOD warehouse
2561
    # If One gives a billing warehouse for warehouse shift, we should assign order to the GOOD warehouse
2553
    # present within it with maximum availability
2562
    # present within it with maximum availability
2554
    if warehouse.id == warehouse.billingWarehouseId:
2563
    if warehouse.id == warehouse.billingWarehouseId:
2555
        warehouses = catalog_client.getWarehouses(None, InventoryType.GOOD, 0, 0, warehouse.id)
2564
        warehouses = inventoryClient.getWarehouses(None, InventoryType.GOOD, 0, 0, warehouse.id)
2556
        if warehouses:
2565
        if warehouses:
2557
            itemInventory = catalog_client.getItemInventoryByItemId(lineitem.item_id)
2566
            itemInventory = inventoryClient.getItemInventoryByItemId(lineitem.item_id)
2558
            warehouse = warehouses[0]
2567
            warehouse = warehouses[0]
2559
            maxAvailability = 0
2568
            maxAvailability = 0
2560
            for goodWarehouse in warehouses:
2569
            for goodWarehouse in warehouses:
2561
                if itemInventory.availability.has_key(goodWarehouse.id) and maxAvailability < itemInventory.availability[goodWarehouse.id]:
2570
                if itemInventory.availability.has_key(goodWarehouse.id) and maxAvailability < itemInventory.availability[goodWarehouse.id]:
2562
                    warehouse = goodWarehouse
2571
                    warehouse = goodWarehouse
Line 2570... Line 2579...
2570
                        if goodWarehouse.vendor.id == item.preferredVendor:
2579
                        if goodWarehouse.vendor.id == item.preferredVendor:
2571
                            warehouse = goodWarehouse
2580
                            warehouse = goodWarehouse
2572
        else:
2581
        else:
2573
            raise TransactionServiceException(119, "Shifting of warehouse allowed to GOOD inventory type warehouse with billing support")
2582
            raise TransactionServiceException(119, "Shifting of warehouse allowed to GOOD inventory type warehouse with billing support")
2574
 
2583
 
2575
    catalog_client.reserveItemInWarehouse(lineitem.item_id, warehouse.id, lineitem.quantity)
2584
    inventoryClient.reserveItemInWarehouse(lineitem.item_id, warehouse.id, lineitem.quantity)
2576
    __update_inventory_reservation(order)
2585
    __update_inventory_reservation(order)
2577
 
2586
 
2578
    order.warehouse_id = warehouse.billingWarehouseId
2587
    order.warehouse_id = warehouse.billingWarehouseId
2579
    order.fulfilmentWarehouseId = warehouse.id
2588
    order.fulfilmentWarehouseId = warehouse.id
2580
    session.commit()
2589
    session.commit()
Line 3296... Line 3305...
3296
        attribute.name = t_attribute.name
3305
        attribute.name = t_attribute.name
3297
        attribute.value = t_attribute.value
3306
        attribute.value = t_attribute.value
3298
        session.commit()
3307
        session.commit()
3299
 
3308
 
3300
def accept_order_for_item(itemId, quantity, fulfilmentWarehouseId, billingWarehouseId):
3309
def accept_order_for_item(itemId, quantity, fulfilmentWarehouseId, billingWarehouseId):
3301
    catalogClient = CatalogClient().get_client()
3310
    inventoryClient = InventoryClient().get_client()
3302
    inventory = catalogClient.getItemInventoryByItemId(itemId)
3311
    inventory = inventoryClient.getItemInventoryByItemId(itemId)
3303
    orders = Order.query.filter(Order.fulfilmentWarehouseId != fulfilmentWarehouseId).filter(Order.warehouse_id == billingWarehouseId).filter(Order.status.in_(tuple([OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.COD_VERIFICATION_PENDING, OrderStatus.ACCEPTED, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS]))).order_by(Order.expected_shipping_time).all()
3312
    orders = Order.query.filter(Order.fulfilmentWarehouseId != fulfilmentWarehouseId).filter(Order.warehouse_id == billingWarehouseId).filter(Order.status.in_(tuple([OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.COD_VERIFICATION_PENDING, OrderStatus.ACCEPTED, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS]))).order_by(Order.expected_shipping_time).all()
3304
    for order in orders:
3313
    for order in orders:
3305
        lineitem = order.lineitems[0]
3314
        lineitem = order.lineitems[0]
3306
        if lineitem.item_id == itemId and lineitem.quantity <= quantity:
3315
        if lineitem.item_id == itemId and lineitem.quantity <= quantity:
3307
            warehouse = catalogClient.getWarehouse(order.fulfilmentWarehouseId)
3316
            warehouse = inventoryClient.getWarehouse(order.fulfilmentWarehouseId)
3308
            if not warehouse.billingWarehouseId and warehouse.warehouseType == WarehouseType.THIRD_PARTY:
3317
            if not warehouse.billingWarehouseId and warehouse.warehouseType == WarehouseType.THIRD_PARTY:
3309
                if (inventory.availability[fulfilmentWarehouseId] >= inventory.reserved[fulfilmentWarehouseId] + lineitem.quantity) and inventory.availability[order.fulfilmentWarehouseId] < inventory.reserved[order.fulfilmentWarehouseId]:
3318
                if (inventory.availability[fulfilmentWarehouseId] >= inventory.reserved[fulfilmentWarehouseId] + lineitem.quantity) and inventory.availability[order.fulfilmentWarehouseId] < inventory.reserved[order.fulfilmentWarehouseId]:
3310
                    catalogClient.reduceReservationCount(itemId, order.fulfilmentWarehouseId, quantity)
3319
                    inventoryClient.reduceReservationCount(itemId, order.fulfilmentWarehouseId, quantity)
3311
                    catalogClient.reserveItemInWarehouse(itemId, fulfilmentWarehouseId, quantity)
3320
                    inventoryClient.reserveItemInWarehouse(itemId, fulfilmentWarehouseId, quantity)
3312
                    order.fulfilmentWarehouseId = fulfilmentWarehouseId
3321
                    order.fulfilmentWarehouseId = fulfilmentWarehouseId
3313
                    quantity -= lineitem.quantity
3322
                    quantity -= lineitem.quantity
3314
                    session.commit()
3323
                    session.commit()
3315
                    if not quantity:
3324
                    if not quantity:
3316
                        break
3325
                        break