$ 150.19
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Invoicing (account)
• Discuss (mail) |
| Lines of code | 860 |
| Technical Name |
aos_account_discount |
| License | OPL-1 |
| Website | https://www.alphasoft.co.id/ |
| Versions | 10.0 11.0 14.0 15.0 16.0 17.0 |
Journal Discount on Invoice Line
Post line-level discount amounts to dedicated journal
accounts — so your trial balance shows
Gross Sales and Discount Given
separately, instead of silently netted.
Standalone — no aos_base_account required.
Line-level fields —
undiscount, tax basis, more
Move types supported —
customer + vendor, invoice + refund
Setup steps —
create accounts, map, done
Companies & users —
flat license, no per-user fee
[AOS-DISC-DEMO]) ·
Apps cover synced with banner ·
Self-healing category wiring
Why net revenue alone isn’t enough
Odoo’s standard flow computes subtotal as
qty × price × (1 − discount%). The
discount portion vanishes into net revenue. CFOs can’t measure
discount-to-sales ratio. Auditors can’t tie posted PnL to the
discounts that produced it.
Without this module
- Gross sales total — not visible. Sales Revenue posts net of discount only.
- Discount given total — requires SQL query against invoice lines every month-end.
- Discount-to-sales ratio — manual calculation; no PnL drill-down possible.
- Per-category tracking — impossible without custom report.
- Audit trail — discount lives in invoice line metadata, not in the GL.
With this module
- Gross sales total — Sales Revenue at NET on the original line + a gross-up counter on the same account: trial-balance sum rolls up to GROSS. Tax basis unchanged.
- Discount given total —
dedicated GL line per invoice line, flagged
is_discount_line=True. PnL drill-down works. - Discount-to-sales ratio — one click in Accounting → Reporting → Profit and Loss.
- Per-category tracking —
configurable Discount Customer Account per
product.category. - Audit trail — DISC journal split cross-references each invoice line.
See the journal split in action
Same invoice line — qty 10, price 1,000, discount 15%, VAT 10% — posted with and without the module.
What you also get
Pre-discount columns
Five new optional columns in the invoice line editor: Undiscount, Disc Untaxed, Undiscount Tax Basis, Tax Basis. Hidden by default — toggle on per-user.
Refund + purchase symmetry
Works on customer invoices, customer refunds, vendor bills, and vendor refunds. Sign flips correctly; direction matrix documented in README.
Clean re-post flow
Edit discount %, reset to draft, re-post — DISC lines regenerate from the new value. No orphans, no manual cleanup. Idempotent.
Two-level configuration
Set defaults on
product.category, override per
product.template. Granular tracking where you need
it, sensible defaults everywhere else.
Analytics-aware
Inherits analytic_account_id
and analytic_tag_ids from the source line. Analytics
breakdown remains intact across the DISC split.
Tax-safe
Tax basis computed on post-discount net, exactly like Odoo standard. The DISC split is GL-only — your VAT return, SPT, output VAT all unchanged.
How it compares
| Reporting need | Standard Odoo | With this module |
|---|---|---|
| Gross sales total in trial balance | net only | ✓ gross posted |
| Discount given as a GL line | ✗ invisible | ✓ dedicated account |
| PnL drill-down to discounts | ✗ | ✓ one click |
| Per-category tracking | ✗ | ✓ product.category field |
| Per-product override | ✗ | ✓ product.template field |
| Refund / vendor side | net only | ✓ sign-flip symmetric |
| Tax basis | post-discount | post-discount (unchanged) |
| Re-post after edit | n/a | ✓ idempotent |
Direction matrix — all four move types
Same code path handles sales and purchases, invoices and refunds.
Sign flips automatically based on move_type.
| Move type | Debit | Credit |
|---|---|---|
out_invoice |
Discount Customer Account | original income account |
out_refund |
original income account | Discount Customer Account |
in_invoice |
original expense account | Discount Vendor Account |
in_refund |
Discount Vendor Account | original expense account |
Configure without code
Three setup steps, less than three minutes. No Python, no XML, no module restart.
Create discount accounts
Accounting → Chart of Accounts → create two new accounts: Discount Given (income-other) and Discount Received (expense-other). Codes follow your local CoA.
Map to categories
Inventory → Configuration → Product Categories → pick category → under Account Properties, set Discount Customer Account and Discount Vendor Account.
(Optional) per-product override
For products that need separate tracking (slow-mover vs
promo discount, etc.), open
product.template → Accounting tab →
override the account. Falls back to category if blank.
Resolution order at posting time: product.template override → product.category default → skip (no DISC split generated for that line). Blank both = invoice posts normally, exactly like standard Odoo.
Fields added — ready for custom reports
Six new fields on account.move.line, all stored and
computed. Use them in QWeb invoice templates or custom XLSX
exporters.
| Field | Purpose |
|---|---|
price_undiscount |
Line total before discount % applied |
price_discount_untaxed |
The discount amount, untaxed — value of the DISC journal split |
price_undiscount_untaxed |
Tax basis as if no discount were applied |
price_untaxed |
Actual taxable base (= price_subtotal, materialised for reports) |
price_unit_undiscount_untaxed |
Per-unit price, pre-discount, post-tax-removal |
is_discount_line |
True on the auto-generated DISC split rows — use to filter them out of reports |
Installation — 3 minutes
- Purchase & download the module from the Apps Store.
- Extract into your Odoo addons path.
- Open Apps → Update Apps List.
- Search Journal Discount on Invoice Line → click Install.
- Create your Discount Given / Discount Received accounts in the Chart of Accounts.
- Assign them to your product categories (or per product).
Depends on account only (ships with Odoo Community).
Zero custom modules required.
No Python packages to install.
One license · All features · Free updates
One-time license
EUR 129
Single database · unlimited users · single fee
- ✓ All four move types (sales + purchase, invoice + refund)
- ✓ Per-category + per-product configuration
- ✓ Six new line-level fields (computed + stored)
- ✓ Analytics-aware, tax-safe
- ✓ Idempotent re-post / cancel handling
- ✓ Source code included (OPL-1)
- ✓ Free updates within Odoo 15.x
- ✓ Email support (1 business day)
Need help?
We respond within 1 business day to support requests.
- Email: info@alphasoft.co.id
- Website: www.alphasoft.co.id
- Docs: README.md inside the module
Custom development
Need bespoke accounting workflows? Indonesia Coretax integration, custom XBRL output, multi-jurisdiction templates — we do custom Odoo work. Get in touch.
Compatibility
| Odoo version | Status |
|---|---|
| 17.0 | ✓ This release — 17.0.1.1.0 docs accuracy pass |
| 16.0 | Available — 16.0.1.1.0 standalone (sibling port) |
| 15.0 | Available — 15.0.1.0.0 standalone (sibling port) |
| 14.0 | Available — 14.0.1.0.0 standalone (sibling port) |
| 18.0 | Available — 18.0.1.1.0 standalone (sibling port) |
| 19.0 | Same code base · manifest version bump (drop-in port) |
Depends on account (stock Odoo). No external Python deps.
No aos_base_account required as of 17.0.1.0.0.
License: OPL-1 (Odoo Proprietary License v1.0) | Author: Alphasoft | Version: 17.0.1.1.0 | Odoo: 17.0 Community / Enterprise
Trademarks & logos: Odoo® is a trademark of Odoo S.A. Alphasoft is not affiliated with or endorsed by Odoo S.A.
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module