OdooWiki OCA HUB

Romania - Retail Price Change (Proces Verbal Schimbare Pret)

l10n_ro_stock_account_retail_price_change folder_open OCA/l10n-romania open_in_new
Localization License: AGPL-3

Romania - Retail Price Change (Proces Verbal de Schimbare Pret)

Adds the price change document to the retail merchandise accounting of l10n_ro_stock_account_retail.

l10n.ro.retail.price.change is a persistent document numbered PVSP/YYYY/00000 out of a sequence of its own company. It captures the warehouse, the date, the products on hand and the old versus new shelf price (PVA, VAT included) per line, with the markup (378) and deferred VAT (4428) split.

The old side is what the stock carries — cost, markup and deferred VAT per unit, read from the markup ledger — and it is read again when the document is posted, so the delta always measures the gap that exists at the moment the entry is made. A posted document is final: it is revoked by posting another one, never reset, cancelled or deleted.

There are three flows:

  • Manual - create a draft, load the products on hand, edit the new prices, then post. Posting writes the new prices on the warehouse retail pricelist, books the revaluation and records it in the markup ledger, so the next sale releases the new markup and not the old one.
  • Automatic - a draft document is raised for each affected retail warehouse whenever a shelf price moves, and the user reviews it and posts it. What decided the price does not matter: a fixed rule, a rule over a category or the whole shop, any term of a formula, a change on another pricelist the shop derives from, or the product's own sale price. The price before and the price after are compared per product and per shop, so a rule that names a whole range raises a document holding the labels that actually moved. A shop has at most one open automatic document, topped up as prices keep moving, so it always quotes the price that is on the label. Posting writes a fixed rule back on the pricelist only where the pricelist does not already answer with the price decided, which is what keeps a shop priced by formula priced by formula.
  • Reconciled - a daily cron, Retail: Reconcile Shelf Prices, compares what the markup ledger says each unit on the shelf carries with what the pricelist says the label reads, and raises a draft wherever the two have parted company. That catches the prices which move with nobody writing anything: the day a dated promotion opens, a shelf price computed over a cost that a reception has moved, a change of VAT rate. Stock the ledger does not yet account for is left to the opening balance wizard.

Report

The document prints as Proces-verbal privind modificarea pretului de vanzare cu amanuntul, listing quantity, old and new price, old and new value and the difference per product, with the markup and VAT split shown separately.

Price history

Every posted document is a dated record of the shelf price of the products it covers. The Price History button on a product shows the lines that concern it, oldest first, so the sequence of shelf prices and the document that decided each of them are visible in one place.

auto_awesome What this module does

AI-generated from the code · Odoo 20.0

Lets Romanian retailers record a shelf price change (Proces Verbal de Schimbare Pret) for goods on hand, updating the retail pricelist and posting the accounting entry for the markup and deferred VAT difference.

This module adds a new document, the Retail Price Change (Proces Verbal de Schimbare Pret), numbered PVSP/YEAR/00001 per company. It is found under Inventory > Warehouse Management > Retail Price Changes, and each product form also shows a count of retail price changes with a button opening its price history.

On a draft document the user picks a retail warehouse and a date, then presses Load Products to pull in everything currently on the shop's shelves with its quantity and current shelf price. For each line the user enters the new shelf price (VAT included). The old cost, markup and deferred VAT per unit are read from the markup ledger, and the markup and VAT differences are computed automatically.

When the document is posted, quantities and old values are re-read from stock, the retail pricelist is updated with the new prices (a fixed rule is only written where the pricelist does not already give that price), an accounting entry is posted moving the markup (378) and deferred VAT (4428) against the stock account, and the markup ledger is updated so later sales release the right markup. Posting is refused if the ledger does not cover the same quantity as the document.

A posted document cannot be deleted or reset; it is revoked by posting another one. Only drafts can be cancelled. A printable report is available.

Price changes are also detected automatically: editing or deleting a pricelist rule, or changing a product's sale price, creates or tops up a draft document for the affected shops. A scheduled job reconciles shelf prices with the accounts.

Menus it adds

Retail Price Changes
Models and fields (7)
  • res.company · extends an existing model
  • product.product · extends an existing modell10n_ro_retail_price_change_count (Retail Price Changes)
  • product.template · extends an existing modell10n_ro_retail_price_change_count (Retail Price Changes)
  • product.pricelist.item · extends an existing model
  • l10n.ro.retail.markup.line · extends an existing modelprice_change_id
  • l10n.ro.retail.price.change · new modeldate, name, notes, state, line_ids (Lines), company_id, journal_id, auto_created, pricelist_id, warehouse_id, account_move_id, markup_line_ids (Markup Ledger)
  • l10n.ro.retail.price.change.line · new modelstate, quantity, cost_unit (Cost / Unit), company_id, product_id, currency_id, document_id, location_id, new_vat_unit (New VAT / Unit), old_vat_unit (Old VAT / Unit), warehouse_id (Warehouse), document_date (Date), vat_diff_total (VAT Delta), new_markup_unit (New Markup / Unit), old_markup_unit (Old Markup / Unit), markup_diff_total (Markup Delta), new_price_with_vat (New PVA), old_price_with_vat (Old PVA)

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-03
Confirmed (verified in repository and branch) Estimated (unverified) No information

Confirmation status: 2 confirmed, 7 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

