Friday, September 4, 2026
6 changes · master
Enhancements to existing features
Purchase orders will no longer automatically create vendor price lists when confirmed. If no manual vendor price list exists, Odoo now uses the most recent confirmed purchase order line as the reference price, helping businesses with frequently changing supplier prices avoid outdated pricing records.
Original PR description
Before, confirming a purchase order automatically created a vendor pricelist (product.supplierinfo) for every product/vendor without one, silently locking the first purchase price in as pricelist. In…
Before, confirming a purchase order automatically created a vendor pricelist (product.supplierinfo) for every product/vendor without one, silently locking the first purchase price in as pricelist. In industries with constantly fluctuating prices (e.g. oil), purchasers do not negotiate pricelists, they simply apply the last price communicated by the vendor. For them, the pricelist automatically created on order confirmation was outdated by the next price change, and maintaining pricelists could be tedious. Now vendor pricelists are only created manually. When no pricelist is defined for a product/vendor, the most recently confirmed purchase order line acts as the vendor pricelist. Additionally, the purchase history / price comparison view gains an optional 'Discount %' column, and is grouped by vendor by default. _select_seller now returns the seller information as a dictionary instead of a product.supplierinfo record, since a seller can come from the last confirmed purchase order line, which has no record. task-5456444
Warehouse batch transfers and wave picking are now presented as a unified workflow, making it easier for teams to group either full transfers or individual move lines in one place. Automatic batching by carrier was also corrected so deliveries for different carriers are no longer incorrectly mixed.
Original PR description
Odoo's definition of wave picking does not match the industry standard. This commit blends the two concepts at the UI level. Inside a batch transfer, you can add a whole transfer or individual move lines, as previously with a wave transfer. Task-6294586
Belgian payroll now makes lump sum and representation allowances easier to manage by replacing fixed checkbox options with editable allowance fields and clearer categories. This gives payroll teams more flexibility to activate specific allowances, set employee-specific amounts, and calculate prorated allowances more accurately.
Original PR description
For details, see the docs in the related task. As a general ides, this PR aims at simplifying the management of Lump Sum Allowances. We first refactor the Representation Fees section in the Payroll…
For details, see the docs in the related task. As a general ides, this PR aims at simplifying the management of Lump Sum Allowances. We first refactor the Representation Fees section in the Payroll tab of the employee form view by switching from using checkboxes with their related fixed amounts, to using editable fields that have their defaults fixed to those amounts. We then introduce new categories to include a miriad of other possible allowances. Finally, we integrate this with the new view_id system so that each lump sum can be activated/deactivated at will. All Benefits under the Lump Sum Allowances section except for Daily Misc. Other Criteria and Monthly Misc. Other Criteria are considered normal Representation Fees (i.e. with serious standard). Each of them has their own Salary Rule with category SERIOUS_REPRESENTATION, all these values are later grouped (summed) in the Representation Fees salary rule. In the same way, Daily Misc. Other Criteria and Monthly Misc. Other Criteria have their Salary rules with category NON_SERIOUS_REPRESENTATION and are summed to become Representation Fees (Without Serious Standard). Representation fees with serious standard are fixed amounts, while those without serious standard are prorated based on the amount of days in the payslip period that are eligible for representation fees. Some Benefits (namely Homeworking, Phone, Internet, all the Car Management ones and the Daily and Monthly Misc. ones) are only based on the amount set on the employee's profile. The other benefits are based on both the value on the employee profile and a Salary Input on the payslip, that specifies either the distance traveled or the days of outside work depending on the type of benefit. We also have to modify some tests that were failing because they were expecting different rules to appear in the payslip and a threshold to the With Serious Standard amount. Task: 5443155
AI-generated website pages now get stronger visual direction, more consistent branding, better image handling, and extra polish before users see the final result. The process is split into a separate finishing step to avoid timeouts, making page generation more reliable while improving the quality of the finished pages.
Original PR description
Improves AI-generated page quality, and splits a full-page build in two so it fits the worker time limit. - **Art direction** - new `apply_brand_kit` tool (palette, font pairing, corners/shadows);…
Improves AI-generated page quality, and splits a full-page build in two so it fits the worker time limit. - **Art direction** - new `apply_brand_kit` tool (palette, font pairing, corners/shadows); the prompt now picks an aesthetic direction and layout before writing HTML. - **Refinement passes** - after a page is composed, two one shot passes add section shapes and CSS polish. The LLM returns decisions only, markup is built in Python so rules it ignores can be enforced. - **Snippets** - explicit allowlist with intent hints, shuffled so picks rotate. - **Images** - written as `<img data-ai-image-prompt>` and generated during finalization. - **Deferred finalization** - images and both refinement passes moved to `/ai_website/finalize_page`. Page and reply are held server-side and released together, so only the finished result is shown. **Why split:** `- limit-time-real` (120s) killed the worker, at least on runbot, so image generation, refinement passes are not part of the main loop anymore and are a separate request. worth looking at if another solution would be available
PayPal in Odoo now supports a wider range of payment methods, including Pay Later, Venmo, card payments, and several local European payment options. The update also adds a smoother seller onboarding flow and standardizes the PayPal checkout experience, helping merchants activate and offer more payment choices globally.
Original PR description
We currently only support PayPal Wallet, but PayPal can also be integrated as a regular payment provider, offering many payment methods and worldwide coverage. In this commit, we add the following payment methods: - Via PayPal's JS SDK: Pay Later, Venmo, and Advanced Credit and Debit Cards. - Via Orders API: Bancontact, BLIK, EPS, iDEAL, Multibanco, MyBank, Przelewy24, and Trustly. We also migrate PayPal Wallet integration from JS SDK to Orders API to uniformize the look of payment methods through different payment providers. task-6090080
PayPal payments now support more payment options, easier merchant onboarding, and the ability for customers to save eligible PayPal Wallet or card details for future use. This helps reduce repeat checkout friction and enables merchants to handle recurring or follow-up payments when PayPal vaulting is enabled.
Original PR description
In recent commits, we integrated various payment methods provided by PayPal, including Advanced Credit and Debit Cards. We also migrated the PayPal Wallet integration from the JS SDK to the Orders API to standardize the appearance of payment methods across different providers. Before this commit, customers had to re-enter their payment details for every PayPal transaction, and merchants could not charge them offline (e.g., for subscriptions or invoice follow-ups). This commit introduces the ability to tokenize PayPal Wallet and PayPal-provided cards. Tokenization is available if the merchant's account has the advanced vaulting capability enabled. We also handle the case where PayPal creates the vault asynchronously, generating the token via a webhook rather than the immediate checkout response. task-6095033