Add odex25_survey

This commit is contained in:
expert 2024-06-24 14:24:41 +03:00
parent 3a3f834c54
commit 272482d549
299 changed files with 17577 additions and 1 deletions

View File

@ -1,2 +1,2 @@
# odex25-standard-moduless
# odex25-standard-modules
This Repo contains general standard modules for all projects.

View File

@ -0,0 +1,91 @@
=========
HR Course
=========
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:ddeee0d152c5f7cd6896862fed775d928e76cfa9ab645cc1eb716b3f2a055f10
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fhr-lightgray.png?logo=github
:target: https://github.com/OCA/hr/tree/14.0/hr_course
:alt: OCA/hr
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/hr-14-0/hr-14-0-hr_course
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/hr&target_branch=14.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows your to manage employee's training courses, course dates and all its
validation process.
**Table of contents**
.. contents::
:local:
Usage
=====
To create a Course go to Employees -> Courses.
To create a Training Schedule go to Employees -> Courses Schedule.
Fill the information and click assign attendees to continue. Assign them and
then start the course session.
One it has finished you must enter the results and finish the course session.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/hr/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/hr/issues/new?body=module:%20hr_course%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Creu Blanca
Contributors
~~~~~~~~~~~~
* Enric Tobella <etobella@creublanca.es>
* Jaime Arroyo <jaime.arroyo@creublanca.es>
* Anna Janiszewska <anna.janiszewska@camptocamp.com>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/hr <https://github.com/OCA/hr/tree/14.0/hr_course>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@ -0,0 +1,2 @@
from . import models
from . import tests

View File

@ -0,0 +1,28 @@
# Copyright 2019 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "HR Course",
"summary": """
This module allows your to manage employee's training courses""",
"version": "14.0.3.1.1",
"license": "AGPL-3",
"author": "Creu Blanca,Odoo Community Association (OCA)",
"category":"Odex25-Survey/Odex25-Survey",
"website": "https://github.com/OCA/hr",
"depends": ["hr", "mail"],
"data": [
"security/course_security.xml",
"security/ir.model.access.csv",
"data/ir_cron_data.xml",
"data/mail_template.xml",
"data/mail_channel.xml",
"views/hr_course_category_views.xml",
"views/hr_course_views.xml",
"views/hr_course_schedule_views.xml",
"views/hr_employee_views.xml",
"views/hr_settings.xml",
],
"demo": ["demo/hr_course.xml"],
}

View File

@ -0,0 +1,17 @@
<odoo noupdate="1">
<record id="ir_cron_post_wip" model="ir.cron">
<field name="name">HR Course: Check validity date</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="active">False</field>
<field
name="nextcall"
eval="(DateTime.now().replace(hour=1, minute=0) + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S')"
/>
<field name="doall" eval="False" />
<field name="model_id" ref="model_hr_course_schedule" />
<field name="code">model._cron_check_validity_date()</field>
<field name="state">code</field>
</record>
</odoo>

View File

@ -0,0 +1,6 @@
<odoo noupdate="0">
<!-- Channel -->
<record id="mail_channel_course_validity" model="mail.channel">
<field name="name">Course validity expiration notification</field>
</record>
</odoo>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="mail_template_validity_reminder" model="mail.template">
<field name="name">Course Validity Notification</field>
<field name="email_from">${ctx.get('email_from')}</field>
<field name="subject">End of validity for a course</field>
<field name="model_id" ref="model_hr_course_schedule" />
<field name="body_html" type="html">
<div>
<p>Hi,</p>
<p
>The validity time of the course ${object.name} will end up soon. You maybe need to plan a new one. </p>
<p>The concerned employees are:</p>
% for employee in object.course_attendee_ids.mapped("employee_id.name"):
<p>${employee}</p>
% endfor
</div>
</field>
</record>
</odoo>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="hr_course_category_it" model="hr.course.category">
<field name="name">Department IT</field>
</record>
<record id="hr_course_category_language" model="hr.course.category">
<field name="name">Languages</field>
</record>
<record id="hr_course_qsa" model="hr.course">
<field name="name">Qualified Security Assessor Training (QSA)</field>
<field name="category_id" ref="hr_course_category_it" />
</record>
<record id="hr_course_isa" model="hr.course">
<field name="name">Internal Security Assessor Training (ISA)</field>
<field name="category_id" ref="hr_course_category_it" />
</record>
<record id="hr_course_schedule_qsa_october" model="hr.course.schedule">
<field name="name">QSA October</field>
<field name="course_id" ref="hr_course_qsa" />
<field name="start_date">2021-10-21</field>
<field name="end_date">2021-10-21</field>
<field name="cost">100</field>
<field name="authorized_by" ref="hr.employee_hne" />
</record>
<record id="hr_course_schedule_qsa_november" model="hr.course.schedule">
<field name="name">QSA November</field>
<field name="course_id" ref="hr_course_qsa" />
<field name="start_date">2021-11-29</field>
<field name="end_date">2021-11-29</field>
<field name="cost">100</field>
<field name="authorized_by" ref="hr.employee_hne" />
</record>
</odoo>

View File

@ -0,0 +1,711 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_course
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: de\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_course
#: model:mail.template,body_html:hr_course.mail_template_validity_reminder
msgid ""
"<div>\n"
" <p>Hi,</p>\n"
" <p>The validity time of the course ${object.name} will end "
"up soon. You maybe need to plan a new one. </p>\n"
" <p>The concerned employees are:</p>\n"
" % for employee in object.course_attendee_ids."
"mapped(\"employee_id.name\"):\n"
" <p>${employee}</p>\n"
" % endfor\n"
" </div>\n"
" "
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__absent
msgid "Absent"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction
msgid "Action Needed"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__active
msgid "Active"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_ids
msgid "Activities"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_state
msgid "Activity State"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Activity Type Icon"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_alerting_delay
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_alerting_delay
msgid "Alerting delay before end of validity (days)"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Assign attendees"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_attachment_count
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_attachment_count
msgid "Attachment Count"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__attendant_ids
msgid "Attendant"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Attendees"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__authorized_by
msgid "Authorized by"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Back to Draft"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancel Course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__cancelled
msgid "Cancelled"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancelled Course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__category_id
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Category"
msgstr ""
#. module: hr_course
#: model:ir.model.constraint,message:hr_course.constraint_hr_course_category_name_uniq
msgid "Category already exists !"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__comment
msgid "Comment"
msgstr ""
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_company
msgid "Companies"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Complete Course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__completed
msgid "Completed"
msgstr ""
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__content
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Content"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Convocatory"
msgstr ""
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_id
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course"
msgstr ""
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_attendee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_attendee_ids
msgid "Course Attendee"
msgstr ""
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.open_view_course_category_form
#: model:ir.ui.menu,name:hr_course.menu_view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Course Categories"
msgstr ""
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_category
msgid "Course Category"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__cost
msgid "Course Cost"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_expiration_alert_sent
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_expiration_alert_sent
msgid "Course Expiration Alert Sent"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course Name"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Course Results"
msgstr ""
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_schedule
#: model:ir.model.fields,field_description:hr_course.field_hr_course__course_schedule_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_schedule_id
msgid "Course Schedule"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__name
msgid "Course category"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Course name"
msgstr ""
#. module: hr_course
#: model:mail.channel,name:hr_course.mail_channel_course_validity
msgid "Course validity expiration notification"
msgstr ""
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course
#: model:ir.actions.act_window,name:hr_course.action_view_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__courses_ids
#: model:ir.ui.menu,name:hr_course.menu_hr_course
#: model:ir.ui.menu,name:hr_course.menu_hr_course_courses
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_hr_employee_form
msgid "Courses"
msgstr ""
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course_schedule
#: model:ir.ui.menu,name:hr_course.menu_hr_course_schedule
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Courses Schedule"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_uid
msgid "Created by"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_date
msgid "Created on"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__currency_id
msgid "Currency"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_company__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__display_name
msgid "Display Name"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__draft
msgid "Draft"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Draft Course"
msgstr ""
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_employee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__employee_id
msgid "Employee"
msgstr ""
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "Employees removed from this course: <br></br>%s"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_end
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__end_date
msgid "End date"
msgstr ""
#. module: hr_course
#: model:mail.template,subject:hr_course.mail_template_validity_reminder
msgid "End of validity for a course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__evaluation_criteria
msgid "Evaluation Criteria"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Evaluation criteria"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__failed
msgid "Failed"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_follower_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_follower_ids
msgid "Followers"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_channel_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_channel_ids
msgid "Followers (Channels)"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_partner_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_partner_ids
msgid "Followers (Partners)"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks"
msgstr ""
#. module: hr_course
#: model:ir.actions.server,name:hr_course.ir_cron_post_wip_ir_actions_server
#: model:ir.cron,cron_name:hr_course.ir_cron_post_wip
#: model:ir.cron,name:hr_course.ir_cron_post_wip
msgid "HR Course: Check validity date"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence
msgid "Has Permanence"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__id
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__id
#: model:ir.model.fields,field_description:hr_course.field_res_company__id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__id
msgid "ID"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread
msgid "If checked, new messages require your attention."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_progress
msgid "In progress"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_validation
msgid "In validation"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__instructor_ids
msgid "Instructor"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Internal notes"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_is_follower
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_is_follower
msgid "Is Follower"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_employee____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_company____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings____last_update
msgid "Last Modified on"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_uid
msgid "Last Updated by"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_date
msgid "Last Updated on"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_channel_id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_channel_id
msgid "Mailing list to alert"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_main_attachment_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_main_attachment_id
msgid "Main Attachment"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_ids
msgid "Messages"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__my_activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__my_activity_date_deadline
msgid "My Activity Deadline"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__name
msgid "Name"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_date_deadline
msgid "Next Activity Deadline"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_summary
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_summary
msgid "Next Activity Summary"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_id
msgid "Next Activity Type"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__note
msgid "Note"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of Actions"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__count_courses
msgid "Number of courses"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of errors"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Number of unread messages"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__objective
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Objective"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Pass everybody"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__passed
msgid "Passed"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__pending
msgid "Pending"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence_time
msgid "Permanence time"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__place
msgid "Place"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Rate Course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_user_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_user_id
msgid "Responsible User"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__result
msgid "Result"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Schedules"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course_attendee__course_expiration_alert_sent
msgid "Shows if notification email for course was sent"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Start Course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_start
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__start_date
msgid "Start date"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__state
msgid "State"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_state
msgid ""
"Status based on activities\n"
"Overdue: Due date is already passed\n"
"Today: Activity date is today\n"
"Planned: Future activities."
msgstr ""
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "The start date cannot be later than the end date."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__training_company_id
msgid "Training company"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Type of the exception activity on record."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread
msgid "Unread Messages"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Unread Messages Counter"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_validity_end_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__validity_end_date
msgid "Validity End Date"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__waiting_attendees
msgid "Waiting attendees"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website Messages"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website communication history"
msgstr ""
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "You cannot complete the course with pending results"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid ""
"You should set a course back to draft only if you cancelled it by mistake or "
"if some of its information is incorrect. Do you want to continue?"
msgstr ""

View File

@ -0,0 +1,744 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_course
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-21 09:30+0000\n"
"PO-Revision-Date: 2024-02-18 18:36+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\n"
#. module: hr_course
#: model:mail.template,body_html:hr_course.mail_template_validity_reminder
msgid ""
"<div>\n"
" <p>Hi,</p>\n"
" <p>The validity time of the course ${object.name} will end "
"up soon. You maybe need to plan a new one. </p>\n"
" <p>The concerned employees are:</p>\n"
" % for employee in object.course_attendee_ids."
"mapped(\"employee_id.name\"):\n"
" <p>${employee}</p>\n"
" % endfor\n"
" </div>\n"
" "
msgstr ""
"<div>\n"
" <p>Hola,</p>\n"
" <p>El tiempo de validez del curso ${object.name} finalizará "
"pronto. Quizás necesites planificar uno nuevo. </p>\n"
" <p>Los empleados afectados son:</p>\n"
" % para empleado en object.course_attendee_ids.mapped("
"\"employee_id.name\"):\n"
" <p>${employee}</p>\n"
" % final para\n"
" </div>\n"
" "
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__absent
msgid "Absent"
msgstr "Ausente"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction
msgid "Action Needed"
msgstr "Acción necesaria"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__active
msgid "Active"
msgstr "Activo"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_ids
msgid "Activities"
msgstr "Actividades"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr "Decoración de Excepción de la Actividad"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_state
msgid "Activity State"
msgstr "Estado de la Actividad"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Activity Type Icon"
msgstr "Icono de Tipo de Actividad"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_alerting_delay
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_alerting_delay
msgid "Alerting delay before end of validity (days)"
msgstr "Plazo de alerta antes del fin de validez (días)"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Assign attendees"
msgstr "Asignar asistentes"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_attachment_count
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_attachment_count
msgid "Attachment Count"
msgstr "Recuento de archivos adjuntos"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__attendant_ids
msgid "Attendant"
msgstr "Asistente"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Attendees"
msgstr "Asistentes"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__authorized_by
msgid "Authorized by"
msgstr "Autorizado por"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Back to Draft"
msgstr "Devolver a borrador"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancel Course"
msgstr "Cancelar curso"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__cancelled
msgid "Cancelled"
msgstr "Cancelado"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancelled Course"
msgstr "Curso cancelado"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__category_id
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Category"
msgstr "Categoría"
#. module: hr_course
#: model:ir.model.constraint,message:hr_course.constraint_hr_course_category_name_uniq
msgid "Category already exists !"
msgstr "Esta categoría ya existe !"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__comment
msgid "Comment"
msgstr "Comentario"
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Complete Course"
msgstr "Curso finalizado"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__completed
msgid "Completed"
msgstr "Finalizado"
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_config_settings
msgid "Config Settings"
msgstr "Ajustes Config"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__content
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Content"
msgstr "Contenido"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Convocatory"
msgstr "Convocatoria"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_id
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course"
msgstr "Curso"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_attendee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_attendee_ids
msgid "Course Attendee"
msgstr "Asistente al curso"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.open_view_course_category_form
#: model:ir.ui.menu,name:hr_course.menu_view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Course Categories"
msgstr "Tipos de cursos"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_category
msgid "Course Category"
msgstr "Tipo de curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__cost
msgid "Course Cost"
msgstr "Coste del curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_expiration_alert_sent
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_expiration_alert_sent
msgid "Course Expiration Alert Sent"
msgstr "Alerta de Expiración de Curso Enviada"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course Name"
msgstr "Nombre del curso"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Course Results"
msgstr "Resultado del curso"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_schedule
#: model:ir.model.fields,field_description:hr_course.field_hr_course__course_schedule_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_schedule_id
msgid "Course Schedule"
msgstr "Calendario de cursos"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__name
msgid "Course category"
msgstr "Tipo del curso"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Course name"
msgstr "Nombre del curso"
#. module: hr_course
#: model:mail.channel,name:hr_course.mail_channel_course_validity
msgid "Course validity expiration notification"
msgstr "Notificación de expiración de validez del curso"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course
#: model:ir.actions.act_window,name:hr_course.action_view_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__courses_ids
#: model:ir.ui.menu,name:hr_course.menu_hr_course
#: model:ir.ui.menu,name:hr_course.menu_hr_course_courses
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_hr_employee_form
msgid "Courses"
msgstr "Cursos"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course_schedule
#: model:ir.ui.menu,name:hr_course.menu_hr_course_schedule
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Courses Schedule"
msgstr "Calendario de cursos"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_date
msgid "Created on"
msgstr "Creado en"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__currency_id
msgid "Currency"
msgstr "Moneda"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_company__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__display_name
msgid "Display Name"
msgstr "Nombre a mostrar"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__draft
msgid "Draft"
msgstr "Borrador"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Draft Course"
msgstr "Curso en borrador"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_employee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__employee_id
msgid "Employee"
msgstr "Empleado"
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "Employees removed from this course: <br></br>%s"
msgstr "Empleados eliminados de este curso: <br></br>%s"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_end
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__end_date
msgid "End date"
msgstr "Fecha final"
#. module: hr_course
#: model:mail.template,subject:hr_course.mail_template_validity_reminder
msgid "End of validity for a course"
msgstr "Fin de validez de un curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__evaluation_criteria
msgid "Evaluation Criteria"
msgstr "Criterios de evaluación"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Evaluation criteria"
msgstr "Criterios de evaluación"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__failed
msgid "Failed"
msgstr "Suspendido"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_follower_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_follower_ids
msgid "Followers"
msgstr "Seguidores"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_channel_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_channel_ids
msgid "Followers (Channels)"
msgstr "Seguidores (Canales)"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_partner_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_partner_ids
msgid "Followers (Partners)"
msgstr "Seguidores (Socios)"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks"
msgstr "Fuente Iconos Sorprendentes , por ejemplo fa-tasks"
#. module: hr_course
#: model:ir.actions.server,name:hr_course.ir_cron_post_wip_ir_actions_server
#: model:ir.cron,cron_name:hr_course.ir_cron_post_wip
#: model:ir.cron,name:hr_course.ir_cron_post_wip
msgid "HR Course: Check validity date"
msgstr "Curso de RRHH: Comprobar fecha de validez"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence
msgid "Has Permanence"
msgstr "Tiene permanencia"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__id
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__id
#: model:ir.model.fields,field_description:hr_course.field_res_company__id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__id
msgid "ID"
msgstr "ID"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon"
msgstr "Icono"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr "Icono para indicar la excepción de la actividad."
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread
msgid "If checked, new messages require your attention."
msgstr "Si está marcado, los nuevos mensajes requieren su atención."
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr "Si está marcado, algunos mensajes tienen un error de entrega."
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_progress
msgid "In progress"
msgstr "En progreso"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_validation
msgid "In validation"
msgstr "En corrección"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__instructor_ids
msgid "Instructor"
msgstr "Instructor"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Internal notes"
msgstr "Notas internas"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_is_follower
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_is_follower
msgid "Is Follower"
msgstr "Es Seguidor"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_employee____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_company____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_uid
msgid "Last Updated by"
msgstr "Última actualización de"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_date
msgid "Last Updated on"
msgstr "Última actualización en"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_channel_id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_channel_id
msgid "Mailing list to alert"
msgstr "Lista de correo para alertar"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_main_attachment_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_main_attachment_id
msgid "Main Attachment"
msgstr "Archivo adjunto principal"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error
msgid "Message Delivery error"
msgstr "Error de entrega de mensajes"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_ids
msgid "Messages"
msgstr "Mensajes"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__my_activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__my_activity_date_deadline
msgid "My Activity Deadline"
msgstr "Fecha Límite de mi Actividad"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__name
msgid "Name"
msgstr "Nombre"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_date_deadline
msgid "Next Activity Deadline"
msgstr "Fecha Límite de la Siguiente Actividad"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_summary
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_summary
msgid "Next Activity Summary"
msgstr "Resumen de Próxima Actividad"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_id
msgid "Next Activity Type"
msgstr "Tipo Actividad Siguiente"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__note
msgid "Note"
msgstr "Nota"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of Actions"
msgstr "Número de acciones"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__count_courses
msgid "Number of courses"
msgstr "Número de cursos"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of errors"
msgstr "Número de errores"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr "Número de mensajes que requieren una acción"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr "Número de mensajes con error de entrega"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Number of unread messages"
msgstr "Número de mensajes no leídos"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__objective
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Objective"
msgstr "Objetivo"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Pass everybody"
msgstr "Todos aprobados"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__passed
msgid "Passed"
msgstr "Aprobado"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__pending
msgid "Pending"
msgstr "Pendiente"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence_time
msgid "Permanence time"
msgstr "Tiempo de permanencia"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__place
msgid "Place"
msgstr "Lugar"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Rate Course"
msgstr "Corregir curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_user_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_user_id
msgid "Responsible User"
msgstr "Usuario Responsable"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__result
msgid "Result"
msgstr "Resultado"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Schedules"
msgstr "Horarios"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course_attendee__course_expiration_alert_sent
msgid "Shows if notification email for course was sent"
msgstr ""
"Muestra si se ha enviado el correo electrónico de notificación del curso"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Start Course"
msgstr "Empezar curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_start
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__start_date
msgid "Start date"
msgstr "Fecha de inicio"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__state
msgid "State"
msgstr "Estado"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_state
msgid ""
"Status based on activities\n"
"Overdue: Due date is already passed\n"
"Today: Activity date is today\n"
"Planned: Future activities."
msgstr ""
"Status basado en actividades\n"
"Atrasado: La fecha de entrega ya ha pasado\n"
"Hoy: Fecha de actividad es hoy\n"
"Planeado: Actividades futuras."
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "The start date cannot be later than the end date."
msgstr "La fecha de inicio no puede ser posterior a la de fin."
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__training_company_id
msgid "Training company"
msgstr "Empresa de formación"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Type of the exception activity on record."
msgstr "Tipo de actividad excepcional registrada."
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread
msgid "Unread Messages"
msgstr "Mensajes sin leer"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Unread Messages Counter"
msgstr "Contador de mensajes no leídos"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_validity_end_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__validity_end_date
msgid "Validity End Date"
msgstr "Fecha Fin de Validez"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__waiting_attendees
msgid "Waiting attendees"
msgstr "Esperando asistentes"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website Messages"
msgstr "Mensajes del sitio web"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website communication history"
msgstr "Historial de comunicación del sitio web"
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "You cannot complete the course with pending results"
msgstr "No se puede finalizar el curso con resultados pendientes"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid ""
"You should set a course back to draft only if you cancelled it by mistake or "
"if some of its information is incorrect. Do you want to continue?"
msgstr ""
"Solo deberías devolver un curso a borrador si se ha cancelado por error o si "
"alguna de su información es incorrecta. Quieres continuar?"
#~ msgid "SMS Delivery error"
#~ msgstr "Error de entrega de SMS"
#~ msgid "hr.course"
#~ msgstr "hr.course"
#~ msgid "hr.course.attendee"
#~ msgstr "hr.course.attendee"
#~ msgid "hr.course.result"
#~ msgstr "hr.course.result"

