Merge remote-tracking branch 'origin/16.0' into 17.0

also removed useless module (already covered by 17.0):
bemade_open_project_details
This commit is contained in:
Marc Durepos 2024-03-15 10:45:48 -04:00
commit a07c7bcdbd
28 changed files with 1092 additions and 605 deletions

View file

@ -52,17 +52,16 @@
'views/menus.xml', 'views/menus.xml',
'views/task_views.xml', 'views/task_views.xml',
'views/sale_order_views.xml', 'views/sale_order_views.xml',
<<<<<<< HEAD
# BV: need to readd this file # BV: need to readd this file
# 'reports/worksheet_custom_report_templates.xml', # 'reports/worksheet_custom_report_templates.xml',
=======
'reports/worksheet_custom_report_templates.xml',
>>>>>>> origin/16.0
'reports/worksheet_custom_reports.xml', 'reports/worksheet_custom_reports.xml',
'wizard/new_task_from_template.xml', 'wizard/new_task_from_template.xml',
], ],
'assets': { 'assets': {
'web.assets_tests': [
'bemade_fsm/static/tests/tours/task_template_tour.js',
'bemade_fsm/static/tests/tours/equipment_tour.js',
'bemade_fsm/static/tests/tours/sale_order_tour.js',
],
'web.report_assets_common': [ 'web.report_assets_common': [
'bemade_fsm/static/src/scss/bemade_fsm.scss' 'bemade_fsm/static/src/scss/bemade_fsm.scss'
], ],

View file

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 15.0+e\n" "Project-Id-Version: Odoo Server 15.0+e\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-02 20:26+0000\n" "POT-Creation-Date: 2024-02-13 17:09+0000\n"
"PO-Revision-Date: 2023-10-02 20:26+0000\n" "PO-Revision-Date: 2024-02-13 17:09+0000\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -16,7 +16,7 @@ msgstr ""
"Plural-Forms: \n" "Plural-Forms: \n"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table_with_pricing_and_labour
msgid "" msgid ""
"<span groups=\"account.group_show_line_subtotals_tax_excluded\">\n" "<span groups=\"account.group_show_line_subtotals_tax_excluded\">\n"
" Amount</span>\n" " Amount</span>\n"
@ -24,9 +24,9 @@ msgid ""
" Total Price</span>" " Total Price</span>"
msgstr "" msgstr ""
"<span groups=\"account.group_show_line_subtotals_tax_excluded\">\n" "<span groups=\"account.group_show_line_subtotals_tax_excluded\">\n"
" Prix</span>\n" " Montant</span>\n"
" <span groups=\"account.group_show_line_subtotals_tax_included\">\n" " <span groups=\"account.group_show_line_subtotals_tax_included\">\n"
" Prix</span>" " Prix Total</span>"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_signature_block #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_signature_block
@ -40,12 +40,12 @@ msgstr ""
" </span>" " </span>"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table_with_pricing_and_labour
msgid "<span>Disc.%</span>" msgid "<span>Disc.%</span>"
msgstr "<span>Escompte %</span>" msgstr "<span>% Escompte</span>"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table_with_pricing_and_labour
msgid "" msgid ""
"<strong class=\"mr16\">Section\n" "<strong class=\"mr16\">Section\n"
" Subtotal</strong>" " Subtotal</strong>"
@ -54,19 +54,19 @@ msgstr ""
" Sous-total</strong>" " Sous-total</strong>"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table_with_pricing_and_labour
msgid "<strong>Taxes</strong>" msgid "<strong>Taxes</strong>"
msgstr "" msgstr ""
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table_with_pricing_and_labour
msgid "<strong>Total</strong>" msgid "<strong>Total</strong>"
msgstr "" msgstr ""
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table_with_pricing_and_labour
msgid "<strong>Untaxed amount</strong>" msgid "<strong>Untaxed amount</strong>"
msgstr "<strong>Montant hors taxes</strong>" msgstr "<strong>Montant hors-taxes</strong>"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__message_needaction #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__message_needaction
@ -78,20 +78,15 @@ msgstr "Action requise"
msgid "Activities" msgid "Activities"
msgstr "Activités" msgstr "Activités"
#. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr ""
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__activity_state #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__activity_state
msgid "Activity State" msgid "Activity State"
msgstr "" msgstr "État de l'activité"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__activity_type_icon #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__activity_type_icon
msgid "Activity Type Icon" msgid "Activity Type Icon"
msgstr "" msgstr "Icône du type d'activité"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__tag_ids #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__tag_ids
@ -119,14 +114,12 @@ msgstr "Bloqué"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task__allow_billable #: model:ir.model.fields,field_description:bemade_fsm.field_project_task__allow_billable
msgid "Can be billed" msgid "Can be billed"
msgstr "" msgstr "Peut être facturé"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,help:bemade_fsm.field_res_partner__is_site_contact #: model_terms:ir.ui.view,arch_db:bemade_fsm.project_task_from_template_wizard_view_form
#: model:ir.model.fields,help:bemade_fsm.field_res_users__is_site_contact msgid "Cancel"
msgid "" msgstr "Annuler"
"Check if the contact is a site contact, otherwise it is a not in that list"
msgstr ""
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_equipment__tag_ids #: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_equipment__tag_ids
@ -178,11 +171,37 @@ msgstr ""
msgid "Contacts and Equipment" msgid "Contacts and Equipment"
msgstr "Contacts et équipements" msgstr "Contacts et équipements"
#. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.project_task_from_template_wizard_view_form
msgid "Create Task"
msgstr "Créer une tâche"
#. module: bemade_fsm
#. openerp-web
#: code:addons/bemade_fsm/static/src/xml/project_view_buttons.xml:0
#: code:addons/bemade_fsm/static/src/xml/project_view_buttons.xml:0
#, python-format
msgid "Create Task from Template"
msgstr "Créer une tâche à partir d'un gabarit"
#. module: bemade_fsm
#: model:ir.model,name:bemade_fsm.model_project_task_from_template_wizard
msgid "Create Task from Template Wizard"
msgstr "Assistant pour création de tâche à partir d'un gabarit"
#. module: bemade_fsm
#. openerp-web
#: code:addons/bemade_fsm/static/src/xml/project_view_buttons.xml:0
#, python-format
msgid "Create from Template"
msgstr "Créer à partir d'un gabarit"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__create_uid #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__create_uid
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__create_uid #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__create_uid
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__create_uid #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__create_uid
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__create_uid #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__create_uid
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_from_template_wizard__create_uid
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__create_uid #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__create_uid
msgid "Created by" msgid "Created by"
msgstr "Créé par" msgstr "Créé par"
@ -192,6 +211,7 @@ msgstr "Créé par"
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__create_date #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__create_date
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__create_date #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__create_date
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__create_date #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__create_date
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_from_template_wizard__create_date
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__create_date #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__create_date
msgid "Created on" msgid "Created on"
msgstr "Date de création" msgstr "Date de création"
@ -206,6 +226,11 @@ msgstr "Client"
msgid "Customer:" msgid "Customer:"
msgstr "Client :" msgstr "Client :"
#. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_timesheet_entries
msgid "Date"
msgstr ""
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__assignees #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__assignees
msgid "Default Assignees" msgid "Default Assignees"
@ -247,7 +272,8 @@ msgid "Default tags for tasks created from this template."
msgstr "Étiquettes par défaut pour tâches créées à partir de ce gabarit." msgstr "Étiquettes par défaut pour tâches créées à partir de ce gabarit."
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_materials_table
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table_with_pricing_and_labour
msgid "Delivered" msgid "Delivered"
msgstr "Livré" msgstr "Livré"
@ -255,7 +281,8 @@ msgstr "Livré"
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__description #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__description
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__description #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__description
#: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_form_view #: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_form_view
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_materials_table
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table_with_pricing_and_labour
msgid "Description" msgid "Description"
msgstr "" msgstr ""
@ -274,6 +301,7 @@ msgstr "Détails"
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__display_name #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__display_name
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__display_name #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__display_name
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__display_name #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__display_name
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_from_template_wizard__display_name
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__display_name #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__display_name
msgid "Display Name" msgid "Display Name"
msgstr "Nom pour affichage" msgstr "Nom pour affichage"
@ -286,7 +314,7 @@ msgstr "Employés assignés aux tâches créées à partir de ce gabarit."
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task__planned_date_end #: model:ir.model.fields,field_description:bemade_fsm.field_project_task__planned_date_end
msgid "End Date" msgid "End Date"
msgstr "" msgstr "Date de fin"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.actions.act_window,name:bemade_fsm.action_window_equipment #: model:ir.actions.act_window,name:bemade_fsm.action_window_equipment
@ -302,8 +330,9 @@ msgstr "Équipement désservi"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_res_partner__equipment_count #: model:ir.model.fields,field_description:bemade_fsm.field_res_partner__equipment_count
#: model:ir.model.fields,field_description:bemade_fsm.field_res_users__equipment_count
msgid "Equipment Count" msgid "Equipment Count"
msgstr "" msgstr "Nombre d'équipemenets"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__complete_name #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__complete_name
@ -313,7 +342,7 @@ msgstr "Nom d'équipement"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_equipment_summary #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_equipment_summary
msgid "Equipment Serviced" msgid "Equipment Serviced"
msgstr "Équipement désservi" msgstr "Équipement(s) désservi"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.actions.act_window,name:bemade_fsm.action_window_equipment_tags #: model:ir.actions.act_window,name:bemade_fsm.action_window_equipment_tags
@ -349,11 +378,6 @@ msgstr "Durée estimée"
msgid "Exception" msgid "Exception"
msgstr "" msgstr ""
#. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__failed_message_ids
msgid "Failed Messages"
msgstr "Messages échoués"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.bemade_fsm_project_task_form_inherit #: model_terms:ir.ui.view,arch_db:bemade_fsm.bemade_fsm_project_task_form_inherit
#: model_terms:ir.ui.view,arch_db:bemade_fsm.partner_equipment_location_view_form #: model_terms:ir.ui.view,arch_db:bemade_fsm.partner_equipment_location_view_form
@ -389,7 +413,7 @@ msgstr "Abonnés (partenaires)"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_equipment__activity_type_icon #: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_equipment__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks" msgid "Font awesome icon e.g. fa-tasks"
msgstr "" msgstr "Icône Font Awesome p.ex. fa-tasks"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_sale_order_line__is_fully_delivered #: model:ir.model.fields,field_description:bemade_fsm.field_sale_order_line__is_fully_delivered
@ -416,9 +440,10 @@ msgstr "A un message"
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__id #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__id
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__id #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__id
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__id #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__id
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_from_template_wizard__id
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__id #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__id
msgid "ID" msgid "ID"
msgstr "" msgstr "Identifiant"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__activity_exception_icon #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__activity_exception_icon
@ -456,6 +481,8 @@ msgid ""
"Indicates whether a line or all the lines in a section have been entirely " "Indicates whether a line or all the lines in a section have been entirely "
"delivered and invoiced." "delivered and invoiced."
msgstr "" msgstr ""
"Indique si une ligne ou toutes les lignes dans une section ont été "
"entièrement livrées et facturées."
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_visit__is_completed #: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_visit__is_completed
@ -487,6 +514,12 @@ msgstr ""
msgid "Invoiced" msgid "Invoiced"
msgstr "Facturé" msgstr "Facturé"
#. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_sale_order__is_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_sale_order_line__is_fsm
msgid "Is FSM"
msgstr "Est FSM"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_sale_order_line__is_field_service #: model:ir.model.fields,field_description:bemade_fsm.field_sale_order_line__is_field_service
msgid "Is Field Service" msgid "Is Field Service"
@ -501,7 +534,7 @@ msgstr "Est un abonné"
#: model:ir.model.fields,field_description:bemade_fsm.field_res_partner__is_site_contact #: model:ir.model.fields,field_description:bemade_fsm.field_res_partner__is_site_contact
#: model:ir.model.fields,field_description:bemade_fsm.field_res_users__is_site_contact #: model:ir.model.fields,field_description:bemade_fsm.field_res_users__is_site_contact
msgid "Is a site contact" msgid "Is a site contact"
msgstr "" msgstr "Est un contact sur site"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__label #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__label
@ -513,6 +546,7 @@ msgstr "Nom"
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag____last_update #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag____last_update
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type____last_update #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type____last_update
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit____last_update #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit____last_update
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_from_template_wizard____last_update
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template____last_update #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template____last_update
msgid "Last Modified on" msgid "Last Modified on"
msgstr "Dernière modification" msgstr "Dernière modification"
@ -522,6 +556,7 @@ msgstr "Dernière modification"
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__write_uid #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__write_uid
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__write_uid #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__write_uid
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__write_uid #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__write_uid
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_from_template_wizard__write_uid
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__write_uid #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__write_uid
msgid "Last Updated by" msgid "Last Updated by"
msgstr "Modifié par" msgstr "Modifié par"
@ -531,6 +566,7 @@ msgstr "Modifié par"
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__write_date #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_tag__write_date
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__write_date #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment_type__write_date
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__write_date #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__write_date
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_from_template_wizard__write_date
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__write_date #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__write_date
msgid "Last Updated on" msgid "Last Updated on"
msgstr "Dernière mise à jour" msgstr "Dernière mise à jour"
@ -550,6 +586,11 @@ msgstr "Pièce jointe principale"
msgid "Mark as Delivered" msgid "Mark as Delivered"
msgstr "Marquer comme livré" msgstr "Marquer comme livré"
#. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_materials_table
msgid "Materials"
msgstr "Matériaux"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__message_has_error #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__message_has_error
msgid "Message Delivery error" msgid "Message Delivery error"
@ -560,6 +601,15 @@ msgstr "Erreur de livraison de message"
msgid "Messages" msgid "Messages"
msgstr "" msgstr ""
#. module: bemade_fsm
#: code:addons/bemade_fsm/models/task.py:0
#, python-format
msgid ""
"Modifying the planned start or end time on a task is not permitted when that"
" task already has planning records associated to it. Please modify or delete"
" the planning records instead."
msgstr ""
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__my_activity_date_deadline #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__my_activity_date_deadline
msgid "My Activity Deadline" msgid "My Activity Deadline"
@ -573,9 +623,14 @@ msgid "Name"
msgstr "Nom" msgstr "Nom"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__activity_calendar_event_id #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_from_template_wizard__new_task_title
msgid "Next Activity Calendar Event" msgid "New Task Title"
msgstr "Évènement au calendrier de la prochaine activité" msgstr "Nouveau titre de tâche"
#. module: bemade_fsm
#: model:ir.actions.act_window,name:bemade_fsm.action_new_task_from_template
msgid "New Task from Template"
msgstr "Nouvelle tâche à partir d'un gabarit"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__activity_date_deadline #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_equipment__activity_date_deadline
@ -618,7 +673,8 @@ msgid "Number of unread messages"
msgstr "Nombre de messages non-lus" msgstr "Nombre de messages non-lus"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_materials_table
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table_with_pricing_and_labour
msgid "Ordered" msgid "Ordered"
msgstr "Commandé" msgstr "Commandé"
@ -636,6 +692,7 @@ msgid "P&ID Tag"
msgstr "Tag P&ID" msgstr "Tag P&ID"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.project_task_view_search_fsm_inherit
#: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_search_view #: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_search_view
msgid "Parent Task" msgid "Parent Task"
msgstr "Tâche parent" msgstr "Tâche parent"
@ -661,10 +718,25 @@ msgstr "Notes sur l'emplacement physique"
msgid "Plan as field service" msgid "Plan as field service"
msgstr "Planifier comme service terrain" msgstr "Planifier comme service terrain"
#. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_info_block
msgid "Planned end:"
msgstr "Fin planifiée :"
#. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_info_block
msgid "Purchase Order:"
msgstr "Commande :"
#. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_info_block
msgid "Planned start:"
msgstr "Début planifié :"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model,name:bemade_fsm.model_product_template #: model:ir.model,name:bemade_fsm.model_product_template
msgid "Product Template" msgid "Product Template"
msgstr "Modèle de produit" msgstr "Modèle d'article"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,help:bemade_fsm.field_product_product__is_field_service #: model:ir.model.fields,help:bemade_fsm.field_product_product__is_field_service
@ -677,10 +749,21 @@ msgstr ""
" considéré lors de la planification." " considéré lors de la planification."
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_from_template_wizard__project_id
#: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_search_view #: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_search_view
msgid "Project" msgid "Project"
msgstr "Projet" msgstr "Projet"
#. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task__propagate_assignment
msgid "Propagate Assignment"
msgstr "Propager l'assignation"
#. module: bemade_fsm
#: model:ir.model.fields,help:bemade_fsm.field_project_task__propagate_assignment
msgid "Propagate assignment of this task to all subtasks."
msgstr "Propager l'assignation de cette tâche à toutes les sous-tâches."
#. module: bemade_fsm #. module: bemade_fsm
#: model:project.task.type,legend_done:bemade_fsm.planning_project_stage_exception #: model:project.task.type,legend_done:bemade_fsm.planning_project_stage_exception
#: model:project.task.type,legend_done:bemade_fsm.planning_project_stage_waiting_parts #: model:project.task.type,legend_done:bemade_fsm.planning_project_stage_waiting_parts
@ -717,12 +800,17 @@ msgstr "Section de commande de vente"
#: model:ir.model,name:bemade_fsm.model_sale_order #: model:ir.model,name:bemade_fsm.model_sale_order
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__sale_order_id #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__sale_order_id
msgid "Sales Order" msgid "Sales Order"
msgstr "Commande de ventes" msgstr "Bon de commande"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model,name:bemade_fsm.model_sale_order_line #: model:ir.model,name:bemade_fsm.model_sale_order_line
msgid "Sales Order Line" msgid "Sales Order Line"
msgstr "Ligne de commandes de vente" msgstr "Ligne de bons de commande"
#. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_sale_order_line__section_line_ids
msgid "Section Line"
msgstr "Section"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__sequence #: model:ir.model.fields,field_description:bemade_fsm.field_project_task_template__sequence
@ -730,7 +818,9 @@ msgid "Sequence"
msgstr "Séquence" msgstr "Séquence"
#. module: bemade_fsm #. module: bemade_fsm
#: code:addons/bemade_fsm/models/sale_order.py:0
#: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__task_id #: model:ir.model.fields,field_description:bemade_fsm.field_bemade_fsm_visit__task_id
#, python-format
msgid "Service Visit" msgid "Service Visit"
msgstr "Visite de service" msgstr "Visite de service"
@ -759,13 +849,14 @@ msgstr "Contacts sur site :"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_res_partner__equipment_ids #: model:ir.model.fields,field_description:bemade_fsm.field_res_partner__equipment_ids
#: model:ir.model.fields,field_description:bemade_fsm.field_res_users__equipment_ids
msgid "Site Equipment" msgid "Site Equipment"
msgstr "" msgstr "Équipement sur site"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task__planned_date_begin #: model:ir.model.fields,field_description:bemade_fsm.field_project_task__planned_date_begin
msgid "Start Date" msgid "Start Date"
msgstr "" msgstr "Date de début"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_tasks_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_tasks_table
@ -816,6 +907,7 @@ msgstr "Tâche"
#: model:ir.actions.act_window,name:bemade_fsm.task_template_act_window #: model:ir.actions.act_window,name:bemade_fsm.task_template_act_window
#: model:ir.model.fields,field_description:bemade_fsm.field_product_product__task_template_id #: model:ir.model.fields,field_description:bemade_fsm.field_product_product__task_template_id
#: model:ir.model.fields,field_description:bemade_fsm.field_product_template__task_template_id #: model:ir.model.fields,field_description:bemade_fsm.field_product_template__task_template_id
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task_from_template_wizard__task_template_id
#: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_form_view #: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_form_view
#: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_search_view #: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_search_view
#: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_tree_view #: model_terms:ir.ui.view,arch_db:bemade_fsm.task_template_tree_view
@ -835,14 +927,10 @@ msgstr "Nom de tâche"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_tasks_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_tasks_table
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_timesheet_entries
msgid "Technician" msgid "Technician"
msgstr "Technicien·ne" msgstr "Technicien·ne"
#. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_info_block
msgid "Technicians:"
msgstr "Technicien·ne·s:"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model,name:bemade_fsm.model_project_task_template #: model:ir.model,name:bemade_fsm.model_project_task_template
msgid "Template for new project tasks" msgid "Template for new project tasks"
@ -855,6 +943,11 @@ msgstr ""
"L'équipement à désservir par défaut pour les nouveaux articles de commande " "L'équipement à désservir par défaut pour les nouveaux articles de commande "
"de ventes." "de ventes."
#. module: bemade_fsm
#: model:ir.model.fields,help:bemade_fsm.field_project_task_from_template_wizard__project_id
msgid "The project the new task should be created in."
msgstr ""
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_visit__so_section_id #: model:ir.model.fields,help:bemade_fsm.field_bemade_fsm_visit__so_section_id
msgid "" msgid ""
@ -864,6 +957,20 @@ msgstr ""
"La section sur la commande de vente représentant la main d'oeuvre et les " "La section sur la commande de vente représentant la main d'oeuvre et les "
"pièces pour cette visite" "pièces pour cette visite"
#. module: bemade_fsm
#: model:ir.model.fields,help:bemade_fsm.field_project_task_from_template_wizard__task_template_id
msgid "The template to use when creating the new task."
msgstr "Le gabarit à utiliser en créant la nouvelle tâche."
#. module: bemade_fsm
#: model:ir.model.fields,help:bemade_fsm.field_project_task_from_template_wizard__new_task_title
msgid ""
"The title (name) for the newly created task. If left blank, the name of the "
"template will be used."
msgstr ""
"Le titre (nom) de la nouvelle tâche. Si laissé vide, le nom du gabarit sera "
"utilisé."
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.actions.act_window,help:bemade_fsm.task_template_act_window #: model_terms:ir.actions.act_window,help:bemade_fsm.task_template_act_window
msgid "There are no task templates, click above to create one." msgid "There are no task templates, click above to create one."
@ -871,7 +978,22 @@ msgstr ""
"Il n'existe aucun gabarit de tâche, cliquez ci-dessus pour en créer une." "Il n'existe aucun gabarit de tâche, cliquez ci-dessus pour en créer une."
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table #: code:addons/bemade_fsm/models/sale_order_line.py:0
#, python-format
msgid ""
"This task has been created from: <a href=# data-oe-model=sale.order data-oe-"
"id=%d>%s</a> (%s)"
msgstr ""
"Cette tâche a été créée à partir de : <a href=# data-oe-model=sale.order data-oe-"
"id=%d>%s</a> (%s)"
#. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_timesheet_entries
msgid "Time"
msgstr "Temps"
#. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table_with_pricing_and_labour
msgid "Time &amp; Material" msgid "Time &amp; Material"
msgstr "Temps &amp; matériaux" msgstr "Temps &amp; matériaux"
@ -886,7 +1008,7 @@ msgid "Type of the exception activity on record."
msgstr "Type d'activité d'exception sur l'enregistrement." msgstr "Type d'activité d'exception sur l'enregistrement."
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_sale_order_table_with_pricing_and_labour
msgid "Unit Price" msgid "Unit Price"
msgstr "Prix unitaire" msgstr "Prix unitaire"
@ -906,13 +1028,19 @@ msgid "View Task"
msgstr "Voir tâche" msgstr "Voir tâche"
#. module: bemade_fsm #. module: bemade_fsm
#: code:addons/bemade_fsm/models/sale_order_line.py:0
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task__visit_id #: model:ir.model.fields,field_description:bemade_fsm.field_project_task__visit_id
#: model:ir.model.fields,field_description:bemade_fsm.field_sale_order__visit_ids #: model:ir.model.fields,field_description:bemade_fsm.field_sale_order__visit_ids
#: model:ir.model.fields,field_description:bemade_fsm.field_sale_order_line__visit_id #: model:ir.model.fields,field_description:bemade_fsm.field_sale_order_line__visit_id
#: model:ir.model.fields,field_description:bemade_fsm.field_sale_order_line__visit_ids #, python-format
msgid "Visit" msgid "Visit"
msgstr "Visite" msgstr "Visite"
#. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_sale_order_line__visit_ids
msgid "Visits"
msgstr "Visites"
#. module: bemade_fsm #. module: bemade_fsm
#: model:project.task.type,name:bemade_fsm.planning_project_stage_waiting_parts #: model:project.task.type,name:bemade_fsm.planning_project_stage_waiting_parts
msgid "Waiting on Parts" msgid "Waiting on Parts"
@ -928,24 +1056,23 @@ msgstr "Messages du site web"
msgid "Website communication history" msgid "Website communication history"
msgstr "Historique de communication du site web" msgstr "Historique de communication du site web"
#. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_timesheet_entries
msgid "Work Completed"
msgstr "Travaux complétés"
#. module: bemade_fsm #. module: bemade_fsm
#: model:project.task.type,name:bemade_fsm.planning_project_stage_work_completed #: model:project.task.type,name:bemade_fsm.planning_project_stage_work_completed
msgid "Work Executed" msgid "Work Executed"
msgstr "Travaux exécutés" msgstr "Travaux exécutés"
#. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_info_block
msgid "Work Order"
msgstr "Bon de travail"
#. module: bemade_fsm #. module: bemade_fsm
#: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_info_block #: model_terms:ir.ui.view,arch_db:bemade_fsm.workorder_page_info_block
msgid "" msgid ""
"Work Order\n" "Work Order\n"
" Contacts:" " Contacts:"
msgstr "" msgstr ""
"Bon de travail\n" "Contacts recevant le bon de travail :"
" Contacts :"
#. module: bemade_fsm #. module: bemade_fsm
#: model:ir.model.fields,field_description:bemade_fsm.field_project_task__work_order_contacts #: model:ir.model.fields,field_description:bemade_fsm.field_project_task__work_order_contacts

View file

@ -72,4 +72,5 @@ class Equipment(models.Model):
def _compute_complete_name(self): def _compute_complete_name(self):
for rec in self: for rec in self:
tag_part = "[%s] " % rec.pid_tag if rec.pid_tag else "" tag_part = "[%s] " % rec.pid_tag if rec.pid_tag else ""
rec.complete_name = tag_part + rec.name name = rec.name or ""
rec.complete_name = tag_part + name

View file

@ -94,7 +94,7 @@ class Task(models.Model):
pattern = re.compile(r"\d+$") pattern = re.compile(r"\d+$")
matches = map(lambda n: pattern.search(n), prev_seqs) matches = map(lambda n: pattern.search(n), prev_seqs)
seq += max(map(lambda n: int(n.group(1)) if n else 0), matches) seq += max(map(lambda n: int(n.group(1)) if n else 0), matches)
rec.work_order_number = rec.sale_order_id.name.replace('SO', 'WO', 1) \ rec.work_order_number = rec.sale_order_id.name.replace('SO', 'SVR', 1) \
+ f"-{seq}" + f"-{seq}"
return res return res
@ -102,6 +102,9 @@ class Task(models.Model):
super().write(vals) super().write(vals)
if not self: # End recursion on empty RecordSet if not self: # End recursion on empty RecordSet
return return
if 'propagate_assignment' in vals:
# When a user sets propagate assignment, it should propagate that setting all the way down the chain
self.child_ids.write({'propagate_assignment': vals['propagate_assignment']})
if 'user_ids' in vals: if 'user_ids' in vals:
to_propagate = self.filtered(lambda task: task.propagate_assignment) to_propagate = self.filtered(lambda task: task.propagate_assignment)
# Here we use child_ids instead of _get_all_subtasks() so as to allow for setting propagate_assignment # Here we use child_ids instead of _get_all_subtasks() so as to allow for setting propagate_assignment

View file

@ -1,7 +1,61 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<data> <data>
<template id="workorder_page_sale_order_table"> <template id="workorder_page_materials_table">
<t t-set="order_lines"
t-value="doc.relevant_order_lines.filtered(lambda l:
l.product_id.type != 'service' and not l.is_downpayment and not l.visit_id)"/>
<t t-if="order_lines">
<t t-set="visit_lines" t-value="order_lines.mapped('visit_id')"/>
<t t-set="section_lines"
t-value="order_lines.filtered(lambda l: l.display_type == 'line_section')"/>
</t>
<div t-if="order_lines.filtered(lambda l: not l.display_type)" style="page-break-inside: avoid;">
<h2 t-if="order_lines">Materials</h2>
<div t-if="order_lines" class="table-responsive-sm">
<table class="table table-sm o_main_table">
<thead>
<tr>
<th class="text-left">Description</th>
<th class="text-right">Ordered</th>
<th class="text-right">Delivered</th>
</tr>
</thead>
<tbody class="sale_tbody">
<t t-foreach="order_lines" t-as="line">
<t t-set="is_task" t-value="line == doc.sale_line_id"/>
<tr t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''">
<t t-if="not line.display_type">
<td><span t-field="line.name"/></td>
<td class="text-right">
<span t-field="line.product_uom_qty"/>
<span t-field="line.product_uom"
groups="uom.group_uom"/>
</td>
<td class="text-right">
<span t-field="line.qty_delivered"/>
<span t-field="line.product_uom"
groups="uom.group_uom"/>
</td>
</t>
<t t-if="line.display_type == 'line_section'">
<td colspan="99">
<span t-field="line.name"/>
</td>
</t>
<t t-if="line.display_type == 'line_note'">
<td colspan="99">
<span t-field="line.name"/>
</td>
</t>
</tr>
</t>
</tbody>
</table>
</div>
</div>
</template>
<template id="workorder_page_sale_order_table_with_pricing_and_labour">
<t t-set="order_lines" t-value="doc.relevant_order_lines"/> <t t-set="order_lines" t-value="doc.relevant_order_lines"/>
<t t-if="order_lines"> <t t-if="order_lines">
<t t-set="visit_lines" t-value="order_lines.mapped('visit_id')"/> <t t-set="visit_lines" t-value="order_lines.mapped('visit_id')"/>
@ -164,7 +218,6 @@
</template> </template>
<template id="workorder_page_tasks_table"> <template id="workorder_page_tasks_table">
<t t-set="interventions" t-value="doc.child_ids"/> <t t-set="interventions" t-value="doc.child_ids"/>
<t t-set="timesheets" t-value="doc.timesheet_ids"/>
<t t-foreach="interventions" t-as="intervention"> <t t-foreach="interventions" t-as="intervention">
<div style="page-break-inside: avoid;"> <div style="page-break-inside: avoid;">
<h2 t-out="str(intervention_index + 1) + '. ' + intervention.name"/> <h2 t-out="str(intervention_index + 1) + '. ' + intervention.name"/>
@ -182,9 +235,8 @@
<thead> <thead>
<tr> <tr>
<th width="7%">Status</th> <th width="7%">Status</th>
<th width="30%">Task</th> <th width="39%">Task</th>
<th width="18%">Technician</th> <th width="54%">Comments</th>
<th width="45%">Comments</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -194,11 +246,6 @@
<td> <td>
<span t-out="task.name"/> <span t-out="task.name"/>
</td> </td>
<td>
<t t-foreach="task.user_ids" t-as="user">
<span t-out="user.name + (', ' if not user_last else '')"/>
</t>
</td>
<td t-out="task.description or ''"/> <td t-out="task.description or ''"/>
</tr> </tr>
<tr class="mt-0 pt-0"> <tr class="mt-0 pt-0">
@ -207,7 +254,6 @@
<t t-call="bemade_fsm.subtask_list"/> <t t-call="bemade_fsm.subtask_list"/>
</td> </td>
<td/> <td/>
<td/>
</tr> </tr>
</t> </t>
</tbody> </tbody>
@ -218,20 +264,16 @@
</template> </template>
<template id="workorder_page_info_block"> <template id="workorder_page_info_block">
<h1>Work Order <span t-out="doc.work_order_number"></span></h1> <h1>
<div class="row"> <span name="work_order_number" t-out="doc.name"/>
<div t-attf-class="{{'col-6' if report_type == 'pdf' else 'col-md-6 col-12'}}"> </h1>
<div t-if="doc.user_ids"><h6>Technicians: </h6></div> <h4 t-if="doc.sale_order_id and doc.sale_order_id.client_order_ref">
<t t-foreach="doc.user_ids" t-as="user"> Purchase Order: <span
<div class="mb-3"> name="po_number"
<div t-esc="user" t-options='{ t-out="doc.sale_order_id.client_order_ref"/>
"widget": "contact", </h4>
"fields": ["name", "email"] <hr/>
}'/> <div class="row" name="address_and_time">
</div>
</t>
</div>
<div t-attf-class="{{('col-6' if report_type == 'pdf' else 'col-md-6 col-12') + ' mb-3'}}"> <div t-attf-class="{{('col-6' if report_type == 'pdf' else 'col-md-6 col-12') + ' mb-3'}}">
<t t-if="doc.partner_id"> <t t-if="doc.partner_id">
<div><h6>Customer: </h6></div> <div><h6>Customer: </h6></div>
@ -241,8 +283,19 @@
}'/> }'/>
</t> </t>
</div> </div>
<div t-attf-class="{{('col-6' if report_type == 'pdf' else 'col-md-6 col-12') + ' mb-3'}}"
t-if="doc.planned_date_begin or doc.planned_date_end">
<div t-if="doc.planned_date_begin"><h6>Planned start: </h6></div>
<div class="mb-3">
<div t-out="doc.planned_date_begin.strftime('%Y-%m-%d %H:%M')"/>
</div>
<div t-if="doc.planned_date_end"><h6>Planned end: </h6></div>
<div class="mb-3">
<div t-out="doc.planned_date_end.strftime('%Y-%m-%d %H:%M')"/>
</div>
</div>
</div> </div>
<div class="row"> <div class="row" name="site_and_work_order_contacts">
<div t-attf-class="{{'col-6' if report_type == 'pdf' else 'col-md-6 col-12'}}"> <div t-attf-class="{{'col-6' if report_type == 'pdf' else 'col-md-6 col-12'}}">
<div t-if="doc.site_contacts"><h6>Site Contacts: </h6></div> <div t-if="doc.site_contacts"><h6>Site Contacts: </h6></div>
<t t-foreach="doc.site_contacts" t-as="contact"> <t t-foreach="doc.site_contacts" t-as="contact">
@ -267,13 +320,20 @@
</t> </t>
</div> </div>
</div> </div>
<hr/>
<div t-if="not is_html_empty(doc.description)" class="row" name="visit_description">
<div class="col-12">
<span t-out="doc.description" />
</div>
</div>
<hr t-if="not is_html_empty(doc.description)"/>
</template> </template>
<template id="workorder_equipment_summary"> <template id="workorder_equipment_summary">
<div t-if="doc.equipment_ids and len(doc.child_ids) > 1" <div t-if="doc.equipment_ids and len(doc.child_ids) > 1"
style="page-break-inside: avoid;"> style="page-break-inside: avoid;">
<h3>Equipment Serviced</h3> <h3>Equipment Serviced</h3>
<div class="table-responsive-sm"> <div class="table-responsive-sm">
<table class="table table-sm o_main_table"> <table class="table table-sm o_main_table overflow-hidden">
<thead> <thead>
<tr> <tr>
<th>Tag</th> <th>Tag</th>
@ -305,6 +365,47 @@
</div> </div>
</div> </div>
</template> </template>
<template id="workorder_page_timesheet_entries">
<t t-set="timesheets" t-value="doc.timesheet_ids"/>
<div t-if="timesheets" style="page-break-inside: avoid;">
<h1>Time</h1>
<div class="table-responsive-sm">
<table class="table table-sm o_main_table">
<thead>
<tr>
<th width="14%">Date</th>
<th width="30%">Technician</th>
<th width="49%">Work Completed</th>
<th width="7%" class="text-right">Time</th>
</tr>
</thead>
<tbody>
<tr t-foreach="timesheets" t-as="timesheet" class="p-1 m-1">
<td>
<span t-out="timesheet.date.strftime('%Y-%m-%d')"/>
</td>
<td>
<span t-field="timesheet.employee_id.name"/>
</td>
<td>
<span t-field="timesheet.name"/>
</td>
<td>
<span t-esc="timesheet.unit_amount"
t-options="{
'widget': 'duration',
'digital': True,
'unit': 'hour',
'round': 'minute'
}"
/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</template>
<template id="workorder_page_signature_block"> <template id="workorder_page_signature_block">
<div t-if="doc.worksheet_signature"> <div t-if="doc.worksheet_signature">
<div t-if="report_type == html" class="ribbon" style=" <div t-if="report_type == html" class="ribbon" style="
@ -342,7 +443,8 @@
<template id="work_order_page"> <template id="work_order_page">
<div class="page"> <div class="page">
<t t-call="bemade_fsm.workorder_page_info_block"/> <t t-call="bemade_fsm.workorder_page_info_block"/>
<t t-call="bemade_fsm.workorder_page_sale_order_table"/> <t t-call="bemade_fsm.workorder_page_timesheet_entries"/>
<t t-call="bemade_fsm.workorder_page_materials_table"/>
<t t-call="bemade_fsm.workorder_equipment_summary"/> <t t-call="bemade_fsm.workorder_equipment_summary"/>
<t t-call="bemade_fsm.workorder_page_signature_block"/> <t t-call="bemade_fsm.workorder_page_signature_block"/>
<t t-call="bemade_fsm.workorder_page_tasks_table"/> <t t-call="bemade_fsm.workorder_page_tasks_table"/>
@ -359,13 +461,14 @@
</t> </t>
</t> </t>
</template> </template>
<!-- MD Commented out since this no longer matches the structure of industry_fsm at all -->
<!-- Make the front-end "Sign" page show our new template --> <!-- Make the front-end "Sign" page show our new template -->
<template id="portal_my_worksheet" <!-- <template id="portal_my_worksheet" -->
inherit_id="industry_fsm.portal_my_worksheet"> <!-- inherit_id="industry_fsm.portal_my_task"> -->
<xpath expr="//div[@t-call='industry_fsm.worksheet_custom_page']" <!-- <xpath expr="//div[@t-call='industry_fsm.worksheet_custom_page']" -->
position="replace"> <!-- position="replace"> -->
<div t-call="bemade_fsm.work_order_page"/> <!-- <div t-call="bemade_fsm.work_order_page"/> -->
</xpath> <!-- </xpath> -->
</template> <!-- </template> -->
</data> </data>
</odoo> </odoo>

