Skip to Content

LVC Inventory Flow Notes

Prep Before Go-Live

  • Print barcode/shelf labels for the pilot SKUs and assemble the warehouse binder with the step-by-step flow plus vendor cheat sheets.
  • Schedule a dry run date to practice the flow with 3–5 representative products (target week: ____).
  • Pick a full roll-out date for all tracked products (target week: ____).

Objectives

  • Receive selected products into stock even when the purchasing division is unknown and no Purchase Order (PO) exists yet.
  • Defer analytic attribution (division/project) until stock leaves the shop.
  • Support scanning with Zebra TC22/TC21 devices via Odoo's Barcode app.

End-to-End Roles & Steps

Purchasing / Accounting Overview

There are two acceptable paths for getting stock into Odoo; in both paths we ultimately match PO ↔ receipt ↔ bill to keep valuation accurate. The only change is when the PO exists.

  • Planned buy (less frequent): PO is entered up front before the truck arrives.
  • Ad-hoc buy (default everyday flow): warehouse receives first, then AP creates the minimal PO when the invoice shows up.
Path A – Planned Purchase (pre-PO)
  1. Odoo can pre-create the PO either manually (manager enters it) or automatically when stock dips below the Reordering Rule thresholds—RFQs drop in nightly from the scheduler so they’re waiting for approval.
  2. Confirm the Purchase Order so a receipt is ready when the shipment arrives.
  3. Warehouse validates the PO-backed receipt via Barcode (see Receiving section).
  4. AP uses Create Bill from the PO so lines match and reconcile automatically.
Path B – Ad-hoc Purchase (default)
  1. Warehouse receives first using the “Receiving Without a Pre-existing PO” steps below (takes ~3 taps).
  2. When the vendor invoice hits ap@localelectric.info, AP opens it and—if the receipt included storable items—uses Add a Purchase Order / Create PO to spawn the minimal PO from that receipt. Purely consumable/service bills can be expensed directly without this step.
  3. AP posts the bill against the newly linked PO so valuation entries remain clean for those storable items (consumable-only bills follow the standard expense posting).
Fast PO Capture Aids (optional)
  • Mobile app / quick RFQ form: managers can still enter a PO in advance if they have time; tap “Create RFQ,” add vendor + short line, confirm—30 seconds.
  • Vendor email alias: add purchase@localelectric.info for order confirmations; vendor emails create the PO automatically, invoice stays with AP.
  • Reordering rules: auto-generate RFQs nightly for high-volume items; manager just approves.
  • AP-to-PO bridge automation: for ad-hoc receipts, AP can hit Create PO on the bill or we automate cloning bill/receipt lines into a draft PO to confirm.

Key point: everyday behavior is “receipt first, PO stub second.” Planned buys still use the classic pre-PO flow, but no one is blocked from receiving stock when a truck shows up unexpectedly.

Vendor Bill Intake & Product Classification
  • Validating the ad-hoc receipt populates all storable products (and quantities) on that receipt record. AP never re-enters those lines.
  • When the vendor bill email lands at ap@localelectric.info, AP opens the draft bill, clicks Add a Purchase Order / Add a Receipt, and selects the receipt (or the auto-created PO tied to it). Odoo injects the received lines onto the bill automatically.
  • If the button does not appear because a PO is missing, use the custom Create PO action on the receipt/bill (or let the automation do it) so the link exists; then pull the lines. Again, no manual typing of storable SKUs.
  • Any remaining consumable/service charges that were not received through inventory can stay as expense lines on the bill (no receipt match needed).
  • For invoices that are 100% consumables/services, skip the receipt link entirely and post directly to expense accounts.
  • We can disable Odoo’s AI bill import (or train its template) so it stops collapsing everything into one line and interfering with the receipt pull-through.

Warehouse Receiving

  1. Convert pilot products to Storable with automated valuation enabled on the warehouse.
  2. In the Barcode app open Receipts, scan the arriving items, and validate:
    • If a PO already exists (Path A), pick that receipt and scan against it.
    • If no PO exists (Path B default), start a new receipt record and scan the items; this still loads stock and posts interim valuation.
  3. Once validated, AP ties the bill to that receipt/PO (created now or later) so inventory value sits on the balance sheet instead of division expense.
