WMS Landed Costs

stock_landed_costs
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYSupply Chain/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Arnold Moyaux, Julien Castiaux, Victor Feyens, William Henrotin, svs-odoo, Tiffany Chang (tic), Gorash, william-andre, David (dafr), John Laterre (jol), Ruben Gomes, Mathieu Walravens, Renaud Thiry, Louis Wicket (wil), Victor Piryns (pivi), clesgow, Djamel Touati, Pieter Claeys (clpi), Dylan Kiss (dyki), Arnaud Sibille, Ethan Vincent, lase@odoo.com, kcv-odoo, Louis Gobert, nihp-odoo, Harsh Shah, Arthur Nanson, Mohammad Abdulmoneim (abdu), djameltouati, Michaël Mattiello, chha-odoo, MaximeNoirhomme, plha-odoo, Krzysztof Magusiak (krma), rare-odoo, Ayush Modi, MohsinAli Masi, saurabh
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
    - purchase_stock
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
account_view_move_form_inherited account.view.move.form.inherited account.move xpath Inherits account.view_move_form
res_config_settings_view_form res.config.settings.view.form.inherit.stock.landed.costs res.config.settings div Inherits stock.res_config_settings_view_form
stock_landed_cost_view_kanban stock.landed.cost.kanban stock.landed.cost kanban New
view_product_landed_cost_form product.template.landed.cost.form product.template group Inherits account.product_template_form_view
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.list stock.landed.cost list New
view_stock_landed_cost_tree2 stock.landed.cost.list stock.landed.cost list New
Models touched (10)

New fields (2)
  • landed_costs_ids One2many → stock.landed.cost
    string='Landed Costs' args: 'stock.landed.cost', 'vendor_bill_id'
  • landed_costs_visible Boolean
    compute='_compute_landed_costs_visible'
Public methods (2)
  • action_view_landed_costs(self)
  • button_create_landed_costs(self)
    Create a `stock.landed.cost` record associated to the account move of `self`, each `stock.landed.costs` lines mirroring the current `account.move.line` of self.

New fields (2)
  • is_landed_costs_line Boolean
  • product_type Selection
    readonly=True related='product_id.type'
Public methods (0)

No public methods.

New fields (2)
  • landed_cost_ok Boolean
    help='Indicates whether the product is a landed cost: when receiving a vendor bill, you can allocate this cost on preceding receipts.' args: 'Is a Landed Cost'
  • split_method_landed_cost Selection
    help='Default Split Method when used for Landed Cost' string='Default Split Method' args: SPLIT_METHOD
Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    args: 'account.journal'
Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    readonly=False related='company_id.lc_journal_id' string='Default Journal' args: 'account.journal'
Public methods (0)

No public methods.

New fields (14)
  • account_journal_id Many2one → account.journal
    default=<expr> required=True args: 'account.journal', 'Account Journal'
  • account_move_id Many2one → account.move
    copy=False index='btree_not_null' readonly=True args: 'account.move', 'Journal Entry'
  • amount_total Monetary
    compute='_compute_total_amount' store=True tracking=True args: 'Total'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • cost_lines One2many → stock.landed.cost.lines
    copy=True args: 'stock.landed.cost.lines', 'cost_id', 'Cost Lines'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • date Date
    copy=False default=fields.Date.context_today required=True tracking=True args: 'Date'
  • description Text
    args: 'Item Description'
  • name Char
    copy=False default=<expr> readonly=True tracking=True args: 'Name'
  • picking_ids Many2many → stock.picking
    copy=False string='Transfers' args: 'stock.picking'
  • state Selection
    copy=False default='draft' readonly=True tracking=True args: [('draft', 'Draft'), ('done', 'Posted'), ('cancel', 'Cancelled')], 'State'
  • target_model Selection
    copy=False default='picking' required=True string='Apply On' args: [('picking', 'Transfers')]
  • valuation_adjustment_lines One2many → stock.valuation.adjustment.lines
    args: 'stock.valuation.adjustment.lines', 'cost_id', 'Valuation Adjustments'
  • vendor_bill_id Many2one → account.move
    copy=False domain=[('move_type', '=', 'in_invoice')] index='btree_not_null' args: 'account.move', 'Vendor Bill'