View file

@ -1,13 +1,16 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<odoo> <odoo>
<data> <data>
<record id="industry_fsm_report.task_custom_report" model="ir.actions.report"> <record id="industry_fsm.task_custom_report" model="ir.actions.report">
<field name="name">Work Order Report (PDF)</field> <field name="name">Work Order Report (PDF)</field>
<field name="report_name">bemade_fsm.work_order</field> <field name="report_name">bemade_fsm.work_order</field>
<field name="report_file">bemade_fsm.work_order</field> <field name="report_file">bemade_fsm.work_order</field>
<field name="print_report_name">'%s Work Order %s' % ( <field name="print_report_name">'%s %s' % (
time.strftime('%Y-%m-%d'), object.work_order_number)</field> object.planned_date_begin.strftime('%Y-%m-%d') if object.planned_date_begin else time.strftime('%Y-%m-%d'),
object.name
)
</field>
<field name="report_type">qweb-pdf</field> <field name="report_type">qweb-pdf</field>
</record> </record>
</data> </data>
</odoo> </odoo>

View file

@ -1,146 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<record id="default_worksheet_template" model="ir.actions.report">
<field name="name">Complete Worksheet Report (PDF)</field>
<field name="model">project.task</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">bemade_fsm.worksheet_complete</field>
<field name="print_report_name">
'%s Worksheet %s' % (time.strftime('%Y-%m-%d'), object.name)
</field>
<field name="binding_model_id" ref="model_project_task"/>
<field name="binding_type">report</field>
</record>
<template id="worksheet_complete">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="bemade_fsm.worksheet_complete_page"
t-lang="doc.partner_id.lang"/>
</t>
</t>
</template>
<template id="worksheet_complete_page">
<t t-call="web.external_layout">
<t t-set="address" t-if="doc.sale_order_id">
<strong class="big-red">Customer:</strong>
<div t-field="doc.sale_order_id.partner_id"
t-options='{"widget": "contact",
"fields": ["address", "name"], "no_marker": True}'/>
</t>
<t t-set="information_block">
<strong>Service Address:</strong>
<div t-field="doc.partner_id"
t-options='{"widget": "contact",
"fields": ["address", "name", "phone"],
"no_marker": True, "phone_icons": True}'/>
</t>
<div class="page">
<div class="oe_structure"/>
<h2 class="mt-3">
<span>Work Order </span>
<span t-if="doc.sale_order_id" t-field="doc.sale_order_id.name"/>
<span t-else="" t-field="doc.name"/>
</h2>
<div class="container">
<div class="row mb-3 border-dark">
<div t-if="doc.sale_order_id.client_order_ref" class="col-4">
<span class="font-weight-bolder">Your Reference:</span>
<span t-field="doc.sale_order_id.client_order_ref"/>
</div>
<div t-if="doc.site_contacts" class="col-4">
<span class="font-weight-bolder">Site Contacts:</span>
<t t-foreach="doc.site_contacts" t-as="contact">
<span t-field="contact.name"/>
<span t-out="contact"
t-options='{"widget": "contact",
"fields": ["phone", "mobile", "email"],
"no_marker": True, "phone_icons": True}'/>
</t>
</div>
<div t-if="doc.work_order_contacts" class="col-4">
<span class="font-weight-bolder">Work order attn:</span>
<t t-foreach="doc.work_order_contacts" t-as="contact">
<span t-field="contact.name"/>
<span t-out="contact"
t-options='{"widget": "contact",
"fields": ["phone", "mobile", "email"],
"no_marker": True, "phone_icons": True}'/>
</t>
</div>
</div>
<div class="row mb-3 border-dark">
<div class="col-4" t-if="doc.user_ids">
<span class="font-weight-bolder">Technician(s)</span>
<t t-foreach="doc.user_ids" t-as="technician">
<p class="m-0" t-field="technician.name"/>
</t>
</div>
<div class="col-4" t-if="doc.planned_date_begin">
<span class="font-weight-bolder">Planned Start</span>
<p t-field="doc.planned_date_begin"
t-options="{'widget': 'datetime'}"/>
</div>
<div class="col-4" t-if="doc.planned_date_end">
<span class="font-weight-bolder">Planned End</span>
<p t-field="doc.planned_date_end"
t-options="{'widget': 'datetime'}"/>
</div>
</div>
</div>
<div class="container">
<h3 class="mb32"><strong>Interventions</strong></h3>
<t t-foreach="doc.child_ids" t-as="intervention">
<div class="row">
<div class="col-6">
<h4><span t-field="intervention.name"/></h4>
<span t-if="intervention.description"
t-field="intervention.description"/>
</div>
<div t-if="intervention.equipment_ids"
class="col-6">
<h4>Equipment: </h4>
<t t-foreach="intervention.equipment_ids"
t-as="equipment">
<span t-field="equipment.complete_name"/>
<span t-if="equipment_index &lt; equipment_size -1"
t-out="', '"/>
</t>
</div>
</div>
<div class="row">
<table class="table table-borderless col-12">
<thead>
<th>Done</th>
<th>Task to do</th>
</thead>
<tbody>
<t t-foreach="intervention.child_ids"
t-as="task">
<tr class="wo-task">
<td style="width: 5%">
<input type="checkbox"
t-att-checked="task.is_complete"/>
</td>
<td style="width: 95%">
<p t-field="task.name"/>
<p t-field="task.description"/>
</td>
<!-- TODO: Figure out what to do with the old
concept of task comments -->
</tr>
</t>
</tbody>
</table>
</div>
</t>
</div>
</div>
</t>
</template>
</data>
</odoo>