Receiving Without a Pre-existing PO (default path)
  • Create an ad-hoc receipt in Inventory → Operations → Receipts → New, set the vendor, scan the lines, and validate. This generates the stock move needed for valuation even if no PO exists.
  • After validating the manual receipt, AP should open the vendor bill and use Add a Purchase Order / Auto-complete to select or generate the PO that links to that receipt; this keeps the matching clean and avoids duplicate valuation.
  • If time permits, the receipt validation can trigger an automated action that spawns a minimal draft PO populated with the received lines, so AP only needs to confirm it while reconciling the bill.
  • For consumables/non-stock products, continue letting AP post the bill directly (no receipt needed); only storable products need the receipt/PO link.
  • If you want the scan itself to spawn a draft PO, we can customize the Barcode “Receipts” operation so that when a tech scans a vendor barcode that isn’t tied to an open receipt, Odoo auto-creates a draft RFQ for that vendor and attaches the picking. Out of the box, a short manual receipt (3 taps) is the supported path.
Mixed Bills (Storable + Non-Storable)
  • When a vendor bill contains both storable and consumable/service lines, keep them on the same bill: storable lines will seek a matched receipt, non-storable lines will expense immediately.
  • Pull the bill from the PO/receipt so the storable lines auto-populate; any purely service/consumable line can be added manually and posted to the appropriate expense account.
  • If the bill was auto-created from email, AP should still attach the receipt for the storable lines; the consumable lines stay unmatched and that’s fine.
  • Automated valuation only fires on the storable lines with a linked receipt, so it’s critical that those lines are present in the receipt even if the rest of the bill is standalone expense.
Field Purchases Returning to Stock
  • If a division buys material directly for a job and later returns the excess, create an Internal Transfer (job location → WH/Stock) so the inventory comes back with the correct analytic credit. This keeps the division’s job cost accurate.
  • Keep a single product for items such as EMT and mark it Storable. Immediate job consumption just means transferring it from WH/Stock (or the receiving dock) to the job/van location right after receipt so cost hits the job without sitting in shared stock.
  • Only maintain separate Consumable products for items that will never pass through the warehouse. Make sure those lines stay distinct on the vendor bill so AP can expense them directly without trying to match a receipt.

Example: EMT Purchase to Customer Job

  1. Manager places order with GME (phone/email). Invoice still arrives at ap@localelectric.info.
  2. Warehouse creates receipt as soon as the truck shows up (Path B default): Inventory → Receipts → New, vendor = GME, scan the EMT lines, validate. Barcode app can be used for the scanning step.
    • If this had been a planned bulk buy, they would instead select the pre-created PO receipt (Path A).
  3. AP reviews the incoming bill. If no PO exists, use “Add a Purchase Order/Auto-complete” to spin up a linked PO from the receipt before posting.
  4. AP attaches the receipt to the vendor bill so the storable lines reconcile; consumable-only lines stay as expense.
  5. Tech pulls inventory for the division: in Barcode, run an Internal Transfer from WH/Stock to WH/Commercial Van 123 (or similar) and set the division analytic. Stock now sits in the van location.
  6. Job consumption:
    • If the Sales Order existed before loading, the tech scans and validates that delivery while pulling materials; the picking is sourced from the warehouse or van as configured.
    • If the Sales Order is created after the tech returns with the list, add the actual products/quantities, open the delivery picking, change the source location to the van/holding location (requires Editable operations and routing), and scan/validate so stock leaves the van and the cost hits the job. Barcode can add the lines on the fly if “Allow adding lines” is enabled.
  7. Customer invoice is generated from the Sales Order delivery, keeping revenue, COGS, and analytics aligned.

Paper notes are acceptable as a temporary backup, but every job must eventually have a validated delivery picking (Sales Order or internal issue) so inventory leaves the division location in Odoo. Otherwise the van’s stock never decreases and costs never hit the job.