View File

@ -0,0 +1,747 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_course
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-05-30 16:05+0000\n"
"Last-Translator: Khalid Hazam <k.hazam@badep.ma>\n"
"Language-Team: none\n"
"Language: fr\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"
"X-Generator: Weblate 4.3.2\n"
#. module: hr_course
#: model:mail.template,body_html:hr_course.mail_template_validity_reminder
msgid ""
"<div>\n"
" <p>Hi,</p>\n"
" <p>The validity time of the course ${object.name} will end "
"up soon. You maybe need to plan a new one. </p>\n"
" <p>The concerned employees are:</p>\n"
" % for employee in object.course_attendee_ids."
"mapped(\"employee_id.name\"):\n"
" <p>${employee}</p>\n"
" % endfor\n"
" </div>\n"
" "
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__absent
msgid "Absent"
msgstr "Absent"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction
msgid "Action Needed"
msgstr "Besoin d'action"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__active
msgid "Active"
msgstr "Actif"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_ids
msgid "Activities"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_state
msgid "Activity State"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Activity Type Icon"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_alerting_delay
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_alerting_delay
msgid "Alerting delay before end of validity (days)"
msgstr "Délai d'alerte avant fin de validité (en jour)"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Assign attendees"
msgstr "Affecter des participants"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_attachment_count
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_attachment_count
msgid "Attachment Count"
msgstr "Nombre de pièces jointes"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__attendant_ids
msgid "Attendant"
msgstr "Participant"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Attendees"
msgstr "Participants"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__authorized_by
msgid "Authorized by"
msgstr "Autorisé par"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Back to Draft"
msgstr "Retour en Brouillon"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancel Course"
msgstr "Annuler formation"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__cancelled
msgid "Cancelled"
msgstr "Annulée"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancelled Course"
msgstr "Formation annulée"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__category_id
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Category"
msgstr "Catégorie"
#. module: hr_course
#: model:ir.model.constraint,message:hr_course.constraint_hr_course_category_name_uniq
msgid "Category already exists !"
msgstr "La catégorie existe déjà !"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__comment
msgid "Comment"
msgstr "Commentaire"
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_company
msgid "Companies"
msgstr "Sociétés"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Complete Course"
msgstr "Formation terminée"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__completed
msgid "Completed"
msgstr "Terminée"
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_config_settings
msgid "Config Settings"
msgstr "Paramètres de config"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__content
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Content"
msgstr "Contenu"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Convocatory"
msgstr "Convocataire"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_id
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course"
msgstr "Formation"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_attendee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_attendee_ids
msgid "Course Attendee"
msgstr "Participant à la formation"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.open_view_course_category_form
#: model:ir.ui.menu,name:hr_course.menu_view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Course Categories"
msgstr "Catégories de formation"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_category
msgid "Course Category"
msgstr "Catégorie de formation"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__cost
msgid "Course Cost"
msgstr "Coût de la formation"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_expiration_alert_sent
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_expiration_alert_sent
msgid "Course Expiration Alert Sent"
msgstr "Alerte d'expiration de formation"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course Name"
msgstr "Nom de la formation"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Course Results"
msgstr "Résultats de la formation"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_schedule
#: model:ir.model.fields,field_description:hr_course.field_hr_course__course_schedule_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_schedule_id
msgid "Course Schedule"
msgstr "Planing de formation"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__name
msgid "Course category"
msgstr "Catégorie de formation"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Course name"
msgstr "Nom de la formation"
#. module: hr_course
#: model:mail.channel,name:hr_course.mail_channel_course_validity
msgid "Course validity expiration notification"
msgstr "Alerte de fin de validité"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course
#: model:ir.actions.act_window,name:hr_course.action_view_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__courses_ids
#: model:ir.ui.menu,name:hr_course.menu_hr_course
#: model:ir.ui.menu,name:hr_course.menu_hr_course_courses
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_hr_employee_form
msgid "Courses"
msgstr "Formations"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course_schedule
#: model:ir.ui.menu,name:hr_course.menu_hr_course_schedule
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Courses Schedule"
msgstr "Planning de formation"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_uid
msgid "Created by"
msgstr "Créée par"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_date
msgid "Created on"
msgstr "Créée le"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__currency_id
msgid "Currency"
msgstr "Devise"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_company__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__draft
msgid "Draft"
msgstr "Brouillon"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Draft Course"
msgstr "Formation en brouillon"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_employee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__employee_id
msgid "Employee"
msgstr "Employé"
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "Employees removed from this course: <br></br>%s"
msgstr "Employés retirés de cette formation: <br></br>%s"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_end
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__end_date
msgid "End date"
msgstr "Date de fin"
#. module: hr_course
#: model:mail.template,subject:hr_course.mail_template_validity_reminder
msgid "End of validity for a course"
msgstr "Date de fin de validité"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__evaluation_criteria
msgid "Evaluation Criteria"
msgstr "Critères d'évaluation"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Evaluation criteria"
msgstr "Critères d'évaluation"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__failed
msgid "Failed"
msgstr "Echec"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_follower_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_follower_ids
msgid "Followers"
msgstr "Abonnés"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_channel_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_channel_ids
msgid "Followers (Channels)"
msgstr "Abonnés (Canals)"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_partner_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_partner_ids
msgid "Followers (Partners)"
msgstr "Abonnés (Contacts)"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks"
msgstr ""
#. module: hr_course
#: model:ir.actions.server,name:hr_course.ir_cron_post_wip_ir_actions_server
#: model:ir.cron,cron_name:hr_course.ir_cron_post_wip
#: model:ir.cron,name:hr_course.ir_cron_post_wip
msgid "HR Course: Check validity date"
msgstr "Formation: Vérification des dates de fin de validité"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence
msgid "Has Permanence"
msgstr "Permanent"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__id
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__id
#: model:ir.model.fields,field_description:hr_course.field_res_company__id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__id
msgid "ID"
msgstr "ID"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread
msgid "If checked, new messages require your attention."
msgstr "Si coché, de nouveaux messages doivent être consultés"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr "Si coché, certains messages n'ont pu être délivré (Erreur)"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_progress
msgid "In progress"
msgstr "En Cours"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_validation
msgid "In validation"
msgstr "En validation"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__instructor_ids
msgid "Instructor"
msgstr "Professeur"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Internal notes"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_is_follower
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_is_follower
msgid "Is Follower"
msgstr "Est Abonné"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_employee____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_company____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings____last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_channel_id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_channel_id
msgid "Mailing list to alert"
msgstr "List de personne à alerter"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_main_attachment_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_main_attachment_id
msgid "Main Attachment"
msgstr "Pièces jointes principales"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error
msgid "Message Delivery error"
msgstr "Erreur de livraison Message"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_ids
msgid "Messages"
msgstr "Messages"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__my_activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__my_activity_date_deadline
msgid "My Activity Deadline"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__name
msgid "Name"
msgstr "Nom"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_date_deadline
msgid "Next Activity Deadline"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_summary
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_summary
msgid "Next Activity Summary"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_id
msgid "Next Activity Type"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__note
msgid "Note"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of Actions"
msgstr "Nombre d'actions"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__count_courses
msgid "Number of courses"
msgstr "Nombre de formations"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of errors"
msgstr "Nombre d'erreurs"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr "Nombre de messages qui doivent être consultés"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr "Nombre de messages avec une erreur de livraison"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Number of unread messages"
msgstr "Nombre de messages non lus"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__objective
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Objective"
msgstr "But"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Pass everybody"
msgstr "Valider tout le monde"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__passed
msgid "Passed"
msgstr "Validé"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__pending
msgid "Pending"
msgstr "En attente"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence_time
msgid "Permanence time"
msgstr "temps de permanence"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__place
msgid "Place"
msgstr "Lieu"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Rate Course"
msgstr "Evaluer la formation"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_user_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_user_id
msgid "Responsible User"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__result
msgid "Result"
msgstr "Résultat"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Schedules"
msgstr "Planning"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course_attendee__course_expiration_alert_sent
msgid "Shows if notification email for course was sent"
msgstr "Afficher si des mails de notifications ont été envoyés"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Start Course"
msgstr "Démarrer la formation"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_start
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__start_date
msgid "Start date"
msgstr "Date de début"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__state
msgid "State"
msgstr "Etat"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_state
msgid ""
"Status based on activities\n"
"Overdue: Due date is already passed\n"
"Today: Activity date is today\n"
"Planned: Future activities."
msgstr ""
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "The start date cannot be later than the end date."
msgstr "La date de début ne peut être après la date de fin"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__training_company_id
msgid "Training company"
msgstr "Société de formation"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Type of the exception activity on record."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread
msgid "Unread Messages"
msgstr "Messages non lus"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Unread Messages Counter"
msgstr "Nombre de messages non lus"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_validity_end_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__validity_end_date
msgid "Validity End Date"
msgstr "Date de fin de validité"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__waiting_attendees
msgid "Waiting attendees"
msgstr "En attente des participants"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website Messages"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website communication history"
msgstr ""
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "You cannot complete the course with pending results"
msgstr ""
"Vous ne pouvez pas terminer la formation tant que des évaluations sont "
"manquantes"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid ""
"You should set a course back to draft only if you cancelled it by mistake or "
"if some of its information is incorrect. Do you want to continue?"
msgstr ""
"Vous devriez repasser une formation à l'état brouillon seulement si vous "
"l'avez annulée par erreur ou si certaines des informations entrées sont "
"incorrectes. Voulez-vous continuer?"
#~ msgid ""
#~ "<div>\n"
#~ " <p>Hi,</p>\n"
#~ " <p>The validity time of the course ${object.name} "
#~ "will end up soon. You maybe need to plan a new one. </p>\n"
#~ " <p>The concerned employees are:</p>\n"
#~ " % for employee in object.course_attendee_ids."
#~ "mapped(\"employee_id.name\"):\n"
#~ " <p>${employee}</p>\n"
#~ " % endfor\n"
#~ " </div>\n"
#~ " "
#~ msgstr ""
#~ "<div>\n"
#~ " <p>Bonjour</p>\n"
#~ " <p>La durée de validité de la formation ${object."
#~ "name} arrive à son terme. Vous avez peut-être besoin de la replanifier. </"
#~ "p>\n"
#~ " <p>Les employés concernés sont:</p>\n"
#~ " % for employee in object.course_attendee_ids."
#~ "mapped(\"employee_id.name\"):\n"
#~ " <p>${employee}</p>\n"
#~ " % endfor\n"
#~ " </div>\n"
#~ " "
#~ msgid "Convocation"
#~ msgstr "Convocation"

View File

@ -0,0 +1,733 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_course
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-10-13 10:36+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\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"
"X-Generator: Weblate 4.17\n"
#. module: hr_course
#: model:mail.template,body_html:hr_course.mail_template_validity_reminder
msgid ""
"<div>\n"
" <p>Hi,</p>\n"
" <p>The validity time of the course ${object.name} will end "
"up soon. You maybe need to plan a new one. </p>\n"
" <p>The concerned employees are:</p>\n"
" % for employee in object.course_attendee_ids."
"mapped(\"employee_id.name\"):\n"
" <p>${employee}</p>\n"
" % endfor\n"
" </div>\n"
" "
msgstr ""
"<div>\n"
" <p>Hi,</p>\n"
" <p>Il tempo di validità del corso ${object.name} scadrà "
"presto. Forse devi pianificarne uno nuovo </p>\n"
" <p>I dipendenti interessati sono:</p>\n"
" % for employee in object.course_attendee_ids."
"mapped(\"employee_id.name\"):\n"
" <p>${employee}</p>\n"
" % endfor\n"
" </div>\n"
" "
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__absent
msgid "Absent"
msgstr "Assente"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction
msgid "Action Needed"
msgstr "Azione richiesta"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__active
msgid "Active"
msgstr "Attivo"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_ids
msgid "Activities"
msgstr "Attività"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr "Decorazione eccezione attività"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_state
msgid "Activity State"
msgstr "Stato attività"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Activity Type Icon"
msgstr "Icona tipo attività"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_alerting_delay
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_alerting_delay
msgid "Alerting delay before end of validity (days)"
msgstr "Avviso ritardo prima della fine della validità (giorni)"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Assign attendees"
msgstr "Assegna partecipanti"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_attachment_count
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_attachment_count
msgid "Attachment Count"
msgstr "Numero allegati"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__attendant_ids
msgid "Attendant"
msgstr "Partecipante"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Attendees"
msgstr "Partecipanti"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__authorized_by
msgid "Authorized by"
msgstr "Autorizzato da"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Back to Draft"
msgstr "Ritorna a bozza"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancel Course"
msgstr "Annulla corso"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__cancelled
msgid "Cancelled"
msgstr "Annullato"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancelled Course"
msgstr "Corso annullato"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__category_id
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Category"
msgstr "Categoria"
#. module: hr_course
#: model:ir.model.constraint,message:hr_course.constraint_hr_course_category_name_uniq
msgid "Category already exists !"
msgstr "Categoria già esistente !"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__comment
msgid "Comment"
msgstr "Commento"
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_company
msgid "Companies"
msgstr "Aziende"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Complete Course"
msgstr "Completa corso"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__completed
msgid "Completed"
msgstr "Completato"
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_config_settings
msgid "Config Settings"
msgstr "Impostazioni di configurazione"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__content
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Content"
msgstr "Contenuto"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Convocatory"
msgstr "Convocazione"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_id
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course"
msgstr "Corso"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_attendee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_attendee_ids
msgid "Course Attendee"
msgstr "Partecipante al corso"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.open_view_course_category_form
#: model:ir.ui.menu,name:hr_course.menu_view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Course Categories"
msgstr "Categorie corso"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_category
msgid "Course Category"
msgstr "Categoria corso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__cost
msgid "Course Cost"
msgstr "Costo corso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_expiration_alert_sent
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_expiration_alert_sent
msgid "Course Expiration Alert Sent"
msgstr "Avviso di scadenza del corso inviato"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course Name"
msgstr "Nome corso"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Course Results"
msgstr "Risultati corso"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_schedule
#: model:ir.model.fields,field_description:hr_course.field_hr_course__course_schedule_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_schedule_id
msgid "Course Schedule"
msgstr "Calendario corso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__name
msgid "Course category"
msgstr "Categoria corso"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Course name"
msgstr "Nome corso"
#. module: hr_course
#: model:mail.channel,name:hr_course.mail_channel_course_validity
msgid "Course validity expiration notification"
msgstr "Avviso di scadenza della validità del corso"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course
#: model:ir.actions.act_window,name:hr_course.action_view_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__courses_ids
#: model:ir.ui.menu,name:hr_course.menu_hr_course
#: model:ir.ui.menu,name:hr_course.menu_hr_course_courses
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_hr_employee_form
msgid "Courses"
msgstr "Corsi"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course_schedule
#: model:ir.ui.menu,name:hr_course.menu_hr_course_schedule
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Courses Schedule"
msgstr "Calendario corsi"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_date
msgid "Created on"
msgstr "Creato il"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__currency_id
msgid "Currency"
msgstr "Valuta"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_company__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__draft
msgid "Draft"
msgstr "Bozza"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Draft Course"
msgstr "Corso bozza"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_employee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__employee_id
msgid "Employee"
msgstr "Dipendente"
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "Employees removed from this course: <br></br>%s"
msgstr "Dipendenti rimossi da questo corso: <br></br>%s"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_end
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__end_date
msgid "End date"
msgstr "Data fine"
#. module: hr_course
#: model:mail.template,subject:hr_course.mail_template_validity_reminder
msgid "End of validity for a course"
msgstr "Fine validità per un corso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__evaluation_criteria
msgid "Evaluation Criteria"
msgstr "Criteri di valutazione"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Evaluation criteria"
msgstr "Criteri di valutazione"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__failed
msgid "Failed"
msgstr "Non superato"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_follower_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_follower_ids
msgid "Followers"
msgstr "Seguito da"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_channel_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_channel_ids
msgid "Followers (Channels)"
msgstr "Seguito da (canali)"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_partner_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_partner_ids
msgid "Followers (Partners)"
msgstr "Seguito da (partner)"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks"
msgstr "Icona Font Awesome es. fa-tasks"
#. module: hr_course
#: model:ir.actions.server,name:hr_course.ir_cron_post_wip_ir_actions_server
#: model:ir.cron,cron_name:hr_course.ir_cron_post_wip
#: model:ir.cron,name:hr_course.ir_cron_post_wip
msgid "HR Course: Check validity date"
msgstr "Corso HR: verifica la data di validità"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence
msgid "Has Permanence"
msgstr "Ha frequenza"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__id
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__id
#: model:ir.model.fields,field_description:hr_course.field_res_company__id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__id
msgid "ID"
msgstr "ID"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon"
msgstr "Icona"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr "Icona per indicare un'attività eccezione."
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread
msgid "If checked, new messages require your attention."
msgstr "Se selezionata, nuovi messaggi richiedono attenzione."
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna."
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_progress
msgid "In progress"
msgstr "In corso"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_validation
msgid "In validation"
msgstr "In validazione"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__instructor_ids
msgid "Instructor"
msgstr "Docente"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Internal notes"
msgstr "Note interne"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_is_follower
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_is_follower
msgid "Is Follower"
msgstr "Segue"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_employee____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_company____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_channel_id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_channel_id
msgid "Mailing list to alert"
msgstr "Mailing list per avvisi"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_main_attachment_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_main_attachment_id
msgid "Main Attachment"
msgstr "Allegato principale"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error
msgid "Message Delivery error"
msgstr "Errore di consegna messaggio"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_ids
msgid "Messages"
msgstr "Messaggi"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__my_activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__my_activity_date_deadline
msgid "My Activity Deadline"
msgstr "Scadenza mia attività"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__name
msgid "Name"
msgstr "Nome"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_date_deadline
msgid "Next Activity Deadline"
msgstr "Scadenza prossima attività"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_summary
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_summary
msgid "Next Activity Summary"
msgstr "Riepilogo prossima attività"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_id
msgid "Next Activity Type"
msgstr "Tipo prossima attività"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__note
msgid "Note"
msgstr "Nota"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of Actions"
msgstr "Numero di azioni"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__count_courses
msgid "Number of courses"
msgstr "Numero di corsi"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of errors"
msgstr "Numero di errori"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr "Numero di messaggi che richiedono un'azione"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr "Numero di messaggi con errore di consegna"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Number of unread messages"
msgstr "Numero di messaggi non letti"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__objective
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Objective"
msgstr "Obbiettivo"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Pass everybody"
msgstr "Promuovi tutti"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__passed
msgid "Passed"
msgstr "Superato"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__pending
msgid "Pending"
msgstr "In attesa"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence_time
msgid "Permanence time"
msgstr "Tempo frequenza"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__place
msgid "Place"
msgstr "Luogo"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Rate Course"
msgstr "Valuta il corso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_user_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_user_id
msgid "Responsible User"
msgstr "Utente responsabile"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__result
msgid "Result"
msgstr "Risultato"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Schedules"
msgstr "Calendari"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course_attendee__course_expiration_alert_sent
msgid "Shows if notification email for course was sent"
msgstr "Mostra se è stata inviata un'e-mail di notifica per il corso"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Start Course"
msgstr "Inizia corso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_start
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__start_date
msgid "Start date"
msgstr "Data inizio"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__state
msgid "State"
msgstr "Stato"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_state
msgid ""
"Status based on activities\n"
"Overdue: Due date is already passed\n"
"Today: Activity date is today\n"
"Planned: Future activities."
msgstr ""
"Stato in base alle attività\n"
"Scaduto: la data richiesta è trascorsa\n"
"Oggi: la data attività è oggi\n"
"Pianificato: attività future."
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "The start date cannot be later than the end date."
msgstr "La data di inizio non può essere successiva alla data di fine."
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__training_company_id
msgid "Training company"
msgstr "Azienda formatrice"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Type of the exception activity on record."
msgstr "Tipo di attività eccezione sul record."
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread
msgid "Unread Messages"
msgstr "Messaggi non letti"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Unread Messages Counter"
msgstr "Contatore messaggi non letti"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_validity_end_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__validity_end_date
msgid "Validity End Date"
msgstr "Data di fine validità"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__waiting_attendees
msgid "Waiting attendees"
msgstr "Partecipanti in attesa"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website Messages"
msgstr "Messaggi sito web"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website communication history"
msgstr "Cronologia comunicazioni sito web"
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "You cannot complete the course with pending results"
msgstr "Non puoi completare il corso con risultati in sospeso"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid ""
"You should set a course back to draft only if you cancelled it by mistake or "
"if some of its information is incorrect. Do you want to continue?"
msgstr ""
"Si dovrebbe reimpostare un corso come bozza solo se lo si è cancellato per "
"errore o se alcune sue informazioni non sono corrette. Continuare?"
#~ msgid "SMS Delivery error"
#~ msgstr "Errore consegna SMS"

