Analytic Accounting support for WIP and Variances

account_analytic_wip
REPOSITORY
REPOSITORYOCA/account-analytic
GIT
GIThttps://github.com/OCA/account-analytic.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/account-analytic/tree/14.0/account_analytic_wip
VERSION
VERSION 3.0.3
CATEGORY
CATEGORYAccounting/Accounting
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators
COMMITTERS
COMMITTERSGitHub, Daniel Reis, OCA Transbot, oca-travis, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/account-analytic
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:02
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/account-analytic:
    - analytic_activity_based_cost
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
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
account_analytic_tracking_form account.analytic.tracking.form account.analytic.tracking.item form New
account_analytic_tracking_search account.analytic.tracking.search account.analytic.tracking.item search New
account_analytic_tracking_tree account.analytic.tracking.tree account.analytic.tracking.item tree New
view_account_move_form Account Move Form: add Tracking Item account.move xpath Inherits account.view_move_form
view_analytic_line_form Analytic Line Form: add Tracking Item account.analytic.line field Inherits account.view_account_analytic_line_form_inherit_account
view_product_category_form product.category field Inherits product.product_category_form_view
Models touched (6)

New fields (1)
  • analytic_tracking_item_ids One2many → account.analytic.tracking.item
    string='Tracking Items' args: 'account.analytic.tracking.item', 'analytic_id'
Public methods (0)

No public methods.

New fields (1)
  • analytic_tracking_item_id Many2one → account.analytic.tracking.item
    copy=False string='Tracking Item' args: 'account.analytic.tracking.item'
Public methods (2)
  • create(self, vals)
    @api.model
  • populate_tracking_items(self)
    When creating an Analytic Item, link it to a Tracking Item, the may have to be created if it doesn't exist. Use this (and used dependency methods) as a template for other models implementing related tracking items.

New fields (22)
  • account_move_ids One2many → account.move
    help='Related journal entries with the posted WIP.' string='Journal Entries' args: 'account.move', 'analytic_tracking_item_id'
  • accounted_amount Float
    help='Amount accounted in Journal Entries. Directly set by the routine creating the Journal Entries, and not directly read from the jpunral items.'
  • activity_cost_id Many2one → activity.cost.rule
    args: 'activity.cost.rule', 'Activity Cost Rule'
  • actual_amount Float
    compute='_compute_actual_amounts' help='Total cost amount of the related Analytic Items. These Analytic Items are generated when a cost is incurred, and will later generated WIP and Variance Journal Entries.' store=True
  • analytic_id Many2one → account.analytic.account
    ondelete='restrict' required=True string='Analytic Account' args: 'account.analytic.account'
  • analytic_line_ids One2many → account.analytic.line
    help='Related analytic items with the project actuals.' string='Analytic Items' args: 'account.analytic.line', 'analytic_tracking_item_id'
  • child_ids One2many → account.analytic.tracking.item
    string='Child Tracking Items' args: 'account.analytic.tracking.item', 'parent_id'
  • company_id Many2one → res.company
    related='analytic_id.company_id' store=True args: 'res.company'
  • date Date
    default=fields.Date.today()
  • difference_actual_amount Float
    compute='_compute_actual_amounts' help='Difference between actual and planned amounts.' store=True
  • name Char
    compute='_compute_name' store=True
  • parent_id Many2one → account.analytic.tracking.item
    ondelete='cascade' args: 'account.analytic.tracking.item', 'Parent Tracking Item'
  • pending_amount Float
    compute='_compute_actual_amounts' help='Amount not yet posted to journal entries.' store=True
  • planned_amount Float
  • planned_qty Float
  • product_categ_id Many2one → product.category
    related='product_id.categ_id' store=True args: 'product.category'
  • product_id Many2one → product.product
    ondelete='restrict' string='Cost Product' args: 'product.product'
  • remaining_actual_amount Float
    compute='_compute_actual_amounts' help='Actual amount planned and not yet consumed.' store=True
  • state Selection
    default='draft' help='Open operations are in progress, no negative variances are computed. Done operations are completed, negative variances are computed. Locked operations are done and posted, no more actions to do.' args: [('draft', 'Open'), ('done', 'Done'), ('cancel', 'Cancelled')]
  • to_calculate Boolean
    compute='_compute_to_calculate'
  • variance_actual_amount Float
    compute='_compute_actual_amounts' help='Actual amount incurred above the planned amount limit.' store=True
  • wip_actual_amount Float
    compute='_compute_actual_amounts' help='Actual amount incurred below the planned amount limit.' store=True
Public methods (5)
  • action_cancel(self)
  • clear_wip_journal_entries(self)
    Clear the WIP accounts so that their balance is zero and Debit the final Output account.
  • create(self, vals)
    @api.model
  • process_wip_and_variance(self, close=False)
    For each Analytic Tracking Item with a Pending Amount different from zero, generate Journal Entries for WIP and excess Variances
  • write(self, vals)

New fields (1)
  • analytic_tracking_item_id Many2one → account.analytic.tracking.item
    help='Tracking item generating this journal entry' ondelete='set null' string='Tracking Item' args: 'account.analytic.tracking.item'
Public methods (0)

No public methods.

New fields (1)
  • is_wip Boolean
    compute='_compute_is_wip_account'
Public methods (0)

No public methods.

New fields (2)
  • property_variance_account_id Many2one → account.account
    check_company=True company_dependent=True domain="[('company_id', '=', allowed_company_ids[0]), ('deprecated', '=', False)]" args: 'account.account', 'Variance Account'
  • property_wip_account_id Many2one → account.account
    check_company=True company_dependent=True domain="[('company_id', '=', allowed_company_ids[0]), ('deprecated', '=', False)]" args: 'account.account', 'WIP Account'
Public methods (0)

No public methods.