Skip to Content
Odoo Menu
  • Sign in
  • Try it free
  • Apps
    Finance
    • Accounting
    • Invoicing
    • Expenses
    • Spreadsheet (BI)
    • Documents
    • Sign
    Sales
    • CRM
    • Sales
    • POS Shop
    • POS Restaurant
    • Subscriptions
    • Rental
    Websites
    • Website Builder
    • eCommerce
    • Blog
    • Forum
    • Live Chat
    • eLearning
    Supply Chain
    • Inventory
    • Manufacturing
    • PLM
    • Purchase
    • Maintenance
    • Quality
    Human Resources
    • Employees
    • Recruitment
    • Time Off
    • Appraisals
    • Referrals
    • Fleet
    Marketing
    • Social Marketing
    • Email Marketing
    • SMS Marketing
    • Events
    • Marketing Automation
    • Surveys
    Services
    • Project
    • Timesheets
    • Field Service
    • Helpdesk
    • Planning
    • Appointments
    Productivity
    • Discuss
    • Approvals
    • IoT
    • VoIP
    • Knowledge
    • WhatsApp
    Third party apps Odoo Studio Odoo Cloud Platform
  • Industries
    Retail
    • Book Store
    • Clothing Store
    • Furniture Store
    • Grocery Store
    • Hardware Store
    • Toy Store
    Food & Hospitality
    • Bar and Pub
    • Restaurant
    • Fast Food
    • Guest House
    • Beverage Distributor
    • Hotel
    Real Estate
    • Real Estate Agency
    • Architecture Firm
    • Construction
    • Property Management
    • Gardening
    • Property Owner Association
    Consulting
    • Accounting Firm
    • Odoo Partner
    • Marketing Agency
    • Law firm
    • Talent Acquisition
    • Audit & Certification
    Manufacturing
    • Textile
    • Metal
    • Furnitures
    • Food
    • Brewery
    • Corporate Gifts
    Health & Fitness
    • Sports Club
    • Eyewear Store
    • Fitness Center
    • Wellness Practitioners
    • Pharmacy
    • Hair Salon
    Trades
    • Handyman
    • IT Hardware & Support
    • Solar Energy Systems
    • Shoe Maker
    • Cleaning Services
    • HVAC Services
    Others
    • Nonprofit Organization
    • Environmental Agency
    • Billboard Rental
    • Photography
    • Bike Leasing
    • Software Reseller
    Browse all Industries
  • Community
    Learn
    • Tutorials
    • Documentation
    • Certifications
    • Training
    • Blog
    • Podcast
    Empower Education
    • Education Program
    • Scale Up! Business Game
    • Visit Odoo
    Get the Software
    • Download
    • Compare Editions
    • Releases
    Collaborate
    • Github
    • Forum
    • Events
    • Translations
    • Become a Partner
    • Services for Partners
    • Register your Accounting Firm
    Get Services
    • Find a Partner
    • Find an Accountant
      • Get a Tailored Demo
    • Implementation Services
    • Customer References
    • Support
    • Upgrades
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +32 2 290 34 90
    • Get a Tailored Demo
  • Pricing
  • Help
  1. APPS
  2. Warehouse
  3. kardex - stock card - valuation report | odoo kardex v 19.0
  4. Sales Conditions FAQ

kardex - stock card - valuation report | odoo kardex

by QoriTech https://odoootips.com
Odoo

$ 242.00

v 19.0 Third Party 13
Live Preview
Apps purchases are linked to your Odoo account, please sign in or sign up first.
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Inventory (stock)
• Invoicing (account)
• Discuss (mail)
• Purchase (purchase)
Community Apps Dependencies Show
• Direct Download Base
• M2M Tags Widget
Lines of code 11221
Technical Name qt_stock_card_kardex
LicenseOPL-1
Websitehttps://odoootips.com
Versions 16.0 17.0 18.0 19.0
You bought this module and need support? Click here!
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Inventory (stock)
• Invoicing (account)
• Discuss (mail)
• Purchase (purchase)
Community Apps Dependencies Show
• Direct Download Base
• M2M Tags Widget
Lines of code 11221
Technical Name qt_stock_card_kardex
LicenseOPL-1
Websitehttps://odoootips.com
Versions 16.0 17.0 18.0 19.0
  • Description
  • License
Stock Card Valuation (AVCO)
Odoo 19 Community & Enterprise
Know exactly what your inventory is worth

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
▶ Watch Demo
v19.0 ✔ CE ✔ EE ✔ .sh ✘ Online
How It Works

This module does not create stock movements. It reads what Odoo already recorded and presents it as a professional stock card with running AVCO.

How stock movements flow into the Stock Card
Compatible with all your Odoo workflows

Only Inventory is required. The rest are detected automatically if installed.

