Subversion Repositories SmartDukaan

Rev

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

Rev 4581 Rev 4586
Line 1559... Line 1559...
1559
def create_purchase_order(warehouseId):
1559
def create_purchase_order(warehouseId):
1560
    if not warehouseId:
1560
    if not warehouseId:
1561
        raise TransactionServiceException(101, "bad warehouse id")
1561
        raise TransactionServiceException(101, "bad warehouse id")
1562
    
1562
    
1563
    query = Order.query.with_lockmode("update").filter_by(warehouse_id=warehouseId)
1563
    query = Order.query.with_lockmode("update").filter_by(warehouse_id=warehouseId)
1564
    query = query.filter(or_(Order.status == OrderStatus.SUBMITTED_FOR_PROCESSING, Order.status == OrderStatus.INVENTORY_LOW))
1564
    query = query.filter(or_(Order.status == OrderStatus.SUBMITTED_FOR_PROCESSING, Order.status == OrderStatus.INVENTORY_LOW, Order.status == OrderStatus.ACCEPTED))
1565
    query = query.filter_by(purchase_order_id=None)
1565
    query = query.filter_by(purchase_order_id=None)
1566
    query = query.order_by(Order.created_timestamp)
1566
    query = query.order_by(Order.created_timestamp)
1567
    pending_orders = query.all()
1567
    pending_orders = query.all()
1568
    
1568
 
1569
    if not pending_orders:
1569
    if not pending_orders:
1570
        return -1
1570
        return None
1571
 
1571
 
1572
    catalog_client = CatalogClient().get_client()
1572
    catalog_client = CatalogClient().get_client()
1573
    availability = {}
1573
    availability = {}
1574
    for item in catalog_client.getAllItemsForWarehouse(warehouseId):
1574
    for item in catalog_client.getAllItemsForWarehouse(warehouseId):
1575
        availability[item.id] = item.itemInventory.availability[warehouseId]
1575
        availability[item.id] = [item.itemInventory.availability[warehouseId], item]
1576
 
-
 
1577
    query = Order.query.with_lockmode("update").filter_by(warehouse_id=warehouseId)
-
 
1578
    query = query.filter(Order.status == OrderStatus.ACCEPTED)
-
 
1579
    accepted_orders = query.all()
-
 
1580
 
-
 
1581
    t_purchase_order = PurchaseOrder()
-
 
1582
    t_purchase_order.supplierId = 3 # Putting supplier id as 3 for sarvottam for time being
-
 
1583
    t_purchase_order.warehouseId = warehouseId
-
 
1584
    t_purchase_order.lineitems = []
-
 
1585
    
-
 
1586
    t_po_lineitems = []
-
 
1587
    lineitems = {}
-
 
1588
 
1576
 
1589
    # Considering all pending orders and accepted as well
-
 
1590
    accepted_orders.extend(pending_orders)
1577
    requirements = {}
1591
    for order in accepted_orders:
1578
    for order in pending_orders:
1592
        for lineitem in order.lineitems:
1579
        for lineitem in order.lineitems:
1593
            item_id = lineitem.item_id
-
 
1594
            if lineitems.has_key(item_id):
1580
            if (requirements.has_key(lineitem.item_id)):
1595
                lineitems[item_id].quantity += lineitem.quantity
1581
                requirements[lineitem.item_id] += lineitem.quantity
1596
            else:
1582
            else:
1597
                t_po_lineitem = POLineItem()
-
 
1598
                t_po_lineitem.productGroup = lineitem.productGroup
-
 
1599
                t_po_lineitem.brand = lineitem.brand
-
 
1600
                t_po_lineitem.modelNumber = lineitem.model_number
-
 
1601
                t_po_lineitem.modelName = lineitem.model_name
-
 
1602
                t_po_lineitem.color = lineitem.color
-
 
1603
                t_po_lineitem.itemId = lineitem.item_id
1583
                requirements[lineitem.item_id] = lineitem.quantity
1604
                t_po_lineitem.quantity = lineitem.quantity - availability.get(item_id, 0)
-
 
1605
                lineitems[item_id] = t_po_lineitem
-
 
1606
                t_po_lineitems.append(t_po_lineitem)
-
 
1607
                #FIXME vendor is hardcoded for sarvottam
-
 
1608
                item_pricing = catalog_client.getItemPricing(item_id, 3)
-
 
1609
                t_po_lineitem.unitPrice = item_pricing.transferPrice
-
 
1610
 
-
 
1611
    for lineitem in t_po_lineitems:
-
 
1612
        if lineitem.quantity > 0:
-
 
1613
            t_purchase_order.lineitems.append(lineitem)
-
 
