HR Expense Meal Allowance

hr_expense_meal_allowance
REPOSITORY
REPOSITORYOCA/l10n-germany
GIT
GIThttps://github.com/OCA/l10n-germany.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/l10n-germany/tree/18.0/hr_expense_meal_allowance
VERSION
VERSION 2.0.0
CATEGORY
CATEGORYHuman Resources/Expenses
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), glueckkanja AG, IFE Gesellschaft für Forschung und Entwicklung
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), glueckkanja AG, IFE Gesellschaft für Forschung und Entwicklung
COMMITTERS
COMMITTERSOCA-git-bot, oca-ci, Christopher Rogos
WEBSITE
WEBSITEhttps://github.com/OCA/l10n-germany
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-07 13:55:49
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_expense
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
    - hr_expense
    - hr
    - phone_validation
    - resource_mail
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Adds German "Verpflegungsmehraufwände" processing in the expense module.

When a meal allowance product is selected, the UI is changed as following.
![meal allowance rates](../static/description/expense_1.png)
![meal allowance rates](../static/description/expense_2.png)

The product tag controls whether the Product is of type meal allowance and controls the UI.  
![meal allowance rates](../static/description/product_tag.png)

The rates are imported by a csv file. When a rate changes for a certain country, create a new csv line and set the expire_on date on the existing line.
![meal allowance rates](../static/description/settings_rates.png)

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
hr_expense_meal_allowance_form hr.expense.meal.allowance.form.view hr.expense.meal.allowance form New
hr_expense_meal_allowance_list hr.expense.meal.allowance.list.view hr.expense.meal.allowance list New
hr_expense_meal_allowance_rate_form hr.expense.meal.allowance.form.view hr.expense.meal.allowance.rate form New
hr_expense_meal_allowance_rate_list hr.expense.meal.allowance.list.view hr.expense.meal.allowance.rate list New
hr_expense_meal_allowance_search_form_view hr_expense_meal_allowance.rate.search hr.expense.meal.allowance.rate search New
hr_expense_sheet_view_form_extended view.hr.expense.form.extended hr.expense xpath Inherits hr_expense.hr_expense_view_form
report_expense_meal_allowance report_expense_meal_allowance ir.ui.view qweb New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (4)

New fields (8)
  • customer_id Many2one → res.partner
    args: 'res.partner'
  • is_meal_allowance Boolean
    compute='_compute_meal_allowance_tag'
  • meal_allowance_ids One2many → hr.expense.meal.allowance
    string='Included Meals' args: 'hr.expense.meal.allowance', 'hr_expense_id'
  • meal_allowance_rate_id Many2one → hr.expense.meal.allowance.rate
    domain="['|', ('expire_on', '=', False),('expire_on', '>=', travel_end)]" string='Rate' args: 'hr.expense.meal.allowance.rate'
  • number_of_days Integer
    compute='_compute_number_of_travel_days' args: 'Whole Days'
  • number_of_travel_days Integer
    compute='_compute_number_of_travel_days' args: 'Travel Days'
  • travel_begin Datetime
  • travel_end Datetime
Public methods (1)
  • action_print(self)

New fields (11)
  • breakfast_included Boolean
    string='Breakfast included?'
  • company_id Many2one
    related='hr_expense_id.company_id'
  • currency_id Many2one → res.currency
    help='Utility field to express amount currency' readonly=True related='hr_expense_id.currency_id' args: 'res.currency'
  • date Date
    required=True
  • day Char
    compute='_compute_date'
  • dinner_included Boolean
    string='Dinner included?'
  • employee_id Many2one
    related='hr_expense_id.employee_id'
  • expense_for_day Monetary
    compute='_compute_expense_for_day' currency_field='currency_id' string='Expenses for This Day'
  • hr_expense_id Many2one → hr.expense
    readonly=True string='Expense' args: 'hr.expense'
  • is_editable Boolean
    related='hr_expense_id.is_editable'
  • lunch_included Boolean
    string='Lunch included?'
Public methods (0)

No public methods.

New fields (12)
  • breakfast_rate Monetary
    compute='_compute_expense_rate'
  • city_name Char
    translate=True
  • country_id Many2one → res.country
    required=True args: 'res.country'
  • currency_id Many2one → res.currency
    default=<expr> required=True string='Currency' args: 'res.currency'
  • daily_rate_24h Monetary
    string='Daily Rate - 24h'
  • daily_rate_8h Monetary
    string='Daily Rate - 8h'
  • dinner_rate Monetary
    compute='_compute_expense_rate'
  • expire_on Date
  • lunch_rate Monetary
    compute='_compute_expense_rate'
  • percentage_for_breakfast Float
    default=0.2 string='Percentage for Breakfast'
  • percentage_for_dinner Float
    default=0.4 string='Percentage for Dinner'
  • percentage_for_lunch Float
    default=0.4 string='Percentage for Lunch'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.