📦
Inventory
Required
🛒
Purchase
Auto-detected
💰
Sales
Auto-detected
🏭
Manufacturing
Auto-detected
💸
Landed Costs
Auto-detected
Don't have Purchase or Manufacturing? No problem — the stock card works perfectly with Inventory alone. Install more modules later and the stock card adapts instantly.
460
Tests
15
Business Cases
12
Drill-Downs
4
Exports
EN/ES
Languages
▶ Watch Demo
📖 Documentation
  • 📖 User Guide
  • 💼 Business Cases
  • 🚀 Performance
  • ⚙ Installation
  • ❓ FAQ
  • 📧 Support
User Guide
I. VIEWS I.1 Summary View I.2 Stock Card Detail I.3 Previous Balance I.4 Product Valuation Panel II. NAVIGATION II.1 Click to Open Docs II.2 Date Filter II.3 Search & Group III. EXPORT → WIZARD III.1 Stock Card III.2 Summary IV. EXPORT → VIEWS IV.1 One Product IV.2 With Filters V. SETTINGS V.1 Detailed vs Simple V.2 Custom Colors VI. GETTING STARTED VI.1 User Permissions VI.2 The Wizard VI.3 Smart Selector VI.4 From Product Form

VI.2 The Wizard

🧭 The Wizard — select period, products, and output
Wizard

Inventory → Reports → Stock Card Valuation

PeriodSpecific month or custom date range
ScopePeriod Activity (auto) │ By Category │ Selected Products
LayoutDetailed (In/Out separated) or Simplified (net movement)
OutputPreview │ Stock Card Excel/PDF │ Summary Excel/PDF

I.1 Summary View

📋 Summary View — all products with opening and closing balance

All AVCO products in one table. Click any row to open its stock card.

Columns: Product, Category, Opening (Qty/Cost/Value), In, Out, Closing
Features: Sticky header/footer, server-side pagination, click-to-detail

I.2 Stock Card Detail

📊 Stock Card Detail — every movement with running AVCO

Every inventory movement for one product, in chronological order with running AVCO balance.

Each rowDate, partner, reference, origin, movement type
In / OutQuantity, unit cost, total value
Running balanceQty, AVCO unit cost, total value after each movement
Clickable refsOpens the source document (picking, invoice, MO, etc.)

I.3 Previous Balance

📅 Previous Balance — opening stock before the selected period
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

🔗 Click to Open Docs — trace any row back to its source

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

📊 Product Valuation Panel — real-time Qty, Cost, and Value from Odoo
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.

QtyTotal from AVCO Report entries (qty_available)
CostProduct's standard_price — the official AVCO unit cost
ValueTotal inventory value (total_value)

II.2 Date Filter in Views

📅 Date Filter — change period without returning to the wizard
Date Filter

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 & Group — find products and 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

Wizard → Stock Card Excel / PDF — one file with all selected products. Excel: one sheet per product. PDF: one page per product, print-ready.
💾 Wizard → Stock Card — export all products in one file
📊 Excel Output — one sheet per product with all movements
Excel Output
📄 PDF Output — print-ready with company header and custom colors
PDF Output

III.2 Summary Report

Wizard → Summary Excel / PDF — all products in one table: opening, in, out, closing balance with Grand Total.
💾 Wizard → Summary — export valuation overview
📊 Excel Output — all products in one sheet with Grand Total
Excel Output
📄 PDF Output — A4, formatted for print
PDF Output

IV.1 Export One Product

Detail View → toolbar → Excel / PDF — exports the current product with active date range and layout. Manager role only.
💾 Detail View → Export single product
Export One Product

IV.2 Export with Filters

Summary View → toolbar → Excel / PDF — exports exactly what you see: active search, date range, and grouping are preserved. Manager role only.
💾 Summary View → Export with active filters
📄 PDF Output — with filters and grouping applied
PDF Output
📊 Excel Output — with filters and grouping applied
Excel Output
vs. Wizard export: Wizard includes ALL products in scope. This export includes only what's visible after your search/filters.

V.1 Detailed vs Simplified

Switch with one click in the toolbar. Same data, different column layout.

DetailedSimplified
Columns1512
MovementsSeparated: In (Qty, Cost, Total) + Out (Qty, Cost, Total)Merged: Movement (Qty, Cost, Total) — positive = in, negative = out
Best forAccountants, auditors, tax reportsManagers, quick reviews, presentations
Detailed Layout 15 columns
Detailed Layout
Simplified Layout 12 columns
Simplified Layout

V.2 Custom Report Colors

Choose header background and text color in the wizard. Applied consistently to views, Excel, and PDF exports.

① Set colors in the Wizard
Color Settings
② Colors applied in the Detail View
Colors in Detail View
③ Colors applied in Excel export
Colors in Excel