Initial On-Hand Quantities

  • After flipping a product from consumable/service to storable, create an Inventory Adjustment for the warehouse location to load the physical quantity already on the shelf.
  • Use the Inventory Date field to backdate to the go-live moment so valuation entries align with reality.
  • Enter the counted quantity and confirm; automated valuation debits the product category’s Stock Valuation Account (asset) and credits its Inventory Adjustment Account (P&L) at the product’s cost.
  • Set the product’s cost before validating—Odoo values the adjustment at whatever cost is on the product record (or at the entered unit cost if using Odoo 16+ count lines).
  • Example: on-hand 10 units, cost $50 → Inventory Adjustment posts Dr Stock Valuation 500 / Cr Inventory Adjustment 500.
  • If earlier vendor bills already expensed the $500 to a division, you now have:
    • Original vendor bill: Dr Division Expense 500 / Cr Payables 500.
    • Inventory adjustment: Dr Stock Valuation 500 / Cr Inventory Adjustment 500.
  • Net P&L is zero (one debit, one credit), but the credit sits in the Inventory Adjustment account. Decide with accounting whether to:
    1. Leave it: accept the one-time credit in Inventory Adjustment; the earlier expense remains in the division account.
    2. Reclassify: book a manual journal Dr Inventory Adjustment / Cr Division Expense (or edit the original bill) so the cost fully migrates from expense into the inventory asset.
    3. Rebill via stock accounts: cancel/redo the vendor bill using stock-input lines so that valuation hits Stock Interim Input instead of expense (more work, but cleanest history).

Outbound to a Known Job

  1. Job owner (boss/PM) creates a Sales Order for the job and assigns the correct Analytic Account (division + project). It can be created before or after the tech visits the site.
  2. Confirm the SO; this generates a delivery picking that holds the analytic link.
  3. If materials are known before loading, preload the SO lines, let the tech open Delivery Orders in Barcode, scan the picking while pulling stock, and validate.
  4. If materials are only known after the job, leave the SO empty when confirming. Once the tech reports usage, either add the lines on the SO or allow Barcode to add them during picking, set the picking’s source location to the van/holding location (requires Editable operations on the operation type), scan, and validate.
  5. Validation pushes cost to the project/division and updates downstream documents (Field Service tasks, analytic reports).
  6. Accounting invoices the customer from the Sales Order so revenue/COGS stay linked.

Letting Techs Add Lines by Scanning

  • On the delivery operation type (e.g., WH: Delivery Orders):
    • General tab: set the Source Location to the van/holding location if issues should default from there; enable Show Detailed Operations if you need to edit move lines manually.
    • Barcode App tab (Options section): tick Allow extra products? so the Barcode app can add new move lines that were not on the Sales Order; use Source Location → Mandatory Scan if you want the tech to confirm the van/warehouse with each scan.
  • In Barcode, the tech opens the job’s delivery, scans items directly from the van/warehouse; each scan creates or increments a move line and pushes it onto the Sales Order automatically.
  • Back-office can review the SO lines after validation and adjust prices if needed before invoicing.

Outbound When Division or Job Is Unknown

  1. Define a holding location (e.g., WH/Divisions).
  2. Use an Internal Transfer Barcode operation from WH/Stock to the holding location.
  3. Add/select the division analytic on the transfer (Studio/custom field).
  4. When the job becomes known:
    • Either create a Sales Order and deliver from the holding location, or
    • Create another internal transfer from holding to project-specific location, updating the analytic.

Van / Crew Restock

  • Model each van/crew as an internal stock location.
  • Execute Internal Transfer from WH/Stock (or holding) to the van location.
  • Capture the division analytic (Studio/customization).
  • Optional: periodic inventory adjustments or consumption reporting per van.

Configuration Checklist

  • Enable Analytic Accounting and Analytic Distribution.
  • Turn on Automated Inventory Valuation for the warehouse.
  • Make the outbound stock journal require analytics.
  • Enable Editable operations on relevant operation types (for scanning unexpected items).
  • Enable Allow product creation in Barcode if techs must scan items not preloaded on documents.

Open Questions / To Validate

  • Does the division analytic need to default from employee/van? (If yes, plan customization.)
  • Bosses should stop hand-writing invoices; always drive invoicing through the Sales Order so inventory, analytics, and revenue line up.