Hi all,
I'm running a construction business on Odoo 19 and need help with the correct approach for tracking material consumption on fixed-price projects.
Current setup:
- We quote and invoice customers at a fixed contract price (e.g. $500,000)
- The SO is created with a service product that auto-creates a project and analytic account on confirmation
- We invoice the customer in phases/milestones — the total invoice value never changes
What happens during project execution:
- Engineers request materials from stock to be delivered to the project site
- Some materials are already in our warehouse inventory
- When materials are allocated to the project, we need to:
1. Decrement inventory (stock move from warehouse to project location)
2. Post the cost against the project's analytic account (COGS)
3. Keep the SO and customer invoice value completely unchanged
The problem:
- "Products on Tasks" updates the SO value, which breaks our fixed-price contract
- We need material consumption tracked purely as internal cost/COGS against the project analytic account, with no impact on the SO or invoice
What I believe the correct approach is:
- Create a virtual stock location per project (e.g. Projects/ProjectName)
- Use Internal Transfers (WH/Stock → project location) with the project analytic account tagged on each move line
- Let Odoo 19's closing entry mechanism post the COGS (Dr. COGS / Cr. Stock Valuation) periodically
- View project profitability via the analytic account (revenue from fixed invoice vs actual material costs)
My questions:
1. Is Internal Transfer + analytic account tagging the recommended approach in Odoo 19 for this scenario?
2. In Odoo 19, since journal entries are not posted per stock move (perpetual: only at invoice/closing), how do we ensure the analytic lines are correctly tied to the project for profitability reporting?
3. Is there a better native Odoo 19 workflow for fixed-price project material consumption that I'm missing?
Thanks in advance!