VI.4 Stock Card from Product Form

📦 Product Form → Stock Card smart button
Stock Card button on 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

Settings → Users → Stock Card Valuation
User Permissions
RoleAccess
UserPreview, search, navigate, open from product form
ManagerAll above + Excel/PDF export + reconciliation + draft correction entries

VI.3 Smart Product Selector

⚡ Smart Product Selector — replaces Odoo's standard many2many widget

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.

Included as dependency: qt_m2m_tags_widget installs automatically.
Business Cases
I. PURCHASES I.1 Multiple Purchases I.2 Bill Price Difference I.3 Vendor Discount I.4 Vendor Return + Credit I.5 Multicurrency (USD) I.6 Tax Included II. SALES & RETURNS II.1 Purchases + Sales II.2 Customer Return II.3 Vendor Return Chain III. COSTS & REVALUATIONS III.1 Landed Cost + Partial III.2 Landed Cost + Backorder III.3 Manual Revaluation III.4 Standard Price Change III.5 Price Fluctuations IV. ADJUSTMENTS IV.1 Adjustments & Scrap IV.2 Negative Stock V. MANUFACTURING V.1 MRP Production V.2 MRP Byproduct V.3 MRP Unbuild VI. LOGISTICS VI.1 Internal Transfers VI.2 Intercompany Transfer VI.3 Dropshipping

I.1 Multiple Purchases

Flow: PO#1 → Receipt → PO#2 → Receipt → PO#3 → Receipt   |   Result: AVCO updates after each incoming
OperationRefInCostQtyAVCOValue
Receipt 1WH/IN/15631100$10.00100$10.00$1,000
Receipt 2WH/IN/1563250$12.00150$10.67$1,600
Receipt 3WH/IN/1563380$9.00230$10.09$2,320
Key point: Each receipt recalculates AVCO = (Previous Value + New Value) / (Previous Qty + New Qty). The stock card shows the AVCO change in every row.
📊 Stock Card — Multiple Purchases at Different Costs
Stock Card - Multiple Purchases

II.1 Purchases + Sales

Flow: Buy at different prices → Sell → Outgoing uses current AVCO   |   Result: AVCO does not change on sales
OperationInOutCostQtyAVCOValue
Purchase 200 @ $8200$8.00200$8.00$1,600
Purchase 100 @ $10100$10.00300$8.67$2,600
Delivery 120 units120$8.67180$8.67$1,560
Key point: The sale price is irrelevant here. The stock card only shows the cost of goods sold (COGS) at the current AVCO.
📊 Stock Card — Purchases + Sales (outgoing at current AVCO)
Stock Card - Purchases + Sales

I.2 Bill Price Difference

Flow: Receipt at PO price → Bill posted at different price → Odoo 19 updates the receipt’s value in-place   |   Result: AVCO reflects the actual billed cost
OperationRefInCostQtyAVCOValue
Receipt 100 (PO @ $10, Bill @ $13)WH/IN/00300100$13.00100$13.00$1,300
Receipt 50 (PO @ $11, Bill @ $12)WH/IN/0030150$12.00150$12.67$1,900
Odoo 18 → Odoo 19 change: In Odoo 18, a qty=0 revaluation SVL entry was created for each bill price difference. In Odoo 19, the 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.
Key point: When the vendor bill is posted, Odoo 19 recalculates the receipt’s stock move value from the bill line. The AVCO is computed from the actual billed cost, not the PO price. The final value matches what you paid.
📊 Stock Card — Bill Price Difference (in-place value update)
Stock Card - Bill Price Difference

I.3 Vendor Discount

Flow: Receipt at PO price → Bill posted at discounted price → Odoo 19 updates the receipt’s value in-place   |   Result: AVCO reflects the discounted cost
OperationRefInCostQtyAVCOValue
Receipt 1 (PO @ $100, Bill @ $90)WH/IN/003021$90.001$90.00$90
Odoo 18 → Odoo 19 change: In Odoo 18, a negative revaluation SVL entry was created for the discount. In Odoo 19, the receipt’s value is updated in-place from $100 to $90 when the bill is posted. The stock card shows only the receipt with the final discounted cost.
Key point: Same mechanism as I.2 but in reverse — the vendor gave a discount, so the AVCO decreases. The receipt’s stock move value is recalculated from the bill line when posted.
📊 Stock Card — Vendor Discount (in-place value update)
Stock Card - Vendor Discount

III.1 Landed Cost After Partial Delivery