View file

@ -19,3 +19,7 @@ class TestEquipment(BemadeFSMBaseTest):
partner_company.write({'equipment_ids': [Command.set([])]}) partner_company.write({'equipment_ids': [Command.set([])]})
with self.assertRaises(MissingError): with self.assertRaises(MissingError):
equipment.name equipment.name
def test_compute_complete_name_when_name_blank(self):
equipment = self._generate_equipment(name=False)
complete_name = equipment.complete_name

View file

@ -6,37 +6,51 @@ from odoo import Command
@tagged('post_install', '-at_install') @tagged('post_install', '-at_install')
class TaskTest(BemadeFSMBaseTest): class TaskTest(BemadeFSMBaseTest):
@classmethod
def setUpClass(cls):
# Chose to set up all tests the same way since this code was becoming very redundant
super().setUpClass()
cls.so = cls._generate_sale_order()
cls.template = cls._generate_task_template(names=['Parent', 'Child', 'Grandchild'], structure=[2, 1])
cls.product = cls._generate_product(task_template=cls.template)
cls.sol = cls._generate_sale_order_line(sale_order=cls.so, product=cls.product)
cls.user = cls._generate_project_manager_user('Bob', 'Bob')
cls.so.action_confirm()
cls.task = cls.sol.task_id
def test_reassigning_assignment_propagating_task_changes_subtasks(self): def test_reassigning_assignment_propagating_task_changes_subtasks(self):
# This creation step is a bit lazy - we use defaults to make tasks with a hierachy and settings we want task = self.task
so = self._generate_sale_order() task.propagate_assignment = True
template = self._generate_task_template(names=['Parent', 'Child'], structure=[2])
product = self._generate_product(task_template=template)
sol = self._generate_sale_order_line(sale_order=so, product=product)
user = self._generate_project_manager_user('Bob', 'Bob')
so.action_confirm()
task = sol.task_id
task.write({ task.write({
'user_ids': [Command.set([user.id])], 'user_ids': [Command.set([self.user.id])],
'propagate_assignment': True, 'propagate_assignment': True,
}) })
self.assertTrue(all([t.user_ids == user for t in task | task._get_all_subtasks()])) self.assertTrue(all([t.user_ids == self.user for t in task | task._get_all_subtasks()]))
def test_reassigning_assignment_non_propagating_task_doesnt_change_subtasks(self):
so = self._generate_sale_order()
template = self._generate_task_template(names=['Parent', 'Child', 'Grandchild'], structure=[2, 1])
product = self._generate_product(task_template=template)
sol = self._generate_sale_order_line(sale_order=so, product=product)
user = self._generate_project_manager_user('Bob', 'Bob')
so.action_confirm()
task = sol.task_id
task.child_ids.write({'propagate_assignment': False}) # Stop propagation after the first level
def test_reassigning_task_doesnt_propagate_by_default(self):
task = self.task
task.write({ task.write({
'user_ids': [Command.set([user.id])], 'user_ids': [Command.set([self.user.id])],
'propagate_assignment': True, 'propagate_assignment': True,
}) })
self.assertTrue(all([t.user_ids == user for t in task | task.child_ids]))
self.assertFalse(any([t.user_ids for t in task.child_ids.child_ids])) self.assertFalse(any([t.user_ids for t in task.child_ids.child_ids]))
def test_unset_propagate_assignment_unsets_for_all_children(self):
task = self.task
# First, set propagation and assign
task.propagate_assignment = True
task.write({
'user_ids': [Command.set([self.user.id])]
})
# Then, unset propagation for the children and re-set assignment
task.child_ids.write({'propagate_assignment': False})
self.assertFalse(any([t.propagate_assignment for t in task._get_all_subtasks()]))
# Then, test that assigning the parent only assigns its children, not its grandchildren
task.write({
'user_ids': [Command.set([])]
})
self.assertTrue(all([not t.user_ids for t in task | task.child_ids]))
self.assertTrue(all([t.user_ids == self.user for t in task.child_ids.child_ids]))