View File

@ -0,0 +1,718 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_course
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-09-14 19:07+0000\n"
"Last-Translator: Pedro Castro Silva <pedrocs@exo.pt>\n"
"Language-Team: none\n"
"Language: pt\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"
"X-Generator: Weblate 4.3.2\n"
#. module: hr_course
#: model:mail.template,body_html:hr_course.mail_template_validity_reminder
msgid ""
"<div>\n"
" <p>Hi,</p>\n"
" <p>The validity time of the course ${object.name} will end "
"up soon. You maybe need to plan a new one. </p>\n"
" <p>The concerned employees are:</p>\n"
" % for employee in object.course_attendee_ids."
"mapped(\"employee_id.name\"):\n"
" <p>${employee}</p>\n"
" % endfor\n"
" </div>\n"
" "
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__absent
msgid "Absent"
msgstr "Ausente"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction
msgid "Action Needed"
msgstr "Ação Necessária"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__active
msgid "Active"
msgstr "Ativo"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_ids
msgid "Activities"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_state
msgid "Activity State"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Activity Type Icon"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_alerting_delay
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_alerting_delay
msgid "Alerting delay before end of validity (days)"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Assign attendees"
msgstr "Atribuir participantes"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_attachment_count
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_attachment_count
msgid "Attachment Count"
msgstr "Número de Anexos"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__attendant_ids
msgid "Attendant"
msgstr "Participante"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Attendees"
msgstr "Participantes"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__authorized_by
msgid "Authorized by"
msgstr "Autorizado por"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Back to Draft"
msgstr "Voltar a Rascunho"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancel Course"
msgstr "Cancelar Curso"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__cancelled
msgid "Cancelled"
msgstr "Cancelado"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancelled Course"
msgstr "Curso Cancelado"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__category_id
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Category"
msgstr "Categoria"
#. module: hr_course
#: model:ir.model.constraint,message:hr_course.constraint_hr_course_category_name_uniq
msgid "Category already exists !"
msgstr "A categoria já existe !"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__comment
msgid "Comment"
msgstr "Comentário"
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_company
msgid "Companies"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Complete Course"
msgstr "Curso Completo"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__completed
msgid "Completed"
msgstr "Completado"
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__content
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Content"
msgstr "Conteúdo"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Convocatory"
msgstr "Convocatória"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_id
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course"
msgstr "Curso"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_attendee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_attendee_ids
msgid "Course Attendee"
msgstr "Participante do Curso"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.open_view_course_category_form
#: model:ir.ui.menu,name:hr_course.menu_view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Course Categories"
msgstr "Categorias de Cursos"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_category
msgid "Course Category"
msgstr "Categoria do Curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__cost
msgid "Course Cost"
msgstr "Custo do Curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_expiration_alert_sent
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_expiration_alert_sent
msgid "Course Expiration Alert Sent"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course Name"
msgstr "Nome do Curso"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Course Results"
msgstr "Resultados do Curso"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_schedule
#: model:ir.model.fields,field_description:hr_course.field_hr_course__course_schedule_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_schedule_id
msgid "Course Schedule"
msgstr "Agendamento do Curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__name
msgid "Course category"
msgstr "Categoria do curso"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Course name"
msgstr "Nome do curso"
#. module: hr_course
#: model:mail.channel,name:hr_course.mail_channel_course_validity
msgid "Course validity expiration notification"
msgstr ""
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course
#: model:ir.actions.act_window,name:hr_course.action_view_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__courses_ids
#: model:ir.ui.menu,name:hr_course.menu_hr_course
#: model:ir.ui.menu,name:hr_course.menu_hr_course_courses
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_hr_employee_form
msgid "Courses"
msgstr "Cursos"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course_schedule
#: model:ir.ui.menu,name:hr_course.menu_hr_course_schedule
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Courses Schedule"
msgstr "Agendamento dos Cursos"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_uid
msgid "Created by"
msgstr "Criado por"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_date
msgid "Created on"
msgstr "Criado em"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__currency_id
msgid "Currency"
msgstr "Moeda"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_company__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__display_name
msgid "Display Name"
msgstr "Nome a Apresentar"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__draft
msgid "Draft"
msgstr "Rascunho"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Draft Course"
msgstr "Rascunho de Curso"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_employee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__employee_id
msgid "Employee"
msgstr "Funcionário"
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "Employees removed from this course: <br></br>%s"
msgstr "Empregados removidos deste curso: <br></br>%s"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_end
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__end_date
msgid "End date"
msgstr "Data final"
#. module: hr_course
#: model:mail.template,subject:hr_course.mail_template_validity_reminder
msgid "End of validity for a course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__evaluation_criteria
msgid "Evaluation Criteria"
msgstr "Critérios de Avaliação"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Evaluation criteria"
msgstr "Critérios de avaliação"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__failed
msgid "Failed"
msgstr "Falhou"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_follower_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_follower_ids
msgid "Followers"
msgstr "Seguidores"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_channel_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_channel_ids
msgid "Followers (Channels)"
msgstr "Seguidores (Canais)"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_partner_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_partner_ids
msgid "Followers (Partners)"
msgstr "Seguidores (Parceiros)"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks"
msgstr ""
#. module: hr_course
#: model:ir.actions.server,name:hr_course.ir_cron_post_wip_ir_actions_server
#: model:ir.cron,cron_name:hr_course.ir_cron_post_wip
#: model:ir.cron,name:hr_course.ir_cron_post_wip
msgid "HR Course: Check validity date"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence
msgid "Has Permanence"
msgstr "Tem Permanência"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__id
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__id
#: model:ir.model.fields,field_description:hr_course.field_res_company__id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__id
msgid "ID"
msgstr "ID"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread
msgid "If checked, new messages require your attention."
msgstr "Se selecionado, há novas mensagens que requerem a sua atenção."
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr "Se estiver marcado, algumas mensagens têm um erro de entrega."
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_progress
msgid "In progress"
msgstr "Em andamento"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_validation
msgid "In validation"
msgstr "Em validação"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__instructor_ids
msgid "Instructor"
msgstr "Instrutor"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Internal notes"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_is_follower
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_is_follower
msgid "Is Follower"
msgstr "É Seguidor"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_employee____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_company____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings____last_update
msgid "Last Modified on"
msgstr "Última Modificação em"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_uid
msgid "Last Updated by"
msgstr "Última Atualização por"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_date
msgid "Last Updated on"
msgstr "Última Atualização em"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_channel_id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_channel_id
msgid "Mailing list to alert"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_main_attachment_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_main_attachment_id
msgid "Main Attachment"
msgstr "Anexo Principal"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error
msgid "Message Delivery error"
msgstr "Erro de Envio de Mensagem"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_ids
msgid "Messages"
msgstr "Mensagens"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__my_activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__my_activity_date_deadline
msgid "My Activity Deadline"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__name
msgid "Name"
msgstr "Nome"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_date_deadline
msgid "Next Activity Deadline"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_summary
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_summary
msgid "Next Activity Summary"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_id
msgid "Next Activity Type"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__note
msgid "Note"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of Actions"
msgstr "Número de Ações"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__count_courses
msgid "Number of courses"
msgstr "Número de cursos"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of errors"
msgstr "Número de erros"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr "Número de mensagens que requerem uma ação"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr "Numero de mensagens com um erro de entrega"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Number of unread messages"
msgstr "Número de mensagens não lidas"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__objective
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Objective"
msgstr "Objetivo"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Pass everybody"
msgstr "Passar todos"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__passed
msgid "Passed"
msgstr "Aprovado"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__pending
msgid "Pending"
msgstr "Pendente"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence_time
msgid "Permanence time"
msgstr "Tempo de permanência"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__place
msgid "Place"
msgstr "Local"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Rate Course"
msgstr "Classifique o Curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_user_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_user_id
msgid "Responsible User"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__result
msgid "Result"
msgstr "Resultado"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Schedules"
msgstr "Horários"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course_attendee__course_expiration_alert_sent
msgid "Shows if notification email for course was sent"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Start Course"
msgstr "Iniciar Curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_start
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__start_date
msgid "Start date"
msgstr "Data inicial"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__state
msgid "State"
msgstr "Estado"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_state
msgid ""
"Status based on activities\n"
"Overdue: Due date is already passed\n"
"Today: Activity date is today\n"
"Planned: Future activities."
msgstr ""
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "The start date cannot be later than the end date."
msgstr "A data de início não pode ser posterior à data final."
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__training_company_id
msgid "Training company"
msgstr "Empresa de formação"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Type of the exception activity on record."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread
msgid "Unread Messages"
msgstr "Mensagens Não Lidas"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Unread Messages Counter"
msgstr "Contador de Mensagens Não Lidas"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_validity_end_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__validity_end_date
msgid "Validity End Date"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__waiting_attendees
msgid "Waiting attendees"
msgstr "Aguardar participantes"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website Messages"
msgstr "Mensagens do Website"
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website communication history"
msgstr "Histórico de Comunicação do Website"
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "You cannot complete the course with pending results"
msgstr "Você não pode completar o curso com resultados pendentes"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid ""
"You should set a course back to draft only if you cancelled it by mistake or "
"if some of its information is incorrect. Do you want to continue?"
msgstr ""
"Deve retornar um curso ao estado rascunho apenas se o cancelar por engano ou "
"se algumas das suas informações estiverem incorretas. Quer continuar?"
#~ msgid "SMS Delivery error"
#~ msgstr "Erro de Envio de SMS"

View File

@ -0,0 +1,713 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_course
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-06-06 16:09+0000\n"
"Last-Translator: Douglas Custódio <douglascstd@yahoo.com>\n"
"Language-Team: none\n"
"Language: pt_BR\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"
"X-Generator: Weblate 4.17\n"
#. module: hr_course
#: model:mail.template,body_html:hr_course.mail_template_validity_reminder
msgid ""
"<div>\n"
" <p>Hi,</p>\n"
" <p>The validity time of the course ${object.name} will end "
"up soon. You maybe need to plan a new one. </p>\n"
" <p>The concerned employees are:</p>\n"
" % for employee in object.course_attendee_ids."
"mapped(\"employee_id.name\"):\n"
" <p>${employee}</p>\n"
" % endfor\n"
" </div>\n"
" "
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__absent
msgid "Absent"
msgstr "Ausente"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction
msgid "Action Needed"
msgstr "Ação Necessária"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__active
msgid "Active"
msgstr "Ativa"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_ids
msgid "Activities"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_state
msgid "Activity State"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Activity Type Icon"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_alerting_delay
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_alerting_delay
msgid "Alerting delay before end of validity (days)"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Assign attendees"
msgstr "Designar participantes"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_attachment_count
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_attachment_count
msgid "Attachment Count"
msgstr "Contagem de anexos"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__attendant_ids
msgid "Attendant"
msgstr "Participante"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Attendees"
msgstr "Participantes"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__authorized_by
msgid "Authorized by"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Back to Draft"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancel Course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__cancelled
msgid "Cancelled"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Cancelled Course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__category_id
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Category"
msgstr ""
#. module: hr_course
#: model:ir.model.constraint,message:hr_course.constraint_hr_course_category_name_uniq
msgid "Category already exists !"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__comment
msgid "Comment"
msgstr "Comentário"
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_company
msgid "Companies"
msgstr "Empresas"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Complete Course"
msgstr "Finaliza Curso"
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__completed
msgid "Completed"
msgstr ""
#. module: hr_course
#: model:ir.model,name:hr_course.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__content
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Content"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Convocatory"
msgstr "Convocação"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_id
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course"
msgstr "Curso"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_attendee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_attendee_ids
msgid "Course Attendee"
msgstr "Participante do Curso"
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.open_view_course_category_form
#: model:ir.ui.menu,name:hr_course.menu_view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_course_category_search
msgid "Course Categories"
msgstr "Categorias do Curso"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_category
msgid "Course Category"
msgstr "Categoria do Curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__cost
msgid "Course Cost"
msgstr "Custo do Curso"
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_expiration_alert_sent
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__course_expiration_alert_sent
msgid "Course Expiration Alert Sent"
msgstr "Enviar Aviso de Expiração do Curso"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_search_view
msgid "Course Name"
msgstr "Nome do Curso"
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Course Results"
msgstr "Resultados do Curso"
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_course_schedule
#: model:ir.model.fields,field_description:hr_course.field_hr_course__course_schedule_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_schedule_id
msgid "Course Schedule"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__name
msgid "Course category"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Course name"
msgstr ""
#. module: hr_course
#: model:mail.channel,name:hr_course.mail_channel_course_validity
msgid "Course validity expiration notification"
msgstr ""
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course
#: model:ir.actions.act_window,name:hr_course.action_view_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__courses_ids
#: model:ir.ui.menu,name:hr_course.menu_hr_course
#: model:ir.ui.menu,name:hr_course.menu_hr_course_courses
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
#: model_terms:ir.ui.view,arch_db:hr_course.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:hr_course.view_hr_employee_form
msgid "Courses"
msgstr ""
#. module: hr_course
#: model:ir.actions.act_window,name:hr_course.action_hr_course_schedule
#: model:ir.ui.menu,name:hr_course.menu_hr_course_schedule
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Courses Schedule"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_uid
msgid "Created by"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__create_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__create_date
msgid "Created on"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__currency_id
msgid "Currency"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__display_name
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_company__display_name
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__display_name
msgid "Display Name"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__draft
msgid "Draft"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Draft Course"
msgstr ""
#. module: hr_course
#: model:ir.model,name:hr_course.model_hr_employee
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__employee_id
msgid "Employee"
msgstr ""
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "Employees removed from this course: <br></br>%s"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_end
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__end_date
msgid "End date"
msgstr ""
#. module: hr_course
#: model:mail.template,subject:hr_course.mail_template_validity_reminder
msgid "End of validity for a course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__evaluation_criteria
msgid "Evaluation Criteria"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Evaluation criteria"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__failed
msgid "Failed"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_follower_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_follower_ids
msgid "Followers"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_channel_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_channel_ids
msgid "Followers (Channels)"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_partner_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_partner_ids
msgid "Followers (Partners)"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_type_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks"
msgstr ""
#. module: hr_course
#: model:ir.actions.server,name:hr_course.ir_cron_post_wip_ir_actions_server
#: model:ir.cron,cron_name:hr_course.ir_cron_post_wip
#: model:ir.cron,name:hr_course.ir_cron_post_wip
msgid "HR Course: Check validity date"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence
msgid "Has Permanence"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__id
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__id
#: model:ir.model.fields,field_description:hr_course.field_res_company__id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__id
msgid "ID"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_icon
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread
msgid "If checked, new messages require your attention."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_progress
msgid "In progress"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__in_validation
msgid "In validation"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__instructor_ids
msgid "Instructor"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Internal notes"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_is_follower
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_is_follower
msgid "Is Follower"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule____last_update
#: model:ir.model.fields,field_description:hr_course.field_hr_employee____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_company____last_update
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings____last_update
msgid "Last Modified on"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_uid
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_uid
msgid "Last Updated by"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_category__write_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__write_date
msgid "Last Updated on"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_res_company__course_expiration_channel_id
#: model:ir.model.fields,field_description:hr_course.field_res_config_settings__course_expiration_channel_id
msgid "Mailing list to alert"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_main_attachment_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_main_attachment_id
msgid "Main Attachment"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_ids
msgid "Messages"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__my_activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__my_activity_date_deadline
msgid "My Activity Deadline"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__name
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__name
msgid "Name"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_date_deadline
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_date_deadline
msgid "Next Activity Deadline"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_summary
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_summary
msgid "Next Activity Summary"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_type_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_type_id
msgid "Next Activity Type"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__note
msgid "Note"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of Actions"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_employee__count_courses
msgid "Number of courses"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of errors"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_needaction_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_has_error_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Number of unread messages"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__objective
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Objective"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Pass everybody"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__passed
msgid "Passed"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_attendee__result__pending
msgid "Pending"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__permanence_time
msgid "Permanence time"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__place
msgid "Place"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Rate Course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__activity_user_id
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__activity_user_id
msgid "Responsible User"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__result
msgid "Result"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_form_view
msgid "Schedules"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course_attendee__course_expiration_alert_sent
msgid "Shows if notification email for course was sent"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid "Start Course"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_start
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__start_date
msgid "Start date"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__state
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__state
msgid "State"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_state
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_state
msgid ""
"Status based on activities\n"
"Overdue: Due date is already passed\n"
"Today: Activity date is today\n"
"Planned: Future activities."
msgstr ""
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "The start date cannot be later than the end date."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__training_company_id
msgid "Training company"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__activity_exception_decoration
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__activity_exception_decoration
msgid "Type of the exception activity on record."
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread
msgid "Unread Messages"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__message_unread_counter
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__message_unread_counter
msgid "Unread Messages Counter"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course_attendee__course_validity_end_date
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__validity_end_date
msgid "Validity End Date"
msgstr ""
#. module: hr_course
#: model:ir.model.fields.selection,name:hr_course.selection__hr_course_schedule__state__waiting_attendees
msgid "Waiting attendees"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,field_description:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,field_description:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website Messages"
msgstr ""
#. module: hr_course
#: model:ir.model.fields,help:hr_course.field_hr_course__website_message_ids
#: model:ir.model.fields,help:hr_course.field_hr_course_schedule__website_message_ids
msgid "Website communication history"
msgstr ""
#. module: hr_course
#: code:addons/hr_course/models/hr_course_schedule.py:0
#, python-format
msgid "You cannot complete the course with pending results"
msgstr ""
#. module: hr_course
#: model_terms:ir.ui.view,arch_db:hr_course.hr_course_schedule_form_view
msgid ""
"You should set a course back to draft only if you cancelled it by mistake or "
"if some of its information is incorrect. Do you want to continue?"
msgstr ""

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record model="ir.rule" id="hr_employee_course_rule">
<field name="model_id" ref="model_hr_course_schedule" />
</record>
<record model="ir.rule" id="hr_employee_course_manager_rule">
<field name="model_id" ref="model_hr_course_schedule" />
</record>
</odoo>