1614
 
1584
 
-
 
1585
    net_requirements = {}
-
 
1586
    for itemId in requirements.keys():
-
 
1587
        requirementsCount = requirements.get(itemId)
-
 
1588
        if  availability.has_key(itemId):
-
 
1589
            availabilityCount = availability.get(itemId)[0]
-
 
1590
            item              = availability.get(itemId)[1]
-
 
1591
            if item.preferredVendor is None or item.preferredVendor == 1:
-
 
1592
                continue
-
 
1593
            if requirementsCount > availabilityCount:
-
 
1594
                if (net_requirements.has_key(item.preferredVendor)):
-
 
1595
                    net_requirements[item.preferredVendor].append([item, requirementsCount - availabilityCount])
-
 
1596
                else:
-
 
1597
                    net_requirements[item.preferredVendor] = [[item, requirementsCount - availabilityCount]];
-
 
1598
        else:
-
 
1599
            item = catalog_client.getItem(itemId);
-
 
1600
            if item.preferredVendor is None or item.preferredVendor == 1:
-
 
1601
                continue
-
 
1602
            if (net_requirements.has_key(item.preferredVendor)):
-
 
1603
                net_requirements[item.preferredVendor].append([item, requirementsCount])
-
 
1604
            else:
-
 
1605
                net_requirements[item.preferredVendor] = [[item, requirementsCount]];
-
 
1606
 
-
 
1607
    if not net_requirements:
-
 
1608
        return None
-
 
1609
 
-
 
1610
    purchaseOrderIds = []
-
 
1611
    for vendorId in net_requirements.keys():
-
 
1612
        t_purchase_order = PurchaseOrder()
-
 
1613
        t_purchase_order.supplierId = vendorId
-
 
1614
        t_purchase_order.warehouseId = warehouseId
1615
    if not t_purchase_order.lineitems:
1615
        t_purchase_order.lineitems = []
-
 
1616
        for key in net_requirements.get(vendorId):
-
 
1617
            item     = key[0]
-
 
1618
            quantity = key[1]
-
 
1619
            t_po_lineitem = POLineItem()
-
 
1620
            t_po_lineitem.productGroup = item.productGroup
-
 
1621
            t_po_lineitem.brand = item.brand
-
 
1622
            t_po_lineitem.modelNumber = item.modelNumber
-
 
1623
            t_po_lineitem.modelName = item.modelName
-
 
1624
            t_po_lineitem.color = item.color
-
 
1625
            t_po_lineitem.itemId = item.id
-
 
1626
            t_po_lineitem.quantity = quantity
1616
        return -1
1627
            try:
-
 
1628
                item_pricing = catalog_client.getItemPricing(item.id, vendorId)
-
 
1629
            except Exception as e:
-
 
1630
                purchase_client = PurchaseClient().get_client()
-
 
1631
                vendor = purchase_client.getSupplier(vendorId)
-
 
1632
                print 'Could not find transfer price for Item id: ' + str(item.id) + ' and vendor id: ' + str(vendorId)
-
 
1633
                print e
-
 
1634
                raise TransactionServiceException(101, 'Transfer price missing for ' + vendor.name + ' and ' + " ".join([item.brand, item.modelName, item.modelNumber, item.color]))
-
 
1635
            t_po_lineitem.unitPrice = item_pricing.transferPrice
-
 
1636
            t_purchase_order.lineitems.append(t_po_lineitem)
-
 
1637
        purchase_client = PurchaseClient().get_client()
-
 
1638
        poId = purchase_client.createPurchaseOrder(t_purchase_order)
-
 
1639
        purchaseOrderIds.append(poId)
1617
 
1640
 
1618
    purchase_client = PurchaseClient().get_client()
-
 
1619
    po_id = purchase_client.createPurchaseOrder(t_purchase_order)
-
 
1620
    
-
 
1621
    for order in pending_orders:
1641
    for order in pending_orders:
1622
        order.purchase_order_id = po_id
1642
        order.purchase_order_id = purchaseOrderIds[len(purchaseOrderIds) - 1]
1623
        order.status = OrderStatus.LOW_INV_PO_RAISED
1643
        order.status = OrderStatus.LOW_INV_PO_RAISED
1624
        order.statusDescription = 'In Process'
1644
        order.statusDescription = 'In Process'
1625
    session.commit()
1645
    session.commit()
1626
    return po_id
1646
    return purchaseOrderIds
1627
 
1647
 
1628
def update_weight(order_id, weight):
1648
def update_weight(order_id, weight):
1629
    '''
1649
    '''
1630
    Update the weight of order
1650
    Update the weight of order
1631
    '''
1651
    '''