Subversion Repositories SmartDukaan

Rev

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

Rev 4750 Rev 4757
Line 1613... Line 1613...
1613
        raise TransactionServiceException(116, "No return order found for the given order id")
1613
        raise TransactionServiceException(116, "No return order found for the given order id")
1614
    ret_order.processedStatus = True
1614
    ret_order.processedStatus = True
1615
    ret_order.processedAt = datetime.datetime.now()
1615
    ret_order.processedAt = datetime.datetime.now()
1616
    session.commit()
1616
    session.commit()
1617
 
1617
 
1618
def create_purchase_order(warehouseId):
1618
def update_orders_as_PORaised(itemIdQuantityMap, purchaseOrderId, warehouseId):
-
 
1619
    """
-
 
1620
    Updates orders as PO raised. Also updates purchase order id in orders. Pass a map of items mapped to
-
 
1621
    the quantities for which the PO is raised.
-
 
1622
 
-
 
1623
    Parameters:
-
 
1624
     - itemIdQuantityMap
1619
    if not warehouseId:
1625
     - purchaseOrderId
1620
        raise TransactionServiceException(101, "bad warehouse id")
1626
     - warehouseId
1621
    
1627
    """
1622
    query = Order.query.with_lockmode("update").filter_by(warehouse_id=warehouseId)
1628
    query = Order.query.with_lockmode("update").filter_by(warehouse_id=warehouseId)
1623
    query = query.filter(or_(Order.status == OrderStatus.SUBMITTED_FOR_PROCESSING, Order.status == OrderStatus.INVENTORY_LOW, Order.status == OrderStatus.ACCEPTED))
1629
    query = query.filter(or_(Order.status == OrderStatus.SUBMITTED_FOR_PROCESSING, Order.status == OrderStatus.INVENTORY_LOW))
1624
    query = query.filter_by(purchase_order_id=None)
1630
    query = query.filter_by(purchase_order_id=None)
1625
    query = query.order_by(Order.created_timestamp)
1631
    query = query.order_by(Order.created_timestamp)
1626
    pending_orders = query.all()
1632
    pending_orders = query.all()
1627
 
1633
 
1628
    if not pending_orders:
-
 
1629
        return None
-
 
1630
 
-
 
1631
    catalog_client = CatalogClient().get_client()
-
 
1632
    availability = {}
-
 
1633
    for item in catalog_client.getAllItemsForWarehouse(warehouseId):
-
 
1634
        availability[item.id] = [item.itemInventory.availability[warehouseId], item]
-
 
1635
 
-
 
1636
    requirements = {}
-
 
1637
    for order in pending_orders:
1634
    for order in pending_orders:
1638
        for lineitem in order.lineitems:
1635
        lineitem = order.lineitems[0]
1639
            if (requirements.has_key(lineitem.item_id)):
1636
        if itemIdQuantityMap.has_key(lineitem.item_id):
1640
                requirements[lineitem.item_id] += lineitem.quantity
1637
            if itemIdQuantityMap[lineitem.item_id] >= lineitem.quantity:
1641
            else:
-
 
1642
                requirements[lineitem.item_id] = lineitem.quantity
1638
                order.status = OrderStatus.LOW_INV_PO_RAISED
1643
 
-
 
1644
    net_requirements = {}
-
 
1645
    for itemId in requirements.keys():
-
 
1646
        requirementsCount = requirements.get(itemId)
-
 
1647
        if  availability.has_key(itemId):
-
 
1648
            availabilityCount = availability.get(itemId)[0]
-
 
1649
            item              = availability.get(itemId)[1]
-
 
1650
            if item.preferredVendor is None or item.preferredVendor == 1:
-
 
1651
                continue
-
 
1652
            if requirementsCount > availabilityCount:
1639
                order.statusDescription = 'In Process'
1653
                if (net_requirements.has_key(item.preferredVendor)):
1640
                order.purchase_order_id = purchaseOrderId
1654
                    net_requirements[item.preferredVendor].append([item, requirementsCount - availabilityCount])
-
 
1655
                else:
-
 
1656
                    net_requirements[item.preferredVendor] = [[item, requirementsCount - availabilityCount]];
-
 
1657
        else:
-
 
1658
            item = catalog_client.getItem(itemId);
-
 
1659
            if item.preferredVendor is None or item.preferredVendor == 1:
-
 
1660
                continue
-
 
1661
            if (net_requirements.has_key(item.preferredVendor)):
-
 
1662
                net_requirements[item.preferredVendor].append([item, requirementsCount])
-
 
1663
            else:
-
 
1664
                net_requirements[item.preferredVendor] = [[item, requirementsCount]];
1641
                itemIdQuantityMap[lineitem.item_id] -= lineitem.quantity
1665
 
1642
 
1666
    if not net_requirements:
-
 
1667
        return None
-
 
1668
 
-
 
1669
    purchaseOrderIds = []
-
 
1670
    for vendorId in net_requirements.keys():
-
 
1671
        t_purchase_order = PurchaseOrder()
-
 
1672
        t_purchase_order.supplierId = vendorId
-
 
1673
        t_purchase_order.warehouseId = warehouseId
-
 
1674
        t_purchase_order.lineitems = []
-
 
1675
        for key in net_requirements.get(vendorId):
-
 
1676
            item     = key[0]
-
 
1677
            quantity = key[1]
-
 
1678
            t_po_lineitem = POLineItem()
-
 
1679
            t_po_lineitem.productGroup = item.productGroup
-
 
1680
            t_po_lineitem.brand = item.brand
-
 
1681
            t_po_lineitem.modelNumber = item.modelNumber
-
 
1682
            t_po_lineitem.modelName = item.modelName
-
 
1683
            t_po_lineitem.color = item.color
-
 
1684
            t_po_lineitem.itemId = item.id
-
 
1685
            t_po_lineitem.quantity = quantity
-
 
1686
            try:
-
 
1687
                item_pricing = catalog_client.getItemPricing(item.id, vendorId)
-
 
1688
            except Exception as e:
-
 
1689
                purchase_client = PurchaseClient().get_client()
-
 
1690
                vendor = purchase_client.getSupplier(vendorId)
-
 
1691
                print 'Could not find transfer price for Item id: ' + str(item.id) + ' and vendor id: ' + str(vendorId)
-
 
1692
                print e
-
 
1693
                raise TransactionServiceException(101, 'Transfer price missing for ' + vendor.name + ' and ' + " ".join([item.brand, item.modelName, item.modelNumber, item.color]))
-
 
1694
            t_po_lineitem.unitPrice = item_pricing.transferPrice
-
 
1695
            t_purchase_order.lineitems.append(t_po_lineitem)
-
 
1696
        purchase_client = PurchaseClient().get_client()
-
 
1697
        poId = purchase_client.createPurchaseOrder(t_purchase_order)
-
 
1698
        purchaseOrderIds.append(poId)
-
 
1699
 
-
 
1700
    for order in pending_orders:
-
 
1701
        order.purchase_order_id = purchaseOrderIds[len(purchaseOrderIds) - 1]
-
 
1702
        if order.status != OrderStatus.ACCEPTED:
-
 
1703
            order.status = OrderStatus.LOW_INV_PO_RAISED
-
 
1704
            order.statusDescription = 'In Process'
-
 
1705
    session.commit()
1643
    session.commit()
1706
    return purchaseOrderIds
-
 
1707
 
1644
 
1708
def update_weight(order_id, weight):
1645
def update_weight(order_id, weight):
1709
    '''
1646
    '''
1710
    Update the weight of order
1647
    Update the weight of order
1711
    '''
1648
    '''