Flow: Receipt 10 → Deliver 4 → Add $50 freight → Odoo 19 updates the receipt’s value in-place   |   Result: AVCO = $105.00
OperationInOutCostQtyAVCOValue
Receipt 10 (after $50 landed cost)10$10510$105.00$1,050
Delivery 4 units4$1056$105.00$630
Odoo 18 → Odoo 19 change: In Odoo 18, a separate SVL row was created for the landed cost (qty=0, value=+$30 for the remaining 6 units). In Odoo 19, the landed cost validation calls _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.
Key point: Odoo 19 distributes the $50 freight across all 10 originally-received units (+$5/unit). The receipt’s stock move value becomes $1,050. Since 4 units were already delivered, the remaining 6 units are worth 6 × $105 = $630.
📊 Stock Card — Landed Cost after partial delivery (in-place value update)
Stock Card - Landed Cost Partial

II.2 Customer Return

Flow: Receipt → Deliver → Customer returns → Re-enters at original delivery cost   |   Note: Odoo 19 default
OperationInOutCostQtyAVCOValue
Receipt 10 @ $2010$20.0010$20.00$200
Delivery 4 units4$20.006$20.00$120
Customer return 2 units2$20.008$20.00$160
Key point: Odoo 19 uses the cost from the original delivery, not the current AVCO. If prices changed between delivery and return, the AVCO may shift slightly.
📊 Stock Card — Customer Return (re-entry at historical cost)
Stock Card - Customer Return

II.3 Vendor Return + Return of Return

Flow: Receipt → Return to vendor (stock goes out) → Vendor sends back (re-entry)   |   Result: AVCO returns to original
OperationInOutCostQtyAVCOValue
Receipt 10 @ $2010$20.0010$20.00$200
Vendor return 4 units4$20.006$20.00$120
Re-entry (return of return)4$20.0010$20.00$200
Key point: The full return chain is traceable. Vendor return = outgoing at AVCO. Re-entry = incoming at the original cost. The stock card shows each step with clickable references.
📄 PDF Export — Vendor Return + Re-entry (full return chain)
PDF - Vendor Return Chain

IV.1 Inventory Adjustments & Scrap

Flow: Physical count differs from system → Adjust → AVCO stays the same   |   Scrap: same as negative adjustment
OperationInOutCostQtyAVCOValue
Receipt 10 @ $1210$12.0010$12.00$120
Positive adjustment +55$12.0015$12.00$180
Negative adjustment −66$12.009$12.00$108
Scrap 2 units2$12.007$12.00$84
Key point: Adjustments and scrap use the current AVCO. The average cost does not change — only quantity and total value adjust.
📊 Stock Card — Adjustments & Scrap (AVCO stays the same)
Stock Card - Adjustments Scrap

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.

Scenario: Buy 100 units @ $8 = $800 total. Then transfer 30 units from main warehouse (WH/Stock) to a second warehouse (wh2/Stock).
OperationRefInOutCostBal. QtyAVCOValue
Receipt 100 @ $8WH/IN/17087100$8.00100$8.00$800
Transfer 30 units to wh2WH/INT/0006300$0.00100$8.00$800
Why does the trace row show Qty=0 and Value=0? Because the transfer doesn't change the company's total inventory. You moved 30 units from one warehouse to another, but you still own 100 units worth $800. The stock card tracks valuation at company level, not per warehouse — so the balance stays the same.
The purple trace row tells you: "A transfer of 30 units happened on this date via WH/INT/00063." You can click the reference to see the full transfer details. But the AVCO and balance don't change.
📊 Stock Card — Receipt + Internal Transfer trace row (purple row = no balance impact)
Stock Card - Internal Transfer

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.

Scenario: Company 1 buys 50 units @ $20. Then sends 20 units to Company 2 via intercompany transit.
Company 1 — Stock card (sender)
OperationRefQtyValue
Receipt 50 @ $20WH/IN/17088+50+$1,000
Send to Company 2WH/OUT/06944-20-$400
Final: Qty = 30, Value = $600, AVCO = $20
Company 2 — Stock card (receiver)
OperationRefQtyValue
Receive from Company 1PE Co/IN/00001+20+$400
Final: Qty = 20, Value = $400, AVCO = $20
Key difference vs internal transfer: Internal transfers (same company) create a trace row with Qty=0. Intercompany transfers create real valuation entries — an outgoing in the sender company and an incoming in the receiver company. Each company has its own stock card.
In the module: When you open the stock card in Company 1, you see the receipt + outgoing. When you switch to Company 2, you see the incoming. The module tracks each company's valuation independently.
📊 Stock Card Company 1 — Receipt + outgoing to Company 2
Stock Card - Intercompany Company 1
📊 Stock Card Company 2 — Incoming from Company 1
Stock Card - Intercompany Company 2

V.1 MRP — Consume + Produce