OCA documentation · Odoo 20.0

Nothing to configure beyond what l10n_ro_stock_account_retail already asks for. What that module needs, this one relies on:

  • Retail warehouse. Tick Retail Warehouse on the shop and give it its Retail Pricelist. That pricelist holds the shelf price (PVA), VAT included, and is the one this document writes back to.
  • Accounts. 371, 378 and 4428 must resolve for every product the shop holds — on the location, the product, its category or the company, mapped through the warehouse fiscal position if it has one. Posting refuses rather than guessing.
  • Stock journal. The entry is posted in the company's stock journal; the document also lets you pick another one per document.

Two things are worth doing once, before the first price change:

  • Settle the opening balance. Stock that was on the shelf before l10n_ro_stock_account_retail was installed is in the quants and not in the markup ledger. Run Retail Opening Balance until it finds nothing. A price change document refuses to post while the ledger does not account for the same quantity it revalues, because the rate it applies is derived from the ledger.
  • Numbering. Each company gets its own PVSP/YYYY/00000 sequence, created on install and whenever a company is added. Change the prefix or padding per company under Settings → Technical → Sequences if the shop's own numbering differs.
  • The nightly reconciliation. Retail: Reconcile Shelf Prices is scheduled daily under Settings → Technical → Scheduled Actions. It raises drafts, never posts anything, and is what catches a price that moved without anyone writing a rule - a dated promotion opening, a shelf price computed over a cost the last reception moved, a change of VAT rate. Leave it on: the write hooks on the price list only make the common cases immediate, they cannot see those.

Changing a shelf price

The shop can start from either end.

From the document. Inventory → Retail → Price Changes, create one, pick the warehouse, Load Products. Every product on hand in the shop's retail locations comes in with what it currently carries on the left — cost, markup and deferred VAT per unit, read from the markup ledger, not from the price list — and the current shelf price on the right. Edit the New PVA of the lines that are changing, delete the rest, then Post.

From the price list. Change the price of a product on a shop's retail pricelist, and a draft Proces Verbal is raised for each retail warehouse that has that product on hand. It is a draft on purpose: somebody reviews it and posts it. Deleting a rule raises one too, because the label changes then as well.

Posting does four things, in one transaction: writes the new prices on the retail pricelist, posts the revaluation of 371 against 378 and 4428, records it in the markup ledger so the next sale releases the new markup, and prints as the Proces-verbal privind modificarea pretului de vanzare cu amanuntul.

The old side and the quantity are re-read at the moment of posting, not at the moment of loading. A draft raised this morning and posted this afternoon measures itself against what the shop holds this afternoon, so two documents on the same goods cannot each revalue from the same starting point.

Correcting a document

There is no reset to draft, and a posted document cannot be cancelled or deleted. It wrote prices, posted an entry and moved what the stock carries; the paper trail is the point. A price decision that turned out wrong is revoked the way it was made — post another Proces Verbal bringing the price back. Only a document still in draft can be cancelled or deleted.

Price history

Price History on a product lists every posted line that concerns it, oldest first: the date, the shop, the old and new PVA and the document that decided each. That is the shelf price history the shop has to be able to show.

What raises a document

A Proces Verbal is raised for every shelf price that moves, whatever decided it. What is compared is the price before and the price after, per product and per shop, so a rule that names a whole range produces a document holding the labels that actually changed — not the range.

Caught as it happens, from a write on the price list:

  • a fixed price on a product or a template;
  • a rule on a category, or a global rule;
  • any term of a formula — the base it starts from, the discount or markup, the rounding, the extra fee, the margins;
  • a change on another price list the shop derives from, however long the chain: the buyer moves a price on the buying list and the shop's labels move with it;
  • deleting a rule, because the label changes then as well;
  • a change to the product's sale price, for the shops that price their shelves off it — which is the default setup.

Caught overnight, by Retail: Reconcile Shelf Prices:

  • the day a dated promotion opens or closes on its own;
  • a shelf price computed over the cost, which moves on the next reception at a different cost;
  • a change of VAT rate, which re-splits every price in the shop;
  • anything else that moved the label without anyone writing a rule.

The cron is the mechanism of record, and it is the one to trust: it checks the invariant itself — the markup ledger says what each unit on the shelf carries, the price list says what the label reads, and those two agreeing is what this family of modules exists to maintain. The write hooks only make the common cases immediate.

The cost is deliberately not watched as it is written. standard_price is rewritten by the valuation on every reception under average cost, and hanging a price check off the hot path of every goods movement would make every receipt pay for a check that almost never finds anything.

Stock the markup ledger does not yet account for is left alone by the reconciliation. That is the opening balance, it has its own wizard, and a document raised over it would refuse to post anyway.

One open draft per shop

A shop has at most one open automatic document. A second price move on the same goods brings the open draft up to date instead of raising another one, so three price moves in a morning are one document quoting the price that is actually on the label — and the nightly reconciliation does not add the same divergence again every night until somebody posts it.

Posting does not replace your price rules

Posting writes a fixed rule per variant only where the price list does not already answer with the price the document decided. A document raised by a category rule or a markup formula therefore writes nothing back: the rule that produced the price still reaches the product afterwards. A fixed rule is an override, and it is written when somebody actually overrode something — a price typed by hand on the document.

No verified information in OCA: Installation.

info

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.