View File

@ -0,0 +1,41 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openupgradelib import openupgrade # pylint: disable=W7936
@openupgrade.migrate()
def migrate(env, version):
if openupgrade.column_exists(env.cr, "hr_course", "migration_course_id"):
return
openupgrade.logged_query(
env.cr,
"""
ALTER TABLE hr_course
ADD COLUMN migration_course_id integer""",
)
openupgrade.logged_query(
env.cr,
"""
INSERT INTO hr_course (
name,
category_id,
permanence,
permanence_time,
migration_course_id
)
SELECT name, category_id, permanence, permanence_time, id
FROM hr_course_schedule
""",
)
openupgrade.logged_query(
env.cr,
"""
UPDATE hr_course_schedule hcs
SET course_id = hc.id
FROM hr_course hc
WHERE hc.migration_course_id = hcs.id
""",
)
openupgrade.load_data(
env.cr, "hr_course", "migrations/14.0.2.0.0/noupdate_changes.xml"
)

View File

@ -0,0 +1,20 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openupgradelib import openupgrade # pylint: disable=W7936
_models_renames = [
("hr.course", "hr.course.schedule"),
]
_column_renames = {
"hr_course_attendee": [("course_id", "course_schedule_id")],
}
_table_renames = [("hr_course", "hr_course_schedule")]
@openupgrade.migrate()
def migrate(env, version):
if openupgrade.table_exists(env.cr, "hr_course_schedule"):
return
openupgrade.rename_models(env.cr, _models_renames)
openupgrade.rename_tables(env.cr, _table_renames)
openupgrade.rename_columns(env.cr, _column_renames)

View File

@ -0,0 +1,7 @@
from . import hr_employee
from . import hr_course
from . import hr_course_schedule
from . import res_company
from . import res_config_settings
from . import hr_course_attendee
from . import hr_course_category

View File

@ -0,0 +1,31 @@
# Copyright 2019 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class HrCourse(models.Model):
_name = "hr.course"
_description = "Course"
_inherit = ["mail.thread", "mail.activity.mixin"]
name = fields.Char(string="Name", required=True, tracking=True)
category_id = fields.Many2one(
"hr.course.category", string="Category", required=True
)
permanence = fields.Boolean(string="Has Permanence", default=False, tracking=True)
permanence_time = fields.Char(string="Permanence time", tracking=True)
content = fields.Html()
objective = fields.Html()
evaluation_criteria = fields.Html()
course_schedule_ids = fields.One2many(
"hr.course.schedule", inverse_name="course_id"
)
@api.onchange("permanence")
def _onchange_permanence(self):
self.permanence_time = False

View File

@ -0,0 +1,40 @@
# Copyright 2019 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class HRCourseAttendee(models.Model):
_name = "hr.course.attendee"
_description = "Course Attendee"
course_schedule_id = fields.Many2one(
"hr.course.schedule", ondelete="cascade", readonly=True, required=True
)
course_id = fields.Many2one(related="course_schedule_id.course_id")
course_validity_end_date = fields.Date(
related="course_schedule_id.validity_end_date"
)
name = fields.Char(related="course_schedule_id.name", readonly=True)
course_expiration_alert_sent = fields.Boolean(
help="Shows if notification email for course was sent"
)
employee_id = fields.Many2one("hr.employee", readonly=True)
course_start = fields.Date(related="course_schedule_id.start_date", readonly=True)
course_end = fields.Date(related="course_schedule_id.end_date", readonly=True)
state = fields.Selection(related="course_schedule_id.state", readonly=True)
result = fields.Selection(
[
("passed", "Passed"),
("failed", "Failed"),
("absent", "Absent"),
("pending", "Pending"),
],
string="Result",
default="pending",
)
active = fields.Boolean(default=True, readonly=True)
def _remove_from_course(self):
return [(1, self.id, {"active": False})]

View File

@ -0,0 +1,13 @@
# Copyright 2019 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class HRCourseCategory(models.Model):
_name = "hr.course.category"
_description = "Course Category"
name = fields.Char(string="Course category", required=True)
_sql_constraints = [("name_uniq", "unique (name)", "Category already exists !")]

View File

@ -0,0 +1,206 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from datetime import timedelta
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class HrCourseSchedule(models.Model):
_name = "hr.course.schedule"
_description = "Course Schedule"
_inherit = ["mail.thread", "mail.activity.mixin"]
name = fields.Char(string="Name", required=True, tracking=True)
course_id = fields.Many2one("hr.course", string="Course", required=True)
validity_end_date = fields.Date()
start_date = fields.Date(
string="Start date",
readonly=True,
states={"draft": [("readonly", False)]},
tracking=True,
)
end_date = fields.Date(
string="End date",
readonly=True,
states={"draft": [("readonly", False)]},
tracking=True,
)
currency_id = fields.Many2one(
"res.currency",
string="Currency",
default=lambda self: self.env.user.company_id.currency_id,
)
cost = fields.Monetary(string="Course Cost", required=True, tracking=True)
authorized_by = fields.Many2one(
string="Authorized by",
comodel_name="hr.employee",
required=True,
readonly=True,
states={"draft": [("readonly", False)]},
tracking=True,
)
state = fields.Selection(
[
("draft", "Draft"),
("waiting_attendees", "Waiting attendees"),
("in_progress", "In progress"),
("in_validation", "In validation"),
("completed", "Completed"),
("cancelled", "Cancelled"),
],
required=True,
readonly=True,
default="draft",
tracking=True,
)
comment = fields.Text("Comment")
training_company_id = fields.Many2one("res.partner", string="Training company")
instructor_ids = fields.Many2many("res.partner", string="Instructor")
place = fields.Char("Place")
attendant_ids = fields.Many2many(
"hr.employee",
readonly=True,
states={"waiting_attendees": [("readonly", False)]},
)
course_attendee_ids = fields.One2many(
"hr.course.attendee",
inverse_name="course_schedule_id",
readonly=True,
states={"in_validation": [("readonly", False)]},
)
course_expiration_alert_sent = fields.Boolean()
note = fields.Text()
@api.model
def send_course_expiration_notification_email(self):
company_id = self.env.context.get("company_id") or self.env.company.id
channel = (
self.env["res.company"].browse(company_id).course_expiration_channel_id
)
if not channel:
_logger.info("no channel found for course expiration alerts")
return False
email_template = self.env.ref(
"hr_course.mail_template_validity_reminder"
).with_context(lang=self.env.company.partner_id.lang)
email_values = email_template.generate_email(self.ids, ["body_html", "subject"])
values = email_values[self.id]
self.with_context(email_from=channel.alias_id.display_name,).message_post(
body=values["body_html"],
channel_ids=channel.ids,
message_type="email",
subject=values["subject"],
)
return True
@api.model
def process_validity(self):
company_id = self.env.context.get("company_id") or self.env.company.id
course_expiration_alerting_delay = (
self.env["res.company"].browse(company_id).course_expiration_alerting_delay
)
for course_schedule in self:
if course_schedule.validity_end_date:
if (
course_schedule.validity_end_date
- timedelta(days=course_expiration_alerting_delay)
<= fields.Date.today()
):
course_schedule.course_expiration_alert_sent = True
course_schedule.send_course_expiration_notification_email()
def _cron_check_validity_date(self):
items = self.search([("course_expiration_alert_sent", "=", False)])
items.process_validity()
@api.constrains("start_date", "end_date")
def _check_start_end_dates(self):
self.ensure_one()
if self.start_date and self.end_date and (self.start_date > self.end_date):
raise ValidationError(
_("The start date cannot be later than the end date.")
)
def all_passed(self):
for attendee in self.course_attendee_ids:
attendee.result = "passed"
def _draft2waiting_values(self):
return {"state": "waiting_attendees"}
def _attendee_values(self, attendee):
return {"employee_id": attendee.id, "course_schedule_id": self.id}
def _waiting2inprogress_values(self):
attendants = []
employee_attendants = self.course_attendee_ids.mapped("employee_id")
for attendee in self.attendant_ids.filtered(
lambda r: r not in employee_attendants
):
attendants.append((0, 0, self._attendee_values(attendee)))
deleted_attendees = ""
for course_attendee in self.course_attendee_ids.filtered(
lambda r: r.employee_id not in self.attendant_ids
):
attendants += course_attendee._remove_from_course()
deleted_attendees += "- %s <br></br>" % course_attendee.employee_id.name
if deleted_attendees != "":
message = (
_("Employees removed from this course: <br></br>%s") % deleted_attendees
)
self.message_post(body=message)
return {"state": "in_progress", "course_attendee_ids": attendants}
def _inprogress2validation_values(self):
return {"state": "in_validation"}
def _validation2complete_values(self):
return {"state": "completed"}
def _back2draft_values(self):
return {"state": "draft"}
def _cancel_course_values(self):
return {"state": "cancelled"}
def draft2waiting(self):
for record in self:
record.write(record._draft2waiting_values())
def waiting2inprogress(self):
for record in self:
record.write(record._waiting2inprogress_values())
def inprogress2validation(self):
for record in self:
record.write(record._inprogress2validation_values())
def validation2complete(self):
for record in self:
if self.course_attendee_ids.filtered(
lambda r: r.result == "pending" and r.active
):
raise ValidationError(
_("You cannot complete the course with pending results")
)
else:
record.write(record._validation2complete_values())
def back2draft(self):
for record in self:
record.write(record._back2draft_values())
def cancel_course(self):
for record in self:
record.write(record._cancel_course_values())

View File

@ -0,0 +1,28 @@
from odoo import api, fields, models
class HrEmployee(models.Model):
_inherit = "hr.employee"
count_courses = fields.Integer(
"Number of courses", compute="_compute_count_courses"
)
courses_ids = fields.One2many(
"hr.course.attendee",
"employee_id",
string="Courses",
readonly=True,
)
@api.depends("courses_ids")
def _compute_count_courses(self):
for r in self:
r.count_courses = len(r.courses_ids)
def action_view_course(self):
result = self.env["ir.actions.act_window"]._for_xml_id(
"hr_course.action_view_course"
)
result["domain"] = [("employee_id", "=", self.id)]
return result

View File

@ -0,0 +1,19 @@
# Copyright 2021 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import fields, models
class ResCompany(models.Model):
_inherit = "res.company"
course_expiration_channel_id = fields.Many2one(
"mail.channel",
string="Mailing list to alert",
default=lambda self: self.env.ref(
"hr_course.mail_channel_course_validity", raise_if_not_found=False
),
)
course_expiration_alerting_delay = fields.Integer(
string="Alerting delay before end of validity (days)"
)

View File

@ -0,0 +1,15 @@
# Copyright 2021 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
course_expiration_channel_id = fields.Many2one(
related="company_id.course_expiration_channel_id", readonly=False
)
course_expiration_alerting_delay = fields.Integer(
related="company_id.course_expiration_alerting_delay", readonly=False
)

View File

@ -0,0 +1,3 @@
* Enric Tobella <etobella@creublanca.es>
* Jaime Arroyo <jaime.arroyo@creublanca.es>
* Anna Janiszewska <anna.janiszewska@camptocamp.com>

View File

@ -0,0 +1,2 @@
This module allows your to manage employee's training courses, course dates and all its
validation process.

View File

@ -0,0 +1,8 @@
To create a Course go to Employees -> Courses.
To create a Training Schedule go to Employees -> Courses Schedule.
Fill the information and click assign attendees to continue. Assign them and
then start the course session.
One it has finished you must enter the results and finish the course session.

View File

@ -0,0 +1,35 @@
<?xml version="1.0" ?>
<odoo noupdate="1">
<record model="ir.rule" id="hr_employee_course_rule">
<field name="name">hr.employee.course.rule</field>
<field name="model_id" ref="model_hr_course_schedule" />
<field
name="domain_force"
>[('attendant_ids', 'in', user.employee_ids.ids)]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]" />
<field name="global" eval="False" />
</record>
<record model="ir.rule" id="hr_employee_course_manager_rule">
<field name="name">hr.employee.course.rule</field>
<field name="model_id" ref="model_hr_course_schedule" />
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('hr.group_hr_manager'))]" />
<field name="global" eval="False" />
</record>
<record model="ir.rule" id="hr_employee_course_attendee_rule">
<field name="name">hr.employee.attendee.course.rule</field>
<field name="model_id" ref="model_hr_course_attendee" />
<field
name="domain_force"
>[('employee_id', 'in', user.employee_ids.ids)]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]" />
<field name="global" eval="False" />
</record>
<record model="ir.rule" id="hr_employee_course_attendee_manager_rule">
<field name="name">hr.employee.attendee.course.rule</field>
<field name="model_id" ref="model_hr_course_attendee" />
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('hr.group_hr_manager'))]" />
<field name="global" eval="False" />
</record>
</odoo>

View File

@ -0,0 +1,9 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_hr_course,access_hr_course,model_hr_course,base.group_user,1,0,0,0
access_hr_course_manager,access_hr_course_manager,model_hr_course,hr.group_hr_manager,1,1,1,1
access_hr_course_schedule,access_hr_course_schedule,model_hr_course_schedule,base.group_user,1,0,0,0
access_hr_course_schedule_manager,access_hr_course_schedule_manager,model_hr_course_schedule,hr.group_hr_manager,1,1,1,1
access_hr_course_attendee,access_hr_course_attendee,model_hr_course_attendee,base.group_user,1,0,0,0
access_hr_course_attendee_manager,access_hr_course_attendee_manager,model_hr_course_attendee,hr.group_hr_manager,1,1,1,1
access_hr_course_category,access_hr_course_category,model_hr_course_category,base.group_user,1,0,0,0
access_hr_course_category_manager,access_hr_course_category_manager,model_hr_course_category,hr.group_hr_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_hr_course access_hr_course model_hr_course base.group_user 1 0 0 0
3 access_hr_course_manager access_hr_course_manager model_hr_course hr.group_hr_manager 1 1 1 1
4 access_hr_course_schedule access_hr_course_schedule model_hr_course_schedule base.group_user 1 0 0 0
5 access_hr_course_schedule_manager access_hr_course_schedule_manager model_hr_course_schedule hr.group_hr_manager 1 1 1 1
6 access_hr_course_attendee access_hr_course_attendee model_hr_course_attendee base.group_user 1 0 0 0
7 access_hr_course_attendee_manager access_hr_course_attendee_manager model_hr_course_attendee hr.group_hr_manager 1 1 1 1
8 access_hr_course_category access_hr_course_category model_hr_course_category base.group_user 1 0 0 0
9 access_hr_course_category_manager access_hr_course_category_manager model_hr_course_category hr.group_hr_manager 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1,433 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>HR Course</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="hr-course">
<h1 class="title">HR Course</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:ddeee0d152c5f7cd6896862fed775d928e76cfa9ab645cc1eb716b3f2a055f10
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/hr/tree/14.0/hr_course"><img alt="OCA/hr" src="https://img.shields.io/badge/github-OCA%2Fhr-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/hr-14-0/hr-14-0-hr_course"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/hr&amp;target_branch=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module allows your to manage employees training courses, course dates and all its
validation process.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<p>To create a Course go to Employees -&gt; Courses.</p>
<p>To create a Training Schedule go to Employees -&gt; Courses Schedule.</p>
<p>Fill the information and click assign attendees to continue. Assign them and
then start the course session.</p>
<p>One it has finished you must enter the results and finish the course session.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/hr/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/hr/issues/new?body=module:%20hr_course%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>Creu Blanca</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Enric Tobella &lt;<a class="reference external" href="mailto:etobella&#64;creublanca.es">etobella&#64;creublanca.es</a>&gt;</li>
<li>Jaime Arroyo &lt;<a class="reference external" href="mailto:jaime.arroyo&#64;creublanca.es">jaime.arroyo&#64;creublanca.es</a>&gt;</li>
<li>Anna Janiszewska &lt;<a class="reference external" href="mailto:anna.janiszewska&#64;camptocamp.com">anna.janiszewska&#64;camptocamp.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/hr/tree/14.0/hr_course">OCA/hr</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1 @@
from . import test_hr_course