Flow: Buy components → Manufacturing Order → Components consumed (out) → Finished product produced (in)
Component stock card (BC-V1-COMP):
OperationRefInOutCostBal. QtyAVCOValue
Receipt 1 @ $10WH/IN/156621$10.001$10.00$10
Receipt 1 @ $20WH/IN/156631$20.002$15.00$30
MO consumptionWH/MO/005632$15.000$15.00$0
Finished product stock card (BC-V1-FG):
OperationRefInCostBal. QtyAVCOValue
MO production 2 unitsWH/MO/005632$15.002$15.00$30
Key point: The component AVCO = ($10 + $20) / 2 = $15.00. The MO consumes 2 units at $15 = $30 total. The finished product enters at the same $30 (cost = $15/unit). Both stock cards reference the same MO (WH/MO/00563).
📊 Stock Card — Component (BC-V1-COMP): receipts + MO consumption
Stock Card - MRP Component
📊 Stock Card — Finished Good (BC-V1-FG): MO production
Stock Card - MRP Finished Good

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.

In this example: We buy 2 units of raw material at $15 each = $30 total. One Manufacturing Order produces 2 finished goods + 2 byproducts. The BOM says: 90% of the cost goes to the finished good, 10% to the byproduct.
Step by step — what happens to the $30:
① Raw material is consumed
The MO takes 2 components out of stock.
Component: Qty 0, Value $0
It was all used up in production.
② Finished good receives 90%
$30 × 90% = $27
Finished: 2 units @ $13.50
This is the main product.
③ Byproduct receives 10%
$30 × 10% = $3
Byproduct: 2 units @ $1.50
Secondary product from the process.
In the stock card: Each product has its own stock card. The component card shows it going to zero (consumed). The finished good and byproduct cards show them entering stock at their proportional cost.
① Component (BC-V2-COMP) — Purchased 2 @ $15, then consumed by MO. Stock ends at zero.
Stock Card - Component
② Finished Good (BC-V2-FG) — Produced by MO. Received $27 (90% of $30). Unit cost = $13.50
Stock Card - Finished Good
③ Byproduct (BC-V2-BYP) — Produced by MO. Received $3 (10% of $30). Unit cost = $1.50
Stock Card - Byproduct

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.

What happened: We bought 2 components (1 @ $10 + 1 @ $20 = AVCO $15). We produced 1 finished good (cost = $15). Then we unbuilt it — the finished good left stock and the component came back.
Finished Good (BC-V3-FG)
OperationRefQtyValue
MO productionWH/MO/00565+1+$15
Unbuild (leaves stock)UB/00124-1-$15
Final: Qty = 0, Value = $0. The product was disassembled.
Component (BC-V3-COMP)
OperationRefQtyValue
Receipt 1 @ $10WH/IN/15665+1+$10
Receipt 1 @ $20WH/IN/15666+1+$20
MO consumptionWH/MO/00565-1-$15
Unbuild (returns to stock)UB/00124+1+$15
Final: Qty = 2, Value = $30. All materials are back in stock.
Key point: Unbuild is the exact reverse of production. The finished good goes from 1 to 0. The component goes from 1 back to 2. Both reference the same unbuild order (UB/00124). The AVCO ($15) stays the same throughout — no value is lost.
📊 Stock Card — Component (BC-V3-COMP): bought, consumed by MO, then returned by unbuild
Stock Card - Unbuild Component
📊 Stock Card — Finished Good (BC-V3-FG): produced by MO, then removed by unbuild
Stock Card - Unbuild Finished Good

I.5 Multicurrency Purchase (USD)

Flow: PO in USD (company uses PEN) → Receipt converts at exchange rate (1 USD = 3.72 PEN) → Stock card shows values in PEN
OperationRefPO PriceRateInCost (PEN)QtyAVCOValue
ReceiptWH/IN/15677$30 USD3.7210S/111.6010S/111.60S/1,116.00
Conversion: 10 units × $30 USD × 3.72 (rate) = S/1,116.00 PEN. AVCO = S/111.60 per unit.
Key point: The PO is created in USD but the stock card always shows values in the company currency (PEN). Odoo converts at the exchange rate on the receipt date. If the vendor bill is posted on a different date with a different exchange rate, Odoo 19 updates the receipt's stock move value in-place with the exchange rate difference — same mechanism as a bill price difference (case I.2). No extra row appears on the stock card.
📊 Stock Card — Receipt converted from USD to PEN
Stock Card - Multicurrency
🛒 Purchase Order — Created in USD ($30 per unit)
Purchase Order in USD
💱 Exchange Rate — 1 USD = 3.72 PEN
Exchange Rate USD/PEN

I.6 Purchase with Tax Included

Flow: Gross price $110 with 10% tax included → Stock keeps only the net $100   |   Result: Taxes do NOT create stock card rows
OperationGrossTaxNet CostQtyAVCOValue
ReceiptS/118.0018% incl.S/100.001S/100.00S/100
Key point: The tax portion ($10) goes to the tax account, not to inventory. The stock card only shows the net inventory cost ($100).
💾 Excel Export — Stock Card downloaded from the system
Stock Card - Tax Included

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.