View file

@ -1,39 +0,0 @@
#
# Bemade Inc.
#
# Copyright (C) June 2023 Bemade Inc. (<https://www.bemade.org>).
# Author: mdurepos (Contact : it@bemade.org)
#
# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the Software
# or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
{
'name': 'Open Project Details',
'version': '17.0.0.0.1',
'summary': 'Open Project Details',
'description': """
This module adds the ability to view project details from the project form view.
""",
'category': 'Project',
'author': 'Bemade Inc.',
'website': 'https://www.bemade.org',
'license': 'OPL-1',
'depends': [
'project',
],
'data': [
# 'views/project_project_views.xml'
],
'demo': [],
'installable': True,
'auto_install': False,
}

View file

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<!-- Héritage de la vue Kanban des projets -->
<record id="project_view_project_kanban_inherit" model="ir.ui.view">
<field name="name">project.view.project.kanban.inherit</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.view_project_kanban"/>
<field name="arch" type="xml">
<!-- Modification de la visibilité de la gestion des paramètres pour tous les utilisateurs -->
<div class="o_kanban_card_manage_settings row" groups="project.group_project_manager" position="attributes">
<attribute name="groups">base.group_user</attribute>
</div>
<xpath expr="//a[@name='action_view_kanban_project'][@type='edit']" position="replace">
<a class="dropdown-item" role="menuitem" type="open" name="action_view_kanban_project">Open</a>
</xpath>
</field>
</record>
</data>
</odoo>