View File

@ -0,0 +1,77 @@
# Copyright 2019 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import odoo.tests.common as common
from odoo.exceptions import ValidationError
class TestHrCourse(common.TransactionCase):
def setUp(self):
super(TestHrCourse, self).setUp()
self.course_categ = self.env["hr.course.category"].create(
{"name": "Category 1"}
)
self.employee1 = self.env["hr.employee"].create({"name": "Employee 1"})
self.employee2 = self.env["hr.employee"].create({"name": "Employee 2"})
self.course_id = self.env["hr.course"].create(
{
"name": "Course name",
"category_id": self.course_categ.id,
"permanence": True,
"permanence_time": "1 month",
}
)
self.course_schedule_id = self.env["hr.course.schedule"].create(
{
"name": "Convocatory",
"course_id": self.course_id.id,
"cost": 100,
"authorized_by": self.employee1.id,
"start_date": "2019-02-15",
"end_date": "2019-02-20",
}
)
def test_hr_course(self):
self.course_id.permanence = False
self.course_id._onchange_permanence()
self.assertFalse(self.course_id.permanence_time)
def test_hr_course_schedule(self):
with self.assertRaises(ValidationError):
self.course_schedule_id.write({"end_date": "2019-02-10"})
self.assertEqual(self.course_schedule_id.state, "draft")
self.course_schedule_id.cancel_course()
self.assertEqual(self.course_schedule_id.state, "cancelled")
self.course_schedule_id.back2draft()
self.course_schedule_id.draft2waiting()
self.assertEqual(self.course_schedule_id.state, "waiting_attendees")
self.course_schedule_id.attendant_ids = [
(6, 0, [self.employee1.id, self.employee2.id])
]
self.assertTrue(self.course_schedule_id.attendant_ids)
self.assertEqual(len(self.course_schedule_id.attendant_ids), 2)
self.course_schedule_id.waiting2inprogress()
self.assertEqual(self.course_schedule_id.state, "in_progress")
self.assertEqual(len(self.course_schedule_id.course_attendee_ids), 2)
self.course_schedule_id.attendant_ids = [(2, self.employee2.id, 0)]
self.course_schedule_id.waiting2inprogress()
self.assertEqual(len(self.course_schedule_id.attendant_ids), 1)
self.assertEqual(len(self.course_schedule_id.course_attendee_ids), 1)
self.employee1._compute_count_courses()
self.assertEqual(self.employee1.count_courses, 1)
self.employee1.action_view_course()
self.course_schedule_id.inprogress2validation()
self.assertEqual(self.course_schedule_id.state, "in_validation")
with self.assertRaises(ValidationError):
self.course_schedule_id.validation2complete()
self.course_schedule_id.all_passed()
self.assertEqual(
self.course_schedule_id.course_attendee_ids[0].result, "passed"
)
self.course_schedule_id.validation2complete()
self.assertEqual(self.course_schedule_id.state, "completed")

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_course_category_form" model="ir.ui.view">
<field name="name">hr.course.category.form</field>
<field name="model">hr.course.category</field>
<field name="arch" type="xml">
<form string="Course Categories">
<group>
<field name="name" />
</group>
</form>
</field>
</record>
<record id="view_course_category_search" model="ir.ui.view">
<field name="name">hr.course.category.search</field>
<field name="model">hr.course.category</field>
<field name="arch" type="xml">
<search string="Course Categories">
<field name="name" string="Category" />
</search>
</field>
</record>
<record id="view_course_category_list" model="ir.ui.view">
<field name="name">hr.course.category.list</field>
<field name="model">hr.course.category</field>
<field eval="8" name="priority" />
<field name="arch" type="xml">
<tree>
<field name="name" />
</tree>
</field>
</record>
<record id="open_view_course_category_form" model="ir.actions.act_window">
<field name="name">Course Categories</field>
<field name="res_model">hr.course.category</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem
id="menu_view_course_category_form"
action="open_view_course_category_form"
parent="hr.menu_human_resources_configuration"
sequence="10"
/>
</odoo>

View File

@ -0,0 +1,224 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2019 Creu Blanca
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="hr_course_schedule_form_view" model="ir.ui.view">
<field name="name">hr.course.schedule.form</field>
<field name="model">hr.course.schedule</field>
<field name="arch" type="xml">
<form string="Courses Schedule">
<header>
<button
string="Assign attendees"
name="draft2waiting"
states="draft"
type="object"
class="btn-primary"
groups="hr.group_hr_manager"
/>
<button
string="Start Course"
name="waiting2inprogress"
states="waiting_attendees"
type="object"
class="btn-primary"
groups="hr.group_hr_manager"
/>
<button
string="Rate Course"
name="inprogress2validation"
states="in_progress"
type="object"
class="btn-primary"
groups="hr.group_hr_manager"
/>
<button
string="Complete Course"
name="validation2complete"
states="in_validation"
type="object"
class="btn-primary"
groups="hr.group_hr_manager"
/>
<button
string="Cancel Course"
name="cancel_course"
states="draft,waiting_attendees,in_progress,in_validation"
type="object"
groups="hr.group_hr_manager"
/>
<button
name="back2draft"
type="object"
string="Back to Draft"
states="cancelled,waiting_attendees,in_progress,in_validation,completed"
groups="hr.group_hr_manager"
confirm="You should set a course back to draft only if you cancelled it by mistake or if some of its information is incorrect. Do you want to continue?"
/>
<field
name="state"
widget="statusbar"
statusbar_visible="draft,waiting_attendees,in_progress,in_validation,completed"
/>
</header>
<sheet string="Course">
<label
string="Draft Course"
for="state"
attrs="{'invisible': [('state','!=','draft')]}"
>
<br />
</label>
<label
string="Cancelled Course"
style="color:red"
for="state"
attrs="{'invisible': [('state','!=','cancelled')]}"
>
<br />
</label>
<div class="oe_title">
<label for="name" class="oe_edit_only" />
<h1>
<field name="name" placeholder="Convocatory" />
</h1>
</div>
<group>
<group>
<field name="course_id" />
<field
name="cost"
widget="monetary"
options="{'currency_field': 'currency_id'}"
/>
<field
name="currency_id"
groups="base.group_multi_currency"
/>
<field name="authorized_by" />
<field name="training_company_id" />
<field name="instructor_ids" widget="many2many_tags" />
<field name="place" />
<field name="comment" />
<field name="validity_end_date" />
</group>
<group>
<field name="start_date" />
<field name="end_date" />
</group>
</group>
<notebook>
<page
string="Attendees"
attrs="{'invisible': [('state','not in',['draft', 'waiting_attendees','cancelled'])]}"
>
<field name="attendant_ids" />
</page>
<page
string="Course Results"
attrs="{'invisible': [('state','not in',['in_progress','in_validation','completed'])]}"
>
<div class="text-right" states="in_validation">
<br />
<button
string="Pass everybody"
name="all_passed"
type="object"
class="btn-primary"
groups="hr.group_hr_manager"
/>
</div>
<field name="course_attendee_ids" widget="one2many_list" />
</page>
<page
name="note"
string="Internal notes"
groups="hr.group_hr_manager"
>
<field name="note" />
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" />
<field name="activity_ids" widget="mail_activity" />
<field name="message_ids" widget="mail_thread" />
</div>
</form>
</field>
</record>
<record id="hr_course_schedule_search_view" model="ir.ui.view">
<field name="name">hr.course.schedule.search</field>
<field name="model">hr.course.schedule</field>
<field name="arch" type="xml">
<search>
<field name="name" string="Course Name" />
<field name="course_id" string="Course" />
</search>
</field>
</record>
<record id="hr_course_schedule_tree_view" model="ir.ui.view">
<field name="name">hr.course.schedule.tree</field>
<field name="model">hr.course.schedule</field>
<field name="arch" type="xml">
<tree
decoration-success="state=='completed'"
decoration-muted="state=='cancelled'"
>
<field name="name" />
<field name="start_date" />
<field name="end_date" />
<field name="validity_end_date" />
<field name="state" />
</tree>
</field>
</record>
<record id="hr_course_attendee_tree_view" model="ir.ui.view">
<field name="name">hr.course.attendee.tree</field>
<field name="model">hr.course.attendee</field>
<field name="priority">30</field>
<field name="arch" type="xml">
<tree
decoration-success="result=='passed'"
decoration-danger="result=='failed' or result=='absent'"
editable="bottom"
create="false"
delete="false"
>
<field name="employee_id" />
<field name="result" />
</tree>
</field>
</record>
<record id="hr_course_attendee_form_view" model="ir.ui.view">
<field name="name">hr.course.attendee.form</field>
<field name="model">hr.course.attendee</field>
<field name="arch" type="xml">
<form>
<group>
<field name="course_schedule_id" />
<field name="employee_id" />
<field name="state" />
<field name="result" />
</group>
<group>
<field name="course_start" />
<field name="course_end" />
</group>
</form>
</field>
</record>
<record id="action_hr_course_schedule" model="ir.actions.act_window">
<field name="name">Courses Schedule</field>
<field name="res_model">hr.course.schedule</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem
id="menu_hr_course_schedule"
name="Courses Schedule"
parent="hr_course.menu_hr_course"
sequence="90"
groups="hr.group_hr_manager"
action="action_hr_course_schedule"
/>
</odoo>

View File

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2019 Creu Blanca
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="hr_course_form_view" model="ir.ui.view">
<field name="name">hr.course.form</field>
<field name="model">hr.course</field>
<field name="arch" type="xml">
<form string="Courses">
<sheet string="Course">
<div class="oe_title">
<h1>
<field name="name" placeholder="Course name" />
</h1>
</div>
<group>
<group>
<field name="category_id" />
<field name="permanence" />
<field
name="permanence_time"
attrs="{'invisible': [('permanence','=',False)]}"
/>
</group>
</group>
<notebook>
<page name="content" string="Content">
<field name="content" />
</page>
<page name="objective" string="Objective">
<field name="objective" />
</page>
<page name="evaluation_criteria" string="Evaluation criteria">
<field name="evaluation_criteria" />
</page>
<page string="Schedules">
<field name="course_schedule_ids" nolabel="1">
<tree editable="bottom">
<field name="name" />
<field
name="cost"
widget="monetary"
options="{'currency_field': 'currency_id'}"
/>
<field
name="currency_id"
groups="base.group_multi_currency"
/>
<field name="authorized_by" />
<field name="start_date" />
<field name="end_date" />
<field name="state" />
</tree>
</field>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" />
<field name="activity_ids" widget="mail_activity" />
<field name="message_ids" widget="mail_thread" />
</div>
</form>
</field>
</record>
<record id="hr_course_tree_view" model="ir.ui.view">
<field name="name">hr.course.tree</field>
<field name="model">hr.course</field>
<field name="arch" type="xml">
<tree>
<field name="name" />
<field name="category_id" />
<field name="content" />
<field name="objective" />
</tree>
</field>
</record>
<record id="action_hr_course" model="ir.actions.act_window">
<field name="name">Courses</field>
<field name="res_model">hr.course</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem
id="menu_hr_course"
name="Courses"
parent="hr.menu_hr_root"
groups="hr.group_hr_manager"
/>
<menuitem
id="menu_hr_course_courses"
name="Courses"
parent="hr_course.menu_hr_course"
groups="hr.group_hr_manager"
action="action_hr_course"
/>
</odoo>

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_hr_employee_form" model="ir.ui.view">
<field name="name">hr.employee.course.form</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form" />
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button
name="action_view_course"
type="object"
icon="fa-graduation-cap"
class="oe_stat_button"
>
<field name="count_courses" widget="statinfo" string="Courses" />
<field name='courses_ids' invisible="1" />
</button>
</div>
</field>
</record>
<record model="ir.ui.view" id="hr_course_attendee_tree_employee_view">
<field name="name">hr.course.attendee.tree.employee</field>
<field name="model">hr.course.attendee</field>
<field name="priority">100</field>
<field name="arch" type="xml">
<tree
create="false"
delete="false"
decoration-muted="state=='cancelled'"
decoration-success="state!='cancelled' and result=='passed'"
decoration-danger="state!='cancelled' and (result=='failed' or result=='absent')"
>
<field name="course_schedule_id" />
<field name="state" />
<field name="course_start" />
<field name="course_end" />
<field name="result" />
</tree>
</field>
</record>
<record id="action_view_course" model="ir.actions.act_window">
<field name="name">Courses</field>
<field name="res_model">hr.course.attendee</field>
<field name="view_mode">tree,form</field>
<field
name="view_ids"
eval="[(5,0,0),
(0,0,{'view_mode':'tree', 'view_id': ref('hr_course_attendee_tree_employee_view')}),
(0,0,{'view_mode':'form'})]"
/>
</record>
</odoo>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">Set course notification</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="hr.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath
expr="//div[@name='employee_rights_setting_container']"
position="after"
>
<h2>Courses</h2>
<div
class="row mt16 o_settings_container"
name="work_organization_setting_container"
>
<div class="col-12 col-lg-6 o_setting_box">
<div>
<label for="course_expiration_channel_id" />
<field name="course_expiration_channel_id" />
<label for="course_expiration_alerting_delay" />
<field name="course_expiration_alerting_delay" />
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1,94 @@
================
Hr Course Survey
================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:9106aa496f0813d33af06a01289e734c8bc3215a3a3967eeffb414c14713b316
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fhr-lightgray.png?logo=github
:target: https://github.com/OCA/hr/tree/14.0/hr_course_survey
:alt: OCA/hr
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/hr-14-0/hr-14-0-hr_course_survey
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/hr&target_branch=14.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows you to add a survey to your employee's training courses.
**Table of contents**
.. contents::
:local:
Usage
=====
To use this module, you need to:
·Create a Survey: Surveys
·Create a Course: Employees -> Courses
·Add the Survey to the Course (Examination Survey field)
·Create a Training Schedule: Employees -> Courses Schedule
·Assign attendees to continue
(If a course is failed, you can select the "retry" option)
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/hr/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/hr/issues/new?body=module:%20hr_course_survey%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Creu Blanca
Contributors
~~~~~~~~~~~~
* Enric Tobella <etobella@creublanca.es>
* Olga Marco <olga.marco@creublanca.es>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/hr <https://github.com/OCA/hr/tree/14.0/hr_course_survey>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@ -0,0 +1 @@
from . import models

View File

@ -0,0 +1,21 @@
# Copyright 2021 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Hr Course Survey",
"summary": """
Evaluate a course using a Schedule""",
"version": "14.0.1.0.2",
"license": "AGPL-3",
"author": "Creu Blanca,Odoo Community Association (OCA)",
"category":"Odex25-Survey/Odex25-Survey",
"website": "https://github.com/OCA/hr",
"depends": ["hr_course", "survey"],
"data": [
"data/mail.xml",
"views/hr_course_attendee.xml",
"views/hr_course.xml",
"views/hr_course_schedule.xml",
],
"demo": [],
}

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="mail_template_user_input_invite" model="mail.template">
<field name="name">Survey: Invite</field>
<field name="model_id" ref="survey.model_survey_user_input" />
<field name="subject">Participate to ${object.survey_id.title} survey</field>
<field
name="email_to"
>${(object.partner_id.email_formatted or object.email) |safe}</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px; font-size: 13px;">
<p style="margin: 0px; padding: 0px; font-size: 13px;">
Dear ${object.partner_id.name or 'participant'}<br /><br />
% if object.survey_id.certificate:
You have been invited to take a new certification.
% else:
We are conducting a survey and your response would be appreciated.
% endif
<div style="margin: 16px 0px 16px 0px;">
<a
href="${('%s?answer_token=%s' % (object.survey_id.public_url, object.access_token)) | safe}"
style="background-color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: #fff; border-radius: 5px; font-size:13px;"
>
% if object.survey_id.certificate:
Start Certification
% else:
Start Survey
% endif
</a>
</div>
% if object.deadline:
Please answer the survey for ${format_date(object.deadline)}.<br /><br />
% endif
Thank you for your participation.
</p>
</div>
</field>
<field name="lang">${object.partner_id.lang}</field>
<field name="auto_delete" eval="True" />
</record>
</odoo>

View File

@ -0,0 +1,131 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_course_survey
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: ca_ES\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_course_survey
#: model:mail.template,body_html:hr_course_survey.mail_template_user_input_invite
msgid ""
"<div style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" <p style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" Dear ${object.partner_id.name or 'participant'}<br/><br/>\n"
" % if object.survey_id.certificate:\n"
" You have been invited to take a new certification.\n"
" % else:\n"
" We are conducting a survey and your response would be "
"appreciated.\n"
" % endif\n"
" <div style=\"margin: 16px 0px 16px 0px;\">\n"
" <a href=\"${('%s?answer_token=%s' % (object."
"survey_id.public_url, object.access_token)) | safe}\" style=\"background-"
"color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: "
"#fff; border-radius: 5px; font-size:13px;\">\n"
" % if object.survey_id.certificate:\n"
" Start Certification\n"
" % else:\n"
" Start Survey\n"
" % endif\n"
" </a>\n"
" </div>\n"
" % if object.deadline:\n"
" Please answer the survey for ${format_date(object.deadline)}.<br/"
"><br/>\n"
" % endif\n"
" Thank you for your participation.\n"
" </p>\n"
" </div>\n"
" "
msgstr ""
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course
msgid "Course"
msgstr ""
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course_attendee
msgid "Course Attendee"
msgstr ""
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course_schedule
msgid "Course Schedule"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__display_name
msgid "Display Name"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__examination_survey_id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__examination_survey_id
msgid "Examination Survey"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__hr_course_attendee_ids
msgid "Hr Course Attendee"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__id
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__id
msgid "ID"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input____last_update
msgid "Last Modified on"
msgstr ""
#. module: hr_course_survey
#: model:mail.template,subject:hr_course_survey.mail_template_user_input_invite
msgid "Participate to ${object.survey_id.title} survey"
msgstr ""
#. module: hr_course_survey
#: model_terms:ir.ui.view,arch_db:hr_course_survey.hr_course_attendee_tree_view
msgid "Retry"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__survey_answer_id
msgid "Survey Answer"
msgstr ""
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_survey_user_input
msgid "Survey User Input"
msgstr ""
#. module: hr_course_survey
#: code:addons/hr_course_survey/models/hr_course_attendee.py:0
#, python-format
msgid "Survey cannot be sent because the previous survey has not been answered"
msgstr ""
#. module: hr_course_survey
#: code:addons/hr_course_survey/models/hr_course_attendee.py:0
#, python-format
msgid "Survey cannot be sent if the user has not failed"
msgstr ""

View File