Scenario: A sale order for 2 units triggers a dropship purchase. Odoo creates a single stock.move from Vendors → Customers (skipping your warehouse entirely).
OperationRefInOutCostBal. QtyAVCOValue
Dropship 2 units Vendors → CustomersDS/0000100$0.000$0.00$0
Why Qty=0 and Value=0? Because the product never touched your inventory. The supplier shipped it straight to the customer — your own stock balance stays exactly the same. The trace row only gives you visibility that the dropship happened.
The orange trace row tells you: "A dropship of 2 units from the vendor to the customer happened on this date." You can click the reference to open the related picking. AVCO, quantity and total value remain untouched.
📊 Stock Card — Dropshipping trace row (orange row = no balance impact)
Stock Card - Dropshipping

III.2 Landed Cost with Backorder

Flow: Partial receipt 4 @ $10 → Landed cost $20 (applied in-place) → Backorder 6 @ $10   |   Result: Final AVCO = $12.00
OperationInCostQtyAVCOValue
Partial receipt 4 (after $20 landed)4$15.004$15.00$60
Backorder 6 @ $106$10.0010$12.00$120
Odoo 18 → Odoo 19 change: In Odoo 18, the landed cost created a separate SVL row (+$5/unit on 4 units). In Odoo 19, the landed cost updates the partial receipt’s 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.
Key point: The landed cost is applied only to the first partial receipt (it existed at the time of freight validation). The backorder arrives later at the original PO price. The stock card shows both receipts with their effective costs.
📊 Stock Card — Landed Cost with backorder (in-place value update on partial receipt)
Stock Card - Landed Cost Backorder

IV.2 Negative Stock

Flow: Sell more than available → Stock goes negative → New receipt resets AVCO
OperationInOutCostQtyAVCOValue
Receipt 10 @ $5010$5010$50.00$500
Oversell 15 units15$50-5$50.00-$250
New receipt 20 @ $5520$5515$55.00$825
Key point: When stock goes negative and new goods arrive, Odoo resets the AVCO to the new receipt cost. The stock card tracks this correctly.
📊 Stock Card — Negative Stock (oversell then restock)
Stock Card - Negative Stock

III.5 Price Fluctuations

Scenario: Market price spikes → AVCO absorbs the impact gradually → Stabilizes after normal purchases resume
MonthOperationRefInOutPriceBal. QtyAVCOValue
JanBuy 200 @ $5WH/IN/15656200$5.00200$5.00$1,000
FebSell 80WH/OUT/0627180$5.00120$5.00$600
MarBuy 100 @ $8 (spike!)WH/IN/15657100$8.00220$6.36$1,400
AprBuy 150 @ $5.50WH/IN/15658150$5.50370$6.01$2,225
Key point: The March price spike ($8 vs normal $5) pushes AVCO up to $6.36. But in April, buying 150 units at $5.50 brings it back down to $6.01. The stock card shows exactly how each purchase affects the running average — useful for spotting price trends and negotiating with suppliers.
📊 Stock Card — Price Fluctuations (AVCO absorbs the spike gradually)
Stock Card - Price Fluctuations

I.4 Vendor Return + Credit Note

Flow: Receipt 10 @ $100 → Bill @ $100 → Return 2 defective units → Credit note for returned goods   |   Result: Qty = 8, AVCO stays $100
OperationRefInOutCostQtyAVCOValue
Receipt 10 @ $100WH/IN/1567410$10010$100.00$1,000
Vendor return (defective)WH/OUT/062762$1008$100.00$800
Key point: The vendor return creates an outgoing valuation entry (stock card row). The credit note is a purely accounting document — it does NOT create a stock card row. This is Odoo 19's standard behavior: credit notes only affect accounting, not stock.avco.report.
Credit note vs bill discount: If the vendor reduces the price (without returning goods), use a vendor bill at a lower price (see case I.3 Vendor Discount). In Odoo 19, the receipt's value is updated in-place to the discounted amount — no extra row appears on the stock card.
📊 Stock Card — Vendor Return + Credit Note
Stock Card - Vendor Return + Credit

III.3 Manual Stock Revaluation

