Initial commit: Hr packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:50 +02:00
commit 62531cd146
2820 changed files with 1432848 additions and 0 deletions

View file

@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
from . import wizard

View file

@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'Expenses',
'version': '2.0',
'category': 'Human Resources/Expenses',
'sequence': 70,
'summary': 'Submit, validate and reinvoice employee expenses',
'description': """
Manage expenses by Employees
============================
This application allows you to manage your employees' daily expenses. It gives you access to your employees fee notes and give you the right to complete and validate or refuse the notes. After validation it creates an invoice for the employee.
Employee can encode their own expenses and the validation flow puts it automatically in the accounting after validation by managers.
The whole flow is implemented as:
---------------------------------
* Draft expense
* Submitted by the employee to his manager
* Approved by his manager
* Validation by the accountant and accounting entries creation
This module also uses analytic accounting and is compatible with the invoice on timesheet module so that you are able to automatically re-invoice your customers' expenses if your work by project.
""",
'website': 'https://www.odoo.com/app/expenses',
'depends': ['hr_contract', 'account', 'web_tour'],
'data': [
'security/hr_expense_security.xml',
'security/ir.model.access.csv',
'data/digest_data.xml',
'data/mail_activity_type_data.xml',
'data/mail_alias_data.xml',
'data/mail_message_subtype_data.xml',
'data/mail_templates.xml',
'data/hr_expense_sequence.xml',
'data/hr_expense_data.xml',
'wizard/hr_expense_refuse_reason_views.xml',
'wizard/hr_expense_approve_duplicate_views.xml',
'wizard/hr_expense_split_wizard_views.xml',
'views/hr_expense_views.xml',
'views/mail_activity_views.xml',
'security/ir_rule.xml',
'report/hr_expense_report.xml',
'views/account_move_views.xml',
'views/account_payment_views.xml',
'views/hr_department_views.xml',
'views/res_config_settings_views.xml',
'views/account_journal_dashboard.xml',
],
'demo': ['data/hr_expense_demo.xml'],
'installable': True,
'application': True,
'assets': {
'web.assets_backend': [
'hr_expense/static/src/components/*.js',
'hr_expense/static/src/components/*.xml',
'hr_expense/static/src/mixins/*.js',
'hr_expense/static/src/views/*.js',
'hr_expense/static/src/views/*.xml',
'hr_expense/static/src/scss/hr_expense.scss',
'hr_expense/static/src/xml/**/*',
'hr_expense/static/src/js/tours/*.js',
],
'web.assets_tests': [
'hr_expense/static/tests/tours/expense_upload_tours.js',
],
'web.qunit_mobile_suite_tests': [
'hr_expense/static/tests/expense_mobile_tests.js',
],
},
'license': 'LGPL-3',
}

View file

@ -0,0 +1,17 @@
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<data>
<record id="digest_tip_hr_expense_0" model="digest.tip">
<field name="name">Tip: Snap pictures of your receipts with the remote app</field>
<field name="sequence">1100</field>
<field name="group_id" ref="base.group_user" />
<field name="tip_description" type="html">
<div>
<p class="tip_title">Tip: Snap pictures of your receipts with the remote app</p>
<p class="tip_content">Do not keep your expense tickets in your pockets any longer. Just snap a picture of your receipt and let Odoo digitalizes it for you. The OCR and Artificial Intelligence will fill the data automatically.</p>
<img src="https://download.odoocdn.com/digests/hr_expense/static/src/img/expense.png" class="illustration_border" />
</div>
</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- sgv note - icons will be replaced. Design task is ongoing -->
<record id="expense_product_meal" model="product.product">
<field name="name">Meals</field>
<field name="description">Restaurants, business lunches, etc.</field>
<field name="standard_price">0.0</field>
<field name="type">service</field>
<field name="uom_id" ref="uom.product_uom_unit"/>
<field name="uom_po_id" ref="uom.product_uom_unit"/>
<field name="default_code">FOOD</field>
<field name="can_be_expensed" eval="True"/>
<field name="sale_ok" eval="False"/>
<field name="purchase_ok" eval="False"/>
<field name="image_1920" type="base64" file="hr_expense/static/img/food.svg"/>
</record>
<record id="expense_product_travel_accommodation" model="product.product">
<field name="name">Travel &amp; Accommodation</field>
<field name="description">Hotel, plane ticket, taxi, etc.</field>
<field name="standard_price">0.0</field>
<field name="type">service</field>
<field name="uom_id" ref="uom.product_uom_unit"/>
<field name="uom_po_id" ref="uom.product_uom_unit"/>
<field name="default_code">TRANS &amp; ACC</field>
<field name="can_be_expensed" eval="True"/>
<field name="sale_ok" eval="False"/>
<field name="purchase_ok" eval="False"/>
<field name="image_1920" type="base64" file="hr_expense/static/img/transport.svg"/>
</record>
<record id="expense_product_mileage" model="product.product">
<field name="name">Mileage</field>
<field name="standard_price">1.0</field>
<field name="type">service</field>
<field name="uom_id" ref="uom.product_uom_km"/>
<field name="uom_po_id" ref="uom.product_uom_km"/>
<field name="default_code">MIL</field>
<field name="can_be_expensed" eval="True"/>
<field name="sale_ok" eval="False"/>
<field name="purchase_ok" eval="False"/>
<field name="image_1920" type="base64" file="hr_expense/static/img/mileage.svg"/>
</record>
<record id="expense_product_gift" model="product.product">
<field name="name">Gifts</field>
<field name="description">Gifts to customers or vendors</field>
<field name="standard_price">0.0</field>
<field name="type">service</field>
<field name="uom_id" ref="uom.product_uom_km"/>
<field name="uom_po_id" ref="uom.product_uom_km"/>
<field name="default_code">GIFT</field>
<field name="can_be_expensed" eval="True"/>
<field name="sale_ok" eval="False"/>
<field name="purchase_ok" eval="False"/>
<field name="image_1920" type="base64" file="hr_expense/static/img/gift.svg"/>
</record>
<record id="expense_product_communication" model="product.product">
<field name="name">Communication</field>
<field name="description">Phone bills, postage, etc.</field>
<field name="standard_price">0.0</field>
<field name="type">service</field>
<field name="uom_id" ref="uom.product_uom_km"/>
<field name="uom_po_id" ref="uom.product_uom_km"/>
<field name="default_code">COMM</field>
<field name="can_be_expensed" eval="True"/>
<field name="sale_ok" eval="False"/>
<field name="purchase_ok" eval="False"/>
<field name="image_1920" type="base64" file="hr_expense/static/img/communication.svg"/>
</record>
<record id="product_product_no_cost" model="product.product">
<field name="name">Others</field>
<field name="standard_price">0.0</field>
<field name="type">service</field>
<field name="default_code">EXP_GEN</field>
<field name="categ_id" ref="product.cat_expense"/>
<field name="can_be_expensed" eval="True"/>
<field name="image_1920" type="base64" file="hr_expense/static/img/other.svg"/>
</record>
</data>
<data>
<function model="ir.config_parameter" name="set_param" eval="('hr_expense.use_mailgateway', True)"/>
</data>
</odoo>

View file