@ -0,0 +1,227 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_course_survey
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-02-18 21:33+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
"Language-Team: none\n"
"Language: es\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"
"X-Generator: Weblate 4.17\n"
#. module: hr_course_survey
#: model:mail.template,body_html:hr_course_survey.mail_template_user_input_invite
msgid ""
"<div style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" <p style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" Dear ${object.partner_id.name or 'participant'}<br/><br/>\n"
" % if object.survey_id.certificate:\n"
" You have been invited to take a new certification.\n"
" % else:\n"
" We are conducting a survey and your response would be "
"appreciated.\n"
" % endif\n"
" <div style=\"margin: 16px 0px 16px 0px;\">\n"
" <a href=\"${('%s?answer_token=%s' % (object."
"survey_id.public_url, object.access_token)) | safe}\" style=\"background-"
"color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: "
"#fff; border-radius: 5px; font-size:13px;\">\n"
" % if object.survey_id.certificate:\n"
" Start Certification\n"
" % else:\n"
" Start Survey\n"
" % endif\n"
" </a>\n"
" </div>\n"
" % if object.deadline:\n"
" Please answer the survey for ${format_date(object.deadline)}.<br/"
"><br/>\n"
" % endif\n"
" Thank you for your participation.\n"
" </p>\n"
" </div>\n"
" "
msgstr ""
"<div style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" <p style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" Querido ${object.partner_id.name or 'participant'}<br/><br/>\n"
" % if object.survey_id.certificate:\n"
" Has sido invitado a tomar la siguiente certificación.\n"
" % else:\n"
" Estamos realizanod la siguiente encuesta y nos interesaría saber "
"tu opinión.\n"
" % endif\n"
" <div style=\"margin: 16px 0px 16px 0px;\">\n"
" <a href=\"${('%s?answer_token=%s' % ("
"object.survey_id.public_url, object.token)) | safe}\" style=\"background-"
"color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: "
"#fff; border-radius: 5px; font-size:13px;\">\n"
" % if object.survey_id.certificate:\n"
" Empezar certificación\n"
" % else:\n"
" Empezar encuesta\n"
" % endif\n"
" </a>\n"
" </div>\n"
" % if object.deadline:\n"
" Por favor, responde antes del ${format_date(object.deadline)}.<"
"br/><br/>\n"
" % endif\n"
" Grácias por tu participación.\n"
" </p>\n"
" </div>\n"
" "
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course
msgid "Course"
msgstr "Curso"
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course_attendee
msgid "Course Attendee"
msgstr "Asistente"
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course_schedule
msgid "Course Schedule"
msgstr "Programación del curso"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__display_name
msgid "Display Name"
msgstr "Mostrar Nombre"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__examination_survey_id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__examination_survey_id
msgid "Examination Survey"
msgstr "Encuesta de examen"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__hr_course_attendee_ids
msgid "Hr Course Attendee"
msgstr "Asistente"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__id
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__id
msgid "ID"
msgstr "ID"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input____last_update
msgid "Last Modified on"
msgstr "Última Modificación el"
#. module: hr_course_survey
#: model:mail.template,subject:hr_course_survey.mail_template_user_input_invite
msgid "Participate to ${object.survey_id.title} survey"
msgstr "Participa a en la encuesta ${object.surey_id.title}"
#. module: hr_course_survey
#: model_terms:ir.ui.view,arch_db:hr_course_survey.hr_course_attendee_tree_view
msgid "Retry"
msgstr "Reintentar"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__survey_answer_id
msgid "Survey Answer"
msgstr "Respuesta"
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_survey_user_input
msgid "Survey User Input"
msgstr "Entrada de usuario de la encuesta"
#. module: hr_course_survey
#: code:addons/hr_course_survey/models/hr_course_attendee.py:0
#, python-format
msgid "Survey cannot be sent because the previous survey has not been answered"
msgstr ""
"No se puede enviar la encuesta por que el anterior envío no ha sido "
"contestado"
#. module: hr_course_survey
#: code:addons/hr_course_survey/models/hr_course_attendee.py:0
#, python-format
msgid "Survey cannot be sent if the user has not failed"
msgstr "La encuesta no puede reenviarse si el usuario no ha suspendido"
#~ msgid ""
#~ "<div style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
#~ "\">\n"
#~ " Dear ${object.partner_id.name or 'participant'}<br/><br/>\n"
#~ " % if object.survey_id.certificate:\n"
#~ " You have been invited to take a new certification.\n"
#~ " % else:\n"
#~ " We are conducting a survey and your response would be "
#~ "appreciated.\n"
#~ " % endif\n"
#~ " <div style=\"margin: 16px 0px 16px 0px;\">\n"
#~ " <a href=\"${('%s?answer_token=%s' % (object."
#~ "survey_id.public_url, object.token)) | safe}\" style=\"background-color: "
#~ "#875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: #fff; "
#~ "border-radius: 5px; font-size:13px;\">\n"
#~ " % if object.survey_id.certificate:\n"
#~ " Start Certification\n"
#~ " % else:\n"
#~ " Start Survey\n"
#~ " % endif\n"
#~ " </a>\n"
#~ " </div>\n"
#~ " % if object.deadline:\n"
#~ " Please answer the survey for ${format_date(object.deadline)}."
#~ "<br/><br/>\n"
#~ " % endif\n"
#~ " Thank you for your participation.\n"
#~ " </p>\n"
#~ " </div>\n"
#~ " "
#~ msgstr ""
#~ "<div style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
#~ "\">\n"
#~ " Querido ${object.partner_id.name or 'participant'}<br/><br/>\n"
#~ " % if object.survey_id.certificate:\n"
#~ " Has sido invitado a tomar la siguiente certificación.\n"
#~ " % else:\n"
#~ " Estamos realizanod la siguiente encuesta y nos interesaría "
#~ "saber tu opinión.\n"
#~ " % endif\n"
#~ " <div style=\"margin: 16px 0px 16px 0px;\">\n"
#~ " <a href=\"${('%s?answer_token=%s' % (object."
#~ "survey_id.public_url, object.token)) | safe}\" style=\"background-color: "
#~ "#875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: #fff; "
#~ "border-radius: 5px; font-size:13px;\">\n"
#~ " % if object.survey_id.certificate:\n"
#~ " Empezar certificación\n"
#~ " % else:\n"
#~ " Empezar encuesta\n"
#~ " % endif\n"
#~ " </a>\n"
#~ " </div>\n"
#~ " % if object.deadline:\n"
#~ " Por favor, responde antes del ${format_date(object.deadline)}."
#~ "<br/><br/>\n"
#~ " % endif\n"
#~ " Grácias por tu participación.\n"
#~ " </p>\n"
#~ " </div>\n"
#~ " "

View File

@ -0,0 +1,131 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_course_survey
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: es_PA\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#. module: hr_course_survey
#: model:mail.template,body_html:hr_course_survey.mail_template_user_input_invite
msgid ""
"<div style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" <p style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" Dear ${object.partner_id.name or 'participant'}<br/><br/>\n"
" % if object.survey_id.certificate:\n"
" You have been invited to take a new certification.\n"
" % else:\n"
" We are conducting a survey and your response would be "
"appreciated.\n"
" % endif\n"
" <div style=\"margin: 16px 0px 16px 0px;\">\n"
" <a href=\"${('%s?answer_token=%s' % (object."
"survey_id.public_url, object.access_token)) | safe}\" style=\"background-"
"color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: "
"#fff; border-radius: 5px; font-size:13px;\">\n"
" % if object.survey_id.certificate:\n"
" Start Certification\n"
" % else:\n"
" Start Survey\n"
" % endif\n"
" </a>\n"
" </div>\n"
" % if object.deadline:\n"
" Please answer the survey for ${format_date(object.deadline)}.<br/"
"><br/>\n"
" % endif\n"
" Thank you for your participation.\n"
" </p>\n"
" </div>\n"
" "
msgstr ""
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course
msgid "Course"
msgstr ""
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course_attendee
msgid "Course Attendee"
msgstr ""
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course_schedule
msgid "Course Schedule"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__display_name
msgid "Display Name"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__examination_survey_id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__examination_survey_id
msgid "Examination Survey"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__hr_course_attendee_ids
msgid "Hr Course Attendee"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__id
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__id
msgid "ID"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input____last_update
msgid "Last Modified on"
msgstr ""
#. module: hr_course_survey
#: model:mail.template,subject:hr_course_survey.mail_template_user_input_invite
msgid "Participate to ${object.survey_id.title} survey"
msgstr ""
#. module: hr_course_survey
#: model_terms:ir.ui.view,arch_db:hr_course_survey.hr_course_attendee_tree_view
msgid "Retry"
msgstr ""
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__survey_answer_id
msgid "Survey Answer"
msgstr ""
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_survey_user_input
msgid "Survey User Input"
msgstr ""
#. module: hr_course_survey
#: code:addons/hr_course_survey/models/hr_course_attendee.py:0
#, python-format
msgid "Survey cannot be sent because the previous survey has not been answered"
msgstr ""
#. module: hr_course_survey
#: code:addons/hr_course_survey/models/hr_course_attendee.py:0
#, python-format
msgid "Survey cannot be sent if the user has not failed"
msgstr ""

View File

@ -0,0 +1,164 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_course_survey
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-05-29 15:08+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\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"
"X-Generator: Weblate 4.17\n"
#. module: hr_course_survey
#: model:mail.template,body_html:hr_course_survey.mail_template_user_input_invite
msgid ""
"<div style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" <p style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" Dear ${object.partner_id.name or 'participant'}<br/><br/>\n"
" % if object.survey_id.certificate:\n"
" You have been invited to take a new certification.\n"
" % else:\n"
" We are conducting a survey and your response would be "
"appreciated.\n"
" % endif\n"
" <div style=\"margin: 16px 0px 16px 0px;\">\n"
" <a href=\"${('%s?answer_token=%s' % (object."
"survey_id.public_url, object.access_token)) | safe}\" style=\"background-"
"color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: "
"#fff; border-radius: 5px; font-size:13px;\">\n"
" % if object.survey_id.certificate:\n"
" Start Certification\n"
" % else:\n"
" Start Survey\n"
" % endif\n"
" </a>\n"
" </div>\n"
" % if object.deadline:\n"
" Please answer the survey for ${format_date(object.deadline)}.<br/"
"><br/>\n"
" % endif\n"
" Thank you for your participation.\n"
" </p>\n"
" </div>\n"
" "
msgstr ""
"<div style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" <p style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
" Spettabile ${object.partner_id.name or 'participant'}<br/><br/>\n"
" % if object.survey_id.certificate:\n"
" Siete invitati ad acquisire una nuova certificazione.\n"
" % else:\n"
" Stiamo conducendo un sondaggio è apprezzeremmo la vostra "
"risposta.\n"
" % endif\n"
" <div style=\"margin: 16px 0px 16px 0px;\">\n"
" <a href=\"${('%s?answer_token=%s' % (object."
"survey_id.public_url, object.access_token)) | safe}\" style=\"background-"
"color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: "
"#fff; border-radius: 5px; font-size:13px;\">\n"
" % if object.survey_id.certificate:\n"
" Inizio certificazione\n"
" % else:\n"
" Inizio sondaggio\n"
" % endif\n"
" </a>\n"
" </div>\n"
" % if object.deadline:\n"
" Si prega di rispondere al sondaggio entro il "
"${format_date(object.deadline)}.<br/><br/>\n"
" % endif\n"
" Ringraziamo per la partecipazione.\n"
" </p>\n"
" </div>\n"
" "
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course
msgid "Course"
msgstr "Corso"
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course_attendee
msgid "Course Attendee"
msgstr "Partecipante al corso"
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_hr_course_schedule
msgid "Course Schedule"
msgstr "Calendario corso"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__display_name
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__examination_survey_id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__examination_survey_id
msgid "Examination Survey"
msgstr "Sondaggio esame"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__hr_course_attendee_ids
msgid "Hr Course Attendee"
msgstr "Partecipante al corso RU"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course__id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__id
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule__id
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input__id
msgid "ID"
msgstr "ID"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_schedule____last_update
#: model:ir.model.fields,field_description:hr_course_survey.field_survey_user_input____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: hr_course_survey
#: model:mail.template,subject:hr_course_survey.mail_template_user_input_invite
msgid "Participate to ${object.survey_id.title} survey"
msgstr "Partecipa al sondaggio ${object.survey_id.title}"
#. module: hr_course_survey
#: model_terms:ir.ui.view,arch_db:hr_course_survey.hr_course_attendee_tree_view
msgid "Retry"
msgstr "Riprova"
#. module: hr_course_survey
#: model:ir.model.fields,field_description:hr_course_survey.field_hr_course_attendee__survey_answer_id
msgid "Survey Answer"
msgstr "Risposta sondaggio"
#. module: hr_course_survey
#: model:ir.model,name:hr_course_survey.model_survey_user_input
msgid "Survey User Input"
msgstr "Risposta utente al sondaggio"
#. module: hr_course_survey
#: code:addons/hr_course_survey/models/hr_course_attendee.py:0
#, python-format
msgid "Survey cannot be sent because the previous survey has not been answered"
msgstr ""
"Il sondaggio non può essere inviato perché il sondaggio precedente non è "
"stato compilato"
#. module: hr_course_survey
#: code:addons/hr_course_survey/models/hr_course_attendee.py:0
#, python-format
msgid "Survey cannot be sent if the user has not failed"
msgstr "Il sondaggio non può essere inviato se l'utente non ha fallito"

View File

@ -0,0 +1,4 @@
from . import hr_course_schedule
from . import hr_course
from . import hr_course_attendee
from . import survey_user_input

View File

@ -0,0 +1,14 @@
# Copyright 2021 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class HrCourse(models.Model):
_inherit = "hr.course"
examination_survey_id = fields.Many2one(
"survey.survey",
domain=[("state", "=", "open"), ("scoring_type", "!=", "no_scoring")],
)

View File

@ -0,0 +1,80 @@
# Copyright 2021 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from odoo import _, fields, models, tools
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class HrCourseAttendee(models.Model):
_inherit = "hr.course.attendee"
survey_answer_id = fields.Many2one("survey.user_input", readonly=True)
def _get_examination_survey_vals(self):
vals = {}
if self.employee_id.user_id:
vals["user"] = self.employee_id.user_id
else:
vals["partner"] = (
self.employee_id.address_id or self.employee_id.address_home_id
)
return vals
def _notify_survey(self):
template = self.env.ref("hr_course_survey.mail_template_user_input_invite")
subject = (
self.env["mail.template"]
.with_context(safe=True)
._render_template(
template.subject,
"survey.user_input",
[self.survey_answer_id.id],
post_process=True,
)
)[self.survey_answer_id.id]
body = self.env["mail.template"]._render_template(
template.body_html,
"survey.user_input",
[self.survey_answer_id.id],
post_process=True,
)[self.survey_answer_id.id]
# post the message
mail_values = {
"email_from": tools.formataddr((self.env.user.name, self.env.user.email)),
"author_id": self.env.user.partner_id.id,
"model": None,
"res_id": None,
"subject": subject,
"body_html": body,
"auto_delete": True,
}
if self.survey_answer_id.partner_id:
mail_values["recipient_ids"] = [(4, self.survey_answer_id.partner_id.id)]
else:
mail_values["email_to"] = self.survey_answer_id.email
return self.env["mail.mail"].sudo().create(mail_values)
def _send_survey(self):
vals = self._get_examination_survey_vals()
survey = self.course_schedule_id.examination_survey_id
self.survey_answer_id = survey._create_answer(**vals)
self._notify_survey()
def resend_survey(self):
self.ensure_one()
if self.survey_answer_id.state != "done":
raise ValidationError(
_(
"Survey cannot be sent because the "
"previous survey has not been answered"
)
)
if self.result != "failed":
raise ValidationError(_("Survey cannot be sent if the user has not failed"))
self._send_survey()
self.write({"result": "pending"})

View File

@ -0,0 +1,22 @@
# Copyright 2021 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class HrCourseSchedule(models.Model):
_inherit = "hr.course.schedule"
examination_survey_id = fields.Many2one(
"survey.survey",
related="course_id.examination_survey_id",
)
def inprogress2validation(self):
result = super().inprogress2validation()
for record in self:
if record.examination_survey_id:
for attendee in record.course_attendee_ids:
attendee._send_survey()
return result

View File

@ -0,0 +1,29 @@
# Copyright 2021 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class SurveyUserInput(models.Model):
_inherit = "survey.user_input"
hr_course_attendee_ids = fields.One2many(
"hr.course.attendee", inverse_name="survey_answer_id"
)
def _attendee_write_vals(self):
return {
"result": "failed"
if not self.scoring_success and self.survey_id.scoring_type != "no_scoring"
else "passed"
}
def _mark_done(self):
result = super()._mark_done()
for user_input in self:
if user_input.hr_course_attendee_ids:
user_input.hr_course_attendee_ids.write(
user_input._attendee_write_vals()
)
return result

View File

@ -0,0 +1,2 @@
* Enric Tobella <etobella@creublanca.es>
* Olga Marco <olga.marco@creublanca.es>

View File

@ -0,0 +1 @@
This module allows you to add a survey to your employee's training courses.

View File

@ -0,0 +1,13 @@
To use this module, you need to:
·Create a Survey: Surveys
·Create a Course: Employees -> Courses
·Add the Survey to the Course (Examination Survey field)
·Create a Training Schedule: Employees -> Courses Schedule
·Assign attendees to continue
(If a course is failed, you can select the "retry" option)

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1,433 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Hr Course Survey</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="hr-course-survey">
<h1 class="title">Hr Course Survey</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:9106aa496f0813d33af06a01289e734c8bc3215a3a3967eeffb414c14713b316
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/hr/tree/14.0/hr_course_survey"><img alt="OCA/hr" src="https://img.shields.io/badge/github-OCA%2Fhr-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/hr-14-0/hr-14-0-hr_course_survey"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/hr&amp;target_branch=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module allows you to add a survey to your employees training courses.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<p>To use this module, you need to:</p>
<p>·Create a Survey: Surveys</p>
<p>·Create a Course: Employees -&gt; Courses</p>
<p>·Add the Survey to the Course (Examination Survey field)</p>
<p>·Create a Training Schedule: Employees -&gt; Courses Schedule</p>
<p>·Assign attendees to continue</p>
<p>(If a course is failed, you can select the “retry” option)</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/hr/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/hr/issues/new?body=module:%20hr_course_survey%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>Creu Blanca</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Enric Tobella &lt;<a class="reference external" href="mailto:etobella&#64;creublanca.es">etobella&#64;creublanca.es</a>&gt;</li>
<li>Olga Marco &lt;<a class="reference external" href="mailto:olga.marco&#64;creublanca.es">olga.marco&#64;creublanca.es</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/hr/tree/14.0/hr_course_survey">OCA/hr</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1 @@
from . import test_hr_course

View File

