19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:31:00 +01:00
parent a1137a1456
commit e1d89e11e3
2789 changed files with 1093187 additions and 605897 deletions

View file

@ -20,39 +20,18 @@ pip install odoo-bringout-oca-ocb-hr_timesheet
## Dependencies
This addon depends on:
- hr
- hr_hourly_cost
- analytic
- project
- uom
## Manifest Information
- **Name**: Task Logs
- **Version**: 1.0
- **Category**: Services/Timesheets
- **License**: LGPL-3
- **Installable**: True
## Source
Based on [OCA/OCB](https://github.com/OCA/OCB) branch 16.0, addon `hr_timesheet`.
- Repository: https://github.com/OCA/OCB
- Branch: 19.0
- Path: addons/hr_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
- 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

@ -4,15 +4,15 @@
from . import controllers
from . import models
from . import report
from . import wizard
from odoo import api, fields, SUPERUSER_ID, _
from odoo import fields
from odoo.addons.project import _check_exists_collaborators_for_project_sharing
from odoo.tools.sql import SQL
def create_internal_project(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
def create_internal_project(env):
# allow_timesheets is set by default, but erased for existing projects at
# installation, as there is no analytic account for them.
env['project.project'].search([]).write({'allow_timesheets': True})
@ -22,9 +22,9 @@ def create_internal_project(cr, registry):
return
project_ids = env['res.company'].search([])._create_internal_project_task()
env['account.analytic.line'].create([{
'name': _("Analysis"),
'name': env._("Analysis"),
'user_id': admin.id,
'date': fields.datetime.today(),
'date': fields.Date.today(),
'unit_amount': 0,
'project_id': task.project_id.id,
'task_id': task.id,
@ -32,13 +32,12 @@ def create_internal_project(cr, registry):
_check_exists_collaborators_for_project_sharing(env)
def _uninstall_hook(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
def _uninstall_hook(env):
def update_action_window(xmlid):
act_window = env.ref(xmlid, raise_if_not_found=False)
if act_window and act_window.domain and 'is_internal_project' in act_window.domain:
act_window.domain = []
act_window.domain = [("is_template", "=", False)]
update_action_window('project.open_view_project_all')
update_action_window('project.open_view_project_all_group_stage')
@ -49,3 +48,23 @@ def _uninstall_hook(cr, registry):
project_ids.write({'active': False})
env['ir.model.data'].search([('name', 'ilike', 'internal_project_default_stage')]).unlink()
def _pre_init_hook(env):
"""
Create manually new compute+stored columns to allow installing the module on large databases without trigger an Out-of-memory error.
"""
env.cr.execute(SQL("""
ALTER TABLE account_analytic_line
-- The task_id is set to False when there is no project_id on the line, but at installation,
-- no line is associated with a project -> task_id = False
ADD COLUMN IF NOT EXISTS task_id INT4,
-- At fresh installation, `task_id` is False -> parent_task_id, which is related to it, will also be False
ADD COLUMN IF NOT EXISTS parent_task_id INT4,
-- The project_id is defined as being the same as the one from the task, but task_id = False -> project_id = False
ADD COLUMN IF NOT EXISTS project_id INT4,
-- The department_id is the one from the `employee_id`, but `employee_id` by default is False -> department_id = False
ADD COLUMN IF NOT EXISTS department_id INT4,
-- The manager_id is the manager of the employee_id, but there is no `employee_id` by default -> manager_id = False
ADD COLUMN IF NOT EXISTS manager_id INT4
"""))

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
@ -28,35 +27,51 @@ up a management by affair.
'data/digest_data.xml',
'views/hr_timesheet_views.xml',
'views/res_config_settings_views.xml',
'views/project_views.xml',
'views/project_portal_templates.xml',
'views/project_project_views.xml',
'views/project_task_views.xml',
'views/project_task_portal_templates.xml',
'views/hr_timesheet_portal_templates.xml',
'report/hr_timesheet_report_view.xml',
'report/project_report_view.xml',
'report/report_timesheet_templates.xml',
'views/hr_views.xml',
'views/hr_department_views.xml',
'views/hr_employee_views.xml',
'views/hr_employee_public_views.xml',
'data/hr_timesheet_data.xml',
'views/project_sharing_views.xml',
'views/rating_rating_views.xml',
'views/project_task_sharing_views.xml',
'views/project_update_views.xml',
'wizard/hr_employee_delete_wizard_views.xml',
'views/hr_timesheet_menus.xml',
],
'demo': [
'data/hr_timesheet_demo.xml',
],
'installable': True,
'pre_init_hook': '_pre_init_hook',
'post_init_hook': 'create_internal_project',
'uninstall_hook': '_uninstall_hook',
'assets': {
'web.assets_backend': [
'hr_timesheet/static/src/**/*',
('remove', 'hr_timesheet/static/src/views/project_task_analysis_graph/**/*'),
('remove', 'hr_timesheet/static/src/views/project_task_graph/**/*'),
('remove', 'hr_timesheet/static/src/views/timesheet_graph/**/*'),
],
'web.qunit_suite_tests': [
'hr_timesheet/static/tests/**/*',
'web.assets_backend_lazy': [
'hr_timesheet/static/src/views/project_task_analysis_graph/**/*',
'hr_timesheet/static/src/views/project_task_graph/**/*',
'hr_timesheet/static/src/views/timesheet_graph/**/*',
],
'web.assets_unit_tests': [
'hr_timesheet/static/tests/hr_timesheet_models.js',
'hr_timesheet/static/tests/**/*.test.js',
],
'project.webclient': [
'hr_timesheet/static/src/services/**/*',
'hr_timesheet/static/src/components/**/*',
'hr_timesheet/static/src/scss/timesheets_task_form.scss'
],
},
'author': 'Odoo S.A.',
'license': 'LGPL-3',
}

View file

@ -1,14 +1,12 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import OrderedDict
from dateutil.relativedelta import relativedelta
from operator import itemgetter
from odoo import fields, http, _
from odoo.fields import Domain
from odoo.http import request
from odoo.tools import date_utils, groupby as groupbyelem
from odoo.osv.expression import AND, OR
from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager
from odoo.addons.project.controllers.portal import ProjectCustomerPortal
@ -26,99 +24,96 @@ class TimesheetCustomerPortal(CustomerPortal):
def _get_searchbar_inputs(self):
return {
'all': {'input': 'all', 'label': _('Search in All')},
'employee': {'input': 'employee', 'label': _('Search in Employee')},
'project': {'input': 'project', 'label': _('Search in Project')},
'task': {'input': 'task', 'label': _('Search in Task')},
'name': {'input': 'name', 'label': _('Search in Description')},
'name': {'input': 'name', 'label': _('Search in Description'), 'sequence': 10},
'employee_id': {'input': 'employee_id', 'label': _('Search in Employee'), 'sequence': 20},
'project_id': {'input': 'project_id', 'label': _('Search in Project'), 'sequence': 30},
'task_id': {'input': 'task_id', 'label': _('Search in Task'), 'sequence': 40},
'parent_task_id': {'input': 'parent_task_id', 'label': _('Search in Parent Task'), 'sequence': 70},
}
def _task_get_searchbar_sortings(self, milestones_allowed):
values = super()._task_get_searchbar_sortings(milestones_allowed)
values['progress'] = {'label': _('Progress'), 'order': 'progress asc', 'sequence': 10}
return values
def _task_get_searchbar_sortings(self, milestones_allowed, project=False):
return super()._task_get_searchbar_sortings(milestones_allowed, project) | {
'progress asc': {'label': _('Progress'), 'order': 'progress asc', 'sequence': 100},
}
def _get_searchbar_groupby(self):
return {
'none': {'input': 'none', 'label': _('None')},
'project': {'input': 'project', 'label': _('Project')},
'task': {'input': 'task', 'label': _('Task')},
'date': {'input': 'date', 'label': _('Date')},
'employee': {'input': 'employee', 'label': _('Employee')}
'none': {'label': _('None'), 'sequence': 10},
'date': {'label': _('Date'), 'sequence': 20},
'project_id': {'label': _('Project'), 'sequence': 30},
'parent_task_id': {'label': _('Parent Task'), 'sequence': 40},
'task_id': {'label': _('Task'), 'sequence': 50},
'employee_id': {'label': _('Employee'), 'sequence': 70},
}
def _get_search_domain(self, search_in, search):
search_domain = []
if search_in in ('project', 'all'):
search_domain = OR([search_domain, [('project_id', 'ilike', search)]])
if search_in in ('name', 'all'):
search_domain = OR([search_domain, [('name', 'ilike', search)]])
if search_in in ('employee', 'all'):
search_domain = OR([search_domain, [('employee_id', 'ilike', search)]])
if search_in in ('task', 'all'):
search_domain = OR([search_domain, [('task_id', 'ilike', search)]])
return search_domain
def _get_groupby_mapping(self):
return {
'project': 'project_id',
'task': 'task_id',
'employee': 'employee_id',
'date': 'date'
}
if search_in in self._get_searchbar_inputs():
return Domain(search_in, 'ilike', search)
else:
return Domain.FALSE
def _get_searchbar_sortings(self):
return {
'date': {'label': _('Newest'), 'order': 'date desc'},
'employee': {'label': _('Employee'), 'order': 'employee_id'},
'project': {'label': _('Project'), 'order': 'project_id'},
'task': {'label': _('Task'), 'order': 'task_id'},
'name': {'label': _('Description'), 'order': 'name'},
'date desc': {'label': _('Newest')},
'employee_id': {'label': _('Employee')},
'project_id': {'label': _('Project')},
'task_id': {'label': _('Task')},
'name': {'label': _('Description')},
}
def _project_get_page_view_values(self, project, access_token, page=1, date_begin=None, date_end=None, sortby=None, search=None, search_in='content', groupby=None, **kwargs):
values = super()._project_get_page_view_values(project, access_token, page, date_begin, date_end, sortby, search, search_in, groupby, **kwargs)
values['allow_timesheets'] = project.allow_timesheets
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='none', **kw):
Timesheet = request.env['account.analytic.line']
domain = Timesheet._timesheet_get_portal_domain()
domain = Domain(Timesheet._timesheet_get_portal_domain())
Timesheet_sudo = Timesheet.sudo()
values = self._prepare_portal_layout_values()
_items_per_page = 100
items_per_page = 100
searchbar_sortings = self._get_searchbar_sortings()
searchbar_inputs = self._get_searchbar_inputs()
searchbar_inputs = dict(sorted(self._get_searchbar_inputs().items(), key=lambda item: item[1]['sequence']))
searchbar_groupby = self._get_searchbar_groupby()
searchbar_groupby = dict(sorted(self._get_searchbar_groupby().items(), key=lambda item: item[1]['sequence']))
today = fields.Date.today()
quarter_start, quarter_end = date_utils.get_quarter(today)
last_quarter_date = date_utils.subtract(quarter_start, weeks=1)
last_quarter_start, last_quarter_end = date_utils.get_quarter(last_quarter_date)
last_week = today + relativedelta(weeks=-1)
last_month = today + relativedelta(months=-1)
last_year = today + relativedelta(years=-1)
searchbar_filters = {
'all': {'label': _('All'), 'domain': []},
'last_year': {'label': _('Last Year'), 'domain': [('date', '>=', date_utils.start_of(last_year, 'year')), ('date', '<=', date_utils.end_of(last_year, 'year'))]},
'last_quarter': {'label': _('Last Quarter'), 'domain': [('date', '>=', last_quarter_start), ('date', '<=', last_quarter_end)]},
'last_month': {'label': _('Last Month'), 'domain': [('date', '>=', date_utils.start_of(last_month, 'month')), ('date', '<=', date_utils.end_of(last_month, 'month'))]},
'last_week': {'label': _('Last Week'), 'domain': [('date', '>=', date_utils.start_of(last_week, "week")), ('date', '<=', date_utils.end_of(last_week, 'week'))]},
'today': {'label': _('Today'), 'domain': [("date", "=", today)]},
'week': {'label': _('This week'), 'domain': [('date', '>=', date_utils.start_of(today, "week")), ('date', '<=', date_utils.end_of(today, 'week'))]},
'month': {'label': _('This month'), 'domain': [('date', '>=', date_utils.start_of(today, 'month')), ('date', '<=', date_utils.end_of(today, 'month'))]},
'year': {'label': _('This year'), 'domain': [('date', '>=', date_utils.start_of(today, 'year')), ('date', '<=', date_utils.end_of(today, 'year'))]},
'week': {'label': _('This Week'), 'domain': [('date', '>=', date_utils.start_of(today, "week")), ('date', '<=', date_utils.end_of(today, 'week'))]},
'month': {'label': _('This Month'), 'domain': [('date', '>=', date_utils.start_of(today, 'month')), ('date', '<=', date_utils.end_of(today, 'month'))]},
'quarter': {'label': _('This Quarter'), 'domain': [('date', '>=', quarter_start), ('date', '<=', quarter_end)]},
'last_week': {'label': _('Last week'), 'domain': [('date', '>=', date_utils.start_of(last_week, "week")), ('date', '<=', date_utils.end_of(last_week, 'week'))]},
'last_month': {'label': _('Last month'), 'domain': [('date', '>=', date_utils.start_of(last_month, 'month')), ('date', '<=', date_utils.end_of(last_month, 'month'))]},
'last_year': {'label': _('Last year'), 'domain': [('date', '>=', date_utils.start_of(last_year, 'year')), ('date', '<=', date_utils.end_of(last_year, 'year'))]},
'year': {'label': _('This Year'), 'domain': [('date', '>=', date_utils.start_of(today, 'year')), ('date', '<=', date_utils.end_of(today, 'year'))]},
}
# default sort by value
if not sortby:
sortby = 'date'
order = searchbar_sortings[sortby]['order']
sortby = 'date desc'
# default filter by value
if not filterby:
filterby = 'all'
domain = AND([domain, searchbar_filters[filterby]['domain']])
domain &= Domain(searchbar_filters[filterby]['domain'])
if search and search_in:
domain += self._get_search_domain(search_in, search)
domain &= self._get_search_domain(search_in, search)
if parent_task_id := kw.get('parent_task_id'):
domain &= Domain('parent_task_id', '=', int(parent_task_id))
timesheet_count = Timesheet_sudo.search_count(domain)
# pager
@ -127,30 +122,29 @@ class TimesheetCustomerPortal(CustomerPortal):
url_args={'sortby': sortby, 'search_in': search_in, 'search': search, 'filterby': filterby, 'groupby': groupby},
total=timesheet_count,
page=page,
step=_items_per_page
step=items_per_page,
)
def get_timesheets():
groupby_mapping = self._get_groupby_mapping()
field = groupby_mapping.get(groupby, None)
orderby = '%s, %s' % (field, order) if field else order
timesheets = Timesheet_sudo.search(domain, order=orderby, limit=_items_per_page, offset=pager['offset'])
field = None if groupby == 'none' else groupby
orderby = '%s, %s' % (field, sortby) if field else sortby
timesheets = Timesheet_sudo.search(domain, order=orderby, limit=items_per_page, offset=pager['offset'])
if field:
if groupby == 'date':
raw_timesheets_group = Timesheet_sudo.read_group(
domain, ["unit_amount:sum", "ids:array_agg(id)"], ["date:day"]
raw_timesheets_group = Timesheet_sudo._read_group(
domain, ['date:day'], ['unit_amount:sum', 'id:recordset'], order='date:day desc'
)
grouped_timesheets = [(Timesheet_sudo.browse(group["ids"]), group["unit_amount"]) for group in raw_timesheets_group]
grouped_timesheets = [(records, unit_amount) for __, unit_amount, records in raw_timesheets_group]
else:
time_data = Timesheet_sudo.read_group(domain, [field, 'unit_amount:sum'], [field])
mapped_time = dict([(m[field][0] if m[field] else False, m['unit_amount']) for m in time_data])
time_data = Timesheet_sudo._read_group(domain, [field], ['unit_amount:sum'])
mapped_time = {field.id: unit_amount for field, unit_amount in time_data}
grouped_timesheets = [(Timesheet_sudo.concat(*g), mapped_time[k.id]) for k, g in groupbyelem(timesheets, itemgetter(field))]
return timesheets, grouped_timesheets
grouped_timesheets = [(
timesheets,
sum(Timesheet_sudo.search(domain).mapped('unit_amount'))
Timesheet_sudo._read_group(domain, aggregates=['unit_amount:sum'])[0][0]
)] if timesheets else []
return timesheets, grouped_timesheets
@ -169,23 +163,24 @@ class TimesheetCustomerPortal(CustomerPortal):
'groupby': groupby,
'searchbar_inputs': searchbar_inputs,
'searchbar_groupby': searchbar_groupby,
'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())),
'searchbar_filters': searchbar_filters,
'filterby': filterby,
'is_uom_day': request.env['account.analytic.line']._is_timesheet_encode_uom_day(),
})
return request.render("hr_timesheet.portal_my_timesheets", values)
class TimesheetProjectCustomerPortal(ProjectCustomerPortal):
def _show_task_report(self, task_sudo, report_type, download):
domain = request.env['account.analytic.line']._timesheet_get_portal_domain()
task_domain = AND([domain, [('task_id', '=', task_sudo.id)]])
task_domain = Domain(domain) & Domain('task_id', '=', task_sudo.id)
timesheets = request.env['account.analytic.line'].sudo().search(task_domain)
return self._show_report(model=timesheets,
report_type=report_type, report_ref='hr_timesheet.timesheet_report_task_timesheets', download=download)
def _prepare_tasks_values(self, page, date_begin, date_end, sortby, search, search_in, groupby, url="/my/tasks", domain=None, su=False):
values = super()._prepare_tasks_values(page, date_begin, date_end, sortby, search, search_in, groupby, url, domain, su)
def _prepare_tasks_values(self, page, date_begin, date_end, sortby, search, search_in, groupby, url="/my/tasks", domain=None, su=False, project=False):
values = super()._prepare_tasks_values(page, date_begin, date_end, sortby, search, search_in, groupby, url, domain, su, project)
values.update(
is_uom_day=request.env['account.analytic.line']._is_timesheet_encode_uom_day(),
)

View file

@ -1,21 +1,26 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from odoo.fields import Domain
from odoo.http import request
from odoo.osv import expression
from odoo.addons.project.controllers.portal import CustomerPortal
class ProjectCustomerPortal(CustomerPortal):
def _prepare_project_sharing_session_info(self, project, task=None):
session_info = super()._prepare_project_sharing_session_info(project, task)
def _get_project_sharing_company(self, project):
company = project.company_id
if not company:
timesheet = request.env['account.analytic.line'].sudo().search([('project_id', '=', project.id)], limit=1)
company = timesheet.company_id or request.env.user.company_id
return company
def _prepare_project_sharing_session_info(self, project):
session_info = super()._prepare_project_sharing_session_info(project)
company = request.env['res.company'].sudo().browse(session_info['user_companies']['current_company'])
timesheet_encode_uom = company.timesheet_encode_uom_id
project_time_mode_uom = company.project_time_mode_id
session_info['user_companies']['allowed_companies'][company.id].update(
timesheet_uom_id=timesheet_encode_uom.id,
timesheet_uom_factor=project_time_mode_uom._compute_quantity(
@ -33,20 +38,16 @@ class ProjectCustomerPortal(CustomerPortal):
'timesheet_widget': uom.timesheet_widget,
} for uom in [timesheet_encode_uom, project_time_mode_uom]
}
session_info['user_context']['allow_timesheets'] = project.allow_timesheets
return session_info
def _task_get_page_view_values(self, task, access_token, **kwargs):
values = super(ProjectCustomerPortal, self)._task_get_page_view_values(task, access_token, **kwargs)
values = super()._task_get_page_view_values(task, access_token, **kwargs)
domain = request.env['account.analytic.line']._timesheet_get_portal_domain()
task_domain = expression.AND([domain, [('task_id', '=', task.id)]])
subtask_domain = expression.AND([domain, [('task_id', 'in', task.child_ids.ids)]])
task_domain = Domain(domain) & Domain('task_id', '=', task.id)
timesheets = request.env['account.analytic.line'].sudo().search(task_domain)
subtasks_timesheets = request.env['account.analytic.line'].sudo().search(subtask_domain)
timesheets_by_subtask = defaultdict(lambda: request.env['account.analytic.line'].sudo())
for timesheet in subtasks_timesheets:
timesheets_by_subtask[timesheet.task_id] |= timesheet
values['allow_timesheets'] = task.allow_timesheets
values['timesheets'] = timesheets
values['timesheets_by_subtask'] = timesheets_by_subtask
values['is_uom_day'] = request.env['account.analytic.line']._is_timesheet_encode_uom_day()
return values

View file

@ -9,7 +9,7 @@
<div>
<b class="tip_title">Tip: Record your Timesheets faster</b>
<p class="tip_content">Record your timesheets in an instant by pressing Shift + the corresponding hotkey to add 15min to your projects.</p>
<img src="https://download.odoocdn.com/digests/hr_timesheet/static/img/digest_tip_timesheets_hotkeys.gif" class="illustration_border" />
<img src="https://download.odoocdn.com/digests/hr_timesheet/static/img/digest_tip_timesheets_hotkeys.gif" width="540" class="illustration_border" />
</div>
</field>
</record>

View file

@ -22,4 +22,50 @@
<field name="name">Internal</field>
</record>
<!-- Project Task export template -->
<record id="project_task_export_template_line_allocated_hours" model="ir.exports.line">
<field name="export_id" ref="project.project_task_export_template"/>
<field name="name">allocated_hours</field>
</record>
<!-- Timesheets export template -->
<record id="account_analytic_line_export_template" model="ir.exports">
<field name="name">Timesheets</field>
<field name="resource">account.analytic.line</field>
</record>
<record id="account_analytic_line_export_template_line_id" model="ir.exports.line">
<field name="export_id" ref="account_analytic_line_export_template"/>
<field name="name">id</field>
</record>
<record id="account_analytic_line_export_template_line_date" model="ir.exports.line">
<field name="export_id" ref="account_analytic_line_export_template"/>
<field name="name">date</field>
</record>
<record id="account_analytic_line_export_template_line_employee_id" model="ir.exports.line">
<field name="export_id" ref="account_analytic_line_export_template"/>
<field name="name">employee_id</field>
</record>
<record id="account_analytic_line_export_template_line_project_id" model="ir.exports.line">
<field name="export_id" ref="account_analytic_line_export_template"/>
<field name="name">project_id</field>
</record>
<record id="account_analytic_line_export_template_line_task_id" model="ir.exports.line">
<field name="export_id" ref="account_analytic_line_export_template"/>
<field name="name">task_id</field>
</record>
<record id="account_analytic_line_export_template_line_name" model="ir.exports.line">
<field name="export_id" ref="account_analytic_line_export_template"/>
<field name="name">name</field>
</record>
<record id="account_analytic_line_export_template_line_unit_amount" model="ir.exports.line">
<field name="export_id" ref="account_analytic_line_export_template"/>
<field name="name">unit_amount</field>
</record>
</odoo>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,362 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Odoo 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 14:06+0000\n"
"PO-Revision-Date: 2015-09-10 15:14+0000\n"
"Last-Translator: Martin Trigaux\n"
"Language-Team: English (Australia) (http://www.transifex.com/odoo/odoo-9/"
"language/en_AU/)\n"
"Language: en_AU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line_by_project
msgid "Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_delay
msgid "Avg. Plan.-Eff."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_project_subtask_project_id
msgid ""
"Choosing a sub-tasks project will both enable sub-tasks and set their "
"default project (possibly the project itself)"
msgstr ""
#. module: hr_timesheet
#: constraint:project.task:0
msgid "Circular references are not permitted between tasks and sub-tasks"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
msgid "Click to record activities."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_hr_timesheet_report_company_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_report_search
msgid "Company"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_delay_hours
msgid ""
"Computed as difference between planned hours by the project manager and the "
"total hours of the task."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours
msgid "Computed as: Time Spent + Remaining Time."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_effective_hours
msgid "Computed using the sum of the task work done."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_hr_timesheet_report_cost
msgid "Cost"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_hr_timesheet_report_date
msgid "Date"
msgstr "Date"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.action_define_analytic_structure
msgid "Define your Analytic Structure"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_delay_hours
msgid "Delay Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_working_hours
msgid "Detailed Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_hr_timesheet_report_display_name
msgid "Display Name"
msgstr "Display Name"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Duration"
msgstr "Duration"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_effective
msgid "Effective Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_report_search
msgid "Extended Filters..."
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_report_search
msgid "Group By"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_report_search
msgid "Group by month of date"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_effective_hours
msgid "Hours Spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_hr_timesheet_report_id
msgid "ID"
msgstr "ID"
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_progress
msgid ""
"If the task has a progress of 99.99% you should close the task if it's "
"finished or reevaluate the time"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_hr_timesheet_report___last_update
msgid "Last Modified on"
msgstr "Last Modified on"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_report_search
msgid "Month"
msgstr "Month"
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_time_tracking
msgid "My Timesheet"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_parent_id
msgid "Parent Task"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_planned
msgid "Planned Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_hr_timesheet_report_product_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Product"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_progress
msgid "Progress"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_project
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_project_id
#: model:ir.model.fields,field_description:hr_timesheet.field_hr_timesheet_report_project_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Project"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_remaining_hours
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Remaining Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_kanban_inherited_progress
msgid "Remaining hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports
msgid "Reports"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Spent Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_project_subtask_project_id
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_subtask_project_id
msgid "Sub-task Project"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_subtask_count
msgid "Sub-task count"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_project_task_sub_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Sub-tasks"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_children_hours
msgid "Sub-tasks Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_children_hours
msgid ""
"Sum of the planned hours of all sub-tasks (when a sub-task is closed or its "
"spent hours exceed its planned hours, spent hours are counted instead)"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_task
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_task_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Task"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_report_project_task_user
msgid "Tasks by user and project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_report_search
msgid "This Month"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_hr_timesheet_report_quantity
msgid "Time"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_hr_timesheet_report
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_report_graph
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_report_pivot
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_report_search
msgid "Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheet Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.action_hr_timesheet_report_stat_all
#: model:ir.actions.act_window,name:hr_timesheet.action_hr_timesheet_report_stat_filtered
msgid "Timesheet Analysis"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet by Month"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_timesheet_ids
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_timesheet_report_all
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_root
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours
msgid "Total"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_total_hours
msgid "Total Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Total time"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_hr_timesheet_report_user_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_report_search
msgid "User"
msgstr "User"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Users"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_progress
msgid "Working Time Progress (%)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
msgid ""
"You can register and track your workings hours by project every\n"
" day. Every time spent on a project will become a cost and "
"can be re-invoiced to\n"
" customers if required."
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.action_define_analytic_structure
msgid ""
"You should create an analytic account structure depending on your needs to "
"analyse costs and revenues. In Odoo, analytic accounts are also used to "
"track customer contracts."
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_account_analytic_line
msgid "account analytic line"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_report_search
msgid "month"
msgstr ""

View file

@ -1,443 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-16 08:08+0000\n"
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: English (United Kingdom) (https://www.transifex.com/odoo/teams/41243/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: en_GB\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
msgid "<span class=\"o_label\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
msgid "<span class=\"o_stat_text\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<span>Timesheet Entries</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_kanban_account_analytic_line
msgid "<strong>Duration: </strong>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<strong>Total</strong>"
msgstr "<strong>Total</strong>"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line_by_project
msgid "Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_all
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_all
msgid "All Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_project_allow_timesheets
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
msgid "Allow timesheets"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_form
msgid "Analytic Entry"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_account_analytic_line
msgid "Analytic Line"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Apple App Store"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_delay
msgid "Avg. Plan.-Eff."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_synchro
msgid "Awesome Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_report
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_activity_analysis
msgid "By Employee"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_project
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_project
msgid "By Project"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_task
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_task
msgid "By Task"
msgstr ""
#. module: hr_timesheet
#: constraint:project.task:0
msgid "Circular references are not permitted between tasks and sub-tasks"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid "Click to record activities."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_delay_hours
msgid ""
"Computed as difference between planned hours by the project manager and the "
"total hours of the task."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours
msgid "Computed as: Time Spent + Remaining Time."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours_spent
msgid "Computed as: Time Spent + Sub-tasks Hours."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_effective_hours
msgid "Computed using the sum of the task work done."
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_menu_configuration
msgid "Configuration"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Date"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_delay_hours
msgid "Delay Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_department_id
msgid "Department"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Description"
msgstr "Description"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Duration"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_effective
msgid "Effective Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_employee_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Employee"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Chrome Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Play Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Group By"
msgstr "Group By"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_effective_hours
msgid "Hours Spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_holidays
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Leaves"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_timesheet_manager
msgid "Manager"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_mine
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "My Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_planned
msgid "Planned Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_progress
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_progress
msgid "Progress"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_project
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_project_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Project -"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_remaining_hours
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Remaining Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_kanban_inherited_progress
msgid "Remaining hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports
msgid "Reporting"
msgstr "Reporting"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Responsible"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid ""
"Sell services (e.g. project, maintenance), record time spent using "
"Timesheets app and invoice them based on a fixed price (ordered quantity) or"
" on the time spent (delivered quantity)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Sell services and invoice time spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.hr_timesheet_config_settings_action
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_config_settings_menu_action
msgid "Settings"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Spent Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_children_hours
msgid "Sub-tasks Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_children_hours
msgid ""
"Sum of the planned hours of all sub-tasks (when a sub-task is closed or its "
"spent hours exceed its planned hours, spent hours are counted instead)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Synchronize time spent with web/mobile app"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_task
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_task_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Task"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_report_project_task_user
msgid "Tasks by user and project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Week"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Time"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Time (Hours)"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_sale_timesheet
msgid "Time Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_time_tracking
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_line_pivot
msgid "Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheet Activities"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Timesheet Apps"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.project_task_action_view_timesheet
#: model:ir.actions.report,name:hr_timesheet.timesheet_report
msgid "Timesheet Entries"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet by Month"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_from_employee
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_timesheet_ids
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_root
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.timesheet_view_calendar
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours
msgid "Total"
msgstr "Total"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours_spent
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_total_hours
msgid "Total Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Total time"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_hr_timesheet_user
msgid "User"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Validated leaves create timesheets automatically."
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid ""
"You can register and track your workings hours by project every\n"
" day. Every time spent on a project will become a cost and can be re-invoiced to\n"
" customers if required."
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_res_config_settings
msgid "res.config.settings"
msgstr ""

File diff suppressed because it is too large Load diff

View file

@ -1,443 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-16 08:08+0000\n"
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: Spanish (Bolivia) (https://www.transifex.com/odoo/teams/41243/es_BO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es_BO\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
msgid "<span class=\"o_label\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
msgid "<span class=\"o_stat_text\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<span>Timesheet Entries</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_kanban_account_analytic_line
msgid "<strong>Duration: </strong>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<strong>Total</strong>"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line_by_project
msgid "Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_all
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_all
msgid "All Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_project_allow_timesheets
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
msgid "Allow timesheets"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_form
msgid "Analytic Entry"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_account_analytic_line
msgid "Analytic Line"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Apple App Store"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_delay
msgid "Avg. Plan.-Eff."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_synchro
msgid "Awesome Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_report
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_activity_analysis
msgid "By Employee"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_project
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_project
msgid "By Project"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_task
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_task
msgid "By Task"
msgstr ""
#. module: hr_timesheet
#: constraint:project.task:0
msgid "Circular references are not permitted between tasks and sub-tasks"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid "Click to record activities."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_delay_hours
msgid ""
"Computed as difference between planned hours by the project manager and the "
"total hours of the task."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours
msgid "Computed as: Time Spent + Remaining Time."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours_spent
msgid "Computed as: Time Spent + Sub-tasks Hours."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_effective_hours
msgid "Computed using the sum of the task work done."
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_menu_configuration
msgid "Configuration"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Date"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_delay_hours
msgid "Delay Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_department_id
msgid "Department"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Description"
msgstr "Descripción"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Duration"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_effective
msgid "Effective Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_employee_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Employee"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Chrome Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Play Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Group By"
msgstr "Agrupar por"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_effective_hours
msgid "Hours Spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_holidays
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Leaves"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_timesheet_manager
msgid "Manager"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_mine
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "My Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_planned
msgid "Planned Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_progress
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_progress
msgid "Progress"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_project
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_project_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Project -"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_remaining_hours
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Remaining Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_kanban_inherited_progress
msgid "Remaining hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports
msgid "Reporting"
msgstr "Informe"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Responsible"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid ""
"Sell services (e.g. project, maintenance), record time spent using "
"Timesheets app and invoice them based on a fixed price (ordered quantity) or"
" on the time spent (delivered quantity)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Sell services and invoice time spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.hr_timesheet_config_settings_action
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_config_settings_menu_action
msgid "Settings"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Spent Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_children_hours
msgid "Sub-tasks Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_children_hours
msgid ""
"Sum of the planned hours of all sub-tasks (when a sub-task is closed or its "
"spent hours exceed its planned hours, spent hours are counted instead)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Synchronize time spent with web/mobile app"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_task
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_task_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Task"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_report_project_task_user
msgid "Tasks by user and project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Week"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Time"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Time (Hours)"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_sale_timesheet
msgid "Time Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_time_tracking
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_line_pivot
msgid "Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheet Activities"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Timesheet Apps"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.project_task_action_view_timesheet
#: model:ir.actions.report,name:hr_timesheet.timesheet_report
msgid "Timesheet Entries"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet by Month"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_from_employee
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_timesheet_ids
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_root
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.timesheet_view_calendar
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours
msgid "Total"
msgstr "Total"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours_spent
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_total_hours
msgid "Total Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Total time"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_hr_timesheet_user
msgid "User"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Validated leaves create timesheets automatically."
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid ""
"You can register and track your workings hours by project every\n"
" day. Every time spent on a project will become a cost and can be re-invoiced to\n"
" customers if required."
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_res_config_settings
msgid "res.config.settings"
msgstr ""

File diff suppressed because it is too large Load diff

View file

@ -1,443 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-16 08:08+0000\n"
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: Spanish (Colombia) (https://www.transifex.com/odoo/teams/41243/es_CO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es_CO\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
msgid "<span class=\"o_label\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
msgid "<span class=\"o_stat_text\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<span>Timesheet Entries</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_kanban_account_analytic_line
msgid "<strong>Duration: </strong>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<strong>Total</strong>"
msgstr "<strong>Total</strong>"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line_by_project
msgid "Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_all
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_all
msgid "All Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_project_allow_timesheets
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
msgid "Allow timesheets"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_form
msgid "Analytic Entry"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_account_analytic_line
msgid "Analytic Line"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Apple App Store"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_delay
msgid "Avg. Plan.-Eff."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_synchro
msgid "Awesome Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_report
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_activity_analysis
msgid "By Employee"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_project
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_project
msgid "By Project"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_task
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_task
msgid "By Task"
msgstr ""
#. module: hr_timesheet
#: constraint:project.task:0
msgid "Circular references are not permitted between tasks and sub-tasks"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid "Click to record activities."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_delay_hours
msgid ""
"Computed as difference between planned hours by the project manager and the "
"total hours of the task."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours
msgid "Computed as: Time Spent + Remaining Time."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours_spent
msgid "Computed as: Time Spent + Sub-tasks Hours."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_effective_hours
msgid "Computed using the sum of the task work done."
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_menu_configuration
msgid "Configuration"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Date"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_delay_hours
msgid "Delay Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_department_id
msgid "Department"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Description"
msgstr "Descripción"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Duration"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_effective
msgid "Effective Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_employee_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Employee"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Chrome Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Play Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Group By"
msgstr "Agrupar por"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_effective_hours
msgid "Hours Spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_holidays
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Leaves"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_timesheet_manager
msgid "Manager"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_mine
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "My Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_planned
msgid "Planned Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_progress
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_progress
msgid "Progress"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_project
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_project_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Project -"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_remaining_hours
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Remaining Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_kanban_inherited_progress
msgid "Remaining hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports
msgid "Reporting"
msgstr "Informes"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Responsible"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid ""
"Sell services (e.g. project, maintenance), record time spent using "
"Timesheets app and invoice them based on a fixed price (ordered quantity) or"
" on the time spent (delivered quantity)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Sell services and invoice time spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.hr_timesheet_config_settings_action
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_config_settings_menu_action
msgid "Settings"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Spent Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_children_hours
msgid "Sub-tasks Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_children_hours
msgid ""
"Sum of the planned hours of all sub-tasks (when a sub-task is closed or its "
"spent hours exceed its planned hours, spent hours are counted instead)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Synchronize time spent with web/mobile app"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_task
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_task_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Task"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_report_project_task_user
msgid "Tasks by user and project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Week"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Time"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Time (Hours)"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_sale_timesheet
msgid "Time Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_time_tracking
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_line_pivot
msgid "Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheet Activities"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Timesheet Apps"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.project_task_action_view_timesheet
#: model:ir.actions.report,name:hr_timesheet.timesheet_report
msgid "Timesheet Entries"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet by Month"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_from_employee
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_timesheet_ids
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_root
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.timesheet_view_calendar
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours
msgid "Total"
msgstr "Total"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours_spent
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_total_hours
msgid "Total Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Total time"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_hr_timesheet_user
msgid "User"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Validated leaves create timesheets automatically."
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid ""
"You can register and track your workings hours by project every\n"
" day. Every time spent on a project will become a cost and can be re-invoiced to\n"
" customers if required."
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_res_config_settings
msgid "res.config.settings"
msgstr ""

View file

@ -1,443 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-16 08:08+0000\n"
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: Spanish (Costa Rica) (https://www.transifex.com/odoo/teams/41243/es_CR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es_CR\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
msgid "<span class=\"o_label\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
msgid "<span class=\"o_stat_text\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<span>Timesheet Entries</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_kanban_account_analytic_line
msgid "<strong>Duration: </strong>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<strong>Total</strong>"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line_by_project
msgid "Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_all
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_all
msgid "All Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_project_allow_timesheets
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
msgid "Allow timesheets"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_form
msgid "Analytic Entry"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_account_analytic_line
msgid "Analytic Line"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Apple App Store"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_delay
msgid "Avg. Plan.-Eff."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_synchro
msgid "Awesome Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_report
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_activity_analysis
msgid "By Employee"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_project
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_project
msgid "By Project"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_task
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_task
msgid "By Task"
msgstr ""
#. module: hr_timesheet
#: constraint:project.task:0
msgid "Circular references are not permitted between tasks and sub-tasks"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid "Click to record activities."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_delay_hours
msgid ""
"Computed as difference between planned hours by the project manager and the "
"total hours of the task."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours
msgid "Computed as: Time Spent + Remaining Time."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours_spent
msgid "Computed as: Time Spent + Sub-tasks Hours."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_effective_hours
msgid "Computed using the sum of the task work done."
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_menu_configuration
msgid "Configuration"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Date"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_delay_hours
msgid "Delay Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_department_id
msgid "Department"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Description"
msgstr "Descripción"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Duration"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_effective
msgid "Effective Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_employee_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Employee"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Chrome Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Play Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Group By"
msgstr "Agrupar por"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_effective_hours
msgid "Hours Spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_holidays
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Leaves"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_timesheet_manager
msgid "Manager"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_mine
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "My Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_planned
msgid "Planned Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_progress
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_progress
msgid "Progress"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_project
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_project_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Project -"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_remaining_hours
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Remaining Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_kanban_inherited_progress
msgid "Remaining hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports
msgid "Reporting"
msgstr "Informes"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Responsible"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid ""
"Sell services (e.g. project, maintenance), record time spent using "
"Timesheets app and invoice them based on a fixed price (ordered quantity) or"
" on the time spent (delivered quantity)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Sell services and invoice time spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.hr_timesheet_config_settings_action
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_config_settings_menu_action
msgid "Settings"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Spent Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_children_hours
msgid "Sub-tasks Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_children_hours
msgid ""
"Sum of the planned hours of all sub-tasks (when a sub-task is closed or its "
"spent hours exceed its planned hours, spent hours are counted instead)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Synchronize time spent with web/mobile app"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_task
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_task_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Task"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_report_project_task_user
msgid "Tasks by user and project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Week"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Time"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Time (Hours)"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_sale_timesheet
msgid "Time Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_time_tracking
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_line_pivot
msgid "Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheet Activities"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Timesheet Apps"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.project_task_action_view_timesheet
#: model:ir.actions.report,name:hr_timesheet.timesheet_report
msgid "Timesheet Entries"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet by Month"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_from_employee
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_timesheet_ids
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_root
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.timesheet_view_calendar
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours
msgid "Total"
msgstr "Total"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours_spent
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_total_hours
msgid "Total Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Total time"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_hr_timesheet_user
msgid "User"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Validated leaves create timesheets automatically."
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid ""
"You can register and track your workings hours by project every\n"
" day. Every time spent on a project will become a cost and can be re-invoiced to\n"
" customers if required."
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_res_config_settings
msgid "res.config.settings"
msgstr ""

View file

@ -1,443 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-16 08:08+0000\n"
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: Spanish (Dominican Republic) (https://www.transifex.com/odoo/teams/41243/es_DO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es_DO\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
msgid "<span class=\"o_label\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
msgid "<span class=\"o_stat_text\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<span>Timesheet Entries</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_kanban_account_analytic_line
msgid "<strong>Duration: </strong>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<strong>Total</strong>"
msgstr "<strong>Total</strong>"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line_by_project
msgid "Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_all
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_all
msgid "All Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_project_allow_timesheets
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
msgid "Allow timesheets"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_form
msgid "Analytic Entry"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_account_analytic_line
msgid "Analytic Line"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Apple App Store"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_delay
msgid "Avg. Plan.-Eff."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_synchro
msgid "Awesome Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_report
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_activity_analysis
msgid "By Employee"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_project
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_project
msgid "By Project"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_task
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_task
msgid "By Task"
msgstr ""
#. module: hr_timesheet
#: constraint:project.task:0
msgid "Circular references are not permitted between tasks and sub-tasks"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid "Click to record activities."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_delay_hours
msgid ""
"Computed as difference between planned hours by the project manager and the "
"total hours of the task."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours
msgid "Computed as: Time Spent + Remaining Time."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours_spent
msgid "Computed as: Time Spent + Sub-tasks Hours."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_effective_hours
msgid "Computed using the sum of the task work done."
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_menu_configuration
msgid "Configuration"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Date"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_delay_hours
msgid "Delay Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_department_id
msgid "Department"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Description"
msgstr "Descripción"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Duration"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_effective
msgid "Effective Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_employee_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Employee"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Chrome Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Play Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Group By"
msgstr "Agrupar por"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_effective_hours
msgid "Hours Spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_holidays
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Leaves"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_timesheet_manager
msgid "Manager"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_mine
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "My Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_planned
msgid "Planned Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_progress
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_progress
msgid "Progress"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_project
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_project_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Project -"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_remaining_hours
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Remaining Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_kanban_inherited_progress
msgid "Remaining hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports
msgid "Reporting"
msgstr "Informes"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Responsible"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid ""
"Sell services (e.g. project, maintenance), record time spent using "
"Timesheets app and invoice them based on a fixed price (ordered quantity) or"
" on the time spent (delivered quantity)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Sell services and invoice time spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.hr_timesheet_config_settings_action
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_config_settings_menu_action
msgid "Settings"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Spent Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_children_hours
msgid "Sub-tasks Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_children_hours
msgid ""
"Sum of the planned hours of all sub-tasks (when a sub-task is closed or its "
"spent hours exceed its planned hours, spent hours are counted instead)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Synchronize time spent with web/mobile app"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_task
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_task_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Task"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_report_project_task_user
msgid "Tasks by user and project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Week"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Time"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Time (Hours)"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_sale_timesheet
msgid "Time Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_time_tracking
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_line_pivot
msgid "Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheet Activities"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Timesheet Apps"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.project_task_action_view_timesheet
#: model:ir.actions.report,name:hr_timesheet.timesheet_report
msgid "Timesheet Entries"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet by Month"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_from_employee
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_timesheet_ids
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_root
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.timesheet_view_calendar
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours
msgid "Total"
msgstr "Total"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours_spent
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_total_hours
msgid "Total Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Total time"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_hr_timesheet_user
msgid "User"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Validated leaves create timesheets automatically."
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid ""
"You can register and track your workings hours by project every\n"
" day. Every time spent on a project will become a cost and can be re-invoiced to\n"
" customers if required."
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_res_config_settings
msgid "res.config.settings"
msgstr ""

View file

@ -1,443 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-16 08:08+0000\n"
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: Spanish (Ecuador) (https://www.transifex.com/odoo/teams/41243/es_EC/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es_EC\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
msgid "<span class=\"o_label\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
msgid "<span class=\"o_stat_text\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<span>Timesheet Entries</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_kanban_account_analytic_line
msgid "<strong>Duration: </strong>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<strong>Total</strong>"
msgstr "<strong>Total</strong>"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line_by_project
msgid "Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_all
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_all
msgid "All Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_project_allow_timesheets
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
msgid "Allow timesheets"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_form
msgid "Analytic Entry"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_account_analytic_line
msgid "Analytic Line"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Apple App Store"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_delay
msgid "Avg. Plan.-Eff."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_synchro
msgid "Awesome Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_report
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_activity_analysis
msgid "By Employee"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_project
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_project
msgid "By Project"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_task
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_task
msgid "By Task"
msgstr ""
#. module: hr_timesheet
#: constraint:project.task:0
msgid "Circular references are not permitted between tasks and sub-tasks"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid "Click to record activities."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_delay_hours
msgid ""
"Computed as difference between planned hours by the project manager and the "
"total hours of the task."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours
msgid "Computed as: Time Spent + Remaining Time."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours_spent
msgid "Computed as: Time Spent + Sub-tasks Hours."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_effective_hours
msgid "Computed using the sum of the task work done."
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_menu_configuration
msgid "Configuration"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Date"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_delay_hours
msgid "Delay Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_department_id
msgid "Department"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Description"
msgstr "Descripción"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Duration"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_effective
msgid "Effective Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_employee_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Employee"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Chrome Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Play Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Group By"
msgstr "Agrupar por"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_effective_hours
msgid "Hours Spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_holidays
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Leaves"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_timesheet_manager
msgid "Manager"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_mine
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "My Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_planned
msgid "Planned Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_progress
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_progress
msgid "Progress"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_project
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_project_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Project -"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_remaining_hours
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Remaining Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_kanban_inherited_progress
msgid "Remaining hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports
msgid "Reporting"
msgstr "Informe"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Responsible"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid ""
"Sell services (e.g. project, maintenance), record time spent using "
"Timesheets app and invoice them based on a fixed price (ordered quantity) or"
" on the time spent (delivered quantity)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Sell services and invoice time spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.hr_timesheet_config_settings_action
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_config_settings_menu_action
msgid "Settings"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Spent Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_children_hours
msgid "Sub-tasks Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_children_hours
msgid ""
"Sum of the planned hours of all sub-tasks (when a sub-task is closed or its "
"spent hours exceed its planned hours, spent hours are counted instead)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Synchronize time spent with web/mobile app"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_task
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_task_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Task"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_report_project_task_user
msgid "Tasks by user and project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Week"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Time"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Time (Hours)"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_sale_timesheet
msgid "Time Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_time_tracking
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_line_pivot
msgid "Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheet Activities"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Timesheet Apps"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.project_task_action_view_timesheet
#: model:ir.actions.report,name:hr_timesheet.timesheet_report
msgid "Timesheet Entries"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet by Month"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_from_employee
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_timesheet_ids
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_root
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.timesheet_view_calendar
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours
msgid "Total"
msgstr "Total"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours_spent
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_total_hours
msgid "Total Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Total time"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_hr_timesheet_user
msgid "User"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Validated leaves create timesheets automatically."
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid ""
"You can register and track your workings hours by project every\n"
" day. Every time spent on a project will become a cost and can be re-invoiced to\n"
" customers if required."
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_res_config_settings
msgid "res.config.settings"
msgstr ""

View file

@ -1,443 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-16 08:08+0000\n"
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: Spanish (Peru) (https://www.transifex.com/odoo/teams/41243/es_PE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es_PE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
msgid "<span class=\"o_label\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
msgid "<span class=\"o_stat_text\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<span>Timesheet Entries</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_kanban_account_analytic_line
msgid "<strong>Duration: </strong>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<strong>Total</strong>"
msgstr "Total"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line_by_project
msgid "Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_all
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_all
msgid "All Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_project_allow_timesheets
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
msgid "Allow timesheets"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_form
msgid "Analytic Entry"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_account_analytic_line
msgid "Analytic Line"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Apple App Store"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_delay
msgid "Avg. Plan.-Eff."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_synchro
msgid "Awesome Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_report
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_activity_analysis
msgid "By Employee"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_project
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_project
msgid "By Project"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_task
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_task
msgid "By Task"
msgstr ""
#. module: hr_timesheet
#: constraint:project.task:0
msgid "Circular references are not permitted between tasks and sub-tasks"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid "Click to record activities."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_delay_hours
msgid ""
"Computed as difference between planned hours by the project manager and the "
"total hours of the task."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours
msgid "Computed as: Time Spent + Remaining Time."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours_spent
msgid "Computed as: Time Spent + Sub-tasks Hours."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_effective_hours
msgid "Computed using the sum of the task work done."
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_menu_configuration
msgid "Configuration"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Date"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_delay_hours
msgid "Delay Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_department_id
msgid "Department"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Description"
msgstr "Descripción"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Duration"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_effective
msgid "Effective Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_employee_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Employee"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Chrome Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Play Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Group By"
msgstr "Agrupado por"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_effective_hours
msgid "Hours Spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_holidays
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Leaves"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_timesheet_manager
msgid "Manager"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_mine
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "My Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_planned
msgid "Planned Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_progress
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_progress
msgid "Progress"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_project
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_project_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Project -"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_remaining_hours
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Remaining Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_kanban_inherited_progress
msgid "Remaining hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports
msgid "Reporting"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Responsible"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid ""
"Sell services (e.g. project, maintenance), record time spent using "
"Timesheets app and invoice them based on a fixed price (ordered quantity) or"
" on the time spent (delivered quantity)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Sell services and invoice time spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.hr_timesheet_config_settings_action
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_config_settings_menu_action
msgid "Settings"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Spent Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_children_hours
msgid "Sub-tasks Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_children_hours
msgid ""
"Sum of the planned hours of all sub-tasks (when a sub-task is closed or its "
"spent hours exceed its planned hours, spent hours are counted instead)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Synchronize time spent with web/mobile app"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_task
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_task_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Task"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_report_project_task_user
msgid "Tasks by user and project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Week"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Time"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Time (Hours)"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_sale_timesheet
msgid "Time Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_time_tracking
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_line_pivot
msgid "Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheet Activities"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Timesheet Apps"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.project_task_action_view_timesheet
#: model:ir.actions.report,name:hr_timesheet.timesheet_report
msgid "Timesheet Entries"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet by Month"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_from_employee
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_timesheet_ids
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_root
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.timesheet_view_calendar
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours
msgid "Total"
msgstr "Total"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours_spent
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_total_hours
msgid "Total Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Total time"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_hr_timesheet_user
msgid "User"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Validated leaves create timesheets automatically."
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid ""
"You can register and track your workings hours by project every\n"
" day. Every time spent on a project will become a cost and can be re-invoiced to\n"
" customers if required."
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_res_config_settings
msgid "res.config.settings"
msgstr ""

View file

@ -1,443 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-16 08:08+0000\n"
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: Spanish (Paraguay) (https://www.transifex.com/odoo/teams/41243/es_PY/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es_PY\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
msgid "<span class=\"o_label\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
msgid "<span class=\"o_stat_text\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<span>Timesheet Entries</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_kanban_account_analytic_line
msgid "<strong>Duration: </strong>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<strong>Total</strong>"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line_by_project
msgid "Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_all
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_all
msgid "All Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_project_allow_timesheets
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
msgid "Allow timesheets"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_form
msgid "Analytic Entry"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_account_analytic_line
msgid "Analytic Line"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Apple App Store"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_delay
msgid "Avg. Plan.-Eff."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_synchro
msgid "Awesome Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_report
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_activity_analysis
msgid "By Employee"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_project
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_project
msgid "By Project"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_task
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_task
msgid "By Task"
msgstr ""
#. module: hr_timesheet
#: constraint:project.task:0
msgid "Circular references are not permitted between tasks and sub-tasks"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid "Click to record activities."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_delay_hours
msgid ""
"Computed as difference between planned hours by the project manager and the "
"total hours of the task."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours
msgid "Computed as: Time Spent + Remaining Time."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours_spent
msgid "Computed as: Time Spent + Sub-tasks Hours."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_effective_hours
msgid "Computed using the sum of the task work done."
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_menu_configuration
msgid "Configuration"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Date"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_delay_hours
msgid "Delay Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_department_id
msgid "Department"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Description"
msgstr "Descripción"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Duration"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_effective
msgid "Effective Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_employee_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Employee"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Chrome Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Play Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Group By"
msgstr "Agrupado por"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_effective_hours
msgid "Hours Spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_holidays
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Leaves"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_timesheet_manager
msgid "Manager"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_mine
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "My Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_planned
msgid "Planned Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_progress
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_progress
msgid "Progress"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_project
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_project_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Project -"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_remaining_hours
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Remaining Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_kanban_inherited_progress
msgid "Remaining hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports
msgid "Reporting"
msgstr "Informe"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Responsible"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid ""
"Sell services (e.g. project, maintenance), record time spent using "
"Timesheets app and invoice them based on a fixed price (ordered quantity) or"
" on the time spent (delivered quantity)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Sell services and invoice time spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.hr_timesheet_config_settings_action
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_config_settings_menu_action
msgid "Settings"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Spent Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_children_hours
msgid "Sub-tasks Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_children_hours
msgid ""
"Sum of the planned hours of all sub-tasks (when a sub-task is closed or its "
"spent hours exceed its planned hours, spent hours are counted instead)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Synchronize time spent with web/mobile app"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_task
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_task_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Task"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_report_project_task_user
msgid "Tasks by user and project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Week"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Time"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Time (Hours)"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_sale_timesheet
msgid "Time Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_time_tracking
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_line_pivot
msgid "Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheet Activities"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Timesheet Apps"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.project_task_action_view_timesheet
#: model:ir.actions.report,name:hr_timesheet.timesheet_report
msgid "Timesheet Entries"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet by Month"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_from_employee
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_timesheet_ids
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_root
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.timesheet_view_calendar
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours
msgid "Total"
msgstr "Total"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours_spent
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_total_hours
msgid "Total Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Total time"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_hr_timesheet_user
msgid "User"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Validated leaves create timesheets automatically."
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid ""
"You can register and track your workings hours by project every\n"
" day. Every time spent on a project will become a cost and can be re-invoiced to\n"
" customers if required."
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_res_config_settings
msgid "res.config.settings"
msgstr ""

View file

@ -1,443 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_timesheet
#
# Translators:
# Martin Trigaux <mat@odoo.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-16 08:08+0000\n"
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
"Last-Translator: Martin Trigaux <mat@odoo.com>, 2017\n"
"Language-Team: Spanish (Venezuela) (https://www.transifex.com/odoo/teams/41243/es_VE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es_VE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
msgid "<span class=\"o_label\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
msgid "<span class=\"o_stat_text\">Timesheets</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<span>Timesheet Entries</span>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_kanban_account_analytic_line
msgid "<strong>Duration: </strong>"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "<strong>Total</strong>"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line_by_project
msgid "Activities"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_all
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_all
msgid "All Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_project_allow_timesheets
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
msgid "Allow timesheets"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_form
msgid "Analytic Entry"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_account_analytic_line
msgid "Analytic Line"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Apple App Store"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_delay
msgid "Avg. Plan.-Eff."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_synchro
msgid "Awesome Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_report
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_activity_analysis
msgid "By Employee"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_project
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_project
msgid "By Project"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_report_by_task
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_report_timesheet_by_task
msgid "By Task"
msgstr ""
#. module: hr_timesheet
#: constraint:project.task:0
msgid "Circular references are not permitted between tasks and sub-tasks"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid "Click to record activities."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_delay_hours
msgid ""
"Computed as difference between planned hours by the project manager and the "
"total hours of the task."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours
msgid "Computed as: Time Spent + Remaining Time."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_total_hours_spent
msgid "Computed as: Time Spent + Sub-tasks Hours."
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_effective_hours
msgid "Computed using the sum of the task work done."
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_menu_configuration
msgid "Configuration"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Date"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_delay_hours
msgid "Delay Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_department_id
msgid "Department"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Description"
msgstr "Descripción"
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Duration"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_effective
msgid "Effective Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_employee_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Employee"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Chrome Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Google Play Store"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Group By"
msgstr "Agrupar por"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_effective_hours
msgid "Hours Spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_project_timesheet_holidays
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Leaves"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_timesheet_manager
msgid "Manager"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_activity_mine
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "My Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_hours_planned
msgid "Planned Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_progress
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_progress
msgid "Progress"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_project
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_project_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Project -"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_remaining_hours
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Remaining Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_kanban_inherited_progress
msgid "Remaining hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports
msgid "Reporting"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.portal_my_task
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Responsible"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid ""
"Sell services (e.g. project, maintenance), record time spent using "
"Timesheets app and invoice them based on a fixed price (ordered quantity) or"
" on the time spent (delivered quantity)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Sell services and invoice time spent"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.hr_timesheet_config_settings_action
#: model:ir.ui.menu,name:hr_timesheet.hr_timesheet_config_settings_menu_action
msgid "Settings"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_tree2_inherited
msgid "Spent Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_children_hours
msgid "Sub-tasks Hours"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,help:hr_timesheet.field_project_task_children_hours
msgid ""
"Sum of the planned hours of all sub-tasks (when a sub-task is closed or its "
"spent hours exceed its planned hours, spent hours are counted instead)"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Synchronize time spent with web/mobile app"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_project_task
#: model:ir.model.fields,field_description:hr_timesheet.field_account_analytic_line_task_id
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Task"
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_report_project_task_user
msgid "Tasks by user and project"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "This Week"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.report_timesheet
msgid "Time"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Time (Hours)"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_res_config_settings_module_sale_timesheet
msgid "Time Billing"
msgstr ""
#. module: hr_timesheet
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_time_tracking
#: model:ir.ui.menu,name:hr_timesheet.menu_timesheets_reports_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_hr_timesheet_line_pivot
msgid "Timesheet"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheet Activities"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Timesheet Apps"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.project_task_action_view_timesheet
#: model:ir.actions.report,name:hr_timesheet.timesheet_report
msgid "Timesheet Entries"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet Month"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_search
msgid "Timesheet by Month"
msgstr ""
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.timesheet_action_from_employee
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_timesheet_ids
#: model:ir.ui.menu,name:hr_timesheet.timesheet_menu_root
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_department_view_kanban
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_employee_view_form_inherit_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.project_invoice_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_timesheet.timesheet_view_calendar
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_project_kanban_inherited
#: model_terms:ir.ui.view,arch_db:hr_timesheet.view_task_form2_inherited
msgid "Timesheets"
msgstr ""
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours
msgid "Total"
msgstr "Total"
#. module: hr_timesheet
#: model:ir.model.fields,field_description:hr_timesheet.field_project_task_total_hours_spent
#: model:ir.model.fields,field_description:hr_timesheet.field_report_project_task_user_total_hours
msgid "Total Hours"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.hr_timesheet_line_tree
msgid "Total time"
msgstr ""
#. module: hr_timesheet
#: model:res.groups,name:hr_timesheet.group_hr_timesheet_user
msgid "User"
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.ui.view,arch_db:hr_timesheet.res_config_settings_view_form
msgid "Validated leaves create timesheets automatically."
msgstr ""
#. module: hr_timesheet
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_report
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_project
#: model_terms:ir.actions.act_window,help:hr_timesheet.timesheet_action_report_by_task
msgid ""
"You can register and track your workings hours by project every\n"
" day. Every time spent on a project will become a cost and can be re-invoiced to\n"
" customers if required."
msgstr ""
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_res_config_settings
msgid "res.config.settings"
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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,11 +1,16 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import account_analytic_line_calendar_employee
from . import analytic_applicability
from . import hr_employee
from . import hr_employee_public
from . import hr_timesheet
from . import ir_http
from . import ir_ui_menu
from . import res_company
from . import res_config_settings
from . import project
from . import project_project
from . import project_task
from . import project_update
from . import project_collaborator
from . import uom
from . import uom_uom

View file

@ -0,0 +1,12 @@
from odoo import fields, models
class AccountAnalyticLineCalendarEmployee(models.Model):
_name = 'account.analytic.line.calendar.employee'
_description = 'Personal Filters on Employees for the Calendar view'
user_id = fields.Many2one('res.users', required=True, default=lambda self: self.env.user, ondelete='cascade', export_string_translation=False)
employee_id = fields.Many2one('hr.employee', export_string_translation=False)
checked = fields.Boolean(default=True, export_string_translation=False)
active = fields.Boolean(default=True, export_string_translation=False)

View file

@ -0,0 +1,15 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class AccountAnalyticApplicability(models.Model):
_inherit = 'account.analytic.applicability'
_description = "Analytic Plan's Applicabilities"
business_domain = fields.Selection(
selection_add=[
('timesheet', 'Timesheet'),
],
ondelete={'timesheet': 'cascade'},
)

View file

@ -0,0 +1,75 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from ast import literal_eval
from odoo import api, models, fields, _
from odoo.exceptions import UserError
from odoo.tools import SQL
class HrEmployee(models.Model):
_inherit = 'hr.employee'
has_timesheet = fields.Boolean(compute='_compute_has_timesheet', export_string_translation=False)
def _compute_has_timesheet(self):
if self.ids:
result = dict(self.env.execute_query(SQL(
""" SELECT id, EXISTS(
SELECT 1 FROM account_analytic_line
WHERE project_id IS NOT NULL AND employee_id = e.id
LIMIT 1)
FROM hr_employee e
WHERE id in %s """,
tuple(self.ids),
)))
else:
result = {}
for employee in self:
employee.has_timesheet = result.get(employee._origin.id, False)
@api.depends('company_id', 'user_id')
@api.depends_context('allowed_company_ids')
def _compute_display_name(self):
super()._compute_display_name()
allowed_company_ids = self.env.context.get('allowed_company_ids', [])
if len(allowed_company_ids) <= 1:
return
employees_count_per_user = {
user.id: count
for user, count in self.env['hr.employee'].sudo()._read_group(
[('user_id', 'in', self.user_id.ids), ('company_id', 'in', allowed_company_ids)],
['user_id'],
['__count'],
)
}
for employee in self:
if employees_count_per_user.get(employee.user_id.id, 0) > 1:
employee.display_name = f'{employee.display_name} - {employee.company_id.name}'
def action_unlink_wizard(self):
wizard = self.env['hr.employee.delete.wizard'].create({
'employee_ids': self.ids,
})
if not self.env.user.has_group('hr_timesheet.group_hr_timesheet_approver') and wizard.has_timesheet and not wizard.has_active_employee:
raise UserError(_('You cannot delete employees who have timesheets.'))
return {
'name': _('Confirmation'),
'view_mode': 'form',
'res_model': 'hr.employee.delete.wizard',
'views': [(self.env.ref('hr_timesheet.hr_employee_delete_wizard_form').id, 'form')],
'type': 'ir.actions.act_window',
'res_id': wizard.id,
'target': 'new',
'context': self.env.context,
}
def action_timesheet_from_employee(self):
action = self.env["ir.actions.act_window"]._for_xml_id("hr_timesheet.timesheet_action_from_employee")
context = literal_eval(action['context'].replace('active_id', str(self.id)))
context['create'] = context.get('create', True) and self.active
action['context'] = context
return action

View file

@ -0,0 +1,14 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class HrEmployeePublic(models.Model):
_inherit = 'hr.employee.public'
has_timesheet = fields.Boolean(related='employee_id.has_timesheet')
def action_timesheet_from_employee(self):
self.ensure_one()
if self.is_user:
return self.employee_id.action_timesheet_from_employee()

View file

@ -1,13 +1,17 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from lxml import etree
from datetime import datetime, time
from statistics import mode
import re
from odoo import api, Command, fields, models, _, _lt
import pytz
from odoo import api, fields, models
from odoo.exceptions import UserError, AccessError, ValidationError
from odoo.osv import expression
from odoo.fields import Domain
from odoo.tools.translate import _
class AccountAnalyticLine(models.Model):
_inherit = 'account.analytic.line'
@ -17,21 +21,26 @@ class AccountAnalyticLine(models.Model):
return [
('employee_id', '=', employee_id),
('project_id', '!=', False),
('project_id.active', '=', True),
('project_id.allow_timesheets', '=', True)
]
@api.model
def _get_favorite_project_id(self, employee_id=False):
last_timesheet_ids = self.search(self._get_favorite_project_id_domain(employee_id), limit=5)
if len(last_timesheet_ids.project_id) == 1:
return last_timesheet_ids.project_id.id
return False
last_timesheets = self.search_fetch(
self._get_favorite_project_id_domain(employee_id), ['project_id'], limit=5
)
if not last_timesheets:
internal_project = self.env.company.internal_project_id
return internal_project.has_access('read') and internal_project.active and internal_project.allow_timesheets and internal_project.id
return mode([t.project_id.id for t in last_timesheets])
@api.model
def default_get(self, field_list):
result = super(AccountAnalyticLine, self).default_get(field_list)
if not self.env.context.get('default_employee_id') and 'employee_id' in field_list and result.get('user_id'):
def default_get(self, fields):
result = super().default_get(fields)
if not self.env.context.get('default_employee_id') and 'employee_id' in fields and result.get('user_id'):
result['employee_id'] = self.env['hr.employee'].search([('user_id', '=', result['user_id']), ('company_id', '=', result.get('company_id', self.env.company.id))], limit=1).id
if not self._context.get('default_project_id') and self._context.get('is_timesheet'):
if not self.env.context.get('default_project_id') and self.env.context.get('is_timesheet'):
employee_id = result.get('employee_id', self.env.context.get('default_employee_id', False))
favorite_project_id = self._get_favorite_project_id(employee_id)
if favorite_project_id:
@ -39,52 +48,81 @@ class AccountAnalyticLine(models.Model):
return result
def _domain_project_id(self):
domain = [('allow_timesheets', '=', True)]
if not self.user_has_groups('hr_timesheet.group_timesheet_manager'):
return expression.AND([domain,
['|', ('privacy_visibility', '!=', 'followers'), ('message_partner_ids', 'in', [self.env.user.partner_id.id])]
])
domain = Domain([('allow_timesheets', '=', True), ('is_template', '=', False)])
if not self.env.user.has_group('hr_timesheet.group_timesheet_manager'):
domain &= Domain('privacy_visibility', 'in', ['employees', 'portal']) | Domain('message_partner_ids', 'in', [self.env.user.partner_id.id])
return domain
def _domain_employee_id(self):
if not self.user_has_groups('hr_timesheet.group_hr_timesheet_approver'):
return [('user_id', '=', self.env.user.id)]
return []
domain = Domain('company_id', 'in', self.env.context.get('allowed_company_ids'))
if not self.env.user.has_group('hr_timesheet.group_hr_timesheet_approver'):
domain &= Domain('user_id', '=', self.env.user.id)
return domain
task_id = fields.Many2one(
'project.task', 'Task', index='btree_not_null',
compute='_compute_task_id', store=True, readonly=False,
domain="[('allow_timesheets', '=', True), ('project_id', '=?', project_id)]")
ancestor_task_id = fields.Many2one('project.task', related='task_id.ancestor_id', store=True, index='btree_not_null')
domain="[('allow_timesheets', '=', True), ('project_id', '=?', project_id), ('has_template_ancestor', '=', False)]")
parent_task_id = fields.Many2one('project.task', related='task_id.parent_id', store=True, index='btree_not_null')
project_id = fields.Many2one(
'project.project', 'Project', domain=_domain_project_id, index=True,
compute='_compute_project_id', store=True, readonly=False)
user_id = fields.Many2one(compute='_compute_user_id', store=True, readonly=False)
employee_id = fields.Many2one('hr.employee', "Employee", domain=_domain_employee_id, context={'active_test': False},
help="Define an 'hourly cost' on the employee to track the cost of their time.")
job_title = fields.Char(related='employee_id.job_title')
index=True, help="Define an 'hourly cost' on the employee to track the cost of their time.")
job_title = fields.Char(related='employee_id.job_title', export_string_translation=False)
department_id = fields.Many2one('hr.department', "Department", compute='_compute_department_id', store=True, compute_sudo=True)
manager_id = fields.Many2one('hr.employee', "Manager", related='employee_id.parent_id', store=True)
encoding_uom_id = fields.Many2one('uom.uom', compute='_compute_encoding_uom_id')
encoding_uom_id = fields.Many2one('uom.uom', compute='_compute_encoding_uom_id', export_string_translation=False)
partner_id = fields.Many2one(compute='_compute_partner_id', store=True, readonly=False)
readonly_timesheet = fields.Boolean(compute="_compute_readonly_timesheet", compute_sudo=True, export_string_translation=False)
milestone_id = fields.Many2one('project.milestone', related='task_id.milestone_id')
message_partner_ids = fields.Many2many('res.partner', compute='_compute_message_partner_ids', search='_search_message_partner_ids')
calendar_display_name = fields.Char(compute="_compute_calendar_display_name", export_string_translation=False)
def name_get(self):
result = super().name_get()
timesheets_read = self.env[self._name].search_read([('project_id', '!=', False), ('id', 'in', self.ids)], ['id', 'project_id', 'task_id'])
if not timesheets_read:
return result
def _get_display_name(project_id, task_id):
""" Get the display name of the timesheet based on the project and task
:param project_id: tuple containing the id and the display name of the project
:param task_id: tuple containing the id and the display name of the task if a task exists in the timesheet
otherwise False.
:returns: the display name of the timesheet
"""
if task_id:
return '%s - %s' % (project_id[1], task_id[1])
return project_id[1]
timesheet_dict = {res['id']: _get_display_name(res['project_id'], res['task_id']) for res in timesheets_read}
return list({**dict(result), **timesheet_dict}.items())
def _search_message_partner_ids(self, operator, value):
followed_ids_by_model = dict(self.env['mail.followers']._read_group([
('partner_id', operator, value),
('res_model', 'in', ('project.project', 'project.task')),
], ['res_model'], ['res_id:array_agg']))
if not followed_ids_by_model:
return Domain.FALSE
domain = Domain.FALSE
if project_ids := followed_ids_by_model.get('project.project'):
domain |= Domain('project_id', 'in', project_ids)
if task_ids := followed_ids_by_model.get('project.task'):
domain |= Domain('task_id', 'in', task_ids)
return domain
@api.depends('project_id.message_partner_ids', 'task_id.message_partner_ids')
def _compute_message_partner_ids(self):
for line in self:
line.message_partner_ids = line.task_id.message_partner_ids | line.project_id.message_partner_ids
@api.depends('project_id', 'task_id')
def _compute_display_name(self):
analytic_line_with_project = self.filtered('project_id')
super(AccountAnalyticLine, self - analytic_line_with_project)._compute_display_name()
for analytic_line in analytic_line_with_project:
if analytic_line.task_id:
analytic_line.display_name = f"{analytic_line.project_id.sudo().display_name} - {analytic_line.task_id.sudo().display_name}"
else:
analytic_line.display_name = analytic_line.project_id.display_name
def _is_readonly(self):
self.ensure_one()
# is overridden in other timesheet related modules
return False
def _compute_readonly_timesheet(self):
# Since the mrp_module gives write access to portal user on timesheet, we check that the user is an internal one before giving the write access.
# It is not supposed to be needed, since portal user are not supposed to have access to the views using this field, but better be safe than sorry
if not self.env.user.has_group('base.group_user'):
self.readonly_timesheet = True
else:
readonly_timesheets = self.filtered(lambda timesheet: timesheet._is_readonly())
readonly_timesheets.readonly_timesheet = True
(self - readonly_timesheets).readonly_timesheet = False
def _compute_encoding_uom_id(self):
for analytic_line in self:
@ -92,11 +130,12 @@ class AccountAnalyticLine(models.Model):
@api.depends('task_id.partner_id', 'project_id.partner_id')
def _compute_partner_id(self):
super()._compute_partner_id()
for timesheet in self:
if timesheet.project_id:
timesheet.partner_id = timesheet.task_id.partner_id or timesheet.project_id.partner_id
@api.depends('task_id', 'task_id.project_id')
@api.depends('task_id.project_id')
def _compute_project_id(self):
for line in self:
if not line.task_id.project_id or line.project_id == line.task_id.project_id:
@ -105,8 +144,7 @@ class AccountAnalyticLine(models.Model):
@api.depends('project_id')
def _compute_task_id(self):
for line in self.filtered(lambda line: not line.project_id):
line.task_id = False
self.filtered(lambda t: not t.project_id).task_id = False
@api.onchange('project_id')
def _onchange_project_id(self):
@ -116,7 +154,7 @@ class AccountAnalyticLine(models.Model):
if self.project_id != self.task_id.project_id:
self.task_id = False
@api.depends('employee_id')
@api.depends('employee_id.user_id')
def _compute_user_id(self):
for line in self:
line.user_id = line.employee_id.user_id if line.employee_id else self._default_user()
@ -126,28 +164,115 @@ class AccountAnalyticLine(models.Model):
for line in self:
line.department_id = line.employee_id.department_id
def _compute_calendar_display_name(self):
companies = self.company_id
encoding_in_days_per_company = dict(zip(companies, [company.timesheet_encode_uom_id == self.env.ref('uom.product_uom_day') for company in companies]))
for line in self:
if not line.project_id:
line.calendar_display_name = ""
continue
if encoding_in_days_per_company[line.company_id]:
days = line._get_timesheet_time_day()
if days == int(days):
days = int(days)
line.calendar_display_name = self.env._(
"%(project_name)s (%(days)sd)",
project_name=line.project_id.display_name,
days=days,
)
else:
minutes = round(line.unit_amount * 60)
hours, minutes = divmod(abs(round(minutes)), 60)
if minutes:
line.calendar_display_name = self.env._(
"%(project_name)s (%(sign)s%(hours)sh%(minutes)s)",
project_name=line.project_id.display_name,
sign='-' if line.unit_amount < 0 else '',
hours=hours,
minutes=minutes,
)
else:
line.calendar_display_name = self.env._(
"%(project_name)s (%(sign)s%(hours)sh)",
project_name=line.project_id.display_name,
sign='-' if line.unit_amount < 0 else '',
hours=hours,
)
def _check_can_write(self, values):
# If it's a basic user then check if the timesheet is his own.
if (
not (self.env.user.has_group('hr_timesheet.group_hr_timesheet_approver') or self.env.su)
and any(analytic_line.user_id != self.env.user for analytic_line in self)
):
raise AccessError(_("You cannot access timesheets that are not yours."))
def _check_can_create(self):
# override in other modules to check current user has create access
pass
@api.model_create_multi
def create(self, vals_list):
user_timezone = self.env.tz
# Before creating a timesheet, we need to put a valid employee_id in the vals
default_user_id = self._default_user()
user_ids = []
employee_ids = []
# If batch creating from the calendar view, prefetch all employees to avoid fetching them one by one in the loop
if self.env.context.get('timesheet_calendar'):
self.env['hr.employee'].browse([vals.get('employee_id') for vals in vals_list])
# 1/ Collect the user_ids and employee_ids from each timesheet vals
for vals in vals_list:
vals.update(self._timesheet_preprocess(vals))
if not vals.get('project_id'):
skipped_vals = 0
valid_vals = 0
for vals in vals_list[:]:
if self.env.context.get('timesheet_calendar'):
if not 'employee_id' in vals:
vals['employee_id'] = self.env.user.employee_id.id
employee = self.env['hr.employee'].browse(vals['employee_id'])
date = fields.Date.from_string(vals.get('date', fields.Date.to_string(fields.Date.context_today(self))))
if not any(employee.resource_id._get_valid_work_intervals(
datetime.combine(date, time.min, tzinfo=user_timezone),
datetime.combine(date, time.max, tzinfo=user_timezone),
)[0][employee.resource_id.id]):
vals_list.remove(vals)
skipped_vals += 1
continue
task = self.env['project.task'].sudo().browse(vals.get('task_id'))
project = self.env['project.project'].sudo().browse(vals.get('project_id'))
if not (task or project):
# It is not a timesheet
continue
elif task:
if not task.project_id:
raise ValidationError(_('Timesheets cannot be created on a private task.'))
if not project:
vals['project_id'] = task.project_id.id
company = task.company_id or project.company_id or self.env['res.company'].browse(vals.get('company_id'))
vals['company_id'] = company.id
vals.update({
fname: account_id
for fname, account_id in self._timesheet_preprocess_get_accounts(vals).items()
if fname not in vals
})
if not vals.get('product_uom_id'):
vals['product_uom_id'] = company.project_time_mode_id.id
if not vals.get('name'):
vals['name'] = '/'
employee_id = vals.get('employee_id')
user_id = vals.get('user_id', default_user_id)
employee_id = vals.get('employee_id', self.env.context.get('default_employee_id', False))
if employee_id and employee_id not in employee_ids:
employee_ids.append(employee_id)
elif user_id not in user_ids:
user_ids.append(user_id)
else:
user_id = vals.get('user_id', default_user_id)
if user_id not in user_ids:
user_ids.append(user_id)
valid_vals += 1
# 2/ Search all employees related to user_ids and employee_ids, in the selected companies
employees = self.env['hr.employee'].sudo().search([
HrEmployee_sudo = self.env['hr.employee'].sudo()
employees = HrEmployee_sudo.search([
'&', '|', ('user_id', 'in', user_ids), ('id', 'in', employee_ids), ('company_id', 'in', self.env.companies.ids)
])
@ -166,17 +291,23 @@ class AccountAnalyticLine(models.Model):
employee_id_per_company_per_user[employee.user_id.id][employee.company_id.id] = employee.id
# 4/ Put valid employee_id in each vals
error_msg = _lt('Timesheets must be created with an active employee in the selected companies.')
error_msg = _('Timesheets must be created with an active employee in the selected companies.')
for vals in vals_list:
if not vals.get('project_id'):
continue
employee_in_id = vals.get('employee_id')
employee_in_id = vals.get('employee_id', self.env.context.get('default_employee_id', False))
if employee_in_id:
company = False
if not vals.get('company_id'):
company = HrEmployee_sudo.browse(employee_in_id).company_id
vals['company_id'] = company.id
if not vals.get('product_uom_id'):
vals['product_uom_id'] = company.project_time_mode_id.id if company else self.env['res.company'].browse(vals.get('company_id', self.env.company.id)).project_time_mode_id.id
if employee_in_id in valid_employee_per_id:
vals['user_id'] = valid_employee_per_id[employee_in_id].sudo().user_id.id # (A) OK
continue
else:
raise ValidationError(error_msg) # (C) KO
raise ValidationError(error_msg) # (C) KO
else:
user_id = vals.get('user_id', default_user_id) # (B)...
@ -185,137 +316,122 @@ class AccountAnalyticLine(models.Model):
employee_out_id = False
if employee_per_company:
company_id = list(employee_per_company)[0] if len(employee_per_company) == 1\
else vals.get('company_id', self.env.company.id)
else vals.get('company_id') or self.env.company.id
employee_out_id = employee_per_company.get(company_id, False)
if employee_out_id:
vals['employee_id'] = employee_out_id
vals['user_id'] = user_id
company = False
if not vals.get('company_id'):
company = HrEmployee_sudo.browse(employee_out_id).company_id
vals['company_id'] = company.id
if not vals.get('product_uom_id'):
vals['product_uom_id'] = company.project_time_mode_id.id if company else self.env['res.company'].browse(vals.get('company_id', self.env.company.id)).project_time_mode_id.id
else: # ...and raise an error if they fail
raise ValidationError(error_msg)
# 5/ Finally, create the timesheets
lines = super(AccountAnalyticLine, self).create(vals_list)
lines = super().create(vals_list)
lines._check_can_create()
for line, values in zip(lines, vals_list):
if line.project_id: # applied only for timesheet
line._timesheet_postprocess(values)
if self.env.context.get('timesheet_calendar'):
if skipped_vals:
type = "danger"
if valid_vals:
message = self.env._("Some timesheets were not created: employees arent working on the selected days")
else:
message = self.env._("No timesheets created: employees arent working on the selected days")
else:
type = "success"
message = self.env._("Timesheets successfully created")
self.env.user._bus_send('simple_notification', {
"type": type,
"message": message,
})
return lines
def write(self, values):
# If it's a basic user then check if the timesheet is his own.
if not (self.user_has_groups('hr_timesheet.group_hr_timesheet_approver') or self.env.su) and any(self.env.user.id != analytic_line.user_id.id for analytic_line in self):
raise AccessError(_("You cannot access timesheets that are not yours."))
def write(self, vals):
values = vals
self._check_can_write(values)
task = self.env['project.task'].sudo().browse(values.get('task_id'))
project = self.env['project.project'].sudo().browse(values.get('project_id'))
if task and not task.project_id:
raise ValidationError(_('Timesheets cannot be created on a private task.'))
if project or task:
values['company_id'] = task.company_id.id or project.company_id.id
values.update({
fname: account_id
for fname, account_id in self._timesheet_preprocess_get_accounts(values).items()
if fname not in values
})
values = self._timesheet_preprocess(values)
if values.get('employee_id'):
employee = self.env['hr.employee'].browse(values['employee_id'])
if not employee.active:
raise UserError(_('You cannot set an archived employee to the existing timesheets.'))
raise UserError(_('You cannot set an archived employee on existing timesheets.'))
if 'name' in values and not values.get('name'):
values['name'] = '/'
result = super(AccountAnalyticLine, self).write(values)
if 'company_id' in values and not values.get('company_id'):
del values['company_id']
result = super().write(values)
# applied only for timesheet
self.filtered(lambda t: t.project_id)._timesheet_postprocess(values)
return result
@api.model
def _get_view_cache_key(self, view_id=None, view_type='form', **options):
"""The override of _get_view changing the time field labels according to the company timesheet encoding UOM
makes the view cache dependent on the company timesheet encoding uom"""
key = super()._get_view_cache_key(view_id, view_type, **options)
return key + (self.env.company.timesheet_encode_uom_id,)
def get_views(self, views, options=None):
res = super().get_views(views, options)
if options and options.get('toolbar'):
wip_report_id = None
@api.model
def _get_view(self, view_id=None, view_type='form', **options):
""" Set the correct label for `unit_amount`, depending on company UoM """
arch, view = super()._get_view(view_id, view_type, **options)
arch = self.sudo()._apply_timesheet_label(arch, view_type=view_type)
return arch, view
def get_wip_report_id():
return self.env['ir.model.data']._xmlid_to_res_id("mrp_account.wip_report", raise_if_not_found=False)
@api.model
def _apply_timesheet_label(self, view_node, view_type='form'):
doc = view_node
encoding_uom = self.env.company.timesheet_encode_uom_id
# Here, we select only the unit_amount field having no string set to give priority to
# custom inheretied view stored in database. Even if normally, no xpath can be done on
# 'string' attribute.
for node in doc.xpath("//field[@name='unit_amount'][@widget='timesheet_uom'][not(@string)]"):
node.set('string', _('%s Spent') % (re.sub(r'[\(\)]', '', encoding_uom.name or '')))
return doc
@api.model
def _apply_time_label(self, view_node, related_model):
doc = view_node
Model = self.env[related_model]
# Just fetch the name of the uom in `timesheet_encode_uom_id` of the current company
encoding_uom_name = self.env.company.timesheet_encode_uom_id.with_context(prefetch_fields=False).sudo().name
for node in doc.xpath("//field[@widget='timesheet_uom'][not(@string)] | //field[@widget='timesheet_uom_no_toggle'][not(@string)]"):
name_with_uom = re.sub(_('Hours') + "|Hours", encoding_uom_name or '', Model._fields[node.get('name')]._description_string(self.env), flags=re.IGNORECASE)
node.set('string', name_with_uom)
return doc
for view_data in res['views'].values():
print_data_list = view_data.get('toolbar', {}).get('print')
if print_data_list:
if wip_report_id is None and re.search(r'widget="timesheet_uom(\w)*"', view_data['arch']):
wip_report_id = get_wip_report_id()
if wip_report_id:
view_data['toolbar']['print'] = [print_data for print_data in print_data_list if print_data['id'] != wip_report_id]
return res
def _timesheet_get_portal_domain(self):
if self.env.user.has_group('hr_timesheet.group_hr_timesheet_user'):
# Then, he is internal user, and we take the domain for this current user
return self.env['ir.rule']._compute_domain(self._name)
return [
'|',
'&',
'|',
('task_id.project_id.message_partner_ids', 'child_of', [self.env.user.partner_id.commercial_partner_id.id]),
('task_id.message_partner_ids', 'child_of', [self.env.user.partner_id.commercial_partner_id.id]),
('task_id.project_id.privacy_visibility', '=', 'portal'),
'&',
('task_id', '=', False),
'&',
('project_id.message_partner_ids', 'child_of', [self.env.user.partner_id.commercial_partner_id.id]),
('project_id.privacy_visibility', '=', 'portal')
]
return (
(
Domain('message_partner_ids', 'child_of', [self.env.user.partner_id.commercial_partner_id.id])
| Domain('partner_id', 'child_of', [self.env.user.partner_id.commercial_partner_id.id])
)
& Domain('project_id.privacy_visibility', 'in', ['invited_users', 'portal'])
)
def _timesheet_preprocess(self, vals):
""" Deduce other field values from the one given.
Overrride this to compute on the fly some field that can not be computed fields.
:param values: dict values for `create`or `write`.
"""
project = self.env['project.project'].browse(vals.get('project_id', False))
task = self.env['project.task'].browse(vals.get('task_id', False))
# task implies project
if task and not project:
project = task.project_id
if not project:
raise ValidationError(_('You cannot create a timesheet on a private task.'))
vals['project_id'] = project.id
# task implies analytic account and tags
if task and not vals.get('account_id'):
task_analytic_account_id = task._get_task_analytic_account_id()
vals['account_id'] = task_analytic_account_id.id
vals['company_id'] = task_analytic_account_id.company_id.id or task.company_id.id
if not task_analytic_account_id.active:
raise UserError(_('You cannot add timesheets to a project or a task linked to an inactive analytic account.'))
# project implies analytic account
elif project and not vals.get('account_id'):
vals['account_id'] = project.analytic_account_id.id
vals['company_id'] = project.analytic_account_id.company_id.id or project.company_id.id
if not project.analytic_account_id.active:
raise UserError(_('You cannot add timesheets to a project linked to an inactive analytic account.'))
# force customer partner, from the task or the project
if project and not vals.get('partner_id'):
partner_id = task.partner_id.id if task else project.partner_id.id
if partner_id:
vals['partner_id'] = partner_id
# set timesheet UoM from the AA company (AA implies uom)
if not vals.get('product_uom_id') and all(v in vals for v in ['account_id', 'project_id']): # project_id required to check this is timesheet flow
analytic_account = self.env['account.analytic.account'].sudo().browse(vals['account_id'])
uom_id = analytic_account.company_id.project_time_mode_id.id
if not uom_id:
company_id = vals.get('company_id', False)
if not company_id:
project = self.env['project.project'].browse(vals.get('project_id'))
company_id = project.analytic_account_id.company_id.id or project.company_id.id
uom_id = self.env['res.company'].browse(company_id).project_time_mode_id.id
vals['product_uom_id'] = uom_id
return vals
def _timesheet_preprocess_get_accounts(self, vals):
project = self.env['project.project'].sudo().browse(vals.get('project_id'))
if not project:
return {}
company = self.env['res.company'].browse(vals.get('company_id'))
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 not project[plan['column_name']]]
if missing_plan_names:
raise ValidationError(_(
"'%(missing_plan_names)s' analytic plan(s) required on the project '%(project_name)s' linked to the timesheet.",
missing_plan_names=missing_plan_names,
project_name=project.name,
))
return {
fname: project[fname].id
for fname in self._get_plan_fnames()
}
def _timesheet_postprocess(self, values):
""" Hook to update record one by one according to the values of a `write` or a `create`. """
@ -338,6 +454,17 @@ class AccountAnalyticLine(models.Model):
# (re)compute the amount (depending on unit_amount, employee_id for the cost, and account_id for currency)
if any(field_name in values for field_name in ['unit_amount', 'employee_id', 'account_id']):
for timesheet in sudo_self:
if not timesheet.account_id.active:
project_plan, _other_plans = self.env['account.analytic.plan']._get_all_plans()
raise ValidationError(_(
"Timesheets must be created with at least an active analytic account defined in the plan '%(plan_name)s'.",
plan_name=project_plan.name
))
accounts = timesheet._get_analytic_accounts()
companies = timesheet.company_id | accounts.company_id | timesheet.task_id.company_id | timesheet.project_id.company_id
if len(companies) > 1:
raise ValidationError(_('The project, the task and the analytic accounts of the timesheet must belong to the same company.'))
cost = timesheet._hourly_cost()
amount = -timesheet.unit_amount * cost
amount_converted = timesheet.employee_id.currency_id._convert(
@ -347,6 +474,11 @@ class AccountAnalyticLine(models.Model):
})
return result
def _split_amount_fname(self):
# split the quantity instead of the amount, since the amount is postprocessed
# based on the quantity
return 'unit_amount' if self.project_id else super()._split_amount_fname()
def _is_timesheet_encode_uom_day(self):
company_uom = self.env.company.timesheet_encode_uom_id
return company_uom == self.env.ref('uom.product_uom_day')
@ -382,9 +514,7 @@ class AccountAnalyticLine(models.Model):
if not uom_hours:
uom_hours = self.env['uom.uom'].create({
'name': "Hours",
'category_id': self.env.ref('uom.uom_categ_wtime').id,
'factor': 8,
'uom_type': "smaller",
'relative_factor': 1,
})
self.env['ir.model.data'].create({
'name': 'product_uom_hour',
@ -393,3 +523,33 @@ class AccountAnalyticLine(models.Model):
'res_id': uom_hours.id,
'noupdate': True,
})
@api.model
def _show_portal_timesheets(self):
"""
Determine if we show timesheet information in the portal. Meant to be overriden in website_timesheet.
"""
return True
def action_open_timesheet_view_portal(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'res_id': self.id,
'res_model': 'account.analytic.line',
'views': [(self.env.ref('hr_timesheet.timesheet_view_form_portal_user').id, 'form')],
'context': self.env.context,
}
@api.model
def get_unusual_days(self, date_from, date_to=None):
return self.env.user.employee_id._get_unusual_days(date_from, date_to)
@api.model
def get_import_templates(self):
if self.env.context.get('is_timesheet'):
return [{
'label': _('Import Template for Timesheets'),
'template': '/hr_timesheet/static/xls/timesheets_import_template.xlsx',
}]
return []

View file

@ -4,14 +4,14 @@
from odoo import api, models
class Http(models.AbstractModel):
class IrHttp(models.AbstractModel):
_inherit = 'ir.http'
def session_info(self):
""" The widget 'timesheet_uom' needs to know which UoM conversion factor and which javascript
widget to apply, depending on the current company.
"""
result = super(Http, self).session_info()
result = super().session_info()
if self.env.user._is_internal():
company_ids = self.env.user.company_ids

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models
@ -9,7 +8,6 @@ class IrUiMenu(models.Model):
def _load_menus_blacklist(self):
res = super()._load_menus_blacklist()
time_menu = self.env.ref('hr_timesheet.timesheet_menu_activity_user', raise_if_not_found=False)
if time_menu and self.env.user.has_group('hr_timesheet.group_hr_timesheet_approver'):
if self.env.user.has_group('hr_timesheet.group_hr_timesheet_approver') and (time_menu := self.env.ref('hr_timesheet.timesheet_menu_activity_user', raise_if_not_found=False)):
res.append(time_menu.id)
return res

View file

@ -1,454 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from odoo import models, fields, api, _
from odoo.tools.float_utils import float_compare
from odoo.exceptions import UserError, ValidationError, RedirectWarning
from odoo.addons.rating.models.rating_data import OPERATOR_MAPPING
PROJECT_TASK_READABLE_FIELDS = {
'allow_subtasks',
'allow_timesheets',
'analytic_account_active',
'effective_hours',
'encode_uom_in_days',
'planned_hours',
'progress',
'overtime',
'remaining_hours',
'subtask_effective_hours',
'subtask_planned_hours',
'timesheet_ids',
'total_hours_spent',
}
class Project(models.Model):
_inherit = "project.project"
allow_timesheets = fields.Boolean(
"Timesheets", compute='_compute_allow_timesheets', store=True, readonly=False,
default=True)
analytic_account_id = fields.Many2one(
# note: replaces ['|', ('company_id', '=', False), ('company_id', '=', company_id)]
domain="""[
'|', ('company_id', '=', False), ('company_id', '=', company_id),
('partner_id', '=?', partner_id),
]"""
)
timesheet_ids = fields.One2many('account.analytic.line', 'project_id', 'Associated Timesheets')
timesheet_count = fields.Integer(compute="_compute_timesheet_count", groups='hr_timesheet.group_hr_timesheet_user')
timesheet_encode_uom_id = fields.Many2one('uom.uom', related='company_id.timesheet_encode_uom_id')
total_timesheet_time = fields.Integer(
compute='_compute_total_timesheet_time', groups='hr_timesheet.group_hr_timesheet_user',
help="Total number of time (in the proper UoM) recorded in the project, rounded to the unit.")
encode_uom_in_days = fields.Boolean(compute='_compute_encode_uom_in_days')
is_internal_project = fields.Boolean(compute='_compute_is_internal_project', search='_search_is_internal_project')
remaining_hours = fields.Float(compute='_compute_remaining_hours', string='Remaining Invoiced Time', compute_sudo=True)
is_project_overtime = fields.Boolean('Project in Overtime', compute='_compute_remaining_hours', search='_search_is_project_overtime', compute_sudo=True)
allocated_hours = fields.Float(string='Allocated Hours')
def _compute_encode_uom_in_days(self):
self.encode_uom_in_days = self.env.company.timesheet_encode_uom_id == self.env.ref('uom.product_uom_day')
@api.depends('analytic_account_id')
def _compute_allow_timesheets(self):
without_account = self.filtered(lambda t: not t.analytic_account_id and t._origin)
without_account.update({'allow_timesheets': False})
@api.depends('company_id')
def _compute_is_internal_project(self):
for project in self:
project.is_internal_project = project == project.company_id.internal_project_id
@api.model
def _search_is_internal_project(self, operator, value):
if not isinstance(value, bool):
raise ValueError(_('Invalid value: %s', value))
if operator not in ['=', '!=']:
raise ValueError(_('Invalid operator: %s', operator))
query = """
SELECT C.internal_project_id
FROM res_company C
WHERE C.internal_project_id IS NOT NULL
"""
if (operator == '=' and value is True) or (operator == '!=' and value is False):
operator_new = 'inselect'
else:
operator_new = 'not inselect'
return [('id', operator_new, (query, ()))]
@api.model
def _get_view_cache_key(self, view_id=None, view_type='form', **options):
"""The override of _get_view changing the time field labels according to the company timesheet encoding UOM
makes the view cache dependent on the company timesheet encoding uom"""
key = super()._get_view_cache_key(view_id, view_type, **options)
return key + (self.env.company.timesheet_encode_uom_id,)
@api.model
def _get_view(self, view_id=None, view_type='form', **options):
arch, view = super()._get_view(view_id, view_type, **options)
if view_type in ['tree', 'form'] and self.env.company.timesheet_encode_uom_id == self.env.ref('uom.product_uom_day'):
arch = self.env['account.analytic.line']._apply_time_label(arch, related_model=self._name)
return arch, view
@api.depends('allow_timesheets', 'timesheet_ids')
def _compute_remaining_hours(self):
timesheets_read_group = self.env['account.analytic.line']._read_group(
[('project_id', 'in', self.ids)],
['project_id', 'unit_amount'],
['project_id'],
lazy=False)
timesheet_time_dict = {res['project_id'][0]: res['unit_amount'] for res in timesheets_read_group}
for project in self:
project.remaining_hours = project.allocated_hours - timesheet_time_dict.get(project.id, 0)
project.is_project_overtime = project.remaining_hours < 0
@api.model
def _search_is_project_overtime(self, operator, value):
if not isinstance(value, bool):
raise ValueError(_('Invalid value: %s') % value)
if operator not in ['=', '!=']:
raise ValueError(_('Invalid operator: %s') % operator)
query = """
SELECT Project.id
FROM project_project AS Project
JOIN project_task AS Task
ON Project.id = Task.project_id
WHERE Project.allocated_hours > 0
AND Project.allow_timesheets = TRUE
AND Task.parent_id IS NULL
AND Task.is_closed IS FALSE
GROUP BY Project.id
HAVING Project.allocated_hours - SUM(Task.effective_hours) < 0
"""
if (operator == '=' and value is True) or (operator == '!=' and value is False):
operator_new = 'inselect'
else:
operator_new = 'not inselect'
return [('id', operator_new, (query, ()))]
@api.constrains('allow_timesheets', 'analytic_account_id')
def _check_allow_timesheet(self):
for project in self:
if project.allow_timesheets and not project.analytic_account_id:
raise ValidationError(_('You cannot use timesheets without an analytic account.'))
@api.depends('timesheet_ids')
def _compute_total_timesheet_time(self):
timesheets_read_group = self.env['account.analytic.line'].read_group(
[('project_id', 'in', self.ids)],
['project_id', 'unit_amount', 'product_uom_id'],
['project_id', 'product_uom_id'],
lazy=False)
timesheet_time_dict = defaultdict(list)
uom_ids = set(self.timesheet_encode_uom_id.ids)
for result in timesheets_read_group:
uom_id = result['product_uom_id'] and result['product_uom_id'][0]
if uom_id:
uom_ids.add(uom_id)
timesheet_time_dict[result['project_id'][0]].append((uom_id, result['unit_amount']))
uoms_dict = {uom.id: uom for uom in self.env['uom.uom'].browse(uom_ids)}
for project in self:
# Timesheets may be stored in a different unit of measure, so first
# we convert all of them to the reference unit
# if the timesheet has no product_uom_id then we take the one of the project
total_time = 0.0
for product_uom_id, unit_amount in timesheet_time_dict[project.id]:
factor = uoms_dict.get(product_uom_id, project.timesheet_encode_uom_id).factor_inv
total_time += unit_amount * (1.0 if project.encode_uom_in_days else factor)
# Now convert to the proper unit of measure set in the settings
total_time *= project.timesheet_encode_uom_id.factor
project.total_timesheet_time = int(round(total_time))
@api.depends('timesheet_ids')
def _compute_timesheet_count(self):
timesheet_read_group = self.env['account.analytic.line']._read_group(
[('project_id', 'in', self.ids)],
['project_id'],
['project_id']
)
timesheet_project_map = {project_info['project_id'][0]: project_info['project_id_count'] for project_info in timesheet_read_group}
for project in self:
project.timesheet_count = timesheet_project_map.get(project.id, 0)
@api.model_create_multi
def create(self, vals_list):
""" Create an analytic account if project allow timesheet and don't provide one
Note: create it before calling super() to avoid raising the ValidationError from _check_allow_timesheet
"""
defaults = self.default_get(['allow_timesheets', 'analytic_account_id'])
for vals in vals_list:
allow_timesheets = vals.get('allow_timesheets', defaults.get('allow_timesheets'))
analytic_account_id = vals.get('analytic_account_id', defaults.get('analytic_account_id'))
if allow_timesheets and not analytic_account_id:
analytic_account = self._create_analytic_account_from_values(vals)
vals['analytic_account_id'] = analytic_account.id
return super().create(vals_list)
def write(self, values):
# create the AA for project still allowing timesheet
if values.get('allow_timesheets') and not values.get('analytic_account_id'):
for project in self:
if not project.analytic_account_id:
project._create_analytic_account()
return super(Project, self).write(values)
def name_get(self):
res = super().name_get()
if len(self.env.context.get('allowed_company_ids', [])) <= 1:
return res
name_mapping = dict(res)
for project in self:
if project.is_internal_project:
name_mapping[project.id] = f'{name_mapping[project.id]} - {project.company_id.name}'
return list(name_mapping.items())
@api.model
def _init_data_analytic_account(self):
self.search([('analytic_account_id', '=', False), ('allow_timesheets', '=', True)])._create_analytic_account()
@api.ondelete(at_uninstall=False)
def _unlink_except_contains_entries(self):
"""
If some projects to unlink have some timesheets entries, these
timesheets entries must be unlinked first.
In this case, a warning message is displayed through a RedirectWarning
and allows the user to see timesheets entries to unlink.
"""
projects_with_timesheets = self.filtered(lambda p: p.timesheet_ids)
if projects_with_timesheets:
if len(projects_with_timesheets) > 1:
warning_msg = _("These projects have some timesheet entries referencing them. Before removing these projects, you have to remove these timesheet entries.")
else:
warning_msg = _("This project has some timesheet entries referencing it. Before removing this project, you have to remove these timesheet entries.")
raise RedirectWarning(
warning_msg, self.env.ref('hr_timesheet.timesheet_action_project').id,
_('See timesheet entries'), {'active_ids': projects_with_timesheets.ids})
def _convert_project_uom_to_timesheet_encode_uom(self, time):
uom_from = self.company_id.project_time_mode_id
uom_to = self.env.company.timesheet_encode_uom_id
return round(uom_from._compute_quantity(time, uom_to, raise_if_failure=False), 2)
def action_project_timesheets(self):
action = self.env['ir.actions.act_window']._for_xml_id('hr_timesheet.act_hr_timesheet_line_by_project')
action['display_name'] = _("%(name)s's Timesheets", name=self.name)
return action
class Task(models.Model):
_name = "project.task"
_inherit = "project.task"
analytic_account_active = fields.Boolean("Active Analytic Account", compute='_compute_analytic_account_active', compute_sudo=True)
allow_timesheets = fields.Boolean(
"Allow timesheets",
compute='_compute_allow_timesheets', compute_sudo=True,
search='_search_allow_timesheets', readonly=True,
help="Timesheets can be logged on this task.")
remaining_hours = fields.Float("Remaining Hours", compute='_compute_remaining_hours', store=True, readonly=True, help="Number of allocated hours minus the number of hours spent.")
remaining_hours_percentage = fields.Float(compute='_compute_remaining_hours_percentage', search='_search_remaining_hours_percentage')
effective_hours = fields.Float("Hours Spent", compute='_compute_effective_hours', compute_sudo=True, store=True)
total_hours_spent = fields.Float("Total Hours", compute='_compute_total_hours_spent', store=True, help="Time spent on this task and its sub-tasks (and their own sub-tasks).")
progress = fields.Float("Progress", compute='_compute_progress_hours', store=True, group_operator="avg")
overtime = fields.Float(compute='_compute_progress_hours', store=True)
subtask_effective_hours = fields.Float("Sub-tasks Hours Spent", compute='_compute_subtask_effective_hours', recursive=True, store=True, help="Time spent on the sub-tasks (and their own sub-tasks) of this task.")
timesheet_ids = fields.One2many('account.analytic.line', 'task_id', 'Timesheets')
encode_uom_in_days = fields.Boolean(compute='_compute_encode_uom_in_days', default=lambda self: self._uom_in_days())
@property
def SELF_READABLE_FIELDS(self):
return super().SELF_READABLE_FIELDS | PROJECT_TASK_READABLE_FIELDS
def _uom_in_days(self):
return self.env.company.timesheet_encode_uom_id == self.env.ref('uom.product_uom_day')
def _compute_encode_uom_in_days(self):
self.encode_uom_in_days = self._uom_in_days()
@api.depends('project_id.allow_timesheets')
def _compute_allow_timesheets(self):
for task in self:
task.allow_timesheets = task.project_id.allow_timesheets
def _search_allow_timesheets(self, operator, value):
query = self.env['project.project'].sudo()._search([
('allow_timesheets', operator, value),
])
return [('project_id', 'in', query)]
@api.depends('analytic_account_id.active', 'project_id.analytic_account_id.active')
def _compute_analytic_account_active(self):
""" Overridden in sale_timesheet """
for task in self:
task.analytic_account_active = task._get_task_analytic_account_id().active
@api.depends('timesheet_ids.unit_amount')
def _compute_effective_hours(self):
if not any(self._ids):
for task in self:
task.effective_hours = sum(task.timesheet_ids.mapped('unit_amount'))
return
timesheet_read_group = self.env['account.analytic.line'].read_group([('task_id', 'in', self.ids)], ['unit_amount', 'task_id'], ['task_id'])
timesheets_per_task = {res['task_id'][0]: res['unit_amount'] for res in timesheet_read_group}
for task in self:
task.effective_hours = timesheets_per_task.get(task.id, 0.0)
@api.depends('effective_hours', 'subtask_effective_hours', 'planned_hours')
def _compute_progress_hours(self):
for task in self:
if (task.planned_hours > 0.0):
task_total_hours = task.effective_hours + task.subtask_effective_hours
task.overtime = max(task_total_hours - task.planned_hours, 0)
if float_compare(task_total_hours, task.planned_hours, precision_digits=2) >= 0:
task.progress = 100
else:
task.progress = round(100.0 * task_total_hours / task.planned_hours, 2)
else:
task.progress = 0.0
task.overtime = 0
@api.depends('planned_hours', 'remaining_hours')
def _compute_remaining_hours_percentage(self):
for task in self:
if task.planned_hours > 0.0:
task.remaining_hours_percentage = task.remaining_hours / task.planned_hours
else:
task.remaining_hours_percentage = 0.0
def _search_remaining_hours_percentage(self, operator, value):
if operator not in OPERATOR_MAPPING:
raise NotImplementedError(_('This operator %s is not supported in this search method.', operator))
query = f"""
SELECT id
FROM {self._table}
WHERE remaining_hours > 0
AND planned_hours > 0
AND remaining_hours / planned_hours {operator} %s
"""
return [('id', 'inselect', (query, (value,)))]
@api.depends('effective_hours', 'subtask_effective_hours', 'planned_hours')
def _compute_remaining_hours(self):
for task in self:
task.remaining_hours = task.planned_hours - task.effective_hours - task.subtask_effective_hours
@api.depends('effective_hours', 'subtask_effective_hours')
def _compute_total_hours_spent(self):
for task in self:
task.total_hours_spent = task.effective_hours + task.subtask_effective_hours
@api.depends('child_ids.effective_hours', 'child_ids.subtask_effective_hours')
def _compute_subtask_effective_hours(self):
for task in self.with_context(active_test=False):
task.subtask_effective_hours = sum(child_task.effective_hours + child_task.subtask_effective_hours for child_task in task.child_ids)
def action_view_subtask_timesheet(self):
self.ensure_one()
task_ids = self.with_context(active_test=False)._get_subtask_ids_per_task_id().get(self.id, [])
action = self.env["ir.actions.actions"]._for_xml_id("hr_timesheet.timesheet_action_all")
graph_view_id = self.env.ref("hr_timesheet.view_hr_timesheet_line_graph_by_employee").id
new_views = []
for view in action['views']:
if view[1] == 'graph':
view = (graph_view_id, 'graph')
new_views.insert(0, view) if view[1] == 'tree' else new_views.append(view)
action.update({
'display_name': _('Timesheets'),
'context': {'default_project_id': self.project_id.id, 'grid_range': 'week'},
'domain': [('project_id', '!=', False), ('task_id', 'in', task_ids)],
'views': new_views,
})
return action
def _get_timesheet(self):
# Is override in sale_timesheet
return self.timesheet_ids
def write(self, values):
# a timesheet must have an analytic account (and a project)
if 'project_id' in values and not values.get('project_id') and self._get_timesheet():
raise UserError(_('This task must be part of a project because there are some timesheets linked to it.'))
res = super(Task, self).write(values)
if 'project_id' in values:
project = self.env['project.project'].browse(values.get('project_id'))
if project.allow_timesheets:
# We write on all non yet invoiced timesheet the new project_id (if project allow timesheet)
self._get_timesheet().write({'project_id': values.get('project_id')})
return res
def name_get(self):
if self.env.context.get('hr_timesheet_display_remaining_hours'):
name_mapping = dict(super().name_get())
for task in self:
if task.allow_timesheets and task.planned_hours > 0 and task.encode_uom_in_days:
days_left = _("(%s days remaining)") % task._convert_hours_to_days(task.remaining_hours)
name_mapping[task.id] = name_mapping.get(task.id, '') + u"\u00A0" + days_left
elif task.allow_timesheets and task.planned_hours > 0:
hours, mins = (str(int(duration)).rjust(2, '0') for duration in divmod(abs(task.remaining_hours) * 60, 60))
hours_left = _(
"(%(sign)s%(hours)s:%(minutes)s remaining)",
sign='-' if task.remaining_hours < 0 else '',
hours=hours,
minutes=mins,
)
name_mapping[task.id] = name_mapping.get(task.id, '') + u"\u00A0" + hours_left
return list(name_mapping.items())
return super().name_get()
@api.model
def _get_view_cache_key(self, view_id=None, view_type='form', **options):
"""The override of _get_view changing the time field labels according to the company timesheet encoding UOM
makes the view cache dependent on the company timesheet encoding uom"""
key = super()._get_view_cache_key(view_id, view_type, **options)
return key + (self.env.company.timesheet_encode_uom_id,)
@api.model
def _get_view(self, view_id=None, view_type='form', **options):
""" Set the correct label for `unit_amount`, depending on company UoM """
arch, view = super()._get_view(view_id, view_type, **options)
# Use of sudo as the portal user doesn't have access to uom
arch = self.env['account.analytic.line'].sudo()._apply_timesheet_label(arch)
if view_type in ['tree', 'pivot', 'graph', 'form'] and self.env.company.timesheet_encode_uom_id == self.env.ref('uom.product_uom_day'):
arch = self.env['account.analytic.line']._apply_time_label(arch, related_model=self._name)
return arch, view
@api.ondelete(at_uninstall=False)
def _unlink_except_contains_entries(self):
"""
If some tasks to unlink have some timesheets entries, these
timesheets entries must be unlinked first.
In this case, a warning message is displayed through a RedirectWarning
and allows the user to see timesheets entries to unlink.
"""
timesheet_data = self.env['account.analytic.line'].sudo()._read_group(
[('task_id', 'in', self.ids)],
['task_id'],
['task_id'],
)
task_with_timesheets_ids = [res['task_id'][0] for res in timesheet_data]
if task_with_timesheets_ids:
if len(task_with_timesheets_ids) > 1:
warning_msg = _("These tasks have some timesheet entries referencing them. Before removing these tasks, you have to remove these timesheet entries.")
else:
warning_msg = _("This task has some timesheet entries referencing it. Before removing this task, you have to remove these timesheet entries.")
raise RedirectWarning(
warning_msg, self.env.ref('hr_timesheet.timesheet_action_task').id,
_('See timesheet entries'), {'active_ids': task_with_timesheets_ids})
@api.model
def _convert_hours_to_days(self, time):
uom_hour = self.env.ref('uom.product_uom_hour')
uom_day = self.env.ref('uom.product_uom_day')
return round(uom_hour._compute_quantity(time, uom_day, raise_if_failure=False), 2)

View file

@ -0,0 +1,290 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from odoo import api, fields, models
from odoo.exceptions import RedirectWarning, ValidationError
from odoo.tools import SQL, float_round
from odoo.tools.translate import _
class ProjectProject(models.Model):
_inherit = "project.project"
allow_timesheets = fields.Boolean(
"Timesheets", compute='_compute_allow_timesheets', store=True, readonly=False,
default=True)
account_id = fields.Many2one(
# note: replaces ['|', ('company_id', '=', False), ('company_id', '=', company_id)]
domain="""[
'|', ('company_id', '=', False), ('company_id', '=?', company_id),
('partner_id', '=?', partner_id),
]"""
)
analytic_account_active = fields.Boolean("Active Account", related="account_id.active", export_string_translation=False)
timesheet_ids = fields.One2many('account.analytic.line', 'project_id', 'Associated Timesheets', export_string_translation=False)
timesheet_encode_uom_id = fields.Many2one('uom.uom', compute='_compute_timesheet_encode_uom_id', export_string_translation=False)
total_timesheet_time = fields.Float(
compute='_compute_total_timesheet_time', groups='hr_timesheet.group_hr_timesheet_user',
string="Total amount of time (in the proper unit) recorded in the project, rounded to the unit.", export_string_translation=False)
encode_uom_in_days = fields.Boolean(compute='_compute_encode_uom_in_days', export_string_translation=False)
is_internal_project = fields.Boolean(compute='_compute_is_internal_project', search='_search_is_internal_project', export_string_translation=False)
remaining_hours = fields.Float(compute='_compute_remaining_hours', string='Time Remaining', compute_sudo=True)
is_project_overtime = fields.Boolean('Project in Overtime', compute='_compute_remaining_hours', search='_search_is_project_overtime', compute_sudo=True, export_string_translation=False)
allocated_hours = fields.Float(string='Allocated Time', tracking=True)
effective_hours = fields.Float(string='Time Spent', compute='_compute_remaining_hours', compute_sudo=True)
def _compute_encode_uom_in_days(self):
self.encode_uom_in_days = self.env.company.timesheet_encode_uom_id == self.env.ref('uom.product_uom_day')
@api.depends('company_id', 'company_id.timesheet_encode_uom_id')
@api.depends_context('company')
def _compute_timesheet_encode_uom_id(self):
for project in self:
project.timesheet_encode_uom_id = project.company_id.timesheet_encode_uom_id or self.env.company.timesheet_encode_uom_id
@api.depends('account_id')
def _compute_allow_timesheets(self):
without_account = self.filtered(lambda t: t._origin and not t.account_id)
without_account.update({'allow_timesheets': False})
@api.depends('company_id')
def _compute_is_internal_project(self):
for project in self:
project.is_internal_project = project == project.company_id.internal_project_id
@api.model
def _search_is_internal_project(self, operator, value):
if operator not in ('in', 'not in'):
return NotImplemented
Company = self.env['res.company']
sql = Company._search(
[('internal_project_id', '!=', False)],
active_test=False, bypass_access=True,
).subselect("internal_project_id")
return [('id', operator, sql)]
@api.depends('allow_timesheets', 'timesheet_ids.unit_amount', 'allocated_hours')
def _compute_remaining_hours(self):
timesheets_read_group = self.env['account.analytic.line']._read_group(
[('project_id', 'in', self.ids)],
['project_id'],
['unit_amount:sum'],
)
timesheet_time_dict = {project.id: unit_amount_sum for project, unit_amount_sum in timesheets_read_group}
for project in self:
project.effective_hours = round(timesheet_time_dict.get(project.id, 0.0), 2)
project.remaining_hours = project.allocated_hours - project.effective_hours
project.is_project_overtime = project.remaining_hours < 0
@api.model
def _search_is_project_overtime(self, operator, value):
if operator not in ('in', 'not in'):
return NotImplemented
sql = SQL("""(
SELECT Project.id
FROM project_project AS Project
JOIN project_task AS Task
ON Project.id = Task.project_id
WHERE Project.allocated_hours > 0
AND Project.allow_timesheets = TRUE
AND Task.parent_id IS NULL
AND Task.state IN ('01_in_progress', '02_changes_requested', '03_approved', '04_waiting_normal')
GROUP BY Project.id
HAVING Project.allocated_hours - SUM(Task.effective_hours) < 0
)""")
return [('id', operator, sql)]
@api.constrains('allow_timesheets', 'account_id')
def _check_allow_timesheet(self):
for project in self:
if project.allow_timesheets and not project.account_id and not project.is_template:
project_plan, _other_plans = self.env['account.analytic.plan']._get_all_plans()
raise ValidationError(_(
"To use the timesheets feature, you need an analytic account for your project. Please set one up in the plan '%(plan_name)s' or turn off the timesheets feature.",
plan_name=project_plan.name
))
@api.depends('timesheet_ids', 'timesheet_encode_uom_id')
def _compute_total_timesheet_time(self):
timesheets_read_group = self.env['account.analytic.line']._read_group(
[('project_id', 'in', self.ids)],
['project_id', 'product_uom_id'],
['unit_amount:sum'],
)
timesheet_time_dict = defaultdict(list)
for project, product_uom, unit_amount_sum in timesheets_read_group:
timesheet_time_dict[project.id].append((product_uom, unit_amount_sum))
for project in self:
# Timesheets may be stored in a different unit of measure, so first
# we convert all of them to the reference unit
# if the timesheet has no product_uom_id then we take the one of the project
total_time = 0.0
for product_uom, unit_amount in timesheet_time_dict[project.id]:
factor = (product_uom or project.timesheet_encode_uom_id).factor
total_time += unit_amount * (1.0 if project.encode_uom_in_days else factor)
# Now convert to the proper unit of measure set in the settings
total_time /= project.timesheet_encode_uom_id.factor
project.total_timesheet_time = float_round(total_time, precision_digits=2)
@api.model_create_multi
def create(self, vals_list):
""" Create an analytic account if project allow timesheet and don't provide one
Note: create it before calling super() to avoid raising the ValidationError from _check_allow_timesheet
"""
defaults = self.default_get(['allow_timesheets', 'account_id', 'is_template'])
analytic_accounts_vals = [
vals for vals in vals_list
if (
vals.get('allow_timesheets', defaults.get('allow_timesheets')) and
not vals.get('account_id', defaults.get('account_id')) and not vals.get('is_template', defaults.get('is_template'))
)
]
if analytic_accounts_vals:
analytic_accounts = self.env['account.analytic.account'].create(self._get_values_analytic_account_batch(analytic_accounts_vals))
for vals, analytic_account in zip(analytic_accounts_vals, analytic_accounts):
vals['account_id'] = analytic_account.id
return super().create(vals_list)
def write(self, vals):
# create the AA for project still allowing timesheet
if vals.get('allow_timesheets') and not vals.get('account_id'):
project_wo_account = self.filtered(lambda project: not project.account_id and not project.is_template)
if project_wo_account:
project_wo_account._create_analytic_account()
return super().write(vals)
@api.depends('is_internal_project', 'company_id')
@api.depends_context('allowed_company_ids')
def _compute_display_name(self):
super()._compute_display_name()
if len(self.env.context.get('allowed_company_ids') or []) <= 1:
return
for project in self:
if project.is_internal_project:
project.display_name = f'{project.display_name} - {project.company_id.name}'
@api.model
def _init_data_analytic_account(self):
self.search([('account_id', '=', False), ('allow_timesheets', '=', True), ('is_template', '=', False)])._create_analytic_account()
@api.ondelete(at_uninstall=False)
def _unlink_except_contains_entries(self):
"""
If some projects to unlink have some timesheets entries, these
timesheets entries must be unlinked first.
In this case, a warning message is displayed through a RedirectWarning
and allows the user to see timesheets entries to unlink.
"""
projects_with_timesheets = self.filtered(lambda p: p.timesheet_ids)
if projects_with_timesheets:
if len(projects_with_timesheets) > 1:
warning_msg = _("These projects have some timesheet entries referencing them. Before removing these projects, you have to remove these timesheet entries.")
else:
warning_msg = _("This project has some timesheet entries referencing it. Before removing this project, you have to remove these timesheet entries.")
raise RedirectWarning(
warning_msg, self.env.ref('hr_timesheet.timesheet_action_project').id,
_('See timesheet entries'), {'active_ids': projects_with_timesheets.ids})
@api.model
def get_create_edit_project_ids(self):
return []
def _convert_project_uom_to_timesheet_encode_uom(self, time):
uom_from = self.company_id.project_time_mode_id
uom_to = self.env.company.timesheet_encode_uom_id
return round(uom_from._compute_quantity(time, uom_to, raise_if_failure=False), 2)
def action_project_timesheets(self):
action = self.env['ir.actions.act_window']._for_xml_id('hr_timesheet.act_hr_timesheet_line_by_project')
if not self.env.context.get('from_embedded_action'):
action['display_name'] = _("%(name)s's Timesheets", name=self.name)
return action
# ----------------------------
# Project Updates
# ----------------------------
def _get_stat_buttons(self):
buttons = super()._get_stat_buttons()
if not self.allow_timesheets or not self.env.user.has_group("hr_timesheet.group_hr_timesheet_user"):
return buttons
encode_uom = self.env.company.timesheet_encode_uom_id
uom_ratio = self.env.ref('uom.product_uom_hour').factor / encode_uom.factor
allocated = self.allocated_hours * uom_ratio
effective = self.total_timesheet_time
color = ""
if allocated:
number = f"{round(effective)} / {round(allocated)} {encode_uom.name}"
success_rate = round(100 * effective / allocated)
if success_rate > 100:
number = self.env._(
"%(effective)s / %(allocated)s %(uom_name)s",
effective=round(effective),
allocated=round(allocated),
uom_name=encode_uom.name,
)
color = "text-danger"
else:
number = self.env._(
"%(effective)s / %(allocated)s %(uom_name)s (%(success_rate)s%%)",
effective=round(effective),
allocated=round(allocated),
uom_name=encode_uom.name,
success_rate=success_rate,
)
if success_rate >= 80:
color = "text-warning"
else:
color = "text-success"
else:
number = self.env._(
"%(effective)s %(uom_name)s",
effective=round(effective),
uom_name=encode_uom.name,
)
buttons.append({
"icon": f"clock-o {color}",
"text": self.env._("Timesheets"),
"number": number,
"action_type": "object",
"action": "action_project_timesheets",
"show": True,
"sequence": 2,
})
if allocated and success_rate > 100:
buttons.append({
"icon": f"warning {color}",
"text": self.env._("Extra Time"),
"number": self.env._(
"%(exceeding_hours)s %(uom_name)s (+%(exceeding_rate)s%%)",
exceeding_hours=round(effective - allocated),
uom_name=encode_uom.name,
exceeding_rate=round(100 * (effective - allocated) / allocated),
),
"action_type": "object",
"action": "action_project_timesheets",
"show": True,
"sequence": 3,
})
return buttons
def action_view_tasks(self):
# Using the timesheet filter hide context
action = super().action_view_tasks()
action['context']['allow_timesheets'] = self.allow_timesheets
return action
def _toggle_template_mode(self, is_template):
if not is_template and self.allow_timesheets and not self.account_id:
self._create_analytic_account()
super()._toggle_template_mode(is_template)

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