19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:32:12 +01:00
parent 79f83631d5
commit 73afc09215
6267 changed files with 1534193 additions and 1130106 deletions

View file

@ -17,38 +17,15 @@ pip install odoo-bringout-oca-ocb-sale_timesheet
## Dependencies
This addon depends on:
- sale_project
- hr_timesheet
## Manifest Information
- **Name**: Sales Timesheet
- **Version**: N/A
- **Category**: Hidden
- **License**: LGPL-3
- **Installable**: False
## Source
Based on [OCA/OCB](https://github.com/OCA/OCB) branch 16.0, addon `sale_timesheet`.
- Repository: https://github.com/OCA/OCB
- Branch: 19.0
- Path: addons/sale_timesheet
## License
This package maintains the original LGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md
This package preserves the original LGPL-3 license.

View file

@ -1,13 +1,15 @@
[project]
name = "odoo-bringout-oca-ocb-sale_timesheet"
version = "16.0.0"
description = "Sales Timesheet - Sell based on timesheets"
description = "Sales Timesheet -
Sell based on timesheets
"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-sale_project>=16.0.0",
"odoo-bringout-oca-ocb-hr_timesheet>=16.0.0",
"odoo-bringout-oca-ocb-sale_project>=19.0.0",
"odoo-bringout-oca-ocb-hr_timesheet>=19.0.0",
"requests>=2.25.1"
]
readme = "README.md"
@ -17,7 +19,7 @@ classifiers = [
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]

View file

