summaryrefslogtreecommitdiff
path: root/addons/hr_expense/views
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/hr_expense/views
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/hr_expense/views')
-rw-r--r--addons/hr_expense/views/account_journal_dashboard.xml24
-rw-r--r--addons/hr_expense/views/assets.xml21
-rw-r--r--addons/hr_expense/views/hr_department_views.xml35
-rw-r--r--addons/hr_expense/views/hr_expense_views.xml1131
-rw-r--r--addons/hr_expense/views/mail_activity_views.xml15
-rw-r--r--addons/hr_expense/views/res_config_settings_views.xml81
6 files changed, 1307 insertions, 0 deletions
diff --git a/addons/hr_expense/views/account_journal_dashboard.xml b/addons/hr_expense/views/account_journal_dashboard.xml
new file mode 100644
index 00000000..e589a4f6
--- /dev/null
+++ b/addons/hr_expense/views/account_journal_dashboard.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+
+ <record id="account_journal_dashboard_kanban_view_inherit_hr_expense" model="ir.ui.view">
+ <field name="name">account.journal.dashboard.kanban</field>
+ <field name="model">account.journal</field>
+ <field name="inherit_id" ref="account.account_journal_dashboard_kanban_view" />
+ <field name="arch" type="xml">
+ <xpath expr="//t[@id='account.JournalBodySalePurchase']//div[hasclass('o_kanban_primary_right')]" position="inside">
+ <div class="row" t-if="dashboard.number_expenses_to_pay">
+ <div class="col overflow-hidden text-left">
+ <a type="object" t-if="journal_type == 'purchase'" name="open_expenses_action">
+ <t t-esc="dashboard.number_expenses_to_pay"/> Expenses to Process
+ </a>
+ </div>
+ <div class="col-auto text-right">
+ <span t-if="journal_type == 'purchase'"><t t-esc="dashboard.sum_expenses_to_pay"/></span>
+ </div>
+ </div>
+ </xpath>
+ </field>
+ </record>
+
+</odoo>
diff --git a/addons/hr_expense/views/assets.xml b/addons/hr_expense/views/assets.xml
new file mode 100644
index 00000000..2fc4116b
--- /dev/null
+++ b/addons/hr_expense/views/assets.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <data>
+ <template id="assets_backend" name="HR Expense Assets assets" inherit_id="web.assets_backend">
+ <xpath expr="." position="inside">
+ <script type="text/javascript" src="/hr_expense/static/src/js/expense_views.js"/>
+ <script type="text/javascript" src="/hr_expense/static/src/js/expense_qr_code_action.js"/>
+ <script type="text/javascript" src="/hr_expense/static/src/js/upload_mixin.js"/>
+ </xpath>
+ <xpath expr="link[last()]" position="after">
+ <link rel="stylesheet" type="text/scss" href="/hr_expense/static/src/scss/hr_expense.scss"/>
+ </xpath>
+ </template>
+ <template id="assets_tests" name="HR Expense Assets Tests" inherit_id="web.assets_tests">
+ <xpath expr="." position="inside">
+ <script type="text/javascript" src="/hr_expense/static/src/js/tours/hr_expense.js"></script>
+ <script type="text/javascript" src="/hr_expense/static/tests/tours/expense_upload_tours.js"></script>
+ </xpath>
+ </template>
+ </data>
+</odoo>
diff --git a/addons/hr_expense/views/hr_department_views.xml b/addons/hr_expense/views/hr_department_views.xml
new file mode 100644
index 00000000..7ee559b9
--- /dev/null
+++ b/addons/hr_expense/views/hr_department_views.xml
@@ -0,0 +1,35 @@
+<odoo>
+ <!--Hr Department Inherit Kanban view-->
+ <record id="hr_department_view_kanban" model="ir.ui.view">
+ <field name="name">hr.department.kanban.inherit</field>
+ <field name="model">hr.department</field>
+ <field name="inherit_id" ref="hr.hr_department_view_kanban"/>
+ <field name="groups_id" eval="[(4,ref('hr_expense.group_hr_expense_team_approver'))]"/>
+ <field name="arch" type="xml">
+ <data>
+ <xpath expr="//templates" position="before">
+ <field name="expense_sheets_to_approve_count"/>
+ </xpath>
+
+ <xpath expr="//div[hasclass('o_kanban_primary_right')]" position="inside">
+ <div t-if="record.expense_sheets_to_approve_count.raw_value > 0" class="row ml16">
+ <div class="col-9">
+ <a name="%(action_hr_expense_sheet_department_to_approve)d" type="action">
+ Expense Reports
+ </a>
+ </div>
+ <div class="col-3 text-right">
+ <t t-esc="record.expense_sheets_to_approve_count.raw_value"/>
+ </div>
+ </div>
+ </xpath>
+
+ <xpath expr="//div[hasclass('o_kanban_manage_reports')]" position="inside">
+ <a role="menuitem" class="dropdown-item" name="%(action_hr_expense_sheet_department_filtered)d" type="action">
+ Expenses
+ </a>
+ </xpath>
+ </data>
+ </field>
+ </record>
+</odoo>
diff --git a/addons/hr_expense/views/hr_expense_views.xml b/addons/hr_expense/views/hr_expense_views.xml
new file mode 100644
index 00000000..c33d17ac
--- /dev/null
+++ b/addons/hr_expense/views/hr_expense_views.xml
@@ -0,0 +1,1131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+
+ <record id="hr_employee_view_form_inherit_expense" model="ir.ui.view">
+ <field name="name">hr.employee.view.form.expense</field>
+ <field name="model">hr.employee</field>
+ <field name="inherit_id" ref="hr.view_employee_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//group[@name='managers']" position="inside">
+ <field name="expense_manager_id" context="{'default_company_id': company_id}"/>
+ </xpath>
+ <xpath expr="//group[@name='managers']" position="attributes">
+ <attribute name="invisible">0</attribute>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="view_employee_tree_inherit_expense" model="ir.ui.view">
+ <field name="name">hr.employee.tree.expense</field>
+ <field name="model">hr.employee</field>
+ <field name="inherit_id" ref="hr.view_employee_tree"/>
+ <field name="arch" type="xml">
+ <xpath expr="//field[@name='work_location']" position="after">
+ <field name="expense_manager_id" optional="hide" string="Expense Approver"/>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="res_users_view_form_preferences" model="ir.ui.view">
+ <field name="name">hr.user.preferences.form.inherit.hr.expense</field>
+ <field name="model">res.users</field>
+ <field name="inherit_id" ref="hr.res_users_view_form_profile" />
+ <field name="arch" type="xml">
+ <xpath expr="//group[@name='managers']" position="inside">
+ <field name="expense_manager_id" attrs="{'readonly': [('can_edit', '=', False)]}" context="{'default_company_id': company_id}"/>
+ </xpath>
+ <xpath expr="//group[@name='managers']" position="attributes">
+ <attribute name="invisible">0</attribute>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="hr_expense_view_expenses_analysis_tree" model="ir.ui.view">
+ <field name="name">hr.expense.tree</field>
+ <field name="model">hr.expense</field>
+ <field name="arch" type="xml">
+ <tree string="Expenses" multi_edit="1" sample="1" js_class="hr_expense_tree_dashboard_upload">
+ <header>
+ <button name="action_submit_expenses" type="object" string="Create Report"/>
+ </header>
+ <field name="attachment_number" invisible="True"/>
+ <field name="date" optional="show"/>
+ <field name="accounting_date" optional="hide" groups="account.group_account_invoice,account.group_account_readonly"/>
+ <field name="name"/>
+ <field name="employee_id" widget="many2one_avatar_employee"/>
+ <field name="sheet_id" optional="show" invisible="not context.get('show_report', False)" readonly="1"/>
+ <field name="payment_mode" optional="show"/>
+ <field name="reference" optional="hide"/>
+ <field name="analytic_account_id" optional="show" groups="analytic.group_analytic_accounting"/>
+ <field name="analytic_tag_ids" optional="hide" widget="many2many_tags" groups="analytic.group_analytic_tags"/>
+ <field name="account_id" optional="hide"/>
+ <field name="company_id" optional="show" groups="base.group_multi_company" readonly="1"/>
+ <field name="unit_amount" optional="hide" widget="monetary" options="{'currency_field': 'currency_id'}"/>
+ <field name="currency_id" optional="hide"/>
+ <field name="quantity" optional="hide"/>
+ <field name="activity_ids" widget="list_activity" optional="show"/>
+ <field name="tax_ids" optional="show" widget="many2many_tags" groups="account.group_account_user"/>
+ <field name="total_amount" optional="show" sum="Total Amount" widget="monetary" options="{'currency_field': 'currency_id'}" decoration-bf="True"/>
+ <button name="action_get_attachment_view" string="Attachments" type="object" icon="fa-paperclip" attrs="{'invisible': [('attachment_number', '=', 0)]}"/>
+ <field name="message_unread" invisible="1"/>
+ <field name="state" optional="show" readonly="1" decoration-info="state == 'draft'" decoration-success="state in ['reported', 'approved', 'done']" decoration-danger="state in 'refused'" widget="badge"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="view_expenses_tree" model="ir.ui.view">
+ <field name="name">hr.expense.tree</field>
+ <field name="model">hr.expense</field>
+ <field name="inherit_id" ref="hr_expense_view_expenses_analysis_tree"/>
+ <field name="mode">primary</field>
+ <field name="arch" type="xml">
+ <xpath expr="//tree" position="attributes">
+ <!-- Display the tree dashboard view with the header -->
+ <attribute name="js_class">hr_expense_tree_dashboard_upload_header</attribute>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="view_my_expenses_tree" model="ir.ui.view">
+ <field name="name">hr.expense.tree</field>
+ <field name="model">hr.expense</field>
+ <field name="priority">20</field>
+ <field name="inherit_id" ref="hr_expense.view_expenses_tree"/>
+ <field name="mode">primary</field>
+ <field name="arch" type="xml">
+ <xpath expr="//tree" position="attributes">
+ <!-- Display the tree dashboard view with the header -->
+ <attribute name="js_class">hr_expense_tree_dashboard_header</attribute>
+ <attribute name="class">hr_expense</attribute>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="hr_expense_view_form" model="ir.ui.view">
+ <field name="name">hr.expense.view.form</field>
+ <field name="model">hr.expense</field>
+ <field name="arch" type="xml">
+ <form string="Expenses" class="o_expense_form">
+ <header>
+ <button name="action_submit_expenses" string="Create Report" type="object" class="oe_highlight o_expense_submit" attrs="{'invisible': ['|', ('attachment_number', '&lt;=', 0), ('sheet_id', '!=', False)]}"/>
+ <widget name="attach_document" string="Attach Receipt" action="message_post" attrs="{'invisible': ['|', ('attachment_number', '&lt;', 1), ('id','=',False)]}"/>
+ <widget name="attach_document" string="Attach Receipt" action="message_post" highlight="1" attrs="{'invisible': ['|',('attachment_number', '&gt;=', 1), ('id','=',False)]}"/>
+ <button name="action_submit_expenses" string="Create Report" type="object" class="o_expense_submit" attrs="{'invisible': ['|', ('attachment_number', '&gt;=', 1), ('sheet_id', '!=', False)]}"/>
+ <field name="state" widget="statusbar" statusbar_visible="draft,reported,approved,done,refused"/>
+ <button name="action_view_sheet" type="object" string="View Report" class="oe_highlight" attrs="{'invisible': [('sheet_id', '=', False)]}"/>
+ </header>
+ <sheet>
+ <div class="oe_button_box" name="button_box">
+ <button name="action_get_attachment_view"
+ class="oe_stat_button"
+ icon="fa-file-text-o"
+ type="object">
+ <field name="attachment_number" widget="statinfo" string="Receipts" options="{'reload_on_button': true}"/>
+ </button>
+ </div>
+ <div class="oe_title">
+ <label for="name" class="oe_edit_only"/>
+ <h1>
+ <field name="name" placeholder="e.g. Lunch with Customer"/>
+ </h1>
+ </div>
+ <group>
+ <group>
+ <field name="is_editable" invisible="1"/>
+ <field name="is_ref_editable" invisible="1"/>
+ <field name="product_id" required="1" context="{'default_can_be_expensed': 1, 'tree_view_ref': 'hr_expense.product_product_expense_tree_view'}"
+ widget="many2one_barcode"
+ />
+ <field name="unit_amount" required="1" widget="monetary" options="{'currency_field': 'currency_id', 'field_digits': True}"/>
+ <field name="product_uom_category_id" invisible="1"/>
+ <label for="quantity"/>
+ <div class="o_row">
+ <field name="quantity" class="oe_inline"/>
+ <field name="product_uom_id" required="1" widget="selection" class="oe_inline" groups="uom.group_uom"/>
+ </div>
+ <field name="tax_ids" widget="many2many_tags" groups="account.group_account_readonly" attrs="{'readonly': [('is_editable', '=', False)]}" context="{'default_company_id': company_id}"/>
+ <field name="total_amount" widget='monetary' options="{'currency_field': 'currency_id'}"/>
+ <field name="amount_residual" widget='monetary' options="{'currency_field': 'currency_id'}"/>
+ </group><group>
+ <field name="reference" attrs="{'readonly': [('is_ref_editable', '=', False)]}"/>
+ <field name="date"/>
+ <field name="accounting_date" attrs="{'invisible': ['|', ('accounting_date', '=', False), ('state', 'not in', ['approved', 'done'])]}" />
+ <field name="account_id" options="{'no_create': True}" domain="[('internal_type', '=', 'other'), ('company_id', '=', company_id)]" groups="account.group_account_readonly" attrs="{'readonly': [('is_editable', '=', False)]}" context="{'default_company_id': company_id}"/>
+ <field name="employee_id" groups="hr_expense.group_hr_expense_team_approver" context="{'default_company_id': company_id}"/>
+ <field name="sheet_id" invisible="1"/>
+ <field name="currency_id" groups="base.group_multi_currency"/>
+ <field name="analytic_account_id" domain="['|', ('company_id', '=', company_id), ('company_id', '=', False)]" groups="analytic.group_analytic_accounting" attrs="{'readonly': [('is_editable', '=', False)]}"/>
+ <field name="analytic_tag_ids" widget="many2many_tags" groups="analytic.group_analytic_tags" attrs="{'readonly': [('is_editable', '=', False)]}"/>
+ <field name="company_id" groups="base.group_multi_company"/>
+ </group><group>
+ <label for="payment_mode"/>
+ <div>
+ <field name="payment_mode" widget="radio"/>
+ </div>
+ </group>
+ </group>
+ <div>
+ <field name="description" class="oe_inline" placeholder="Notes..."/>
+ </div>
+ </sheet>
+ <div class="o_attachment_preview"/>
+ <div class="oe_chatter">
+ <field name="message_follower_ids"/>
+ <field name="activity_ids"/>
+ <field name="message_ids"/>
+ </div>
+ </form>
+ </field>
+ </record>
+
+ <record id="hr_expense_view_form_without_header" model="ir.ui.view">
+ <field name="name">hr.expense.view.form</field>
+ <field name="model">hr.expense</field>
+ <field name="inherit_id" ref="hr_expense.hr_expense_view_form"/>
+ <field eval="35" name="priority"/>
+ <field name="mode">primary</field>
+ <field name="arch" type="xml">
+ <xpath expr="/form/header" position="attributes">
+ <attribute name="invisible">1</attribute>
+ </xpath>
+ <xpath expr="/form/sheet/div[hasclass('oe_button_box')]" position="attributes">
+ <attribute name="invisible">1</attribute>
+ </xpath>
+ <field name="employee_id" position="attributes">
+ <attribute name="readonly">1</attribute>
+ </field>
+ <field name="company_id" position="attributes">
+ <attribute name="readonly">1</attribute>
+ </field>
+ </field>
+ </record>
+
+ <record id="hr_expense_view_expenses_analysis_kanban" model="ir.ui.view">
+ <field name="name">hr.expense.kanban</field>
+ <field name="model">hr.expense</field>
+ <field name="arch" type="xml">
+ <kanban class="o_kanban_mobile hr_expense" sample="1" js_class="hr_expense_kanban">
+ <field name="name"/>
+ <field name="employee_id"/>
+ <field name="total_amount"/>
+ <field name="date"/>
+ <field name="state"/>
+ <field name="activity_state"/>
+ <field name="currency_id"/>
+ <progressbar field="activity_state" colors='{"planned": "success", "today": "warning", "overdue": "danger"}'/>
+ <templates>
+ <t t-name="kanban-box">
+ <div t-attf-class="oe_kanban_card oe_kanban_global_click">
+ <div class="row">
+ <div class="col-12">
+ <strong class="o_kanban_record_title"><span><t t-esc="record.name.value"/></span></strong>
+ <strong class="o_kanban_record_subtitle float-right"><span class="text-right"><field name="total_amount" widget="monetary"/></span></strong>
+ </div>
+ </div>
+ <div class="row mt8">
+ <div class="col-6 text-muted">
+ <span><t t-esc="record.employee_id.value"/> <t t-esc="record.date.value"/></span>
+ </div>
+ <div class="col-6">
+ <span class="float-right text-right">
+ <field name="state" widget="label_selection" options="{'classes': {'draft': 'default', 'reported': 'primary', 'refused': 'danger', 'done': 'warning',
+ 'approved': 'success'}}"/>
+ </span>
+ </div>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+
+ <!-- Kanban view without header -->
+ <record id="hr_expense_kanban_view" model="ir.ui.view">
+ <field name="name">hr.expense.kanban</field>
+ <field name="model">hr.expense</field>
+ <field name="inherit_id" ref="hr_expense_view_expenses_analysis_kanban"/>
+ <field name="mode">primary</field>
+ <field name="arch" type="xml">
+ <xpath expr="//kanban" position="attributes">
+ <attribute name="js_class">hr_expense_kanban</attribute>
+ </xpath>
+ </field>
+ </record>
+
+ <!-- Kanban view with header. Used in "All My Expenses -->
+ <record id="hr_expense_kanban_view_header" model="ir.ui.view">
+ <field name="name">hr.expense.kanban</field>
+ <field name="model">hr.expense</field>
+ <field name="inherit_id" ref="hr_expense_view_expenses_analysis_kanban"/>
+ <field name="mode">primary</field>
+ <field name="arch" type="xml">
+ <xpath expr="//kanban" position="attributes">
+ <attribute name="js_class">hr_expense_kanban_header</attribute>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="hr_expense_view_pivot" model="ir.ui.view">
+ <field name="name">hr.expense.pivot</field>
+ <field name="model">hr.expense</field>
+ <field name="arch" type="xml">
+ <pivot string="Expenses Analysis" sample="1">
+ <field name="employee_id" type="row"/>
+ <field name="date" interval="month" type="col"/>
+ <field name="total_amount" type="measure"/>
+ </pivot>
+ </field>
+ </record>
+
+ <record id="hr_expense_view_graph" model="ir.ui.view">
+ <field name="name">hr.expense.graph</field>
+ <field name="model">hr.expense</field>
+ <field name="arch" type="xml">
+ <graph string="Expenses Analysis" sample="1">
+ <field name="date" type="col"/>
+ <field name="employee_id" type="row"/>
+ <field name="total_amount" type="measure"/>
+ </graph>
+ </field>
+ </record>
+
+ <record id="hr_expense_view_search" model="ir.ui.view">
+ <field name="name">hr.expense.view.search</field>
+ <field name="model">hr.expense</field>
+ <field name="arch" type="xml">
+ <search string="Expense">
+ <field string="Expense" name="name" filter_domain="['|', '|', ('employee_id', 'ilike', self), ('name', 'ilike', self), ('product_id', 'ilike', self)]"/>
+ <field name="date"/>
+ <field name="employee_id"/>
+ <field name="analytic_account_id" groups="analytic.group_analytic_accounting"/>
+ <filter string="My Expenses" name="my_expenses" domain="[('employee_id.user_id', '=', uid)]"/>
+ <filter string="My Team" name="my_team_expenses" domain="[('employee_id.parent_id.user_id', '=', uid)]" groups="hr_expense.group_hr_expense_team_approver" help="Expenses of Your Team Member"/>
+ <separator />
+ <filter string="To Report" name="no_report" domain="[('sheet_id', '=', False)]"/>
+ <filter string="Refused" name="refused" domain="[('state', '=', 'refused')]" help="Refused Expenses"/>
+ <separator />
+ <filter string="Expense Date" name="date" date="date"/>
+ <separator />
+ <filter string="Former Employees" name="inactive" domain="[('employee_id.active', '=', False)]" groups="hr_expense.group_hr_expense_user,hr_expense.group_hr_expense_manager"/>
+ <separator/>
+ <filter invisible="1" string="Late Activities" name="activities_overdue"
+ domain="[('my_activity_date_deadline', '&lt;', context_today().strftime('%Y-%m-%d'))]"
+ help="Show all records which has next action date is before today"/>
+ <filter invisible="1" string="Today Activities" name="activities_today"
+ domain="[('my_activity_date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/>
+ <filter invisible="1" string="Future Activities" name="activities_upcoming_all"
+ domain="[('my_activity_date_deadline', '&gt;', context_today().strftime('%Y-%m-%d'))]"/>
+ <group expand="0" string="Group By">
+ <filter string="Employee" name="employee" domain="[]" context="{'group_by': 'employee_id'}"/>
+ <filter string="Product" name="product" domain="[]" context="{'group_by': 'product_id'}"/>
+ <filter string="Analytic Account" name="analyticacc" domain="[]" context="{'group_by': 'analytic_account_id'}" groups="analytic.group_analytic_accounting"/>
+ <filter string="Status" name="status" domain="[]" context="{'group_by': 'state'}"/>
+ <filter string="Expense Date" name="expensesmonth" domain="[]" context="{'group_by': 'date'}" help="Expense Date"/>
+ <filter string="Company" name="company" domain="[]" context="{'group_by': 'company_id'}" groups="base.group_multi_company"/>
+ </group>
+ </search>
+ </field>
+ </record>
+
+ <record id="hr_expense_view_activity" model="ir.ui.view">
+ <field name="name">hr.expense.activity</field>
+ <field name="model">hr.expense</field>
+ <field name="arch" type="xml">
+ <activity string="Expenses">
+ <field name="employee_id"/>
+ <field name="currency_id"/>
+ <templates>
+ <div t-name="activity-box">
+ <img t-att-src="activity_image('hr.employee', 'image_128', record.employee_id.raw_value)" t-att-title="record.employee_id.value" t-att-alt="record.employee_id.value"/>
+ <div>
+ <field name="name" display="full"/>
+ <field name="total_amount" widget="monetary" muted="1" display="full"/>
+ </div>
+ </div>
+ </templates>
+ </activity>
+ </field>
+ </record>
+
+ <record id="hr_expense_actions_all" model="ir.actions.act_window">
+ <field name="name">Expenses Analysis</field>
+ <field name="res_model">hr.expense</field>
+ <field name="view_mode">graph,pivot,tree,kanban,form</field>
+ <field name="search_view_id" ref="hr_expense_view_search"/>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_empty_folder">
+ No data yet!
+ </p><p>
+ Create new expenses to get statistics.
+ </p>
+ </field>
+ </record>
+
+ <record id="hr_expense_actions_all_graph" model="ir.actions.act_window.view">
+ <field name="view_mode">graph</field>
+ <field name="view_id" ref="hr_expense.hr_expense_view_graph"/>
+ <field name="act_window_id" ref="hr_expense_actions_all"/>
+ </record>
+
+ <record id="hr_expense_actions_all_pivot" model="ir.actions.act_window.view">
+ <field name="view_mode">pivot</field>
+ <field name="view_id" ref="hr_expense.hr_expense_view_pivot"/>
+ <field name="act_window_id" ref="hr_expense_actions_all"/>
+ </record>
+
+ <record id="hr_expense_actions_all_tree" model="ir.actions.act_window.view">
+ <field name="view_mode">tree</field>
+ <field name="view_id" ref="hr_expense_view_expenses_analysis_tree"/>
+ <field name="act_window_id" ref="hr_expense_actions_all"/>
+ </record>
+
+ <record id="hr_expense_actions_all_kanban" model="ir.actions.act_window.view">
+ <field name="view_mode">kanban</field>
+ <field name="view_id" ref="hr_expense_view_expenses_analysis_kanban"/>
+ <field name="act_window_id" ref="hr_expense_actions_all"/>
+ </record>
+
+ <record id="hr_expense_actions_my_unsubmitted" model="ir.actions.act_window">
+ <field name="name">My Expenses to Report</field>
+ <field name="res_model">hr.expense</field>
+ <field name="view_mode">tree,kanban,form,graph,pivot,activity</field>
+ <field name="search_view_id" ref="hr_expense_view_search"/>
+ <field name="context">{'search_default_my_expenses': 1, 'search_default_no_report': 1}</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_expense_receipt">
+ Did you try the mobile app?
+ </p>
+ <p>Snap pictures of your receipts and let Odoo<br/> automatically create expenses for you.</p>
+ <p>
+ <a href="https://apps.apple.com/be/app/odoo/id1272543640" target="_blank">
+ <img alt="Apple App Store" class="img img-fluid h-100 o_expense_apple_store" src="/hr_expense/static/img/app_store.png"/>
+ </a>
+ <a href="https://play.google.com/store/apps/details?id=com.odoo.mobile" target="_blank" class="o_expense_google_store">
+ <img alt="Google Play Store" class="img img-fluid h-100 o_expense_google_store" src="/hr_expense/static/img/play_store.png"/>
+ </a>
+ </p>
+ </field>
+ </record>
+
+ <!-- Tree & Kanban view for "My Expenses to Report" with the header -->
+ <record id="hr_expense_actions_my_unsubmitted_tree" model="ir.actions.act_window.view">
+ <field name="view_mode">tree</field>
+ <field name="view_id" ref="view_my_expenses_tree"/>
+ <field name="act_window_id" ref="hr_expense_actions_my_unsubmitted"/>
+ </record>
+
+ <record id="hr_expense_actions_my_unsubmitted_kanban" model="ir.actions.act_window.view">
+ <field name="view_mode">kanban</field>
+ <field name="view_id" ref="hr_expense_kanban_view_header"/>
+ <field name="act_window_id" ref="hr_expense_actions_my_unsubmitted"/>
+ </record>
+
+ <record id="hr_expense_actions_my_all" model="ir.actions.act_window">
+ <field name="name">All My Expenses</field>
+ <field name="res_model">hr.expense</field>
+ <field name="view_mode">tree,kanban,form,graph,pivot,activity</field>
+ <field name="search_view_id" ref="hr_expense_view_search"/>
+ <field name="context">{'search_default_my_expenses': 1}</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_expense_receipt">
+ Did you try the mobile app?
+ </p>
+ <p>Snap pictures of your receipts and let Odoo<br/> automatically create expenses for you.</p>
+ <p>
+ <a href="https://apps.apple.com/be/app/odoo/id1272543640" target="_blank">
+ <img alt="Apple App Store" class="img img-fluid h-100 o_expense_apple_store" src="/hr_expense/static/img/app_store.png"/>
+ </a>
+ <a href="https://play.google.com/store/apps/details?id=com.odoo.mobile" target="_blank" class="o_expense_google_store">
+ <img alt="Google Play Store" class="img img-fluid h-100 o_expense_google_store" src="/hr_expense/static/img/play_store.png"/>
+ </a>
+ </p>
+ </field>
+ </record>
+
+ <!-- Tree & Kanban view for "All My Expenses" with header -->
+ <record id="hr_expense_actions_my_all_tree" model="ir.actions.act_window.view">
+ <field name="view_mode">tree</field>
+ <field name="view_id" ref="view_my_expenses_tree"/>
+ <field name="act_window_id" ref="hr_expense_actions_my_all"/>
+ </record>
+
+ <record id="hr_expense_actions_my_all_kanban" model="ir.actions.act_window.view">
+ <field name="view_mode">kanban</field>
+ <field name="view_id" ref="hr_expense_kanban_view_header"/>
+ <field name="act_window_id" ref="hr_expense_actions_my_all"/>
+ </record>
+
+ <record id="view_product_hr_expense_form" model="ir.ui.view">
+ <field name="name">product.template.expense.form</field>
+ <field name="model">product.template</field>
+ <field name="inherit_id" ref="product.product_template_form_view"/>
+ <field name="arch" type="xml">
+ <div name="options" position="inside">
+ <div>
+ <field name="can_be_expensed"/>
+ <label for="can_be_expensed"/>
+ </div>
+ </div>
+ <xpath expr="//page[@name='general_information']//field[@name='taxes_id']" position="after">
+ <field name="supplier_taxes_id" widget="many2many_tags" attrs="{'invisible':['|',('can_be_expensed','=',False),('purchase_ok','=',True)]}" context="{'default_type_tax_use':'purchase', 'search_default_purchase': 1, 'search_default_service': type == 'service', 'search_default_goods': type == 'consu'}"/>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="product_product_expense_form_view" model="ir.ui.view">
+ <field name="name">product.product.expense.form</field>
+ <field name="model">product.product</field>
+ <field name="arch" type="xml">
+ <form string="Expense Products">
+ <sheet>
+ <widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
+ <field name='product_variant_count' invisible='1'/>
+ <field name="id" invisible="True"/>
+ <field name="image_1920" widget="image" class="oe_avatar" options="{'image_preview': 'image_128'}"/>
+ <div class="oe_title">
+ <label class="oe_edit_only" for="name" string="Product Name"/>
+ <h1><field name="name" placeholder="e.g. Lunch"/></h1>
+ <div name="options" groups="base.group_user" invisible="1">
+ <div>
+ <field name="can_be_expensed"/>
+ <label for="can_be_expensed"/>
+ </div>
+ </div>
+ </div>
+ <group name="product_details">
+ <group string="General Information">
+ <field name="active" invisible="1"/>
+ <field name="type" invisible="1"/>
+ <field name="list_price"/>
+ <field name="standard_price"/>
+ <field name="uom_id" groups="uom.group_uom" options="{'no_create': True}"/>
+ <field name="uom_po_id" invisible="1"/>
+ <label for="default_code"/>
+ <div>
+ <field name="default_code"/>
+ <i class="text-muted oe_edit_only">Use this reference as a subject prefix when submitting by email.</i>
+ </div>
+ <field name="company_id" groups="base.group_multi_company"/>
+ </group>
+ <group string="Accounting">
+ <field name="property_account_expense_id" groups="account.group_account_readonly"/>
+ <field name="supplier_taxes_id" widget="many2many_tags" context="{'default_type_tax_use':'purchase'}"/>
+ <field name="taxes_id" widget="many2many_tags" context="{'default_type_tax_use':'sale'}"/>
+ </group>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record id="product_product_expense_tree_view" model="ir.ui.view">
+ <field name="name">product.product.expense.tree</field>
+ <field name="model">product.product</field>
+ <field eval="50" name="priority"/>
+ <field name="arch" type="xml">
+ <tree string="Product Variants">
+ <field name="default_code"/>
+ <field name="name"/>
+ <field name="product_template_attribute_value_ids" widget="many2many_tags" groups="product.group_product_variant"/>
+ <field name="standard_price"/>
+ <field name="uom_id" options="{'no_open': True, 'no_create': True}" groups="uom.group_uom"/>
+ <field name="barcode"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="hr_expense_product" model="ir.actions.act_window">
+ <field name="name">Expense Products</field>
+ <field name="res_model">product.product</field>
+ <field name="view_mode">kanban,tree,form</field>
+ <field name="search_view_id" ref="product.product_search_form_view"/>
+ <field name="context">{"default_can_be_expensed": 1, 'default_type': 'service'}</field>
+ <field name="domain">[('can_be_expensed', '=', True)]</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ No expense products found. Let's create one!
+ </p><p>
+ Expense products can be reinvoiced to your customers.
+ </p>
+ </field>
+ </record>
+
+ <record id="hr_expense_product_tree" model="ir.actions.act_window.view">
+ <field name="sequence" eval="2"/>
+ <field name="view_mode">tree</field>
+ <field name="act_window_id" ref="hr_expense_product"/>
+ </record>
+
+ <record id="hr_expense_product_kanban" model="ir.actions.act_window.view">
+ <field name="sequence" eval="1"/>
+ <field name="view_mode">kanban</field>
+ <field name="act_window_id" ref="hr_expense_product"/>
+ </record>
+
+ <record id="hr_expense_product_form" model="ir.actions.act_window.view">
+ <field name="sequence" eval="3"/>
+ <field name="view_mode">form</field>
+ <field name="view_id" ref="product_product_expense_form_view"/>
+ <field name="act_window_id" ref="hr_expense_product"/>
+ </record>
+
+ <record id="view_hr_expense_sheet_tree" model="ir.ui.view">
+ <field name="name">hr.expense.sheet.tree</field>
+ <field name="model">hr.expense.sheet</field>
+ <field name="arch" type="xml">
+ <tree string="Expense Reports" js_class="hr_expense_tree_dashboard_upload" sample="1">
+ <field name="employee_id" widget="many2one_avatar_employee"/>
+ <field name="accounting_date" optional="show" groups="account.group_account_manager"/>
+ <field name="create_date" optional="hide"/>
+ <field name="name" string="Expense Report"/>
+ <field name="user_id" optional="hide" widget="many2one_avatar_user"/>
+ <field name="company_id" optional="show" groups="base.group_multi_company"/>
+ <field name="activity_ids" widget="list_activity" optional="show"/>
+ <field name="total_amount" optional="show" sum="Total Amount" decoration-bf="True"/>
+ <field name="currency_id" optional="hide"/>
+ <field name="journal_id" optional="hide"/>
+ <field name="state" optional="show" decoration-info="state == 'draft'" decoration-success="state in ['submit', 'approve', 'post', 'done']" decoration-danger="state == 'cancel'" widget="badge"/>
+ <field name="message_unread" invisible="1"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="view_hr_expense_sheet_dashboard_tree" model="ir.ui.view">
+ <field name="name">hr.expense.sheet.dashboard.tree</field>
+ <field name="model">hr.expense.sheet</field>
+ <field name="priority">20</field>
+ <field name="inherit_id" ref="hr_expense.view_hr_expense_sheet_tree"/>
+ <field name="mode">primary</field>
+ <field name="arch" type="xml">
+ <xpath expr="//tree" position="attributes">
+ <attribute name="js_class">hr_expense_tree_dashboard</attribute>
+ </xpath>
+ </field>
+ </record>
+
+ <!-- Tree view for "My Reports" with header -->
+ <record id="view_hr_expense_sheet_dashboard_tree_header" model="ir.ui.view">
+ <field name="name">hr.expense.sheet.dashboard.tree</field>
+ <field name="model">hr.expense.sheet</field>
+ <field name="priority">20</field>
+ <field name="inherit_id" ref="hr_expense.view_hr_expense_sheet_tree"/>
+ <field name="mode">primary</field>
+ <field name="arch" type="xml">
+ <xpath expr="//tree" position="attributes">
+ <attribute name="js_class">hr_expense_tree_dashboard_header</attribute>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="view_hr_expense_sheet_form" model="ir.ui.view">
+ <field name="name">hr.expense.sheet.form</field>
+ <field name="model">hr.expense.sheet</field>
+ <field eval="25" name="priority"/>
+ <field name="arch" type="xml">
+ <form string="Expense Reports" class="o_expense_sheet">
+ <field name="can_reset" invisible="1"/>
+ <header>
+ <button name="action_submit_sheet" states="draft" string="Submit to Manager" type="object" class="oe_highlight o_expense_sheet_submit"/>
+ <button name="approve_expense_sheets" states="submit" string="Approve" type="object" groups="hr_expense.group_hr_expense_team_approver" class="oe_highlight o_expense_sheet_approve"/>
+ <button name="action_sheet_move_create"
+ string="Post Journal Entries"
+ type="object"
+ class="oe_highlight o_expense_sheet_post"
+ attrs="{'invisible': [('state', '!=', 'approve')]}"
+ groups="account.group_account_invoice"/>
+ <button name="action_register_payment"
+ type="object"
+ class="oe_highlight o_expense_sheet_pay"
+ attrs="{'invisible': [('state', '!=', 'post')]}"
+ context="{'dont_redirect_to_payments': True}"
+ string="Register Payment"
+ groups="account.group_account_invoice"/>
+ <button name="%(hr_expense.hr_expense_refuse_wizard_action)d" states="submit,approve" context="{'hr_expense_refuse_model':'hr.expense.sheet'}" string="Refuse" type="action" groups="hr_expense.group_hr_expense_team_approver" />
+ <button name="reset_expense_sheets" string="Reset to Draft" type="object" attrs="{'invisible': ['|', ('can_reset', '=', False), ('state', 'not in', ['submit', 'cancel'])]}"/>
+ <field name="state" widget="statusbar" statusbar_visible="draft,submit,approve,post,done"/>
+ </header>
+ <sheet>
+ <div class="oe_button_box" name="button_box">
+ <button name="action_get_attachment_view"
+ class="oe_stat_button"
+ icon="fa-file-text-o"
+ type="object">
+ <field name="attachment_number" widget="statinfo" string="Documents"/>
+ </button>
+ </div>
+ <widget name="web_ribbon" title="Paid" bg_color="bg-success" attrs="{'invisible': [('state', '!=', 'done')]}"/>
+ <div class="oe_title">
+ <label for="name" class="oe_edit_only"/>
+ <h1>
+ <field name="name" placeholder="e.g. Trip to NY"/>
+ </h1>
+ </div>
+ <group>
+ <group name="employee_details">
+ <field name="employee_id" context="{'default_company_id': company_id}" widget="many2one_avatar_employee"/>
+ <field name="user_id" domain="[('share', '=', False)]" widget="many2one_avatar_user"/>
+ <field name="payment_mode"/>
+ <field name="address_id" invisible="1" context="{'default_company_id': company_id}"/>
+ <field name="department_id" invisible="1" context="{'default_company_id': company_id}"/>
+ <field name="company_id" groups="base.group_multi_company"/>
+ </group>
+ </group>
+ <notebook>
+ <page name="expenses" string="Expense">
+ <field name="expense_line_ids" nolabel="1" widget="many2many" domain="[('state', '=', 'draft'), ('employee_id', '=', employee_id), ('company_id', '=', company_id)]" options="{'reload_on_button': True}" context="{'form_view_ref' : 'hr_expense.hr_expense_view_form_without_header', 'default_company_id': company_id, 'default_employee_id': employee_id}">
+ <tree decoration-danger="is_refused" editable="bottom">
+ <field name="date" optional="show"/>
+ <field name="name"/>
+ <field name="state" invisible="1"/>
+ <field name="reference" optional="hide"/>
+ <field name="analytic_account_id" optional="show" domain="['|', ('company_id', '=', parent.company_id), ('company_id', '=', False)]" groups="analytic.group_analytic_accounting"/>
+ <field name="analytic_tag_ids" optional="hide" widget="many2many_tags" groups="analytic.group_analytic_tags"/>
+ <field name="account_id" optional="hide"/>
+ <field name="message_unread" invisible="1"/>
+ <field name="attachment_number" string=" "/>
+ <button name="action_get_attachment_view" string="View Attachments" type="object" icon="fa-paperclip"/>
+ <field name="unit_amount" optional="hide" widget="monetary" options="{'currency_field': 'currency_id'}"/>
+ <field name="currency_id" optional="hide"/>
+ <field name="quantity" optional="hide"/>
+ <field name="company_id" invisible="1"/>
+ <field name="tax_ids" optional="show" widget="many2many_tags" groups="account.group_account_readonly" context="{'default_company_id': company_id}"/>
+ <field name="total_amount" optional="show"/>
+ <field name="company_currency_id" invisible="1"/>
+ <field name="total_amount_company" optional="show" groups="base.group_multi_currency"/>
+ <field name="is_refused" invisible="True"/>
+ </tree>
+ </field>
+ <field name="currency_id" invisible="1"/>
+ <group class="oe_subtotal_footer oe_right" colspan="2" name="expense_total">
+ <div class="oe_subtotal_footer_separator oe_inline o_td_label">
+ <label for="total_amount"/>
+ </div>
+ <field name="total_amount" nolabel="1" class="oe_subtotal_footer_separator"/>
+ <field name="amount_residual"
+ class="oe_subtotal_footer_separator"
+ attrs="{'invisible': [('state', 'not in', ('post', 'done'))]}"/>
+ </group>
+ </page>
+ <page name="other_info" string="Other Info">
+ <group>
+ <group>
+ <field name="journal_id" options="{'no_open': True, 'no_create': True}" attrs="{'invisible': [('payment_mode', '!=', 'own_account')]}" context="{'default_company_id': company_id}"/>
+ <field name="bank_journal_id" groups="account.group_account_invoice,account.group_account_readonly" options="{'no_open': True, 'no_create': True}" attrs="{'invisible': [('payment_mode', '!=', 'company_account')]}" context="{'default_company_id': company_id}"/>
+ <field name="accounting_date" groups="account.group_account_invoice,account.group_account_readonly" attrs="{'invisible': [('state', 'not in', ['approve', 'post', 'done'])]}"/>
+ </group>
+ <group>
+ <field name="account_move_id" groups="account.group_account_invoice,account.group_account_readonly" attrs="{'invisible': [('state', 'not in', ['post', 'done'])]}" readonly="1"/>
+ </group>
+ </group>
+ </page>
+ </notebook>
+ </sheet>
+ <div class="oe_chatter">
+ <field name="message_follower_ids"/>
+ <field name="activity_ids"/>
+ <field name="message_ids"/>
+ </div>
+ </form>
+ </field>
+ </record>
+
+ <record id="view_hr_expense_sheet_kanban" model="ir.ui.view">
+ <field name="name">hr.expense.sheet.kanban</field>
+ <field name="model">hr.expense.sheet</field>
+ <field name="arch" type="xml">
+ <kanban class="o_kanban_mobile" sample="1">
+ <field name="name"/>
+ <field name="employee_id"/>
+ <field name="total_amount"/>
+ <field name="accounting_date"/>
+ <field name="state"/>
+ <field name="currency_id"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div t-attf-class="oe_kanban_card oe_kanban_global_click">
+ <div class="row">
+ <div class="col-12">
+ <strong class="o_kanban_record_title"><span><t t-esc="record.name.value"/></span></strong>
+ <strong class="o_kanban_record_subtitle float-right"><span class="text-right"><field name="total_amount" widget="monetary"/></span></strong>
+ </div>
+ </div>
+ <div class="row mt8">
+ <div class="col-6 text-muted">
+ <span><t t-esc="record.employee_id.value"/> <t t-esc="record.accounting_date.value"/></span>
+ </div>
+ <div class="col-6">
+ <span class="float-right text-right">
+ <field name="state" widget="label_selection" options="{'classes': {'draft': 'default', 'submit': 'default', 'cancel': 'danger', 'post': 'warning',
+ 'done': 'success'}}"/>
+ </span>
+ </div>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+
+ <!-- Kanban view without header -->
+ <record id="view_hr_expense_sheet_kanban_no_header" model="ir.ui.view">
+ <field name="name">hr.expense.sheet.kanban</field>
+ <field name="model">hr.expense.sheet</field>
+ <field name="inherit_id" ref="view_hr_expense_sheet_kanban"/>
+ <field name="mode">primary</field>
+ <field name="arch" type="xml">
+ <xpath expr="//kanban" position="attributes">
+ <attribute name="js_class">hr_expense_kanban</attribute>
+ </xpath>
+ </field>
+ </record>
+
+ <!-- Kanban view with header -->
+ <record id="view_hr_expense_sheet_kanban_header" model="ir.ui.view">
+ <field name="name">hr.expense.sheet.kanban</field>
+ <field name="model">hr.expense.sheet</field>
+ <field name="inherit_id" ref="view_hr_expense_sheet_kanban"/>
+ <field name="mode">primary</field>
+ <field name="arch" type="xml">
+ <xpath expr="//kanban" position="attributes">
+ <attribute name="js_class">hr_expense_kanban_header</attribute>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="view_hr_expense_sheet_pivot" model="ir.ui.view">
+ <field name="name">hr.expense.sheet.pivot</field>
+ <field name="model">hr.expense.sheet</field>
+ <field name="arch" type="xml">
+ <pivot string="Expenses Analysis" sample="1">
+ <field name="employee_id" type="row"/>
+ <field name="accounting_date" interval="month" type="col"/>
+ <field name="total_amount" type="measure"/>
+ </pivot>
+ </field>
+ </record>
+
+ <record id="view_hr_expense_sheet_graph" model="ir.ui.view">
+ <field name="name">hr.expense.sheet.graph</field>
+ <field name="model">hr.expense.sheet</field>
+ <field name="arch" type="xml">
+ <graph string="Expenses Analysis" sample="1">
+ <field name="employee_id" type="col"/>
+ <field name="accounting_date" interval="month" type="row"/>
+ <field name="total_amount" type="measure"/>
+ </graph>
+ </field>
+ </record>
+
+
+ <record id="hr_expense_sheet_view_search" model="ir.ui.view">
+ <field name="name">hr.expense.sheet.view.search</field>
+ <field name="model">hr.expense.sheet</field>
+ <field name="arch" type="xml">
+ <search string="Expense">
+ <field string="Expense Report" name="name"/>
+ <field name="accounting_date"/>
+ <separator />
+ <field name="employee_id"/>
+ <field string="Department" name="department_id" operator="child_of"/>
+ <field string="Journal" name="journal_id"/>
+ <filter string="My Reports" name="my_reports" domain="[('employee_id.user_id', '=', uid)]"/>
+ <filter string="My Team" name="my_team_reports" domain="[('employee_id.parent_id.user_id', '=', uid)]" groups="hr_expense.group_hr_expense_manager" help="Expenses of Your Team Member"/>
+ <separator />
+ <filter domain="[('state', '=', 'submit')]" string="To Approve" name="submitted" help="Confirmed Expenses"/>
+ <filter domain="[('state', '=', 'approve')]" string="To Post" name="to_post" help="Approved Expenses"/>
+ <filter domain="[('state', '=', 'post')]" string="To Pay" name="approved" help="Expenses to Invoice"/>
+ <filter domain="[('state', '=', 'cancel')]" string="Refused" name="canceled"/>
+ <separator/>
+ <filter string="Date" name="filter_accounting_date" date="accounting_date"/>
+ <separator/>
+ <filter domain="[('employee_id.active', '=', False)]" string="Former Employees" name="inactive" groups="hr_expense.group_hr_expense_user,hr_expense.group_hr_expense_manager"/>
+ <filter invisible="1" string="Late Activities" name="activities_overdue"
+ domain="[('my_activity_date_deadline', '&lt;', context_today().strftime('%Y-%m-%d'))]"
+ help="Show all records which has next action date is before today"/>
+ <filter invisible="1" string="Today Activities" name="activities_today"
+ domain="[('my_activity_date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/>
+ <filter invisible="1" string="Future Activities" name="activities_upcoming_all"
+ domain="[('my_activity_date_deadline', '&gt;', context_today().strftime('%Y-%m-%d'))
+ ]"/>
+ <group expand="0" string="Group By">
+ <filter string="Employee" name="employee" domain="[]" context="{'group_by': 'employee_id'}"/>
+ <filter string="Department" name="department" domain="[]" context="{'group_by': 'department_id'}"/>
+ <filter string="Company" name="company" domain="[]" context="{'group_by': 'company_id'}" groups="base.group_multi_company"/>
+ <filter string="Date" name="expenses_month" domain="[]" context="{'group_by': 'accounting_date'}" help="Expenses by Date"/>
+ <filter string="Status" domain="[]" context="{'group_by': 'state'}" name="state"/>
+ </group>
+ </search>
+ </field>
+ </record>
+
+ <record id="hr_expense_sheet_view_activity" model="ir.ui.view">
+ <field name="name">hr.expense.sheet.activity</field>
+ <field name="model">hr.expense.sheet</field>
+ <field name="arch" type="xml">
+ <activity string="Expenses">
+ <field name="employee_id"/>
+ <field name="currency_id"/>
+ <templates>
+ <div t-name="activity-box">
+ <img t-att-src="activity_image('hr.employee', 'image_128', record.employee_id.raw_value)" t-att-title="record.employee_id.value" t-att-alt="record.employee_id.value"/>
+ <div>
+ <field name="name" display="full"/>
+ <field name="total_amount" widget="monetary" muted="1" display="full"/>
+ <field name="state" display="right"/>
+ </div>
+ </div>
+ </templates>
+ </activity>
+ </field>
+ </record>
+
+ <record id="action_hr_expense_sheet_my_all" model="ir.actions.act_window">
+ <field name="name">My Reports</field>
+ <field name="res_model">hr.expense.sheet</field>
+ <field name="view_mode">tree,kanban,form,pivot,graph,activity</field>
+ <field name="search_view_id" ref="hr_expense_sheet_view_search"/>
+ <field name="domain">[('state', '!=', 'cancel')]</field>
+ <field name="context">{'search_default_my_reports': 1}</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ No expense report found. Let's create one!
+ </p><p>
+ Once you have created your expense, submit it to your manager who will validate it.
+ </p>
+ </field>
+ </record>
+
+ <!-- Tree & Kanban view for "My Reports" with header -->
+ <record id="action_hr_expense_sheet_my_all_tree" model="ir.actions.act_window.view">
+ <field name="view_mode">tree</field>
+ <field name="view_id" ref="view_hr_expense_sheet_dashboard_tree_header"/>
+ <field name="act_window_id" ref="action_hr_expense_sheet_my_all"/>
+ </record>
+
+ <record id="action_hr_expense_sheet_my_all_kanban" model="ir.actions.act_window.view">
+ <field name="view_mode">kanban</field>
+ <field name="view_id" ref="view_hr_expense_sheet_kanban_header"/>
+ <field name="act_window_id" ref="action_hr_expense_sheet_my_all"/>
+ </record>
+
+ <record id="action_hr_expense_sheet_all_to_approve" model="ir.actions.act_window">
+ <field name="name">Expense Reports to Approve</field>
+ <field name="res_model">hr.expense.sheet</field>
+ <field name="view_mode">tree,kanban,form,pivot,graph,activity</field>
+ <field name="search_view_id" ref="hr_expense_sheet_view_search"/>
+ <field name="domain">[]</field>
+ <field name="context">{'search_default_submitted': 1}</field>
+ <field name="view_id" ref="view_hr_expense_sheet_tree"/>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ No expense reports found
+ </p><p>
+ Approve the new expense reports submitted by the employees you manage.
+ </p>
+ </field>
+ </record>
+
+ <record id="action_hr_expense_sheet_all_to_post" model="ir.actions.act_window">
+ <field name="name">Expense Reports To Post</field>
+ <field name="res_model">hr.expense.sheet</field>
+ <field name="view_mode">tree,kanban,form,pivot,graph</field>
+ <field name="search_view_id" ref="hr_expense_sheet_view_search"/>
+ <field name="domain">[]</field>
+ <field name="context">{'search_default_to_post': 1}</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ No expense reports found
+ </p><p>
+ Post the journal entries of the new expense reports approved by the employees' manager.
+ </p>
+ </field>
+ </record>
+
+ <record id="action_hr_expense_sheet_all_to_pay" model="ir.actions.act_window">
+ <field name="name">Expense Reports To Pay</field>
+ <field name="res_model">hr.expense.sheet</field>
+ <field name="view_mode">tree,kanban,form,pivot,graph</field>
+ <field name="search_view_id" ref="hr_expense_sheet_view_search"/>
+ <field name="domain">[]</field>
+ <field name="context">{'search_default_approved': 1}</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ No expense reports found
+ </p><p>
+ Reimburse the employees who incurred these costs or simply register the corresponding payments.
+ </p>
+ </field>
+ </record>
+
+ <record id="action_hr_expense_sheet_all" model="ir.actions.act_window">
+ <field name="name">All Reports</field>
+ <field name="res_model">hr.expense.sheet</field>
+ <field name="view_mode">tree,kanban,form,pivot,graph</field>
+ <field name="search_view_id" ref="hr_expense_sheet_view_search"/>
+ <field name="domain">[]</field>
+ <field name="context">{}</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ No expense reports found. Let's create one!
+ </p><p>
+ Expense reports regroup all the expenses incurred during a specific event.
+ </p>
+ </field>
+ </record>
+
+ <record id="action_hr_expense_account" model="ir.actions.act_window">
+ <field name="name">Employee Expenses</field>
+ <field name="res_model">hr.expense.sheet</field>
+ <field name="view_mode">tree,kanban,form,pivot,graph</field>
+ <field name="search_view_id" ref="hr_expense_sheet_view_search"/>
+ <field name="view_id" ref="view_hr_expense_sheet_tree"/>
+ <field name="domain">[]</field>
+ <field name="context">{
+ 'search_default_approved': 1,
+ 'search_default_to_post': 1,
+ }
+ </field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ Create a new expense report
+ </p><p>
+ Once you have created your expense, submit it to your manager who will validate it.
+ </p>
+ </field>
+ </record>
+
+ <record id="action_hr_expense_sheet_all_all" model="ir.actions.act_window">
+ <field name="name">All Expense Reports</field>
+ <field name="res_model">hr.expense.sheet</field>
+ <field name="view_mode">graph,pivot,tree,kanban,form</field>
+ <field name="search_view_id" ref="hr_expense_sheet_view_search"/>
+ <field name="domain">[]</field>
+ <field name="context">{}</field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ Create a new expense report
+ </p><p>
+ Once you have created your expense, submit it to your manager who will validate it.
+ </p>
+ </field>
+ </record>
+
+ <record id="action_hr_expense_sheet_department_to_approve" model="ir.actions.act_window">
+ <field name="name">Expense Reports to Approve</field>
+ <field name="res_model">hr.expense.sheet</field>
+ <field name="view_mode">tree,kanban,form,pivot,graph</field>
+ <field name="search_view_id" ref="hr_expense_sheet_view_search"/>
+ <field name="context">{
+ 'search_default_submitted': 1,
+ 'search_default_department_id': [active_id],
+ 'default_department_id': active_id
+ }
+ </field>
+ </record>
+
+ <record id="action_hr_expense_sheet_department_filtered" model="ir.actions.act_window">
+ <field name="name">Expense Reports Analysis</field>
+ <field name="res_model">hr.expense.sheet</field>
+ <field name="view_mode">graph,pivot</field>
+ <field name="context">{
+ 'search_default_department_id': [active_id],
+ 'default_department_id': active_id}
+ </field>
+ <field name="help" type="html">
+ <p class="o_view_nocontent_smiling_face">
+ No data yet!
+ </p>
+ </field>
+ </record>
+
+ <record id="hr_expense_submit_action_server" model="ir.actions.server">
+ <field name="name">Create Report</field>
+ <field name="type">ir.actions.server</field>
+ <field name="model_id" ref="model_hr_expense"/>
+ <field name="binding_model_id" ref="model_hr_expense"/>
+ <field name="binding_view_types">list</field>
+ <field name="state">code</field>
+ <field name="code">
+if records:
+ action = records.action_submit_expenses()
+ </field>
+ </record>
+
+ <record id="hr_expense_sheet_approve_action_server" model="ir.actions.server">
+ <field name="name">Approve Report</field>
+ <field name="type">ir.actions.server</field>
+ <field name="model_id" ref="model_hr_expense_sheet"/>
+ <field name="binding_model_id" ref="model_hr_expense_sheet"/>
+ <field name="binding_view_types">list</field>
+ <field name="groups_id" eval="[(4,ref('hr_expense.group_hr_expense_team_approver'))]"/>
+ <field name="state">code</field>
+ <field name="code">
+if records:
+ action = records.approve_expense_sheets()
+ </field>
+ </record>
+
+ <record id="hr_expense_sheet_post_action_server" model="ir.actions.server">
+ <field name="name">Post Entries</field>
+ <field name="type">ir.actions.server</field>
+ <field name="model_id" ref="model_hr_expense_sheet"/>
+ <field name="binding_model_id" ref="model_hr_expense_sheet"/>
+ <field name="binding_view_types">list</field>
+ <field name="groups_id" eval="[(4,ref('hr_expense.group_hr_expense_team_approver'))]"/>
+ <field name="state">code</field>
+ <field name="code">
+if records:
+ action = records.action_sheet_move_create()
+ </field>
+ </record>
+
+ <record id="action_expense_sheet_register_payment" model="ir.actions.server">
+ <field name="name">Register Payment</field>
+ <field name="groups_id" eval="[(4, ref('account.group_account_invoice'))]"/>
+ <field name="model_id" ref="hr_expense.model_hr_expense_sheet"/>
+ <field name="binding_model_id" ref="hr_expense.model_hr_expense_sheet"/>
+ <field name="binding_view_types">list</field>
+ <field name="state">code</field>
+ <field name="code">
+ if records:
+ action = records.action_register_payment()
+ </field>
+ </record>
+
+ <menuitem id="menu_hr_expense_root" name="Expenses" sequence="100" web_icon="hr_expense,static/description/icon.png"/>
+
+ <menuitem id="menu_hr_expense_my_expenses" name="My Expenses" sequence="1" parent="menu_hr_expense_root" groups="base.group_user"/>
+ <menuitem id="menu_hr_expense_my_expenses_to_submit" sequence="1" parent="menu_hr_expense_my_expenses" action="hr_expense_actions_my_unsubmitted" name="My Expenses to Report"/>
+ <menuitem id="menu_hr_expense_my_expenses_all" sequence="2" parent="menu_hr_expense_my_expenses" action="hr_expense_actions_my_all" name="All My Expenses"/>
+ <menuitem id="menu_hr_expense_sheet_my_reports" sequence="3" parent="menu_hr_expense_my_expenses" action="action_hr_expense_sheet_my_all" name="My Reports"/>
+
+ <menuitem id="menu_hr_expense_report" name="Expense Reports" sequence="2" parent="menu_hr_expense_root"/>
+ <menuitem id="menu_hr_expense_sheet_all_to_approve"
+ name="Reports to Approve" sequence="1" parent="menu_hr_expense_report"
+ action="action_hr_expense_sheet_all_to_approve"
+ groups="hr_expense.group_hr_expense_team_approver"/>
+ <menuitem id="menu_hr_expense_sheet_all_to_post"
+ name="Reports to Post" sequence="2" parent="menu_hr_expense_report"
+ action="action_hr_expense_sheet_all_to_post"
+ groups="account.group_account_invoice,hr_expense.group_hr_expense_manager"/>
+ <menuitem id="menu_hr_expense_sheet_all_to_pay"
+ name="Reports to Pay" sequence="3" parent="menu_hr_expense_report"
+ action="action_hr_expense_sheet_all_to_pay"
+ groups="account.group_account_invoice,hr_expense.group_hr_expense_manager"/>
+ <menuitem id="menu_hr_expense_sheet_all"
+ name="All Reports" sequence="4" parent="menu_hr_expense_report"
+ action="action_hr_expense_sheet_all"
+ groups="account.group_account_invoice,hr_expense.group_hr_expense_manager"/>
+
+ <menuitem id="menu_hr_expense_reports" name="Reporting" sequence="4" parent="menu_hr_expense_root" groups="hr_expense.group_hr_expense_manager"/>
+ <menuitem id="menu_hr_expense_all_expenses" name="Expenses Analysis" sequence="0" parent="menu_hr_expense_reports" action="hr_expense_actions_all"/>
+
+ <menuitem id="menu_hr_expense_configuration" name="Configuration" parent="menu_hr_expense_root"
+ sequence="100"/>
+ <menuitem id="menu_hr_product" name="Expense Products" parent="menu_hr_expense_configuration"
+ action="hr_expense_product" groups="hr_expense.group_hr_expense_manager" sequence="10"/>
+
+ <menuitem id="menu_hr_expense_account_employee_expenses" name="Employee Expenses" sequence="22" parent="account.menu_finance_payables" groups="hr_expense.group_hr_expense_user" action="action_hr_expense_account"/>
+</odoo>
diff --git a/addons/hr_expense/views/mail_activity_views.xml b/addons/hr_expense/views/mail_activity_views.xml
new file mode 100644
index 00000000..0b821272
--- /dev/null
+++ b/addons/hr_expense/views/mail_activity_views.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<odoo>
+ <!-- Activity types config -->
+ <record id="mail_activity_type_action_config_hr_expense" model="ir.actions.act_window">
+ <field name="name">Activity Types</field>
+ <field name="res_model">mail.activity.type</field>
+ <field name="view_mode">tree,form</field>
+ <field name="domain">['|', ('res_model_id', '=', False), ('res_model_id.model', '=', 'hr.expense.sheet')]</field>
+ <field name="context">{'default_res_model': 'hr.expense.sheet'}</field>
+ </record>
+ <menuitem id="hr_expense_menu_config_activity_type"
+ action="mail_activity_type_action_config_hr_expense"
+ parent="menu_hr_expense_configuration"
+ groups="base.group_no_one"/>
+</odoo> \ No newline at end of file
diff --git a/addons/hr_expense/views/res_config_settings_views.xml b/addons/hr_expense/views/res_config_settings_views.xml
new file mode 100644
index 00000000..06a8d945
--- /dev/null
+++ b/addons/hr_expense/views/res_config_settings_views.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <data>
+ <record id="res_config_settings_view_form" model="ir.ui.view">
+ <field name="name">res.config.settings.view.form.inherit.hr.expense</field>
+ <field name="model">res.config.settings</field>
+ <field name="priority" eval="85"/>
+ <field name="inherit_id" ref="base.res_config_settings_view_form"/>
+ <field name="arch" type="xml">
+ <xpath expr="//div[hasclass('settings')]" position="inside">
+ <div class="app_settings_block" data-string="Expenses" string="Expenses" data-key="hr_expense" groups="hr_expense.group_hr_expense_manager">
+ <h2>Expenses</h2>
+ <div class="row mt16 o_settings_container" name="expenses_setting_container">
+ <div class="col-xs-12 col-md-6 o_setting_box"
+ id="create_expense_setting"
+ title="Send an email to this email alias with the receipt in attachment to create an expense in one click. If the first word of the mail subject contains the product's internal reference or the product name, the corresponding product will automatically be set. Type the expense amount in the mail subject to set it on the expense too.">
+ <div class="o_setting_left_pane">
+ <field name="use_mailgateway"/>
+ </div>
+ <div class="o_setting_right_pane">
+ <label string="Incoming Emails" for="use_mailgateway"/>
+ <div class="text-muted">
+ Create expenses from incoming emails
+ </div>
+ <div class="content-group" attrs="{'invisible': ['|', ('use_mailgateway', '=', False), ('alias_domain', 'in', ['localhost', '', False])]}">
+ <div class="mt16">
+ <label for="expense_alias_prefix" string="Alias" class="o_light_label"/>
+ <field name="expense_alias_prefix" class="oe_inline"/>
+ <span>@</span>
+ <field name="alias_domain" class="oe_inline" readonly="1" force_save="1"/>
+ </div>
+ </div>
+ <div class="content-group" attrs="{'invisible': ['|', ('use_mailgateway', '=', False), ('alias_domain', 'not in', ['localhost', '', False])]}">
+ <div class="mt16">
+ <button type="action" name="base_setup.action_general_configuration" icon="fa-arrow-right" string="Setup your domain alias" class="btn-link"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col-lg-6 col-12 o_setting_box" id="hr_payroll_accountant">
+ <div class="o_setting_left_pane">
+ <field name="module_hr_payroll_expense" widget="upgrade_boolean"/>
+ </div>
+ <div class="o_setting_right_pane">
+ <label for="module_hr_payroll_expense" string="Reimburse in Payslip"/>
+ <div class="text-muted">
+ Reimburse expenses in payslips
+ </div>
+ </div>
+ </div>
+ <div class="col-xs-12 col-md-6 o_setting_box" title="use OCR to fill data from a picture of the bill">
+ <div class="o_setting_left_pane">
+ <field name="module_hr_expense_extract" widget="upgrade_boolean"/>
+ </div>
+ <div class="o_setting_right_pane" id="expense_extract_settings">
+ <label string="Expense Digitalization (OCR)" for="module_hr_expense_extract"/>
+ <span class="fa fa-lg fa-building-o" title="Values set here are company-specific."/>
+ <div class="text-muted">
+ Digitalize your receipts with OCR and Artificial Intelligence
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </xpath>
+ </field>
+ </record>
+
+ <record id="action_hr_expense_configuration" model="ir.actions.act_window">
+ <field name="name">Settings</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">res.config.settings</field>
+ <field name="view_mode">form</field>
+ <field name="target">inline</field>
+ <field name="context">{'module' : 'hr_expense', 'bin_size': False}</field>
+ </record>
+
+ <menuitem id="menu_hr_expense_global_settings" name="Settings"
+ parent="menu_hr_expense_configuration" sequence="0" action="action_hr_expense_configuration" groups="base.group_system"/>
+ </data>
+</odoo>