@ -0,0 +1,230 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="hr.employee_mit" model="hr.employee">
<field name="address_home_id" ref="base.res_partner_address_3"/>
</record>
<record id="hr_expense_account_journal" model="account.journal">
<field name="name">Expense</field>
<field name="code">EXP</field>
<field name="type">purchase</field>
<!-- avoid being selected as default journal -->
<field name="sequence">99</field>
<field name="alias_name">purchase_expense</field>
</record>
<record id="res_partner_address_fp" model="res.partner">
<field name="name">Pieter Parter's Farm</field>
<field name="parent_id" ref="base.partner_root"/>
<field name="street">Chaussée de Namur, 40</field>
<field name="zip">1367</field>
<field name="city">Grand-Rosière-Hottomont</field>
<field name="country_id" ref="base.be"/>
<field name="type">private</field>
</record>
<record id="hr.employee_fme" model="hr.employee">
<field name="address_home_id" ref="res_partner_address_fp"/>
</record>
<record id="hr.employee_al" model="hr.employee">
<field name="address_home_id" ref="res_partner_address_fp"/>
</record>
<!-- ++++++++++++++ Expense sheet for Admin ++++++++++++++-->
<record id="screen_expense" model="hr.expense">
<field name="name">Screen</field>
<field name="employee_id" ref="hr.employee_admin"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_our_super_product'): 100}"/>
<field name="product_id" ref="product_product_no_cost"/>
<field eval="289.0" name="total_amount"/>
<field name="date" eval="time.strftime('%Y')+'-04-03'"/>
</record>
<record id="laptop_expense" model="hr.expense">
<field name="name">Laptop</field>
<field name="employee_id" ref="hr.employee_admin"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_our_super_product'): 100}"/>
<field name="product_id" ref="product_product_no_cost"/>
<field eval="889.0" name="total_amount"/>
<field name="date" eval="time.strftime('%Y')+'-04-03'"/>
</record>
<record id="travel_admin_by_car_expense" model="hr.expense">
<field name="name">Travel by car</field>
<field name="employee_id" ref="hr.employee_admin"/>
<field name="product_id" ref="expense_product_mileage"/>
<field eval="108.84" name="total_amount"/>
<field name="product_uom_id" ref="uom.product_uom_km"/>
<field eval="320.0" name="quantity"/>
</record>
<record id="breakfast_admin_expense" model="hr.expense">
<field name="name">BreakFast</field>
<field name="employee_id" ref="hr.employee_admin"/>
<field name="product_id" ref="expense_product_meal"/>
<field eval="20" name="total_amount"/>
<field eval="1.0" name="quantity"/>
</record>
<record id="travel_ny_sheet" model="hr.expense.sheet">
<field name="name">Commercial Travel at New York</field>
<field name="employee_id" ref="hr.employee_admin"/>
<field name="state">approve</field>
</record>
<record id="travel_by_air_expense" model="hr.expense">
<field name="name">Travel by Air</field>
<field name="employee_id" ref="hr.employee_admin"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_our_super_product'): 100}"/>
<field name="product_id" ref="expense_product_travel_accommodation"/>
<field eval="700.0" name="total_amount"/>
<field name="product_uom_id" ref="uom.product_uom_unit"/>
<field eval="1.0" name="quantity"/>
<field name="date" eval="time.strftime('%Y-%m')+'-12'"/>
<field name="sheet_id" ref="travel_ny_sheet"/>
</record>
<record id="hotel_bill_expense" model="hr.expense">
<field name="name">Hotel Expenses</field>
<field name="employee_id" ref="hr.employee_admin"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_nebula'): 100}"/>
<field name="product_id" ref="expense_product_travel_accommodation"/>
<field eval="2000.0" name="total_amount"/>
<field name="product_uom_id" ref="uom.product_uom_unit"/>
<field eval="5.0" name="quantity"/>
<field name="date" eval="time.strftime('%Y-%m')+'-17'"/>
<field name="sheet_id" ref="travel_ny_sheet"/>
</record>
<record id="lunch_customer_bill_expense" model="hr.expense">
<field name="name">Lunch with Customer</field>
<field name="employee_id" ref="hr.employee_admin"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_nebula'): 100}"/>
<field name="product_id" ref="expense_product_meal"/>
<field eval="152.8" name="total_amount"/>
<field name="date" eval="time.strftime('%Y-%m')+'-13'"/>
<field eval="1.0" name="quantity"/>
<field name="sheet_id" ref="travel_ny_sheet"/>
</record>
<record id="lunch_bill_expense" model="hr.expense">
<field name="name">Lunch</field>
<field name="employee_id" ref="hr.employee_admin"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_nebula'): 100}"/>
<field name="product_id" ref="expense_product_meal"/>
<field name="date" eval="time.strftime('%Y-%m')+'-15'"/>
<field eval="56.8" name="total_amount"/>
<field eval="1.0" name="quantity"/>
<field name="sheet_id" ref="travel_ny_sheet"/>
</record>
<!-- ++++++++++++++ Expense sheet for Demo ++++++++++++++-->
<record id="customer_meeting_sheet" model="hr.expense.sheet">
<field name="name">Customer meeting</field>
<field name="employee_id" ref="hr.employee_qdp"/>
<field name="state">submit</field>
</record>
<record id="travel_demo_by_car_expense" model="hr.expense">
<field name="name">Travel by Car</field>
<field name="employee_id" ref="hr.employee_qdp"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_our_super_product'): 100}"/>
<field name="product_id" ref="expense_product_mileage"/>
<field eval="120.85" name="total_amount"/>
<field name="product_uom_id" ref="uom.product_uom_km"/>
<field name="date" eval="time.strftime('%Y')+'-01-15'"/>
<field eval="152.0" name="quantity"/>
<field name="sheet_id" ref="customer_meeting_sheet"/>
</record>
<record id="lunch_demo_customer_bill_expense" model="hr.expense">
<field name="name">Lunch with Customer</field>
<field name="employee_id" ref="hr.employee_qdp"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_nebula'): 100}"/>
<field name="product_id" ref="product_product_no_cost"/>
<field name="date" eval="time.strftime('%Y')+'-01-15'"/>
<field eval="152.8" name="total_amount"/>
<field name="sheet_id" ref="customer_meeting_sheet"/>
</record>
<!-- ++++++++++++++ Expense sheet for Keith Byrd ++++++++++++++-->
<record id="team_building_sheet" model="hr.expense.sheet">
<field name="name">Team Building</field>
<field name="employee_id" ref="hr.employee_fme"/>
<field name="state">submit</field>
</record>
<record id="pizzas_bill_expense" model="hr.expense">
<field name="name">Pizzas</field>
<field name="employee_id" ref="hr.employee_fme"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_nebula'): 100}"/>
<field name="product_id" ref="expense_product_meal"/>
<field name="date" eval="time.strftime('%Y-%m')+'-05'"/>
<field eval="154" name="total_amount"/>
<field eval="12.0" name="quantity"/>
<field name="sheet_id" ref="team_building_sheet"/>
</record>
<record id="drinks_bill_expense" model="hr.expense">
<field name="name">Drinks</field>
<field name="employee_id" ref="hr.employee_fme"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_nebula'): 100}"/>
<field name="product_id" ref="expense_product_meal"/>
<field name="date" eval="time.strftime('%Y-%m')+'-05'"/>
<field eval="42.5" name="total_amount"/>
<field eval="17.0" name="quantity"/>
<field name="sheet_id" ref="team_building_sheet"/>
</record>
<record id="paintball_bill_expense" model="hr.expense">
<field name="name">Paintball</field>
<field name="employee_id" ref="hr.employee_fme"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_nebula'): 100}"/>
<field name="product_id" ref="product_product_no_cost"/>
<field name="date" eval="time.strftime('%Y-%m')+'-05'"/>
<field eval="25" name="total_amount"/>
<field name="sheet_id" ref="team_building_sheet"/>
</record>
<!-- ++++++++++++++ Expense sheet for Ronnie Hart ++++++++++++++-->
<record id="office_furniture_sheet" model="hr.expense.sheet">
<field name="name">Office furniture</field>
<field name="employee_id" ref="hr.employee_al"/>
<field name="state">submit</field>
</record>
<record id="chair_bill_expense" model="hr.expense">
<field name="name">Chairs</field>
<field name="employee_id" ref="hr.employee_al"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_nebula'): 100}"/>
<field name="product_id" ref="product_product_no_cost"/>
<field name="date" eval="time.strftime('%Y')+'-06-02'"/>
<field eval="55.75" name="total_amount"/>
<field name="sheet_id" ref="office_furniture_sheet"/>
</record>
<record id="lamp_bill_expense" model="hr.expense">
<field name="name">Lamp</field>
<field name="employee_id" ref="hr.employee_al"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_nebula'): 100}"/>
<field name="product_id" ref="product_product_no_cost"/>
<field name="date" eval="time.strftime('%Y')+'-06-02'"/>
<field eval="28.99" name="total_amount"/>
<field name="sheet_id" ref="office_furniture_sheet"/>
</record>
<!-- ++++++++++++++ Expense for Randall Lewis ++++++++++++++-->
<record id="afterwork_bill_expense" model="hr.expense">
<field name="name">Car tyres</field>
<field name="employee_id" ref="hr.employee_stw"/>
<field name="analytic_distribution" eval="{ref('analytic.analytic_nebula'): 100}"/>
<field name="product_id" ref="product_product_no_cost"/>
<field name="date" eval="time.strftime('%Y')+'-03-15'"/>
<field eval="450.58" name="total_amount"/>
</record>
</data>
</odoo>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="seq_hr_expense_invoice" model="ir.sequence">
<field name="name">Expense invoice</field>
<field name="code">hr.expense.invoice</field>
<field name="prefix">EXP/</field>
<field name="padding">3</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="mail_act_expense_approval" model="mail.activity.type">
<field name="name">Expense Approval</field>
<field name="icon">fa-dollar</field>
<field name="res_model">hr.expense.sheet</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- default alias for expenses -->
<record id="mail_alias_expense" model="mail.alias">
<field name="alias_name">expense</field>
<field name="alias_model_id" ref="model_hr_expense"/>
<field name="alias_user_id" ref="base.user_admin"/>
<field name="alias_contact">employees</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Expense-related subtypes for messaging / Chatter -->
<record id="mt_expense_approved" model="mail.message.subtype">
<field name="name">Approved</field>
<field name="res_model">hr.expense.sheet</field>
<field name="default" eval="True"/>
<field name="description">Expense report approved</field>
</record>
<record id="mt_expense_refused" model="mail.message.subtype">
<field name="name">Refused</field>
<field name="res_model">hr.expense.sheet</field>
<field name="default" eval="True"/>
<field name="description">Expense report refused</field>
</record>
<record id="mt_expense_paid" model="mail.message.subtype">
<field name="name">Paid</field>
<field name="res_model">hr.expense.sheet</field>
<field name="description">Expense report paid</field>
<field name="default" eval="True"/>
</record>
</data>
</odoo>