@ -0,0 +1,125 @@
# Copyright 2019 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.exceptions import ValidationError
from odoo.addons.survey.tests import common
class TestHrCourse(common.TestSurveyCommon):
def setUp(self):
super(TestHrCourse, self).setUp()
self.survey = (
self.env["survey.survey"]
.with_user(self.survey_manager)
.create(
{
"title": "Test Survey",
"access_mode": "public",
"users_login_required": True,
"users_can_go_back": False,
"state": "open",
"scoring_type": "scoring_without_answers",
}
)
)
self.question = self._add_question(
self.page_0,
"Q0",
"simple_choice",
survey_id=self.survey.id,
labels=[
{"value": "Choice0", "is_correct": True, "answer_score": 100},
{"value": "Choice1"},
],
)
self.course_categ = self.env["hr.course.category"].create({"name": "Category1"})
self.employee1 = self.env["hr.employee"].create({"name": "Employee1"})
self.employee2 = self.env["hr.employee"].create({"name": "Employee2"})
self.course = self.env["hr.course"].create(
{
"name": "Test Course",
"category_id": self.course_categ.id,
"examination_survey_id": self.survey.id,
"permanence": False,
}
)
def test_hr_schedule(self):
self.course_schedule = self.env["hr.course.schedule"].create(
{
"name": "Test Schedule",
"course_id": self.course.id,
"cost": 100,
"examination_survey_id": self.survey.id,
"authorized_by": self.employee1.id,
"start_date": "2019-02-15",
"end_date": "2019-02-20",
}
)
with self.assertRaises(ValidationError):
self.course_schedule.write({"end_date": "2019-02-10"})
self.assertEqual(self.course_schedule.state, "draft")
self.course_schedule.cancel_course()
self.assertEqual(self.course_schedule.state, "cancelled")
self.course_schedule.back2draft()
self.course_schedule.draft2waiting()
self.assertEqual(self.course_schedule.state, "waiting_attendees")
self.course_schedule.attendant_ids = [
(6, 0, [self.employee1.id, self.employee2.id])
]
self.assertTrue(self.course_schedule.attendant_ids)
self.assertEqual(len(self.course_schedule.attendant_ids), 2)
self.course_schedule.waiting2inprogress()
self.assertEqual(self.course_schedule.state, "in_progress")
self.assertEqual(len(self.course_schedule.course_attendee_ids), 2)
self.assertFalse(self.course_schedule.course_attendee_ids[0].survey_answer_id)
self.course_schedule.attendant_ids = [(2, self.employee2.id, 0)]
self.course_schedule.waiting2inprogress()
self.assertEqual(len(self.course_schedule.attendant_ids), 1)
self.assertEqual(len(self.course_schedule.course_attendee_ids), 1)
self.employee1._compute_count_courses()
self.assertEqual(self.employee1.count_courses, 1)
self.employee1.action_view_course()
self.course_schedule.inprogress2validation()
self.assertEqual(self.course_schedule.state, "in_validation")
self.assertEqual(self.course_schedule.course_attendee_ids.result, "pending")
with self.assertRaises(ValidationError):
self.course_schedule.course_attendee_ids.resend_survey()
answer = self.course_schedule.course_attendee_ids.survey_answer_id
self.assertTrue(answer.hr_course_attendee_ids)
self._add_answer_line(
self.question,
answer,
self.question.suggested_answer_ids.filtered(
lambda l: l.value == "Choice1"
).id,
answer_type="suggestion",
answer_fname="suggested_answer_id",
)
answer._mark_done()
self.assertEqual(self.course_schedule.course_attendee_ids.result, "failed")
self.course_schedule.course_attendee_ids.resend_survey()
self.assertNotEqual(
answer, self.course_schedule.course_attendee_ids.survey_answer_id
)
answer = self.course_schedule.course_attendee_ids.survey_answer_id
self.assertTrue(answer.hr_course_attendee_ids)
self._add_answer_line(
self.question,
answer,
self.question.suggested_answer_ids.filtered(
lambda l: l.value == "Choice0"
).id,
answer_type="suggestion",
answer_fname="suggested_answer_id",
)
answer._mark_done()
self.assertEqual(self.course_schedule.course_attendee_ids.result, "passed")
with self.assertRaises(ValidationError):
self.course_schedule.course_attendee_ids.resend_survey()

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2021 Creu Blanca
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record model="ir.ui.view" id="hr_course_form_view">
<field name="name">hr.course.form (in hr_course_survey)</field>
<field name="model">hr.course</field>
<field name="inherit_id" ref="hr_course.hr_course_form_view" />
<field name="arch" type="xml">
<field name="category_id" position="after">
<field name="examination_survey_id" />
</field>
</field>
</record>
</odoo>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2021 Creu Blanca
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record model="ir.ui.view" id="hr_course_attendee_tree_view">
<field name="name">hr.course.attendee.tree</field>
<field name="model">hr.course.attendee</field>
<field name="inherit_id" ref="hr_course.hr_course_attendee_tree_view" />
<field name="groups_id" eval="[(4, ref('hr.group_hr_manager'))]" />
<field name="arch" type="xml">
<field name="result" position="after">
<field
name="survey_answer_id"
attrs="{'invisible': [('survey_answer_id', '=', False)]}"
/>
<button
name="resend_survey"
string="Retry"
type="object"
icon="fa-repeat text-success"
attrs="{'column_invisible': [('parent.state', 'not in', ('in_validation'))], 'invisible': ['|', ('result', '!=', 'failed'), ('survey_answer_id', '=', False)]}"
/>
</field>
</field>
</record>
</odoo>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2021 Creu Blanca
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
</odoo>

View File

@ -0,0 +1 @@
README

View File

@ -0,0 +1 @@
from . import models

View File

@ -0,0 +1,30 @@
{
'name': 'File Question',
'summary': 'Adds new File Question type, uploaded file stored in answers, '
'survey attachment',
'author': 'Kitworks Systems',
"category":"Odex25-Survey/Odex25-Survey",
'website': 'https://kitworks.systems/',
'license': 'OPL-1',
'version': '14.0.1.0.5',
'depends': [
'survey', 'mail', 'web_widget_url_advanced',
],
'data': [
'views/survey_template_view.xml',
'views/survey_user_input_line_view.xml',
'views/survey_view.xml',
'views/assets.xml',
],
'installable': True,
'images': [
'static/description/cover.png',
'static/description/icon.png',
],
}

View File

@ -0,0 +1,15 @@
import logging
from odoo import api, SUPERUSER_ID
_logger = logging.getLogger(__name__)
def migrate(cr, installed_version):
env = api.Environment(cr, SUPERUSER_ID, {})
user_input_line_ids = env['survey.user_input.line'].search([])
for il in user_input_line_ids:
if il.value_file:
il.write({
'value_file_ids': [(6, 0, [il.value_file.id])]})

View File

@ -0,0 +1 @@
from . import survey

View File

@ -0,0 +1,75 @@
import logging
from odoo import models, fields, api
_logger = logging.getLogger(__name__)
class SurveyQuestion(models.Model):
_inherit = 'survey.question'
question_type = fields.Selection(
selection_add=[('file', 'Upload file')])
upload_multiple_file = fields.Boolean()
class SurveyUserInputLine(models.Model):
_inherit = 'survey.user_input.line'
answer_type = fields.Selection(
selection_add=[('file', 'Upload file')])
value_file_ids = fields.Many2many(
comodel_name='ir.attachment', string='Survey file', readonly=True,)
value_file = fields.Many2one(
comodel_name='ir.attachment', string='Survey file', readonly=True,)
filename = fields.Char(
compute='_compute_filename', )
@api.depends('value_file_ids')
def _compute_filename(self):
for obj in self:
if not obj.value_file_ids:
obj.filename = ''
continue
filename = ', '.join(
['{}'.format(x.name) for x in obj.value_file_ids])
obj.filename = filename
@api.constrains('skipped', 'answer_type')
def _check_answer_type_skipped(self):
for line in self:
if line.answer_type != 'file':
return super(
SurveyUserInputLine, line)._check_answer_type_skipped()
return None
class SurveyUserInput(models.Model):
_inherit = "survey.user_input"
# pylint: disable=R1710
def save_lines(self, question, answer, comment=None):
old_answers = self.env['survey.user_input.line'].search([
('user_input_id', '=', self.id),
('question_id', '=', question.id)])
if question.question_type != 'file':
return super(SurveyUserInput, self).save_lines(
question, answer, comment)
self._save_line_files(question, old_answers, answer)
def _save_line_files(self, question, old_answers, answers):
vals = {
'user_input_id': self.id, 'question_id': question.id,
'skipped': False, 'answer_type': question.question_type, }
if answers and answers.get('values') \
and answers.get('is_answer_update'):
value_file_lines = [(0, 0, {
'name': answer.get('file_name'), 'datas': answer.get('data'),
'type': 'binary', }) for answer in answers.get('values')]
vals.update({'value_file_ids': value_file_lines})
if old_answers:
old_answers.unlink()
old_answers.create(vals)
else:
vals.update({'answer_type': None, 'skipped': True})
return old_answers

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,58 @@
<section style="max-width: 896px; margin: 0 auto;">
<div align="center">
<h1>File Question</h1>
</div>
<div>
<p>This module Adds new File Question type,
uploaded file stored in answers
</p>
</div>
<div>
<div class="oe_demo oe_screenshot">
<img class="oe_screenshot" src="1.png" title="Example"/>
</div>
</div>
<div>
<p>Adds possibility upload file as question answer.
</p>
</div>
<div>
<div class="oe_demo oe_screenshot">
<img class="oe_screenshot" src="2.png" title="Example"/>
</div>
</div>
<div>
<p>Uploaded file stored in answers and can be downloaded and reviewed
</p>
</div>
<div>
<div class="oe_demo oe_screenshot">
<img class="oe_screenshot" src="3.png" title="Example"/>
</div>
</div>
</section>
<section align="center" style="max-width: 896px; margin: 0 auto; padding-top: 15px;">
<div>
<h5>Maintainer</h5>
<a href="https://kitworks.systems/"><img alt="KitWorks"
src="https://kitworks.systems/logo.png?company=1"/></a>
<p>Our web site: <a href="https://kitworks.systems">https://kitworks.systems</a>
</p>
<p>This module is maintained by the
<a href="https://kitworks.systems">Kitworks systems</a>
company.
</p>
<p>
We can provide you further Odoo Support, Odoo implementation,
Odoo customization, Odoo 3rd Party development and integration
software, consulting services. Our main goal is to provide the best
quality product for you.
</p>
<p>
For any questions
<a href="mailto:info@kitworks.systems">contact us</a>.
</p>
</div>
</section>

View File

@ -0,0 +1,90 @@
odoo.define('cybernet.survey.form', function (require) {
'use strict';
var SurveyFormWidget = require('survey.form');
var utils = require('web.utils');
SurveyFormWidget.include({
// Possible add file validation on client side when it mandatory question
start: function () {
this.fileEncoderPromises = [];
var self = this;
return this._super.apply(this, arguments)
},
// Rewrite _submitForm to catch promise that converts file to base64 format.
_submitForm: function (options) {
var self = this;
var params = {};
if (options.previousPageId) {
params.previous_page_id = options.previousPageId;
}
var route = "/survey/submit";
if (this.options.isStartScreen) {
route = "/survey/begin";
// Hide survey title in 'page_per_question' layout: it takes too much space
if (this.options.questionsLayout === 'page_per_question') {
this.$('.o_survey_main_title').fadeOut(400);
}
} else {
var $form = this.$('form');
var formData = new FormData($form[0]);
if (!options.skipValidation) {
// Validation pre submit
if (!this._validateForm($form, formData)) {
return;
}
}
this.fileEncoderPromises = [];
this._prepareSubmitValues(formData, params);
}
// prevent user from submitting more times using enter key
this.preventEnterSubmit = true;
if (this.options.sessionInProgress) {
// reset the fadeInOutDelay when attendee is submitting form
this.fadeInOutDelay = 400;
// prevent user from clicking on matrix options when form is submitted
this.readonly = true;
}
var submitPromise = Promise.all(this.fileEncoderPromises).then(() => {
return self._rpc({
route: _.str.sprintf('%s/%s/%s', route, self.options.surveyToken, self.options.answerToken),
params: params,
});
});
this._nextScreen(submitPromise, options);
},
_prepareSubmitValues: function (formData, params) {
var self = this;
var result = this._super.apply(this, arguments);
this.$('[data-question-type]').each(function () {
if ($(this).data('questionType') == 'file') {
self._prepareSubmitAnswerFile(params, $(this), this.name);
}
});
return result;
},
_prepareSubmitAnswerFile: function (params, $parent, questionId) {
const file = $parent[0].files[0];
if (file) {
var fileEncoderPromise = utils.getDataURLFromFile(file).then(function (data) {
data = data.split(',')[1];
params[questionId] = [file.name, data];
});
this.fileEncoderPromises.push(fileEncoderPromise);
}
},
})
});

View File

@ -0,0 +1,8 @@
<odoo>
<template id="survey_assets" name="Survey Attachment Survey Results assets"
inherit_id="survey.survey_assets">
<xpath expr="." position="inside">
<script type="text/javascript" src="/kw_survey_attachment/static/src/js/survey_form.js"/>
</xpath>
</template>
</odoo>

View File

@ -0,0 +1,41 @@
<odoo>
<template id="question_container" name="Kw survey attachment Survey: question container" inherit_id="survey.question_container">
<xpath expr="//div[@role='alert']" position="before">
<t t-if="question.question_type == 'file'"><t t-call="kw_survey_attachment.question_upload_file"/></t>
</xpath>
</template>
<template id="survey_page_print" name="Kw survey attachment Survey: print page" inherit_id="survey.survey_page_print">
<xpath expr="//div[@role='alert']" position="before">
<t t-if="question.question_type == 'file'"><t t-call="kw_survey_attachment.review_upload_file"/></t>
</xpath>
</template>
<template id="review_upload_file" name="Question: file">
<div class="o_survey_file_container">
<t t-foreach="answer_lines.value_file_ids" t-as="file">
<div>
<a t-attf-href="/web/binary/download/#{file.id}" aria-label="Download" title="Download">
<i class="fa fa-download" />
<span><t t-esc="file.name" /></span>
</a>
</div>
</t>
</div>
</template>
<template id="question_upload_file" name="Question: Upload File">
<div class="o_survey_comment_container p-0">
<input type="file" class="form-control o_survey_question_upload_file bg-transparent text-dark rounded-0 p-0" t-att-data-name="question.id" t-att-data-question-type="question.question_type" t-att-id="'file_name_%d' % question.id" t-att-multiple="question.upload_multiple_file" />
<t t-foreach="answer_lines.value_file_ids" t-as="file">
<div>
<a t-attf-href="/web/binary/download/#{file.id}" aria-label="Download" title="Download">
<i class="fa fa-download" />
<span><t t-esc="file.name" /></span>
</a>
</div>
</t>
</div>
</template>
</odoo>

View File

@ -0,0 +1,31 @@
<odoo>
<!-- Inherit Form View -->
<record id="kw_survey_attachment_inherit_survey_user_input_line_form"
model="ir.ui.view">
<field name="name">add upload to user input</field>
<field name="model">survey.user_input.line</field>
<field name="inherit_id" ref="survey.survey_user_input_line_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='answer_type']" position="after">
<field name="value_file_ids" attrs="{'invisible': [('answer_type', '!=', 'file')]}">
<tree create="0" edit="0">
<field name="name" invisible="1"/>
<field name="datas" widget="binary" filename="name"/>
</tree>
</field>
</xpath>
</field>
</record>
<record id="kw_survey_attachment_survey_user_input_form"
model="ir.ui.view">
<field name="name">survey.user_input.form (kw_survey_attachment)</field>
<field name="model">survey.user_input</field>
<field name="inherit_id" ref="survey.survey_user_input_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='answer_type']" position="after">
<field name="filename" invisible="1"/>
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1,21 @@
<odoo>
<record id="survey_question_validation" model="ir.ui.view">
<field name="name">survey.question.validation</field>
<field name="model">survey.question</field>
<field name="inherit_id" ref="survey.survey_question_form"/>
<field name="arch" type="xml">
<xpath expr="//page[@name='answers']" position="inside">
<group>
<div attrs="{'invisible': [('question_type', '!=', 'file')]}">
<p class="o_upload_file">Upload Files
<i class="fa fa-upload fa-2x"/>
</p>
</div>
</group>
</xpath>
<field name="constr_error_msg" position="after">
<field name="upload_multiple_file" attrs="{'invisible': [('question_type', '!=', 'file')]}"/>
</field>
</field>
</record>
</odoo>

View File

@ -0,0 +1,70 @@
.. |company| replace:: ADHOC SA
.. |company_logo| image:: https://raw.githubusercontent.com/ingadhoc/maintainer-tools/master/resources/adhoc-logo.png
:alt: ADHOC SA
:target: https://www.adhoc.com.ar
.. |icon| image:: https://raw.githubusercontent.com/ingadhoc/maintainer-tools/master/resources/adhoc-icon.png
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: https://www.gnu.org/licenses/agpl
:alt: License: AGPL-3
============================
Survey Conditional Questions
============================
This module add the Survey Conditional Questions.
Installation
============
To install this module, you need to:
#. Only need to install the module
Configuration
=============
To configure this module, you need to:
#. Nothing to configure
Usage
=====
To use this module, you need to:
#. Go to ...
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: http://runbot.adhoc.com.ar/
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/ingadhoc/survey/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smashing it by providing a detailed and welcomed feedback.
Credits
=======
Images
------
* |company| |icon|
Contributors
------------
Maintainer
----------
|company_logo|
This module is maintained by the |company|.
To contribute to this module, please visit https://www.adhoc.com.ar.

View File

@ -0,0 +1,6 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in module root
# directory
##############################################################################
from . import models
from . import controllers

View File

@ -0,0 +1,20 @@
# © 2015 ADHOC SA (http://www.adhoc.com.ar)
# © 2020 Opener B.V. (https://opener.amsterdam)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Survey Conditional Questions",
"version": "14.0.1.0.0",
"category": "Odex25-Survey/Odex25-Survey",
"sequence": 14,
"summary": "",
"author": "ADHOC SA, Opener B.V., Creu Blanca, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/survey",
"license": "AGPL-3",
"images": [],
"depends": ["survey"],
"data": ["views/survey_question_views.xml", "views/survey_question_qweb.xml"],
"demo": [],
"installable": True,
"auto_install": False,
"application": False,
}

View File

@ -0,0 +1,5 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in module root
# directory
##############################################################################
from . import main

View File

@ -0,0 +1,55 @@
#############################################################################
# For copyright and license notices, see __manifest__.py file in module root
# directory
#############################################################################
import logging
from collections import defaultdict
from odoo.addons.survey.controllers.main import Survey
_logger = logging.getLogger(__name__)
class SurveyConditional(Survey):
def _prepare_survey_data(self, survey_sudo, answer_sudo, **post):
result = super(SurveyConditional, self)._prepare_survey_data(
survey_sudo, answer_sudo, **post
)
if survey_sudo.questions_layout != "page_per_question":
(
_questions,
triggered_questions_by_answer,
_answers,
) = answer_sudo._get_conditional_values()
no_answer_questions = triggered_questions_by_answer.get(
answer_sudo.env["survey.question.answer"],
answer_sudo.env["survey.question"],
)
no_answer_questions_by_question = defaultdict(lambda: [])
for question in no_answer_questions:
no_answer_questions_by_question[
question.triggering_question_id.id
].append(
[
question.id,
question.conditional_minimum_value,
question.conditional_maximum_value,
]
)
result.update(
{
"no_answer_conditional_questions": {
question.id: [
question.triggering_question_id,
question.conditional_minimum_value,
question.conditional_maximum_value,
]
for question in no_answer_questions
},
"no_answer_conditional_questions_"
"by_question": no_answer_questions_by_question,
}
)
return result