Flow: Open the product form → edit the Cost field to increase the total value → Odoo 19 records a product.value entry automatically   |   Result: AVCO updates, qty unchanged
OperationRefInCostQtyAVCOValue
Receipt 50 @ S/20WH/IN/1565450S/20.0050S/20.00S/1,000
Revaluation: +S/250 (cost S/20 → S/25)Adjustment0+S/5.0050S/25.00S/1,250
How it works in Odoo 19: there is no separate revaluation wizard. When you edit the Cost field on the product form (or on a lot, when lot valuation is enabled), Odoo calls _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.
Key point: This is the standard Odoo 19 way to record year-end adjustments, currency corrections, or accounting revaluations. Quantity stays the same; only the unit cost (and thus total value) is adjusted. The same underlying mechanism powers case III.4.
📊 Stock Card — Manual Revaluation (+S/250 value adjustment)
Stock Card - Manual Revaluation

III.4 Standard Price Change

Flow: Edit the Cost field on the product form while stock exists → Odoo 19 writes a product.value record with the new unit cost   |   Result: AVCO updates to the new price
OperationInCostQtyAVCOValue
Current stock100$10.00100$10.00$1,000
Price update $10 → $120$12.00100$12.00$1,200
How it works in Odoo 19: Writing 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).
Key point: Same mechanism as case III.3. The difference is the user intent — here you are re-pricing the unit cost directly (e.g. after reviewing standard cost), while III.3 frames it as adding a total-value adjustment. Both end up as a product.value entry with qty=0.
📊 Stock Card — Standard Price Change ($10 → $12 with stock on hand)
Stock Card - Standard Price Change
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
Still shown as a separate row: manual cost changes you do yourself directly on a product (administrative revaluation). These continue to appear as a distinct “Adjustment” line on the stock card.
Your numbers are safe. Final AVCO, quantity, and total value are exactly the same as before — only the number of visible rows changed.
460 automated tests verify every case above. Stock card values always match Odoo's AVCO report.
434 Unit Tests — Core validation
  • 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
26 E2E Tests — Full business case validation
  • 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
Each E2E test validates: product.qty_available == kardex.closing_qty AND product.total_value == kardex.closing_total_cost
Performance
1. Detail Report 2. Summary Report

Detail Report — Stock Card

One sheet/page per product with every movement and running AVCO balance.

SPEED DEMO — DETAIL REPORT
How it works
ExcelXlsxWriter writes directly to disk (no RAM buffering). Atomic rename on completion. Ideal for large reports with 1,000+ products.
PDFReportLab generates in memory (BytesIO), then writes to disk. No wkhtmltopdf — 5-10x faster than standard Odoo reports.
DeliveryStreaming via wrap_file() — file goes straight to your browser. Delete-on-read: file removed from disk as download starts.
Benchmarks
VolumeExcelPDF
100 products~2s~3s
500 products~8s~12s
1,000 products~15s~25s
114,932 rows~20s~58s (3,062 pages)
OWL Preview: Instant at any scale — server-side pagination, only visible rows are loaded.

Summary Report — Valuation Overview

All products in one table: opening, in, out, closing balance with Grand Total.