@ -5,19 +5,18 @@ from . import models
from . import wizard
from . import report
from odoo import api, SUPERUSER_ID
def uninstall_hook(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
def uninstall_hook(env):
env.ref("account.account_analytic_line_rule_billing_user").write({'domain_force': "[(1, '=', 1)]"})
rule_readonly_user = env.ref("account.account_analytic_line_rule_readonly_user", raise_if_not_found=False)
if rule_readonly_user:
rule_readonly_user.write({'domain_force': "[(1, '=', 1)]"})
env.ref("account.account_analytic_line_rule_readonly_user").write({'domain_force': "[(1, '=', 1)]"})
def _sale_timesheet_post_init(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
products = env['product.template'].search([('detailed_type', '=', 'service'), ('invoice_policy', '=', 'order'), ('service_type', '=', 'manual')])
def _sale_timesheet_post_init(env):
products = env['product.template'].search([
('type', '=', 'service'),
('service_tracking', 'in', ['no', 'task_global_project', 'task_in_project', 'project_only']),
('invoice_policy', '=', 'order'),
('service_type', '=', 'manual'),
])
for product in products:
product.service_type = 'timesheet'

View file

@ -3,7 +3,7 @@
{
'name': 'Sales Timesheet',
'category': 'Hidden',
'category': 'Sales/Sales',
'summary': 'Sell based on timesheets',
'description': """
Allows to sell timesheets in your sales order
@ -16,21 +16,20 @@ have real delivered quantities in sales orders.
'depends': ['sale_project', 'hr_timesheet'],
'data': [
'data/sale_service_data.xml',
'report/timesheets_analysis_views.xml',
'security/ir.model.access.csv',
'security/sale_timesheet_security.xml',
'views/account_invoice_views.xml',
'views/sale_order_views.xml',
'views/product_views.xml',
'views/project_task_views.xml',
'views/project_update_templates.xml',
'views/hr_timesheet_views.xml',
'views/res_config_settings_views.xml',
'views/sale_timesheet_portal_templates.xml',
'views/project_sharing_views.xml',
'views/project_portal_templates.xml',
'report/timesheets_analysis_views.xml',
'report/report_timesheet_templates.xml',
'wizard/project_create_sale_order_views.xml',
'wizard/project_create_invoice_views.xml',
'report/project_report_view.xml',
'wizard/sale_make_invoice_advance_views.xml',
],
'demo': [
@ -44,13 +43,19 @@ have real delivered quantities in sales orders.
],
'web.assets_backend': [
'sale_timesheet/static/src/components/**/*',
'sale_timesheet/static/src/js/so_line_one2many.js',
'sale_timesheet/static/src/xml/**/*',
],
'web.assets_tests': [
'sale_timesheet/static/tests/**/*',
'sale_timesheet/static/tests/tours/**/*',
],
'web.assets_unit_tests': [
'sale_timesheet/static/tests/**/*',
('remove', 'sale_timesheet/static/tests/tours/**/*'),
],
'project.webclient': [
'sale_timesheet/static/src/components/so_line_field/*',
]
},
'author': 'Odoo S.A.',
'license': 'LGPL-3',
'post_init_hook': '_sale_timesheet_post_init',
}

View file

@ -1,12 +1,11 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from werkzeug.exceptions import NotFound
from odoo import http, _
from odoo.exceptions import AccessError, MissingError
from odoo.fields import Domain
from odoo.http import request
from odoo.osv import expression
from odoo.addons.account.controllers.portal import PortalAccount
from odoo.addons.hr_timesheet.controllers.portal import TimesheetCustomerPortal
@ -19,7 +18,7 @@ class PortalProjectAccount(PortalAccount, ProjectCustomerPortal):
def _invoice_get_page_view_values(self, invoice, access_token, **kwargs):
values = super()._invoice_get_page_view_values(invoice, access_token, **kwargs)
domain = request.env['account.analytic.line']._timesheet_get_portal_domain()
domain = expression.AND([
domain = Domain.AND([
domain,
request.env['account.analytic.line']._timesheet_get_sale_domain(
invoice.mapped('line_ids.sale_line_ids'),
@ -47,7 +46,7 @@ class PortalProjectAccount(PortalAccount, ProjectCustomerPortal):
# content according to pager and archive selected
invoices = values['invoices'](pager['offset'])
request.session['my_invoices_history'] = invoices.ids[:100]
request.session['my_invoices_history'] = [i['invoice'].id for i in invoices[:100]]
values.update({
'invoices': invoices,
@ -60,46 +59,31 @@ class PortalProjectAccount(PortalAccount, ProjectCustomerPortal):
class SaleTimesheetCustomerPortal(TimesheetCustomerPortal):
def _get_searchbar_inputs(self):
searchbar_inputs = super()._get_searchbar_inputs()
searchbar_inputs.update(
so={'input': 'so', 'label': _('Search in Sales Order')},
sol={'input': 'sol', 'label': _('Search in Sales Order Item')},
invoice={'input': 'invoice', 'label': _('Search in Invoice')})
return searchbar_inputs
return super()._get_searchbar_inputs() | {
'so': {'input': 'so', 'label': _('Search in Sales Order Item'), 'sequence': 50},
'invoice': {'input': 'invoice', 'label': _('Search in Invoice'), 'sequence': 80},
}
def _get_searchbar_groupby(self):
searchbar_groupby = super()._get_searchbar_groupby()
searchbar_groupby.update(
so={'input': 'so', 'label': _('Sales Order')},
sol={'input': 'sol', 'label': _('Sales Order Item')},
invoice={'input': 'invoice', 'label': _('Invoice')})
return searchbar_groupby
return super()._get_searchbar_groupby() | {
'so_line': {'label': _('Sales Order Item'), 'sequence': 80},
'timesheet_invoice_id': {'label': _('Invoice'), 'sequence': 90},
}
def _get_search_domain(self, search_in, search):
search_domain = super()._get_search_domain(search_in, search)
if search_in in ('sol', 'all'):
search_domain = expression.OR([search_domain, [('so_line', 'ilike', search)]])
if search_in in ('so', 'all'):
search_domain = expression.OR([search_domain, [('so_line.order_id.name', 'ilike', search)]])
if search_in in ('invoice', 'all'):
invoices = request.env['account.move'].sudo().search([('name', 'ilike', search)])
domain = request.env['account.analytic.line']._timesheet_get_sale_domain(invoices.mapped('invoice_line_ids.sale_line_ids'), invoices)
search_domain = expression.OR([search_domain, domain])
return search_domain
def _get_groupby_mapping(self):
groupby_mapping = super()._get_groupby_mapping()
groupby_mapping.update(
sol='so_line',
so='order_id',
invoice='timesheet_invoice_id')
return groupby_mapping
if search_in == 'so':
return Domain('so_line', 'ilike', search) | Domain('so_line.order_id.name', 'ilike', search)
elif search_in == 'invoice':
invoices = request.env['account.move'].sudo().search(['|', ('name', 'ilike', search), ('id', 'ilike', search)])
return Domain(request.env['account.analytic.line']._timesheet_get_sale_domain(invoices.mapped('invoice_line_ids.sale_line_ids'), invoices))
else:
return super()._get_search_domain(search_in, search)
def _get_searchbar_sortings(self):
searchbar_sortings = super()._get_searchbar_sortings()
searchbar_sortings.update(
sol={'label': _('Sales Order Item'), 'order': 'so_line'})
return searchbar_sortings
return super()._get_searchbar_sortings() | {
'so_line': {'label': _('Sales Order Item')},
'timesheet_invoice_id': {'label': _('Invoice')},
}
def _task_get_page_view_values(self, task, access_token, **kwargs):
values = super()._task_get_page_view_values(task, access_token, **kwargs)
@ -117,7 +101,7 @@ class SaleTimesheetCustomerPortal(TimesheetCustomerPortal):
moves = request.env['account.move']
invoice_ids = task.sale_order_id.invoice_ids
if invoice_ids and request.env['account.move'].check_access_rights('read', raise_exception=False):
if invoice_ids and request.env['account.move'].has_access('read'):
moves = request.env['account.move'].search([('id', 'in', invoice_ids.ids)])
values['invoices_accessible'] = moves.ids
if moves:
@ -133,6 +117,6 @@ class SaleTimesheetCustomerPortal(TimesheetCustomerPortal):
})
return values
@http.route(['/my/timesheets', '/my/timesheets/page/<int:page>'], type='http', auth="user", website=True)
def portal_my_timesheets(self, page=1, sortby=None, filterby=None, search=None, search_in='all', groupby='sol', **kw):
return super().portal_my_timesheets(page, sortby, filterby, search, search_in, groupby, **kw)
@http.route()
def portal_my_timesheets(self, *args, groupby='so_line', **kw):
return super().portal_my_timesheets(*args, groupby=groupby, **kw)

View file

@ -2,11 +2,11 @@
<odoo>
<data noupdate="1">
<record id="time_product" model="product.product">
<field name="name">Service on Timesheet</field>
<field name="name">Service on Timesheets</field>
<field name="type">service</field>
<field name="list_price">40</field>
<field name="uom_id" ref="uom.product_uom_hour"/>
<field name="uom_po_id" ref="uom.product_uom_hour"/>
<field name="categ_id" eval="ref('product.product_category_services', raise_if_not_found=False)"/>
<field name="service_policy">delivered_timesheet</field>
<field name="image_1920" type="base64" file="sale_timesheet/static/img/product_product_time_product.png"/>
</record>
@ -15,5 +15,52 @@
<record model="res.groups" id="base.group_user">
<field name="implied_ids" eval="[(4, ref('uom.group_uom'))]"/>
</record>
<!-- Timesheets export template -->
<record id="account_analytic_line_export_template_line_so_line" model="ir.exports.line">
<field name="export_id" ref="hr_timesheet.account_analytic_line_export_template"/>
<field name="name">so_line</field>
</record>
<!-- Timesheets export template 2 -->
<record id="aal_costs_revenues_export_template" model="ir.exports">
<field name="name">Project Costs &amp; Revenues</field>
<field name="resource">account.analytic.line</field>
</record>
<record id="aal_costs_revenues_export_template_line_date" model="ir.exports.line">
<field name="export_id" ref="aal_costs_revenues_export_template"/>
<field name="name">date</field>
</record>
<record id="aal_costs_revenues_export_template_line_name" model="ir.exports.line">
<field name="export_id" ref="aal_costs_revenues_export_template"/>
<field name="name">name</field>
</record>
<record id="aal_costs_revenues_export_template_line_project_id" model="ir.exports.line">
<field name="export_id" ref="aal_costs_revenues_export_template"/>
<field name="name">project_id</field>
</record>
<record id="aal_costs_revenues_export_template_line_product_id" model="ir.exports.line">
<field name="export_id" ref="aal_costs_revenues_export_template"/>
<field name="name">product_id</field>
</record>
<record id="aal_costs_revenues_export_template_line_unit_amount" model="ir.exports.line">
<field name="export_id" ref="aal_costs_revenues_export_template"/>
<field name="name">unit_amount</field>
</record>
<record id="aal_costs_revenues_export_template_line_partner_id" model="ir.exports.line">
<field name="export_id" ref="aal_costs_revenues_export_template"/>
<field name="name">partner_id</field>
</record>
<record id="aal_costs_revenues_export_template_line_amount" model="ir.exports.line">
<field name="export_id" ref="aal_costs_revenues_export_template"/>
<field name="name">amount</field>
</record>
</data>
</odoo>

View file

@ -2,21 +2,87 @@
<odoo>
<data noupdate="1">
<record id="sale_line_services" model="sale.order.line">
<field name="order_id" ref="sale.sale_order_3"/>
<field name="name" model="sale.order.line" eval="obj().env.ref('sale.advance_product_0').get_product_multiline_description_sale()"/>
<field name="product_id" ref="sale.advance_product_0"/>
<field name="product_uom" ref="uom.product_uom_unit"/>
<field name="price_unit">150.0</field>
<field name="product_uom_qty">5.0</field>
<record id="job_interior_designer" model="hr.job">
<field name="name">Interior Designer</field>
<field name="no_of_recruitment">5</field>
<field name="contract_type_id" ref="hr.contract_type_permanent"/>
</record>
<!-- Project Template -->
<record id="so_template_project" model="project.project">
<field name="name">Sales Order</field>
<field name="active">False</field>
<field name="type_ids" eval="[Command.link(ref('project.project_stage_0')), Command.link(ref('project.project_stage_1')), Command.link(ref('project.project_stage_2'))]"/>
<field name="description">This project is used as a template for projects created from sales orders.</field>
<record id="job_engineer" model="hr.job">
<field name="name">Site Manager</field>
<field name="no_of_recruitment">7</field>
<field name="contract_type_id" ref="hr.contract_type_permanent"/>
</record>
<record id="job_labour" model="hr.job">
<field name="name">Handyman</field>
<field name="no_of_recruitment">10</field>
<field name="contract_type_id" ref="hr.contract_type_permanent"/>
</record>
<record id="work_contact_jjo" model="res.partner">
<field name="name">Jessica Johnson</field>
<field name="email">jessica.johnson45@example.com</field>
<field name="image_1920" type="base64" file="sale_timesheet/static/img/employee_jjo-image.jpg"/>
</record>
<record id="employee_jjo" model="hr.employee">
<field name="name">Jessica Johnson</field>
<field name="parent_id" ref="hr.employee_al"/>
<field name="job_id" ref="sale_timesheet.job_engineer"/>
<field name="category_ids" eval="[(6, 0, [ref('hr.employee_category_4')])]"/>
<field name="resource_calendar_id" ref="resource.resource_calendar_std_38h"/>
<field name="work_location_id" ref="hr.work_location_1"/>
<field name="work_phone">(535)-495-4164</field>
<field name="work_contact_id" ref="sale_timesheet.work_contact_jjo"/>
<field name="image_1920" type="base64" file="sale_timesheet/static/img/employee_jjo-image.jpg"/>
<field name="create_date">2020-02-02 00:00:00</field>
<field name="sex">female</field>
</record>
<record id="work_contact_awa" model="res.partner">
<field name="name">Amy Watson</field>
<field name="email">amy.watson21@example.com</field>
<field name="image_1920" type="base64" file="sale_timesheet/static/img/employee_awa-image.jpg"/>
</record>
<record id="employee_awa" model="hr.employee">
<field name="name">Amy Watson</field>
<field name="parent_id" ref="sale_timesheet.employee_jjo"/>
<field name="job_id" ref="sale_timesheet.job_interior_designer"/>
<field name="category_ids" eval="[(6, 0, [ref('hr.employee_category_4')])]"/>
<field name="work_location_id" ref="hr.work_location_1"/>
<field name="work_phone">(535)-495-4222</field>
<field name="work_contact_id" ref="sale_timesheet.work_contact_awa"/>
<field name="image_1920" type="base64" file="sale_timesheet/static/img/employee_awa-image.jpg"/>
<field name="create_date">2020-01-01 00:00:00</field>
<field name="sex">female</field>
</record>
<record id="work_contact_jsm" model="res.partner">
<field name="name">Justin Smith</field>
<field name="email">justin.smith57@example.com</field>
<field name="image_1920" type="base64" file="sale_timesheet/static/img/employee_jsm-image.jpg"/>
</record>
<record id="employee_jsm" model="hr.employee">
<field name="name">Justin Smith</field>
<field name="parent_id" ref="sale_timesheet.employee_jjo"/>
<field name="job_id" ref="sale_timesheet.job_labour"/>
<field name="category_ids" eval="[(6, 0, [ref('hr.employee_category_4')])]"/>
<field name="work_location_id" ref="hr.work_location_1"/>
<field name="work_phone">(535)-495-4444</field>
<field name="work_contact_id" ref="sale_timesheet.work_contact_jsm"/>
<field name="image_1920" type="base64" file="sale_timesheet/static/img/employee_jsm-image.jpg"/>
<field name="create_date">2020-02-02 00:00:00</field>
<field name="sex">male</field>
</record>
<record id="sale_line_services" model="sale.order.line">
<field name="order_id" ref="sale.sale_order_3"/>
<field name="product_id" ref="sale.advance_product_0"/>
<field name="price_unit">150.0</field>
<field name="product_uom_qty">5.0</field>
</record>
<!-- Projects and Analytic Account -->
@ -25,14 +91,14 @@
<field name="code">INT</field>
<field name="active" eval="True"/>
<field name="plan_id" ref="analytic.analytic_plan_projects"/>
<field name="company_id" eval="False"/>
</record>
<record id="project_support" model="project.project">
<field name="date_start" eval="time.strftime('%Y-%m-01 10:00:00')"/>
<field name="name">After-Sales Services</field>
<field name="description">Services provided to customers who have purchased products.</field>
<field name="user_id" eval=""/>
<field name="analytic_account_id" ref="account_analytic_account_project_support"/>
<field name="account_id" ref="account_analytic_account_project_support"/>
<field name="allow_billable" eval="True" />
<field name="type_ids" eval="[Command.link(ref('project.project_stage_0')), Command.link(ref('project.project_stage_1')), Command.link(ref('project.project_stage_2'))]"/>
<field name="label_tasks">Services</field>
@ -66,12 +132,11 @@
<record id="product_service_order_timesheet" model="product.product">
<field name="name">Customer Care (Prepaid Hours)</field>
<field name="categ_id" ref="product.product_category_3"/>
<field name="categ_id" ref="product.product_category_services"/>
<field name="type">service</field>
<field name="list_price">250.00</field>
<field name="standard_price">190.00</field>
<field name="uom_id" ref="uom.product_uom_hour"/>
<field name="uom_po_id" ref="uom.product_uom_hour"/>
<field name="service_policy">ordered_prepaid</field>
<field name="service_tracking">task_global_project</field>
<field name="project_id" ref="project_support"/>
@ -80,54 +145,99 @@
<record id="product_service_deliver_timesheet_1" model="product.product">
<field name="name">Senior Architect (Invoice on Timesheets)</field>
<field name="categ_id" ref="product.product_category_3"/>
<field name="categ_id" ref="product.product_category_services"/>
<field name="list_price">200.00</field>
<field name="standard_price">150.00</field>
<field name="type">service</field>
<field name="uom_id" ref="uom.product_uom_hour"/>
<field name="uom_po_id" ref="uom.product_uom_hour"/>
<field name="service_policy">delivered_timesheet</field>
<field name="service_tracking">task_in_project</field>
<field name="project_template_id" ref="so_template_project"/>
<field name="project_template_id" ref="sale_project.so_template_project"/>
</record>
<record id="product_service_deliver_timesheet_2" model="product.product">
<field name="name">Junior Architect (Invoice on Timesheets)</field>
<field name="categ_id" ref="product.product_category_3"/>
<field name="categ_id" ref="product.product_category_services"/>
<field name="list_price">100.00</field>
<field name="standard_price">85.00</field>
<field name="type">service</field>
<field name="uom_id" ref="uom.product_uom_hour"/>
<field name="uom_po_id" ref="uom.product_uom_hour"/>
<field name="service_policy">delivered_timesheet</field>
<field name="service_tracking">task_in_project</field>
<field name="project_template_id" ref="so_template_project"/>
<field name="project_template_id" ref="sale_project.so_template_project"/>
</record>
<record id="product_service_deliver_milestones" model="product.product">
<field name="name">Kitchen Assembly (Milestones)</field>
<field name="categ_id" ref="product.product_category_3"/>
<field name="categ_id" ref="product.product_category_services"/>
<field name="list_price">500</field>
<field name="standard_price">420.00</field>
<field name="type">service</field>
<field name="invoice_policy">delivery</field>
<field name="uom_id" ref="uom.product_uom_unit"/>
<field name="uom_po_id" ref="uom.product_uom_unit"/>
<field name="service_type" model="product.product" eval="'milestones' if obj().env.user.has_group('project.group_project_milestone') else 'manual'" />
<field name="service_tracking">task_in_project</field>
<field name="project_template_id" ref="so_template_project"/>
<field name="project_template_id" ref="sale_project.so_template_project"/>
</record>
<record id="product_product_elevator_installation" model="product.product">
<field name="name">Elevator Installation</field>
<field name="categ_id" ref="product.product_category_construction"/>
<field name="list_price">5500.00</field>
<field name="standard_price">5000.00</field>
<field name="type">service</field>
<field name="uom_id" ref="uom.product_uom_hour"/>
<field name="service_policy">ordered_prepaid</field>
<field name="service_tracking">task_global_project</field>
<field name="project_id" ref="project.project_home_construction"/>
</record>
<record id="product_product_solar_installation" model="product.product">
<field name="name">Solar Panel Installation</field>
<field name="categ_id" ref="product.product_category_construction"/>
<field name="list_price">4050.00</field>
<field name="standard_price">4000.00</field>
<field name="type">service</field>
<field name="uom_id" ref="uom.product_uom_hour"/>
<field name="service_policy">delivered_timesheet</field>
<field name="service_tracking">task_global_project</field>
<field name="project_id" ref="project.project_home_construction"/>
</record>
<record id="product_product_interior_designing" model="product.product">
<field name="name">Interior Designing</field>
<field name="categ_id" ref="product.product_category_construction"/>
<field name="list_price">2500.00</field>
<field name="standard_price">2000.00</field>
<field name="type">service</field>
<field name="uom_id" ref="uom.product_uom_hour"/>
<field name="service_policy">delivered_milestones</field>
<field name="service_tracking">task_global_project</field>
<field name="project_id" ref="project.project_home_construction"/>
</record>
<record id="product_product_roofing" model="product.product">
<field name="name">Roofing</field>
<field name="categ_id" ref="product.product_category_construction"/>
<field name="list_price">4000.00</field>
<field name="standard_price">3500.00</field>
<field name="type">service</field>
<field name="uom_id" ref="uom.product_uom_hour"/>
<field name="service_policy">delivered_manual</field>
<field name="service_tracking">task_global_project</field>
<field name="project_id" ref="project.project_home_construction"/>
</record>
<record id="product_service_deliver_manual" model="product.product">
<field name="name">Furniture Delivery (Manual)</field>
<field name="categ_id" ref="product.product_category_3"/>
<field name="categ_id" ref="product.product_category_services"/>
<field name="list_price">200</field>
<field name="standard_price">150.00</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="service_policy">delivered_manual</field>
<field name="service_tracking">task_in_project</field>
<field name="project_template_id" ref="so_template_project"/>
<field name="project_template_id" ref="sale_project.so_template_project"/>
</record>
<!-- Sales order 'sale_order_1' (AGR) -->
@ -224,10 +334,10 @@
<field name="product_uom_qty">4</field>
</record>
<!-- Sale Order 'sale_order_3' (DECO) -->
<!-- Sale Order 'sale_order_3' (ACME) -->
<record id="sale_order_3" model="sale.order">
<field name="partner_id" ref="base.res_partner_2"/>
<field name="client_order_ref">DECO</field>
<field name="client_order_ref">ACME</field>
<field name="user_id" ref="base.user_admin"/>
<field name="tag_ids" eval="[Command.link(ref('sales_team.categ_oppor7'))]"/>
</record>
@ -257,6 +367,38 @@
<field name="product_uom_qty">14</field>
</record>
<record id="sale_order_4_construction" model="sale.order">
<field name="partner_id" ref="base.res_partner_2"/>
<field name="user_id" ref="base.user_admin"/>
<field name="tag_ids" eval="[Command.link(ref('sales_team.categ_oppor6'))]"/>
</record>
<record id="sale_line_construction_41" model="sale.order.line">
<field name="order_id" ref="sale_order_4_construction"/>
<field name="sequence" eval="1"/>
<field name="product_id" ref="product_product_elevator_installation"/>
<field name="product_uom_qty">20</field>
</record>
<record id="sale_line_construction_42" model="sale.order.line">
<field name="order_id" ref="sale_order_4_construction"/>
<field name="product_id" ref="product_product_solar_installation"/>
<field name="sequence" eval="2"/>
<field name="discount">18</field>
<field name="product_uom_qty">10</field>
</record>
<record id="sale_line_construction_43" model="sale.order.line">
<field name="order_id" ref="sale_order_4_construction"/>
<field name="sequence" eval="1"/>
<field name="product_id" ref="product_product_interior_designing"/>
<field name="product_uom_qty">15</field>
</record>
<record id="sale_line_construction_44" model="sale.order.line">
<field name="order_id" ref="sale_order_4_construction"/>
<field name="product_id" ref="product_product_roofing"/>
<field name="sequence" eval="2"/>
<field name="discount">10</field>
<field name="product_uom_qty">20</field>
</record>
<!-- Activity of sales order -->
<record id="sale_timesheet_activity_1" model="mail.activity">
<field name="res_id" ref="sale_timesheet.sale_order_2"/>
@ -272,6 +414,43 @@
<function model="sale.order" name="action_confirm" eval="[[ref('sale_order_1')]]"/>
<function model="sale.order" name="action_confirm" eval="[[ref('sale_order_2')]]"/>
<function model="sale.order" name="action_confirm" eval="[[ref('sale_order_3')]]"/>
<function model="sale.order" name="action_confirm" eval="[[ref('sale_order_4_construction')]]"/>
<!-- Function to set task stage and users -->
<function model="project.task" name="write">
<value model="project.task" search="[('sale_line_id', '=', ref('sale_timesheet.sale_line_construction_41'))]"/>
<value eval="{
'milestone_id': ref('project.project_home_construction_milestone_3'),
'stage_id': ref('project.project_stage_1'),
'user_ids':[Command.link(ref('base.user_admin'))],
'state': '03_approved',
}"/>
</function>
<function model="project.task" name="write">
<value model="project.task" search="[('sale_line_id', '=', ref('sale_timesheet.sale_line_construction_42'))]"/>
<value eval="{
'milestone_id': ref('project.project_home_construction_milestone_3'),
'stage_id': ref('project.project_stage_1'),
'user_ids': [Command.link(ref('base.user_demo'))],
}"/>
</function>
<function model="project.task" name="write">
<value model="project.task" search="[('sale_line_id', '=', ref('sale_timesheet.sale_line_construction_43'))]"/>
<value eval="{
'milestone_id': ref('project.project_home_construction_milestone_2'),
'stage_id': ref('project.project_stage_1'),
'user_ids':[Command.link(ref('base.user_admin'))],
'state': '03_approved',
}"/>
</function>
<function model="project.task" name="write">
<value model="project.task" search="[('sale_line_id', '=', ref('sale_timesheet.sale_line_construction_44'))]"/>
<value eval="{
'stage_id': ref('project.project_stage_1'),
'user_ids': [Command.link(ref('base.user_demo'))],
'state': '03_approved',
}"/>
</function>
<!-- Change order dates -->
<record id="sale_order_1" model="sale.order">
@ -348,7 +527,7 @@
}"/>
</function>
<!-- Assign DECO & to demo, clear description and set dates -->
<!-- Assign ACME to demo, clear description and set dates -->
<function model="project.project" name="write">
<value model="project.project" search="[('sale_line_id', '=', ref('sale_line_32'))]"/>
<value eval="{
@ -969,6 +1148,44 @@
<field name="so_line" ref="sale_line_33"/>
</record>
<!-- Timesheets on sale_order_4_construction -->
<record id="sale_line_41_task_timesheet" model="account.analytic.line">
<field name="name">Elevator Installation</field>
<field name="employee_id" ref="sale_timesheet.employee_jsm"/>
<field name="date" eval="(DateTime.now() + relativedelta(weekday=0,weeks=-2)).strftime('%Y-%m-%d')"/>
<field name="unit_amount">5.00</field>
<field name="project_id" ref="project.project_home_construction"/>
<field name="task_id" search="[('sale_line_id', '=', ref('sale_line_construction_41'))]"/>
<field name="so_line" ref="sale_line_construction_41"/>
</record>
<record id="sale_line_42_task_timesheet" model="account.analytic.line">
<field name="name">Solar Panel Installation</field>
<field name="employee_id" ref="sale_timesheet.employee_jsm"/>
<field name="date" eval="(DateTime.now() + relativedelta(weekday=0,weeks=-3)).strftime('%Y-%m-%d')"/>
<field name="unit_amount">4.00</field>
<field name="task_id" search="[('sale_line_id', '=', ref('sale_line_construction_42'))]"/>
<field name="project_id" ref="project.project_home_construction"/>
<field name="so_line" ref="sale_line_construction_42"/>
</record>
<record id="sale_line_43_task_timesheet" model="account.analytic.line">
<field name="name">House Interior Designing</field>
<field name="employee_id" ref="sale_timesheet.employee_jjo"/>
<field name="date" eval="(DateTime.now() + relativedelta(weekday=0,weeks=-4)).strftime('%Y-%m-%d')"/>
<field name="unit_amount">8.00</field>
<field name="task_id" search="[('sale_line_id', '=', ref('sale_line_construction_43'))]"/>
<field name="project_id" ref="project.project_home_construction"/>
<field name="so_line" ref="sale_line_construction_43"/>
</record>
<record id="sale_line_44_task_timesheet" model="account.analytic.line">
<field name="name">House Renovation</field>
<field name="employee_id" ref="sale_timesheet.employee_awa"/>
<field name="date" eval="(DateTime.now() + relativedelta(weekday=0,weeks=-5)).strftime('%Y-%m-%d')"/>
<field name="unit_amount">10.00</field>
<field name="task_id" search="[('sale_line_id', '=', ref('sale_line_construction_44'))]"/>
<field name="project_id" ref="project.project_home_construction"/>
<field name="so_line" ref="sale_line_construction_44"/>
</record>
<!-- Non billable Timesheets in project_support -->
<record id="project_task_internal_timesheet_1" model="account.analytic.line">
<field name="name">Technical training</field>
@ -1088,7 +1305,7 @@
<field name="name">Furniture Delivery</field>
<field name="project_id" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_1'))]"/>
<field name="stage_id" ref="project.project_stage_1"/>
<field name="kanban_state">done</field>
<field name="state">1_done</field>
<field name="sale_line_id" ref="sale_timesheet.sale_line_13"/>
<field name="sale_order_id" ref="sale_timesheet.sale_order_1"/>
<field name="partner_id" ref="base.res_partner_2"/>
@ -1103,7 +1320,7 @@
<field name="sale_order_id" ref="sale_timesheet.sale_order_2"/>
<field name="project_id" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_2'))]"/>
<field name="stage_id" ref="project.project_stage_1"/>
<field name="kanban_state">done</field>
<field name="state">1_done</field>
<field name="partner_id" ref="base.res_partner_4"/>
<field name="user_ids" eval="[Command.link(ref('base.user_admin'))]"/>
</record>
@ -1141,7 +1358,8 @@
<field name="name">Carpet fitting</field>
<field name="project_id" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_2'))]"/>
<field name="stage_id" ref="project.project_stage_0"/>
<field name="kanban_state">blocked</field>
<field name="state">02_changes_requested</field>
<field name="create_date" eval="DateTime.now() - relativedelta(days=4)"/>
<field name="sale_line_id" ref="sale_timesheet.sale_line_22"/>
<field name="sale_order_id" ref="sale_timesheet.sale_order_2"/>
<field name="partner_id" ref="base.res_partner_4"/>
@ -1174,6 +1392,7 @@
<field name="stage_id" ref="project.project_stage_2"/>
<field name="sale_line_id" ref="sale_timesheet.sale_line_22"/>
<field name="sale_order_id" ref="sale_timesheet.sale_order_2"/>
<field name="create_date" eval="DateTime.now() - relativedelta(days=4)"/>
<field name="partner_id" ref="base.res_partner_4"/>
<field name="user_ids" eval="[Command.link(ref('base.user_demo'))]"/>
</record>
@ -1217,7 +1436,7 @@
<field name="name">Ceiling fan</field>
<field name="project_id" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_2'))]"/>
<field name="stage_id" ref="project.project_stage_0"/>
<field name="kanban_state">blocked</field>
<field name="state">02_changes_requested</field>
<field name="sale_line_id" ref="sale_timesheet.sale_line_22"/>
<field name="sale_order_id" ref="sale_timesheet.sale_order_2"/>
<field name="partner_id" ref="base.res_partner_4"/>
@ -1228,7 +1447,7 @@
<field name="name">Plumbing</field>
<field name="project_id" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_2'))]"/>
<field name="stage_id" ref="project.project_stage_0"/>
<field name="kanban_state">blocked</field>
<field name="state">02_changes_requested</field>
<field name="sale_line_id" ref="sale_timesheet.sale_line_22"/>
<field name="sale_order_id" ref="sale_timesheet.sale_order_2"/>
<field name="partner_id" ref="base.res_partner_4"/>
@ -2578,5 +2797,16 @@
<field name="progress" eval="30"/>
<field name="status">at_risk</field>
</record>
<!-- Change task creation notifications date -->
<function model="mail.message" name="write">
<value model="mail.message"
eval="obj().env['mail.message'].search([
('subtype_id', '=', ref('project.mt_task_new')),
('res_id', 'in', [ref('sale_timesheet.project_dpc_task_4'), ref('sale_timesheet.project_dpc_task_5')]),
]).ids"
/>
<value eval="{'date': DateTime.now() - relativedelta(days=4)}"/>
</function>
</data>
</odoo>

View file

@ -1,29 +1,28 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
#
# Translators:
# Martin Trigaux, 2022
#
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Project-Id-Version: Odoo Server 16.0beta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-06 13:32+0000\n"
"POT-Creation-Date: 2023-05-16 13:49+0000\n"
"PO-Revision-Date: 2022-09-22 05:55+0000\n"
"Last-Translator: Martin Trigaux, 2022\n"
"Language-Team: Afrikaans (https://app.transifex.com/odoo/teams/41243/af/)\n"
"Language-Team: Afrikaans (https://www.transifex.com/odoo/teams/41243/af/)\n"
"Language: af\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: af\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account_move.py:0
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"\n"
" <p class=\"o_view_nocontent_smiling_face\">\n"
@ -43,15 +42,12 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__billable_percentage
msgid ""
"% of timesheets that are billable compared to the total number of timesheets"
" linked to the AA of the project, rounded to the unit."
msgid "% of timesheets that are billable compared to the total number of timesheets linked to the AA of the project, rounded to the unit."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "%(amount)s %(label)s will be added to the new Sales Order."
msgstr ""
@ -66,15 +62,8 @@ msgid ", leading to a"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid ""
"<i class=\"fa fa-long-arrow-right mx-2\" aria-label=\"Arrow icon\" "
"title=\"Arrow\"/>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form
msgid "<span class=\"o_form_label\">Time Billing</span>"
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
msgid "<span class=\"o_stat_text\">Invoice</span>"
msgstr ""
#. module: sale_timesheet
@ -83,6 +72,11 @@ msgstr ""
msgid "<span class=\"o_stat_text\">Recorded</span>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
msgid "<span class=\"o_stat_text\">Sales Order</span>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_task_inherit
msgid "<strong>Invoiced:</strong>"
@ -110,7 +104,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "<u>Sold</u>"
msgid "<u>Sales</u>"
msgstr ""
#. module: sale_timesheet
@ -123,7 +117,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_sale_order_line__qty_delivered_method
msgid ""
"According to product configuration, the delivered quantity can be automatically computed by mechanism :\n"
"According to product configuration, the delivered quantity can be automatically computed by mechanism:\n"
" - Manual: the quantity is set manually on the line\n"
" - Analytic From expenses: the quantity is the quantity sum from posted expenses\n"
" - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n"
@ -149,9 +143,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.constraint,message:sale_timesheet.constraint_project_create_sale_order_line_unique_employee_per_wizard
#: model:ir.model.constraint,message:sale_timesheet.constraint_project_sale_line_employee_map_uniqueness_employee
msgid ""
"An employee cannot be selected more than once in the mapping. Please remove "
"duplicate(s) and try again."
msgid "An employee cannot be selected more than once in the mapping. Please remove duplicate(s) and try again."
msgstr ""
#. module: sale_timesheet
@ -177,19 +169,17 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "At least one line should be filled."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid "Based on Timesheets"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__allow_billable
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__allow_billable
msgid "Billable"
msgstr ""
@ -206,20 +196,17 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__timesheet_invoice_type
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__timesheet_invoice_type
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
msgid "Billable Type"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_manual
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_manual
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed Manually"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed at a Fixed Price"
msgstr ""
@ -233,7 +220,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_milestones
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_milestones
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed on Milestones"
msgstr ""
@ -241,7 +227,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_time
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_time
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed on Timesheets"
msgstr ""
@ -261,12 +246,6 @@ msgstr ""
msgid "By Billing Type"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_invoice_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
msgid "Cancel"
msgstr "Gekanselleer"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__sale_order_id
msgid "Choose the Sales Order to invoice"
@ -330,12 +309,9 @@ msgid "Create SO from project"
msgstr ""
#. module: sale_timesheet
#. odoo-javascript
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: code:addons/sale_timesheet/static/src/xml/sale_project_templates.xml:0
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
#, python-format
msgid "Create Sales Order"
msgstr ""
@ -406,8 +382,14 @@ msgid "Days Remaining)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_project_view_form
msgid "Default Service"
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Delivered"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_invoice_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
msgid "Discard"
msgstr ""
#. module: sale_timesheet
@ -428,16 +410,11 @@ msgstr "Vertoningsnaam"
msgid "Draft Invoice"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Effective"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line__employee_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__employee_id
msgid "Employee"
msgstr ""
msgstr "Werknemer"
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__project_project__pricing_type__employee_rate
@ -518,13 +495,11 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/models/account.py:0
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__timesheet_invoice_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__timesheet_invoice_id
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.report_timesheet_account_move
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Invoice"
msgstr ""
@ -536,37 +511,25 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity) on projects or tasks you'll"
" create later on."
msgid "Invoice based on timesheets (delivered quantity) on projects or tasks you'll create later on."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create a project for "
"the order with a task for each sales order line to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create a project for the order with a task for each sales order line to track the time spent."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create a task in an "
"existing project to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create a task in an existing project to track the time spent."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create an empty "
"project for the order to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create an empty project for the order to track the time spent."
msgstr ""
#. module: sale_timesheet
@ -580,10 +543,14 @@ msgstr ""
msgid "Invoice your time and material to customers"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Invoiced"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Invoices"
msgstr ""
@ -627,26 +594,11 @@ msgstr ""
msgid "Junior Architect (Invoice on Timesheets)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid ""
"Keep track of your working hours by project every day and bill your "
"customers for that time."
msgstr ""
#. module: sale_timesheet
#: model:product.template,name:sale_timesheet.product_service_deliver_milestones_product_template
msgid "Kitchen Assembly (Milestones)"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map____last_update
msgid "Last Modified on"
msgstr "Laas Gewysig op"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__write_uid
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order__write_uid
@ -683,19 +635,11 @@ msgid "Margin"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__other_costs
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_costs
msgid "Other costs"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__other_revenues
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_costs
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_revenues
msgid "Other revenues"
msgid "Materials"
msgstr ""
#. module: sale_timesheet
@ -729,13 +673,13 @@ msgid "No activities found"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid "No data yet!"
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid "No activities found. Let's start a new one!"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid "No timesheets found. Let's create one!"
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid "No data yet!"
msgstr ""
#. module: sale_timesheet
@ -745,11 +689,16 @@ msgid "Non Billable Tasks"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Non-Billable"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_tree_inherit
msgid "Non-billable"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__non_billable_time
msgid "Non-billable Hours"
@ -781,17 +730,12 @@ msgstr ""
#: model:ir.model.fields,help:sale_timesheet.field_sale_advance_payment_inv__date_end_invoice_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_sale_advance_payment_inv__date_start_invoice_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid ""
"Only timesheets not yet invoiced (and validated, if applicable) from this "
"period will be invoiced. If the period is not indicated, all timesheets not "
"yet invoiced (and validated, if applicable) will be invoiced without "
"distinction."
msgid "Only timesheets not yet invoiced (and validated, if applicable) from this period will be invoiced. If the period is not indicated, all timesheets not yet invoiced (and validated, if applicable) will be invoiced without distinction."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Operation not supported"
msgstr ""
@ -802,7 +746,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
msgid "Hours Ordered,"
msgid "Ordered,"
msgstr ""
#. module: sale_timesheet
@ -829,9 +773,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_product_product__service_upsell_threshold
#: model:ir.model.fields,help:sale_timesheet.field_product_template__service_upsell_threshold
msgid ""
"Percentage of time delivered compared to the prepaid amount that must be "
"reached for the upselling opportunity activity to be triggered."
msgid "Percentage of time delivered compared to the prepaid amount that must be reached for the upselling opportunity activity to be triggered."
msgstr ""
#. module: sale_timesheet
@ -859,9 +801,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_create_sale_order_line__product_id
msgid ""
"Product of the sales order item. Must be a service invoiced based on "
"timesheets on tasks."
msgid "Product of the sales order item. Must be a service invoiced based on timesheets on tasks."
msgstr ""
#. module: sale_timesheet
@ -919,7 +859,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Quotation"
msgstr ""
@ -934,11 +873,6 @@ msgstr ""
msgid "Remaining Days on SO"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
msgid "Remaining Days on SO:"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__remaining_hours_available
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__remaining_hours_available
@ -947,26 +881,27 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__remaining_hours_so
#: model:ir.model.fields,field_description:sale_timesheet.field_report_project_task_user__remaining_hours_so
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__remaining_hours
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_sharing_inherit_project_task_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_task_view_form_inherit_sale_timesheet
msgid "Remaining Hours on SO"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
msgid "Remaining Hours on SO:"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
msgid "Hours Remaining)"
msgid "Remaining)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid ""
"Review your timesheets by billing type and make sure your time is billable."
msgid "Review your timesheets by billing type and make sure your time is billable."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
msgid "Sale Order"
msgstr ""
#. module: sale_timesheet
@ -987,33 +922,34 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: model:ir.model,name:sale_timesheet.model_sale_order
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__order_id
#: model:project.project,name:sale_timesheet.so_template_project
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Sales Order"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__so_line
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__sale_line_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__so_line
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.report_timesheet_sale_order
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Sales Order Item"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Sales Order Items"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
@ -1034,10 +970,12 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_account_analytic_line__so_line
msgid ""
"Sales order item to which the time spent will be added in order to be "
"invoiced to your customer. Remove the sales order item for the timesheet "
"entry to be non-billable."
msgid "Sales order item to which the time spent will be added in order to be invoiced to your customer. Remove the sales order item for the timesheet entry to be non-billable."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_sale_line_employee_map__sale_order_id
msgid "Sales order to which the project is linked."
msgstr ""
#. module: sale_timesheet
@ -1048,21 +986,18 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Invoice"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Sales Order"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Sales Order Item"
msgstr ""
@ -1083,7 +1018,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line__product_id
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Service"
msgstr ""
@ -1101,16 +1035,13 @@ msgstr ""
#. module: sale_timesheet
#: model:product.template,name:sale_timesheet.time_product_product_template
msgid "Service on Timesheet"
msgid "Service on Timesheets"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__timesheet_product_id
#: model:ir.model.fields,help:sale_timesheet.field_project_task__timesheet_product_id
msgid ""
"Service that will be used by default when invoicing the time spent on a "
"task. It can be modified on each task individually by selecting a specific "
"sales order item."
msgid "Service that will be used by default when invoicing the time spent on a task. It can be modified on each task individually by selecting a specific sales order item."
msgstr ""
#. module: sale_timesheet
@ -1150,30 +1081,19 @@ msgid "Tasks"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"The %s product is required by the Timesheets app and cannot be archived nor "
"deleted."
#: model:ir.model,name:sale_timesheet.model_report_project_task_user
msgid "Tasks Analysis"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"The %s product is required by the Timesheets app and cannot be linked to a "
"company."
msgid "The %s product is required by the Timesheets app and cannot be archived nor deleted."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid ""
"The Sales Order cannot be created because you did not enter some employees that entered timesheets on this project. Please list all the relevant employees before creating the Sales Order.\n"
"Missing employee(s): %s"
@ -1187,51 +1107,47 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "The project has already a sale order."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "The project is already linked to a sales order item."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid ""
"The sales order cannot be created because some timesheets of this project "
"are already linked to another sales order."
msgid "The sales order cannot be created because some timesheets of this project are already linked to another sales order."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_invoice.py:0
#, python-format
msgid "The selected Sales Order should contain something to invoice."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__pricing_type
#: model:ir.model.fields,help:sale_timesheet.field_project_task__pricing_type
msgid ""
"The task rate is perfect if you would like to bill different services to "
"different customers at different rates. The fixed rate is perfect if you "
"bill a service at a fixed rate per hour or day worked regardless of the "
"employee who performed it. The employee rate is preferable if your employees"
" deliver the same service at a different rate. For instance, junior and "
"senior consultants would deliver the same service (= consultancy), but at a "
"different rate because of their level of seniority."
msgid "The task rate is perfect if you would like to bill different services to different customers at different rates. The fixed rate is perfect if you bill a service at a fixed rate per hour or day worked regardless of the employee who performed it. The employee rate is preferable if your employees deliver the same service at a different rate. For instance, junior and senior consultants would deliver the same service (= consultancy), but at a different rate because of their level of seniority."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_sale_line_employee_map__cost
msgid "This cost overrides the employee's default employee hourly wage in employee's HR Settings"
msgstr ""
#. module: sale_timesheet
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_1
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_2
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_3
msgid ""
"This cost overrides the employee's default employee hourly wage in "
"employee's HR Settings"
"This is a <strong>sample quotation template</strong>. You should\n"
" customize it to fit your own needs from the <i>Sales</i>\n"
" application, using the menu: Configuration /\n"
" Quotation Templates."
msgstr ""
#. module: sale_timesheet
@ -1240,6 +1156,11 @@ msgstr ""
msgid "Threshold"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form
msgid "Time Billing"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.product_template_view_search_sale_timesheet
msgid "Time-based services"
@ -1294,11 +1215,6 @@ msgstr ""
msgid "Timesheet activities"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order__timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account_move.py:0
@ -1314,42 +1230,36 @@ msgstr ""
#: model:ir.model.fields.selection,name:sale_timesheet.selection__sale_order_line__qty_delivered_method__timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheets_analysis_report_graph_invoice_type
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_hr_timesheet_line_pivot_billing_rate
#, python-format
msgid "Timesheets"
msgstr ""
msgstr "Tydstate"
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed Manually)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed on Milestones)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed on Timesheets)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Fixed Price)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Non Billable)"
msgstr ""
@ -1363,11 +1273,6 @@ msgstr ""
msgid "Timesheets Analysis Report"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid "Timesheets Period"
msgstr ""
#. module: sale_timesheet
#: model:ir.actions.act_window,name:sale_timesheet.timesheet_action_billing_report
msgid "Timesheets by Billing Type"
@ -1381,7 +1286,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets of %s"
msgstr ""
@ -1393,7 +1297,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets revenues"
msgstr ""
@ -1412,16 +1315,9 @@ msgstr ""
msgid "Timesheets taken when invoicing time spent"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Total"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_create_invoice__amount_to_invoice
msgid ""
"Total amount to invoice on the sales order, including all items (services, "
"storables, expenses, ...)"
msgid "Total amount to invoice on the sales order, including all items (services, storables, expenses, ...)"
msgstr ""
#. module: sale_timesheet
@ -1429,9 +1325,7 @@ msgstr ""
#: model:ir.model.fields,help:sale_timesheet.field_account_move__timesheet_total_duration
#: model:ir.model.fields,help:sale_timesheet.field_account_payment__timesheet_total_duration
#: model:ir.model.fields,help:sale_timesheet.field_sale_order__timesheet_total_duration
msgid ""
"Total recorded duration, expressed in the encoding UoM, and rounded to the "
"unit"
msgid "Total recorded duration, expressed in the encoding UoM, and rounded to the unit"
msgstr ""
#. module: sale_timesheet
@ -1448,9 +1342,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.action_timesheet_from_invoice
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid ""
"Track your working hours by projects every day and invoice this time to your"
" customers."
msgid "Track your working hours by projects every day and invoice this time to your customers."
msgstr ""
#. module: sale_timesheet
@ -1467,7 +1359,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Value does not exist in the pricing type"
msgstr ""
@ -1518,61 +1409,48 @@ msgstr ""
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_invoice.py:0
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "You can only apply this action from a project."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"You cannot link a billable project to a sales order item that comes from an "
"expense or a vendor bill."
msgid "You cannot link a billable project to a sales order item that comes from an expense or a vendor bill."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"You cannot link a billable project to a sales order item that is not a "
"service."
msgid "You cannot link a billable project to a sales order item that is not a service."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
#, python-format
msgid "You cannot modify timesheets that are already invoiced."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
#, python-format
msgid "You cannot remove a timesheet that has already been invoiced."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
#, python-format
msgid "day"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "days"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
msgid "days remaining"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "hours"
msgstr ""
@ -1585,3 +1463,9 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_product_timesheet_form
msgid "of hours sold."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
msgid "remaining"
msgstr ""

View file

@ -1,25 +1,24 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-06 13:32+0000\n"
"POT-Creation-Date: 2023-05-16 13:49+0000\n"
"PO-Revision-Date: 2022-09-22 05:55+0000\n"
"Language-Team: Amharic (https://app.transifex.com/odoo/teams/41243/am/)\n"
"Language: am\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: am\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account_move.py:0
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"\n"
" <p class=\"o_view_nocontent_smiling_face\">\n"
@ -39,15 +38,12 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__billable_percentage
msgid ""
"% of timesheets that are billable compared to the total number of timesheets"
" linked to the AA of the project, rounded to the unit."
msgid "% of timesheets that are billable compared to the total number of timesheets linked to the AA of the project, rounded to the unit."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "%(amount)s %(label)s will be added to the new Sales Order."
msgstr ""
@ -62,15 +58,8 @@ msgid ", leading to a"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid ""
"<i class=\"fa fa-long-arrow-right mx-2\" aria-label=\"Arrow icon\" "
"title=\"Arrow\"/>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form
msgid "<span class=\"o_form_label\">Time Billing</span>"
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
msgid "<span class=\"o_stat_text\">Invoice</span>"
msgstr ""
#. module: sale_timesheet
@ -79,6 +68,11 @@ msgstr ""
msgid "<span class=\"o_stat_text\">Recorded</span>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
msgid "<span class=\"o_stat_text\">Sales Order</span>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_task_inherit
msgid "<strong>Invoiced:</strong>"
@ -106,7 +100,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "<u>Sold</u>"
msgid "<u>Sales</u>"
msgstr ""
#. module: sale_timesheet
@ -119,7 +113,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_sale_order_line__qty_delivered_method
msgid ""
"According to product configuration, the delivered quantity can be automatically computed by mechanism :\n"
"According to product configuration, the delivered quantity can be automatically computed by mechanism:\n"
" - Manual: the quantity is set manually on the line\n"
" - Analytic From expenses: the quantity is the quantity sum from posted expenses\n"
" - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n"
@ -145,9 +139,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.constraint,message:sale_timesheet.constraint_project_create_sale_order_line_unique_employee_per_wizard
#: model:ir.model.constraint,message:sale_timesheet.constraint_project_sale_line_employee_map_uniqueness_employee
msgid ""
"An employee cannot be selected more than once in the mapping. Please remove "
"duplicate(s) and try again."
msgid "An employee cannot be selected more than once in the mapping. Please remove duplicate(s) and try again."
msgstr ""
#. module: sale_timesheet
@ -173,19 +165,17 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "At least one line should be filled."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid "Based on Timesheets"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__allow_billable
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__allow_billable
msgid "Billable"
msgstr ""
@ -202,20 +192,17 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__timesheet_invoice_type
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__timesheet_invoice_type
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
msgid "Billable Type"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_manual
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_manual
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed Manually"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed at a Fixed Price"
msgstr ""
@ -229,7 +216,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_milestones
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_milestones
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed on Milestones"
msgstr ""
@ -237,7 +223,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_time
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_time
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed on Timesheets"
msgstr ""
@ -257,12 +242,6 @@ msgstr ""
msgid "By Billing Type"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_invoice_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
msgid "Cancel"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__sale_order_id
msgid "Choose the Sales Order to invoice"
@ -326,12 +305,9 @@ msgid "Create SO from project"
msgstr ""
#. module: sale_timesheet
#. odoo-javascript
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: code:addons/sale_timesheet/static/src/xml/sale_project_templates.xml:0
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
#, python-format
msgid "Create Sales Order"
msgstr ""
@ -402,8 +378,14 @@ msgid "Days Remaining)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_project_view_form
msgid "Default Service"
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Delivered"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_invoice_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
msgid "Discard"
msgstr ""
#. module: sale_timesheet
@ -424,16 +406,11 @@ msgstr ""
msgid "Draft Invoice"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Effective"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line__employee_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__employee_id
msgid "Employee"
msgstr ""
msgstr "ተቀጣሪ"
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__project_project__pricing_type__employee_rate
@ -514,13 +491,11 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/models/account.py:0
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__timesheet_invoice_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__timesheet_invoice_id
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.report_timesheet_account_move
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Invoice"
msgstr ""
@ -532,37 +507,25 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity) on projects or tasks you'll"
" create later on."
msgid "Invoice based on timesheets (delivered quantity) on projects or tasks you'll create later on."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create a project for "
"the order with a task for each sales order line to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create a project for the order with a task for each sales order line to track the time spent."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create a task in an "
"existing project to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create a task in an existing project to track the time spent."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create an empty "
"project for the order to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create an empty project for the order to track the time spent."
msgstr ""
#. module: sale_timesheet
@ -576,10 +539,14 @@ msgstr ""
msgid "Invoice your time and material to customers"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Invoiced"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Invoices"
msgstr ""
@ -623,26 +590,11 @@ msgstr ""
msgid "Junior Architect (Invoice on Timesheets)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid ""
"Keep track of your working hours by project every day and bill your "
"customers for that time."
msgstr ""
#. module: sale_timesheet
#: model:product.template,name:sale_timesheet.product_service_deliver_milestones_product_template
msgid "Kitchen Assembly (Milestones)"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map____last_update
msgid "Last Modified on"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__write_uid
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order__write_uid
@ -679,13 +631,10 @@ msgid "Margin"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__other_costs
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__other_revenues
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_costs
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_revenues
#, python-format
msgid "Materials"
msgstr ""
@ -720,13 +669,13 @@ msgid "No activities found"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid "No data yet!"
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid "No activities found. Let's start a new one!"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid "No timesheets found. Let's create one!"
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid "No data yet!"
msgstr ""
#. module: sale_timesheet
@ -736,11 +685,16 @@ msgid "Non Billable Tasks"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Non-Billable"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_tree_inherit
msgid "Non-billable"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__non_billable_time
msgid "Non-billable Hours"
@ -772,17 +726,12 @@ msgstr ""
#: model:ir.model.fields,help:sale_timesheet.field_sale_advance_payment_inv__date_end_invoice_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_sale_advance_payment_inv__date_start_invoice_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid ""
"Only timesheets not yet invoiced (and validated, if applicable) from this "
"period will be invoiced. If the period is not indicated, all timesheets not "
"yet invoiced (and validated, if applicable) will be invoiced without "
"distinction."
msgid "Only timesheets not yet invoiced (and validated, if applicable) from this period will be invoiced. If the period is not indicated, all timesheets not yet invoiced (and validated, if applicable) will be invoiced without distinction."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Operation not supported"
msgstr ""
@ -793,7 +742,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
msgid "Hours Ordered,"
msgid "Ordered,"
msgstr ""
#. module: sale_timesheet
@ -820,9 +769,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_product_product__service_upsell_threshold
#: model:ir.model.fields,help:sale_timesheet.field_product_template__service_upsell_threshold
msgid ""
"Percentage of time delivered compared to the prepaid amount that must be "
"reached for the upselling opportunity activity to be triggered."
msgid "Percentage of time delivered compared to the prepaid amount that must be reached for the upselling opportunity activity to be triggered."
msgstr ""
#. module: sale_timesheet
@ -850,9 +797,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_create_sale_order_line__product_id
msgid ""
"Product of the sales order item. Must be a service invoiced based on "
"timesheets on tasks."
msgid "Product of the sales order item. Must be a service invoiced based on timesheets on tasks."
msgstr ""
#. module: sale_timesheet
@ -910,7 +855,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Quotation"
msgstr ""
@ -925,11 +869,6 @@ msgstr ""
msgid "Remaining Days on SO"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
msgid "Remaining Days on SO:"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__remaining_hours_available
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__remaining_hours_available
@ -938,26 +877,27 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__remaining_hours_so
#: model:ir.model.fields,field_description:sale_timesheet.field_report_project_task_user__remaining_hours_so
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__remaining_hours
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_sharing_inherit_project_task_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_task_view_form_inherit_sale_timesheet
msgid "Remaining Hours on SO"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
msgid "Remaining Hours on SO:"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
msgid "Hours Remaining)"
msgid "Remaining)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid ""
"Review your timesheets by billing type and make sure your time is billable."
msgid "Review your timesheets by billing type and make sure your time is billable."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
msgid "Sale Order"
msgstr ""
#. module: sale_timesheet
@ -978,33 +918,34 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: model:ir.model,name:sale_timesheet.model_sale_order
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__order_id
#: model:project.project,name:sale_timesheet.so_template_project
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Sales Order"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__so_line
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__sale_line_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__so_line
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.report_timesheet_sale_order
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Sales Order Item"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Sales Order Items"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
@ -1025,10 +966,12 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_account_analytic_line__so_line
msgid ""
"Sales order item to which the time spent will be added in order to be "
"invoiced to your customer. Remove the sales order item for the timesheet "
"entry to be non-billable."
msgid "Sales order item to which the time spent will be added in order to be invoiced to your customer. Remove the sales order item for the timesheet entry to be non-billable."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_sale_line_employee_map__sale_order_id
msgid "Sales order to which the project is linked."
msgstr ""
#. module: sale_timesheet
@ -1039,21 +982,18 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Invoice"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Sales Order"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Sales Order Item"
msgstr ""
@ -1074,7 +1014,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line__product_id
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Service"
msgstr ""
@ -1092,16 +1031,13 @@ msgstr ""
#. module: sale_timesheet
#: model:product.template,name:sale_timesheet.time_product_product_template
msgid "Service on Timesheet"
msgid "Service on Timesheets"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__timesheet_product_id
#: model:ir.model.fields,help:sale_timesheet.field_project_task__timesheet_product_id
msgid ""
"Service that will be used by default when invoicing the time spent on a "
"task. It can be modified on each task individually by selecting a specific "
"sales order item."
msgid "Service that will be used by default when invoicing the time spent on a task. It can be modified on each task individually by selecting a specific sales order item."
msgstr ""
#. module: sale_timesheet
@ -1140,22 +1076,20 @@ msgstr ""
msgid "Tasks"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_report_project_task_user
msgid "Tasks Analysis"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"The %s product is required by the Timesheets app and cannot be archived nor "
"deleted."
msgid "The %s product is required by the Timesheets app and cannot be archived nor deleted."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid ""
"The Sales Order cannot be created because you did not enter some employees that entered timesheets on this project. Please list all the relevant employees before creating the Sales Order.\n"
"Missing employee(s): %s"
@ -1169,51 +1103,47 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "The project has already a sale order."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "The project is already linked to a sales order item."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid ""
"The sales order cannot be created because some timesheets of this project "
"are already linked to another sales order."
msgid "The sales order cannot be created because some timesheets of this project are already linked to another sales order."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_invoice.py:0
#, python-format
msgid "The selected Sales Order should contain something to invoice."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__pricing_type
#: model:ir.model.fields,help:sale_timesheet.field_project_task__pricing_type
msgid ""
"The task rate is perfect if you would like to bill different services to "
"different customers at different rates. The fixed rate is perfect if you "
"bill a service at a fixed rate per hour or day worked regardless of the "
"employee who performed it. The employee rate is preferable if your employees"
" deliver the same service at a different rate. For instance, junior and "
"senior consultants would deliver the same service (= consultancy), but at a "
"different rate because of their level of seniority."
msgid "The task rate is perfect if you would like to bill different services to different customers at different rates. The fixed rate is perfect if you bill a service at a fixed rate per hour or day worked regardless of the employee who performed it. The employee rate is preferable if your employees deliver the same service at a different rate. For instance, junior and senior consultants would deliver the same service (= consultancy), but at a different rate because of their level of seniority."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_sale_line_employee_map__cost
msgid "This cost overrides the employee's default employee hourly wage in employee's HR Settings"
msgstr ""
#. module: sale_timesheet
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_1
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_2
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_3
msgid ""
"This cost overrides the employee's default employee hourly wage in "
"employee's HR Settings"
"This is a <strong>sample quotation template</strong>. You should\n"
" customize it to fit your own needs from the <i>Sales</i>\n"
" application, using the menu: Configuration /\n"
" Quotation Templates."
msgstr ""
#. module: sale_timesheet
@ -1222,6 +1152,11 @@ msgstr ""
msgid "Threshold"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form
msgid "Time Billing"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.product_template_view_search_sale_timesheet
msgid "Time-based services"
@ -1276,11 +1211,6 @@ msgstr ""
msgid "Timesheet activities"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order__timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account_move.py:0
@ -1296,42 +1226,36 @@ msgstr ""
#: model:ir.model.fields.selection,name:sale_timesheet.selection__sale_order_line__qty_delivered_method__timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheets_analysis_report_graph_invoice_type
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_hr_timesheet_line_pivot_billing_rate
#, python-format
msgid "Timesheets"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed Manually)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed on Milestones)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed on Timesheets)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Fixed Price)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Non Billable)"
msgstr ""
@ -1345,11 +1269,6 @@ msgstr ""
msgid "Timesheets Analysis Report"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid "Timesheets Period"
msgstr ""
#. module: sale_timesheet
#: model:ir.actions.act_window,name:sale_timesheet.timesheet_action_billing_report
msgid "Timesheets by Billing Type"
@ -1363,7 +1282,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets of %s"
msgstr ""
@ -1375,7 +1293,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets revenues"
msgstr ""
@ -1394,16 +1311,9 @@ msgstr ""
msgid "Timesheets taken when invoicing time spent"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Total"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_create_invoice__amount_to_invoice
msgid ""
"Total amount to invoice on the sales order, including all items (services, "
"storables, expenses, ...)"
msgid "Total amount to invoice on the sales order, including all items (services, storables, expenses, ...)"
msgstr ""
#. module: sale_timesheet
@ -1411,9 +1321,7 @@ msgstr ""
#: model:ir.model.fields,help:sale_timesheet.field_account_move__timesheet_total_duration
#: model:ir.model.fields,help:sale_timesheet.field_account_payment__timesheet_total_duration
#: model:ir.model.fields,help:sale_timesheet.field_sale_order__timesheet_total_duration
msgid ""
"Total recorded duration, expressed in the encoding UoM, and rounded to the "
"unit"
msgid "Total recorded duration, expressed in the encoding UoM, and rounded to the unit"
msgstr ""
#. module: sale_timesheet
@ -1430,9 +1338,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.action_timesheet_from_invoice
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid ""
"Track your working hours by projects every day and invoice this time to your"
" customers."
msgid "Track your working hours by projects every day and invoice this time to your customers."
msgstr ""
#. module: sale_timesheet
@ -1449,7 +1355,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Value does not exist in the pricing type"
msgstr ""
@ -1500,61 +1405,48 @@ msgstr ""
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_invoice.py:0
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "You can only apply this action from a project."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"You cannot link a billable project to a sales order item that comes from an "
"expense or a vendor bill."
msgid "You cannot link a billable project to a sales order item that comes from an expense or a vendor bill."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"You cannot link a billable project to a sales order item that is not a "
"service."
msgid "You cannot link a billable project to a sales order item that is not a service."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
#, python-format
msgid "You cannot modify timesheets that are already invoiced."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
#, python-format
msgid "You cannot remove a timesheet that has already been invoiced."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
#, python-format
msgid "day"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "days"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
msgid "days remaining"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "hours"
msgstr ""
@ -1567,3 +1459,9 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_product_timesheet_form
msgid "of hours sold."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
msgid "remaining"
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

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

@ -1,102 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2015-09-10 15:21+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: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_res_company
msgid "Companies"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_hr_employee
msgid "Employee"
msgstr "Employee"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_product_template
msgid "Product Template"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Project"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_project_project_id
msgid "Project associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order
msgid "Sales Order"
msgstr "Sales Order"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
msgstr "Sales Order Line"
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid ""
"This will set the unit of measure used in projects and tasks.\n"
"If you use the timesheet linked to projects, don't forget to setup the right "
"unit of measure in your employees."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee_timesheet_cost
msgid "Timesheet Cost"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid "Timesheet UoM"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_count
msgid "Timesheet activities"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_employee_extd_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Timesheets"
msgstr ""
#. module: sale_timesheet
#: code:addons/sale_timesheet/models/sale_timesheet.py:128
#, python-format
msgid ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_account_analytic_line
msgid "account analytic line"
msgstr ""

View file

@ -1,110 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
# Andi Chandler <andi@gowling.com>, 2016
# James Dove <james@oceancave.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2016-04-21 09:27+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/odoo/"
"odoo-9/language/en_GB/)\n"
"Language: en_GB\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: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_res_company
msgid "Companies"
msgstr "Companies"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_hr_employee
msgid "Employee"
msgstr "Employee"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_product_template
msgid "Product Template"
msgstr "Product Template"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Project"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_project_project_id
#, fuzzy
msgid "Project associated to this sale"
msgstr "Timesheet activities associated to this sale"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order
msgid "Sales Order"
msgstr "Sales Order"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
msgstr "Sales Order Line"
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid ""
"This will set the unit of measure used in projects and tasks.\n"
"If you use the timesheet linked to projects, don't forget to setup the right "
"unit of measure in your employees."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee_timesheet_cost
msgid "Timesheet Cost"
msgstr "Timesheet Cost"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.project_time_mode_id_duplicate_xmlid
#, fuzzy
msgid "Timesheet UoM"
msgstr "Timesheet"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_count
msgid "Timesheet activities"
msgstr "Timesheet activities"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr "Timesheet activities associated to this sale"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_employee_extd_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Timesheets"
msgstr "Timesheets"
#. module: sale_timesheet
#: code:addons/sale_timesheet/models/sale_timesheet.py:128
#, python-format
msgid ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
msgstr ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_account_analytic_line
#, fuzzy
msgid "account analytic line"
msgstr "Analytic Line"

File diff suppressed because it is too large Load diff

View file

@ -1,103 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2015-12-11 15:41+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: Spanish (Bolivia) (http://www.transifex.com/odoo/odoo-9/"
"language/es_BO/)\n"
"Language: es_BO\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: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_hr_employee
msgid "Employee"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_product_template
msgid "Product Template"
msgstr "Plantilla de producto"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Project"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_project_project_id
msgid "Project associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order
msgid "Sales Order"
msgstr "Pedido de Venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid ""
"This will set the unit of measure used in projects and tasks.\n"
"If you use the timesheet linked to projects, don't forget to setup the right "
"unit of measure in your employees."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee_timesheet_cost
msgid "Timesheet Cost"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid "Timesheet UoM"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_count
msgid "Timesheet activities"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_employee_extd_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Timesheets"
msgstr ""
#. module: sale_timesheet
#: code:addons/sale_timesheet/models/sale_timesheet.py:128
#, python-format
msgid ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_account_analytic_line
#, fuzzy
msgid "account analytic line"
msgstr "Línea analítica"

View file

@ -1,130 +0,0 @@
# #-#-#-#-# es_CO.po (Odoo 9.0) #-#-#-#-#
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
# Mateo Tibaquirá <nestormateo@gmail.com>, 2015
# #-#-#-#-# es_CO.po (Odoo 9.0) #-#-#-#-#
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2015-10-23 21:08+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: Spanish (Colombia) (http://www.transifex.com/odoo/odoo-9/"
"language/es_CO/)\n"
"Language: es_CO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"#-#-#-#-# es_CO.po (Odoo 9.0) #-#-#-#-#\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"#-#-#-#-# es_CO.po (Odoo 9.0) #-#-#-#-#\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_hr_employee
msgid "Employee"
msgstr "Empleado"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_product_template
msgid "Product Template"
msgstr "Plantilla del Producto"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Project"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_project_project_id
#, fuzzy
msgid "Project associated to this sale"
msgstr "Actividades del parte de horas asociadas a esta venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order
#, fuzzy
msgid "Sales Order"
msgstr ""
"#-#-#-#-# es_CO.po (Odoo 9.0) #-#-#-#-#\n"
"Orden de Venta\n"
"#-#-#-#-# es_CO.po (Odoo 9.0) #-#-#-#-#\n"
"Pedido de Venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
#, fuzzy
msgid "Sales Order Line"
msgstr ""
"#-#-#-#-# es_CO.po (Odoo 9.0) #-#-#-#-#\n"
"Línea Orden de Venta\n"
"#-#-#-#-# es_CO.po (Odoo 9.0) #-#-#-#-#\n"
"Línea de Pedido de Venta"
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid ""
"This will set the unit of measure used in projects and tasks.\n"
"If you use the timesheet linked to projects, don't forget to setup the right "
"unit of measure in your employees."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee_timesheet_cost
msgid "Timesheet Cost"
msgstr "Costo del Parte de Horas"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.project_time_mode_id_duplicate_xmlid
#, fuzzy
msgid "Timesheet UoM"
msgstr "Parte de Horas"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_count
msgid "Timesheet activities"
msgstr "Actividades del parte de horas"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr "Actividades del parte de horas asociadas a esta venta"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_employee_extd_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Timesheets"
msgstr "Partes de Horas"
#. module: sale_timesheet
#: code:addons/sale_timesheet/models/sale_timesheet.py:128
#, python-format
msgid ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
msgstr ""
"Puede usar sólo un producto en el parte de horas dentro de la misma orden de "
"venta. Debería dividir su orden para incluir sólo un contrato basado en "
"tiempos y materiales."
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_account_analytic_line
#, fuzzy
msgid "account analytic line"
msgstr "Línea Analítica"

View file

@ -1,104 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2015-09-10 15:21+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: Spanish (Costa Rica) (http://www.transifex.com/odoo/odoo-9/"
"language/es_CR/)\n"
"Language: es_CR\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: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_hr_employee
msgid "Employee"
msgstr "Empleado"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_product_template
msgid "Product Template"
msgstr "Plantilla de producto"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Project"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_project_project_id
msgid "Project associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order
msgid "Sales Order"
msgstr "Pedido de venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
msgstr "Línea pedido de venta"
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid ""
"This will set the unit of measure used in projects and tasks.\n"
"If you use the timesheet linked to projects, don't forget to setup the right "
"unit of measure in your employees."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee_timesheet_cost
msgid "Timesheet Cost"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.project_time_mode_id_duplicate_xmlid
#, fuzzy
msgid "Timesheet UoM"
msgstr "Hojas de trabajo"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_count
msgid "Timesheet activities"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_employee_extd_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Timesheets"
msgstr "Hojas de trabajo"
#. module: sale_timesheet
#: code:addons/sale_timesheet/models/sale_timesheet.py:128
#, python-format
msgid ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_account_analytic_line
#, fuzzy
msgid "account analytic line"
msgstr "Línea Analítica"

View file

@ -1,109 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
# Juliano Henriquez <juliano@consultoriahenca.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2016-05-19 05:27+0000\n"
"Last-Translator: Juliano Henriquez <juliano@consultoriahenca.com>\n"
"Language-Team: Spanish (Dominican Republic) (http://www.transifex.com/odoo/"
"odoo-9/language/es_DO/)\n"
"Language: es_DO\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: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_hr_employee
msgid "Employee"
msgstr "Empleado"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_product_template
msgid "Product Template"
msgstr "Plantilla producto"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Project"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_project_project_id
#, fuzzy
msgid "Project associated to this sale"
msgstr "Actividades de Hoja de Tiempos relacionadas con esta venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order
msgid "Sales Order"
msgstr "Aviso para pedido de venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
msgstr "Línea pedido de venta"
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid ""
"This will set the unit of measure used in projects and tasks.\n"
"If you use the timesheet linked to projects, don't forget to setup the right "
"unit of measure in your employees."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee_timesheet_cost
msgid "Timesheet Cost"
msgstr "Costos de Hoja de Tiempo"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.project_time_mode_id_duplicate_xmlid
#, fuzzy
msgid "Timesheet UoM"
msgstr "Hoja de Tiempo"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_count
msgid "Timesheet activities"
msgstr "Actividades de Hoja de Tiempo"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr "Actividades de Hoja de Tiempos relacionadas con esta venta"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_employee_extd_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Timesheets"
msgstr "Partes de tiempo"
#. module: sale_timesheet
#: code:addons/sale_timesheet/models/sale_timesheet.py:128
#, python-format
msgid ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
msgstr ""
"Se puede utilizar un solo producto en hoja de tiempo de la misma orden de "
"venta. Usted debe dividir el fin de incluir sólo un contrato basado en "
"tiempo y material."
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_account_analytic_line
#, fuzzy
msgid "account analytic line"
msgstr "Línea analítica"

View file

@ -1,109 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
# Rick Hunter <rick_hunter_ec@yahoo.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2016-02-04 18:16+0000\n"
"Last-Translator: Rick Hunter <rick_hunter_ec@yahoo.com>\n"
"Language-Team: Spanish (Ecuador) (http://www.transifex.com/odoo/odoo-9/"
"language/es_EC/)\n"
"Language: es_EC\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: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_hr_employee
msgid "Employee"
msgstr "Empleado"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_product_template
msgid "Product Template"
msgstr "Plantilla producto"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Project"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_project_project_id
#, fuzzy
msgid "Project associated to this sale"
msgstr "Actividades de las Hojas de Registro asociadas a esta venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order
msgid "Sales Order"
msgstr "Aviso para pedido de venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
msgstr "Línea pedido de venta"
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid ""
"This will set the unit of measure used in projects and tasks.\n"
"If you use the timesheet linked to projects, don't forget to setup the right "
"unit of measure in your employees."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee_timesheet_cost
msgid "Timesheet Cost"
msgstr "Costo de la Hoja de Registro"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.project_time_mode_id_duplicate_xmlid
#, fuzzy
msgid "Timesheet UoM"
msgstr "Hoja de registros"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_count
msgid "Timesheet activities"
msgstr "Actividades de la Hoja de Registro"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr "Actividades de las Hojas de Registro asociadas a esta venta"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_employee_extd_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Timesheets"
msgstr "Hojas de registro"
#. module: sale_timesheet
#: code:addons/sale_timesheet/models/sale_timesheet.py:128
#, python-format
msgid ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
msgstr ""
"Solo puede usar un único producto en la Hoja de Registro dentro del mismo "
"pedido de venta. Debe dividir el pedido para incluir un único contrato "
"basado en tiempo y materiales."
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_account_analytic_line
#, fuzzy
msgid "account analytic line"
msgstr "Línea Analítica"

View file

@ -1,102 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2015-09-10 15:21+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: Spanish (Panama) (http://www.transifex.com/odoo/odoo-9/"
"language/es_PA/)\n"
"Language: es_PA\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: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_res_company
msgid "Companies"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_hr_employee
msgid "Employee"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_product_template
msgid "Product Template"
msgstr "Plantilla de producto"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Project"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_project_project_id
msgid "Project associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order
msgid "Sales Order"
msgstr "Pedido de venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid ""
"This will set the unit of measure used in projects and tasks.\n"
"If you use the timesheet linked to projects, don't forget to setup the right "
"unit of measure in your employees."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee_timesheet_cost
msgid "Timesheet Cost"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid "Timesheet UoM"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_count
msgid "Timesheet activities"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_employee_extd_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Timesheets"
msgstr ""
#. module: sale_timesheet
#: code:addons/sale_timesheet/models/sale_timesheet.py:128
#, python-format
msgid ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_account_analytic_line
msgid "account analytic line"
msgstr ""

View file

@ -1,109 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
# Carlos Eduardo Rodriguez Rossi <crodriguez@samemotion.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2016-06-16 20:05+0000\n"
"Last-Translator: Carlos Eduardo Rodriguez Rossi <crodriguez@samemotion.com>\n"
"Language-Team: Spanish (Peru) (http://www.transifex.com/odoo/odoo-9/language/"
"es_PE/)\n"
"Language: es_PE\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: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_res_company
msgid "Companies"
msgstr "Compañias"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_hr_employee
msgid "Employee"
msgstr "Empleado"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_product_template
msgid "Product Template"
msgstr "Plantilla de Producto"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Project"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_project_project_id
#, fuzzy
msgid "Project associated to this sale"
msgstr "Actividades de Hoja de Tiempo asociadas a esta venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order
msgid "Sales Order"
msgstr "Pedidos de Venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
msgstr "Línea de Pedido de Venta"
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid ""
"This will set the unit of measure used in projects and tasks.\n"
"If you use the timesheet linked to projects, don't forget to setup the right "
"unit of measure in your employees."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee_timesheet_cost
msgid "Timesheet Cost"
msgstr "Costo de Hoja de Tiempo"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.project_time_mode_id_duplicate_xmlid
#, fuzzy
msgid "Timesheet UoM"
msgstr "Hoja de Tiempo"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_count
msgid "Timesheet activities"
msgstr "Actividades de Hoja de Tiempo"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr "Actividades de Hoja de Tiempo asociadas a esta venta"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_employee_extd_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Timesheets"
msgstr "Hoja de Tiempo"
#. module: sale_timesheet
#: code:addons/sale_timesheet/models/sale_timesheet.py:128
#, python-format
msgid ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
msgstr ""
"Solamente puede usar un producto por hoja de tiempo dentro del mismo pedido "
"de venta. Debería dividir su pedido para incluir solamente un contrato "
"basado en tiempo y material."
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_account_analytic_line
#, fuzzy
msgid "account analytic line"
msgstr "Línea Analítica"

View file

@ -1,103 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2015-09-10 15:21+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: Spanish (Paraguay) (http://www.transifex.com/odoo/odoo-9/"
"language/es_PY/)\n"
"Language: es_PY\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: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_hr_employee
msgid "Employee"
msgstr "Empleado"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_product_template
msgid "Product Template"
msgstr "Plantilla de producto"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Project"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_project_project_id
msgid "Project associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order
msgid "Sales Order"
msgstr "Pedido de venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
msgstr "Línea pedido de venta"
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid ""
"This will set the unit of measure used in projects and tasks.\n"
"If you use the timesheet linked to projects, don't forget to setup the right "
"unit of measure in your employees."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee_timesheet_cost
msgid "Timesheet Cost"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid "Timesheet UoM"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_count
msgid "Timesheet activities"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_employee_extd_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Timesheets"
msgstr ""
#. module: sale_timesheet
#: code:addons/sale_timesheet/models/sale_timesheet.py:128
#, python-format
msgid ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_account_analytic_line
#, fuzzy
msgid "account analytic line"
msgstr "Línea analítica"

View file

@ -1,104 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
"PO-Revision-Date: 2015-09-10 15:21+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: Spanish (Venezuela) (http://www.transifex.com/odoo/odoo-9/"
"language/es_VE/)\n"
"Language: es_VE\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: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_hr_employee
msgid "Employee"
msgstr "Empleado"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_product_template
msgid "Product Template"
msgstr "Plantilla de producto"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Project"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_project_project_id
msgid "Project associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order
msgid "Sales Order"
msgstr "Pedido de venta"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
msgstr "Línea pedido de venta"
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.project_time_mode_id_duplicate_xmlid
msgid ""
"This will set the unit of measure used in projects and tasks.\n"
"If you use the timesheet linked to projects, don't forget to setup the right "
"unit of measure in your employees."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_hr_employee_timesheet_cost
msgid "Timesheet Cost"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.project_time_mode_id_duplicate_xmlid
#, fuzzy
msgid "Timesheet UoM"
msgstr "Hojas de trabajo"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_count
msgid "Timesheet activities"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_employee_extd_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_order_form_inherit_sale_timesheet
msgid "Timesheets"
msgstr "Hojas de trabajo"
#. module: sale_timesheet
#: code:addons/sale_timesheet/models/sale_timesheet.py:128
#, python-format
msgid ""
"You can use only one product on timesheet within the same sale order. You "
"should split your order to include only one contract based on time and "
"material."
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_account_analytic_line
#, fuzzy
msgid "account analytic line"
msgstr "Línea analítica"

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

@ -1,29 +1,28 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
#
# Translators:
# Qaidjohar Barbhaya, 2023
#
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-06 13:32+0000\n"
"POT-Creation-Date: 2023-05-16 13:49+0000\n"
"PO-Revision-Date: 2022-09-22 05:55+0000\n"
"Last-Translator: Qaidjohar Barbhaya, 2023\n"
"Language-Team: Gujarati (https://app.transifex.com/odoo/teams/41243/gu/)\n"
"Language: gu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: gu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account_move.py:0
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"\n"
" <p class=\"o_view_nocontent_smiling_face\">\n"
@ -43,15 +42,12 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__billable_percentage
msgid ""
"% of timesheets that are billable compared to the total number of timesheets"
" linked to the AA of the project, rounded to the unit."
msgid "% of timesheets that are billable compared to the total number of timesheets linked to the AA of the project, rounded to the unit."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "%(amount)s %(label)s will be added to the new Sales Order."
msgstr ""
@ -66,15 +62,8 @@ msgid ", leading to a"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid ""
"<i class=\"fa fa-long-arrow-right mx-2\" aria-label=\"Arrow icon\" "
"title=\"Arrow\"/>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form
msgid "<span class=\"o_form_label\">Time Billing</span>"
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
msgid "<span class=\"o_stat_text\">Invoice</span>"
msgstr ""
#. module: sale_timesheet
@ -83,6 +72,11 @@ msgstr ""
msgid "<span class=\"o_stat_text\">Recorded</span>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
msgid "<span class=\"o_stat_text\">Sales Order</span>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_task_inherit
msgid "<strong>Invoiced:</strong>"
@ -110,7 +104,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "<u>Sold</u>"
msgid "<u>Sales</u>"
msgstr ""
#. module: sale_timesheet
@ -123,7 +117,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_sale_order_line__qty_delivered_method
msgid ""
"According to product configuration, the delivered quantity can be automatically computed by mechanism :\n"
"According to product configuration, the delivered quantity can be automatically computed by mechanism:\n"
" - Manual: the quantity is set manually on the line\n"
" - Analytic From expenses: the quantity is the quantity sum from posted expenses\n"
" - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n"
@ -149,9 +143,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.constraint,message:sale_timesheet.constraint_project_create_sale_order_line_unique_employee_per_wizard
#: model:ir.model.constraint,message:sale_timesheet.constraint_project_sale_line_employee_map_uniqueness_employee
msgid ""
"An employee cannot be selected more than once in the mapping. Please remove "
"duplicate(s) and try again."
msgid "An employee cannot be selected more than once in the mapping. Please remove duplicate(s) and try again."
msgstr ""
#. module: sale_timesheet
@ -177,19 +169,17 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "At least one line should be filled."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid "Based on Timesheets"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__allow_billable
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__allow_billable
msgid "Billable"
msgstr ""
@ -206,20 +196,17 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__timesheet_invoice_type
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__timesheet_invoice_type
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
msgid "Billable Type"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_manual
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_manual
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed Manually"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed at a Fixed Price"
msgstr ""
@ -233,7 +220,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_milestones
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_milestones
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed on Milestones"
msgstr ""
@ -241,7 +227,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_time
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_time
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed on Timesheets"
msgstr ""
@ -261,12 +246,6 @@ msgstr ""
msgid "By Billing Type"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_invoice_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
msgid "Cancel"
msgstr "Cancel"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__sale_order_id
msgid "Choose the Sales Order to invoice"
@ -330,12 +309,9 @@ msgid "Create SO from project"
msgstr ""
#. module: sale_timesheet
#. odoo-javascript
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: code:addons/sale_timesheet/static/src/xml/sale_project_templates.xml:0
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
#, python-format
msgid "Create Sales Order"
msgstr ""
@ -406,8 +382,14 @@ msgid "Days Remaining)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_project_view_form
msgid "Default Service"
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Delivered"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_invoice_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
msgid "Discard"
msgstr ""
#. module: sale_timesheet
@ -428,16 +410,11 @@ msgstr "Display Name"
msgid "Draft Invoice"
msgstr "Draft Invoice"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Effective"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line__employee_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__employee_id
msgid "Employee"
msgstr ""
msgstr "કર્મચારી"
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__project_project__pricing_type__employee_rate
@ -518,13 +495,11 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/models/account.py:0
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__timesheet_invoice_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__timesheet_invoice_id
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.report_timesheet_account_move
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Invoice"
msgstr "Invoice"
@ -536,37 +511,25 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity) on projects or tasks you'll"
" create later on."
msgid "Invoice based on timesheets (delivered quantity) on projects or tasks you'll create later on."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create a project for "
"the order with a task for each sales order line to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create a project for the order with a task for each sales order line to track the time spent."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create a task in an "
"existing project to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create a task in an existing project to track the time spent."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create an empty "
"project for the order to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create an empty project for the order to track the time spent."
msgstr ""
#. module: sale_timesheet
@ -580,10 +543,14 @@ msgstr ""
msgid "Invoice your time and material to customers"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Invoiced"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Invoices"
msgstr "Invoices"
@ -627,26 +594,11 @@ msgstr "Journal Item"
msgid "Junior Architect (Invoice on Timesheets)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid ""
"Keep track of your working hours by project every day and bill your "
"customers for that time."
msgstr ""
#. module: sale_timesheet
#: model:product.template,name:sale_timesheet.product_service_deliver_milestones_product_template
msgid "Kitchen Assembly (Milestones)"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map____last_update
msgid "Last Modified on"
msgstr "Last Modified on"
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__write_uid
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order__write_uid
@ -683,19 +635,11 @@ msgid "Margin"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__other_costs
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_costs
msgid "Other costs"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__other_revenues
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_costs
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_revenues
msgid "Other revenues"
msgid "Materials"
msgstr ""
#. module: sale_timesheet
@ -729,13 +673,13 @@ msgid "No activities found"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid "No data yet!"
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid "No activities found. Let's start a new one!"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid "No timesheets found. Let's create one!"
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid "No data yet!"
msgstr ""
#. module: sale_timesheet
@ -745,11 +689,16 @@ msgid "Non Billable Tasks"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Non-Billable"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_tree_inherit
msgid "Non-billable"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__non_billable_time
msgid "Non-billable Hours"
@ -781,17 +730,12 @@ msgstr ""
#: model:ir.model.fields,help:sale_timesheet.field_sale_advance_payment_inv__date_end_invoice_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_sale_advance_payment_inv__date_start_invoice_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid ""
"Only timesheets not yet invoiced (and validated, if applicable) from this "
"period will be invoiced. If the period is not indicated, all timesheets not "
"yet invoiced (and validated, if applicable) will be invoiced without "
"distinction."
msgid "Only timesheets not yet invoiced (and validated, if applicable) from this period will be invoiced. If the period is not indicated, all timesheets not yet invoiced (and validated, if applicable) will be invoiced without distinction."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Operation not supported"
msgstr "Operation not supported"
@ -802,7 +746,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
msgid "Hours Ordered,"
msgid "Ordered,"
msgstr ""
#. module: sale_timesheet
@ -829,9 +773,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_product_product__service_upsell_threshold
#: model:ir.model.fields,help:sale_timesheet.field_product_template__service_upsell_threshold
msgid ""
"Percentage of time delivered compared to the prepaid amount that must be "
"reached for the upselling opportunity activity to be triggered."
msgid "Percentage of time delivered compared to the prepaid amount that must be reached for the upselling opportunity activity to be triggered."
msgstr ""
#. module: sale_timesheet
@ -859,9 +801,7 @@ msgstr "Product Variant"
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_create_sale_order_line__product_id
msgid ""
"Product of the sales order item. Must be a service invoiced based on "
"timesheets on tasks."
msgid "Product of the sales order item. Must be a service invoiced based on timesheets on tasks."
msgstr ""
#. module: sale_timesheet
@ -919,7 +859,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Quotation"
msgstr ""
@ -934,11 +873,6 @@ msgstr ""
msgid "Remaining Days on SO"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
msgid "Remaining Days on SO:"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__remaining_hours_available
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__remaining_hours_available
@ -947,26 +881,27 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__remaining_hours_so
#: model:ir.model.fields,field_description:sale_timesheet.field_report_project_task_user__remaining_hours_so
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__remaining_hours
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_sharing_inherit_project_task_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_task_view_form_inherit_sale_timesheet
msgid "Remaining Hours on SO"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
msgid "Remaining Hours on SO:"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
msgid "Hours Remaining)"
msgid "Remaining)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid ""
"Review your timesheets by billing type and make sure your time is billable."
msgid "Review your timesheets by billing type and make sure your time is billable."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
msgid "Sale Order"
msgstr ""
#. module: sale_timesheet
@ -987,33 +922,34 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: model:ir.model,name:sale_timesheet.model_sale_order
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__order_id
#: model:project.project,name:sale_timesheet.so_template_project
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Sales Order"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__so_line
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__sale_line_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__so_line
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.report_timesheet_sale_order
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Sales Order Item"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Sales Order Items"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
@ -1034,10 +970,12 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_account_analytic_line__so_line
msgid ""
"Sales order item to which the time spent will be added in order to be "
"invoiced to your customer. Remove the sales order item for the timesheet "
"entry to be non-billable."
msgid "Sales order item to which the time spent will be added in order to be invoiced to your customer. Remove the sales order item for the timesheet entry to be non-billable."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_sale_line_employee_map__sale_order_id
msgid "Sales order to which the project is linked."
msgstr ""
#. module: sale_timesheet
@ -1048,21 +986,18 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Invoice"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Sales Order"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Sales Order Item"
msgstr ""
@ -1083,7 +1018,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line__product_id
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Service"
msgstr "Service"
@ -1101,16 +1035,13 @@ msgstr ""
#. module: sale_timesheet
#: model:product.template,name:sale_timesheet.time_product_product_template
msgid "Service on Timesheet"
msgid "Service on Timesheets"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__timesheet_product_id
#: model:ir.model.fields,help:sale_timesheet.field_project_task__timesheet_product_id
msgid ""
"Service that will be used by default when invoicing the time spent on a "
"task. It can be modified on each task individually by selecting a specific "
"sales order item."
msgid "Service that will be used by default when invoicing the time spent on a task. It can be modified on each task individually by selecting a specific sales order item."
msgstr ""
#. module: sale_timesheet
@ -1132,7 +1063,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_project_task
msgid "Task"
msgstr ""
msgstr "કાર્ય"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_project_task_recurrence
@ -1147,33 +1078,22 @@ msgstr ""
#. module: sale_timesheet
#: model:project.project,label_tasks:sale_timesheet.so_template_project
msgid "Tasks"
msgstr "કાર્યો"
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_report_project_task_user
msgid "Tasks Analysis"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"The %s product is required by the Timesheets app and cannot be archived nor "
"deleted."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"The %s product is required by the Timesheets app and cannot be linked to a "
"company."
msgid "The %s product is required by the Timesheets app and cannot be archived nor deleted."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid ""
"The Sales Order cannot be created because you did not enter some employees that entered timesheets on this project. Please list all the relevant employees before creating the Sales Order.\n"
"Missing employee(s): %s"
@ -1187,51 +1107,47 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "The project has already a sale order."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "The project is already linked to a sales order item."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid ""
"The sales order cannot be created because some timesheets of this project "
"are already linked to another sales order."
msgid "The sales order cannot be created because some timesheets of this project are already linked to another sales order."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_invoice.py:0
#, python-format
msgid "The selected Sales Order should contain something to invoice."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__pricing_type
#: model:ir.model.fields,help:sale_timesheet.field_project_task__pricing_type
msgid ""
"The task rate is perfect if you would like to bill different services to "
"different customers at different rates. The fixed rate is perfect if you "
"bill a service at a fixed rate per hour or day worked regardless of the "
"employee who performed it. The employee rate is preferable if your employees"
" deliver the same service at a different rate. For instance, junior and "
"senior consultants would deliver the same service (= consultancy), but at a "
"different rate because of their level of seniority."
msgid "The task rate is perfect if you would like to bill different services to different customers at different rates. The fixed rate is perfect if you bill a service at a fixed rate per hour or day worked regardless of the employee who performed it. The employee rate is preferable if your employees deliver the same service at a different rate. For instance, junior and senior consultants would deliver the same service (= consultancy), but at a different rate because of their level of seniority."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_sale_line_employee_map__cost
msgid "This cost overrides the employee's default employee hourly wage in employee's HR Settings"
msgstr ""
#. module: sale_timesheet
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_1
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_2
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_3
msgid ""
"This cost overrides the employee's default employee hourly wage in "
"employee's HR Settings"
"This is a <strong>sample quotation template</strong>. You should\n"
" customize it to fit your own needs from the <i>Sales</i>\n"
" application, using the menu: Configuration /\n"
" Quotation Templates."
msgstr ""
#. module: sale_timesheet
@ -1240,6 +1156,11 @@ msgstr ""
msgid "Threshold"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form
msgid "Time Billing"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.product_template_view_search_sale_timesheet
msgid "Time-based services"
@ -1250,7 +1171,7 @@ msgstr ""
#: model:ir.actions.act_window,name:sale_timesheet.timesheet_action_plan_pivot
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_hr_timesheet_line_graph_employee_per_date
msgid "Timesheet"
msgstr ""
msgstr "સમય પત્રક"
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheets_analysis_report_graph_invoice_type
@ -1294,11 +1215,6 @@ msgstr ""
msgid "Timesheet activities"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order__timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account_move.py:0
@ -1314,42 +1230,36 @@ msgstr ""
#: model:ir.model.fields.selection,name:sale_timesheet.selection__sale_order_line__qty_delivered_method__timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheets_analysis_report_graph_invoice_type
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_hr_timesheet_line_pivot_billing_rate
#, python-format
msgid "Timesheets"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed Manually)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed on Milestones)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed on Timesheets)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Fixed Price)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Non Billable)"
msgstr ""
@ -1363,11 +1273,6 @@ msgstr ""
msgid "Timesheets Analysis Report"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid "Timesheets Period"
msgstr ""
#. module: sale_timesheet
#: model:ir.actions.act_window,name:sale_timesheet.timesheet_action_billing_report
msgid "Timesheets by Billing Type"
@ -1381,7 +1286,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets of %s"
msgstr ""
@ -1393,7 +1297,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets revenues"
msgstr ""
@ -1412,16 +1315,9 @@ msgstr ""
msgid "Timesheets taken when invoicing time spent"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Total"
msgstr "Total"
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_create_invoice__amount_to_invoice
msgid ""
"Total amount to invoice on the sales order, including all items (services, "
"storables, expenses, ...)"
msgid "Total amount to invoice on the sales order, including all items (services, storables, expenses, ...)"
msgstr ""
#. module: sale_timesheet
@ -1429,9 +1325,7 @@ msgstr ""
#: model:ir.model.fields,help:sale_timesheet.field_account_move__timesheet_total_duration
#: model:ir.model.fields,help:sale_timesheet.field_account_payment__timesheet_total_duration
#: model:ir.model.fields,help:sale_timesheet.field_sale_order__timesheet_total_duration
msgid ""
"Total recorded duration, expressed in the encoding UoM, and rounded to the "
"unit"
msgid "Total recorded duration, expressed in the encoding UoM, and rounded to the unit"
msgstr ""
#. module: sale_timesheet
@ -1448,9 +1342,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.action_timesheet_from_invoice
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid ""
"Track your working hours by projects every day and invoice this time to your"
" customers."
msgid "Track your working hours by projects every day and invoice this time to your customers."
msgstr ""
#. module: sale_timesheet
@ -1467,7 +1359,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Value does not exist in the pricing type"
msgstr ""
@ -1518,61 +1409,48 @@ msgstr ""
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_invoice.py:0
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "You can only apply this action from a project."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"You cannot link a billable project to a sales order item that comes from an "
"expense or a vendor bill."
msgid "You cannot link a billable project to a sales order item that comes from an expense or a vendor bill."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"You cannot link a billable project to a sales order item that is not a "
"service."
msgid "You cannot link a billable project to a sales order item that is not a service."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
#, python-format
msgid "You cannot modify timesheets that are already invoiced."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
#, python-format
msgid "You cannot remove a timesheet that has already been invoiced."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
#, python-format
msgid "day"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "days"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
msgid "days remaining"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "hours"
msgstr ""
@ -1585,3 +1463,9 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_product_timesheet_form
msgid "of hours sold."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
msgid "remaining"
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

View file

@ -1,25 +1,26 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# * sale_timesheet
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-06 13:32+0000\n"
"PO-Revision-Date: 2022-09-22 05:55+0000\n"
"Language-Team: Armenian (https://app.transifex.com/odoo/teams/41243/hy/)\n"
"POT-Creation-Date: 2023-05-16 13:49+0000\n"
"PO-Revision-Date: 2015-09-10 15:21+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: Armenian (http://www.transifex.com/odoo/odoo-9/language/hy/)\n"
"Language: hy\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: hy\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account_move.py:0
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"\n"
" <p class=\"o_view_nocontent_smiling_face\">\n"
@ -39,15 +40,12 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__billable_percentage
msgid ""
"% of timesheets that are billable compared to the total number of timesheets"
" linked to the AA of the project, rounded to the unit."
msgid "% of timesheets that are billable compared to the total number of timesheets linked to the AA of the project, rounded to the unit."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "%(amount)s %(label)s will be added to the new Sales Order."
msgstr ""
@ -62,15 +60,8 @@ msgid ", leading to a"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid ""
"<i class=\"fa fa-long-arrow-right mx-2\" aria-label=\"Arrow icon\" "
"title=\"Arrow\"/>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form
msgid "<span class=\"o_form_label\">Time Billing</span>"
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
msgid "<span class=\"o_stat_text\">Invoice</span>"
msgstr ""
#. module: sale_timesheet
@ -79,6 +70,11 @@ msgstr ""
msgid "<span class=\"o_stat_text\">Recorded</span>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
msgid "<span class=\"o_stat_text\">Sales Order</span>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_task_inherit
msgid "<strong>Invoiced:</strong>"
@ -106,7 +102,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "<u>Sold</u>"
msgid "<u>Sales</u>"
msgstr ""
#. module: sale_timesheet
@ -119,7 +115,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_sale_order_line__qty_delivered_method
msgid ""
"According to product configuration, the delivered quantity can be automatically computed by mechanism :\n"
"According to product configuration, the delivered quantity can be automatically computed by mechanism:\n"
" - Manual: the quantity is set manually on the line\n"
" - Analytic From expenses: the quantity is the quantity sum from posted expenses\n"
" - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n"
@ -145,9 +141,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.constraint,message:sale_timesheet.constraint_project_create_sale_order_line_unique_employee_per_wizard
#: model:ir.model.constraint,message:sale_timesheet.constraint_project_sale_line_employee_map_uniqueness_employee
msgid ""
"An employee cannot be selected more than once in the mapping. Please remove "
"duplicate(s) and try again."
msgid "An employee cannot be selected more than once in the mapping. Please remove duplicate(s) and try again."
msgstr ""
#. module: sale_timesheet
@ -173,19 +167,17 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "At least one line should be filled."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid "Based on Timesheets"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__allow_billable
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__allow_billable
msgid "Billable"
msgstr ""
@ -202,20 +194,17 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__timesheet_invoice_type
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__timesheet_invoice_type
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
msgid "Billable Type"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_manual
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_manual
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed Manually"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed at a Fixed Price"
msgstr ""
@ -229,7 +218,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_milestones
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_milestones
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed on Milestones"
msgstr ""
@ -237,7 +225,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_time
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_time
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed on Timesheets"
msgstr ""
@ -257,12 +244,6 @@ msgstr ""
msgid "By Billing Type"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_invoice_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
msgid "Cancel"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__sale_order_id
msgid "Choose the Sales Order to invoice"
@ -326,12 +307,9 @@ msgid "Create SO from project"
msgstr ""
#. module: sale_timesheet
#. odoo-javascript
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: code:addons/sale_timesheet/static/src/xml/sale_project_templates.xml:0
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
#, python-format
msgid "Create Sales Order"
msgstr ""
@ -402,8 +380,14 @@ msgid "Days Remaining)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_project_view_form
msgid "Default Service"
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Delivered"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_invoice_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
msgid "Discard"
msgstr ""
#. module: sale_timesheet
@ -424,16 +408,11 @@ msgstr ""
msgid "Draft Invoice"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Effective"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line__employee_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__employee_id
msgid "Employee"
msgstr ""
msgstr "Աշհատակից"
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__project_project__pricing_type__employee_rate
@ -514,13 +493,11 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/models/account.py:0
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__timesheet_invoice_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__timesheet_invoice_id
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.report_timesheet_account_move
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Invoice"
msgstr ""
@ -532,37 +509,25 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity) on projects or tasks you'll"
" create later on."
msgid "Invoice based on timesheets (delivered quantity) on projects or tasks you'll create later on."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create a project for "
"the order with a task for each sales order line to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create a project for the order with a task for each sales order line to track the time spent."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create a task in an "
"existing project to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create a task in an existing project to track the time spent."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create an empty "
"project for the order to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create an empty project for the order to track the time spent."
msgstr ""
#. module: sale_timesheet
@ -576,10 +541,14 @@ msgstr ""
msgid "Invoice your time and material to customers"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Invoiced"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Invoices"
msgstr ""
@ -623,26 +592,11 @@ msgstr ""
msgid "Junior Architect (Invoice on Timesheets)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid ""
"Keep track of your working hours by project every day and bill your "
"customers for that time."
msgstr ""
#. module: sale_timesheet
#: model:product.template,name:sale_timesheet.product_service_deliver_milestones_product_template
msgid "Kitchen Assembly (Milestones)"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map____last_update
msgid "Last Modified on"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__write_uid
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order__write_uid
@ -679,13 +633,10 @@ msgid "Margin"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__other_costs
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__other_revenues
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_costs
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_revenues
#, python-format
msgid "Materials"
msgstr ""
@ -720,13 +671,13 @@ msgid "No activities found"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid "No data yet!"
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid "No activities found. Let's start a new one!"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid "No timesheets found. Let's create one!"
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid "No data yet!"
msgstr ""
#. module: sale_timesheet
@ -736,11 +687,16 @@ msgid "Non Billable Tasks"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Non-Billable"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_tree_inherit
msgid "Non-billable"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__non_billable_time
msgid "Non-billable Hours"
@ -772,17 +728,12 @@ msgstr ""
#: model:ir.model.fields,help:sale_timesheet.field_sale_advance_payment_inv__date_end_invoice_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_sale_advance_payment_inv__date_start_invoice_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid ""
"Only timesheets not yet invoiced (and validated, if applicable) from this "
"period will be invoiced. If the period is not indicated, all timesheets not "
"yet invoiced (and validated, if applicable) will be invoiced without "
"distinction."
msgid "Only timesheets not yet invoiced (and validated, if applicable) from this period will be invoiced. If the period is not indicated, all timesheets not yet invoiced (and validated, if applicable) will be invoiced without distinction."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Operation not supported"
msgstr ""
@ -793,7 +744,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
msgid "Hours Ordered,"
msgid "Ordered,"
msgstr ""
#. module: sale_timesheet
@ -820,9 +771,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_product_product__service_upsell_threshold
#: model:ir.model.fields,help:sale_timesheet.field_product_template__service_upsell_threshold
msgid ""
"Percentage of time delivered compared to the prepaid amount that must be "
"reached for the upselling opportunity activity to be triggered."
msgid "Percentage of time delivered compared to the prepaid amount that must be reached for the upselling opportunity activity to be triggered."
msgstr ""
#. module: sale_timesheet
@ -850,9 +799,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_create_sale_order_line__product_id
msgid ""
"Product of the sales order item. Must be a service invoiced based on "
"timesheets on tasks."
msgid "Product of the sales order item. Must be a service invoiced based on timesheets on tasks."
msgstr ""
#. module: sale_timesheet
@ -910,7 +857,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Quotation"
msgstr ""
@ -925,11 +871,6 @@ msgstr ""
msgid "Remaining Days on SO"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
msgid "Remaining Days on SO:"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__remaining_hours_available
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__remaining_hours_available
@ -938,26 +879,27 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__remaining_hours_so
#: model:ir.model.fields,field_description:sale_timesheet.field_report_project_task_user__remaining_hours_so
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__remaining_hours
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_sharing_inherit_project_task_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_task_view_form_inherit_sale_timesheet
msgid "Remaining Hours on SO"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
msgid "Remaining Hours on SO:"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
msgid "Hours Remaining)"
msgid "Remaining)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid ""
"Review your timesheets by billing type and make sure your time is billable."
msgid "Review your timesheets by billing type and make sure your time is billable."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
msgid "Sale Order"
msgstr ""
#. module: sale_timesheet
@ -978,33 +920,34 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: model:ir.model,name:sale_timesheet.model_sale_order
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__order_id
#: model:project.project,name:sale_timesheet.so_template_project
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Sales Order"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__so_line
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__sale_line_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__so_line
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.report_timesheet_sale_order
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Sales Order Item"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Sales Order Items"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
@ -1025,10 +968,12 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_account_analytic_line__so_line
msgid ""
"Sales order item to which the time spent will be added in order to be "
"invoiced to your customer. Remove the sales order item for the timesheet "
"entry to be non-billable."
msgid "Sales order item to which the time spent will be added in order to be invoiced to your customer. Remove the sales order item for the timesheet entry to be non-billable."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_sale_line_employee_map__sale_order_id
msgid "Sales order to which the project is linked."
msgstr ""
#. module: sale_timesheet
@ -1039,21 +984,18 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Invoice"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Sales Order"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Sales Order Item"
msgstr ""
@ -1074,7 +1016,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line__product_id
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Service"
msgstr ""
@ -1092,16 +1033,13 @@ msgstr ""
#. module: sale_timesheet
#: model:product.template,name:sale_timesheet.time_product_product_template
msgid "Service on Timesheet"
msgid "Service on Timesheets"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__timesheet_product_id
#: model:ir.model.fields,help:sale_timesheet.field_project_task__timesheet_product_id
msgid ""
"Service that will be used by default when invoicing the time spent on a "
"task. It can be modified on each task individually by selecting a specific "
"sales order item."
msgid "Service that will be used by default when invoicing the time spent on a task. It can be modified on each task individually by selecting a specific sales order item."
msgstr ""
#. module: sale_timesheet
@ -1140,22 +1078,20 @@ msgstr ""
msgid "Tasks"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_report_project_task_user
msgid "Tasks Analysis"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"The %s product is required by the Timesheets app and cannot be archived nor "
"deleted."
msgid "The %s product is required by the Timesheets app and cannot be archived nor deleted."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid ""
"The Sales Order cannot be created because you did not enter some employees that entered timesheets on this project. Please list all the relevant employees before creating the Sales Order.\n"
"Missing employee(s): %s"
@ -1169,51 +1105,47 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "The project has already a sale order."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "The project is already linked to a sales order item."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid ""
"The sales order cannot be created because some timesheets of this project "
"are already linked to another sales order."
msgid "The sales order cannot be created because some timesheets of this project are already linked to another sales order."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_invoice.py:0
#, python-format
msgid "The selected Sales Order should contain something to invoice."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__pricing_type
#: model:ir.model.fields,help:sale_timesheet.field_project_task__pricing_type
msgid ""
"The task rate is perfect if you would like to bill different services to "
"different customers at different rates. The fixed rate is perfect if you "
"bill a service at a fixed rate per hour or day worked regardless of the "
"employee who performed it. The employee rate is preferable if your employees"
" deliver the same service at a different rate. For instance, junior and "
"senior consultants would deliver the same service (= consultancy), but at a "
"different rate because of their level of seniority."
msgid "The task rate is perfect if you would like to bill different services to different customers at different rates. The fixed rate is perfect if you bill a service at a fixed rate per hour or day worked regardless of the employee who performed it. The employee rate is preferable if your employees deliver the same service at a different rate. For instance, junior and senior consultants would deliver the same service (= consultancy), but at a different rate because of their level of seniority."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_sale_line_employee_map__cost
msgid "This cost overrides the employee's default employee hourly wage in employee's HR Settings"
msgstr ""
#. module: sale_timesheet
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_1
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_2
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_3
msgid ""
"This cost overrides the employee's default employee hourly wage in "
"employee's HR Settings"
"This is a <strong>sample quotation template</strong>. You should\n"
" customize it to fit your own needs from the <i>Sales</i>\n"
" application, using the menu: Configuration /\n"
" Quotation Templates."
msgstr ""
#. module: sale_timesheet
@ -1222,6 +1154,11 @@ msgstr ""
msgid "Threshold"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form
msgid "Time Billing"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.product_template_view_search_sale_timesheet
msgid "Time-based services"
@ -1276,11 +1213,6 @@ msgstr ""
msgid "Timesheet activities"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order__timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account_move.py:0
@ -1296,42 +1228,36 @@ msgstr ""
#: model:ir.model.fields.selection,name:sale_timesheet.selection__sale_order_line__qty_delivered_method__timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheets_analysis_report_graph_invoice_type
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_hr_timesheet_line_pivot_billing_rate
#, python-format
msgid "Timesheets"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed Manually)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed on Milestones)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed on Timesheets)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Fixed Price)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Non Billable)"
msgstr ""
@ -1345,11 +1271,6 @@ msgstr ""
msgid "Timesheets Analysis Report"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid "Timesheets Period"
msgstr ""
#. module: sale_timesheet
#: model:ir.actions.act_window,name:sale_timesheet.timesheet_action_billing_report
msgid "Timesheets by Billing Type"
@ -1363,7 +1284,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets of %s"
msgstr ""
@ -1375,7 +1295,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets revenues"
msgstr ""
@ -1394,16 +1313,9 @@ msgstr ""
msgid "Timesheets taken when invoicing time spent"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Total"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_create_invoice__amount_to_invoice
msgid ""
"Total amount to invoice on the sales order, including all items (services, "
"storables, expenses, ...)"
msgid "Total amount to invoice on the sales order, including all items (services, storables, expenses, ...)"
msgstr ""
#. module: sale_timesheet
@ -1411,9 +1323,7 @@ msgstr ""
#: model:ir.model.fields,help:sale_timesheet.field_account_move__timesheet_total_duration
#: model:ir.model.fields,help:sale_timesheet.field_account_payment__timesheet_total_duration
#: model:ir.model.fields,help:sale_timesheet.field_sale_order__timesheet_total_duration
msgid ""
"Total recorded duration, expressed in the encoding UoM, and rounded to the "
"unit"
msgid "Total recorded duration, expressed in the encoding UoM, and rounded to the unit"
msgstr ""
#. module: sale_timesheet
@ -1430,9 +1340,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.action_timesheet_from_invoice
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid ""
"Track your working hours by projects every day and invoice this time to your"
" customers."
msgid "Track your working hours by projects every day and invoice this time to your customers."
msgstr ""
#. module: sale_timesheet
@ -1449,7 +1357,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Value does not exist in the pricing type"
msgstr ""
@ -1500,61 +1407,48 @@ msgstr ""
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_invoice.py:0
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "You can only apply this action from a project."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"You cannot link a billable project to a sales order item that comes from an "
"expense or a vendor bill."
msgid "You cannot link a billable project to a sales order item that comes from an expense or a vendor bill."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"You cannot link a billable project to a sales order item that is not a "
"service."
msgid "You cannot link a billable project to a sales order item that is not a service."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
#, python-format
msgid "You cannot modify timesheets that are already invoiced."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
#, python-format
msgid "You cannot remove a timesheet that has already been invoiced."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
#, python-format
msgid "day"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "days"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
msgid "days remaining"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "hours"
msgstr ""
@ -1567,3 +1461,9 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_product_timesheet_form
msgid "of hours sold."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
msgid "remaining"
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

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

@ -1,25 +1,26 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_timesheet
#
# * sale_timesheet
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-06 13:32+0000\n"
"PO-Revision-Date: 2022-09-22 05:55+0000\n"
"Language-Team: Tamil (https://app.transifex.com/odoo/teams/41243/ta/)\n"
"POT-Creation-Date: 2023-05-16 13:49+0000\n"
"PO-Revision-Date: 2016-02-11 10:14+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: Tamil (http://www.transifex.com/odoo/odoo-9/language/ta/)\n"
"Language: ta\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: ta\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account_move.py:0
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"\n"
" <p class=\"o_view_nocontent_smiling_face\">\n"
@ -39,15 +40,12 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__billable_percentage
msgid ""
"% of timesheets that are billable compared to the total number of timesheets"
" linked to the AA of the project, rounded to the unit."
msgid "% of timesheets that are billable compared to the total number of timesheets linked to the AA of the project, rounded to the unit."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "%(amount)s %(label)s will be added to the new Sales Order."
msgstr ""
@ -62,15 +60,8 @@ msgid ", leading to a"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid ""
"<i class=\"fa fa-long-arrow-right mx-2\" aria-label=\"Arrow icon\" "
"title=\"Arrow\"/>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form
msgid "<span class=\"o_form_label\">Time Billing</span>"
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
msgid "<span class=\"o_stat_text\">Invoice</span>"
msgstr ""
#. module: sale_timesheet
@ -79,6 +70,11 @@ msgstr ""
msgid "<span class=\"o_stat_text\">Recorded</span>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
msgid "<span class=\"o_stat_text\">Sales Order</span>"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_task_inherit
msgid "<strong>Invoiced:</strong>"
@ -106,7 +102,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "<u>Sold</u>"
msgid "<u>Sales</u>"
msgstr ""
#. module: sale_timesheet
@ -119,7 +115,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_sale_order_line__qty_delivered_method
msgid ""
"According to product configuration, the delivered quantity can be automatically computed by mechanism :\n"
"According to product configuration, the delivered quantity can be automatically computed by mechanism:\n"
" - Manual: the quantity is set manually on the line\n"
" - Analytic From expenses: the quantity is the quantity sum from posted expenses\n"
" - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n"
@ -145,9 +141,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.constraint,message:sale_timesheet.constraint_project_create_sale_order_line_unique_employee_per_wizard
#: model:ir.model.constraint,message:sale_timesheet.constraint_project_sale_line_employee_map_uniqueness_employee
msgid ""
"An employee cannot be selected more than once in the mapping. Please remove "
"duplicate(s) and try again."
msgid "An employee cannot be selected more than once in the mapping. Please remove duplicate(s) and try again."
msgstr ""
#. module: sale_timesheet
@ -173,19 +167,17 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "At least one line should be filled."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid "Based on Timesheets"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__allow_billable
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__allow_billable
msgid "Billable"
msgstr ""
@ -202,20 +194,17 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__timesheet_invoice_type
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__timesheet_invoice_type
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
msgid "Billable Type"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_manual
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_manual
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed Manually"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed at a Fixed Price"
msgstr ""
@ -229,7 +218,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_milestones
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_milestones
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed on Milestones"
msgstr ""
@ -237,7 +225,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__billable_time
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__billable_time
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Billed on Timesheets"
msgstr ""
@ -257,12 +244,6 @@ msgstr ""
msgid "By Billing Type"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_invoice_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
msgid "Cancel"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__sale_order_id
msgid "Choose the Sales Order to invoice"
@ -326,12 +307,9 @@ msgid "Create SO from project"
msgstr ""
#. module: sale_timesheet
#. odoo-javascript
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: code:addons/sale_timesheet/static/src/xml/sale_project_templates.xml:0
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
#, python-format
msgid "Create Sales Order"
msgstr ""
@ -402,8 +380,14 @@ msgid "Days Remaining)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_project_view_form
msgid "Default Service"
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Delivered"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_invoice_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_create_sale_order_view_form
msgid "Discard"
msgstr ""
#. module: sale_timesheet
@ -424,11 +408,6 @@ msgstr ""
msgid "Draft Invoice"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Effective"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line__employee_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__employee_id
@ -514,13 +493,11 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/models/account.py:0
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__timesheet_invoice_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__timesheet_invoice_id
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.report_timesheet_account_move
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Invoice"
msgstr ""
@ -532,37 +509,25 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity) on projects or tasks you'll"
" create later on."
msgid "Invoice based on timesheets (delivered quantity) on projects or tasks you'll create later on."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create a project for "
"the order with a task for each sales order line to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create a project for the order with a task for each sales order line to track the time spent."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create a task in an "
"existing project to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create a task in an existing project to track the time spent."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"Invoice based on timesheets (delivered quantity), and create an empty "
"project for the order to track the time spent."
msgid "Invoice based on timesheets (delivered quantity), and create an empty project for the order to track the time spent."
msgstr ""
#. module: sale_timesheet
@ -576,10 +541,14 @@ msgstr ""
msgid "Invoice your time and material to customers"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Invoiced"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Invoices"
msgstr ""
@ -623,26 +592,11 @@ msgstr ""
msgid "Junior Architect (Invoice on Timesheets)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid ""
"Keep track of your working hours by project every day and bill your "
"customers for that time."
msgstr ""
#. module: sale_timesheet
#: model:product.template,name:sale_timesheet.product_service_deliver_milestones_product_template
msgid "Kitchen Assembly (Milestones)"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line____last_update
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map____last_update
msgid "Last Modified on"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__write_uid
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order__write_uid
@ -679,13 +633,10 @@ msgid "Margin"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__other_costs
#: model:ir.model.fields.selection,name:sale_timesheet.selection__account_analytic_line__timesheet_invoice_type__other_revenues
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_costs
#: model:ir.model.fields.selection,name:sale_timesheet.selection__timesheets_analysis_report__timesheet_invoice_type__other_revenues
#, python-format
msgid "Materials"
msgstr ""
@ -720,13 +671,13 @@ msgid "No activities found"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid "No data yet!"
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid "No activities found. Let's start a new one!"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid "No timesheets found. Let's create one!"
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid "No data yet!"
msgstr ""
#. module: sale_timesheet
@ -736,11 +687,16 @@ msgid "Non Billable Tasks"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
msgid "Non-Billable"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_form_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_line_tree_inherit
msgid "Non-billable"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__non_billable_time
msgid "Non-billable Hours"
@ -772,17 +728,12 @@ msgstr ""
#: model:ir.model.fields,help:sale_timesheet.field_sale_advance_payment_inv__date_end_invoice_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_sale_advance_payment_inv__date_start_invoice_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid ""
"Only timesheets not yet invoiced (and validated, if applicable) from this "
"period will be invoiced. If the period is not indicated, all timesheets not "
"yet invoiced (and validated, if applicable) will be invoiced without "
"distinction."
msgid "Only timesheets not yet invoiced (and validated, if applicable) from this period will be invoiced. If the period is not indicated, all timesheets not yet invoiced (and validated, if applicable) will be invoiced without distinction."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Operation not supported"
msgstr ""
@ -793,7 +744,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
msgid "Hours Ordered,"
msgid "Ordered,"
msgstr ""
#. module: sale_timesheet
@ -820,9 +771,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_product_product__service_upsell_threshold
#: model:ir.model.fields,help:sale_timesheet.field_product_template__service_upsell_threshold
msgid ""
"Percentage of time delivered compared to the prepaid amount that must be "
"reached for the upselling opportunity activity to be triggered."
msgid "Percentage of time delivered compared to the prepaid amount that must be reached for the upselling opportunity activity to be triggered."
msgstr ""
#. module: sale_timesheet
@ -850,9 +799,7 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_create_sale_order_line__product_id
msgid ""
"Product of the sales order item. Must be a service invoiced based on "
"timesheets on tasks."
msgid "Product of the sales order item. Must be a service invoiced based on timesheets on tasks."
msgstr ""
#. module: sale_timesheet
@ -910,7 +857,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Quotation"
msgstr ""
@ -925,11 +871,6 @@ msgstr ""
msgid "Remaining Days on SO"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
msgid "Remaining Days on SO:"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__remaining_hours_available
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__remaining_hours_available
@ -938,26 +879,27 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__remaining_hours_so
#: model:ir.model.fields,field_description:sale_timesheet.field_report_project_task_user__remaining_hours_so
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__remaining_hours
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_sharing_inherit_project_task_view_form
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_task_view_form_inherit_sale_timesheet
msgid "Remaining Hours on SO"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
msgid "Remaining Hours on SO:"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
msgid "Hours Remaining)"
msgid "Remaining)"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_billing_report
msgid ""
"Review your timesheets by billing type and make sure your time is billable."
msgid "Review your timesheets by billing type and make sure your time is billable."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
msgid "Sale Order"
msgstr ""
#. module: sale_timesheet
@ -978,33 +920,34 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: model:ir.model,name:sale_timesheet.model_sale_order
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_project_task__sale_order_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__order_id
#: model:project.project,name:sale_timesheet.so_template_project
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Sales Order"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#: code:addons/sale_timesheet/controllers/portal.py:0
#: model:ir.model.fields,field_description:sale_timesheet.field_account_analytic_line__so_line
#: model:ir.model.fields,field_description:sale_timesheet.field_project_sale_line_employee_map__sale_line_id
#: model:ir.model.fields,field_description:sale_timesheet.field_timesheets_analysis_report__so_line
#: model_terms:ir.ui.view,arch_db:sale_timesheet.hr_timesheet_report_search_sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_my_timesheets_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.portal_timesheet_table_inherit
#: model_terms:ir.ui.view,arch_db:sale_timesheet.report_timesheet_sale_order
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheet_view_search
#, python-format
msgid "Sales Order Item"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Sales Order Items"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_sale_order_line
msgid "Sales Order Line"
@ -1025,10 +968,12 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_account_analytic_line__so_line
msgid ""
"Sales order item to which the time spent will be added in order to be "
"invoiced to your customer. Remove the sales order item for the timesheet "
"entry to be non-billable."
msgid "Sales order item to which the time spent will be added in order to be invoiced to your customer. Remove the sales order item for the timesheet entry to be non-billable."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_sale_line_employee_map__sale_order_id
msgid "Sales order to which the project is linked."
msgstr ""
#. module: sale_timesheet
@ -1039,21 +984,18 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Invoice"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Sales Order"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/controllers/portal.py:0
#, python-format
msgid "Search in Sales Order Item"
msgstr ""
@ -1074,7 +1016,6 @@ msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_project_create_sale_order_line__product_id
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Service"
msgstr ""
@ -1092,16 +1033,13 @@ msgstr ""
#. module: sale_timesheet
#: model:product.template,name:sale_timesheet.time_product_product_template
msgid "Service on Timesheet"
msgid "Service on Timesheets"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__timesheet_product_id
#: model:ir.model.fields,help:sale_timesheet.field_project_task__timesheet_product_id
msgid ""
"Service that will be used by default when invoicing the time spent on a "
"task. It can be modified on each task individually by selecting a specific "
"sales order item."
msgid "Service that will be used by default when invoicing the time spent on a task. It can be modified on each task individually by selecting a specific sales order item."
msgstr ""
#. module: sale_timesheet
@ -1140,22 +1078,20 @@ msgstr ""
msgid "Tasks"
msgstr ""
#. module: sale_timesheet
#: model:ir.model,name:sale_timesheet.model_report_project_task_user
msgid "Tasks Analysis"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#: code:addons/sale_timesheet/models/product.py:0
#, python-format
msgid ""
"The %s product is required by the Timesheets app and cannot be archived nor "
"deleted."
msgid "The %s product is required by the Timesheets app and cannot be archived nor deleted."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid ""
"The Sales Order cannot be created because you did not enter some employees that entered timesheets on this project. Please list all the relevant employees before creating the Sales Order.\n"
"Missing employee(s): %s"
@ -1169,51 +1105,47 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "The project has already a sale order."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "The project is already linked to a sales order item."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid ""
"The sales order cannot be created because some timesheets of this project "
"are already linked to another sales order."
msgid "The sales order cannot be created because some timesheets of this project are already linked to another sales order."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_invoice.py:0
#, python-format
msgid "The selected Sales Order should contain something to invoice."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_project__pricing_type
#: model:ir.model.fields,help:sale_timesheet.field_project_task__pricing_type
msgid ""
"The task rate is perfect if you would like to bill different services to "
"different customers at different rates. The fixed rate is perfect if you "
"bill a service at a fixed rate per hour or day worked regardless of the "
"employee who performed it. The employee rate is preferable if your employees"
" deliver the same service at a different rate. For instance, junior and "
"senior consultants would deliver the same service (= consultancy), but at a "
"different rate because of their level of seniority."
msgid "The task rate is perfect if you would like to bill different services to different customers at different rates. The fixed rate is perfect if you bill a service at a fixed rate per hour or day worked regardless of the employee who performed it. The employee rate is preferable if your employees deliver the same service at a different rate. For instance, junior and senior consultants would deliver the same service (= consultancy), but at a different rate because of their level of seniority."
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_sale_line_employee_map__cost
msgid "This cost overrides the employee's default employee hourly wage in employee's HR Settings"
msgstr ""
#. module: sale_timesheet
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_1
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_2
#: model_terms:sale.order,website_description:sale_timesheet.sale_order_3
msgid ""
"This cost overrides the employee's default employee hourly wage in "
"employee's HR Settings"
"This is a <strong>sample quotation template</strong>. You should\n"
" customize it to fit your own needs from the <i>Sales</i>\n"
" application, using the menu: Configuration /\n"
" Quotation Templates."
msgstr ""
#. module: sale_timesheet
@ -1222,6 +1154,11 @@ msgstr ""
msgid "Threshold"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form
msgid "Time Billing"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.product_template_view_search_sale_timesheet
msgid "Time-based services"
@ -1276,11 +1213,6 @@ msgstr ""
msgid "Timesheet activities"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,field_description:sale_timesheet.field_sale_order__timesheet_ids
msgid "Timesheet activities associated to this sale"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account_move.py:0
@ -1296,42 +1228,36 @@ msgstr ""
#: model:ir.model.fields.selection,name:sale_timesheet.selection__sale_order_line__qty_delivered_method__timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.timesheets_analysis_report_graph_invoice_type
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_hr_timesheet_line_pivot_billing_rate
#, python-format
msgid "Timesheets"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed Manually)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed on Milestones)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Billed on Timesheets)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Fixed Price)"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets (Non Billable)"
msgstr ""
@ -1345,11 +1271,6 @@ msgstr ""
msgid "Timesheets Analysis Report"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.sale_advance_payment_inv_timesheet_view_form
msgid "Timesheets Period"
msgstr ""
#. module: sale_timesheet
#: model:ir.actions.act_window,name:sale_timesheet.timesheet_action_billing_report
msgid "Timesheets by Billing Type"
@ -1363,7 +1284,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets of %s"
msgstr ""
@ -1375,7 +1295,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Timesheets revenues"
msgstr ""
@ -1394,16 +1313,9 @@ msgstr ""
msgid "Timesheets taken when invoicing time spent"
msgstr ""
#. module: sale_timesheet
#: model_terms:ir.ui.view,arch_db:sale_timesheet.project_update_default_description
msgid "Total"
msgstr ""
#. module: sale_timesheet
#: model:ir.model.fields,help:sale_timesheet.field_project_create_invoice__amount_to_invoice
msgid ""
"Total amount to invoice on the sales order, including all items (services, "
"storables, expenses, ...)"
msgid "Total amount to invoice on the sales order, including all items (services, storables, expenses, ...)"
msgstr ""
#. module: sale_timesheet
@ -1411,9 +1323,7 @@ msgstr ""
#: model:ir.model.fields,help:sale_timesheet.field_account_move__timesheet_total_duration
#: model:ir.model.fields,help:sale_timesheet.field_account_payment__timesheet_total_duration
#: model:ir.model.fields,help:sale_timesheet.field_sale_order__timesheet_total_duration
msgid ""
"Total recorded duration, expressed in the encoding UoM, and rounded to the "
"unit"
msgid "Total recorded duration, expressed in the encoding UoM, and rounded to the unit"
msgstr ""
#. module: sale_timesheet
@ -1430,9 +1340,7 @@ msgstr ""
#. module: sale_timesheet
#: model_terms:ir.actions.act_window,help:sale_timesheet.action_timesheet_from_invoice
#: model_terms:ir.actions.act_window,help:sale_timesheet.timesheet_action_from_sales_order_item
msgid ""
"Track your working hours by projects every day and invoice this time to your"
" customers."
msgid "Track your working hours by projects every day and invoice this time to your customers."
msgstr ""
#. module: sale_timesheet
@ -1449,7 +1357,6 @@ msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid "Value does not exist in the pricing type"
msgstr ""
@ -1500,61 +1407,48 @@ msgstr ""
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_invoice.py:0
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "You can only apply this action from a project."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"You cannot link a billable project to a sales order item that comes from an "
"expense or a vendor bill."
msgid "You cannot link a billable project to a sales order item that comes from an expense or a vendor bill."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/project.py:0
#, python-format
msgid ""
"You cannot link a billable project to a sales order item that is not a "
"service."
msgid "You cannot link a billable project to a sales order item that is not a service."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
#, python-format
msgid "You cannot modify timesheets that are already invoiced."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/account.py:0
#, python-format
msgid "You cannot remove a timesheet that has already been invoiced."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
#, python-format
msgid "day"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "days"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
msgid "days remaining"
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/wizard/project_create_sale_order.py:0
#, python-format
msgid "hours"
msgstr ""
@ -1567,3 +1461,9 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:sale_timesheet.view_product_timesheet_form
msgid "of hours sold."
msgstr ""
#. module: sale_timesheet
#. odoo-python
#: code:addons/sale_timesheet/models/sale_order.py:0
msgid "remaining"
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

View file

@ -1,11 +1,16 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import account
from . import account_move_line
from . import account_move
from . import product
from . import project
from . import project_update
from . import sale_order
from . import res_config_settings
from . import hr_employee
from . import hr_timesheet
from . import product_product
from . import product_template
from . import project_project
from . import project_sale_line_employee_map
from . import project_task
from . import res_config_settings
from . import sale_order_line
from . import sale_order
from . import account_move_reversal

View file

@ -1,30 +1,31 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from odoo import api, fields, models, _
from odoo.osv import expression
from odoo.fields import Domain
class AccountMove(models.Model):
_inherit = "account.move"
timesheet_ids = fields.One2many('account.analytic.line', 'timesheet_invoice_id', string='Timesheets', readonly=True, copy=False)
timesheet_count = fields.Integer("Number of timesheets", compute='_compute_timesheet_count')
timesheet_encode_uom_id = fields.Many2one('uom.uom', related='company_id.timesheet_encode_uom_id')
timesheet_total_duration = fields.Integer("Timesheet Total Duration", compute='_compute_timesheet_total_duration', help="Total recorded duration, expressed in the encoding UoM, and rounded to the unit")
timesheet_ids = fields.One2many('account.analytic.line', 'timesheet_invoice_id', string='Timesheets', readonly=True, copy=False, export_string_translation=False)
timesheet_count = fields.Integer("Number of timesheets", compute='_compute_timesheet_count', compute_sudo=True, export_string_translation=False)
timesheet_encode_uom_id = fields.Many2one('uom.uom', related='company_id.timesheet_encode_uom_id', export_string_translation=False)
timesheet_total_duration = fields.Integer("Timesheet Total Duration",
compute='_compute_timesheet_total_duration', compute_sudo=True,
help="Total recorded duration, expressed in the encoding UoM, and rounded to the unit")
@api.depends('timesheet_ids', 'company_id.timesheet_encode_uom_id')
def _compute_timesheet_total_duration(self):
if not self.user_has_groups('hr_timesheet.group_hr_timesheet_user'):
if not self.env.user.has_group('hr_timesheet.group_hr_timesheet_user'):
self.timesheet_total_duration = 0
return
group_data = self.env['account.analytic.line']._read_group([
('timesheet_invoice_id', 'in', self.ids)
], ['timesheet_invoice_id', 'unit_amount'], ['timesheet_invoice_id'])
], ['timesheet_invoice_id'], ['unit_amount:sum'])
timesheet_unit_amount_dict = defaultdict(float)
timesheet_unit_amount_dict.update({data['timesheet_invoice_id'][0]: data['unit_amount'] for data in group_data})
timesheet_unit_amount_dict.update({timesheet_invoice.id: amount for timesheet_invoice, amount in group_data})
for invoice in self:
total_time = invoice.company_id.project_time_mode_id._compute_quantity(
timesheet_unit_amount_dict[invoice.id],
@ -35,8 +36,8 @@ class AccountMove(models.Model):
@api.depends('timesheet_ids')
def _compute_timesheet_count(self):
timesheet_data = self.env['account.analytic.line']._read_group([('timesheet_invoice_id', 'in', self.ids)], ['timesheet_invoice_id'], ['timesheet_invoice_id'])
mapped_data = dict([(t['timesheet_invoice_id'][0], t['timesheet_invoice_id_count']) for t in timesheet_data])
timesheet_data = self.env['account.analytic.line']._read_group([('timesheet_invoice_id', 'in', self.ids)], ['timesheet_invoice_id'], ['__count'])
mapped_data = {timesheet_invoice.id: count for timesheet_invoice, count in timesheet_data}
for invoice in self:
invoice.timesheet_count = mapped_data.get(invoice.id, 0)
@ -48,7 +49,7 @@ class AccountMove(models.Model):
'domain': [('project_id', '!=', False)],
'res_model': 'account.analytic.line',
'view_id': False,
'view_mode': 'tree,form',
'view_mode': 'list,form',
'help': _("""
<p class="o_view_nocontent_smiling_face">
Record timesheets
@ -76,62 +77,29 @@ class AccountMove(models.Model):
"""
for line in self.filtered(lambda i: i.move_type == 'out_invoice' and i.state == 'draft').invoice_line_ids:
sale_line_delivery = line.sale_line_ids.filtered(lambda sol: sol.product_id.invoice_policy == 'delivery' and sol.product_id.service_type == 'timesheet')
if not start_date and not end_date:
start_date, end_date = self._get_range_dates(sale_line_delivery.order_id)
if sale_line_delivery:
domain = line._timesheet_domain_get_invoiced_lines(sale_line_delivery)
domain = Domain(line._timesheet_domain_get_invoiced_lines(sale_line_delivery))
if start_date:
domain = expression.AND([domain, [('date', '>=', start_date)]])
domain &= Domain('date', '>=', start_date)
if end_date:
domain = expression.AND([domain, [('date', '<=', end_date)]])
domain &= Domain('date', '<=', end_date)
timesheets = self.env['account.analytic.line'].sudo().search(domain)
timesheets.write({'timesheet_invoice_id': line.move_id.id})
def _get_range_dates(self, order):
# A method that can be overridden
# to set the start and end dates according to order values
return None, None
class AccountMoveLine(models.Model):
_inherit = 'account.move.line'
@api.model
def _timesheet_domain_get_invoiced_lines(self, sale_line_delivery):
""" Get the domain for the timesheet to link to the created invoice
:param sale_line_delivery: recordset of sale.order.line to invoice
:return a normalized domain
"""
return [
('so_line', 'in', sale_line_delivery.ids),
def action_post(self):
result = super().action_post()
credit_notes = self.filtered(lambda move: move.move_type == 'out_refund' and move.reversed_entry_id)
timesheets_sudo = self.env['account.analytic.line'].sudo().search([
('timesheet_invoice_id', 'in', credit_notes.reversed_entry_id.ids),
('so_line', 'in', credit_notes.invoice_line_ids.sale_line_ids.ids),
('project_id', '!=', False),
'|', '|',
('timesheet_invoice_id', '=', False),
'&',
('timesheet_invoice_id.state', '=', 'cancel'),
('timesheet_invoice_id.payment_state', '!=', 'invoicing_legacy'),
('timesheet_invoice_id.payment_state', '=', 'reversed')
]
def unlink(self):
move_line_read_group = self.env['account.move.line'].search_read([
('move_id.move_type', '=', 'out_invoice'),
('move_id.state', '=', 'draft'),
('sale_line_ids.product_id.invoice_policy', '=', 'delivery'),
('sale_line_ids.product_id.service_type', '=', 'timesheet'),
('id', 'in', self.ids)],
['move_id', 'sale_line_ids'])
sale_line_ids_per_move = defaultdict(lambda: self.env['sale.order.line'])
for move_line in move_line_read_group:
sale_line_ids_per_move[move_line['move_id'][0]] += self.env['sale.order.line'].browse(move_line['sale_line_ids'])
timesheet_read_group = self.sudo().env['account.analytic.line']._read_group([
('timesheet_invoice_id.move_type', '=', 'out_invoice'),
('timesheet_invoice_id.state', '=', 'draft'),
('timesheet_invoice_id', 'in', self.move_id.ids)],
['timesheet_invoice_id', 'so_line', 'ids:array_agg(id)'],
['timesheet_invoice_id', 'so_line'],
lazy=False)
timesheet_ids = []
for timesheet in timesheet_read_group:
move_id = timesheet['timesheet_invoice_id'][0]
if timesheet['so_line'] and timesheet['so_line'][0] in sale_line_ids_per_move[move_id].ids:
timesheet_ids += timesheet['ids']
self.sudo().env['account.analytic.line'].browse(timesheet_ids).write({'timesheet_invoice_id': False})
return super().unlink()
])
timesheets_sudo.write({'timesheet_invoice_id': False})
return result

View file

@ -0,0 +1,54 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from odoo import api, models
class AccountMoveLine(models.Model):
_inherit = 'account.move.line'
@api.model
def _timesheet_domain_get_invoiced_lines(self, sale_line_delivery):
""" Get the domain for the timesheet to link to the created invoice
:param sale_line_delivery: recordset of sale.order.line to invoice
:return a normalized domain
"""
return [
('so_line', 'in', sale_line_delivery.ids),
('project_id', '!=', False),
'|', '|',
('timesheet_invoice_id', '=', False),
'&',
('timesheet_invoice_id.state', '=', 'cancel'),
('timesheet_invoice_id.payment_state', '!=', 'invoicing_legacy'),
('timesheet_invoice_id.payment_state', '=', 'reversed')
]
def unlink(self):
move_line_read_group = self.env['account.move.line'].search_read([
('move_id.move_type', '=', 'out_invoice'),
('move_id.state', '=', 'draft'),
('sale_line_ids.product_id.invoice_policy', '=', 'delivery'),
('sale_line_ids.product_id.service_type', '=', 'timesheet'),
('id', 'in', self.ids)],
['move_id', 'sale_line_ids'])
sale_line_ids_per_move = defaultdict(lambda: self.env['sale.order.line'])
for move_line in move_line_read_group:
sale_line_ids_per_move[move_line['move_id'][0]] += self.env['sale.order.line'].browse(move_line['sale_line_ids'])
timesheet_read_group = self.sudo().env['account.analytic.line']._read_group([
('timesheet_invoice_id.move_type', '=', 'out_invoice'),
('timesheet_invoice_id.state', '=', 'draft'),
('timesheet_invoice_id', 'in', self.move_id.ids)],
['timesheet_invoice_id', 'so_line'],
['id:array_agg'])
timesheet_ids = []
for timesheet_invoice, so_line, ids in timesheet_read_group:
if so_line.id in sale_line_ids_per_move[timesheet_invoice.id].ids:
timesheet_ids += ids
self.sudo().env['account.analytic.line'].browse(timesheet_ids).write({'timesheet_invoice_id': False})
return super().unlink()

View file

@ -0,0 +1,15 @@
from odoo import models
class AccountMoveReversal(models.TransientModel):
_inherit = 'account.move.reversal'
def reverse_moves(self, is_modify=False):
if is_modify:
moves = self.move_ids.filtered(lambda m: m.move_type == 'out_invoice')
timesheets_sudo = self.env['account.analytic.line'].sudo().search([
('timesheet_invoice_id', 'in', moves.ids),
])
if timesheets_sudo:
timesheets_sudo.write({'timesheet_invoice_id': False})
return super().reverse_moves(is_modify)

View file

@ -0,0 +1,15 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, models
class HrEmployee(models.Model):
_inherit = 'hr.employee'
@api.model
def default_get(self, fields):
result = super().default_get(fields)
project_company_id = self.env.context.get('create_project_employee_mapping', False)
if project_company_id:
result['company_id'] = project_company_id
return result

View file

@ -1,10 +1,9 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.exceptions import UserError
from odoo.exceptions import UserError, ValidationError
from odoo import api, fields, models, _
from odoo.osv import expression
from odoo.fields import Domain
from odoo.tools.misc import unquote
TIMESHEET_INVOICE_TYPES = [
@ -12,31 +11,23 @@ TIMESHEET_INVOICE_TYPES = [
('billable_fixed', 'Billed at a Fixed price'),
('billable_milestones', 'Billed on Milestones'),
('billable_manual', 'Billed Manually'),
('non_billable', 'Non Billable Tasks'),
('non_billable', 'Non-Billable'),
('timesheet_revenues', 'Timesheet Revenues'),
('service_revenues', 'Service Revenues'),
('other_revenues', 'Other revenues'),
('other_costs', 'Other costs'),
]
class AccountAnalyticLine(models.Model):
_inherit = 'account.analytic.line'
def _default_sale_line_domain(self):
domain = super(AccountAnalyticLine, self)._default_sale_line_domain()
return expression.OR([domain, [('qty_delivered_method', '=', 'timesheet')]])
def _get_sellable_line_domain(self, domain):
return self.env['project.task']._get_sellable_line_domain(domain)
def _domain_so_line(self):
domain = expression.AND([
domain = Domain.AND([
self.env['sale.order.line']._sellable_lines_domain(),
self.env['sale.order.line']._domain_sale_line_service(),
[
('is_service', '=', True),
('is_expense', '=', False),
('state', 'in', ['sale', 'done']),
('order_partner_id', 'child_of', unquote('commercial_partner_id')),
('order_partner_id.commercial_partner_id', '=', unquote('commercial_partner_id')),
],
])
return str(domain)
@ -46,26 +37,30 @@ class AccountAnalyticLine(models.Model):
commercial_partner_id = fields.Many2one('res.partner', compute="_compute_commercial_partner")
timesheet_invoice_id = fields.Many2one('account.move', string="Invoice", readonly=True, copy=False, help="Invoice created from the timesheet", index='btree_not_null')
so_line = fields.Many2one(compute="_compute_so_line", store=True, readonly=False,
domain=_domain_so_line,
domain=_domain_so_line, falsy_value_label="Non-billable",
help="Sales order item to which the time spent will be added in order to be invoiced to your customer. Remove the sales order item for the timesheet entry to be non-billable.")
# we needed to store it only in order to be able to groupby in the portal
order_id = fields.Many2one(related='so_line.order_id', store=True, readonly=True, index=True)
is_so_line_edited = fields.Boolean("Is Sales Order Item Manually Edited")
allow_billable = fields.Boolean(related="project_id.allow_billable")
sale_order_state = fields.Selection(related='order_id.state')
@api.depends('project_id.commercial_partner_id', 'task_id.commercial_partner_id')
@api.depends('project_id.partner_id.commercial_partner_id', 'task_id.partner_id.commercial_partner_id')
def _compute_commercial_partner(self):
for timesheet in self:
timesheet.commercial_partner_id = timesheet.task_id.commercial_partner_id or timesheet.project_id.commercial_partner_id
timesheet.commercial_partner_id = timesheet.task_id.sudo().partner_id.commercial_partner_id or timesheet.project_id.sudo().partner_id.commercial_partner_id
@api.depends('so_line.product_id', 'project_id', 'amount')
@api.depends('so_line.product_id', 'project_id.billing_type', 'amount')
def _compute_timesheet_invoice_type(self):
for timesheet in self:
if timesheet.project_id: # AAL will be set to False
invoice_type = 'non_billable' if not timesheet.so_line else False
if timesheet.so_line and timesheet.so_line.product_id.type == 'service':
invoice_type = False
if not timesheet.so_line:
invoice_type = 'non_billable' if timesheet.project_id.billing_type != 'manually' else 'billable_manual'
elif timesheet.so_line.product_id.type == 'service':
if timesheet.so_line.product_id.invoice_policy == 'delivery':
if timesheet.so_line.product_id.service_type == 'timesheet':
invoice_type = 'timesheet_revenues' if timesheet.amount > 0 else 'billable_time'
invoice_type = 'timesheet_revenues' if timesheet.amount > 0 and timesheet.unit_amount > 0 else 'billable_time'
else:
service_type = timesheet.so_line.product_id.service_type
invoice_type = f'billable_{service_type}' if service_type in ['milestones', 'manual'] else 'billable_fixed'
@ -73,7 +68,7 @@ class AccountAnalyticLine(models.Model):
invoice_type = 'billable_fixed'
timesheet.timesheet_invoice_type = invoice_type
else:
if timesheet.amount >= 0:
if timesheet.amount >= 0 and timesheet.unit_amount >= 0:
if timesheet.so_line and timesheet.so_line.product_id.type == 'service':
timesheet.timesheet_invoice_type = 'service_revenues'
else:
@ -94,6 +89,9 @@ class AccountAnalyticLine(models.Model):
def _compute_project_id(self):
super(AccountAnalyticLine, self.filtered(lambda t: t._is_not_billed()))._compute_project_id()
def _is_readonly(self):
return super()._is_readonly() or not self._is_not_billed()
def _is_not_billed(self):
self.ensure_one()
return not self.timesheet_invoice_id or (self.timesheet_invoice_id.state == 'cancel' and self.timesheet_invoice_id.payment_state != 'invoicing_legacy')
@ -101,16 +99,12 @@ class AccountAnalyticLine(models.Model):
def _check_timesheet_can_be_billed(self):
return self.so_line in self.project_id.mapped('sale_line_employee_ids.sale_line_id') | self.task_id.sale_line_id | self.project_id.sale_line_id
def write(self, values):
# prevent to update invoiced timesheets if one line is of type delivery
self._check_can_write(values)
result = super(AccountAnalyticLine, self).write(values)
return result
def _check_can_write(self, values):
# prevent to update invoiced timesheets if one line is of type delivery
if self.sudo().filtered(lambda aal: aal.so_line.product_id.invoice_policy == "delivery") and self.filtered(lambda t: t.timesheet_invoice_id and t.timesheet_invoice_id.state != 'cancel'):
if any(field_name in values for field_name in ['unit_amount', 'employee_id', 'project_id', 'task_id', 'so_line', 'date']):
raise UserError(_('You cannot modify timesheets that are already invoiced.'))
return super()._check_can_write(values)
def _timesheet_determine_sale_line(self):
""" Deduce the SO line associated to the timesheet line:
@ -133,8 +127,8 @@ class AccountAnalyticLine(models.Model):
else: # then pricing_type = 'employee_rate'
map_entry = self.project_id.sale_line_employee_ids.filtered(
lambda map_entry:
map_entry.employee_id == self.employee_id
and map_entry.sale_line_id.order_partner_id.commercial_partner_id == self.task_id.commercial_partner_id
map_entry.employee_id == (self.employee_id or self.env.user.employee_id)
and map_entry.sale_line_id.order_partner_id.commercial_partner_id == self.task_id.partner_id.commercial_partner_id
)
if map_entry:
return map_entry.sale_line_id
@ -146,8 +140,8 @@ class AccountAnalyticLine(models.Model):
since in ordered quantity, the timesheet quantity is not invoiced,
thus there is no meaning of showing invoice with ordered quantity.
"""
domain = super(AccountAnalyticLine, self)._timesheet_get_portal_domain()
return expression.AND([domain, [('timesheet_invoice_type', 'in', ['billable_time', 'non_billable', 'billable_fixed'])]])
domain = super()._timesheet_get_portal_domain()
return Domain.AND([domain, [('timesheet_invoice_type', 'in', ['billable_time', 'non_billable', 'billable_fixed', 'billable_manual', 'billable_milestones'])]])
@api.model
def _timesheet_get_sale_domain(self, order_lines_ids, invoice_ids):
@ -168,7 +162,7 @@ class AccountAnalyticLine(models.Model):
]
def _get_timesheets_to_merge(self):
res = super(AccountAnalyticLine, self)._get_timesheets_to_merge()
res = super()._get_timesheets_to_merge()
return res.filtered(lambda l: not l.timesheet_invoice_id or l.timesheet_invoice_id.state != 'posted')
@api.ondelete(at_uninstall=False)
@ -187,9 +181,67 @@ class AccountAnalyticLine(models.Model):
return mapping_entry.cost
return super()._hourly_cost()
def action_sale_order_from_timesheet(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'name': _('Sales Order'),
'res_model': 'sale.order',
'views': [[False, 'form']],
'context': {'create': False, 'show_sale': True},
'res_id': self.order_id.id,
}
def action_invoice_from_timesheet(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'name': _('Invoice'),
'res_model': 'account.move',
'views': [[False, 'form']],
'context': {'create': False},
'res_id': self.timesheet_invoice_id.id,
}
def _timesheet_convert_sol_uom(self, sol, to_unit):
to_uom = self.env.ref(to_unit)
return round(sol.product_uom._compute_quantity(sol.product_uom_qty, to_uom, raise_if_failure=False), 2)
return round(sol.product_uom_id._compute_quantity(sol.product_uom_qty, to_uom, raise_if_failure=False), 2)
def _is_updatable_timesheet(self):
return super()._is_updatable_timesheet and self._is_not_billed()
def _timesheet_preprocess_get_accounts(self, vals):
so_line = self.env['sale.order.line'].browse(vals.get('so_line'))
if not (so_line and (distribution := so_line.sudo().analytic_distribution)):
return super()._timesheet_preprocess_get_accounts(vals)
company = self.env['res.company'].browse(vals.get('company_id'))
accounts = self.env['account.analytic.account'].browse([
int(account_id) for account_id in next(iter(distribution)).split(',')
]).exists()
if not accounts:
return super()._timesheet_preprocess_get_accounts(vals)
plan_column_names = {account.root_plan_id._column_name() for account in accounts}
mandatory_plans = [plan for plan in self._get_mandatory_plans(company, business_domain='timesheet') if plan['column_name'] != 'account_id']
missing_plan_names = [plan['name'] for plan in mandatory_plans if plan['column_name'] not in plan_column_names]
if missing_plan_names:
raise ValidationError(_(
"'%(missing_plan_names)s' analytic plan(s) required on the analytic distribution of the sale order item '%(so_line_name)s' linked to the timesheet.",
missing_plan_names=missing_plan_names,
so_line_name=so_line.name,
))
account_id_per_fname = dict.fromkeys(self._get_plan_fnames(), False)
for account in accounts:
account_id_per_fname[account.root_plan_id._column_name()] = account.id
return account_id_per_fname
def _timesheet_postprocess(self, values):
if values.get('so_line'):
for timesheet in self.sudo():
# If no account_id was found in the SOL's distribution, we fallback on the project's account_id
if not timesheet.account_id:
timesheet.account_id = timesheet.project_id.account_id
return super()._timesheet_postprocess(values)

View file

@ -1,155 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import threading
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class ProductTemplate(models.Model):
_inherit = 'product.template'
def _selection_service_policy(self):
service_policies = super()._selection_service_policy()
service_policies.insert(1, ('delivered_timesheet', _('Based on Timesheets')))
return service_policies
service_type = fields.Selection(selection_add=[
('timesheet', 'Timesheets on project (one fare per SO/Project)'),
], ondelete={'timesheet': 'set manual'})
# override domain
project_id = fields.Many2one(domain="[('company_id', '=', current_company_id), ('allow_billable', '=', True), ('pricing_type', '=', 'task_rate'), ('allow_timesheets', 'in', [service_policy == 'delivered_timesheet', True])]")
project_template_id = fields.Many2one(domain="[('company_id', '=', current_company_id), ('allow_billable', '=', True), ('allow_timesheets', 'in', [service_policy == 'delivered_timesheet', True])]")
service_upsell_threshold = fields.Float('Threshold', default=1, help="Percentage of time delivered compared to the prepaid amount that must be reached for the upselling opportunity activity to be triggered.")
service_upsell_threshold_ratio = fields.Char(compute='_compute_service_upsell_threshold_ratio')
@api.depends('uom_id', 'company_id')
def _compute_service_upsell_threshold_ratio(self):
product_uom_hour = self.env.ref('uom.product_uom_hour')
uom_unit = self.env.ref('uom.product_uom_unit')
company_uom = self.env.company.timesheet_encode_uom_id
for record in self:
if not record.uom_id or record.uom_id != uom_unit or\
product_uom_hour.factor == record.uom_id.factor or\
record.uom_id.category_id not in [product_uom_hour.category_id, uom_unit.category_id]:
record.service_upsell_threshold_ratio = False
continue
else:
timesheet_encode_uom = record.company_id.timesheet_encode_uom_id or company_uom
record.service_upsell_threshold_ratio = f'(1 {record.uom_id.name} = {timesheet_encode_uom.factor / product_uom_hour.factor:.2f} {timesheet_encode_uom.name})'
def _compute_visible_expense_policy(self):
visibility = self.user_has_groups('project.group_project_user')
for product_template in self:
if not product_template.visible_expense_policy:
product_template.visible_expense_policy = visibility
return super(ProductTemplate, self)._compute_visible_expense_policy()
@api.depends('service_tracking', 'service_policy', 'type')
def _compute_product_tooltip(self):
super()._compute_product_tooltip()
for record in self.filtered(lambda record: record.type == 'service'):
if record.service_policy == 'delivered_timesheet':
if record.service_tracking == 'no':
record.product_tooltip = _(
"Invoice based on timesheets (delivered quantity) on projects or tasks "
"you'll create later on."
)
elif record.service_tracking == 'task_global_project':
record.product_tooltip = _(
"Invoice based on timesheets (delivered quantity), and create a task in "
"an existing project to track the time spent."
)
elif record.service_tracking == 'task_in_project':
record.product_tooltip = _(
"Invoice based on timesheets (delivered quantity), and create a project "
"for the order with a task for each sales order line to track the time "
"spent."
)
elif record.service_tracking == 'project_only':
record.product_tooltip = _(
"Invoice based on timesheets (delivered quantity), and create an empty "
"project for the order to track the time spent."
)
def _get_service_to_general_map(self):
return {
**super()._get_service_to_general_map(),
'delivered_timesheet': ('delivery', 'timesheet'),
'ordered_prepaid': ('order', 'timesheet'),
}
@api.model
def _get_onchange_service_policy_updates(self, service_tracking, service_policy, project_id, project_template_id):
vals = {}
if service_tracking != 'no' and service_policy == 'delivered_timesheet':
if project_id and not project_id.allow_timesheets:
vals['project_id'] = False
elif project_template_id and not project_template_id.allow_timesheets:
vals['project_template_id'] = False
return vals
@api.onchange('service_policy')
def _onchange_service_policy(self):
self._inverse_service_policy()
vals = self._get_onchange_service_policy_updates(self.service_tracking,
self.service_policy,
self.project_id,
self.project_template_id)
if vals:
self.update(vals)
@api.ondelete(at_uninstall=False)
def _unlink_except_master_data(self):
time_product = self.env.ref('sale_timesheet.time_product')
if time_product.product_tmpl_id in self:
raise ValidationError(_('The %s product is required by the Timesheets app and cannot be archived nor deleted.', time_product.name))
def write(self, vals):
# timesheet product can't be archived or linked to a company
test_mode = getattr(threading.current_thread(), 'testing', False) or self.env.registry.in_test_mode()
if not test_mode and 'active' in vals and not vals['active']:
time_product = self.env.ref('sale_timesheet.time_product')
if time_product.product_tmpl_id in self:
raise ValidationError(_('The %s product is required by the Timesheets app and cannot be archived nor deleted.', time_product.name))
# TODO: avoid duplicate code by joining both conditions in master
if not test_mode and 'company_id' in vals and vals['company_id']:
time_product = self.env.ref('sale_timesheet.time_product')
if time_product.product_tmpl_id in self:
raise ValidationError(_('The %s product is required by the Timesheets app and cannot be linked to a company.', time_product.name))
return super(ProductTemplate, self).write(vals)
class ProductProduct(models.Model):
_inherit = 'product.product'
def _is_delivered_timesheet(self):
""" Check if the product is a delivered timesheet """
self.ensure_one()
return self.type == 'service' and self.service_policy == 'delivered_timesheet'
@api.onchange('service_policy')
def _onchange_service_policy(self):
self._inverse_service_policy()
vals = self.product_tmpl_id._get_onchange_service_policy_updates(self.service_tracking,
self.service_policy,
self.project_id,
self.project_template_id)
if vals:
self.update(vals)
@api.ondelete(at_uninstall=False)
def _unlink_except_master_data(self):
time_product = self.env.ref('sale_timesheet.time_product')
if time_product in self:
raise ValidationError(_('The %s product is required by the Timesheets app and cannot be archived nor deleted.') % time_product.name)
def write(self, vals):
# timesheet product can't be archived
test_mode = getattr(threading.current_thread(), 'testing', False) or self.env.registry.in_test_mode()
if not test_mode and 'active' in vals and not vals['active']:
time_product = self.env.ref('sale_timesheet.time_product')
if time_product in self:
raise ValidationError(_('The %s product is required by the Timesheets app and cannot be archived nor deleted.') % time_product.name)
return super(ProductProduct, self).write(vals)

View file

@ -0,0 +1,50 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import threading
from odoo import api, models, tools, _
from odoo.exceptions import ValidationError
class ProductProduct(models.Model):
_inherit = 'product.product'
def _is_delivered_timesheet(self):
""" Check if the product is a delivered timesheet """
self.ensure_one()
return self.type == 'service' and self.service_policy == 'delivered_timesheet'
@api.onchange('type', 'service_type', 'service_policy')
def _onchange_service_fields(self):
for record in self:
if record.type == 'service' and record.service_type == 'timesheet' and \
not (record._origin.service_policy and record.service_policy == record._origin.service_policy):
record.uom_id = self.env.ref('uom.product_uom_hour')
elif record._origin.uom_id:
record.uom_id = record._origin.uom_id
else:
record.uom_id = self.product_tmpl_id.default_get(['uom_id']).get('uom_id')
@api.onchange('service_policy')
def _onchange_service_policy(self):
self._inverse_service_policy()
vals = self.product_tmpl_id._get_onchange_service_policy_updates(self.service_tracking,
self.service_policy,
self.project_id,
self.project_template_id)
if vals:
self.update(vals)
@api.ondelete(at_uninstall=False)
def _unlink_except_master_data(self):
time_product = self.env.ref('sale_timesheet.time_product')
if time_product in self:
raise ValidationError(_('The %s product is required by the Timesheets app and cannot be archived, deleted nor linked to a company.', time_product.name))
def write(self, vals):
# timesheet product can't be deleted, archived or linked to a company
if ('active' in vals and not vals['active']) or ('company_id' in vals and vals['company_id']):
time_product = self.env.ref('sale_timesheet.time_product')
if time_product in self:
raise ValidationError(_('The %s product is required by the Timesheets app and cannot be archived, deleted nor linked to a company.', time_product.name))
return super().write(vals)

View file

@ -0,0 +1,102 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import threading
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class ProductTemplate(models.Model):
_inherit = 'product.template'
def _selection_service_policy(self):
service_policies = super()._selection_service_policy()
service_policies.insert(1, ('delivered_timesheet', _('Based on Timesheets')))
return service_policies
service_type = fields.Selection(selection_add=[
('timesheet', 'Timesheets on project (one fare per SO/Project)'),
], ondelete={'timesheet': 'set manual'})
# override domain
project_id = fields.Many2one(domain="['|', ('company_id', '=', False), '&', ('company_id', '=?', company_id), ('company_id', '=', current_company_id), ('allow_billable', '=', True), ('pricing_type', '=', 'task_rate'), ('allow_timesheets', 'in', [service_policy == 'delivered_timesheet', True]), ('is_template', '=', False)]")
project_template_id = fields.Many2one(domain="['|', ('company_id', '=', False), '&', ('company_id', '=?', company_id), ('company_id', '=', current_company_id), ('allow_billable', '=', True), ('allow_timesheets', 'in', [service_policy == 'delivered_timesheet', True]), ('is_template', '=', True)]")
service_upsell_threshold = fields.Float('Threshold', default=1, help="Percentage of time delivered compared to the prepaid amount that must be reached for the upselling opportunity activity to be triggered.")
service_upsell_threshold_ratio = fields.Char(compute='_compute_service_upsell_threshold_ratio', export_string_translation=False)
@api.depends('uom_id', 'company_id')
def _compute_service_upsell_threshold_ratio(self):
product_uom_hour = self.env.ref('uom.product_uom_hour')
uom_unit = self.env.ref('uom.product_uom_unit')
company_uom = self.env.company.timesheet_encode_uom_id
for record in self:
if not record.uom_id or record.uom_id != uom_unit or\
product_uom_hour.factor == record.uom_id.factor:
record.service_upsell_threshold_ratio = False
continue
else:
timesheet_encode_uom = record.company_id.timesheet_encode_uom_id or company_uom
record.service_upsell_threshold_ratio = f'(1 {record.uom_id.name} = {timesheet_encode_uom.factor / product_uom_hour.factor:.2f} {timesheet_encode_uom.name})'
def _compute_visible_expense_policy(self):
visibility = self.env.user.has_group('project.group_project_user')
for product_template in self:
if not product_template.visible_expense_policy:
product_template.visible_expense_policy = visibility
return super()._compute_visible_expense_policy()
def _prepare_invoicing_tooltip(self):
if self.service_policy == 'delivered_timesheet':
return _("Invoice based on timesheets (delivered quantity).")
return super()._prepare_invoicing_tooltip()
@api.onchange('type', 'service_type', 'service_policy')
def _onchange_service_fields(self):
for record in self:
if record.type == 'service' and record.service_type == 'timesheet' and \
not (record._origin.service_policy and record.service_policy == record._origin.service_policy):
record.uom_id = self.env.ref('uom.product_uom_hour')
elif record._origin.uom_id:
record.uom_id = record._origin.uom_id
else:
record.uom_id = self.default_get(['uom_id']).get('uom_id')
def _get_service_to_general_map(self):
return {
**super()._get_service_to_general_map(),
'delivered_timesheet': ('delivery', 'timesheet'),
'ordered_prepaid': ('order', 'timesheet'),
}
@api.model
def _get_onchange_service_policy_updates(self, service_tracking, service_policy, project_id, project_template_id):
vals = {}
if service_tracking != 'no' and service_policy == 'delivered_timesheet':
if project_id and not project_id.allow_timesheets:
vals['project_id'] = False
elif project_template_id and not project_template_id.allow_timesheets:
vals['project_template_id'] = False
return vals
@api.onchange('service_policy')
def _onchange_service_policy(self):
self._inverse_service_policy()
vals = self._get_onchange_service_policy_updates(self.service_tracking,
self.service_policy,
self.project_id,
self.project_template_id)
if vals:
self.update(vals)
@api.ondelete(at_uninstall=False)
def _unlink_except_master_data(self):
time_product = self.env.ref('sale_timesheet.time_product')
if time_product.product_tmpl_id in self:
raise ValidationError(_('The %s product is required by the Timesheets app and cannot be archived, deleted nor linked to a company.', time_product.name))
def write(self, vals):
# timesheet product can't be deleted, archived or linked to a company
if ('active' in vals and not vals['active']) or ('company_id' in vals and vals['company_id']):
time_product = self.env.ref('sale_timesheet.time_product')
if time_product.product_tmpl_id in self:
raise ValidationError(_('The %s product is required by the Timesheets app and cannot be archived, deleted nor linked to a company.', time_product.name))
return super().write(vals)

View file

@ -1,22 +1,22 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import ast
import json
from collections import defaultdict
from odoo import api, fields, models, _, _lt
from odoo.osv import expression
from odoo import api, fields, models
from odoo.fields import Domain
from odoo.tools import SQL
from odoo.exceptions import ValidationError, UserError
from odoo.tools.translate import _
# YTI PLEASE SPLIT ME
class Project(models.Model):
class ProjectProject(models.Model):
_inherit = 'project.project'
@api.model
def default_get(self, fields):
""" Pre-fill timesheet product as "Time" data product when creating new project allowing billable tasks by default. """
result = super(Project, self).default_get(fields)
result = super().default_get(fields)
if 'timesheet_product_id' in fields and result.get('allow_billable') and result.get('allow_timesheets') and not result.get('timesheet_product_id'):
default_product = self.env.ref('sale_timesheet.time_product', False)
if default_product:
@ -34,28 +34,41 @@ class Project(models.Model):
compute='_compute_pricing_type',
search='_search_pricing_type',
help='The task rate is perfect if you would like to bill different services to different customers at different rates. The fixed rate is perfect if you bill a service at a fixed rate per hour or day worked regardless of the employee who performed it. The employee rate is preferable if your employees deliver the same service at a different rate. For instance, junior and senior consultants would deliver the same service (= consultancy), but at a different rate because of their level of seniority.')
sale_line_employee_ids = fields.One2many('project.sale.line.employee.map', 'project_id', "Sale line/Employee map", copy=False,
sale_line_employee_ids = fields.One2many(
'project.sale.line.employee.map',
'project_id',
'Sale line/Employee map',
copy=False,
export_string_translation=False,
help="Sales order item that will be selected by default on the timesheets of the corresponding employee. It bypasses the sales order item defined on the project and the task, and can be modified on each timesheet entry if necessary. In other words, it defines the rate at which an employee's time is billed based on their expertise, skills or experience, for instance.\n"
"If you would like to bill the same service at a different rate, you need to create two separate sales order items as each sales order item can only have a single unit price at a time.\n"
"You can also define the hourly company cost of your employees for their timesheets on this project specifically. It will bypass the timesheet cost set on the employee.")
billable_percentage = fields.Integer(
compute='_compute_billable_percentage', groups='hr_timesheet.group_hr_timesheet_approver',
help="% of timesheets that are billable compared to the total number of timesheets linked to the AA of the project, rounded to the unit.")
display_create_order = fields.Boolean(compute='_compute_display_create_order')
timesheet_product_id = fields.Many2one(
'product.product', string='Timesheet Product',
domain="""[
('detailed_type', '=', 'service'),
('type', '=', 'service'),
('invoice_policy', '=', 'delivery'),
('service_type', '=', 'timesheet'),
'|', ('company_id', '=', False), ('company_id', '=', company_id)]""",
]""",
help='Service that will be used by default when invoicing the time spent on a task. It can be modified on each task individually by selecting a specific sales order item.',
check_company=True,
compute="_compute_timesheet_product_id", store=True, readonly=False,
default=_default_timesheet_product_id)
warning_employee_rate = fields.Boolean(compute='_compute_warning_employee_rate', compute_sudo=True)
warning_employee_rate = fields.Boolean(compute='_compute_warning_employee_rate', compute_sudo=True, export_string_translation=False)
partner_id = fields.Many2one(
compute='_compute_partner_id', store=True, readonly=False)
allocated_hours = fields.Float(compute='_compute_allocated_hours', store=True, readonly=False)
allocated_hours = fields.Float()
billing_type = fields.Selection(
compute="_compute_billing_type",
selection=[
('not_billable', 'not billable'),
('manually', 'billed manually'),
],
default='not_billable',
required=True,
readonly=False,
store=True,
)
@api.model
def _get_view(self, view_id=None, view_type='form', **options):
@ -80,65 +93,23 @@ class Project(models.Model):
def _search_pricing_type(self, operator, value):
""" Search method for pricing_type field.
This method returns a domain based on the operator and the value given in parameter:
- operator = '=':
- value = 'task_rate': [('sale_line_employee_ids', '=', False), ('sale_line_id', '=', False), ('allow_billable', '=', True)]
- value = 'fixed_rate': [('sale_line_employee_ids', '=', False), ('sale_line_id', '!=', False), ('allow_billable', '=', True)]
- value = 'employee_rate': [('sale_line_employee_ids', '!=', False), ('allow_billable', '=', True)]
- value is False: [('allow_billable', '=', False)]
- operator = '!=':
- value = 'task_rate': ['|', '|', ('sale_line_employee_ids', '!=', False), ('sale_line_id', '!=', False), ('allow_billable', '=', False)]
- value = 'fixed_rate': ['|', '|', ('sale_line_employee_ids', '!=', False), ('sale_line_id', '=', False), ('allow_billable', '=', False)]
- value = 'employee_rate': ['|', ('sale_line_employee_ids', '=', False), ('allow_billable', '=', False)]
- value is False: [('allow_billable', '!=', False)]
:param operator: the supported operator is either '=' or '!='.
:param value: the value than the field should be is among these values into the following tuple: (False, 'task_rate', 'fixed_rate', 'employee_rate').
:returns: the domain to find the expected projects.
"""
if operator not in ('=', '!='):
raise UserError(_('Operation not supported'))
if not ((isinstance(value, bool) and value is False) or (isinstance(value, str) and value in ('task_rate', 'fixed_rate', 'employee_rate'))):
raise UserError(_('Value does not exist in the pricing type'))
if value is False:
return [('allow_billable', operator, value)]
sol_cond = ('sale_line_id', '!=', False)
mapping_cond = ('sale_line_employee_ids', '!=', False)
if value == 'task_rate':
domain = [expression.NOT_OPERATOR, sol_cond, expression.NOT_OPERATOR, mapping_cond]
elif value == 'fixed_rate':
domain = [sol_cond, expression.NOT_OPERATOR, mapping_cond]
else: # value == 'employee_rate'
domain = [mapping_cond]
domain = expression.AND([domain, [('allow_billable', '=', True)]])
domain = expression.normalize_domain(domain)
if operator != '=':
domain.insert(0, expression.NOT_OPERATOR)
domain = expression.distribute_not(domain)
return domain
@api.depends('analytic_account_id', 'timesheet_ids')
def _compute_billable_percentage(self):
timesheets_read_group = self.env['account.analytic.line']._read_group([('project_id', 'in', self.ids)], ['project_id', 'so_line', 'unit_amount'], ['project_id', 'so_line'], lazy=False)
timesheets_by_project = defaultdict(list)
for res in timesheets_read_group:
timesheets_by_project[res['project_id'][0]].append((res['unit_amount'], bool(res['so_line'])))
for project in self:
timesheet_total = timesheet_billable = 0.0
for unit_amount, is_billable_timesheet in timesheets_by_project[project.id]:
timesheet_total += unit_amount
if is_billable_timesheet:
timesheet_billable += unit_amount
billable_percentage = timesheet_billable / timesheet_total * 100 if timesheet_total > 0 else 0
project.billable_percentage = round(billable_percentage)
@api.depends('partner_id', 'pricing_type')
def _compute_display_create_order(self):
for project in self:
project.display_create_order = project.partner_id and project.pricing_type == 'task_rate'
if operator != 'in':
return NotImplemented
domains = []
if 'task_rate' in value:
domains.append([('sale_line_employee_ids', '=', False), ('sale_line_id', '=', False), ('allow_billable', '=', True)])
if 'fixed_rate' in value:
domains.append([('sale_line_employee_ids', '=', False), ('sale_line_id', '!=', False), ('allow_billable', '=', True)])
if 'employee_rate' in value:
domains.append([('sale_line_employee_ids', '!=', False), ('allow_billable', '=', True)])
if False in value:
domains.append([('allow_billable', '=', False)])
return Domain.OR(domains)
@api.depends('allow_timesheets', 'allow_billable')
def _compute_timesheet_product_id(self):
@ -152,48 +123,54 @@ class Project(models.Model):
@api.depends('pricing_type', 'allow_timesheets', 'allow_billable', 'sale_line_employee_ids', 'sale_line_employee_ids.employee_id')
def _compute_warning_employee_rate(self):
projects = self.filtered(lambda p: p.allow_billable and p.allow_timesheets and p.pricing_type == 'employee_rate')
employees = self.env['account.analytic.line']._read_group([('task_id', 'in', projects.task_ids.ids)], ['employee_id', 'project_id'], ['employee_id', 'project_id'], lazy=False)
dict_project_employee = defaultdict(list)
for line in employees:
dict_project_employee[line['project_id'][0]] += [line['employee_id'][0]] if line['employee_id'] else []
employees = self.env['account.analytic.line']._read_group(
[('task_id', 'in', projects.task_ids.ids), ('employee_id', '!=', False)],
['project_id'],
['employee_id:array_agg'],
)
dict_project_employee = {project.id: employee_ids for project, employee_ids in employees}
for project in projects:
project.warning_employee_rate = any(x not in project.sale_line_employee_ids.employee_id.ids for x in dict_project_employee[project.id])
project.warning_employee_rate = any(
x not in project.sale_line_employee_ids.employee_id.ids
for x in dict_project_employee.get(project.id, ())
)
(self - projects).warning_employee_rate = False
@api.depends('sale_line_employee_ids.sale_line_id', 'sale_line_id')
def _compute_partner_id(self):
for project in self:
billable_projects = self.filtered('allow_billable')
for project in billable_projects:
if project.partner_id:
continue
if project.allow_billable and project.allow_timesheets and project.pricing_type != 'task_rate':
sol = project.sale_line_id or project.sale_line_employee_ids.sale_line_id[:1]
project.partner_id = sol.order_partner_id
super(ProjectProject, self - billable_projects)._compute_partner_id()
@api.depends('partner_id')
def _compute_sale_line_id(self):
super()._compute_sale_line_id()
for project in self.filtered(lambda p: not p.sale_line_id and p.partner_id and p.pricing_type == 'employee_rate'):
# Give a SOL by default either the last SOL with service product and remaining_hours > 0
sol = self.env['sale.order.line'].search([
('is_service', '=', True),
('order_partner_id', 'child_of', project.partner_id.commercial_partner_id.id),
('is_expense', '=', False),
('state', 'in', ['sale', 'done']),
('remaining_hours', '>', 0)
], limit=1)
SaleOrderLine = self.env['sale.order.line']
sol = SaleOrderLine.search(Domain.AND([
SaleOrderLine._domain_sale_line_service(),
[('order_partner_id', 'child_of', project.partner_id.commercial_partner_id.id), ('remaining_hours', '>', 0)],
]), limit=1)
project.sale_line_id = sol or project.sale_line_employee_ids.sale_line_id[:1] # get the first SOL containing in the employee mappings if no sol found in the search
@api.depends('sale_line_id.product_uom_qty', 'sale_line_id.product_uom')
def _compute_allocated_hours(self):
# TODO: remove in master
return
@api.depends('sale_line_employee_ids.sale_line_id', 'allow_billable')
def _compute_sale_order_count(self):
billable_projects = self.filtered('allow_billable')
super(Project, billable_projects)._compute_sale_order_count()
(self - billable_projects).sale_order_count = 0
super(ProjectProject, billable_projects)._compute_sale_order_count()
non_billable_projects = self - billable_projects
non_billable_projects.sale_order_line_count = 0
non_billable_projects.sale_order_count = 0
@api.depends('allow_billable', 'allow_timesheets')
def _compute_billing_type(self):
self.filtered(lambda project: (not project.allow_billable or not project.allow_timesheets) and project.billing_type == 'manually').billing_type = 'not_billable'
@api.constrains('sale_line_id')
def _check_sale_line_type(self):
@ -203,9 +180,9 @@ class Project(models.Model):
if project.sale_line_id.is_expense:
raise ValidationError(_("You cannot link a billable project to a sales order item that comes from an expense or a vendor bill."))
def write(self, values):
res = super(Project, self).write(values)
if 'allow_billable' in values and not values.get('allow_billable'):
def write(self, vals):
res = super().write(vals)
if 'allow_billable' in vals and not vals.get('allow_billable'):
self.task_ids._get_timesheet().write({
'so_line': False,
})
@ -228,7 +205,7 @@ class Project(models.Model):
'domain': [('project_id', '!=', False)],
'res_model': 'account.analytic.line',
'view_id': False,
'view_mode': 'tree,form',
'view_mode': 'list,form',
'help': _("""
<p class="o_view_nocontent_smiling_face">
Record timesheets
@ -245,26 +222,11 @@ class Project(models.Model):
}
}
def action_make_billable(self):
return {
"name": _("Create Sales Order"),
"type": 'ir.actions.act_window',
"res_model": 'project.create.sale.order',
"views": [[False, "form"]],
"target": 'new',
"context": {
'active_id': self.id,
'active_model': 'project.project',
'default_product_id': self.timesheet_product_id.id,
},
}
def action_billable_time_button(self):
self.ensure_one()
action = self.env["ir.actions.actions"]._for_xml_id("sale_timesheet.timesheet_action_from_sales_order_item")
action.update({
'context': {
'grid_range': 'week',
'search_default_groupby_timesheet_invoice_type': True,
'default_project_id': self.id,
},
@ -277,11 +239,11 @@ class Project(models.Model):
if section_name in ['billable_fixed', 'billable_time', 'billable_milestones', 'billable_manual', 'non_billable']:
action = self.action_billable_time_button()
if domain:
action['domain'] = expression.AND([[('project_id', '=', self.id)], domain])
action['domain'] = Domain.AND([[('project_id', '=', self.id)], domain])
action['context'].update(search_default_groupby_timesheet_invoice_type=False, **self.env.context)
graph_view = False
if section_name == 'billable_time':
graph_view = self.env.ref('hr_timesheet.view_hr_timesheet_line_graph_all').id
graph_view = self.env.ref('sale_timesheet.view_hr_timesheet_line_graph_invoice_employee').id
action['views'] = [
(view_id, view_type) if view_type != 'graph' else (graph_view or view_id, view_type)
for view_id, view_type in action['views']
@ -298,22 +260,41 @@ class Project(models.Model):
return action
return super().action_profitability_items(section_name, domain, res_id)
def action_project_timesheets(self):
action = super().action_project_timesheets()
if not self.allow_billable:
context = action['context'].replace('active_id', str(self.id))
action['context'] = {
**ast.literal_eval(context),
'hide_so_line': True,
}
return action
# ----------------------------
# Project Updates
# ----------------------------
def get_panel_data(self):
panel_data = super(Project, self).get_panel_data()
panel_data = super().get_panel_data()
return {
**panel_data,
'analytic_account_id': self.analytic_account_id.id,
'account_id': self.account_id.id,
}
def _get_foldable_section(self):
foldable_section = super()._get_foldable_section()
return foldable_section + [
'billable_fixed',
'billable_milestones',
'billable_time',
'billable_manual',
]
def _get_sale_order_items_query(self, domain_per_model=None):
if domain_per_model is None:
domain_per_model = {'project.task': [('allow_billable', '=', True)]}
else:
domain_per_model['project.task'] = expression.AND([
domain_per_model['project.task'] = Domain.AND([
domain_per_model.get('project.task', []),
[('allow_billable', '=', True)],
])
@ -322,13 +303,12 @@ class Project(models.Model):
Timesheet = self.env['account.analytic.line']
timesheet_domain = [('project_id', 'in', self.ids), ('so_line', '!=', False), ('project_id.allow_billable', '=', True)]
if Timesheet._name in domain_per_model:
timesheet_domain = expression.AND([
timesheet_domain = Domain.AND([
domain_per_model.get(Timesheet._name, []),
timesheet_domain,
])
timesheet_query = Timesheet._where_calc(timesheet_domain)
Timesheet._apply_ir_rules(timesheet_query, 'read')
timesheet_query_str, timesheet_params = timesheet_query.select(
timesheet_query = Timesheet._search(timesheet_domain)
timesheet_sql = timesheet_query.select(
f'{Timesheet._table}.project_id AS id',
f'{Timesheet._table}.so_line AS sale_line_id',
)
@ -336,35 +316,61 @@ class Project(models.Model):
EmployeeMapping = self.env['project.sale.line.employee.map']
employee_mapping_domain = [('project_id', 'in', self.ids), ('project_id.allow_billable', '=', True), ('sale_line_id', '!=', False)]
if EmployeeMapping._name in domain_per_model:
employee_mapping_domain = expression.AND([
employee_mapping_domain = Domain.AND([
domain_per_model[EmployeeMapping._name],
employee_mapping_domain,
])
employee_mapping_query = EmployeeMapping._where_calc(employee_mapping_domain)
EmployeeMapping._apply_ir_rules(employee_mapping_query, 'read')
employee_mapping_query_str, employee_mapping_params = employee_mapping_query.select(
employee_mapping_query = EmployeeMapping._search(employee_mapping_domain)
employee_mapping_sql = employee_mapping_query.select(
f'{EmployeeMapping._table}.project_id AS id',
f'{EmployeeMapping._table}.sale_line_id',
)
query._tables['project_sale_order_item'] = ' UNION '.join([
query._tables['project_sale_order_item'] = SQL('(%s)', SQL(' UNION ').join([
query._tables['project_sale_order_item'],
timesheet_query_str,
employee_mapping_query_str,
])
query._where_params += timesheet_params + employee_mapping_params
timesheet_sql,
employee_mapping_sql,
]))
return query
def _get_domain_from_section_id(self, section_id):
section_domains = {
'materials': [
('product_id.type', '!=', 'service')
],
'billable_fixed': [
('product_id.type', '=', 'service'),
('product_id.invoice_policy', '=', 'order')
],
'billable_milestones': [
('product_id.type', '=', 'service'),
('product_id.invoice_policy', '=', 'delivery'),
('product_id.service_type', '=', 'milestones'),
],
'billable_time': [
('product_id.type', '=', 'service'),
('product_id.invoice_policy', '=', 'delivery'),
('product_id.service_type', '=', 'timesheet'),
],
'billable_manual': [
('product_id.type', '=', 'service'),
('product_id.invoice_policy', '=', 'delivery'),
('product_id.service_type', '=', 'manual'),
],
}
return self._get_sale_items_domain(section_domains.get(section_id, []))
def _get_profitability_labels(self):
return {
**super()._get_profitability_labels(),
'billable_fixed': _lt('Timesheets (Fixed Price)'),
'billable_time': _lt('Timesheets (Billed on Timesheets)'),
'billable_milestones': _lt('Timesheets (Billed on Milestones)'),
'billable_manual': _lt('Timesheets (Billed Manually)'),
'non_billable': _lt('Timesheets (Non Billable)'),
'timesheet_revenues': _lt('Timesheets revenues'),
'other_costs': _lt('Materials'),
'billable_fixed': self.env._('Timesheets (Fixed Price)'),
'billable_time': self.env._('Timesheets (Billed on Timesheets)'),
'billable_milestones': self.env._('Timesheets (Billed on Milestones)'),
'billable_manual': self.env._('Timesheets (Billed Manually)'),
'non_billable': self.env._('Timesheets (Non-Billable)'),
'timesheet_revenues': self.env._('Timesheets revenues'),
'other_costs': self.env._('Materials'),
}
def _get_profitability_sequence_per_invoice_type(self):
@ -381,7 +387,7 @@ class Project(models.Model):
def _get_profitability_aal_domain(self):
domain = ['|', ('project_id', 'in', self.ids), ('so_line', 'in', self._fetch_sale_order_item_ids())]
return expression.AND([
return Domain.AND([
super()._get_profitability_aal_domain(),
domain,
])
@ -403,17 +409,20 @@ class Project(models.Model):
return profitability_items
aa_line_read_group = self.env['account.analytic.line'].sudo()._read_group(
self.sudo()._get_profitability_aal_domain(),
['timesheet_invoice_type', 'timesheet_invoice_id', 'unit_amount', 'amount', 'ids:array_agg(id)'],
['timesheet_invoice_type', 'timesheet_invoice_id'],
lazy=False)
can_see_timesheets = with_action and len(self) == 1 and self.user_has_groups('hr_timesheet.group_hr_timesheet_approver')
['timesheet_invoice_type', 'timesheet_invoice_id', 'currency_id', 'category'],
['amount:sum', 'id:array_agg'],
)
can_see_timesheets = with_action and len(self) == 1 and self.env.user.has_group('hr_timesheet.group_hr_timesheet_approver')
revenues_dict = {}
costs_dict = {}
total_revenues = {'invoiced': 0.0, 'to_invoice': 0.0}
total_costs = {'billed': 0.0, 'to_bill': 0.0}
for res in aa_line_read_group:
amount = res['amount']
invoice_type = res['timesheet_invoice_type']
convert_company = self.company_id or self.env.company
for timesheet_invoice_type, _dummy, currency, category, amount, ids in aa_line_read_group:
if category == 'vendor_bill':
continue # This is done to prevent expense duplication with product re-invoice policies
amount = currency._convert(amount, self.currency_id, convert_company)
invoice_type = timesheet_invoice_type
cost = costs_dict.setdefault(invoice_type, {'billed': 0.0, 'to_bill': 0.0})
revenue = revenues_dict.setdefault(invoice_type, {'invoiced': 0.0, 'to_invoice': 0.0})
if amount < 0: # cost
@ -423,9 +432,8 @@ class Project(models.Model):
revenue['invoiced'] += amount
total_revenues['invoiced'] += amount
if can_see_timesheets and invoice_type not in ['other_costs', 'other_revenues']:
cost.setdefault('record_ids', []).extend(res['ids'])
revenue.setdefault('record_ids', []).extend(res['ids'])
cost.setdefault('record_ids', []).extend(ids)
revenue.setdefault('record_ids', []).extend(ids)
action_name = None
if can_see_timesheets:
action_name = 'action_profitability_items'
@ -449,7 +457,6 @@ class Project(models.Model):
if record_ids:
if invoice_type not in ['other_costs', 'other_revenues'] and can_see_timesheets: # action to see the timesheets
action = get_timesheets_action(invoice_type, record_ids)
action['context'] = json.dumps({'search_default_groupby_invoice': 1 if not cost and invoice_type == 'billable_time' else 0})
data['action'] = action
profitability_data.append(data)
return profitability_data
@ -457,7 +464,7 @@ class Project(models.Model):
def merge_profitability_data(a, b):
return {
'data': a['data'] + b['data'],
'total': {key: a['total'][key] + b['total'][key] for key in a['total'].keys() if key in b['total']}
'total': {key: a['total'][key] + b['total'][key] for key in a['total'] if key in b['total']}
}
for revenue in profitability_items['revenues']['data']:
@ -468,7 +475,6 @@ class Project(models.Model):
record_ids = aal_revenue.get('record_ids', [])
if can_see_timesheets and record_ids:
action = get_timesheets_action(revenue_id, record_ids)
action['context'] = json.dumps({'search_default_groupby_invoice': 1 if revenue_id == 'billable_time' else 0})
revenue['action'] = action
for cost in profitability_items['costs']['data']:
@ -490,6 +496,13 @@ class Project(models.Model):
)
return profitability_items
def _get_domain_aal_with_no_move_line(self):
# we add the tuple 'project_id = False' in the domain to remove the timesheets from the search.
return Domain.AND([
super()._get_domain_aal_with_no_move_line(),
[('project_id', '=', False)]
])
def _get_service_policy_to_invoice_type(self):
return {
**super()._get_service_policy_to_invoice_type(),
@ -505,113 +518,15 @@ class Project(models.Model):
with_action
)
class ProjectTask(models.Model):
_inherit = "project.task"
def _get_default_partner_id(self, project, parent):
res = super()._get_default_partner_id(project, parent)
if not res and project:
# project in sudo if the current user is a portal user.
related_project = project if not self.user_has_groups('!base.group_user,base.group_portal') else project.sudo()
if related_project.pricing_type == 'employee_rate':
return related_project.sale_line_employee_ids.sale_line_id.order_partner_id[:1]
def _get_project_to_template_warnings(self):
res = super()._get_project_to_template_warnings()
timesheet_linked_count = self.env['account.analytic.line'].search_count([('project_id', '=', self.id)], limit=1)
if timesheet_linked_count:
res.append(self.env._("This project is current linked to timesheet."))
return res
sale_order_id = fields.Many2one(domain="['|', '|', ('partner_id', '=', partner_id), ('partner_id', 'child_of', commercial_partner_id), ('partner_id', 'parent_of', partner_id)]")
so_analytic_account_id = fields.Many2one(related='sale_order_id.analytic_account_id', string='Sale Order Analytic Account')
pricing_type = fields.Selection(related="project_id.pricing_type")
is_project_map_empty = fields.Boolean("Is Project map empty", compute='_compute_is_project_map_empty')
has_multi_sol = fields.Boolean(compute='_compute_has_multi_sol', compute_sudo=True)
allow_billable = fields.Boolean(related="project_id.allow_billable")
timesheet_product_id = fields.Many2one(related="project_id.timesheet_product_id")
remaining_hours_so = fields.Float('Remaining Hours on SO', compute='_compute_remaining_hours_so', search='_search_remaining_hours_so', compute_sudo=True)
remaining_hours_available = fields.Boolean(related="sale_line_id.remaining_hours_available")
@property
def SELF_READABLE_FIELDS(self):
return super().SELF_READABLE_FIELDS | {
'allow_billable',
'remaining_hours_available',
'remaining_hours_so',
}
@api.depends('sale_line_id', 'timesheet_ids', 'timesheet_ids.unit_amount')
def _compute_remaining_hours_so(self):
# TODO This is not yet perfectly working as timesheet.so_line stick to its old value although changed
# in the task From View.
timesheets = self.timesheet_ids.filtered(lambda t: t.task_id.sale_line_id in (t.so_line, t._origin.so_line) and t.so_line.remaining_hours_available)
mapped_remaining_hours = {task._origin.id: task.sale_line_id and task.sale_line_id.remaining_hours or 0.0 for task in self}
uom_hour = self.env.ref('uom.product_uom_hour')
for timesheet in timesheets:
delta = 0
if timesheet._origin.so_line == timesheet.task_id.sale_line_id:
delta += timesheet._origin.unit_amount
if timesheet.so_line == timesheet.task_id.sale_line_id:
delta -= timesheet.unit_amount
if delta:
mapped_remaining_hours[timesheet.task_id._origin.id] += timesheet.product_uom_id._compute_quantity(delta, uom_hour)
for task in self:
task.remaining_hours_so = mapped_remaining_hours[task._origin.id]
@api.model
def _search_remaining_hours_so(self, operator, value):
return [('sale_line_id.remaining_hours', operator, value)]
@api.depends('so_analytic_account_id.active')
def _compute_analytic_account_active(self):
super()._compute_analytic_account_active()
for task in self:
task.analytic_account_active = task.analytic_account_active or task.so_analytic_account_id.active
@api.depends('allow_billable')
def _compute_sale_order_id(self):
billable_tasks = self.filtered('allow_billable')
super(ProjectTask, billable_tasks)._compute_sale_order_id()
(self - billable_tasks).sale_order_id = False
@api.depends('commercial_partner_id', 'sale_line_id.order_partner_id', 'parent_id.sale_line_id', 'project_id.sale_line_id', 'allow_billable')
def _compute_sale_line(self):
billable_tasks = self.filtered('allow_billable')
(self - billable_tasks).update({'sale_line_id': False})
super(ProjectTask, billable_tasks)._compute_sale_line()
for task in billable_tasks:
if not task.sale_line_id:
task.sale_line_id = task._get_last_sol_of_customer()
@api.depends('project_id.sale_line_employee_ids')
def _compute_is_project_map_empty(self):
for task in self:
task.is_project_map_empty = not bool(task.sudo().project_id.sale_line_employee_ids)
@api.depends('timesheet_ids')
def _compute_has_multi_sol(self):
for task in self:
task.has_multi_sol = task.timesheet_ids and task.timesheet_ids.so_line != task.sale_line_id
def _get_last_sol_of_customer(self):
# Get the last SOL made for the customer in the current task where we need to compute
self.ensure_one()
if not self.commercial_partner_id or not self.allow_billable:
return False
domain = [('company_id', '=', self.company_id.id), ('is_service', '=', True), ('order_partner_id', 'child_of', self.commercial_partner_id.id), ('is_expense', '=', False), ('state', 'in', ['sale', 'done']), ('remaining_hours', '>', 0)]
if self.project_id.pricing_type != 'task_rate' and self.project_sale_order_id and self.commercial_partner_id == self.project_id.partner_id.commercial_partner_id:
domain.append(('order_id', '=?', self.project_sale_order_id.id))
return self.env['sale.order.line'].search(domain, limit=1)
def _get_timesheet(self):
# return not invoiced timesheet and timesheet without so_line or so_line linked to task
timesheet_ids = super(ProjectTask, self)._get_timesheet()
return timesheet_ids.filtered(lambda t: t._is_not_billed())
def _get_action_view_so_ids(self):
return list(set((self.sale_order_id + self.timesheet_ids.so_line.order_id).ids))
class ProjectTaskRecurrence(models.Model):
_inherit = 'project.task.recurrence'
@api.model
def _get_recurring_fields(self):
return ['so_analytic_account_id'] + super(ProjectTaskRecurrence, self)._get_recurring_fields()
def _get_template_default_context_whitelist(self):
return [
*super()._get_template_default_context_whitelist(),
"allow_timesheets",
]

View file

@ -1,47 +1,56 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
from odoo.osv import expression
from odoo.fields import Domain
from odoo.tools.misc import unquote
class ProjectProductEmployeeMap(models.Model):
class ProjectSaleLineEmployeeMap(models.Model):
_name = 'project.sale.line.employee.map'
_description = 'Project Sales line, employee mapping'
def _domain_sale_line_id(self):
domain = expression.AND([
domain = Domain.AND([
self.env['sale.order.line']._sellable_lines_domain(),
self.env['sale.order.line']._domain_sale_line_service(),
[
('is_service', '=', True),
('is_expense', '=', False),
('state', 'in', ['sale', 'done']),
('order_partner_id', '=?', unquote('partner_id')),
'|', ('company_id', '=', False), ('company_id', '=', unquote('company_id')),
],
])
return domain
project_id = fields.Many2one('project.project', "Project", required=True)
employee_id = fields.Many2one('hr.employee', "Employee", required=True)
project_id = fields.Many2one('project.project', "Project", domain=[('is_template', '=', False)], required=True, index=True)
employee_id = fields.Many2one('hr.employee', "Employee", required=True, domain="[('id', 'not in', existing_employee_ids)]")
existing_employee_ids = fields.Many2many('hr.employee', compute="_compute_existing_employee_ids", export_string_translation=False, compute_sudo=True)
sale_line_id = fields.Many2one(
'sale.order.line', "Sales Order Item",
compute="_compute_sale_line_id", store=True, readonly=False,
domain=lambda self: str(self._domain_sale_line_id()))
company_id = fields.Many2one('res.company', string='Company', related='project_id.company_id')
partner_id = fields.Many2one(related='project_id.partner_id')
domain=lambda self: str(self._domain_sale_line_id())
)
sale_order_id = fields.Many2one(related="project_id.sale_order_id", export_string_translation=False)
company_id = fields.Many2one('res.company', string='Company', related='project_id.company_id', export_string_translation=False)
partner_id = fields.Many2one(related='project_id.partner_id', export_string_translation=False)
price_unit = fields.Float("Unit Price", compute='_compute_price_unit', store=True, readonly=True)
currency_id = fields.Many2one('res.currency', string="Currency", compute='_compute_currency_id', store=True, readonly=False)
cost = fields.Monetary(currency_field='cost_currency_id', compute='_compute_cost', store=True, readonly=False,
help="This cost overrides the employee's default employee hourly wage in employee's HR Settings")
display_cost = fields.Monetary(currency_field='cost_currency_id', compute="_compute_display_cost", inverse="_inverse_display_cost", string="Hourly Cost")
cost_currency_id = fields.Many2one('res.currency', string="Cost Currency", related='employee_id.currency_id', readonly=True)
is_cost_changed = fields.Boolean('Is Cost Manually Changed', compute='_compute_is_cost_changed', store=True)
display_cost = fields.Monetary(currency_field='cost_currency_id', compute="_compute_display_cost", inverse="_inverse_display_cost", string="Hourly Cost", groups="project.group_project_manager,hr.group_hr_user")
cost_currency_id = fields.Many2one('res.currency', string="Cost Currency", related='employee_id.currency_id', readonly=True, export_string_translation=False)
is_cost_changed = fields.Boolean('Is Cost Manually Changed', compute='_compute_is_cost_changed', store=True, export_string_translation=False)
_sql_constraints = [
('uniqueness_employee', 'UNIQUE(project_id,employee_id)', 'An employee cannot be selected more than once in the mapping. Please remove duplicate(s) and try again.'),
]
_uniqueness_employee = models.Constraint(
'UNIQUE(project_id,employee_id)',
'An employee cannot be selected more than once in the mapping. Please remove duplicate(s) and try again.',
)
@api.depends('employee_id', 'project_id.sale_line_employee_ids.employee_id')
def _compute_existing_employee_ids(self):
project = self.project_id
if len(project) == 1:
self.existing_employee_ids = project.sale_line_employee_ids.employee_id
return
for map_entry in self:
map_entry.existing_employee_ids = map_entry.project_id.sale_line_employee_ids.employee_id
@api.depends('partner_id')
def _compute_sale_line_id(self):
@ -80,12 +89,12 @@ class ProjectProductEmployeeMap(models.Model):
read_group_data = self.env['resource.calendar']._read_group(
[('id', 'in', self.employee_id.resource_calendar_id.ids)],
['ids:array_agg(id)', 'hours_per_day'],
['hours_per_day'],
['id:array_agg'],
)
for res in read_group_data:
for calendar_id in res.get('ids', []):
resource_calendar_per_hours[calendar_id] = res.get('hours_per_day')
for hours_per_day, ids in read_group_data:
for calendar_id in ids:
resource_calendar_per_hours[calendar_id] = hours_per_day
return resource_calendar_per_hours
@ -122,8 +131,8 @@ class ProjectProductEmployeeMap(models.Model):
maps._update_project_timesheet()
return maps
def write(self, values):
res = super(ProjectProductEmployeeMap, self).write(values)
def write(self, vals):
res = super().write(vals)
self._update_project_timesheet()
return res

View file

@ -0,0 +1,119 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
from odoo.fields import Domain
class ProjectTask(models.Model):
_inherit = "project.task"
def _get_default_partner_id(self, project=None, parent=None):
res = super()._get_default_partner_id(project, parent)
if not res and project:
# project in sudo if the current user is a portal user.
related_project = project
if self.env.user._is_portal() and not self.env.user._is_internal():
related_project = related_project.sudo()
if related_project.pricing_type == 'employee_rate':
return related_project.sale_line_employee_ids.sale_line_id.order_partner_id[:1]
return res
sale_order_id = fields.Many2one(domain="['|', '|', ('partner_id', '=', partner_id), ('partner_id.commercial_partner_id.id', 'parent_of', partner_id), ('partner_id', 'parent_of', partner_id)]")
pricing_type = fields.Selection(related="project_id.pricing_type")
is_project_map_empty = fields.Boolean("Is Project map empty", compute='_compute_is_project_map_empty')
has_multi_sol = fields.Boolean(compute='_compute_has_multi_sol', compute_sudo=True)
timesheet_product_id = fields.Many2one(related="project_id.timesheet_product_id")
remaining_hours_so = fields.Float('Time Remaining on SO', compute='_compute_remaining_hours_so', search='_search_remaining_hours_so', compute_sudo=True)
remaining_hours_available = fields.Boolean(related="sale_line_id.remaining_hours_available")
last_sol_of_customer = fields.Many2one('sale.order.line', compute='_compute_last_sol_of_customer')
@property
def TASK_PORTAL_READABLE_FIELDS(self):
return super().TASK_PORTAL_READABLE_FIELDS | {
'remaining_hours_available',
'remaining_hours_so',
}
@api.depends('sale_line_id', 'timesheet_ids', 'timesheet_ids.unit_amount')
def _compute_remaining_hours_so(self):
# TODO This is not yet perfectly working as timesheet.so_line stick to its old value although changed
# in the task From View.
timesheets = self.timesheet_ids.filtered(lambda t: t.task_id.sale_line_id in (t.so_line, t._origin.so_line) and t.so_line.remaining_hours_available)
mapped_remaining_hours = {task._origin.id: task.sale_line_id and task.sale_line_id.remaining_hours or 0.0 for task in self}
uom_hour = self.env.ref('uom.product_uom_hour')
for timesheet in timesheets:
delta = 0
if timesheet._origin.so_line == timesheet.task_id.sale_line_id:
delta += timesheet._origin.unit_amount
if timesheet.so_line == timesheet.task_id.sale_line_id:
delta -= timesheet.unit_amount
if delta:
mapped_remaining_hours[timesheet.task_id._origin.id] += timesheet.product_uom_id._compute_quantity(delta, uom_hour)
for task in self:
task.remaining_hours_so = mapped_remaining_hours[task._origin.id]
@api.model
def _search_remaining_hours_so(self, operator, value):
return [('sale_line_id.remaining_hours', operator, value)]
def _compute_last_sol_of_customer(self):
sol_per_domain = dict()
for task in self:
domain = tuple(task._get_last_sol_of_customer_domain())
if not domain:
task.last_sol_of_customer = False
continue
if domain not in sol_per_domain:
sol_per_domain[domain] = self.env['sale.order.line'].search(domain, limit=1)
task.last_sol_of_customer = sol_per_domain[domain]
def _inverse_partner_id(self):
super()._inverse_partner_id()
for task in self:
if task.allow_billable and not task.sale_line_id:
task.sale_line_id = task.sudo().last_sol_of_customer
@api.depends('sale_line_id.order_partner_id', 'parent_id.sale_line_id', 'project_id.sale_line_id', 'allow_billable')
def _compute_sale_line(self):
super()._compute_sale_line()
for task in self:
if task.allow_billable and not task.sale_line_id:
task.sale_line_id = task.last_sol_of_customer
@api.depends('project_id.sale_line_employee_ids')
def _compute_is_project_map_empty(self):
for task in self:
task.is_project_map_empty = not bool(task.sudo().project_id.sale_line_employee_ids)
@api.depends('timesheet_ids')
def _compute_has_multi_sol(self):
for task in self:
task.has_multi_sol = task.timesheet_ids and task.timesheet_ids.so_line != task.sale_line_id
def _get_last_sol_of_customer_domain(self):
# Get the domain of the last SOL made for the customer in the current task where we need to compute
self.ensure_one()
if not self.partner_id.commercial_partner_id or not self.allow_billable:
return []
SaleOrderLine = self.env['sale.order.line']
domain = Domain.AND([
SaleOrderLine._domain_sale_line_service(),
[
('company_id', '=?', self.company_id.id),
('order_partner_id', 'child_of', self.partner_id.commercial_partner_id.id),
('remaining_hours', '>', 0),
],
])
if self.project_id.pricing_type != 'task_rate' and self.project_sale_order_id and self.partner_id.commercial_partner_id == self.project_id.partner_id.commercial_partner_id:
domain &= Domain('order_id', '=', self.project_sale_order_id.id)
return domain
def _get_timesheet(self):
# return not invoiced timesheet and timesheet without so_line or so_line linked to task
timesheet_ids = super()._get_timesheet()
return timesheet_ids.filtered(lambda t: t._is_not_billed())
def _get_action_view_so_ids(self):
return list(set((self.sale_order_id + self.timesheet_ids.so_line.order_id).ids))

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