View file

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<template id="hr_expense_template_refuse_reason">
<p>Your Expense <t t-if="is_sheet">Report </t><t t-esc="name"/> has been refused</p>
<ul class="o_timeline_tracking_value_list">
<li>Reason : <t t-esc="reason"/></li>
</ul>
</template>
<template id="hr_expense_template_register">
<p>Dear <t t-esc="expense.employee_id.name"/>,</p>
<p>
Your expense has been successfully registered.
<t t-if="expense.employee_id.user_id">
You can now submit it to the manager from the following link.
</t>
</p>
<p t-if="expense.product_id">
Category: <t t-esc="expense.product_id.name"/>
</p>
<div t-else="">
<p>Category: not found</p>
<p>The first word of the email subject did not correspond to any category code. You'll have to set the category manually on the expense.</p>
</div>
<p>
Price: <t t-esc="expense.unit_amount"/><t t-esc="expense.currency_id.symbol"/>
</p>
<p t-if="expense.employee_id.user_id">
<br/>
<a t-att-href="'/web#id=%s&amp;model=hr.expense&amp;view_type=form' % (expense.id)" style="background-color: #9E588B; margin-top: 10px; padding: 10px; text-decoration: none; color: #fff; border-radius: 5px; font-size: 16px;">View Expense</a>
</p>
</template>
<template id="hr_expense_template_register_no_user">
<div style="background:#F0F0F0;color:#515166;padding:10px 0px;font-family:Arial,Helvetica,sans-serif;font-size:14px;">
<table style="width:600px;margin:5px auto;">
<tbody>
<tr>
<td><a href="/"><img src="/web/binary/company_logo" style="vertical-align:baseline;max-width:100px;" /></a></td>
</tr>
</tbody>
</table>
<table style="width:600px;margin:0px auto;background:white;border:1px solid #e1e1e1;">
<tbody>
<tr>
<td style="padding:15px 20px 10px 20px;">
<t t-call="hr_expense.hr_expense_template_register"/>
<p style="color:#9E588B;">Powered by <a target="_blank" href="https://www.odoo.com">Odoo</a>.</p>
</td>
</tr>
</tbody>
</table>
</div>
</template>
</data>
</odoo>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,737 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_expense
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:07+0000\n"
"PO-Revision-Date: 2016-02-20 10:40+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: English (Australia) (http://www.transifex.com/odoo/odoo-9/"
"language/en_AU/)\n"
"Language: en_AU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "<strong>Currency:</strong>"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "<strong>Employee:</strong>"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "<strong>Manager:</strong>"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "<strong>Status:</strong>"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "<strong>Total</strong>"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_account_id
msgid "Account"
msgstr ""
#. module: hr_expense
#: model:product.product,name:hr_expense.air_ticket
#: model:product.template,name:hr_expense.air_ticket_product_template
msgid "Air Flight"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_analytic_account_id
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Analytic Account"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "Approve"
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
#: model:mail.message.subtype,name:hr_expense.mt_expense_approved
msgid "Approved"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_bank_journal_id
msgid "Bank Journal"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_product_template_can_be_expensed
msgid "Can be expensed"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
msgid "Cancel"
msgstr "Cancel"
#. module: hr_expense
#: model:product.product,name:hr_expense.car_travel
#: model:product.template,name:hr_expense.car_travel_product_template
msgid "Car Travel Expenses"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Certified honest and conform,<br/>(Date and signature).<br/><br/>"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_my_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_expenses_tree
msgid "Click here to approve"
msgstr ""
#. module: hr_expense
#: model_terms:ir.actions.act_window,help:hr_expense.action_request_approve_expense
#: model_terms:ir.actions.act_window,help:hr_expense.expense_all
msgid "Click here to create new expenses."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_my_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_expenses_tree
msgid "Click here to refuse"
msgstr ""
#. module: hr_expense
#: model:web.tip,description:hr_expense.expense_tip_2
msgid "Click on Action to submit multiple expenses to your manager."
msgstr ""
#. module: hr_expense
#: model_terms:ir.actions.act_window,help:hr_expense.hr_expense_product
msgid "Click to create a new expense category."
msgstr ""
#. module: hr_expense
#: selection:hr.expense,payment_mode:0
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_company_id
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Company"
msgstr ""
#. module: hr_expense
#: model:ir.ui.menu,name:hr_expense.menu_hr_expense_configuration
msgid "Configuration"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Confirmed Expenses"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_create_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_create_uid
msgid "Created by"
msgstr "Created by"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_create_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_create_date
msgid "Created on"
msgstr "Created on"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_currency_id
msgid "Currency"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_date
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Date"
msgstr "Date"
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_hr_department
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_department_id
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Department"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_description
msgid "Description"
msgstr "Description"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_display_name
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_display_name
#: model:ir.model.fields,field_description:hr_expense.field_report_hr_expense_report_expense_display_name
msgid "Display Name"
msgstr "Display Name"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "Documents"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_employee_id
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Employee"
msgstr "Employee"
#. module: hr_expense
#: selection:hr.expense,payment_mode:0
msgid "Employee (to reimburse)"
msgstr ""
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.action_approved_expense
#: model:ir.ui.menu,name:hr_expense.menu_expense_approved
msgid "Employee Expenses"
msgstr ""
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Expense"
msgstr "Expense"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_name
msgid "Expense Description"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_journal_id
msgid "Expense Journal"
msgstr ""
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.hr_expense_product
#: model:ir.ui.menu,name:hr_expense.menu_hr_product
msgid "Expense Products"
msgstr ""
#. module: hr_expense
#: model:mail.message.subtype,description:hr_expense.mt_expense_approved
msgid "Expense approved"
msgstr ""
#. module: hr_expense
#: model:mail.message.subtype,description:hr_expense.mt_expense_confirmed
msgid "Expense confirmed, waiting confirmation"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
msgid "Expense refuse reason"
msgstr ""
#. module: hr_expense
#: model:mail.message.subtype,description:hr_expense.mt_expense_refused
msgid "Expense refused"
msgstr ""
#. module: hr_expense
#: model:ir.ui.menu,name:hr_expense.menu_hr_expense_root
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_my_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_expenses_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
#: model:product.category,name:hr_expense.cat_expense
msgid "Expenses"
msgstr ""
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.action_hr_expense_report_filtered
#: model:ir.actions.act_window,name:hr_expense.hr_expense_action
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_view_graph
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_view_pivot
msgid "Expenses Analysis"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Expenses Month"
msgstr ""
#. module: hr_expense
#: model:mail.message.subtype,name:hr_expense.mt_department_expense_confirmed
msgid "Expenses To Approve"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Expenses by Month"
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:209
#, python-format
msgid "Expenses must belong to the same Employee."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:212
#, python-format
msgid ""
"Expenses must have an expense journal specified to generate accounting "
"entries."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Expenses of Your Team Member"
msgstr ""
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.action_request_approve_expense
#: model:ir.actions.act_window,name:hr_expense.hr_expense_action_from_department
#: model:ir.model.fields,field_description:hr_expense.field_hr_department_expense_to_approve_count
msgid "Expenses to Approve"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Expenses to Invoice"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Former Employees"
msgstr ""
#. module: hr_expense
#: model_terms:ir.actions.act_window,help:hr_expense.action_approved_expense
msgid ""
"From here the accountant will be able to approve as well as refuse the "
"expenses which are verified by the HR Manager."
msgstr ""
#. module: hr_expense
#: model:ir.actions.server,name:hr_expense.hr_expense_entry_action_server
msgid "Generate Accounting Entries"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Group By"
msgstr ""
#. module: hr_expense
#: model:ir.actions.report.xml,name:hr_expense.action_report_hr_expense
msgid "HR Expense"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "HR Expenses"
msgstr ""
#. module: hr_expense
#: model:product.product,name:hr_expense.hotel_rent
#: model:product.template,name:hr_expense.hotel_rent_product_template
msgid "Hotel Accommodation"
msgstr ""
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_hr_expense_refuse_wizard
msgid "Hr Expense refuse Reason wizard"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_id
#: model:ir.model.fields,field_description:hr_expense.field_report_hr_expense_report_expense_id
msgid "ID"
msgstr "ID"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_account_move_id
msgid "Journal Entry"
msgstr ""
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_account_move_line
msgid "Journal Item"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense___last_update
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard___last_update
#: model:ir.model.fields,field_description:hr_expense.field_report_hr_expense_report_expense___last_update
msgid "Last Modified on"
msgstr "Last Modified on"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_write_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_write_uid
msgid "Last Updated by"
msgstr "Last Updated by"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_write_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_write_date
msgid "Last Updated on"
msgstr "Last Updated on"
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.expense_all
#: model:ir.ui.menu,name:hr_expense.menu_expense_all
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "My Expenses"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "My Team Expenses"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Name"
msgstr "Name"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "New"
msgstr "New"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "New Expense"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "New Mail"
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:276
#, python-format
msgid ""
"No Expense account found for the product %s (or for it's category), please "
"configure one."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:244
#, python-format
msgid "No Home Address found for the employee %s, please configure one."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:240
#, python-format
msgid "No credit account found for the %s journal, please configure one."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "Notes..."
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_attachment_number
msgid "Number of Attachments"
msgstr ""
#. module: hr_expense
#: model_terms:ir.actions.act_window,help:hr_expense.action_request_approve_expense
#: model_terms:ir.actions.act_window,help:hr_expense.expense_all
msgid ""
"Once you have created your expense, submit it to your manager who will "
"validate it."
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
msgid "Paid"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_payment_mode
msgid "Payment By"
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:280
#, python-format
msgid ""
"Please configure Default Expense account for Product expense: "
"`property_account_expense_categ_id`."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "Post Journal Entries"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Price"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_product_id
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Product"
msgstr ""
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_product_template
msgid "Product Template"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Qty"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_quantity
msgid "Quantity"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_description
msgid "Reason"
msgstr "OK"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
msgid "Reason to refuse expense."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
msgid "Refuse"
msgstr ""
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.hr_expense_refuse_wizard_action
msgid "Refuse Expense"
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
#: model:mail.message.subtype,name:hr_expense.mt_expense_refused
msgid "Refused"
msgstr ""
#. module: hr_expense
#: model:ir.ui.menu,name:hr_expense.menu_hr_expense
msgid "Reporting"
msgstr ""
#. module: hr_expense
#: model:web.tip,description:hr_expense.expense_tip_1
msgid "Select the lines you want to submit to be reimbursed."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:77
#, python-format
msgid ""
"Selected Unit of Measure does not belong to the same category as the product "
"Unit of Measure"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "Set to Draft"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,help:hr_expense.field_product_template_can_be_expensed
msgid "Specify whether the product can be selected in an HR expense."
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_state
msgid "Status"
msgstr ""
#. module: hr_expense
#: model:ir.actions.server,name:hr_expense.hr_expense_submit_action_server
msgid "Submit Expenses"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_my_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_expenses_tree
msgid "Submit to Manager"
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
msgid "Submitted"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_untaxed_amount
msgid "Subtotal"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Taxe(s)"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_tax_ids
msgid "Taxes"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,help:hr_expense.field_hr_expense_journal_id
msgid "The journal used when the expense is done."
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,help:hr_expense.field_hr_expense_bank_journal_id
msgid "The payment method used when the expense is paid by the company."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "This document must be dated and signed for reimbursement."
msgstr ""
#. module: hr_expense
#: model:ir.ui.menu,name:hr_expense.menu_expense_to_approve
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
#: model:mail.message.subtype,name:hr_expense.mt_expense_confirmed
msgid "To Approve"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "To Pay"
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
msgid "To Submit"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_total_amount
msgid "Total"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_my_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_expenses_tree
msgid "Total Amount"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_unit_amount
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Unit Price"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_product_uom_id
msgid "Unit of Measure"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "UoM"
msgstr ""
#. module: hr_expense
#: model:web.tip,description:hr_expense.expense_tip_3
msgid ""
"Use the messaging tool to log a note and attach a document to the expense. "
"(e.g. scan of the bill)"
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
msgid "Waiting Payment"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,help:hr_expense.field_hr_expense_state
msgid ""
"When the expense request is created the status is 'To Submit'.\n"
" It is submitted by the employee and request is sent to manager, the status "
"is 'Submitted'. \n"
"If the manager approve it, the status is 'Approved'.\n"
" If the accountant genrate the accounting entries for the expense request, "
"the status is 'Waiting Payment'."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:111
#, python-format
msgid "You can only delete draft or refused expenses!"
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:206
#, python-format
msgid "You can only generate accounting entry for approved expense(s)."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:117
#, python-format
msgid "You can only submit draft expenses!"
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:128
#, python-format
msgid ""
"Your Expense %s has been refused.<br/><ul "
"class=o_timeline_tracking_value_list><li>Reason<span> : </span><span "
"class=o_timeline_tracking_value>%s</span></li></ul>"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "e.g. Business lunch with X"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
msgid "or"
msgstr "or"
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_report_hr_expense_report_expense
msgid "report.hr_expense.report_expense"
msgstr ""
#. module: hr_expense
#. odoo-python
#: code:addons/hr_expense/models/hr_expense.py:0
#, python-format
msgid ""
"The private address of the employee is required to post the expense report. "
"Please add it on the employee form."
msgstr ""

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,208 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_expense
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~15.2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-26 14:21+0000\n"
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: Spanish (Chile) (https://www.transifex.com/odoo/teams/41243/"
"es_CL/)\n"
"Language: es_CL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_account_analytic_account
msgid "Analytic Account"
msgstr "Cuenta analítica"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_approve_duplicate_view_form
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_split
msgid "Cancel"
msgstr "Cancelar"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__company_id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet__company_id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split__company_id
#: model:ir.model.fields.selection,name:hr_expense.selection__hr_expense__payment_mode__company_account
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_sheet_view_search
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_view_search
msgid "Company"
msgstr "Compañía"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__create_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_approve_duplicate__create_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard__create_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet__create_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split__create_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split_wizard__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__create_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_approve_duplicate__create_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard__create_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet__create_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split__create_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split_wizard__create_date
msgid "Created on"
msgstr "Creado en"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__currency_id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet__currency_id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split__currency_id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split_wizard__currency_id
msgid "Currency"
msgstr "Moneda"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__name
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split__name
msgid "Description"
msgstr "Descripción"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__display_name
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_approve_duplicate__display_name
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard__display_name
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet__display_name
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split__display_name
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split_wizard__display_name
msgid "Display Name"
msgstr "Nombre mostrado"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_sheet_view_search
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_view_search
msgid "Group By"
msgstr "Agrupar por"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_approve_duplicate__id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard__id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet__id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split__id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split_wizard__id
msgid "ID"
msgstr "ID (identificación)"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense____last_update
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_approve_duplicate____last_update
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard____last_update
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet____last_update
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split____last_update
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split_wizard____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__write_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_approve_duplicate__write_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard__write_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet__write_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split__write_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split_wizard__write_uid
msgid "Last Updated by"
msgstr "Última actualización de"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__write_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_approve_duplicate__write_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard__write_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet__write_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split__write_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split_wizard__write_date
msgid "Last Updated on"
msgstr "Última actualización en"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense_sheet
msgid "Price"
msgstr "Precio"
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_product_template
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split__product_id
msgid "Product"
msgstr "Producto"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense_sheet
msgid "Qty"
msgstr "Ctdad"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__quantity
msgid "Quantity"
msgstr "Cantidad"
#. module: hr_expense
#: model:ir.ui.menu,name:hr_expense.menu_hr_expense_reports
msgid "Reporting"
msgstr "Informes"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__state
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet__state
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_sheet_view_search
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_view_search
msgid "Status"
msgstr "Estado"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet__total_amount_taxes
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_split_wizard__total_amount_taxes
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_split
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense_sheet
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_sheet_form
msgid "Taxes"
msgstr "Impuestos"
#. module: hr_expense
#. odoo-python
#: code:addons/hr_expense/models/hr_expense.py:0
#, python-format
msgid ""
"The private address of the employee is required to post the expense report. "
"Please add it on the employee form."
msgstr ""
"Se requiere la dirección privada del empleado para publicar el informe de "
"gastos. Por favor, agréguelo en el formulario de empleado."
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__untaxed_amount
msgid "Total Untaxed Amount In Currency"
msgstr "Total neto en la divisa"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__unit_amount
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_view_expenses_analysis_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense_sheet
msgid "Unit Price"
msgstr "Precio un."
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense__product_uom_id
msgid "Unit of Measure"
msgstr "Unidad de medida"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet__untaxed_amount
msgid "Untaxed Amount"
msgstr "Total neto"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,743 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_expense
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:07+0000\n"
"PO-Revision-Date: 2016-06-08 07:10+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: Telugu (http://www.transifex.com/odoo/odoo-9/language/te/)\n"
"Language: te\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
#, fuzzy
msgid "<strong>Currency:</strong>"
msgstr "Vivarana"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "<strong>Employee:</strong>"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
#, fuzzy
msgid "<strong>Manager:</strong>"
msgstr "Moththamu"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
#, fuzzy
msgid "<strong>Status:</strong>"
msgstr "Moththamu"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "<strong>Total</strong>"
msgstr "Moththamu"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_account_id
msgid "Account"
msgstr ""
#. module: hr_expense
#: model:product.product,name:hr_expense.air_ticket
#: model:product.template,name:hr_expense.air_ticket_product_template
msgid "Air Flight"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_analytic_account_id
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Analytic Account"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "Approve"
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
#: model:mail.message.subtype,name:hr_expense.mt_expense_approved
msgid "Approved"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_bank_journal_id
msgid "Bank Journal"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_product_template_can_be_expensed
msgid "Can be expensed"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
msgid "Cancel"
msgstr ""
#. module: hr_expense
#: model:product.product,name:hr_expense.car_travel
#: model:product.template,name:hr_expense.car_travel_product_template
msgid "Car Travel Expenses"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Certified honest and conform,<br/>(Date and signature).<br/><br/>"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_my_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_expenses_tree
msgid "Click here to approve"
msgstr ""
#. module: hr_expense
#: model_terms:ir.actions.act_window,help:hr_expense.action_request_approve_expense
#: model_terms:ir.actions.act_window,help:hr_expense.expense_all
msgid "Click here to create new expenses."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_my_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_expenses_tree
msgid "Click here to refuse"
msgstr ""
#. module: hr_expense
#: model:web.tip,description:hr_expense.expense_tip_2
msgid "Click on Action to submit multiple expenses to your manager."
msgstr ""
#. module: hr_expense
#: model_terms:ir.actions.act_window,help:hr_expense.hr_expense_product
msgid "Click to create a new expense category."
msgstr ""
#. module: hr_expense
#: selection:hr.expense,payment_mode:0
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_company_id
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Company"
msgstr "కంపెనీ"
#. module: hr_expense
#: model:ir.ui.menu,name:hr_expense.menu_hr_expense_configuration
msgid "Configuration"
msgstr "స్వరూపణం"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Confirmed Expenses"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_create_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_create_uid
msgid "Created by"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_create_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_create_date
msgid "Created on"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_currency_id
msgid "Currency"
msgstr "ద్రవ్యం"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_date
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Date"
msgstr "తేదీ"
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_hr_department
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_department_id
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Department"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_description
msgid "Description"
msgstr "వివరణ"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_display_name
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_display_name
#: model:ir.model.fields,field_description:hr_expense.field_report_hr_expense_report_expense_display_name
msgid "Display Name"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "Documents"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_employee_id
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Employee"
msgstr ""
#. module: hr_expense
#: selection:hr.expense,payment_mode:0
msgid "Employee (to reimburse)"
msgstr ""
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.action_approved_expense
#: model:ir.ui.menu,name:hr_expense.menu_expense_approved
msgid "Employee Expenses"
msgstr ""
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Expense"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_name
msgid "Expense Description"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_journal_id
msgid "Expense Journal"
msgstr ""
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.hr_expense_product
#: model:ir.ui.menu,name:hr_expense.menu_hr_product
msgid "Expense Products"
msgstr ""
#. module: hr_expense
#: model:mail.message.subtype,description:hr_expense.mt_expense_approved
msgid "Expense approved"
msgstr ""
#. module: hr_expense
#: model:mail.message.subtype,description:hr_expense.mt_expense_confirmed
msgid "Expense confirmed, waiting confirmation"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
msgid "Expense refuse reason"
msgstr ""
#. module: hr_expense
#: model:mail.message.subtype,description:hr_expense.mt_expense_refused
msgid "Expense refused"
msgstr ""
#. module: hr_expense
#: model:ir.ui.menu,name:hr_expense.menu_hr_expense_root
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_my_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_expenses_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
#: model:product.category,name:hr_expense.cat_expense
msgid "Expenses"
msgstr ""
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.action_hr_expense_report_filtered
#: model:ir.actions.act_window,name:hr_expense.hr_expense_action
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_view_graph
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_view_pivot
msgid "Expenses Analysis"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Expenses Month"
msgstr ""
#. module: hr_expense
#: model:mail.message.subtype,name:hr_expense.mt_department_expense_confirmed
msgid "Expenses To Approve"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Expenses by Month"
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:209
#, python-format
msgid "Expenses must belong to the same Employee."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:212
#, python-format
msgid ""
"Expenses must have an expense journal specified to generate accounting "
"entries."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Expenses of Your Team Member"
msgstr ""
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.action_request_approve_expense
#: model:ir.actions.act_window,name:hr_expense.hr_expense_action_from_department
#: model:ir.model.fields,field_description:hr_expense.field_hr_department_expense_to_approve_count
msgid "Expenses to Approve"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Expenses to Invoice"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Former Employees"
msgstr ""
#. module: hr_expense
#: model_terms:ir.actions.act_window,help:hr_expense.action_approved_expense
msgid ""
"From here the accountant will be able to approve as well as refuse the "
"expenses which are verified by the HR Manager."
msgstr ""
#. module: hr_expense
#: model:ir.actions.server,name:hr_expense.hr_expense_entry_action_server
msgid "Generate Accounting Entries"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Group By"
msgstr ""
#. module: hr_expense
#: model:ir.actions.report.xml,name:hr_expense.action_report_hr_expense
msgid "HR Expense"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "HR Expenses"
msgstr ""
#. module: hr_expense
#: model:product.product,name:hr_expense.hotel_rent
#: model:product.template,name:hr_expense.hotel_rent_product_template
msgid "Hotel Accommodation"
msgstr ""
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_hr_expense_refuse_wizard
msgid "Hr Expense refuse Reason wizard"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_id
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_id
#: model:ir.model.fields,field_description:hr_expense.field_report_hr_expense_report_expense_id
msgid "ID"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_account_move_id
msgid "Journal Entry"
msgstr ""
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_account_move_line
msgid "Journal Item"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense___last_update
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard___last_update
#: model:ir.model.fields,field_description:hr_expense.field_report_hr_expense_report_expense___last_update
msgid "Last Modified on"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_write_uid
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_write_uid
msgid "Last Updated by"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_write_date
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_write_date
msgid "Last Updated on"
msgstr ""
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.expense_all
#: model:ir.ui.menu,name:hr_expense.menu_expense_all
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "My Expenses"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "My Team Expenses"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Name"
msgstr "పేరు"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "New"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "New Expense"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "New Mail"
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:276
#, python-format
msgid ""
"No Expense account found for the product %s (or for it's category), please "
"configure one."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:244
#, python-format
msgid "No Home Address found for the employee %s, please configure one."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:240
#, python-format
msgid "No credit account found for the %s journal, please configure one."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "Notes..."
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_attachment_number
msgid "Number of Attachments"
msgstr ""
#. module: hr_expense
#: model_terms:ir.actions.act_window,help:hr_expense.action_request_approve_expense
#: model_terms:ir.actions.act_window,help:hr_expense.expense_all
msgid ""
"Once you have created your expense, submit it to your manager who will "
"validate it."
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
msgid "Paid"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_payment_mode
msgid "Payment By"
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:280
#, python-format
msgid ""
"Please configure Default Expense account for Product expense: "
"`property_account_expense_categ_id`."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "Post Journal Entries"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Price"
msgstr "ధర"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_product_id
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "Product"
msgstr ""
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_product_template
msgid "Product Template"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Qty"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_quantity
msgid "Quantity"
msgstr "పరిమాణం"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard_description
msgid "Reason"
msgstr "సరే"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
msgid "Reason to refuse expense."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
msgid "Refuse"
msgstr ""
#. module: hr_expense
#: model:ir.actions.act_window,name:hr_expense.hr_expense_refuse_wizard_action
msgid "Refuse Expense"
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
#: model:mail.message.subtype,name:hr_expense.mt_expense_refused
msgid "Refused"
msgstr ""
#. module: hr_expense
#: model:ir.ui.menu,name:hr_expense.menu_hr_expense
msgid "Reporting"
msgstr ""
#. module: hr_expense
#: model:web.tip,description:hr_expense.expense_tip_1
msgid "Select the lines you want to submit to be reimbursed."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:77
#, python-format
msgid ""
"Selected Unit of Measure does not belong to the same category as the product "
"Unit of Measure"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "Set to Draft"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,help:hr_expense.field_product_template_can_be_expensed
msgid "Specify whether the product can be selected in an HR expense."
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_state
msgid "Status"
msgstr "స్థితి"
#. module: hr_expense
#: model:ir.actions.server,name:hr_expense.hr_expense_submit_action_server
msgid "Submit Expenses"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_my_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_expenses_tree
msgid "Submit to Manager"
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
msgid "Submitted"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_untaxed_amount
msgid "Subtotal"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Taxe(s)"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_tax_ids
msgid "Taxes"
msgstr "పన్నులు"
#. module: hr_expense
#: model:ir.model.fields,help:hr_expense.field_hr_expense_journal_id
msgid "The journal used when the expense is done."
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,help:hr_expense.field_hr_expense_bank_journal_id
msgid "The payment method used when the expense is paid by the company."
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "This document must be dated and signed for reimbursement."
msgstr ""
#. module: hr_expense
#: model:ir.ui.menu,name:hr_expense.menu_expense_to_approve
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
#: model:mail.message.subtype,name:hr_expense.mt_expense_confirmed
msgid "To Approve"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter
msgid "To Pay"
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
msgid "To Submit"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_total_amount
msgid "Total"
msgstr "మొత్తం"
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_my_tree
#: model_terms:ir.ui.view,arch_db:hr_expense.view_expenses_tree
msgid "Total Amount"
msgstr "మొత్తం"
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_unit_amount
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "Unit Price"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,field_description:hr_expense.field_hr_expense_product_uom_id
msgid "Unit of Measure"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.report_expense
msgid "UoM"
msgstr ""
#. module: hr_expense
#: model:web.tip,description:hr_expense.expense_tip_3
msgid ""
"Use the messaging tool to log a note and attach a document to the expense. "
"(e.g. scan of the bill)"
msgstr ""
#. module: hr_expense
#: selection:hr.expense,state:0
msgid "Waiting Payment"
msgstr ""
#. module: hr_expense
#: model:ir.model.fields,help:hr_expense.field_hr_expense_state
msgid ""
"When the expense request is created the status is 'To Submit'.\n"
" It is submitted by the employee and request is sent to manager, the status "
"is 'Submitted'. \n"
"If the manager approve it, the status is 'Approved'.\n"
" If the accountant genrate the accounting entries for the expense request, "
"the status is 'Waiting Payment'."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:111
#, python-format
msgid "You can only delete draft or refused expenses!"
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:206
#, python-format
msgid "You can only generate accounting entry for approved expense(s)."
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:117
#, python-format
msgid "You can only submit draft expenses!"
msgstr ""
#. module: hr_expense
#: code:addons/hr_expense/models/hr_expense.py:128
#, python-format
msgid ""
"Your Expense %s has been refused.<br/><ul "
"class=o_timeline_tracking_value_list><li>Reason<span> : </span><span "
"class=o_timeline_tracking_value>%s</span></li></ul>"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_form_view
msgid "e.g. Business lunch with X"
msgstr ""
#. module: hr_expense
#: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form
msgid "or"
msgstr ""
#. module: hr_expense
#: model:ir.model,name:hr_expense.model_report_hr_expense_report_expense
msgid "report.hr_expense.report_expense"
msgstr ""
#~ msgid "Action Needed"
#~ msgstr "Charya Avasaram"
#. module: hr_expense
#. odoo-python
#: code:addons/hr_expense/models/hr_expense.py:0
#, python-format
msgid ""
"The private address of the employee is required to post the expense report. "
"Please add it on the employee form."
msgstr ""
"ఖర్చు నివేదికను పోస్ట్ చేయడానికి ఉద్యోగి యొక్క ప్రైవేట్ చిరునామా అవసరం. దయచేసి దాన్ని ఉద్యోగి ఫారమ్‌లో జోడించండి."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
from . import hr_employee
from . import account_move
from . import account_move_line
from . import account_payment
from . import hr_department
from . import hr_expense
from . import ir_attachment
from . import product_product
from . import product_template
from . import res_config_settings
from . import account_journal_dashboard
from . import res_company
from . import analytic

View file

@ -0,0 +1,77 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, models
from odoo.tools.misc import formatLang
from odoo.addons.account.models.account_journal_dashboard import group_by_journal
class AccountJournal(models.Model):
_inherit = "account.journal"
def _get_expenses_to_pay_query(self):
"""
Returns a tuple containing as it's first element the SQL query used to
gather the expenses in reported state data, and the arguments
dictionary to use to run it as it's second.
"""
query = """SELECT total_amount as amount_total, currency_id AS currency
FROM hr_expense_sheet
WHERE state IN ('approve', 'post')
and journal_id = %(journal_id)s"""
return (query, {'journal_id': self.id})
def get_journal_dashboard_datas(self):
res = super(AccountJournal, self).get_journal_dashboard_datas()
#add the number and sum of expenses to pay to the json defining the accounting dashboard data
(query, query_args) = self._get_expenses_to_pay_query()
self.env.cr.execute(query, query_args)
query_results_to_pay = self.env.cr.dictfetchall()
(number_to_pay, sum_to_pay) = self._count_results_and_sum_amounts(query_results_to_pay, self.company_id.currency_id)
res['number_expenses_to_pay'] = number_to_pay
res['sum_expenses_to_pay'] = formatLang(self.env, sum_to_pay or 0.0, currency_obj=self.currency_id or self.company_id.currency_id)
return res
def _prepare_expense_sheet_data_domain(self):
return [
('state', '=', 'post'),
('journal_id', 'in', self.ids),
]
def _get_expense_to_pay_query(self):
return self.env['hr.expense.sheet']._where_calc(self._prepare_expense_sheet_data_domain())
def _fill_sale_purchase_dashboard_data(self, dashboard_data):
super(AccountJournal, self)._fill_sale_purchase_dashboard_data(dashboard_data)
sale_purchase_journals = self.filtered(lambda journal: journal.type in ('sale', 'purchase'))
if not sale_purchase_journals:
return
field_list = [
"hr_expense_sheet.journal_id",
"hr_expense_sheet.total_amount AS amount_total",
"hr_expense_sheet.currency_id AS currency",
]
query, params = sale_purchase_journals._get_expense_to_pay_query().select(*field_list)
self.env.cr.execute(query, params)
query_results_to_pay = group_by_journal(self.env.cr.dictfetchall())
curr_cache = {}
for journal in sale_purchase_journals:
currency = journal.currency_id or journal.company_id.currency_id
(number_expenses_to_pay, sum_expenses_to_pay) = self._count_results_and_sum_amounts(query_results_to_pay[journal.id], currency, curr_cache=curr_cache)
dashboard_data[journal.id].update({
'number_expenses_to_pay': number_expenses_to_pay,
'sum_expenses_to_pay': currency.format(sum_expenses_to_pay),
})
def open_expenses_action(self):
action = self.env['ir.actions.act_window']._for_xml_id('hr_expense.action_hr_expense_sheet_all_all')
action['context'] = {
'search_default_approved': 1,
'search_default_to_post': 1,
'search_default_journal_id': self.id,
'default_journal_id': self.id,
}
action['view_mode'] = 'tree,form'
action['views'] = [(k,v) for k,v in action['views'] if v in ['tree', 'form']]
action['domain'] = self._prepare_expense_sheet_data_domain()
return action

View file

@ -0,0 +1,101 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api, _
from odoo.tools.misc import frozendict
class AccountMove(models.Model):
_inherit = "account.move"
expense_sheet_id = fields.One2many('hr.expense.sheet', 'account_move_id')
@api.depends('partner_id', 'expense_sheet_id', 'company_id')
def _compute_commercial_partner_id(self):
own_expense_moves = self.filtered(lambda move: move.sudo().expense_sheet_id.payment_mode == 'own_account')
for move in own_expense_moves:
if move.expense_sheet_id.payment_mode == 'own_account':
move.commercial_partner_id = (
move.partner_id.commercial_partner_id
if move.partner_id.commercial_partner_id != move.company_id.partner_id
else move.partner_id
)
super(AccountMove, self - own_expense_moves)._compute_commercial_partner_id()
def action_open_expense_report(self):
self.ensure_one()
return {
'name': self.expense_sheet_id.name,
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
'res_model': 'hr.expense.sheet',
'res_id': self.expense_sheet_id.id
}
# Expenses can be written on journal other than purchase, hence don't include them in the constraint check
def _check_journal_move_type(self):
return super(AccountMove, self.filtered(lambda x: not x.expense_sheet_id))._check_journal_move_type()
def _creation_message(self):
if self.expense_sheet_id:
return _("Expense entry Created")
return super()._creation_message()
@api.depends('expense_sheet_id.payment_mode')
def _compute_payment_state(self):
company_paid = self.filtered(lambda m: m.expense_sheet_id.payment_mode == 'company_account')
for move in company_paid:
move.payment_state = 'paid'
super(AccountMove, self - company_paid)._compute_payment_state()
@api.depends('expense_sheet_id')
def _compute_needed_terms(self):
# EXTENDS account
# We want to set the account destination based on the 'payment_mode'.
super()._compute_needed_terms()
for move in self:
if move.expense_sheet_id and move.expense_sheet_id.payment_mode == 'company_account':
term_lines = move.line_ids.filtered(lambda l: l.display_type != 'payment_term')
move.needed_terms = {
frozendict(
{
"move_id": move.id,
"date_maturity": move.expense_sheet_id.accounting_date
or fields.Date.context_today(move.expense_sheet_id),
}
): {
"balance": -sum(term_lines.mapped("balance")),
"amount_currency": -sum(term_lines.mapped("amount_currency")),
"name": "",
"account_id": move.expense_sheet_id.expense_line_ids[0]._get_expense_account_destination(),
}
}
def _reverse_moves(self, default_values_list=None, cancel=False):
# Extends account
# Reversing vendor bills that represent employee reimbursements should clear them from the expense sheet such that another
# can be generated in place.
own_account_moves = self.filtered(lambda move: move.expense_sheet_id.payment_mode == 'own_account')
own_account_moves.expense_sheet_id.sudo().write({
'state': 'approve',
'account_move_id': False,
})
own_account_moves.ref = False # else, when restarting the expense flow we get duplicate issue on vendor.bill
return super()._reverse_moves(default_values_list=default_values_list, cancel=cancel)
def unlink(self):
if self.expense_sheet_id:
self.expense_sheet_id.write({
'state': 'approve',
'account_move_id': False, # cannot change to delete='set null' in stable
})
return super().unlink()
def button_draft(self):
# EXTENDS account
employee_expense_sheets = self.expense_sheet_id.filtered(
lambda expense_sheet: expense_sheet.payment_mode == 'own_account'
)
employee_expense_sheets.state = 'post'
return super().button_draft()

View file

@ -0,0 +1,62 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
from odoo.tools.misc import frozendict
class AccountMoveLine(models.Model):
_inherit = "account.move.line"
expense_id = fields.Many2one('hr.expense', string='Expense', copy=True)
@api.constrains('account_id', 'display_type')
def _check_payable_receivable(self):
super(AccountMoveLine, self.filtered(lambda line: line.move_id.expense_sheet_id.payment_mode != 'company_account'))._check_payable_receivable()
def reconcile(self):
# OVERRIDE
not_paid_expenses = self.move_id.expense_sheet_id.expense_line_ids.filtered(lambda expense: expense.state != 'done')
res = super().reconcile()
# Do not update expense or expense sheet states when reversing journal entries
not_paid_expense_sheets = not_paid_expenses.sheet_id.filtered(lambda sheet: sheet.account_move_id.payment_state != 'reversed')
paid_expenses = not_paid_expenses.filtered(lambda expense: expense.currency_id.is_zero(expense.amount_residual))
paid_expenses.write({'state': 'done'})
not_paid_expense_sheets.filtered(lambda sheet: all(expense.state == 'done' for expense in sheet.expense_line_ids)).set_to_paid()
return res
def _get_attachment_domains(self):
attachment_domains = super(AccountMoveLine, self)._get_attachment_domains()
if self.expense_id:
attachment_domains.append([('res_model', '=', 'hr.expense'), ('res_id', '=', self.expense_id.id)])
return attachment_domains
def _compute_tax_key(self):
super()._compute_tax_key()
for line in self:
if line.expense_id:
line.tax_key = frozendict(**line.tax_key, expense_id=line.expense_id.id)
def _compute_all_tax(self):
expense_lines = self.filtered('expense_id')
super(AccountMoveLine, expense_lines.with_context(force_price_include=True))._compute_all_tax()
super(AccountMoveLine, self - expense_lines)._compute_all_tax()
for line in expense_lines:
for key in list(line.compute_all_tax.keys()):
new_key = frozendict(**key, expense_id=line.expense_id.id)
line.compute_all_tax[new_key] = line.compute_all_tax.pop(key)
def _compute_totals(self):
expenses = self.filtered('expense_id')
super(AccountMoveLine, expenses.with_context(force_price_include=True))._compute_totals()
super(AccountMoveLine, self - expenses)._compute_totals()
def _convert_to_tax_base_line_dict(self):
result = super()._convert_to_tax_base_line_dict()
if self.expense_id:
result.setdefault('extra_context', {})
result['extra_context']['force_price_include'] = True
return result
def _get_extra_query_base_tax_line_mapping(self):
return ' AND (base_line.expense_id IS NULL OR account_move_line.expense_id = base_line.expense_id)'

View file

@ -0,0 +1,60 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, _
from odoo.exceptions import UserError
class AccountPayment(models.Model):
_inherit = "account.payment"
def action_cancel(self):
# EXTENDS account
for payment in self:
if payment.expense_sheet_id.payment_mode != 'own_account':
continue
payment.with_context(skip_account_move_synchronization=True).expense_sheet_id.write({
'state': 'approve',
'account_move_id': False,
})
return super().action_cancel()
def action_draft(self):
employee_expense_sheets = self.reconciled_bill_ids.expense_sheet_id.filtered(
lambda expense_sheet: expense_sheet.payment_mode == 'own_account'
)
employee_expense_sheets.state = 'post'
return super().action_draft()
def action_open_expense_report(self):
self.ensure_one()
return {
'name': self.expense_sheet_id.name,
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
'views': [(False, 'form')],
'res_model': 'hr.expense.sheet',
'res_id': self.expense_sheet_id.id
}
def _synchronize_from_moves(self, changed_fields):
# EXTENDS account
if self.expense_sheet_id:
# Constraints bypass when entry is linked to an expense.
# Context is not enough, as we want to be able to delete
# and update those entries later on.
return
return super()._synchronize_from_moves(changed_fields)
def _synchronize_to_moves(self, changed_fields):
# EXTENDS account
if self.expense_sheet_id:
raise UserError(_("You cannot do this modification since the payment is linked to an expense report."))
return super()._synchronize_to_moves(changed_fields)
def _creation_message(self):
# EXTENDS mail
self.ensure_one()
if self.move_id.expense_sheet_id:
return _("Payment created for: %s", self.move_id.expense_sheet_id._get_html_link())
return super()._creation_message()

View file

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class AccountAnalyticApplicability(models.Model):
_inherit = 'account.analytic.applicability'
_description = "Analytic Plan's Applicabilities"
business_domain = fields.Selection(
selection_add=[
('expense', 'Expense'),
],
ondelete={'expense': 'cascade'},
)
class AnalyticAccount(models.Model):
_inherit = 'account.analytic.account'
@api.ondelete(at_uninstall=False)
def _unlink_except_account_in_analytic_distribution(self):
self.env.cr.execute("""
SELECT id FROM hr_expense
WHERE analytic_distribution::jsonb ?| array[%s]
LIMIT 1
""", ([str(id) for id in self.ids],))
expense_ids = self.env.cr.fetchall()
if expense_ids:
raise UserError(_("You cannot delete an analytic account that is used in an expense."))

View file

@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class HrDepartment(models.Model):
_inherit = 'hr.department'
def _compute_expense_sheets_to_approve(self):
expense_sheet_data = self.env['hr.expense.sheet']._read_group([('department_id', 'in', self.ids), ('state', '=', 'submit')], ['department_id'], ['department_id'])
result = dict((data['department_id'][0], data['department_id_count']) for data in expense_sheet_data)
for department in self:
department.expense_sheets_to_approve_count = result.get(department.id, 0)
expense_sheets_to_approve_count = fields.Integer(compute='_compute_expense_sheets_to_approve', string='Expenses Reports to Approve')

View file

@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models, api
class Employee(models.Model):
_inherit = 'hr.employee'
def _group_hr_expense_user_domain(self):
# We return the domain only if the group exists for the following reason:
# When a group is created (at module installation), the `res.users` form view is
# automatically modifiedto add application accesses. When modifiying the view, it
# reads the related field `expense_manager_id` of `res.users` and retrieve its domain.
# This is a problem because the `group_hr_expense_user` record has already been created but
# not its associated `ir.model.data` which makes `self.env.ref(...)` fail.
group = self.env.ref('hr_expense.group_hr_expense_team_approver', raise_if_not_found=False)
return [('groups_id', 'in', group.ids)] if group else []
expense_manager_id = fields.Many2one(
'res.users', string='Expense',
domain=_group_hr_expense_user_domain,
compute='_compute_expense_manager', store=True, readonly=False,
help='Select the user responsible for approving "Expenses" of this employee.\n'
'If empty, the approval is done by an Administrator or Approver (determined in settings/users).')
@api.depends('parent_id')
def _compute_expense_manager(self):
for employee in self:
previous_manager = employee._origin.parent_id.user_id
manager = employee.parent_id.user_id
if manager and manager.has_group('hr_expense.group_hr_expense_user') and (employee.expense_manager_id == previous_manager or not employee.expense_manager_id):
employee.expense_manager_id = manager
elif not employee.expense_manager_id:
employee.expense_manager_id = False
def _get_user_m2o_to_empty_on_archived_employees(self):
return super()._get_user_m2o_to_empty_on_archived_employees() + ['expense_manager_id']
class EmployeePublic(models.Model):
_inherit = 'hr.employee.public'
expense_manager_id = fields.Many2one('res.users', readonly=True)
class User(models.Model):
_inherit = ['res.users']
expense_manager_id = fields.Many2one(related='employee_id.expense_manager_id', readonly=False)
@property
def SELF_READABLE_FIELDS(self):
return super().SELF_READABLE_FIELDS + ['expense_manager_id']

File diff suppressed because it is too large Load diff

Some files were not shown because too many files have changed in this diff Show more