This module provides Romanian-specific stock accounting features that align with Romanian accounting standards and regulations. Below are the configuration options available.
Overview
The module extends Odoo's standard stock accounting to meet Romanian accounting requirements, providing:
- Location-specific accounting configurations
- Romanian-specific stock valuation accounts
- Product category stock account customization
- Warehouse fiscal position management
- Specialized accounts for stock operations
- Per-location FIFO valuation (vs. Odoo's default company-wide FIFO)
- Automatic negative stock compensation for FIFO products
- Stock valuation entries for dropship deliveries, symmetric with regular deliveries
Per-location FIFO
For products with cost_method=fifo, the module values outgoing moves against the FIFO stack of the source location rather than the company-wide stack. Each outgoing move is automatically split into one stock.move per FIFO layer (e.g. an outgoing of 4 units from a location with IN 2@10 + IN 3@8 produces a 2x10 move + a 2x8 move).
Internal transfers (internal → internal or via transit) are treated as both is_in and is_out on the same move:
- they consume from the FIFO stack of the source location,
- they enter the FIFO stack of the destination location with the value pulled from the source,
- they generate an accounting entry through the location's valuation account (or the company-level transfer account if locations share an account).
Controlled by res.company.fifo_per_location (defaults to True for Romanian companies, computed from country_id, editable per company).
Negative stock compensation
When a FIFO outgoing move happens before the corresponding incoming move (i.e. the location FIFO stack is empty), the outgoing value falls back to the product's standard_price. The pending quantity is tracked on the outgoing move via fifo_neg_pending_qty / fifo_neg_origin_value.
When the next matching incoming move is posted, the module:
- allocates the new incoming value across pending outgoing moves (FIFO);
- updates stock.move.value on the outgoing moves to reflect the real purchase price;
- emits an account.move correction that debits the variation/COGS account and credits the stock valuation account for the delta;
- links that correction back to the originating IN move via account.move.fifo_neg_origin_move_id for traceability.
Compensation is idempotent — if _set_value is re-invoked on the same IN move (e.g. when the supplier invoice is posted), the existing compensation is detected and not duplicated.
Controlled by res.company.fifo_location_negative_compensation (defaults to True for Romanian companies, editable per company).
Dropship valuation
A dropship move (supplier location straight to a customer location, goods never entering the company's own stock) is now valued and accounted for the same way a regular delivery is: the vendor bill still debits the stock valuation account on receipt, and the module now credits that same account and debits the expense account when the goods leave to the customer, leaving no residual balance. Without this, the stock valuation account accumulated a balance that no longer corresponded to any goods on hand, and the cost of the dropshipped goods was never recognised as an expense.
This applies to dropship moves validated after the fix is installed; historical dropship moves keep their original (missing) accounting entries and require a separate, deliberate regularisation if that balance needs to be cleared.
Dropship accounting entries
The company never physically holds the dropshipped goods (the supplier ships straight to the customer), but under Romanian accounting rules stock is recognised at the transfer of risks and rewards (OMFP 1802/2014, pt. 283 para. 1), not at physical possession — the same principle behind accounts 327 "Goods in transit" and 357 "Goods held by third parties" for stock the company owns without holding. Routing a dropship purchase through the stock valuation account rather than expensing it directly at the vendor bill also keeps a purchase-invoice/sale-invoice timing mismatch (e.g. vendor bill in December, customer invoice in January) from misstating the period result, per the accrual principle (pt. 53).
Forward move (goods leave to the customer):
| Account | Debit | Credit | |---|---|---| | Expense (607) | value | | | Stock valuation (371) | | value |
Return move (dropshipped_return), storno convention — same accounts as the forward move, amount in red, not a debit/credit swap:
| Account | Debit | Credit | |---|---|---| | Expense (607) | −value | | | Stock valuation (371) | | −value |
408 "Suppliers - invoices not received" never applies to a dropship move: that account is a pivot for goods physically received into a warehouse before the vendor bill arrives, and a dropship move never has that physical-receipt leg. If the vendor bill is missing at the time of the customer sale, the correct counterpart is 327 (a stock-in-transit account), not 408.
For the entry above to stay correct in practice: the credit to 371 must happen in the same accounting period as the debit from the vendor bill and for the same amount, so the account nets to zero for dropship traffic at period end; and dropship quantities should flow through a distinct location so they never mix into a real warehouse's physical inventory count.
Dropshipping a product does not affect the value of that same product's real stock held elsewhere, on either costing method (FIFO or average cost). Core Odoo's own average-cost engine folds dropship moves into the same moving-average pool as real purchases by design, which would otherwise retroactively reprice unrelated stock on hand purely because the same product was also dropshipped; this module routes dropship moves around that recompute entirely for Romanian-accounted companies.
Performance notes
- Partial composite index on stock_move(product_id, location_dest_id, date DESC, id DESC) WHERE state='done' AND is_in=true powers the FIFO stack lookup with index-only scans on large histories.
- Partial index on stock_move(...) WHERE fifo_neg_pending_qty > 0 keeps the compensation search constant-time even with millions of historical moves.
- A request-scoped cache (context['fifo_stack_cache']) reuses the same _run_fifo_get_stack result across batched lookups in product._compute_value and stock.quant._compute_value — large Inventory Valuation reports drop from O(N) queries to O(distinct (product, location)) queries.
auto_awesome What this module does
AI-generated from the code · Odoo 20.0Adds Romanian stock accounting rules: FIFO valuation per storage location instead of per company, automatic correction of negative-stock FIFO values, and Romanian-specific stock accounts on locations, products and warehouses.
This module adapts Odoo's inventory valuation to Romanian accounting practice. It is meant for Romanian companies and appears as extra fields and options on existing screens rather than as a new menu.
What users can configure: - On the company form, two switches: FIFO per Location and FIFO Negative Stock Compensation. - On stock locations, a Romanian stock valuation account plus income and expense accounts, which can be pushed down to child locations. - On product categories, an option to allow the stock account to be changed from locations, and on products a Romanian stock valuation account. - On accounts, a Consume Account and a Reception in Progress Account. - On warehouses, a fiscal position.
What happens automatically: - For FIFO products, outgoing goods are valued from the stock layers of the source location, not the whole company. An outgoing move can be split into several lines so each part takes the cost of the layer it consumes. - If goods leave a location that has no stock, the move is valued at standard cost and flagged as pending; the next incoming move for the same product and location revalues it and posts a correction journal entry in the stock journal. - Stock moves get a Romanian move type and Romanian valuation and transfer accounts, and the related journal entries use them. - On Romanian bills, the usual cost-of-goods and price-difference lines are not added, and exchange-rate differences on goods received but not yet invoiced are booked automatically when the bill is posted. - Reception-in-progress and notice receptions use dedicated accounts on purchase bills, and notice deliveries use a dedicated account on sales invoices.
A button on transfers opens the related accounting entries.
Depends on
Required by other modules
Models and fields (13)
- stock.move · new modell10n_ro_move_type (Romanian - Move Type), l10n_ro_account_id (Romania - Valuation Account), fifo_neg_pending_qty (Negative Stock Pending Qty), fifo_neg_origin_value (Negative Stock Initial Value), l10n_ro_transfer_account_id (Romania - Transfer Valuation Account), fifo_neg_compensation_move_ids (Negative Stock Compensation Entries), l10n_ro_extra_account_move_ids (Romania - Extra Account Moves)
- res.company · extends an existing modelfifo_per_location (FIFO per Location), fifo_location_negative_compensation (FIFO Negative Stock Compensation)
- stock.quant · new model
- account.move · new modelfifo_neg_origin_move_id (Source IN move for negative stock compensation), l10n_ro_extra_stock_move_id (Romania - Extra Stock Move)
- stock.picking · new modell10n_ro_notice, l10n_ro_reception_in_progress
- stock.location · extends an existing modell10n_ro_property_account_income_location_id (Income Account), l10n_ro_property_stock_valuation_account_id (Stock Valuation Account Romania), l10n_ro_property_account_expense_location_id (Expense Account)
- account.account · new modell10n_ro_stock_consume_account_id (Consume Account), l10n_ro_reception_in_progress_account_id (Romania - Reception in Progress Account)
- product.product · new model
- stock.warehouse · new modell10n_ro_fiscal_position_id (Fiscal Position)
- product.category · new modell10n_ro_stock_account_change (Allow stock account change from locations)
- product.template · new modell10n_ro_property_stock_valuation_account_id (Stock Valuation Account)
- account.move.line · new model
- l10n.ro.stock.scenario.loader · new model
Text generated by AI (DeepSeek) from reading the Odoo 20.0 code on GitHub; it may contain mistakes, so check the code before deciding. The module is very large and only part of the code was read. View the code on GitHub
Availability by version
Reviewed: 2026-11-03Confirmation status: 8 confirmed, 1 with no information of 9 versions.
Sources · Odoo 20.0
Confirmed on 2026-11-03 in branch 20.0 of OCA/l10n-romania.
terminal Installation and usage
No verified informationInstallation instructions, the distribution package, dependencies and configuration steps are not shown because they have not yet been verified in the module documentation for any version.
Data imported from GitHub: this sheet reflects the latest catalog review, not a live lookup. Always check the module documentation and staging before installing in production.