Skip to content
Health
57/100
fair
  • Security22/25
    1 minor finding
  • Activity25/25
    Human commit this month
  • Required by5/25
    0 modules depend on it
  • Maturity5/25
    In 1 Odoo series since 19.0

Heuristic over the facts below, not an audit · How it's computed

Security findings
Grave / minor (static analysis)
Required by
0
Modules depending on it
External deps
0 pip · 0 bin
Python packages / system binaries
License
AGPL-3
No conflicts with its dependencies
Folder size
0.26 MB
Module directory on disk
Code analysis 1 migration note 7 models 16 views 0 HTTP endpoints

Description

This module adds the ability to define expense sheets.

Dependencies

Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
None

Code analysis

Extracted from the source by best-effort static analysis (no code is executed); details may be incomplete.

Views touched 16

XML IDNameModelTypeStatus
hr_department_view_kanban hr.department.kanban.inherit hr.department kanban Inherits hr_expense.hr_department_view_kanban
hr_expense_sheet_view_activity hr.expense.sheet.activity hr.expense.sheet activity New
hr_expense_sheet_view_search hr.expense.sheet.view.search hr.expense.sheet search New
hr_expense_sheet_view_search_with_panel hr.expense.sheet.view.search.with.panel hr.expense.sheet search Inherits hr_expense_sheet_view_search
hr_expense_view_expenses_analysis_tree hr.expense tree Inherits hr_expense.hr_expense_view_expenses_analysis_tree
hr_expense_view_form hr.expense form Inherits hr_expense.hr_expense_view_form
hr_expense_view_search hr.expense search Inherits hr_expense.hr_expense_view_search
report_expense_sheet report_expense_sheet ir.ui.view qweb New
view_hr_expense_clean_tree hr.expense.list.without.dashboard hr.expense list Inherits hr_expense.hr_expense_view_expenses_analysis_tree
view_hr_expense_sheet_form hr.expense.sheet.form hr.expense.sheet form New
view_hr_expense_sheet_graph hr.expense.sheet.graph hr.expense.sheet graph New
view_hr_expense_sheet_kanban hr.expense.sheet.kanban hr.expense.sheet kanban New
view_hr_expense_sheet_pivot hr.expense.sheet.pivot hr.expense.sheet pivot New
view_hr_expense_sheet_tree hr.expense.sheet.list hr.expense.sheet list New
view_move_form_inherit_expense account.move.form.inherit account.move form Inherits hr_expense.view_move_form_inherit_expense
view_payment_form_inherit_expense account.payment.form.inherit account.payment form Inherits hr_expense.view_payment_form_inherit_expense

HTTP endpoints 0

No HTTP endpoints found for this module.

Models touched 7

New fields (2)
  • expense_sheet_id Many2one → hr.expense.sheet
    comodel_name='hr.expense.sheet' copy=False index='btree_not_null' ondelete='set null'
  • show_commercial_partner_warning Boolean
    compute='_compute_show_commercial_partner_warning'
Public methods (1)
  • action_open_expense_report(self)

New fields (1)
  • expense_sheet_id Many2one
    related='move_id.expense_sheet_id'
Public methods (1)
  • action_open_expense_report(self)

New fields (1)
  • expense_sheets_to_approve_count Integer
    compute='_compute_expense_sheets_to_approve' string='Expenses Reports to Approve'
Public methods (0)

No public methods.

New fields (4)
  • approval_date Datetime
    compute='_compute_approval_date' store=True
  • employee_id Many2one
    inverse='_inverse_employee_id'
  • journal_id Many2one
    compute='_compute_journal_id' store=True
  • sheet_id Many2one → hr.expense.sheet
    comodel_name='hr.expense.sheet' copy=False domain="[('employee_id', '=', employee_id), ('company_id', '=', company_id)]" index=True readonly=True string='Expense Report'
Public methods (8)
  • action_get_attachment_view(self)
  • action_show_same_receipt_expense_ids(self)
  • action_submit_expenses(self)
  • action_view_sheet(self)
  • get_expenses_to_submit(self)
  • unlink(self)
  • update_activities_and_mails(self)
  • write(self, vals)

