$ 242.00
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Inventory (stock)
• Invoicing (account) • Discuss (mail) • Purchase (purchase) |
| Community Apps Dependencies | Show |
| Lines of code | 11221 |
| Technical Name |
qt_stock_card_kardex |
| License | OPL-1 |
| Website | https://odoootips.com |
| Versions | 16.0 17.0 18.0 19.0 |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Inventory (stock)
• Invoicing (account) • Discuss (mail) • Purchase (purchase) |
| Community Apps Dependencies | Show |
| Lines of code | 11221 |
| Technical Name |
qt_stock_card_kardex |
| License | OPL-1 |
| Website | https://odoootips.com |
| Versions | 16.0 17.0 18.0 19.0 |
Odoo 19 Community & Enterprise
Your accountant needs stock cards. Odoo doesn't have them. This module solves that.
- ✔ Stock card per product with running AVCO
- ✔ Summary of all products — opening to closing
- ✔ Instant Excel & PDF — 5-10x faster
- ✔ Inventory vs Accounting reconciliation
- ✔ Costing change detection + draft correction entries
- ✔ 460 automated tests — production-grade
This module does not create stock movements. It reads what Odoo already recorded and presents it as a professional stock card with running AVCO.
Only Inventory is required. The rest are detected automatically if installed.
VI.2 The Wizard
Inventory → Reports → Stock Card Valuation
| Period | Specific month or custom date range |
| Scope | Period Activity (auto) │ By Category │ Selected Products |
| Layout | Detailed (In/Out separated) or Simplified (net movement) |
| Output | Preview │ Stock Card Excel/PDF │ Summary Excel/PDF |
I.1 Summary View
All AVCO products in one table. Click any row to open its stock card.
I.2 Stock Card Detail
Every inventory movement for one product, in chronological order with running AVCO balance.
| Each row | Date, partner, reference, origin, movement type |
| In / Out | Quantity, unit cost, total value |
| Running balance | Qty, AVCO unit cost, total value after each movement |
| Clickable refs | Opens the source document (picking, invoice, MO, etc.) |
I.3 Previous Balance
First row of the stock card: accumulated Qty, AVCO cost, and value before the selected period. Calculated from all AVCO records prior to the start date. In All-time mode, it is always zero.
II.1 Click to Open Source Documents
Every reference and origin tag is a clickable link. Opens the source document (receipt, delivery, PO, SO, MO) in a popup. Full audit trail from balance to transaction.
I.4 Product Valuation Panel
Real-time valuation panel at the top of the detail view. Compare it against the closing balance to detect movements after the cutoff date.
| Qty | Total from AVCO Report entries (qty_available) |
| Cost | Product's standard_price — the official AVCO unit cost |
| Value | Total inventory value (total_value) |
II.2 Date Filter in Views
From/To date pickers in both views. Click Apply to recalculate instantly. Detail view includes an "All Time" button for full history.
II.3 Search & Group by Category
Search by name, code, or barcode. Group by category for collapsible subtotals. Pagination at 80 products/page. Filters and grouping carry over to Excel/PDF exports.
III.1 Stock Card Report
III.2 Summary Report
IV.1 Export One Product
IV.2 Export with Filters
V.1 Detailed vs Simplified
Switch with one click in the toolbar. Same data, different column layout.
| Detailed | Simplified | |
|---|---|---|
| Columns | 15 | 12 |
| Movements | Separated: In (Qty, Cost, Total) + Out (Qty, Cost, Total) | Merged: Movement (Qty, Cost, Total) — positive = in, negative = out |
| Best for | Accountants, auditors, tax reports | Managers, quick reviews, presentations |
V.2 Custom Report Colors
Choose header background and text color in the wizard. Applied consistently to views, Excel, and PDF exports.
VI.4 Stock Card from Product Form
Click the "Stock Card" button on any AVCO product form to open its full movement history. Works on both template and variant forms. No wizard needed.
VI.1 User Permissions
| Role | Access |
|---|---|
| User | Preview, search, navigate, open from product form |
| Manager | All above + Excel/PDF export + reconciliation + draft correction entries |
VI.3 Smart Product Selector
Odoo's standard widget sends one server request per product added/removed — freezes with 200+ products. This widget accumulates changes locally and syncs once. Search, browse, paginate (40/page), zero lag.
qt_m2m_tags_widget installs automatically.
I.1 Multiple Purchases
| Operation | Ref | In | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| Receipt 1 | WH/IN/15631 | 100 | $10.00 | 100 | $10.00 | $1,000 |
| Receipt 2 | WH/IN/15632 | 50 | $12.00 | 150 | $10.67 | $1,600 |
| Receipt 3 | WH/IN/15633 | 80 | $9.00 | 230 | $10.09 | $2,320 |
II.1 Purchases + Sales
| Operation | In | Out | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| Purchase 200 @ $8 | 200 | $8.00 | 200 | $8.00 | $1,600 | |
| Purchase 100 @ $10 | 100 | $10.00 | 300 | $8.67 | $2,600 | |
| Delivery 120 units | 120 | $8.67 | 180 | $8.67 | $1,560 |
I.2 Bill Price Difference
| Operation | Ref | In | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| Receipt 100 (PO @ $10, Bill @ $13) | WH/IN/00300 | 100 | $13.00 | 100 | $13.00 | $1,300 |
| Receipt 50 (PO @ $11, Bill @ $12) | WH/IN/00301 | 50 | $12.00 | 150 | $12.67 | $1,900 |
stock.move.value of the receipt is updated in-place when the bill is posted (see account_move._post() → _set_value()). No separate row appears on the stock card — the receipt shows the final billed cost directly.
I.3 Vendor Discount
| Operation | Ref | In | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| Receipt 1 (PO @ $100, Bill @ $90) | WH/IN/00302 | 1 | $90.00 | 1 | $90.00 | $90 |
III.1 Landed Cost After Partial Delivery
| Operation | In | Out | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| Receipt 10 (after $50 landed cost) | 10 | $105 | 10 | $105.00 | $1,050 | |
| Delivery 4 units | 4 | $105 | 6 | $105.00 | $630 |
_set_value() on the affected stock moves, updating the receipt’s value in-place (from $1,000 to $1,050). The $20 portion attributable to already-delivered units is posted as a COGS adjustment in accounting but does not appear as a separate stock card row.
II.2 Customer Return
| Operation | In | Out | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| Receipt 10 @ $20 | 10 | $20.00 | 10 | $20.00 | $200 | |
| Delivery 4 units | 4 | $20.00 | 6 | $20.00 | $120 | |
| Customer return 2 units | 2 | $20.00 | 8 | $20.00 | $160 |
II.3 Vendor Return + Return of Return
| Operation | In | Out | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| Receipt 10 @ $20 | 10 | $20.00 | 10 | $20.00 | $200 | |
| Vendor return 4 units | 4 | $20.00 | 6 | $20.00 | $120 | |
| Re-entry (return of return) | 4 | $20.00 | 10 | $20.00 | $200 |
IV.1 Inventory Adjustments & Scrap
| Operation | In | Out | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| Receipt 10 @ $12 | 10 | $12.00 | 10 | $12.00 | $120 | |
| Positive adjustment +5 | 5 | $12.00 | 15 | $12.00 | $180 | |
| Negative adjustment −6 | 6 | $12.00 | 9 | $12.00 | $108 | |
| Scrap 2 units | 2 | $12.00 | 7 | $12.00 | $84 |
VI.1 Internal Transfer (Trace Row)
When you move stock between warehouses within the same company, the inventory value doesn't change — you still own the same products. The stock card shows a purple trace row so you can see the transfer happened.
| Operation | Ref | In | Out | Cost | Bal. Qty | AVCO | Value |
|---|---|---|---|---|---|---|---|
| Receipt 100 @ $8 | WH/IN/17087 | 100 | $8.00 | 100 | $8.00 | $800 | |
| Transfer 30 units to wh2 | WH/INT/00063 | 0 | 0 | $0.00 | 100 | $8.00 | $800 |
VI.2 Intercompany Transfer
When you transfer stock between two different companies, each company gets its own valuation entries. This is different from an internal transfer (same company) — here, real valuation entries are created.
| Operation | Ref | Qty | Value |
|---|---|---|---|
| Receipt 50 @ $20 | WH/IN/17088 | +50 | +$1,000 |
| Send to Company 2 | WH/OUT/06944 | -20 | -$400 |
| Operation | Ref | Qty | Value |
|---|---|---|---|
| Receive from Company 1 | PE Co/IN/00001 | +20 | +$400 |
V.1 MRP — Consume + Produce
| Operation | Ref | In | Out | Cost | Bal. Qty | AVCO | Value |
|---|---|---|---|---|---|---|---|
| Receipt 1 @ $10 | WH/IN/15662 | 1 | $10.00 | 1 | $10.00 | $10 | |
| Receipt 1 @ $20 | WH/IN/15663 | 1 | $20.00 | 2 | $15.00 | $30 | |
| MO consumption | WH/MO/00563 | 2 | $15.00 | 0 | $15.00 | $0 |
| Operation | Ref | In | Cost | Bal. Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| MO production 2 units | WH/MO/00563 | 2 | $15.00 | 2 | $15.00 | $30 |
V.2 MRP Byproduct — Cost Share
A factory produces juice from oranges. The main product is the juice, but the process also generates orange peel (byproduct). How much of the orange cost goes to the juice, and how much to the peel? That's what the BOM cost share defines.
V.3 MRP Unbuild — Reverse a Production
You produced something, but now you need to undo it — maybe the product was defective, or you need the raw materials back. Unbuild reverses the Manufacturing Order: the finished product leaves stock, and the components return.
| Operation | Ref | Qty | Value |
|---|---|---|---|
| MO production | WH/MO/00565 | +1 | +$15 |
| Unbuild (leaves stock) | UB/00124 | -1 | -$15 |
| Operation | Ref | Qty | Value |
|---|---|---|---|
| Receipt 1 @ $10 | WH/IN/15665 | +1 | +$10 |
| Receipt 1 @ $20 | WH/IN/15666 | +1 | +$20 |
| MO consumption | WH/MO/00565 | -1 | -$15 |
| Unbuild (returns to stock) | UB/00124 | +1 | +$15 |
I.5 Multicurrency Purchase (USD)
| Operation | Ref | PO Price | Rate | In | Cost (PEN) | Qty | AVCO | Value |
|---|---|---|---|---|---|---|---|---|
| Receipt | WH/IN/15677 | $30 USD | 3.72 | 10 | S/111.60 | 10 | S/111.60 | S/1,116.00 |
I.6 Purchase with Tax Included
| Operation | Gross | Tax | Net Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| Receipt | S/118.00 | 18% incl. | S/100.00 | 1 | S/100.00 | S/100 |
VI.3 Dropshipping (Trace Row)
In dropshipping the vendor ships directly to the customer. The product never enters your warehouse, so your inventory value does not change. The stock card adds an orange trace row so you can see the dropship happened.
| Operation | Ref | In | Out | Cost | Bal. Qty | AVCO | Value |
|---|---|---|---|---|---|---|---|
| Dropship 2 units Vendors → Customers | DS/00001 | 0 | 0 | $0.00 | 0 | $0.00 | $0 |
III.2 Landed Cost with Backorder
| Operation | In | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|
| Partial receipt 4 (after $20 landed) | 4 | $15.00 | 4 | $15.00 | $60 |
| Backorder 6 @ $10 | 6 | $10.00 | 10 | $12.00 | $120 |
stock.move.value in-place (from $40 to $60). The backorder is a regular receipt at the PO price. AVCO blends them: (60 + 60) / 10 = $12.00.
IV.2 Negative Stock
| Operation | In | Out | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| Receipt 10 @ $50 | 10 | $50 | 10 | $50.00 | $500 | |
| Oversell 15 units | 15 | $50 | -5 | $50.00 | -$250 | |
| New receipt 20 @ $55 | 20 | $55 | 15 | $55.00 | $825 |
III.5 Price Fluctuations
| Month | Operation | Ref | In | Out | Price | Bal. Qty | AVCO | Value |
|---|---|---|---|---|---|---|---|---|
| Jan | Buy 200 @ $5 | WH/IN/15656 | 200 | $5.00 | 200 | $5.00 | $1,000 | |
| Feb | Sell 80 | WH/OUT/06271 | 80 | $5.00 | 120 | $5.00 | $600 | |
| Mar | Buy 100 @ $8 (spike!) | WH/IN/15657 | 100 | $8.00 | 220 | $6.36 | $1,400 | |
| Apr | Buy 150 @ $5.50 | WH/IN/15658 | 150 | $5.50 | 370 | $6.01 | $2,225 |
I.4 Vendor Return + Credit Note
| Operation | Ref | In | Out | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|---|
| Receipt 10 @ $100 | WH/IN/15674 | 10 | $100 | 10 | $100.00 | $1,000 | |
| Vendor return (defective) | WH/OUT/06276 | 2 | $100 | 8 | $100.00 | $800 |
III.3 Manual Stock Revaluation
product.value entry automatically | Result: AVCO updates, qty unchanged
| Operation | Ref | In | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|---|
| Receipt 50 @ S/20 | WH/IN/15654 | 50 | S/20.00 | 50 | S/20.00 | S/1,000 |
| Revaluation: +S/250 (cost S/20 → S/25) | Adjustment | 0 | +S/5.00 | 50 | S/25.00 | S/1,250 |
_change_standard_price() which creates a product.value record with move_id=NULL. That record appears in the stock card as a yellow adjustment row with qty=0.
III.4 Standard Price Change
product.value record with the new unit cost | Result: AVCO updates to the new price
| Operation | In | Cost | Qty | AVCO | Value |
|---|---|---|---|---|---|
| Current stock | 100 | $10.00 | 100 | $10.00 | $1,000 |
| Price update $10 → $12 | 0 | $12.00 | 100 | $12.00 | $1,200 |
standard_price on the product triggers _change_standard_price() which creates a product.value row with the new unit cost as its value and move_id=NULL. The stock card picks it up from stock.avco.report automatically (no additional code in this module).
product.value entry with qty=0.
What Changed in Odoo 19
Odoo 19 changed how some adjustments appear on the stock card — fewer rows, same final numbers. When you post a vendor bill at a different price, or apply a freight charge, the adjustment is now merged directly into the original receipt row instead of creating an extra line.
| Situation | Before (Odoo 18) | Now (Odoo 19) |
|---|---|---|
| I.2 — Bill with different price | 4 rows (2 receipts + 2 adjustment rows) | 2 rows — receipts already show the billed price |
| I.3 — Vendor discount on bill | 2 rows (receipt + adjustment row) | 1 row — receipt already shows the discounted price |
| III.1 — Landed cost on receipt | 3 rows (receipt + delivery + freight row) | 2 rows — receipt already includes freight cost |
| III.2 — Landed cost on partial delivery | 3 rows (partial + freight row + backorder) | 2 rows — partial already includes freight cost |
- AVCO data layer (fetch, compute, eligibility)
- Balance integrity (product == kardex closing)
- Float precision & rounding stress
- Negative stock recovery
- Consistency (qty identity, multi-product)
- Wizard & date filtering
- Security groups & record rules
- Excel & ReportLab PDF exports
- Business flows, cancellations, returns
- MRP, intercompany, performance
- Origin tracking & movement classification
- I. Multiple purchases, bill diff, vendor discount, return, multicurrency, tax included
- II. Purchases + sales, customer return, vendor return chain
- III. Landed cost (partial & backorder), manual revaluation, price change, price fluctuations
- IV. Inventory adjustments, scrap, negative stock
- Exports: Detail Excel, Summary Excel, Detail PDF (ReportLab), Summary PDF, Summary view exports
- Smoke: Wizard, Summary view, Detail view, Product stat button
Detail Report — Stock Card
One sheet/page per product with every movement and running AVCO balance.
How it works
| Excel | XlsxWriter writes directly to disk (no RAM buffering). Atomic rename on completion. Ideal for large reports with 1,000+ products. |
| ReportLab generates in memory (BytesIO), then writes to disk. No wkhtmltopdf — 5-10x faster than standard Odoo reports. | |
| Delivery | Streaming via wrap_file() — file goes straight to your browser. Delete-on-read: file removed from disk as download starts. |
Benchmarks
| Volume | Excel | |
|---|---|---|
| 100 products | ~2s | ~3s |
| 500 products | ~8s | ~12s |
| 1,000 products | ~15s | ~25s |
| 114,932 rows | ~20s | ~58s (3,062 pages) |
Summary Report — Valuation Overview
All products in one table: opening, in, out, closing balance with Grand Total.
How it works
| Excel | XlsxWriter generates in memory (BytesIO) with merged headers and Grand Total row, then writes to disk for streaming delivery. |
| ReportLab generates in memory (BytesIO). A4 landscape, formatted for print. No wkhtmltopdf. | |
| Delivery | Same streaming engine: wrap_file() + delete-on-read. No database storage, no temp file accumulation. |
Benchmarks
| Volume | Excel | |
|---|---|---|
| 100 products | < 1s | < 1s |
| 500 products | ~2s | ~2s |
| 1,000 products | ~3s | ~3s |
| 3,070 products | ~3s | ~8s (70 pages) |
Install (5 minutes)
| 1 | Download the ZIP from Odoo Apps |
| 2 | Extract 3 folders into your addons path: qt_stock_card_kardex, qt_m2m_tags_widget, direct_download_base |
| 3 | Restart Odoo → Apps → Update Apps List → search "Stock Card" → Install |
Requirements
| Requirement | Where to set it | Why |
|---|---|---|
| AVCO Costing Method | Inventory → Configuration → Product Categories → Costing Method | Only AVCO products generate the AVCO report entrys this module reads |
| Storable Products | Product form → Product Type = "Storable Product" | Consumables and Services don't create valuation entries records |
| Automated Valuation | Product Categories → Inventory Valuation = Automated | Needed for AVCO vs Accounting reconciliation |
❓ Frequently Asked Questions
Before Purchasing
About the Module
- Community (self-hosted) ✔
- Enterprise on-premises (self-hosted) ✔
- Odoo.sh (cloud managed) ✔
- Odoo Online (SaaS) ✘
📧 Support & Guarantees
Quality Guaranteed
460 automated tests covering every business flow. If you find a bug, we fix it — no questions asked.
Fast Response
We respond within 24 hours on business days. Most issues are resolved within 48 hours.
Free Updates
Bug fixes and improvements are published as updates on Odoo Apps. Download anytime.
📞 Contact Us
🌐 Website
odootips.com- Your Odoo version (17.0.x.y.z)
- Module version (from Apps → module info)
- Steps to reproduce the issue
- Screenshots if applicable
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
There are no ratings yet!
i would like a demo of this module.
i would like a demo of this module.
Hello. I would like to get in touch with the vendor please.
Hello. I would like to get in touch with the vendor please.
Thank you for your interest in this module.
Please write to wilderhernandezg@gmail.com, and we will gladly send you a URL so you can review its features and functionalities.