Point of Sale and Inventory database schema

后端 未结 2 1875
清酒与你
清酒与你 2021-01-30 02:34

I’m trying to create a basic Point of Sale and Inventory management system.

Some things to take into account:

  • The products are always the same (sa
2条回答
  •  野的像风
    2021-01-30 03:09

    The tricky part here is that you're really doing more than a POS solution. You're also doing an inventory management & basic cost accounting system.

    The first scenario you need to address is what accounting method you'll use to determine the cost of any item sold. The most common options would be FIFO, LIFO, or Specific Identification (all terms that can be Googled).

    In all 3 scenarios, you should record your purchases of your goods in a data structure (typically called PurchaseOrder, but in this case I'll call it SourcingOrder to differentiate from your orders tables in the original question).

    The structure below assumes that each sourcing order line will be for one location (otherwise things get even more complex). In other words, if I buy 2 widgets for store A and 2 for store B, I'd add 2 lines to the order with quantity 2 for each, not one line with quantity 4.

    SourcingOrder
     - order_number
     - order_date
    
    SourcingOrderLine
     - product_id
     - unit_cost
     - quantity
     - location_id
    

    Inventory can be one level...

    InventoryTransaction
     - product_id
     - quantity
     - sourcing_order_line_id
     - order_line_id
     - location_id
     - source_inventory_transaction_id
    

    Each time a SourcingOrderLine is received at a store, you'll create an InventoryTransaction with a positive quantity and FK references to the sourcing_order_line_id, product_id and location_id.

    Each time a sale is made, you'll create an InventoryTransaction with a negative quantity and FK references to the order_line_id, product_id and location_id, source_inventory_transaction_id.

    The source_inventory_transaction_id would be a link from the negative quantity InventoryTransaction back to the postiive quantity InventoryTransaction calculated using whichever accounting method you choose.

    Current inventory for a location would be SELECT sum(quantity) FROM inventory_transactions WHERE product_id = ? and location_id = ? GROUP BY product_id, location_id.

    Marginal cost would be calculated by tracing back from the sale, through the 2 related inventory transactions to the SourcingOrder line.

    NOTE: You have to handle the case where you allocate one order line across 2 inventory transactions because the ordered quantity was larger that what was left in the next inventory transaction to be allocated. This data structure will handle this, but you'll need to work the logic and query yourself.

提交回复
热议问题