New fields (35)
  • account_move_ids One2many → account.move
    comodel_name='account.move' inverse_name='expense_sheet_id' readonly=True string='Journal Entries'
  • accounting_date Date
    help='Specify the bill date of the related vendor bill.' string='Expense Report Date'
  • amount_residual Monetary
    compute='_compute_amount_residual' currency_field='company_currency_id' readonly=True store=True string='Amount Due'
  • approval_date Datetime
    readonly=True
  • approval_state Selection
    copy=False readonly=True selection=EXPENSE_APPROVAL_STATE
  • attachment_ids One2many → ir.attachment
    comodel_name='ir.attachment' domain="[('res_model', '=', 'hr.expense.sheet')]" inverse_name='res_id' string='Attachments of expenses'
  • can_approve Boolean
    compute='_compute_can_approve'
  • can_reset Boolean
    compute='_compute_can_reset'
  • cannot_approve_reason Char
    compute='_compute_cannot_approve_reason'
  • company_currency_id Many2one → res.currency
    comodel_name='res.currency' related='company_id.currency_id' string='Report Company Currency'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> readonly=True required=True
  • currency_id Many2one → res.currency
    comodel_name='res.currency' compute='_compute_currency_id' readonly=True store=True
  • department_id Many2one → hr.department
    comodel_name='hr.department' copy=False related='employee_id.department_id' store=True string='Department'
  • employee_id Many2one → hr.employee
    check_company=True comodel_name='hr.employee' default=<expr> domain=[('filter_for_expense', '=', True)] readonly=True required=True tracking=True
  • employee_journal_id Many2one → account.journal
    check_company=True comodel_name='account.journal' default=<expr> domain=[('type', '=', 'purchase')] help='The journal used when the expense is paid by employee.' string='Journal'
  • expense_line_ids One2many → hr.expense
    comodel_name='hr.expense' copy=False inverse_name='sheet_id' string='Expense Lines'
  • is_editable Boolean
    compute='_compute_is_editable' string='Expense Lines Are Editable By Current User'
  • is_multiple_currency Boolean
    compute='_compute_is_multiple_currency' string='Handle lines with different currencies'
  • journal_id Many2one → account.journal
    check_company=True comodel_name='account.journal' compute='_compute_journal_id' store=True string='Expense Journal'
  • manager_id Many2one → res.users
    comodel_name='res.users' compute='_compute_manager_id' copy=False domain=<expr> store=True tracking=True
  • name Char
    required=True string='Expense Report Summary' tracking=True
  • nb_account_move Integer
    compute='_compute_nb_account_move' string='Number of Journal Entries'
  • nb_expense Integer
    compute='_compute_nb_expense' string='Number of Expenses'
  • payment_method_line_id Many2one → account.payment.method.line
    comodel_name='account.payment.method.line' compute='_compute_payment_method_line_id' domain="[('id', 'in', selectable_payment_method_line_ids)]" help='The payment method used when the expense is paid by the company.' readonly=False store=True string='Payment Method'
  • payment_mode Selection
    readonly=True related='expense_line_ids.payment_mode' string='Paid By' tracking=True
  • payment_state Selection
    compute='_compute_payment_state' copy=False readonly=True selection=<expr> store=True string='Payment Status' tracking=True
  • product_ids Many2many → product.product
    check_company=True comodel_name='product.product' compute='_compute_product_ids' search='_search_product_ids' string='Categories'
  • selectable_payment_method_line_ids Many2many → account.payment.method.line
    comodel_name='account.payment.method.line' compute='_compute_selectable_payment_method_line_ids'
  • state Selection
    compute='_compute_state' copy=False default='draft' index=True readonly=True required=True selection=[('draft', 'To Submit'), ('submitted', 'Submitted'), ('approved', 'Approved'), ('posted', 'Posted'), ('in_payment', 'In Payment'), ('paid', 'Paid'), ('refused', 'Refused')] store=True string='Status' tracking=True
  • tax_amount Monetary
    compute='_compute_tax_amount' currency_field='company_currency_id' help='Tax amount in company currency' precompute=True store=True string='Tax amount'
  • tax_amount_currency Monetary
    compute='_compute_tax_amount_currency' currency_field='currency_id' help='Tax amount in currency' precompute=True store=True string='Tax amount in Currency'
  • total_amount Monetary
    compute='_compute_total_amount' currency_field='company_currency_id' precompute=True readonly=False store=True string='Total' tracking=True
  • total_amount_currency Monetary
    compute='_compute_total_amount_currency' currency_field='currency_id' precompute=True readonly=False store=True string='Total In Currency' tracking=True
  • untaxed_amount Monetary
    compute='_compute_untaxed_amount' currency_field='currency_id' precompute=True store=True string='Total Untaxed Amount'
  • untaxed_amount_currency Monetary
    compute='_compute_untaxed_amount_currency' currency_field='currency_id' precompute=True store=True string='Total Untaxed Amount In Currency'
Public methods (10)
  • action_approve(self)
  • action_open_account_moves(self)
  • action_open_expense_view(self)
  • action_post(self)
  • action_refuse(self)
  • action_reset(self)
  • action_submit(self)
  • activity_update(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)