View File

@ -0,0 +1,109 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * survey_conditional_question
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-29 08:25+0000\n"
"PO-Revision-Date: 2021-09-29 08:25+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__conditional_maximum_value
msgid "Conditional Maximum Value"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__conditional_minimum_value
msgid "Conditional Minimum Value"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__display_name
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_survey__display_name
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input__display_name
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line__display_name
msgid "Display Name"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line__hidden
msgid "Hidden"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__id
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_survey__id
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input__id
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line__id
msgid "ID"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_question__conditional_maximum_value
msgid "If the value is higher, it will not be shown"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_question__conditional_minimum_value
msgid "If the value is lower, it will not be shown"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_user_input_line__hidden
msgid ""
"Indicate whether this input's question was hidden on condition of earlier "
"questions in the survey."
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question____last_update
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_survey____last_update
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input____last_update
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line____last_update
msgid "Last Modified on"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_question__triggering_question_id
msgid ""
"Question containing the triggering answer to display the current question."
msgstr ""
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_survey
msgid "Survey"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_question
msgid "Survey Question"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_user_input
msgid "Survey User Input"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_user_input_line
msgid "Survey User Input Line"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__triggering_question_id
msgid "Triggering Question"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__triggering_question_type
msgid "Triggering question type"
msgstr ""

View File

@ -0,0 +1,111 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * survey_conditional_question
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-29 08:27+0000\n"
"PO-Revision-Date: 2021-09-29 08:27+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__conditional_maximum_value
msgid "Conditional Maximum Value"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__conditional_minimum_value
msgid "Conditional Minimum Value"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__display_name
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_survey__display_name
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input__display_name
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line__display_name
msgid "Display Name"
msgstr "Nombre mostrado"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line__hidden
msgid "Hidden"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__id
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_survey__id
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input__id
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line__id
msgid "ID"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_question__conditional_maximum_value
msgid "If the value is higher, it will not be shown"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_question__conditional_minimum_value
msgid "If the value is lower, it will not be shown"
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_user_input_line__hidden
msgid ""
"Indicate whether this input's question was hidden on condition of earlier "
"questions in the survey."
msgstr ""
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question____last_update
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_survey____last_update
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input____last_update
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line____last_update
msgid "Last Modified on"
msgstr "Última modificación el"
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_question__triggering_question_id
msgid ""
"Question containing the triggering answer to display the current question."
msgstr ""
"Pregunta que contiene la respuesta desencadenante para mostrar la pregunta "
"actual."
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_survey
msgid "Survey"
msgstr "Encuesta"
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_question
msgid "Survey Question"
msgstr "Pregunta de la encuesta"
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_user_input
msgid "Survey User Input"
msgstr "Entrada de usuario de la encuesta"
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_user_input_line
msgid "Survey User Input Line"
msgstr "Línea de entrada de usuario de la encuesta"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__triggering_question_id
msgid "Triggering Question"
msgstr "Pregunta desencadenante"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__triggering_question_type
msgid "Triggering question type"
msgstr ""

View File

@ -0,0 +1,113 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * survey_conditional_question
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-10-09 09:10+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\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"
"X-Generator: Weblate 4.17\n"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__conditional_maximum_value
msgid "Conditional Maximum Value"
msgstr "Valore massimo condizionato"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__conditional_minimum_value
msgid "Conditional Minimum Value"
msgstr "Valore minimo condizionato"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__display_name
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_survey__display_name
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input__display_name
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line__hidden
msgid "Hidden"
msgstr "Nascosto"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__id
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_survey__id
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input__id
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line__id
msgid "ID"
msgstr "ID"
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_question__conditional_maximum_value
msgid "If the value is higher, it will not be shown"
msgstr "Se il valore è più alto, non viene mostrato"
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_question__conditional_minimum_value
msgid "If the value is lower, it will not be shown"
msgstr "Se il valore è più basso, non viene mostrato"
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_user_input_line__hidden
msgid ""
"Indicate whether this input's question was hidden on condition of earlier "
"questions in the survey."
msgstr ""
"Indica se la domanda di questa risposta era nascosta in funzione a domande "
"precedenti nel sondaggio."
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question____last_update
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_survey____last_update
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input____last_update
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_user_input_line____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: survey_conditional_question
#: model:ir.model.fields,help:survey_conditional_question.field_survey_question__triggering_question_id
msgid ""
"Question containing the triggering answer to display the current question."
msgstr ""
"Domanda che contiene la risposta che attiva la visualizzazione della domanda "
"corrente."
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_survey
msgid "Survey"
msgstr "Sondaggio"
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_question
msgid "Survey Question"
msgstr "Domanda sondaggio"
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_user_input
msgid "Survey User Input"
msgstr "Risposta utente al sondaggio"
#. module: survey_conditional_question
#: model:ir.model,name:survey_conditional_question.model_survey_user_input_line
msgid "Survey User Input Line"
msgstr "Riga risposta utente al sondaggio"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__triggering_question_id
msgid "Triggering Question"
msgstr "Domanda attivatrice"
#. module: survey_conditional_question
#: model:ir.model.fields,field_description:survey_conditional_question.field_survey_question__triggering_question_type
msgid "Triggering question type"
msgstr "Tipo di domanda attivatrice"

View File

@ -0,0 +1,8 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in module root
# directory
##############################################################################
from . import survey_survey
from . import survey_question
from . import survey_user_input
from . import survey_user_input_line

View File

@ -0,0 +1,45 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in module root
# directory
##############################################################################
from odoo import fields, models
class SurveyQuestion(models.Model):
_inherit = "survey.question"
triggering_question_id = fields.Many2one(
domain="""[('survey_id', '=', survey_id),
('question_type', '!=', False), '|',
('sequence', '<', sequence),
'&', ('sequence', '=', sequence), ('id', '<', id)]"""
)
triggering_question_type = fields.Selection(
related="triggering_question_id.question_type",
string="Triggering question type",
)
conditional_minimum_value = fields.Float(
help="If the value is lower, it will not be shown", copy=False
)
conditional_maximum_value = fields.Float(
help="If the value is higher, it will not be shown", copy=False
)
def _hidden_on_same_page(self, post):
"""Indicate that the question was hidden dynamically due to answers
to questions on the same page
"""
self.ensure_one()
qkey = "{}_{}_{}".format(
self.survey_id.id,
self.page_id.id,
self.triggering_question_id.id,
)
if qkey in post:
# Compare the simple choice answer to the triggering answer
return str(post[qkey]) != str(self.triggering_answer_id.id)
akey = "{}_{}".format(qkey, self.triggering_answer_id.id)
if any(key.startswith(qkey + "_") for key in post.keys()) and akey not in post:
# Multiple choice answers for the triggering question are present,
# but not this question's triggering answer
return True
return False

View File

@ -0,0 +1,27 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in module root
# directory
##############################################################################
from odoo import api, models
class SurveySurvey(models.Model):
_inherit = "survey.survey"
@api.model
def next_page(self, user_input, page_id, go_back=False):
"""Skip pages that only have hidden questions on them,
except if its the last page or the first page (in which case there
is a configuration error in the survey)."""
questions_to_hide = user_input.get_hidden_questions()
res = super(SurveySurvey, self).next_page(user_input, page_id, go_back=go_back)
page, index, last = res
if page and not (page.question_ids - questions_to_hide):
if (not go_back and not last) or (go_back and index):
# Mark every question on this hidden page as hidden.
for question in page.question_ids:
self.env["survey.user_input_line"].update_hidden(
user_input, question
)
return self.next_page(user_input, page.id, go_back=go_back)
return res

View File

@ -0,0 +1,31 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in module root
# directory
##############################################################################
from odoo import models
class SurveyUserInput(models.Model):
_inherit = "survey.user_input"
def _get_inactive_conditional_questions(self):
result = super()._get_inactive_conditional_questions()
questions_to_hide = self.env["survey.question"]
for question in result:
if question.triggering_question_type in [
"simple_choice",
"multiple_choice",
]:
questions_to_hide |= question
continue
question2 = question.triggering_question_id
input_answer_id = self.user_input_line_ids.filtered(
lambda x: x.question_id == question2
)
if (
input_answer_id.value_numerical_box < question.conditional_minimum_value
or input_answer_id.value_numerical_box
> question.conditional_maximum_value
):
questions_to_hide |= question
return questions_to_hide

View File

@ -0,0 +1,68 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in module root
# directory
##############################################################################
from odoo import api, fields, models
class SurveyUserInputLine(models.Model):
_inherit = "survey.user_input.line"
hidden = fields.Boolean(
help=(
"Indicate whether this input's question was hidden on "
"condition of earlier questions in the survey."
)
)
@api.model
def update_hidden(self, user_input, question, hidden=True):
"""If hidden, delete all preexisting values and replace by a dummy
one marked as hidden. If not hidden, delete any preexisting value
marked as hidden."""
domain = [
("user_input_id", "=", user_input.id),
("survey_id", "=", question.survey_id.id),
("question_id", "=", question.id),
]
if not hidden:
# Only select hidden values
domain.append(("hidden", "=", True))
existing = self.search(domain)
if not hidden:
if existing:
# Remove the hidden value
existing.unlink()
return
if existing:
if len(existing) == 1 and existing.hidden:
# Nothing to do
return existing
# Else, wipe all values
existing.unlink()
return self.create(
{
"user_input_id": user_input.id,
"question_id": question.id,
"survey_id": question.survey_id.id,
"skipped": True,
"hidden": True,
}
)
@api.model
def save_lines(self, user_input_id, question, post, answer_tag):
"""Set anwers to hidden and wipe their contents"""
user_input = self.env["survey.user_input"].browse(user_input_id)
hidden = False
if question.is_conditional:
if question.page_id == question.triggering_question_id.page_id:
hidden = question._hidden_on_same_page(post)
else:
hidden = question in user_input.get_hidden_questions()
self.update_hidden(user_input, question, hidden=hidden)
if hidden:
return True
return super(SurveyUserInputLine, self).save_lines(
user_input_id, question, post, answer_tag
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1,35 @@
odoo.define("survey.conditional_question", function (require) {
"use strict";
var SurveyFormWidget = require("survey.form");
SurveyFormWidget.include({
events: _.extend({}, SurveyFormWidget.prototype.events, {
"change input[type='number']": "_onChangeInputNumber",
}),
_onChangeInputNumber: function (event) {
if (this.options.questionsLayout !== "page_per_question") {
var $target = $(event.currentTarget);
var questionId = $target[0].name;
var result = parseFloat($target[0].value);
if (this.options.noAnswerConditionalQuestionsByQuestion[questionId]) {
_.forEach(
this.options.noAnswerConditionalQuestionsByQuestion[questionId],
function (question_data) {
var dependingQuestion = $(
".js_question-wrapper#" + question_data[0]
);
if (
result < question_data[1] ||
question_data[2] < result
) {
dependingQuestion.addClass("d-none");
} else {
dependingQuestion.removeClass("d-none");
}
}
);
}
}
},
});
});

View File

@ -0,0 +1,3 @@
.hidden {
display: none !important;
}

View File

@ -0,0 +1 @@
from . import test_survey_conditional_questions

View File

@ -0,0 +1,89 @@
from odoo.addons.survey.tests import common
class TestSurveyConditionalQuestions(common.TestSurveyCommon):
def setUp(self):
super(TestSurveyConditionalQuestions, self).setUp()
question = self._add_question(
self.page_0,
"Q0",
"simple_choice",
survey_id=self.survey.id,
)
conditional_question = self._add_question(
self.page_0,
"Q0",
"simple_choice",
labels=[{"value": 1}, {"value": 2}],
survey_id=self.survey.id,
)
conditional_values = {
"is_conditional": True,
"triggering_question_id": question.id,
"triggering_answer_id": 1,
}
conditional_question.write(conditional_values)
user_input = self.env["survey.user_input"].create(
{
"survey_id": question.survey_id.id,
"partner_id": self.env.user.partner_id.id,
}
)
# Conditional question is hidden when original question not answered
self.assertIn(conditional_question, user_input.get_hidden_questions())
tag = "{}_{}".format(question.survey_id.id, question.id)
conditional_tag = "{}_{}".format(self.survey.id, conditional_question.id)
self.env["survey.user_input_line"].save_lines(
user_input.id,
question,
{
"%s_%s"
% (tag, question.labels_ids[0]["value"]): question.labels_ids[0][
"value"
]
},
tag,
)
# Conditional question is not hidden if the desired answer was given
user_input.refresh()
self.assertNotIn(conditional_question, user_input.get_hidden_questions())
data = self.url_open(
"/survey/hidden/{}/{}/0".format(self.survey.access_token, user_input.token)
).json()
self.assertNotIn(conditional_tag, data["hidden_questions"])
# Conditional question is hidden for any other answer
self.env["survey.user_input_line"].save_lines(
user_input.id,
question,
{
"%s_%s"
% (tag, question.labels_ids[1]["value"]): question.labels_ids[1][
"value"
]
},
tag,
)
user_input.refresh()
self.assertIn(conditional_question, user_input.get_hidden_questions())
data = self.url_open(
"/survey/hidden/{}/{}/0".format(self.survey.access_token, user_input.token)
).json()
self.assertIn(conditional_tag, data["hidden_questions"])
self.env["survey.user_input_line"].save_lines(
user_input.id,
conditional_question,
{
conditional_tag: conditional_question.labels_ids[1]["value"],
"%s_%s"
% (tag, question.labels_ids[1]["value"]): question.labels_ids[1][
"value"
],
},
conditional_tag,
)
user_input.refresh()
line = user_input.user_input_line_ids.filtered(
lambda r: r.question_id == conditional_question
)
self.assertTrue(line.skipped)

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template
id="assets_frontend"
inherit_id="survey.survey_assets"
name="Survey Conditional Assets"
>
<xpath expr="." position="inside">
<script
type="text/javascript"
src="/survey_conditional_question/static/src/js/survey_conditional_questions.js"
/>
<link
rel="stylesheet"
href="/survey_conditional_question/static/src/scss/survey_conditional_questions.scss"
type="text/scss"
/>
</xpath>
</template>
<template id="survey_fill_form" inherit_id="survey.survey_fill_form">
<xpath expr="//form" position="attributes">
<attribute
name="t-att-data-no-answer-conditional-questions-by-question"
>json.dumps(no_answer_conditional_questions_by_question)</attribute>
</xpath>
</template>
<template id="question_container" inherit_id="survey.question_container">
<xpath expr="//t[@t-set='display_question']" position="before">
<t
t-if="question.is_conditional"
t-set="conditional_value"
t-value="question.id in no_answer_conditional_questions and answer.user_input_line_ids.filtered(lambda line: line.question_id == no_answer_conditional_questions[question.id][0]).value_numerical_box"
/>
</xpath>
<xpath expr="//t[@t-set='display_question']" position="attributes">
<attribute
name="t-value"
>survey.questions_layout == 'page_per_question' or (survey.questions_layout == 'one_page' and not question.is_conditional) or (survey.questions_layout == 'page_per_section' and (not question.is_conditional or (question.id in no_answer_conditional_questions and conditional_value and no_answer_conditional_questions[question.id][1] &lt;= conditional_value and conditional_value &lt;= no_answer_conditional_questions[question.id][2] ) or (question.id not in no_answer_conditional_questions and triggering_answer_by_question[question.id] in selected_answers)))</attribute>
</xpath>
</template>
</odoo>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record model="ir.ui.view" id="survey_question_form">
<field name="name">Form view for survey conditional question</field>
<field name="model">survey.question</field>
<field name="inherit_id" ref="survey.survey_question_form" />
<field name="arch" type="xml">
<field name="question_type" position="before">
<field name="survey_id" invisible="1" readonly="1" required="0" />
<field name="page_id" invisible="1" required="0" />
</field>
<field name="triggering_question_id" position="after">
<field name="triggering_question_type" invisible="1" />
<field
name="conditional_minimum_value"
options="{'no_create_edit': True,}"
attrs="{'invisible':['|', '|', ('is_conditional', '=', False), ('triggering_question_id', '=', False), ('triggering_question_type', 'in', ['simple_choice', 'multiple_choice'])]}"
/>
<field
name="conditional_maximum_value"
options="{'no_create_edit': True,}"
attrs="{'invisible':['|', '|', ('is_conditional', '=', False), ('triggering_question_id', '=', False), ('triggering_question_type', 'in', ['simple_choice', 'multiple_choice'])]}"
/>
</field>
<field name="triggering_answer_id" position="attributes">
<attribute
name="attrs"
>{'invisible': ['|', '|', ('is_conditional','=', False), ('triggering_question_id','=', False), ('triggering_question_type', 'not in', ['simple_choice', 'multiple_choice'])], 'required': [('is_conditional','=', True), ('triggering_question_type', 'in', ['simple_choice', 'multiple_choice'])]}</attribute>
</field>
</field>
</record>
</odoo>

View File

@ -0,0 +1,118 @@
========================
Survey description field
========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:be3ddfe839657cfb51a78f4bf548e85439ebf1a89b9572822fd2cf74054788b1
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsurvey-lightgray.png?logo=github
:target: https://github.com/OCA/survey/tree/14.0/survey_description
:alt: OCA/survey
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/survey-14-0/survey-14-0-survey_description
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/survey&target_branch=14.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module displays the description fields on backend for :
* surveys
* pages
* questions
and thank you field for surveys.
Note: these fields are present in code, displayed on front-end for survey (when defined) but not displayed on backend for user to fill.
A PR has been submitted to Odoo (https://github.com/odoo/odoo/pull/52329) to implement this in Odoo 12.0 code, but since survey module has been refactored in v13.0 it may never be merged, so this module was created.
**Table of contents**
.. contents::
:local:
Usage
=====
To use this module, you need to:
#. Go to Surveys
#. Create or Edit an existing survey
#. On main survey page and on question page you can fill description and thank you message in corresponding notepad pages
#. On survey page form, you can add description of the page on top of the form
Known issues / Roadmap
======================
* This module was created to add some features in Odoo 13.0. In Odoo 14.0 most of these features were already implemented, except being able to edit the description_done field.
* For versions >= 15.0 the module is not necessary.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/survey/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/survey/issues/new?body=module:%20survey_description%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Le Filament
Contributors
~~~~~~~~~~~~
* Remi CAZENAVE <https://le-filament.com>
Other credits
~~~~~~~~~~~~~
[ This file is optional and contains additional credits, other than
authors, contributors, and maintainers. ]
The development of this module has been financially supported by:
* Ethikis (<https://ethikis.com>)
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
.. |maintainer-remi-filament| image:: https://github.com/remi-filament.png?size=40px
:target: https://github.com/remi-filament
:alt: remi-filament
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-remi-filament|
This module is part of the `OCA/survey <https://github.com/OCA/survey/tree/14.0/survey_description>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

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