Public methods (6)
  • button_cancel(self)
  • button_validate(self)
  • compute_landed_cost(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_valuation_lines(self)
  • unlink(self)

New fields (7)
  • account_id Many2one → account.account
    args: 'account.account', 'Account'
  • cost_id Many2one → stock.landed.cost
    index=True ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • currency_id Many2one → res.currency
    related='cost_id.currency_id' args: 'res.currency'
  • name Char
    args: 'Description'
  • price_unit Monetary
    required=True args: 'Cost'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • split_method Selection
    help="Equal: Cost will be equally divided.\nBy Quantity: Cost will be divided according to product's quantity.\nBy Current cost: Cost will be divided according to product's current cost.\nBy Weight: Cost will be divided depending on its weight.\nBy Volume: Cost will be divided depending on its volume." required=True string='Split Method' args: SPLIT_METHOD
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • additional_landed_cost Monetary
    args: 'Additional Landed Cost'
  • cost_id Many2one → stock.landed.cost
    index=True ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • cost_line_id Many2one → stock.landed.cost.lines
    readonly=True args: 'stock.landed.cost.lines', 'Cost Line'
  • currency_id Many2one → res.currency
    related='cost_id.company_id.currency_id' args: 'res.currency'
  • final_cost Monetary
    compute='_compute_final_cost' store=True args: 'New Value'
  • former_cost Monetary
    args: 'Original Value'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Stock Move'
  • name Char
    compute='_compute_name' store=True args: 'Description'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quantity Float
    default=1.0 digits=0 required=True args: 'Quantity'
  • volume Float
    default=1.0 digits='Volume' args: 'Volume'
  • weight Float
    default=1.0 digits='Stock Weight' args: 'Weight'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Christophe Simonis, Xavier Morel, Odoo Online, Arnold Moyaux, William Henrotin, svs-odoo, Tiffany Chang (tic), Gorash, Miquel Raïch, David (dafr), Mathieu Walravens, Vincent Larcin, Habib (ayh), Louis Wicket (wil), Walid, Adrien Widart (awt), Maximilien (malb), Gauthier Wala (gawa), clesgow, Djamel Touati, Pieter Claeys (clpi), Dylan Kiss (dyki), Chong Wang (cwg), Arnaud Sibille, omra-odoo, Ethan Vincent, Maryam Kia, Maxime de Neuville, suth-odoo, kcv-odoo, Louis Gobert, Louis (wil), Quang Nguyen, Arthur Nanson, djameltouati, Corentin Heinix (cohe), plha-odoo, rare-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:55
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
    - purchase_stock
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
account_view_move_form_inherited account.view.move.form.inherited account.move xpath Inherits account.view_move_form
res_config_settings_view_form res.config.settings.view.form.inherit.stock.landed.costs res.config.settings div Inherits stock.res_config_settings_view_form
stock_landed_cost_view_kanban stock.landed.cost.kanban stock.landed.cost kanban New
stock_valuation_layer_form_inherited stock.valuation.layer.form.inherited stock.valuation.layer xpath Inherits stock_account.stock_valuation_layer_form
view_product_landed_cost_form product.template.landed.cost.form product.template group Inherits account.product_template_form_view
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.list stock.landed.cost list New
view_stock_landed_cost_tree2 stock.landed.cost.list stock.landed.cost list New
Models touched (11)

New fields (2)
  • landed_costs_ids One2many → stock.landed.cost
    string='Landed Costs' args: 'stock.landed.cost', 'vendor_bill_id'
  • landed_costs_visible Boolean
    compute='_compute_landed_costs_visible'
Public methods (2)
  • action_view_landed_costs(self)
  • button_create_landed_costs(self)
    Create a `stock.landed.cost` record associated to the account move of `self`, each `stock.landed.costs` lines mirroring the current `account.move.line` of self.

New fields (2)
  • is_landed_costs_line Boolean
  • product_type Selection
    readonly=True related='product_id.type'
Public methods (0)

No public methods.

New fields (2)
  • landed_cost_ok Boolean
    help='Indicates whether the product is a landed cost: when receiving a vendor bill, you can allocate this cost on preceding receipts.' args: 'Is a Landed Cost'
  • split_method_landed_cost Selection
    help='Default Split Method when used for Landed Cost' string='Default Split Method' args: SPLIT_METHOD
Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    args: 'account.journal'
Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    readonly=False related='company_id.lc_journal_id' string='Default Journal' args: 'account.journal'
Public methods (0)

No public methods.

New fields (15)
  • account_journal_id Many2one → account.journal
    default=<expr> required=True args: 'account.journal', 'Account Journal'
  • account_move_id Many2one → account.move
    copy=False index='btree_not_null' readonly=True args: 'account.move', 'Journal Entry'
  • amount_total Monetary
    compute='_compute_total_amount' store=True tracking=True args: 'Total'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • cost_lines One2many → stock.landed.cost.lines
    copy=True args: 'stock.landed.cost.lines', 'cost_id', 'Cost Lines'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • date Date
    copy=False default=fields.Date.context_today required=True tracking=True args: 'Date'
  • description Text
    args: 'Item Description'
  • name Char
    copy=False default=<expr> readonly=True tracking=True args: 'Name'
  • picking_ids Many2many → stock.picking
    copy=False string='Transfers' args: 'stock.picking'
  • state Selection
    copy=False default='draft' readonly=True tracking=True args: [('draft', 'Draft'), ('done', 'Posted'), ('cancel', 'Cancelled')], 'State'
  • stock_valuation_layer_ids One2many → stock.valuation.layer
    args: 'stock.valuation.layer', 'stock_landed_cost_id'
  • target_model Selection
    copy=False default='picking' required=True string='Apply On' args: [('picking', 'Transfers')]
  • valuation_adjustment_lines One2many → stock.valuation.adjustment.lines
    args: 'stock.valuation.adjustment.lines', 'cost_id', 'Valuation Adjustments'
  • vendor_bill_id Many2one → account.move
    copy=False domain=[('move_type', '=', 'in_invoice')] args: 'account.move', 'Vendor Bill'
Public methods (8)
  • action_view_stock_valuation_layers(self)
  • button_cancel(self)
  • button_validate(self)
  • compute_landed_cost(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_valuation_lines(self)
  • reconcile_landed_cost(self)
  • unlink(self)

New fields (7)
  • account_id Many2one → account.account
    domain=[('deprecated', '=', False)] args: 'account.account', 'Account'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • currency_id Many2one → res.currency
    related='cost_id.currency_id' args: 'res.currency'
  • name Char
    args: 'Description'
  • price_unit Monetary
    required=True args: 'Cost'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • split_method Selection
    help="Equal: Cost will be equally divided.\nBy Quantity: Cost will be divided according to product's quantity.\nBy Current cost: Cost will be divided according to product's current cost.\nBy Weight: Cost will be divided depending on its weight.\nBy Volume: Cost will be divided depending on its volume." required=True string='Split Method' args: SPLIT_METHOD
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • additional_landed_cost Monetary
    args: 'Additional Landed Cost'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • cost_line_id Many2one → stock.landed.cost.lines
    readonly=True args: 'stock.landed.cost.lines', 'Cost Line'
  • currency_id Many2one → res.currency
    related='cost_id.company_id.currency_id' args: 'res.currency'
  • final_cost Monetary
    compute='_compute_final_cost' store=True args: 'New Value'
  • former_cost Monetary
    args: 'Original Value'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Stock Move'
  • name Char
    compute='_compute_name' store=True args: 'Description'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quantity Float
    default=1.0 digits=0 required=True args: 'Quantity'
  • volume Float
    default=1.0 digits='Volume' args: 'Volume'
  • weight Float
    default=1.0 digits='Stock Weight' args: 'Weight'
Public methods (0)

No public methods.

New fields (1)
  • stock_landed_cost_id Many2one → stock.landed.cost
    args: 'stock.landed.cost', 'Landed Cost'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Christophe Simonis, Xavier Morel, Odoo Online, Arnold Moyaux, Adrien Dieudonné, William Henrotin, svs-odoo, Ivan Yelizariev, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, william-andre, David (dafr), Mathieu Walravens, Roy Le, niyasraphy, Habib (ayh), Louis Wicket (wil), Walid, Adrien Widart (awt), Djamel Touati, Michael Tietz, Dylan Kiss (dyki), Ethan Vincent, lase@odoo.com, suth-odoo, Louis Gobert, Louis (wil), Quang Nguyen
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:06
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
    - purchase_stock
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
account_view_move_form_inherited account.view.move.form.inherited account.move xpath Inherits account.view_move_form
res_config_settings_view_form res.config.settings.view.form.inherit.stock.landed.costs res.config.settings div Inherits stock.res_config_settings_view_form
stock_landed_cost_view_kanban stock.landed.cost.kanban stock.landed.cost kanban New
stock_valuation_layer_form_inherited stock.valuation.layer.form.inherited stock.valuation.layer xpath Inherits stock_account.stock_valuation_layer_form
view_product_landed_cost_form product.template.landed.cost.form product.template group Inherits account.product_template_form_view
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.tree stock.landed.cost tree New
view_stock_landed_cost_tree2 stock.landed.cost.tree stock.landed.cost tree New
Models touched (10)

New fields (2)
  • landed_costs_ids One2many → stock.landed.cost
    string='Landed Costs' args: 'stock.landed.cost', 'vendor_bill_id'
  • landed_costs_visible Boolean
    compute='_compute_landed_costs_visible'
Public methods (2)
  • action_view_landed_costs(self)
  • button_create_landed_costs(self)
    Create a `stock.landed.cost` record associated to the account move of `self`, each `stock.landed.costs` lines mirroring the current `account.move.line` of self.

New fields (2)
  • is_landed_costs_line Boolean
  • product_type Selection
    readonly=True related='product_id.detailed_type'
Public methods (0)

No public methods.

New fields (2)
  • landed_cost_ok Boolean
    help='Indicates whether the product is a landed cost: when receiving a vendor bill, you can allocate this cost on preceding receipts.' args: 'Is a Landed Cost'
  • split_method_landed_cost Selection
    help='Default Split Method when used for Landed Cost' string='Default Split Method' args: SPLIT_METHOD
Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    args: 'account.journal'
Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    readonly=False related='company_id.lc_journal_id' string='Default Journal' args: 'account.journal'
Public methods (0)

No public methods.

New fields (15)
  • account_journal_id Many2one → account.journal
    default=<expr> required=True args: 'account.journal', 'Account Journal'
  • account_move_id Many2one → account.move
    copy=False index='btree_not_null' readonly=True args: 'account.move', 'Journal Entry'
  • amount_total Monetary
    compute='_compute_total_amount' store=True tracking=True args: 'Total'
  • company_id Many2one → res.company
    related='account_journal_id.company_id' string='Company' args: 'res.company'
  • cost_lines One2many → stock.landed.cost.lines
    copy=True args: 'stock.landed.cost.lines', 'cost_id', 'Cost Lines'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • date Date
    copy=False default=fields.Date.context_today required=True tracking=True args: 'Date'
  • description Text
    args: 'Item Description'
  • name Char
    copy=False default=<expr> readonly=True tracking=True args: 'Name'
  • picking_ids Many2many → stock.picking
    copy=False string='Transfers' args: 'stock.picking'
  • state Selection
    copy=False default='draft' readonly=True tracking=True args: [('draft', 'Draft'), ('done', 'Posted'), ('cancel', 'Cancelled')], 'State'
  • stock_valuation_layer_ids One2many → stock.valuation.layer
    args: 'stock.valuation.layer', 'stock_landed_cost_id'
  • target_model Selection
    copy=False default='picking' required=True string='Apply On' args: [('picking', 'Transfers')]
  • valuation_adjustment_lines One2many → stock.valuation.adjustment.lines
    args: 'stock.valuation.adjustment.lines', 'cost_id', 'Valuation Adjustments'
  • vendor_bill_id Many2one → account.move
    copy=False domain=[('move_type', '=', 'in_invoice')] args: 'account.move', 'Vendor Bill'
Public methods (8)
  • action_view_stock_valuation_layers(self)
  • button_cancel(self)
  • button_validate(self)
  • compute_landed_cost(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_valuation_lines(self)
  • reconcile_landed_cost(self)
  • unlink(self)

New fields (7)
  • account_id Many2one → account.account
    domain=[('deprecated', '=', False)] args: 'account.account', 'Account'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • currency_id Many2one → res.currency
    related='cost_id.currency_id' args: 'res.currency'
  • name Char
    args: 'Description'
  • price_unit Monetary
    required=True args: 'Cost'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • split_method Selection
    help="Equal: Cost will be equally divided.\nBy Quantity: Cost will be divided according to product's quantity.\nBy Current cost: Cost will be divided according to product's current cost.\nBy Weight: Cost will be divided depending on its weight.\nBy Volume: Cost will be divided depending on its volume." required=True string='Split Method' args: SPLIT_METHOD
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (12)
  • additional_landed_cost Monetary
    args: 'Additional Landed Cost'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • cost_line_id Many2one → stock.landed.cost.lines
    readonly=True args: 'stock.landed.cost.lines', 'Cost Line'
  • currency_id Many2one → res.currency
    related='cost_id.company_id.currency_id' args: 'res.currency'
  • final_cost Monetary
    compute='_compute_final_cost' store=True args: 'New Value'
  • former_cost Monetary
    args: 'Original Value'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Stock Move'
  • name Char
    compute='_compute_name' store=True args: 'Description'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quantity Float
    default=1.0 digits=0 required=True args: 'Quantity'
  • volume Float
    default=1.0 digits='Volume' args: 'Volume'
  • weight Float
    default=1.0 digits='Stock Weight' args: 'Weight'
Public methods (0)

No public methods.

New fields (1)
  • stock_landed_cost_id Many2one → stock.landed.cost
    args: 'stock.landed.cost', 'Landed Cost'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Denis Ledoux, Christophe Simonis, Yannick Tivisse, Arnold Moyaux, Romeo Fragomeli, Victor Feyens, Adrien Dieudonné, William Henrotin, Adrien Widart, Tiffany Chang (tic), Rémy Voet (ryv), Nicolas (vin), william-andre, aliya, Mathieu Walravens, Louis Wicket (wil), Walid, Adrien Widart (awt), Michael de Villiers, guva-odoo, Ethan Vincent, lase@odoo.com, suth-odoo, Louis Gobert, Aungkokolin1997, bt-ojossen, Quang Nguyen
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
    - purchase_stock
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
account_view_move_form_inherited account.view.move.form.inherited account.move xpath Inherits account.view_move_form
res_config_settings_view_form res.config.settings.view.form.inherit.stock.landed.costs res.config.settings div Inherits stock.res_config_settings_view_form
stock_landed_cost_view_kanban stock.landed.cost.kanban stock.landed.cost kanban New
stock_valuation_layer_form_inherited stock.valuation.layer.form.inherited stock.valuation.layer xpath Inherits stock_account.stock_valuation_layer_form
view_product_landed_cost_form product.template.landed.cost.form product.template group Inherits account.product_template_form_view
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.tree stock.landed.cost tree New
view_stock_landed_cost_tree2 stock.landed.cost.tree stock.landed.cost tree New
Models touched (10)

New fields (2)
  • landed_costs_ids One2many → stock.landed.cost
    string='Landed Costs' args: 'stock.landed.cost', 'vendor_bill_id'
  • landed_costs_visible Boolean
    compute='_compute_landed_costs_visible'
Public methods (2)
  • action_view_landed_costs(self)
  • button_create_landed_costs(self)
    Create a `stock.landed.cost` record associated to the account move of `self`, each `stock.landed.costs` lines mirroring the current `account.move.line` of self.

New fields (2)
  • is_landed_costs_line Boolean
  • product_type Selection
    readonly=True related='product_id.detailed_type'
Public methods (0)

No public methods.

New fields (2)
  • landed_cost_ok Boolean
    help='Indicates whether the product is a landed cost: when receiving a vendor bill, you can allocate this cost on preceding receipts.' args: 'Is a Landed Cost'
  • split_method_landed_cost Selection
    help='Default Split Method when used for Landed Cost' string='Default Split Method' args: SPLIT_METHOD
Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    args: 'account.journal'
Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    readonly=False related='company_id.lc_journal_id' string='Default Journal' args: 'account.journal'
Public methods (0)

No public methods.

New fields (15)
  • account_journal_id Many2one → account.journal
    default=<expr> required=True states={'done': [('readonly', True)]} args: 'account.journal', 'Account Journal'
  • account_move_id Many2one → account.move
    copy=False index='btree_not_null' readonly=True args: 'account.move', 'Journal Entry'
  • amount_total Monetary
    compute='_compute_total_amount' store=True tracking=True args: 'Total'
  • company_id Many2one → res.company
    related='account_journal_id.company_id' string='Company' args: 'res.company'
  • cost_lines One2many → stock.landed.cost.lines
    copy=True states={'done': [('readonly', True)]} args: 'stock.landed.cost.lines', 'cost_id', 'Cost Lines'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • date Date
    copy=False default=fields.Date.context_today required=True states={'done': [('readonly', True)]} tracking=True args: 'Date'
  • description Text
    states={'done': [('readonly', True)]} args: 'Item Description'
  • name Char
    copy=False default=<expr> readonly=True tracking=True args: 'Name'
  • picking_ids Many2many → stock.picking
    copy=False states={'done': [('readonly', True)]} string='Transfers' args: 'stock.picking'
  • state Selection
    copy=False default='draft' readonly=True tracking=True args: [('draft', 'Draft'), ('done', 'Posted'), ('cancel', 'Cancelled')], 'State'
  • stock_valuation_layer_ids One2many → stock.valuation.layer
    args: 'stock.valuation.layer', 'stock_landed_cost_id'
  • target_model Selection
    copy=False default='picking' required=True states={'done': [('readonly', True)]} string='Apply On' args: [('picking', 'Transfers')]
  • valuation_adjustment_lines One2many → stock.valuation.adjustment.lines
    states={'done': [('readonly', True)]} args: 'stock.valuation.adjustment.lines', 'cost_id', 'Valuation Adjustments'
  • vendor_bill_id Many2one → account.move
    copy=False domain=[('move_type', '=', 'in_invoice')] args: 'account.move', 'Vendor Bill'
Public methods (8)
  • action_view_stock_valuation_layers(self)
  • button_cancel(self)
  • button_validate(self)
  • compute_landed_cost(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_valuation_lines(self)
  • reconcile_landed_cost(self)
  • unlink(self)

New fields (7)
  • account_id Many2one → account.account
    domain=[('deprecated', '=', False)] args: 'account.account', 'Account'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • currency_id Many2one → res.currency
    related='cost_id.currency_id' args: 'res.currency'
  • name Char
    args: 'Description'
  • price_unit Monetary
    required=True args: 'Cost'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • split_method Selection
    help="Equal : Cost will be equally divided.\nBy Quantity : Cost will be divided according to product's quantity.\nBy Current cost : Cost will be divided according to product's current cost.\nBy Weight : Cost will be divided depending on its weight.\nBy Volume : Cost will be divided depending on its volume." required=True string='Split Method' args: SPLIT_METHOD
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (12)
  • additional_landed_cost Monetary
    args: 'Additional Landed Cost'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • cost_line_id Many2one → stock.landed.cost.lines
    readonly=True args: 'stock.landed.cost.lines', 'Cost Line'
  • currency_id Many2one → res.currency
    related='cost_id.company_id.currency_id' args: 'res.currency'
  • final_cost Monetary
    compute='_compute_final_cost' store=True args: 'New Value'
  • former_cost Monetary
    args: 'Original Value'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Stock Move'
  • name Char
    compute='_compute_name' store=True args: 'Description'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quantity Float
    default=1.0 digits=0 required=True args: 'Quantity'
  • volume Float
    default=1.0 digits='Volume' args: 'Volume'
  • weight Float
    default=1.0 digits='Stock Weight' args: 'Weight'
Public methods (0)

No public methods.

New fields (1)
  • stock_landed_cost_id Many2one → stock.landed.cost
    args: 'stock.landed.cost', 'Landed Cost'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Christophe Simonis, Nicolas Martinelli, Dharmraj Jhala, Arnold Moyaux, wan, Xavier-Do, Andrea Grazioso (agr-odoo), William Henrotin, Adrien Widart, Nathan Marotte (nama), Rémy Voet (ryv), fja-odoo, Djamel (otd), Kevin Baptiste, william-andre, Walid HANNICHE (waha), Michael Mattiello (mcm), Walid, Adrien Widart (awt), Michael de Villiers, guva-odoo, suth-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:27
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
    - purchase_stock
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
account_view_move_form_inherited account.view.move.form.inherited account.move xpath Inherits account.view_move_form
res_config_settings_view_form res.config.settings.view.form.inherit.stock.landed.costs res.config.settings div Inherits stock.res_config_settings_view_form
stock_landed_cost_view_kanban stock.landed.cost.kanban stock.landed.cost kanban New
stock_valuation_layer_form_inherited stock.valuation.layer.form.inherited stock.valuation.layer xpath Inherits stock_account.stock_valuation_layer_form
view_product_landed_cost_form product.template.landed.cost.form product.template group Inherits account.product_template_form_view
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.tree stock.landed.cost tree New
view_stock_landed_cost_tree2 stock.landed.cost.tree stock.landed.cost tree New
Models touched (10)

New fields (2)
  • landed_costs_ids One2many → stock.landed.cost
    string='Landed Costs' args: 'stock.landed.cost', 'vendor_bill_id'
  • landed_costs_visible Boolean
    compute='_compute_landed_costs_visible'
Public methods (2)
  • action_view_landed_costs(self)
  • button_create_landed_costs(self)
    Create a `stock.landed.cost` record associated to the account move of `self`, each `stock.landed.costs` lines mirroring the current `account.move.line` of self.

New fields (2)
  • is_landed_costs_line Boolean
  • product_type Selection
    readonly=True related='product_id.detailed_type'
Public methods (0)

No public methods.

New fields (2)
  • landed_cost_ok Boolean
    help='Indicates whether the product is a landed cost.' args: 'Is a Landed Cost'
  • split_method_landed_cost Selection
    help='Default Split Method when used for Landed Cost' string='Default Split Method' args: SPLIT_METHOD
Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    args: 'account.journal'
Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    readonly=False related='company_id.lc_journal_id' string='Default Journal' args: 'account.journal'
Public methods (0)

No public methods.

New fields (15)
  • account_journal_id Many2one → account.journal
    default=<expr> required=True states={'done': [('readonly', True)]} args: 'account.journal', 'Account Journal'
  • account_move_id Many2one → account.move
    copy=False readonly=True args: 'account.move', 'Journal Entry'
  • amount_total Monetary
    compute='_compute_total_amount' store=True tracking=True args: 'Total'
  • company_id Many2one → res.company
    related='account_journal_id.company_id' string='Company' args: 'res.company'
  • cost_lines One2many → stock.landed.cost.lines
    copy=True states={'done': [('readonly', True)]} args: 'stock.landed.cost.lines', 'cost_id', 'Cost Lines'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • date Date
    copy=False default=fields.Date.context_today required=True states={'done': [('readonly', True)]} tracking=True args: 'Date'
  • description Text
    states={'done': [('readonly', True)]} args: 'Item Description'
  • name Char
    copy=False default=<expr> readonly=True tracking=True args: 'Name'
  • picking_ids Many2many → stock.picking
    copy=False states={'done': [('readonly', True)]} string='Transfers' args: 'stock.picking'
  • state Selection
    copy=False default='draft' readonly=True tracking=True args: [('draft', 'Draft'), ('done', 'Posted'), ('cancel', 'Cancelled')], 'State'
  • stock_valuation_layer_ids One2many → stock.valuation.layer
    args: 'stock.valuation.layer', 'stock_landed_cost_id'
  • target_model Selection
    copy=False default='picking' required=True states={'done': [('readonly', True)]} string='Apply On' args: [('picking', 'Transfers')]
  • valuation_adjustment_lines One2many → stock.valuation.adjustment.lines
    states={'done': [('readonly', True)]} args: 'stock.valuation.adjustment.lines', 'cost_id', 'Valuation Adjustments'
  • vendor_bill_id Many2one → account.move
    copy=False domain=[('move_type', '=', 'in_invoice')] args: 'account.move', 'Vendor Bill'
Public methods (8)
  • action_view_stock_valuation_layers(self)
  • button_cancel(self)
  • button_validate(self)
  • compute_landed_cost(self)
  • create(self, vals)
    @api.model
  • get_valuation_lines(self)
  • reconcile_landed_cost(self)
  • unlink(self)

New fields (7)
  • account_id Many2one → account.account
    domain=[('deprecated', '=', False)] args: 'account.account', 'Account'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • currency_id Many2one → res.currency
    related='cost_id.currency_id' args: 'res.currency'
  • name Char
    args: 'Description'
  • price_unit Monetary
    required=True args: 'Cost'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • split_method Selection
    help="Equal : Cost will be equally divided.\nBy Quantity : Cost will be divided according to product's quantity.\nBy Current cost : Cost will be divided according to product's current cost.\nBy Weight : Cost will be divided depending on its weight.\nBy Volume : Cost will be divided depending on its volume." required=True string='Split Method' args: SPLIT_METHOD
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (12)
  • additional_landed_cost Monetary
    args: 'Additional Landed Cost'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • cost_line_id Many2one → stock.landed.cost.lines
    readonly=True args: 'stock.landed.cost.lines', 'Cost Line'
  • currency_id Many2one → res.currency
    related='cost_id.company_id.currency_id' args: 'res.currency'
  • final_cost Monetary
    compute='_compute_final_cost' store=True args: 'New Value'
  • former_cost Monetary
    args: 'Original Value'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Stock Move'
  • name Char
    compute='_compute_name' store=True args: 'Description'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quantity Float
    default=1.0 digits=0 required=True args: 'Quantity'
  • volume Float
    default=1.0 digits='Volume' args: 'Volume'
  • weight Float
    default=1.0 digits='Stock Weight' args: 'Weight'
Public methods (0)

No public methods.

New fields (1)
  • stock_landed_cost_id Many2one → stock.landed.cost
    args: 'stock.landed.cost', 'Landed Cost'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Yannick Tivisse, Laurent Smet, Arnold Moyaux, wan, Xavier-Do, Victor Feyens, Andrea Grazioso (agr-odoo), William Henrotin, Sébastien Theys, fw-bot, Debauche Stéphane, Alvaro Fuentes, Adrien Widart, Nathan Marotte (nama), Rémy Voet (ryv), fja-odoo, Djamel (otd), Kevin Baptiste, Pratima Gupta, Jigar Vaghela, yhu-odoo, william, Walid HANNICHE (waha), niyasraphy, Louis Wicket (wil), Adrien Widart (awt), Michael de Villiers
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:28
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
    - purchase_stock
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
account_view_move_form_inherited account.view.move.form.inherited account.move xpath Inherits account.view_move_form
res_config_settings_view_form res.config.settings.view.form.inherit.stock.landed.costs res.config.settings div Inherits stock.res_config_settings_view_form
stock_landed_cost_view_kanban stock.landed.cost.kanban stock.landed.cost kanban New
stock_valuation_layer_form_inherited stock.valuation.layer.form.inherited stock.valuation.layer xpath Inherits stock_account.stock_valuation_layer_form
view_product_landed_cost_form product.template.landed.cost.form product.template group Inherits account.product_template_form_view
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.tree stock.landed.cost tree New
view_stock_landed_cost_tree2 stock.landed.cost.tree stock.landed.cost tree New
Models touched (10)

New fields (2)
  • landed_costs_ids One2many → stock.landed.cost
    string='Landed Costs' args: 'stock.landed.cost', 'vendor_bill_id'
  • landed_costs_visible Boolean
    compute='_compute_landed_costs_visible'
Public methods (2)
  • action_view_landed_costs(self)
  • button_create_landed_costs(self)
    Create a `stock.landed.cost` record associated to the account move of `self`, each `stock.landed.costs` lines mirroring the current `account.move.line` of self.

New fields (2)
  • is_landed_costs_line Boolean
  • product_type Selection
    readonly=True related='product_id.type'
Public methods (0)

No public methods.

New fields (2)
  • landed_cost_ok Boolean
    help='Indicates whether the product is a landed cost.' args: 'Is a Landed Cost'
  • split_method_landed_cost Selection
    help='Default Split Method when used for Landed Cost' string='Default Split Method' args: SPLIT_METHOD
Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    args: 'account.journal'
Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    readonly=False related='company_id.lc_journal_id' string='Default Journal' args: 'account.journal'
Public methods (0)

No public methods.

New fields (16)
  • account_journal_id Many2one → account.journal
    default=<expr> required=True states={'done': [('readonly', True)]} args: 'account.journal', 'Account Journal'
  • account_move_id Many2one → account.move
    copy=False readonly=True args: 'account.move', 'Journal Entry'
  • allowed_picking_ids Many2many → stock.picking
    compute='_compute_allowed_picking_ids' args: 'stock.picking'
  • amount_total Monetary
    compute='_compute_total_amount' store=True tracking=True args: 'Total'
  • company_id Many2one → res.company
    related='account_journal_id.company_id' string='Company' args: 'res.company'
  • cost_lines One2many → stock.landed.cost.lines
    copy=True states={'done': [('readonly', True)]} args: 'stock.landed.cost.lines', 'cost_id', 'Cost Lines'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • date Date
    copy=False default=fields.Date.context_today required=True states={'done': [('readonly', True)]} tracking=True args: 'Date'
  • description Text
    states={'done': [('readonly', True)]} args: 'Item Description'
  • name Char
    copy=False default=<expr> readonly=True tracking=True args: 'Name'
  • picking_ids Many2many → stock.picking
    copy=False states={'done': [('readonly', True)]} string='Transfers' args: 'stock.picking'
  • state Selection
    copy=False default='draft' readonly=True tracking=True args: [('draft', 'Draft'), ('done', 'Posted'), ('cancel', 'Cancelled')], 'State'
  • stock_valuation_layer_ids One2many → stock.valuation.layer
    args: 'stock.valuation.layer', 'stock_landed_cost_id'
  • target_model Selection
    copy=False default='picking' required=True states={'done': [('readonly', True)]} string='Apply On' args: [('picking', 'Transfers')]
  • valuation_adjustment_lines One2many → stock.valuation.adjustment.lines
    states={'done': [('readonly', True)]} args: 'stock.valuation.adjustment.lines', 'cost_id', 'Valuation Adjustments'
  • vendor_bill_id Many2one → account.move
    copy=False domain=[('move_type', '=', 'in_invoice')] args: 'account.move', 'Vendor Bill'
Public methods (7)
  • action_view_stock_valuation_layers(self)
  • button_cancel(self)
  • button_validate(self)
  • compute_landed_cost(self)
  • create(self, vals)
    @api.model
  • get_valuation_lines(self)
  • unlink(self)

New fields (7)
  • account_id Many2one → account.account
    domain=[('deprecated', '=', False)] args: 'account.account', 'Account'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • currency_id Many2one → res.currency
    related='cost_id.currency_id' args: 'res.currency'
  • name Char
    args: 'Description'
  • price_unit Monetary
    required=True args: 'Cost'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • split_method Selection
    help="Equal : Cost will be equally divided.\nBy Quantity : Cost will be divided according to product's quantity.\nBy Current cost : Cost will be divided according to product's current cost.\nBy Weight : Cost will be divided depending on its weight.\nBy Volume : Cost will be divided depending on its volume." required=True string='Split Method' args: SPLIT_METHOD
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (12)
  • additional_landed_cost Monetary
    args: 'Additional Landed Cost'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • cost_line_id Many2one → stock.landed.cost.lines
    readonly=True args: 'stock.landed.cost.lines', 'Cost Line'
  • currency_id Many2one → res.currency
    related='cost_id.company_id.currency_id' args: 'res.currency'
  • final_cost Monetary
    compute='_compute_final_cost' store=True args: 'New Value'
  • former_cost Monetary
    args: 'Original Value'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Stock Move'
  • name Char
    compute='_compute_name' store=True args: 'Description'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quantity Float
    default=1.0 digits=0 required=True args: 'Quantity'
  • volume Float
    default=1.0 digits='Volume' args: 'Volume'
  • weight Float
    default=1.0 digits='Stock Weight' args: 'Weight'
Public methods (0)

No public methods.

New fields (1)
  • stock_landed_cost_id Many2one → stock.landed.cost
    args: 'stock.landed.cost', 'Landed Cost'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYOperations/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Simon Lejeune, Nicolas Martinelli, qdp-odoo, Pedro M. Baeza, Damien Bouvy, Yannick Tivisse, Martin Geubelle, Odoo Online, Jorge Pinna Puissant, Alexandre Kühn, Arnold Moyaux, Adrian Torres, wan, XavierDo, Xavier-Do, Andrea Grazioso (agr-odoo), William Henrotin, Sébastien Theys, Alvaro Fuentes, Ivan Yelizariev, Rémy Voet (ryv), fja-odoo, Djamel (otd), Pratima Gupta
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - account
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - purchase_stock
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
account_view_move_form_inherited account.view.move.form.inherited account.move xpath Inherits account.view_move_form
res_config_settings_view_form res.config.settings.view.form.inherit.stock.landed.costs res.config.settings div Inherits stock.res_config_settings_view_form
stock_landed_cost_view_kanban stock.landed.cost.kanban stock.landed.cost kanban New
stock_valuation_layer_form_inherited stock.valuation.layer.form.inherited stock.valuation.layer xpath Inherits stock_account.stock_valuation_layer_form
view_product_landed_cost_form product.template.landed.cost.form product.template group Inherits account.product_template_form_view
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.tree stock.landed.cost tree New
view_stock_landed_cost_tree2 stock.landed.cost.tree stock.landed.cost tree New
Models touched (10)

New fields (2)
  • landed_costs_ids One2many → stock.landed.cost
    string='Landed Costs' args: 'stock.landed.cost', 'vendor_bill_id'
  • landed_costs_visible Boolean
    compute='_compute_landed_costs_visible'
Public methods (2)
  • action_view_landed_costs(self)
  • button_create_landed_costs(self)
    Create a `stock.landed.cost` record associated to the account move of `self`, each `stock.landed.costs` lines mirroring the current `account.move.line` of self.

New fields (2)
  • is_landed_costs_line Boolean
  • product_type Selection
    readonly=True related='product_id.type'
Public methods (0)

No public methods.

New fields (1)
  • landed_cost_ok Boolean
    help='Indicates whether the product is a landed cost.' args: 'Is a Landed Cost'
Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    args: 'account.journal'
Public methods (0)

No public methods.

New fields (1)
  • lc_journal_id Many2one → account.journal
    readonly=False related='company_id.lc_journal_id' string='Default Journal' args: 'account.journal'
Public methods (0)

No public methods.

New fields (15)
  • account_journal_id Many2one → account.journal
    default=<expr> required=True states={'done': [('readonly', True)]} args: 'account.journal', 'Account Journal'
  • account_move_id Many2one → account.move
    copy=False readonly=True args: 'account.move', 'Journal Entry'
  • allowed_picking_ids Many2many → stock.picking
    compute='_compute_allowed_picking_ids' args: 'stock.picking'
  • amount_total Float
    compute='_compute_total_amount' digits=0 store=True tracking=True args: 'Total'
  • company_id Many2one → res.company
    related='account_journal_id.company_id' string='Company' args: 'res.company'
  • cost_lines One2many → stock.landed.cost.lines
    copy=True states={'done': [('readonly', True)]} args: 'stock.landed.cost.lines', 'cost_id', 'Cost Lines'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • date Date
    copy=False default=fields.Date.context_today required=True states={'done': [('readonly', True)]} tracking=True args: 'Date'
  • description Text
    states={'done': [('readonly', True)]} args: 'Item Description'
  • name Char
    copy=False default=<expr> readonly=True tracking=True args: 'Name'
  • picking_ids Many2many → stock.picking
    copy=False states={'done': [('readonly', True)]} string='Transfers' args: 'stock.picking'
  • state Selection
    copy=False default='draft' readonly=True tracking=True args: [('draft', 'Draft'), ('done', 'Posted'), ('cancel', 'Cancelled')], 'State'
  • stock_valuation_layer_ids One2many → stock.valuation.layer
    args: 'stock.valuation.layer', 'stock_landed_cost_id'
  • valuation_adjustment_lines One2many → stock.valuation.adjustment.lines
    states={'done': [('readonly', True)]} args: 'stock.valuation.adjustment.lines', 'cost_id', 'Valuation Adjustments'
  • vendor_bill_id Many2one → account.move
    copy=False domain=[('type', '=', 'in_invoice')] args: 'account.move', 'Vendor Bill'
Public methods (7)
  • action_view_stock_valuation_layers(self)
  • button_cancel(self)
  • button_validate(self)
  • compute_landed_cost(self)
  • create(self, vals)
    @api.model
  • get_valuation_lines(self)
  • unlink(self)

New fields (6)
  • account_id Many2one → account.account
    domain=[('deprecated', '=', False)] args: 'account.account', 'Account'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • name Char
    args: 'Description'
  • price_unit Float
    digits='Product Price' required=True args: 'Cost'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • split_method Selection
    required=True string='Split Method' args: SPLIT_METHOD
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (12)
  • additional_landed_cost Float
    digits='Product Price' args: 'Additional Landed Cost'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • cost_line_id Many2one → stock.landed.cost.lines
    readonly=True args: 'stock.landed.cost.lines', 'Cost Line'
  • currency_id Many2one → res.currency
    related='cost_id.company_id.currency_id' args: 'res.currency'
  • final_cost Float
    compute='_compute_final_cost' digits=0 store=True args: 'New Value'
  • former_cost Float
    digits='Product Price' args: 'Original Value'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Stock Move'
  • name Char
    compute='_compute_name' store=True args: 'Description'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quantity Float
    default=1.0 digits=0 required=True args: 'Quantity'
  • volume Float
    default=1.0 digits='Volume' args: 'Volume'
  • weight Float
    default=1.0 digits='Stock Weight' args: 'Weight'
Public methods (0)

No public methods.

New fields (1)
  • stock_landed_cost_id Many2one → stock.landed.cost
    args: 'stock.landed.cost', 'Landed Cost'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Christophe Simonis, Nicolas Martinelli, Nicolas Lempereur, qdp-odoo, Géry Debongnie, GitHub, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Pierre Masereel, jem-odoo, Christophe Monniez, Nans Lefebvre, Adrian Torres, XavierDo, Xavier-Do
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - account
    - analytic
    - portal
    - http_routing
    - digest
    - purchase_stock
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
res_config_settings_view_form res.config.settings.view.form.inherit.stock.landed.costs res.config.settings div Inherits stock.res_config_settings_view_form
stock_landed_cost_tree_view product.product.tree product.product tree New
stock_landed_cost_view_kanban stock.landed.cost.kanban stock.landed.cost kanban New
view_product_landed_cost_form product.template.landed.cost.form product.template xpath Inherits purchase.view_product_supplier_inherit
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.tree stock.landed.cost tree New
view_stock_landed_cost_type_form stock.landed.cost.type.form product.product form New
Models touched (5)

New fields (2)
  • landed_cost_ok Boolean
    help='Indicates whether the product is a landed cost.' args: 'Is a Landed Cost'
  • split_method Selection
    default='equal' help="Equal : Cost will be equally divided.\nBy Quantity : Cost will be divided according to product's quantity.\nBy Current cost : Cost will be divided according to product's current cost.\nBy Weight : Cost will be divided depending on its weight.\nBy Volume : Cost will be divided depending on its volume." selection=SPLIT_METHOD string='Split Method'
Public methods (0)

No public methods.

New fields (11)
  • account_journal_id Many2one → account.journal
    required=True states={'done': [('readonly', True)]} args: 'account.journal', 'Account Journal'
  • account_move_id Many2one → account.move
    copy=False readonly=True args: 'account.move', 'Journal Entry'
  • amount_total Float
    compute='_compute_total_amount' digits=0 store=True track_visibility='always' args: 'Total'
  • company_id Many2one → res.company
    readonly=False related='account_journal_id.company_id' string='Company' args: 'res.company'
  • cost_lines One2many → stock.landed.cost.lines
    copy=True states={'done': [('readonly', True)]} args: 'stock.landed.cost.lines', 'cost_id', 'Cost Lines'
  • date Date
    copy=False default=fields.Date.context_today required=True states={'done': [('readonly', True)]} track_visibility='onchange' args: 'Date'
  • description Text
    states={'done': [('readonly', True)]} args: 'Item Description'
  • name Char
    copy=False default=<expr> readonly=True track_visibility='always' args: 'Name'
  • picking_ids Many2many → stock.picking
    copy=False states={'done': [('readonly', True)]} string='Transfers' args: 'stock.picking'
  • state Selection
    copy=False default='draft' readonly=True track_visibility='onchange' args: [('draft', 'Draft'), ('done', 'Posted'), ('cancel', 'Cancelled')], 'State'
  • valuation_adjustment_lines One2many → stock.valuation.adjustment.lines
    states={'done': [('readonly', True)]} args: 'stock.valuation.adjustment.lines', 'cost_id', 'Valuation Adjustments'
Public methods (6)
  • button_cancel(self)
    @api.multi
  • button_validate(self)
    @api.multi
  • compute_landed_cost(self)
    @api.multi
  • create(self, vals)
    @api.model
  • get_valuation_lines(self)
  • unlink(self)
    @api.multi

New fields (6)
  • account_id Many2one → account.account
    domain=[('deprecated', '=', False)] args: 'account.account', 'Account'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • name Char
    args: 'Description'
  • price_unit Float
    digits=dp.get_precision('Product Price') required=True args: 'Cost'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • split_method Selection
    required=True string='Split Method' args: product.SPLIT_METHOD
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (1)
  • landed_cost_value Float
    args: 'Landed Cost'
Public methods (0)

No public methods.

New fields (12)
  • additional_landed_cost Float
    digits=dp.get_precision('Product Price') args: 'Additional Landed Cost'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • cost_line_id Many2one → stock.landed.cost.lines
    readonly=True args: 'stock.landed.cost.lines', 'Cost Line'
  • final_cost Float
    compute='_compute_final_cost' digits=0 store=True args: 'Final Cost'
  • former_cost Float
    digits=dp.get_precision('Product Price') args: 'Former Cost'
  • former_cost_per_unit Float
    compute='_compute_former_cost_per_unit' digits=0 store=True args: 'Former Cost(Per Unit)'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Stock Move'
  • name Char
    compute='_compute_name' store=True args: 'Description'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quantity Float
    default=1.0 digits=0 required=True args: 'Quantity'
  • volume Float
    default=1.0 args: 'Volume'
  • weight Float
    default=1.0 digits=dp.get_precision('Stock Weight') args: 'Weight'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Olivier Dony, Josse Colpaert, Christophe Simonis, Joren Van Onder, Goffin Simon, Simon Lejeune, Nicolas Martinelli, GitHub, Yannick Tivisse, Odoo Online
WEBSITE
WEBSITEhttps://www.odoo.com/page/warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - barcodes
    - web_planner
    - account
    - analytic
    - portal
    - http_routing
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
res_config_settings_view_form res.config.settings.view.form.inherit.stock.landed.costs res.config.settings div Inherits stock.res_config_settings_view_form
stock_landed_cost_tree_view product.product.tree product.product tree New
view_product_landed_cost_form product.template.landed.cost.form product.template group Inherits purchase.view_product_supplier_inherit
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.tree stock.landed.cost tree New
view_stock_landed_cost_type_form stock.landed.cost.type.form product.product form New
Models touched (5)

New fields (2)
  • landed_cost_ok Boolean
    args: 'Is a Landed Cost'
  • split_method Selection
    default='equal' help="Equal : Cost will be equally divided.\nBy Quantity : Cost will be divided according to product's quantity.\nBy Current cost : Cost will be divided according to product's current cost.\nBy Weight : Cost will be divided depending on its weight.\nBy Volume : Cost will be divided depending on its volume." selection=SPLIT_METHOD string='Split Method'
Public methods (0)

No public methods.

New fields (11)
  • account_journal_id Many2one → account.journal
    required=True states={'done': [('readonly', True)]} args: 'account.journal', 'Account Journal'
  • account_move_id Many2one → account.move
    copy=False readonly=True args: 'account.move', 'Journal Entry'
  • amount_total Float
    compute='_compute_total_amount' digits=0 store=True track_visibility='always' args: 'Total'
  • company_id Many2one → res.company
    related='account_journal_id.company_id' string='Company' args: 'res.company'
  • cost_lines One2many → stock.landed.cost.lines
    copy=True states={'done': [('readonly', True)]} args: 'stock.landed.cost.lines', 'cost_id', 'Cost Lines'
  • date Date
    copy=False default=fields.Date.context_today required=True states={'done': [('readonly', True)]} track_visibility='onchange' args: 'Date'
  • description Text
    states={'done': [('readonly', True)]} args: 'Item Description'
  • name Char
    copy=False default=<expr> readonly=True track_visibility='always' args: 'Name'
  • picking_ids Many2many → stock.picking
    copy=False states={'done': [('readonly', True)]} string='Pickings' args: 'stock.picking'
  • state Selection
    copy=False default='draft' readonly=True track_visibility='onchange' args: [('draft', 'Draft'), ('done', 'Posted'), ('cancel', 'Cancelled')], 'State'
  • valuation_adjustment_lines One2many → stock.valuation.adjustment.lines
    states={'done': [('readonly', True)]} args: 'stock.valuation.adjustment.lines', 'cost_id', 'Valuation Adjustments'
Public methods (6)
  • button_cancel(self)
    @api.multi
  • button_validate(self)
    @api.multi
  • compute_landed_cost(self)
    @api.multi
  • create(self, vals)
    @api.model
  • get_valuation_lines(self)
  • unlink(self)
    @api.multi

New fields (6)
  • account_id Many2one → account.account
    domain=[('deprecated', '=', False)] args: 'account.account', 'Account'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • name Char
    args: 'Description'
  • price_unit Float
    digits=dp.get_precision('Product Price') required=True args: 'Cost'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • split_method Selection
    required=True string='Split Method' args: product.SPLIT_METHOD
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (1)
  • landed_cost_value Float
    args: 'Landed Cost'
Public methods (0)

No public methods.

New fields (12)
  • additional_landed_cost Float
    digits=dp.get_precision('Product Price') args: 'Additional Landed Cost'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • cost_line_id Many2one → stock.landed.cost.lines
    readonly=True args: 'stock.landed.cost.lines', 'Cost Line'
  • final_cost Float
    compute='_compute_final_cost' digits=0 store=True args: 'Final Cost'
  • former_cost Float
    digits=dp.get_precision('Product Price') args: 'Former Cost'
  • former_cost_per_unit Float
    compute='_compute_former_cost_per_unit' digits=0 store=True args: 'Former Cost(Per Unit)'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Stock Move'
  • name Char
    compute='_compute_name' store=True args: 'Description'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quantity Float
    default=1.0 digits=0 required=True args: 'Quantity'
  • volume Float
    default=1.0 args: 'Volume'
  • weight Float
    default=1.0 digits=dp.get_precision('Stock Weight') args: 'Weight'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, David Monjoie, Nicolas Martinelli, Julien Legros, Richard Mathot, qdp-odoo, Lucas Perais (lpe), Yannick Tivisse
WEBSITE
WEBSITEhttps://www.odoo.com/page/warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:47
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
    - report
    - procurement
    - barcodes
    - web_planner
    - account
    - analytic
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
stock_landed_cost_tree_view product.product.tree product.product tree New
view_product_landed_cost_form product.template.landed.cost.form product.template group Inherits product.product_template_form_view
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.tree stock.landed.cost tree New
view_stock_landed_cost_type_form stock.landed.cost.type.form product.product form New
Models touched (5)

New fields (2)
  • landed_cost_ok Boolean
    args: 'Landed Costs'
  • split_method Selection
    default='equal' help="Equal : Cost will be equally divided.\nBy Quantity : Cost will be divided according to product's quantity.\nBy Current cost : Cost will be divided according to product's current cost.\nBy Weight : Cost will be divided depending on its weight.\nBy Volume : Cost will be divided depending on its volume." selection=SPLIT_METHOD string='Split Method'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • onchange_costing_method(self)
    @api.onchange('group_costing_method')

New fields (10)
  • account_journal_id Many2one → account.journal
    required=True states={'done': [('readonly', True)]} args: 'account.journal', 'Account Journal'
  • account_move_id Many2one → account.move
    copy=False readonly=True args: 'account.move', 'Journal Entry'
  • amount_total Float
    compute='_compute_total_amount' digits=0 store=True track_visibility='always' args: 'Total'
  • cost_lines One2many → stock.landed.cost.lines
    copy=True states={'done': [('readonly', True)]} args: 'stock.landed.cost.lines', 'cost_id', 'Cost Lines'
  • date Date
    copy=False default=fields.Date.context_today required=True states={'done': [('readonly', True)]} track_visibility='onchange' args: 'Date'
  • description Text
    states={'done': [('readonly', True)]} args: 'Item Description'
  • name Char
    copy=False default=<expr> readonly=True track_visibility='always' args: 'Name'
  • picking_ids Many2many → stock.picking
    copy=False states={'done': [('readonly', True)]} string='Pickings' args: 'stock.picking'
  • state Selection
    copy=False default='draft' readonly=True track_visibility='onchange' args: [('draft', 'Draft'), ('done', 'Posted'), ('cancel', 'Cancelled')], 'State'
  • valuation_adjustment_lines One2many → stock.valuation.adjustment.lines
    states={'done': [('readonly', True)]} args: 'stock.valuation.adjustment.lines', 'cost_id', 'Valuation Adjustments'
Public methods (6)
  • button_cancel(self)
    @api.multi
  • button_validate(self)
    @api.multi
  • compute_landed_cost(self)
    @api.multi
  • create(self, vals)
    @api.model
  • get_valuation_lines(self)
  • unlink(self)
    @api.multi

New fields (6)
  • account_id Many2one → account.account
    domain=[('deprecated', '=', False)] args: 'account.account', 'Account'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • name Char
    args: 'Description'
  • price_unit Float
    digits=dp.get_precision('Product Price') required=True args: 'Cost'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • split_method Selection
    required=True string='Split Method' args: product.SPLIT_METHOD
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('product_id')

New fields (12)
  • additional_landed_cost Float
    digits=dp.get_precision('Product Price') args: 'Additional Landed Cost'
  • cost_id Many2one → stock.landed.cost
    ondelete='cascade' required=True args: 'stock.landed.cost', 'Landed Cost'
  • cost_line_id Many2one → stock.landed.cost.lines
    readonly=True args: 'stock.landed.cost.lines', 'Cost Line'
  • final_cost Float
    compute='_compute_final_cost' digits=0 store=True args: 'Final Cost'
  • former_cost Float
    digits=dp.get_precision('Product Price') args: 'Former Cost'
  • former_cost_per_unit Float
    compute='_compute_former_cost_per_unit' digits=0 store=True args: 'Former Cost(Per Unit)'
  • move_id Many2one → stock.move
    readonly=True args: 'stock.move', 'Stock Move'
  • name Char
    compute='_compute_name' store=True args: 'Description'
  • product_id Many2one → product.product
    required=True args: 'product.product', 'Product'
  • quantity Float
    default=1.0 digits=0 required=True args: 'Quantity'
  • volume Float
    default=1.0 args: 'Volume'
  • weight Float
    default=1.0 digits=dp.get_precision('Stock Weight') args: 'Weight'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Christophe Simonis, Joren Van Onder, Nicolas Martinelli, Richard Mathot, qdp-odoo, Damien Bouvy, Yannick Tivisse, qsm-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/page/warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - report
    - procurement
    - barcodes
    - web_planner
    - account
    - analytic
    - web_tip
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
stock_landed_cost_tree_view product.product.tree product.product tree New
view_product_landed_cost_form product.template.landed.cost.form product.template group Inherits product.product_template_form_view
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.tree stock.landed.cost tree New
view_stock_landed_cost_type_form stock.landed.cost.type.form product.product form New
Models touched (1)

New fields (0)

No new fields.

Public methods (1)
  • onchange_costing_method(self)
    @api.onchange('group_costing_method')
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/8.0/stock_landed_costs
VERSION
VERSION 1.1
CATEGORY
CATEGORYWarehouse Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSOdoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Josse Colpaert, Quentin (OpenERP), Denis Ledoux, Fabien Meghazi, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, ged-odoo, Grover Menacho, DJ Patel, Mansi Kariya (OpenERP)
WEBSITE
WEBSITEhttps://www.odoo.com/page/warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:39
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - report
    - procurement
    - board
    - web_kanban_gauge
    - web_kanban_sparkline
    - account
    - analytic
    - edi
    - email_template
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Landed Costs Management
=======================
This module allows you to easily add extra costs on pickings and decide the split of these costs among their stock moves in order to take them into account in your stock valuation.
    

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
stock_landed_cost_tree_view product.product.tree product.product tree New
view_product_landed_cost_form product.template.landed.cost.form product.template div Inherits product.product_template_form_view
view_stock_landed_cost_form stock.landed.cost.form stock.landed.cost form New
view_stock_landed_cost_search stock.landed.cost.search stock.landed.cost search New
view_stock_landed_cost_tree stock.landed.cost.tree stock.landed.cost tree New
view_stock_landed_cost_type_form stock.landed.cost.type.form product.product form New
Models touched (0)

No models found for this module.