SPEED DEMO — SUMMARY REPORT
How it works
ExcelXlsxWriter generates in memory (BytesIO) with merged headers and Grand Total row, then writes to disk for streaming delivery.
PDFReportLab generates in memory (BytesIO). A4 landscape, formatted for print. No wkhtmltopdf.
DeliverySame streaming engine: wrap_file() + delete-on-read. No database storage, no temp file accumulation.
Benchmarks
VolumeExcelPDF
100 products< 1s< 1s
500 products~2s~2s
1,000 products~3s~3s
3,070 products~3s~8s (70 pages)
OWL Preview: Instant at any scale — server-side pagination, only visible rows are loaded.
Tested with 3,000+ products and 90,000+ movements. Zero cron jobs. Zero background processes. Files auto-expire after 60 minutes + garbage collection for orphans.
Install (5 minutes)
1Download the ZIP from Odoo Apps
2Extract 3 folders into your addons path: qt_stock_card_kardex, qt_m2m_tags_widget, direct_download_base
3Restart Odoo → Apps → Update Apps List → search "Stock Card" → Install
Verify: Inventory → Reports → Stock Card Valuation → select month → Preview. If you see data, it works.
Requirements
RequirementWhere to set itWhy
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
Is it hard to install? How long does it take?
No — it takes under 5 minutes. Download the ZIP, extract 3 folders to your addons path, restart the server, and install from the Apps menu. There's no complex configuration. If your products already use AVCO costing, the module works immediately. See the Installation tab for the complete step-by-step guide.
How fast is report generation? I have a lot of products.
Very fast. The module uses a native PDF engine and an optimized Excel engine — both generate files in memory and deliver them instantly to your browser (no external tools, no database storage). For 100 products, an Excel report takes about 2 seconds. For 500 products, about 8 seconds. The interactive preview loads instantly because it uses server-side pagination. See the Performance tab for detailed benchmarks.
Does it work with my existing data? Do I need to configure anything?
Yes, it works with your existing data immediately. The module reads Odoo's AVCO Report (stock.avco.report) — the same data that Odoo's built-in inventory valuation uses. It doesn't create new tables or require data migration. If you have AVCO products with stock movements, you'll see results the moment you install.
Will it slow down my Odoo instance?
No. The module only runs when you explicitly open the wizard or view a report. It doesn't add background processes, cron jobs, or computed fields on stock moves. When idle, it has zero performance impact on your system.
Does it support multi-company?
Yes. The wizard automatically filters by the current company. Each company sees only its own products and stock movements. Reports include the company name and VAT in the header.
About the Module
What is a Stock Card (Kardex)?
A Stock Card is a detailed record of every inventory movement for a product — dates, quantities, costs, and a running balance after each movement. It's the standard tool accountants and auditors use to verify inventory valuation. In Latin America, it's commonly called "Kardex". Odoo doesn't include this report by default — that's why this module exists.
Why only AVCO? What about FIFO and Standard Cost?
AVCO (Average Cost) calculates a weighted average after each incoming movement. This module replicates that exact calculation row by row. FIFO assigns costs in first-in-first-out order, and Standard Cost uses a fixed price — both follow completely different calculation rules. Each would need a separate implementation. This module focuses on AVCO because it's the most widely used costing method globally.
Can I preview without downloading a file?
Yes! Click Preview in the wizard to open the interactive OWL view directly inside Odoo. You can search, filter, group by category, and click into any product's detail — all without any download. Only when you're ready to share or archive, export as Excel or PDF.
Does it support manufacturing (MRP)?
Yes. When a production order consumes components and produces a finished good, both sides are tracked in their respective stock cards — component consumption as outgoing, finished goods as incoming. The MRP module must be installed. See the Business Cases tab for a concrete example.
What about Landed Costs?
Fully supported. When you add freight, customs, or insurance costs to a receipt, the stock card shows each adjustment as a separate revaluation entry and the AVCO updates accordingly. See the Business Cases tab for a detailed landed costs example with numbers.
What is the "AVCO Reconciliation" feature?
It's an automatic comparison between your inventory valuation (AVCO Report entries — what Odoo says your stock is worth) and your accounting entries on the inventory valuation account (what your books say). If they don't match, the module tells you which products cause the gap, classifies the reason, and lets you drill down to the exact problematic entries. See the Analysis Tools tab for full details.
Does it work with Odoo Online (SaaS)?
No. This module requires custom addons installation, which is only available on:
  • Community (self-hosted) ✔
  • Enterprise on-premises (self-hosted) ✔
  • Odoo.sh (cloud managed) ✔
  • Odoo Online (SaaS) ✘
How many products can it handle?
The module has been tested with 3,000+ products and 90,000+ inventory movements. Server-side pagination and optimized batch queries ensure smooth performance at any scale. 460 automated tests verify that calculations stay accurate regardless of volume.
Is the module translated?
Yes. The source code is in English, and a complete Spanish (es_PE) translation is included. The module uses Odoo's standard i18n system, so it automatically displays in the user's configured language. Adding more languages is straightforward via .po files.
Do you provide updates?
Yes. Bug fixes and improvements are published as updates on Odoo Apps. If you encounter an issue, contact us through the Support tab — we typically respond within 24 hours and publish fixes promptly.

📧 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
📧 Email
Send us an email
📝 When contacting support, please include:
  • 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

  • The author can leave a single reply to each comment.
  • This section is meant to ask simple questions or leave a rating. Every report of a problem experienced while using the module should be addressed to the author directly (refer to the following point).
  • If you want to start a discussion with the author or have a question related to your purchase, please use the support page.
  • Ratings
  • Discuss
There are no ratings yet!
i would like a demo of this module.
by
Nataly Pizarro
on 4/20/26, 12:32 AM



i would like a demo of this module.
by
Nataly Pizarro
on 4/20/26, 12:32 AM



Hello. I would like to get in touch with the vendor please.
by
Nataly Pizarro
on 4/20/26, 12:31 AM


Hello. I would like to get in touch with the vendor please.
by
Wildee
on 4/20/26, 9:39 AM Author

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.


Community
  • Tutorials
  • Documentation
  • Forum
Open Source
  • Download
  • Github
  • Runbot
  • Translations
Services
  • Odoo.sh Hosting
  • Support
  • Upgrade
  • Custom Developments
  • Education
  • Find an Accountant
  • Find a Partner
  • Become a Partner
About us
  • Our company
  • Brand Assets
  • Contact us
  • Jobs
  • Events
  • Podcast
  • Blog
  • Customers
  • Legal • Privacy
  • Security

Odoo is a suite of open source business apps that cover all your company needs: CRM, eCommerce, accounting, inventory, point of sale, project management, etc.

Odoo's unique value proposition is to be at the same time very easy to use and fully integrated.

Website made with