View file

@ -59,7 +59,7 @@ class ChooseDeliveryPackage(models.TransientModel):
# if no package type found, create one # if no package type found, create one
if not delivery_package_type: if not delivery_package_type:
delivery_package_type = delivery_package_type.create({ delivery_package_type = delivery_package_type.create({
'name': f'Box {vals["width"]}x{vals["height"]}x{vals["length"]}', 'name': f'Box {self.width}x{self.height}x{self.length}',
'width': self.width, 'width': self.width,
'height': self.height, 'height': self.height,
'packaging_length': self.length, 'packaging_length': self.length,

View file

@ -1,5 +1,4 @@
{ {
'name': 'Search Supplier Code',
'version': '17.0.0.1', 'version': '17.0.0.1',
'summary': 'Search for products by supplier code', 'summary': 'Search for products by supplier code',
'sequence': 10, 'sequence': 10,
@ -21,4 +20,4 @@
'application': False, 'application': False,
'auto_install': False, 'auto_install': False,
'license': 'LGPL-3', 'license': 'LGPL-3',
} }

View file

@ -42,8 +42,10 @@
'security/sports_clinic_groups.xml', 'security/sports_clinic_groups.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'security/sports_clinic_rules.xml', 'security/sports_clinic_rules.xml',
'data/sports_clinic_data.xml',
'views/sports_team_views.xml', 'views/sports_team_views.xml',
'views/sports_clinic_menus.xml', 'views/sports_clinic_menus.xml',
'views/sports_patient_injury_views.xml',
'views/sports_patient_views.xml', 'views/sports_patient_views.xml',
'views/sports_clinic_portal_views.xml', 'views/sports_clinic_portal_views.xml',
'views/res_partner_views.xml', 'views/res_partner_views.xml',

View file

@ -186,4 +186,4 @@
<field name="users" eval="[Command.link(ref('base.user_demo'))]"/> <field name="users" eval="[Command.link(ref('base.user_demo'))]"/>
</record> </record>
</data> </data>
</odoo> </odoo>

View file

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<record id="subtype_patient_injury_external_update" model="mail.message.subtype">
<field name="name">Patient File Update (External)</field>
<field name="res_model">sports.patient.injury</field>
<field name="default" eval="True"/>
<field name="internal" eval="False"/>
<field name="sequence" eval="4"/>
<field name="hidden" eval="False"/>
<field name="description"></field>
</record>
<record id="subtype_patient_injury_internal_update" model="mail.message.subtype">
<field name="name">Patient File Update (Internal)</field>
<field name="res_model">sports.patient.injury</field>
<field name="default" eval="True"/>
<field name="internal" eval="True"/>
<field name="sequence" eval="4"/>
<field name="hidden" eval="False"/>
</record>
<record id="mail_template_patient_injury_status_update" model="mail.template">
<field name="name">Patient Status Update</field>
<field name="model_id" ref="bemade_sports_clinic.model_sports_patient_injury"/>
<field name="subject">Patient Injury Status Update for {{ object.patient_name }}</field>
<field name="body_html" type="html">
<p>An update has been posted to the injury record for <t t-out="object.patient_name"/>'s injury<t t-if="object.diagnosis">with
the diagnosis of <strong t-out="object.diagnosis"/></t>. Click
<a t-attf-href="{{ user.company_id.website }}/my/player?player_id={{ object.patient_id.id }}">here</a> to view the injury details.
</p>
</field>
</record>
<record id="mail_template_patient_injury_new_internal_note" model="mail.template">
<field name="name">Patient Status Update</field>
<field name="model_id" ref="bemade_sports_clinic.model_sports_patient_injury"/>
<field name="subject">Internal Note Updated for Patient {{ object.patient_name }}</field>
<field name="body_html" type="html">
<p>A new internal note has been posted to the injury record for <t t-out="object.patient_name"/>'s injury<t t-if="object.diagnosis">with
the diagnosis of <strong t-out="object.diagnosis"/></t>.
</p>
<div>
<p><strong>New Note: </strong></p>
<div><t t-out="object.internal_notes"/></div>
</div>
</field>
</record>
<record id="subtype_patient_external_update" model="mail.message.subtype">
<field name="name">Patient File Update (External)</field>
<field name="res_model">sports.patient</field>
<field name="default" eval="True"/>
<field name="internal" eval="False"/>
<field name="sequence" eval="4"/>
<field name="hidden" eval="False"/>
<field name="description"></field>
</record>
<record id="subtype_patient_internal_update" model="mail.message.subtype">
<field name="name">Patient File Update (Internal)</field>
<field name="res_model">sports.patient</field>
<field name="default" eval="True"/>
<field name="internal" eval="True"/>
<field name="sequence" eval="4"/>
<field name="hidden" eval="False"/>
</record>
<record id="mail_template_patient_status_update" model="mail.template">
<field name="name">Patient Status Update</field>
<field name="model_id" ref="bemade_sports_clinic.model_sports_patient"/>
<field name="subject">Patient Status Update for {{ object.name}}</field>
<field name="body_html" type="html">
<p>An update has been posted to the record for <t t-out="object.name"/>'s. Click
<a t-attf-href="{{ user.company_id.website }}/my/players">here</a> to view the details.
</p>
</field>
</record>
<record id="mail_template_patient_new_internal_note" model="mail.template">
<field name="name">Patient Status Update</field>
<field name="model_id" ref="bemade_sports_clinic.model_sports_patient"/>
<field name="subject">Internal Note Updated for Patient {{ object.name}}</field>
<field name="body_html" type="html">
<p>A new internal note has been posted to the record for <t t-out="object.name"/>'s.
</p>
<div>
<p><strong>New Note: </strong></p>
<div><t t-out="object.team_info_notes"/></div>
</div>
</field>
</record>
</data>
</odoo>

View file

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 16.0\n" "Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-07 20:03+0000\n" "POT-Creation-Date: 2024-02-21 00:52+0000\n"
"PO-Revision-Date: 2023-11-07 20:03+0000\n" "PO-Revision-Date: 2024-02-21 00:52+0000\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -25,11 +25,6 @@ msgstr ""
msgid "/my/teams" msgid "/my/teams"
msgstr "" msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_patient_injury
msgid "A patient's injury."
msgstr "La blessure d'un patient."
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#. odoo-python #. odoo-python
#: code:addons/bemade_sports_clinic/models/sports_team.py:0 #: code:addons/bemade_sports_clinic/models/sports_team.py:0
@ -105,6 +100,11 @@ msgstr "Administrateur"
msgid "Age" msgid "Age"
msgstr "Âge" msgstr "Âge"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__allergies
msgid "Allergies"
msgstr ""
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__message_attachment_count #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__message_attachment_count
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__message_attachment_count #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__message_attachment_count
@ -112,14 +112,9 @@ msgid "Attachment Count"
msgstr "Nombre de pièces jointes" msgstr "Nombre de pièces jointes"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__stage__practice_ok #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__city
msgid "Cleared for Practice" msgid "City"
msgstr "Pratiques autorisées" msgstr "Ville"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__stage__healthy
msgid "Cleared to Play"
msgstr "Matchs autorisés"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_team_staff__role__coach #: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_team_staff__role__coach
@ -128,8 +123,9 @@ msgstr "Entraîneur"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_res_partner #: model:ir.model,name:bemade_sports_clinic.model_res_partner
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__partner_id
msgid "Contact" msgid "Contact"
msgstr "Contact" msgstr ""
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__contact_type #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__contact_type
@ -139,7 +135,12 @@ msgstr "Type de contact"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Contacts" msgid "Contacts"
msgstr "Contacts" msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__country_id
msgid "Country"
msgstr "Pays"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__create_uid #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__create_uid
@ -159,15 +160,20 @@ msgstr "Créé par"
msgid "Created on" msgid "Created on"
msgstr "Créé le" msgstr "Créé le"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_kanban
msgid "DOB:"
msgstr "DDN :"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__date_of_birth #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__date_of_birth
msgid "Date Of Birth" msgid "Date Of Birth"
msgstr "Date de naissance" msgstr "Date de naissance"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__injury_date_time #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__injury_date
msgid "Date and Time of Injury" msgid "Date of Injury"
msgstr "Date et heure de la blessure" msgstr "Date de la blessure"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_injury_view_tree #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_injury_view_tree
@ -189,6 +195,11 @@ msgstr "Diagnostique"
msgid "Display Name" msgid "Display Name"
msgstr "Nom pour affichage" msgstr "Nom pour affichage"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_team_staff__role__doctor
msgid "Doctor"
msgstr "Docteur"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.constraint,message:bemade_sports_clinic.constraint_sports_team_staff_team_staff_unique #: model:ir.model.constraint,message:bemade_sports_clinic.constraint_sports_team_staff_team_staff_unique
msgid "Each partner can only be related to a given team once." msgid "Each partner can only be related to a given team once."
@ -301,7 +312,7 @@ msgstr "En santé :"
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team__id #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team__id
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team_staff__id #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team_staff__id
msgid "ID" msgid "ID"
msgstr "ID" msgstr ""
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__activity_exception_icon #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__activity_exception_icon
@ -329,6 +340,13 @@ msgstr "Si coché, des nouveaux messages nécessitent votre attention."
msgid "If checked, some messages have a delivery error." msgid "If checked, some messages have a delivery error."
msgstr "Si coché, certains messages ont une erreur de livraison." msgstr "Si coché, certains messages ont une erreur de livraison."
#. module: bemade_sports_clinic
#. odoo-python
#: code:addons/bemade_sports_clinic/models/patient_injury.py:0
#, python-format
msgid "If injury date is not set, the N/A box must be checked."
msgstr "Sa la date de la blessure n'est pas remplie, la case S/O doit être cochée."
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__stage__no_play #: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__stage__no_play
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_teams #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_teams
@ -463,7 +481,14 @@ msgstr "Erreur de livraison du message"
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__message_ids #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__message_ids
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__message_ids #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__message_ids
msgid "Messages" msgid "Messages"
msgstr "Messages" msgstr ""
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__mobile
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__mobile
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team_staff__mobile
msgid "Mobile"
msgstr ""
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient_contact__contact_type__mother #: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient_contact__contact_type__mother
@ -476,6 +501,12 @@ msgstr "Mère"
msgid "My Activity Deadline" msgid "My Activity Deadline"
msgstr "Date limite de mon activité" msgstr "Date limite de mon activité"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__injury_date_na
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient_injury__parental_consent__na
msgid "N/A"
msgstr "S/O"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__name #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__name
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__name #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__name
@ -508,13 +539,15 @@ msgstr "Type de la prochaine activité"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__match_status__no #: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__match_status__no
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__practice_status__no #: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__practice_status__no
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient_injury__parental_consent__no
msgid "No" msgid "No"
msgstr "Non" msgstr "Non"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__team_info_notes
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_player_injuries #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_player_injuries
msgid "Notes" msgid "Notes"
msgstr "Notes" msgstr ""
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__message_needaction_counter #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__message_needaction_counter
@ -557,6 +590,11 @@ msgstr "Organisation"
msgid "Other" msgid "Other"
msgstr "Autre" msgstr "Autre"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Other Contacts"
msgstr "Autres contacts"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_res_partner__owned_team_ids #: model:ir.model.fields,field_description:bemade_sports_clinic.field_res_partner__owned_team_ids
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_res_users__owned_team_ids #: model:ir.model.fields,field_description:bemade_sports_clinic.field_res_users__owned_team_ids
@ -571,55 +609,96 @@ msgid "Parent Organization"
msgstr "Organisation parente" msgstr "Organisation parente"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__parental_consent
msgid "Consent for Disclosure to Parent"
msgstr "Consentement pour divulgation au parent"
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_patient
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_res_partner__patient_ids
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_res_users__patient_ids
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__patient_id #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__patient_id
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__patient_id #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__patient_id
msgid "Patient" msgid "Patient"
msgstr "Patient(e)" msgstr "Patient dans une clinique de médecine sportive."
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Patient Address"
msgstr "Adresse du patient"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__contact_ids #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__contact_ids
msgid "Patient Contacts" msgid "Patient Contacts"
msgstr "Contacts du patient" msgstr "Contacts du patient"
#. module: bemade_sports_clinic
#: model:mail.message.subtype,name:bemade_sports_clinic.subtype_patient_update
msgid "Patient File Update"
msgstr "Mise à jour du dossier du patient"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Patient Information" msgid "Patient Information"
msgstr "Information du patient" msgstr "Information du patient"
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_patient_injury
msgid "Patient Injury"
msgstr "La blessure d'un patient."
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_injury_view_tree #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_injury_view_tree
msgid "Patient Injury History" msgid "Patient Injury History"
msgstr "Historique des blessures du patient" msgstr "Historique des blessures du patient"
#. module: bemade_sports_clinic
#: model:mail.message.subtype,name:bemade_sports_clinic.subtype_patient_injury_update
msgid "Patient Injury Status Update"
msgstr "Mise à jour du statut de la blessure d'un patient"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Patient Phone & Email"
msgstr "Téléphone et courriel du patient"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Patient Record" msgid "Patient Record"
msgstr "Dossier du patient" msgstr "Dossier du patient"
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_patient
msgid "Patient at a sports medicine clinic."
msgstr "Patient dans une clinique de médecine sportive."
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_form
msgid "Patient's Contacts" msgid "Patient's Contacts"
msgstr "Contacts du patient" msgstr "Contacts du patient"
#. module: bemade_sports_clinic
#: model:mail.message.subtype,description:bemade_sports_clinic.subtype_patient_update
msgid "Patient's file has been updated."
msgstr "Le dossier du patient a été mis à jour."
#. module: bemade_sports_clinic
#: model:mail.message.subtype,description:bemade_sports_clinic.subtype_patient_injury_update
msgid "Patient's injury was updated."
msgstr "Le dossier de la blessure du patient a été mis à jour."
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.actions.act_window,name:bemade_sports_clinic.action_view_patient #: model:ir.actions.act_window,name:bemade_sports_clinic.action_view_patient
#: model:ir.ui.menu,name:bemade_sports_clinic.sports_clinic_patients #: model:ir.ui.menu,name:bemade_sports_clinic.sports_clinic_patients
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_list #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_list
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_list_embedded #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_list_embedded
msgid "Patients" msgid "Patients"
msgstr "Patients" msgstr ""
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__mobile #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__phone
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_contact__mobile msgid "Phone"
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team_staff__mobile msgstr "Téléphone"
msgid "Mobile"
msgstr "Mobile" #. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__stage__healthy
msgid "Play OK"
msgstr "Matchs autorisés"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team__player_count #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team__player_count
@ -635,6 +714,11 @@ msgstr "Nombre de joueurs"
msgid "Players" msgid "Players"
msgstr "Joueurs" msgstr "Joueurs"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__stage__practice_ok
msgid "Practice OK"
msgstr "Pratiques autorisées"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__practice_status #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__practice_status
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_players #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_players
@ -652,11 +736,6 @@ msgstr "Date prévue de résolution"
msgid "Predicted Return Date" msgid "Predicted Return Date"
msgstr "Date prévue de retour" msgstr "Date prévue de retour"
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_team_staff
msgid "Relationship between staff members and their teams."
msgstr "Relation entre les membres du personnel et leurs équipes."
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__resolution_date #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient_injury__resolution_date
msgid "Resolution Date" msgid "Resolution Date"
@ -720,6 +799,11 @@ msgstr "Gestion de clinique de médecine sportive"
msgid "Sports Team" msgid "Sports Team"
msgstr "Équipe sportive" msgstr "Équipe sportive"
#. module: bemade_sports_clinic
#: model:ir.model,name:bemade_sports_clinic.model_sports_team_staff
msgid "Sports Team Staff"
msgstr "Relation entre les membres du personnel et leurs équipes."
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.actions.act_window,name:bemade_sports_clinic.action_view_team #: model:ir.actions.act_window,name:bemade_sports_clinic.action_view_team
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_team_view_list #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_team_view_list
@ -744,6 +828,11 @@ msgstr "Membre du personnel"
msgid "Stage" msgid "Stage"
msgstr "Étape" msgstr "Étape"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__state_id
msgid "State"
msgstr "État"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,help:bemade_sports_clinic.field_sports_patient__activity_state #: model:ir.model.fields,help:bemade_sports_clinic.field_sports_patient__activity_state
#: model:ir.model.fields,help:bemade_sports_clinic.field_sports_patient_injury__activity_state #: model:ir.model.fields,help:bemade_sports_clinic.field_sports_patient_injury__activity_state
@ -758,6 +847,21 @@ msgstr ""
"Aujourd'hui: La date d'échéance est aujourd'hui\n" "Aujourd'hui: La date d'échéance est aujourd'hui\n"
"Planifiées: Activités futures." "Planifiées: Activités futures."
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.sports_patient_view_kanban
msgid "Status:"
msgstr "Statut :"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__street
msgid "Street"
msgstr "Rue"
#. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__street2
msgid "Street2"
msgstr "Rue2"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team_staff__team_id #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_team_staff__team_id
msgid "Team" msgid "Team"
@ -804,6 +908,11 @@ msgstr "La date quand la blessure a été résolue."
msgid "The teams this person works for." msgid "The teams this person works for."
msgstr "Les équipes pour lesquelles cette personne travaille." msgstr "Les équipes pour lesquelles cette personne travaille."
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_team_staff__role__therapist
msgid "Therapist"
msgstr "Thérapeute"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#. odoo-python #. odoo-python
#: code:addons/bemade_sports_clinic/controllers/team_staff_portal.py:0 #: code:addons/bemade_sports_clinic/controllers/team_staff_portal.py:0
@ -818,21 +927,18 @@ msgstr "Ce joueur n'a pu être trouvé."
msgid "This team could not be found." msgid "This team could not be found."
msgstr "Cette équipe n'a pu être trouvée." msgstr "Cette équipe n'a pu être trouvée."
#. module: bemade_sports_clinic
#. odoo-python
#: code:addons/bemade_sports_clinic/models/res_partner.py:0
#, python-format
msgid "To change a patient's name, change it from the patient form."
msgstr "Pour changer le nom d'un patient, changez le à partir du formulaire patient."
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_teams #: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_teams
msgid "Total Players" msgid "Total Players"
msgstr "Total des joueurs" msgstr "Total des joueurs"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_team_staff__role__therapist
msgid "Therapist"
msgstr "Thérapeute"
#. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_team_staff__role__doctor
msgid "Doctor"
msgstr "Docteur"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:res.groups,name:bemade_sports_clinic.group_sports_clinic_treatment_professional #: model:res.groups,name:bemade_sports_clinic.group_sports_clinic_treatment_professional
msgid "Treatment Professional" msgid "Treatment Professional"
@ -879,11 +985,22 @@ msgstr "Historique de communication du site web"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields,help:bemade_sports_clinic.field_sports_patient__return_date #: model:ir.model.fields,help:bemade_sports_clinic.field_sports_patient__return_date
msgid "When the player was cleared by medical staff to return to match play." msgid "When the player was cleared by medical staff to return to match play."
msgstr "Quand le joueur a été autorisé par le personnel médical à retourner au jeu." msgstr ""
"Quand le joueur a été autorisé par le personnel médical à retourner au jeu."
#. module: bemade_sports_clinic
#: model:ir.model.fields,help:bemade_sports_clinic.field_sports_patient_injury__parental_consent
msgid ""
"Whether the patient has given their consent to share injury details with "
"their parents."
msgstr ""
"Indique si le patient a donné son consentement pour que les détails de la blessure soient partagés avec "
"ses parents."
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__match_status__yes #: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__match_status__yes
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__practice_status__yes #: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient__practice_status__yes
#: model:ir.model.fields.selection,name:bemade_sports_clinic.selection__sports_patient_injury__parental_consent__yes
msgid "Yes" msgid "Yes"
msgstr "Oui" msgstr "Oui"
@ -903,11 +1020,6 @@ msgid "Your Teams"
msgstr "Vos équipes" msgstr "Vos équipes"
#. module: bemade_sports_clinic #. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_home #: model:ir.model.fields,field_description:bemade_sports_clinic.field_sports_patient__zip
msgid "players_count" msgid "Zip"
msgstr "" msgstr "Code postal"
#. module: bemade_sports_clinic
#: model_terms:ir.ui.view,arch_db:bemade_sports_clinic.portal_my_home
msgid "teams_count"
msgstr ""

View file

@ -0,0 +1,21 @@
from odoo import api, SUPERUSER_ID, Command
def migrate(cr, version):
env = api.Environment(cr, SUPERUSER_ID, {})
patient_followers = env['mail.followers'].search([('res_model', '=',
'sports.patient')])
injury_followers = env['mail.followers'].search([('res_model', '=',
'sports.patient.injury')])
for f in patient_followers:
f.write(
{
'subtype_ids':
[Command.link(env.ref('bemade_sports_clinic.subtype_patient_update').id)]
}
)
for f in injury_followers:
f.write(
{
'subtype_ids':
[Command.link(env.ref('bemade_sports_clinic.subtype_patient_injury_update').id)]
})

View file

@ -0,0 +1,22 @@
from odoo import api, SUPERUSER_ID, Command
def migrate(cr, version):
env = api.Environment(cr, SUPERUSER_ID, {})
patient_followers = env['mail.followers'].search([('res_model', '=',
'sports.patient')])
injury_followers = env['mail.followers'].search([('res_model', '=',
'sports.patient.injury')])
for f in patient_followers:
if f.partner_id.user_ids.has_group('base.group_user'):
subtype = env.ref('bemade_sports_clinic.subtype_patient_internal_update').id
else:
subtype = env.ref('bemade_sports_clinic.subtype_patient_external_update').id
f.write({'subtype_ids': [Command.link(subtype)]})
for f in injury_followers:
if f.partner_id.user_ids.has_group('base.group_user'):
subtype = env.ref('bemade_sports_clinic.subtype_patient_injury_internal_update').id
else:
subtype = env.ref('bemade_sports_clinic.subtype_patient_injury_external_update').id
f.write({'subtype_ids': [Command.link(subtype)]})

View file

@ -1,4 +1,7 @@
from . import mail_followers
from . import patient from . import patient
from . import patient_injury
from . import patient_contact
from . import res_partner from . import res_partner
from . import sports_team from . import sports_team
from . import res_users from . import res_users

View file

@ -0,0 +1,46 @@
from odoo import models, fields, api, _
class MailFollowers(models.Model):
_inherit = "mail.followers"
# This is a user quality of life modification, to avoid duplicated message subtype subscription for internal
# and external notifications (since both subtypes are default=True).
def write(self, vals):
super().write(vals)
subtypes_map = self.__subtypes_map()
if self.res_model in subtypes_map and 'subtype_ids' in vals:
internal_subtype, external_subtype = subtypes_map.get(self.res_model)
if external_subtype in self.subtype_ids and internal_subtype in self.subtype_ids:
self.subtype_ids = self.subtype_ids - external_subtype
@api.model_create_multi
def create(self, vals_list):
recs = super().create(vals_list)
subtypes_map = self.__subtypes_map()
to_fix = {
model:
recs.filtered(
lambda rec: rec.res_model == model
and subtypes[0] in rec.subtype_ids
and subtypes[1] in rec.subtype_ids
) for model, subtypes in subtypes_map.items()
}
for model, records in to_fix.items():
for rec in records:
rec.subtype_ids = rec.subtype_ids - subtypes_map[model][1]
return recs
def __subtypes_map(self):
xml_id_fmt_string = "bemade_sports_clinic.subtype_{0}_{1}_update"
return {
'sports.patient': (
self.env.ref(xml_id_fmt_string.format('patient', 'internal')),
self.env.ref(xml_id_fmt_string.format('patient', 'external')),
),
'sports.patient.injury': (
self.env.ref(xml_id_fmt_string.format('patient_injury', 'internal')),
self.env.ref(xml_id_fmt_string.format('patient_injury', 'external')),
),
}

View file

@ -3,11 +3,26 @@ from odoo.exceptions import ValidationError
from datetime import date from datetime import date
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from odoo.addons.phone_validation.tools import phone_validation from odoo.addons.phone_validation.tools import phone_validation
from typing import Set, Tuple
external_tracking_fields = {
'last_consultation_date',
'match_status',
'practice_status',
'predicted_return_date',
'return_date',
}
internal_tracking_fields = {
'team_info_notes',
'age',
'date_of_birth',
}
class Patient(models.Model): class Patient(models.Model):
_name = 'sports.patient' _name = 'sports.patient'
_description = "Patient at a sports medicine clinic." _description = "Patient"
_inherit = ['mail.thread', 'mail.activity.mixin'] _inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'last_name, first_name' _order = 'last_name, first_name'
@ -30,43 +45,68 @@ class Patient(models.Model):
date_of_birth = fields.Date( date_of_birth = fields.Date(
groups="bemade_sports_clinic.group_sports_clinic_treatment_professional", groups="bemade_sports_clinic.group_sports_clinic_treatment_professional",
tracking=True) tracking=True)
age = fields.Integer(compute='_compute_age', age = fields.Integer(
groups="bemade_sports_clinic.group_sports_clinic_treatment_professional", compute='_compute_age',
tracking=True) groups="bemade_sports_clinic.group_sports_clinic_treatment_professional"
contact_ids = fields.One2many(comodel_name='sports.patient.contact', )
inverse_name='patient_id', contact_ids = fields.One2many(
string='Patient Contacts', comodel_name='sports.patient.contact',
groups="bemade_sports_clinic.group_sports_clinic_user") inverse_name='patient_id',
team_ids = fields.Many2many(comodel_name='sports.team', string='Patient Contacts',
relation='sports_team_patient_rel', groups="bemade_sports_clinic.group_sports_clinic_user"
column1='patient_id', )
column2='team_id', team_ids = fields.Many2many(
string='Teams', ) comodel_name='sports.team',
match_status = fields.Selection([ # Selection for easy expansion later relation='sports_team_patient_rel',
('yes', 'Yes'), column1='patient_id',
('no', 'No'), column2='team_id',
], required=True, default='yes', tracking=True) string='Teams',
practice_status = fields.Selection([ )
('yes', 'Yes'), match_status = fields.Selection( # Selection rather than bool for easy expansion later
('no_contact', 'Yes, no contact'), selection=[
('no', 'No')], tracking=True, required=True, default='yes') ('yes', 'Yes'),
('no', 'No'),
injury_ids = fields.One2many(comodel_name='sports.patient.injury', ],
inverse_name='patient_id', required=True,
string='Injuries', ) default='yes',
tracking=True)
practice_status = fields.Selection(
selection=[
('yes', 'Yes'),
('no_contact', 'Yes, no contact'),
('no', 'No')
],
tracking=True,
required=True,
default='yes',
)
injury_ids = fields.One2many(
comodel_name='sports.patient.injury',
inverse_name='patient_id',
string='Injuries',
)
injured_since = fields.Date(compute='_compute_is_injured') injured_since = fields.Date(compute='_compute_is_injured')
predicted_return_date = fields.Date(tracking=True) predicted_return_date = fields.Date(tracking=True)
return_date = fields.Date(tracking=True, return_date = fields.Date(
help="When the player was cleared by medical staff to " tracking=True,
"return to match play.") help="When the player was cleared by medical staff to "
"return to match play."
)
is_injured = fields.Boolean(compute="_compute_is_injured") is_injured = fields.Boolean(compute="_compute_is_injured")
stage = fields.Selection( stage = fields.Selection(
selection=[('no_play', 'Injured'), ('practice_ok', 'Practice OK'), ('healthy', 'Play OK')], selection=[
('no_play', 'Injured'),
('practice_ok', 'Practice OK'),
('healthy', 'Play OK')
],
compute='_compute_stage') compute='_compute_stage')
last_consultation_date = fields.Date() last_consultation_date = fields.Date(tracking=True)
active_injury_count = fields.Integer(compute='_compute_active_injury_count') active_injury_count = fields.Integer(compute='_compute_active_injury_count')
allergies = fields.Text() allergies = fields.Text()
team_info_notes = fields.Html(string="Notes") team_info_notes = fields.Html(
string="Notes",
tracking=True,
)
def default_get(self, fields_list): def default_get(self, fields_list):
res = super().default_get(fields_list) res = super().default_get(fields_list)
@ -187,116 +227,28 @@ class Patient(models.Model):
raise_exception=False raise_exception=False
) )
def _track_subtype(self, init_values):
return self.env.ref('mail.mt_note')
class PatientContact(models.Model): def _track_template(self, changes):
_name = 'sports.patient.contact' res = super()._track_template(changes)
_description = "Emergency or other contacts for a patient." params = set(changes)
external = bool(external_tracking_fields & params)
sequence = fields.Integer(required=True, default=0) if external:
name = fields.Char(unaccent=False) first_external_field = (external_tracking_fields & params).pop()
contact_type = fields.Selection(selection=[ res[first_external_field] = (
('mother', 'Mother'), self.env.ref('bemade_sports_clinic.mail_template_patient_status_update'), {
('father', 'Father'), 'auto_delete_message': False,
('other', 'Other'), 'subtype_id': self.env.ref('bemade_sports_clinic.subtype_patient_external_update').id,
], required=True) 'email_layout_xmlid': 'mail.mail_notification_light',
mobile = fields.Char(unaccent=False, required=True) }
patient_id = fields.Many2one(comodel_name='sports.patient', string='Patient') )
if 'team_info_notes' in changes:
@api.onchange('mobile') res['team_info_notes'] = (
def _onchange_mobile_validation(self): self.env.ref('bemade_sports_clinic.mail_template_patient_new_internal_note'), {
if self.mobile: 'auto_delete_message': False,
self.mobile = self._phone_format(self.mobile, force_format="INTERNATIONAL") 'subtype_id': self.env.ref('bemade_sports_clinic.subtype_patient_internal_update').id,
'email_layout_xmlid': 'mail.mail_notification_light',
def _phone_format(self, number, force_format='E164'): }
country = self.patient_id.country_id or self.env.company.country_id )
if not country or not number:
return number
return phone_validation.phone_format(
number,
country.code if country else None,
country.phone_code if country else None,
force_format=force_format,
raise_exception=False
)
class PatientInjury(models.Model):
_name = 'sports.patient.injury'
_description = "A patient's injury."
_inherit = ['mail.thread', 'mail.activity.mixin']
_rec_name = 'diagnosis'
patient_id = fields.Many2one(comodel_name='sports.patient',
string="Patient",
readonly=True,
required=True)
patient_name = fields.Char(related="patient_id.name")
diagnosis = fields.Char(tracking=True)
injury_date = fields.Date(string='Date of Injury',
default=date.today())
injury_date_na = fields.Boolean(string="N/A", default=False)
internal_notes = fields.Html(tracking=True)
external_notes = fields.Html(tracking=True)
treatment_professional_ids = fields.Many2many(comodel_name='res.users',
relation='patient_injury_treatment_pro_rel',
column1='patient_injury_id',
column2='treatment_pro_id', string='Treatment Professionals',
domain=[
('is_treatment_professional', '=',
True)], tracking=True)
predicted_resolution_date = fields.Date(tracking=True)
resolution_date = fields.Date(tracking=True,
help="The date when the injury was actually resolved.")
stage = fields.Selection(selection=[('active', 'Active'), ('resolved', 'Resolved')], compute='_compute_stage')
@api.constrains('injury_date_na', 'injury_date')
def constrain_date_blank_only_if_na(self):
for rec in self:
if not rec.injury_date_na and not rec.injury_date:
raise ValidationError(_("If injury date is not set, the N/A box must be checked."))
@api.onchange('injury_date_na')
def _onchange_injury_date_na(self):
for rec in self:
if rec.injury_date_na:
rec.injury_date = None
@api.onchange('injury_date')
def _onchange_injury_date(self):
for rec in self:
if rec.injury_date:
rec.injury_date_na = False
@api.depends('resolution_date')
def _compute_stage(self):
for rec in self:
if rec.resolution_date and rec.resolution_date <= date.today():
rec.stage = 'resolved'
else:
rec.stage = 'active'
def write(self, vals):
super().write(vals)
if 'treatment_professional_ids' in vals:
to_subscribe = (self.treatment_professional_ids.mapped('partner_id')
- self.message_follower_ids.mapped('partner_id'))
self.message_subscribe(to_subscribe.ids)
@api.model_create_multi
def create(self, vals_list):
res = super().create(vals_list)
for rec in res:
to_subscribe = (rec.treatment_professional_ids.mapped('partner_id')
- rec.message_follower_ids.mapped('partner_id'))
rec.message_subscribe(to_subscribe.ids)
return res return res
def action_view_injury_form(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'sports.patient.injury',
'res_id': self.id,
'context': self._context,
}

View file

@ -0,0 +1,35 @@
from odoo import models, fields, api
from odoo.addons.phone_validation.tools import phone_validation
class PatientContact(models.Model):
_name = 'sports.patient.contact'
_description = "Emergency or other contacts for a patient."
sequence = fields.Integer(required=True, default=0)
name = fields.Char(unaccent=False)
contact_type = fields.Selection(selection=[
('mother', 'Mother'),
('father', 'Father'),
('other', 'Other'),
], required=True)
mobile = fields.Char(unaccent=False, required=True)
# TODO: add email here and on views
patient_id = fields.Many2one(comodel_name='sports.patient', string='Patient')
@api.onchange('mobile')
def _onchange_mobile_validation(self):
if self.mobile:
self.mobile = self._phone_format(self.mobile, force_format="INTERNATIONAL")
def _phone_format(self, number, force_format='E164'):
country = self.patient_id.country_id or self.env.company.country_id
if not country or not number:
return number
return phone_validation.phone_format(
number,
country.code if country else None,
country.phone_code if country else None,
force_format=force_format,
raise_exception=False
)

View file

@ -0,0 +1,153 @@
from odoo import models, fields, api, _
from datetime import datetime, date
import pytz
from odoo.exceptions import ValidationError
from typing import Set, Tuple
external_tracking_fields = {
'diagnosis',
'predicted_resolution_date',
'resolution_date',
'external_notes',
}
# Include only fields not already included in external_tracking_fields here
internal_tracking_fields = {
'internal_notes',
'parental_consent',
}
class PatientInjury(models.Model):
_name = 'sports.patient.injury'
_description = "Patient Injury"
_inherit = ['mail.thread', 'mail.activity.mixin']
_rec_name = 'diagnosis'
@api.model
def _today(self):
"""Get the current date in the user's time zone."""
return datetime.now(pytz.timezone(self.env.user.tz or 'GMT'))
# TODO: Find a way to improve notifications send about tracking injury details
# TODO: Add field consentement_parental = fields.Selection(oui, non, non-applicable)
patient_id = fields.Many2one(
comodel_name='sports.patient',
string="Patient",
readonly=True,
required=True
)
patient_name = fields.Char(related="patient_id.name")
diagnosis = fields.Char(tracking=True)
injury_date = fields.Date(
string='Date of Injury',
default=_today,
)
injury_date_na = fields.Boolean(string="N/A", default=False)
internal_notes = fields.Html(tracking=True)
external_notes = fields.Html(tracking=True)
treatment_professional_ids = fields.Many2many(
comodel_name='res.users',
relation='patient_injury_treatment_pro_rel',
column1='patient_injury_id',
column2='treatment_pro_id', string='Treatment Professionals',
domain=[
('is_treatment_professional', '=',
True)], tracking=True
)
predicted_resolution_date = fields.Date(tracking=True)
resolution_date = fields.Date(
tracking=True,
help="The date when the injury was actually resolved."
)
stage = fields.Selection(selection=[('active', 'Active'), ('resolved', 'Resolved')], compute='_compute_stage')
parental_consent = fields.Selection(
string="Consent for Disclosure to Parent",
selection=[
('yes', 'Yes'),
('no', 'No'),
('na', 'N/A')
],
help="Whether the patient has given their consent to share injury details with their parents.",
tracking=True,
)
@api.constrains('injury_date_na', 'injury_date')
def constrain_date_blank_only_if_na(self):
for rec in self:
if not rec.injury_date_na and not rec.injury_date:
raise ValidationError(_("If injury date is not set, the N/A box must be checked."))
@api.onchange('injury_date_na')
def _onchange_injury_date_na(self):
for rec in self:
if rec.injury_date_na:
rec.injury_date = None
@api.onchange('injury_date')
def _onchange_injury_date(self):
for rec in self:
if rec.injury_date:
rec.injury_date_na = False
@api.depends('resolution_date')
def _compute_stage(self):
for rec in self:
if rec.resolution_date and rec.resolution_date <= date.today():
rec.stage = 'resolved'
else:
rec.stage = 'active'
def write(self, vals):
super().write(vals)
if 'treatment_professional_ids' in vals:
to_subscribe = (self.treatment_professional_ids.mapped('partner_id')
- self.message_follower_ids.mapped('partner_id'))
self.message_subscribe(to_subscribe.ids)
@api.model_create_multi
def create(self, vals_list):
res = super().create(vals_list)
for rec in res:
to_subscribe = (rec.treatment_professional_ids.mapped('partner_id')
- rec.message_follower_ids.mapped('partner_id'))
rec.message_subscribe(to_subscribe.ids)
return res
def action_view_injury_form(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'sports.patient.injury',
'res_id': self.id,
'context': self._context,
}
def _track_subtype(self, init_values):
return self.env.ref('mail.mt_note')
def _track_template(self, changes):
res = super()._track_template(changes)
params = set(changes)
external = bool(external_tracking_fields & params)
if external:
first_external_field = (external_tracking_fields & params).pop()
res[first_external_field] = (
self.env.ref('bemade_sports_clinic.mail_template_patient_injury_status_update'), {
'auto_delete_message': False,
'subtype_id': self.env.ref('bemade_sports_clinic.subtype_patient_injury_external_update').id,
'email_layout_xmlid': 'mail.mail_notification_light',
}
)
if 'internal_notes' in changes:
res['internal_notes'] = (
self.env.ref('bemade_sports_clinic.mail_template_patient_injury_new_internal_note'), {
'auto_delete_message': False,
'subtype_id': self.env.ref('bemade_sports_clinic.subtype_patient_injury_internal_update').id,
'email_layout_xmlid': 'mail.mail_notification_light',
}
)
return res

View file

@ -51,7 +51,7 @@ class SportsTeam(models.Model):
class TeamStaff(models.Model): class TeamStaff(models.Model):
_name = "sports.team.staff" _name = "sports.team.staff"
_description = "Relationship between staff members and their teams." _description = "Sports Team Staff"
sequence = fields.Integer() sequence = fields.Integer()
team_id = fields.Many2one(comodel_name='sports.team', string='Team', required=True) team_id = fields.Many2one(comodel_name='sports.team', string='Team', required=True)

View file

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="sports_patient_injury_view_form" model="ir.ui.view">
<field name="name">sports.patient.injury.view.form</field>
<field name="model">sports.patient.injury</field>
<field name="arch" type="xml">
<form>
<header>
<field name="stage" widget="statusbar"/>
</header>
<sheet>
<div class="oe_title">
<h1>
Injury Details for
<field name="patient_name" class="oe_inline"/>
</h1>
</div>
<group>
<group col="2">
<field name="patient_id" invisible="1"/>
<span colspan="2">
<label for="injury_date"/>
<field name="injury_date" widget="date" class="oe_inline"/>
<field name="injury_date_na" class="oe_inline"/>
<label for="injury_date_na"/>
</span>
<field name="diagnosis"/>
<field name="predicted_resolution_date"/>
<field name="resolution_date"/>
</group>
<group>
<field name="parental_consent"/>
<field name="internal_notes" widget="html"/>
<field name="external_notes" widget="html"/>
<field name="treatment_professional_ids"
widget="many2many_tags_avatar"/>
</group>
</group>
</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="sports_patient_injury_view_tree" model="ir.ui.view">
<field name="name">sports.patient.injury.view.tree</field>
<field name="model">sports.patient.injury</field>
<field name="arch" type="xml">
<tree string="Patient Injury History" editable="bottom"
multi_edit="True">
<field name="patient_id" invisible="1"/>
<field name="injury_date" widget="date"/>
<field name="diagnosis"/>
<field name="predicted_resolution_date" widget="date"/>
<field name="resolution_date" widget="date"/>
<field name="treatment_professional_ids"
widget="many2many_avatar_user"/>
<field name="activity_ids" widget="list_activity"/>
<field name="parental_consent"/>
<button name="action_view_injury_form" type="object"
title="Details" string="Details"
context="{'default_patient_id': patient_id}"/>
</tree>
</field>
</record>
</odoo>

View file

@ -184,69 +184,6 @@
</form> </form>
</field> </field>
</record> </record>
<record id="sports_patient_injury_view_form" model="ir.ui.view"> >
<field name="name">sports.patient.injury.view.form</field>
<field name="model">sports.patient.injury</field>
<field name="arch" type="xml">
<form>
<header>
<field name="stage" widget="statusbar"/>
</header>
<sheet>
<div class="oe_title">
<h1>
Injury Details for
<field name="patient_name" class="oe_inline"/>
</h1>
</div>
<group>
<group col="2">
<field name="patient_id" invisible="1"/>
<span colspan="2">
<label for="injury_date"/>
<field name="injury_date" widget="date" class="oe_inline"/>
<field name="injury_date_na" class="oe_inline"/>
<label for="injury_date_na"/>
</span>
<field name="diagnosis"/>
<field name="predicted_resolution_date"/>
<field name="resolution_date"/>
</group>
<group>
<field name="internal_notes" widget="html"/>
<field name="external_notes" widget="html"/>
<field name="treatment_professional_ids"
widget="many2many_tags_avatar"/>
</group>
</group>
</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="sports_patient_injury_view_tree" model="ir.ui.view">
<field name="name">sports.patient.injury.view.tree</field>
<field name="model">sports.patient.injury</field>
<field name="arch" type="xml">
<tree string="Patient Injury History" editable="bottom"
multi_edit="True">
<field name="patient_id" invisible="1"/>
<field name="injury_date" widget="date"/>
<field name="diagnosis"/>
<field name="predicted_resolution_date" widget="date"/>
<field name="resolution_date" widget="date"/>
<field name="treatment_professional_ids"
widget="many2many_avatar_user"/>
<field name="activity_ids" widget="list_activity"/>
<button name="action_view_injury_form" type="object"
title="Details" string="Details"
context="{'default_patient_id': patient_id}"/>
</tree>
</field>
</record>
</data> </data>
</odoo> </odoo>