Please, subscribe, in priority, to the
highlighted shifts. To sign up to a shift
diff --git a/beesdoo_worker_status/models/cooperative_status.py b/beesdoo_worker_status/models/cooperative_status.py
index b9a696423..968877dd2 100644
--- a/beesdoo_worker_status/models/cooperative_status.py
+++ b/beesdoo_worker_status/models/cooperative_status.py
@@ -351,8 +351,7 @@ def _change_counter(self, data):
# Irregular Cron implementation #
###############################################
- def _get_irregular_worker_domain(self, **kwargs):
- today = kwargs.get("today") or self.today
+ def _get_irregular_worker_domain(self, today):
return [
"&",
"&",
diff --git a/beesdoo_worker_status/models/task.py b/beesdoo_worker_status/models/task.py
index b4a9c5790..07fc8b503 100644
--- a/beesdoo_worker_status/models/task.py
+++ b/beesdoo_worker_status/models/task.py
@@ -1,10 +1,50 @@
-from odoo import fields, models
+from odoo import api, fields, models
from odoo.tools.translate import _
class Task(models.Model):
_inherit = "beesdoo.shift.shift"
+ @api.constrains("worker_id")
+ def _check_worker_id(self):
+ """
+ When worker_id changes we need to check whether is_regular
+ and is_compensation are set correctly.
+ When worker_id is set to a worker that doesn't need field
+ is_regular and is_compensation, these two fields are set to
+ False.
+ """
+ for task in self:
+ if task.working_mode == "regular":
+ self._compensation_validation(task)
+ else:
+ task.write({"is_regular": False, "is_compensation": False})
+ if task.worker_id:
+ if task.worker_id == task.replaced_id:
+ raise UserError(_("A worker cannot replace himself."))
+
+ def _compensation_validation(self, task):
+ """
+ Raise a validation error if the fields is_regular and
+ is_compensation are not properly set.
+ """
+ if task.is_regular == task.is_compensation or not (
+ task.is_regular or task.is_compensation
+ ):
+ raise ValidationError(
+ _(
+ "You must choose between Regular Shift or "
+ "Compensation Shift."
+ )
+ )
+
+ @api.constrains("is_regular", "is_compensation")
+ def _check_compensation(self):
+ for task in self:
+ if task.working_mode == "regular":
+ self._compensation_validation(task)
+
+
#################################
# State Definition #
#################################
diff --git a/macavrac_base/__init__.py b/macavrac_base/__init__.py
index 0650744f6..38718f084 100644
--- a/macavrac_base/__init__.py
+++ b/macavrac_base/__init__.py
@@ -1 +1,2 @@
from . import models
+from . import controllers
\ No newline at end of file
diff --git a/macavrac_base/__manifest__.py b/macavrac_base/__manifest__.py
index 05043e129..b4d2cc628 100644
--- a/macavrac_base/__manifest__.py
+++ b/macavrac_base/__manifest__.py
@@ -7,8 +7,12 @@
"author": "Patricia Daloze, Coop IT Easy SCRLfs",
"category": "Sales",
"version": "12.0.1.0.0",
- "depends": ["beesdoo_shift", "contacts"],
- "data": ["views/res_partner.xml"],
+ "depends": ["beesdoo_shift", "beesdoo_website_shift", "contacts"],
+ "data": [
+ "data/mail_template.xml",
+ "views/res_partner.xml",
+ "views/shift.xml",
+ ],
"installable": True,
"license": "AGPL-3",
}
diff --git a/macavrac_base/controllers/__init__.py b/macavrac_base/controllers/__init__.py
new file mode 100644
index 000000000..deec4a8b8
--- /dev/null
+++ b/macavrac_base/controllers/__init__.py
@@ -0,0 +1 @@
+from . import main
\ No newline at end of file
diff --git a/macavrac_base/controllers/main.py b/macavrac_base/controllers/main.py
new file mode 100644
index 000000000..2d3109440
--- /dev/null
+++ b/macavrac_base/controllers/main.py
@@ -0,0 +1,16 @@
+
+from odoo import http
+from odoo.http import request
+
+from werkzeug.exceptions import Forbidden
+
+class WebsiteMacavracShiftController(http.Controller):
+
+ @http.route("/shift//unsubscribe", auth="user", website=True)
+ def unsubscribe_to_shift(self, shift_id=-1, **kw):
+ shift = request.env["beesdoo.shift.shift"].sudo().browse(shift_id)
+ # Get current user
+ if request.env.user.partner_id != shift.worker_id or not shift.can_unsubscribe:
+ raise Forbidden()
+ shift.worker_id = False
+ return request.redirect(kw["nexturl"])
\ No newline at end of file
diff --git a/macavrac_base/data/mail_template.xml b/macavrac_base/data/mail_template.xml
new file mode 100644
index 000000000..87449656e
--- /dev/null
+++ b/macavrac_base/data/mail_template.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Shift Subscribed
+
+
+
+
+ Shift Unsubscribed
+
+
+
+
diff --git a/macavrac_base/i18n/fr_BE.po b/macavrac_base/i18n/fr_BE.po
new file mode 100644
index 000000000..d2ac380f4
--- /dev/null
+++ b/macavrac_base/i18n/fr_BE.po
@@ -0,0 +1,1746 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * macavrac_base
+# * beesdoo_shift
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-07-19 15:07+0000\n"
+"PO-Revision-Date: 2020-07-19 15:07+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: beesdoo_shift
+#: model:mail.template,body_html:beesdoo_shift.email_template_shift_summary
+msgid "\n"
+"\n"
+"\n"
+"
Hello ${object.worker_id.name},
\n"
+"\n"
+"
You are awaited the ${format_tz(object.start_time,object.worker_id.tz or 'Europe/Brussels','%d.%m.%Y')}\n"
+" for the shift starting at ${format_tz(object.start_time,object.worker_id.tz or 'Europe/Brussels','%H:%M')}.\n"
+"\n"
+" Please contact us at ${object.worker_id.company_id.email} if you have any trouble attending the shift.\n"
+"
\n"
+"
\n"
+"
Sustainably yours,
\n"
+"
${object.worker_id.company_id.name}.
\n"
+"\n"
+" % if object.worker_id.company_id.street:\n"
+" ${object.worker_id.company_id.street}\n"
+" % endif\n"
+" % if object.worker_id.company_id.street2:\n"
+" ${object.worker_id.company_id.street2}
\n"
+" % endif\n"
+" % if object.worker_id.company_id.city or object.worker_id.company_id.zip:\n"
+" ${object.worker_id.company_id.zip} ${object.worker_id.company_id.city}
\n"
+" % endif\n"
+" % if object.worker_id.company_id.country_id:\n"
+" ${object.worker_id.company_id.state_id and ('%s, ' % object.worker_id.company_id.state_id.name) or ''} ${object.worker_id.company_id.country_id.name or ''}
\n"
+" % endif\n"
+" % if object.worker_id.company_id.phone:\n"
+" Phone: ${object.worker_id.company_id.phone}\n"
+" % endif\n"
+"\n"
+" % if object.worker_id.company_id.website:\n"
+"
\n"
+" %endif\n"
+" % if object.worker_id.company_id.logo_url:\n"
+"
\n"
+"
\n"
+"
\n"
+" %endif\n"
+"
\n"
+" "
+msgstr "\n"
+"\n"
+"\n"
+"
Bonjour ${object.worker_id.name},
\n"
+"\n"
+"
Vous êtes attendu·e au magasin le ${format_tz(object.start_time,object.worker_id.tz or 'Europe/Brussels','%d.%m.%Y')} à ${format_tz(object.start_time,object.worker_id.tz or 'Europe/Brussels','%H:%M')}.\n"
+"\n"
+" En cas d'indisponibilité, vous pouvez nous contacter à l'adresse suivante : ${object.worker_id.company_id.email}.\n"
+"
\n"
+"
\n"
+"
Coopérativement vôtre,
\n"
+"
${object.worker_id.company_id.name}.
\n"
+"\n"
+" % if object.worker_id.company_id.street:\n"
+" ${object.worker_id.company_id.street}\n"
+" % endif\n"
+" % if object.worker_id.company_id.street2:\n"
+" ${object.worker_id.company_id.street2}
\n"
+" % endif\n"
+" % if object.worker_id.company_id.city or object.worker_id.company_id.zip:\n"
+" ${object.worker_id.company_id.zip} ${object.worker_id.company_id.city}
\n"
+" % endif\n"
+" % if object.worker_id.company_id.country_id:\n"
+" ${object.worker_id.company_id.state_id and ('%s, ' % object.worker_id.company_id.state_id.name) or ''} ${object.worker_id.company_id.country_id.name or ''}
\n"
+" % endif\n"
+" % if object.worker_id.company_id.phone:\n"
+" Phone: ${object.worker_id.company_id.phone}\n"
+" % endif\n"
+"\n"
+" % if object.worker_id.company_id.website:\n"
+"
\n"
+" %endif\n"
+" % if object.worker_id.company_id.logo_url:\n"
+"
\n"
+"
\n"
+"
\n"
+" %endif\n"
+"
\n"
+" "
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/planning.py:263
+#, python-format
+msgid " is already assigned to "
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/task.py:180
+#, python-format
+msgid "'Now' must be a datetime."
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "4 next days"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_kanban
+msgid " \n"
+" Recurring Workers "
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/task.py:147
+#, python-format
+msgid "A worker cannot replace himself."
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_needaction
+msgid "Action Needed"
+msgstr "Nécessite une action"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_daynumber__active
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__active
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_type__active
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__active
+msgid "Active"
+msgstr "Actif"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_cooperative_status__time_extension
+msgid "Addtional days to the automatic extension, 5 mean that you have a total of 15 extension days of default one is set to 10"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__alert_start_time
+msgid "Alert Start Day"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_generation_view_form
+msgid "Apply for Days"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__unsubscribed
+msgid "Are you sure to remove this cooperator from his subscribed shift ?"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.subscribe_coop_wizard_view_form
+msgid "Are you sure to unsubscribe this cooperator ?"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "Assigned"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.journal_form_view
+msgid "Assigned cooperator"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_attachment_count
+msgid "Attachment Count"
+msgstr "Nombre de pièces jointes"
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__fiscal_certificate_sent_date
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__fiscal_certificate_sent_date
+msgid "Attestation fiscale envoyée le"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_extension__auto
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.super_coop_partner_inherited_view_form
+msgid "Auto Extension"
+msgstr ""
+
+#. module: macavrac_base
+#: selection:res.partner,gender:0
+msgid "Autre"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_calendar
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_calendar
+msgid "Calendar View"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__can_shop
+msgid "Can Shop"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.assign_super_coop_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.extension_coop_wizard_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.holiday_coop_wizard_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.planning_instanciate_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.subscribe_coop_wizard_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_generation_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.temporary_exemption_wizard_view_form
+msgid "Cancel"
+msgstr "Annuler"
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__certificate_sent_date
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__certificate_sent_date
+msgid "Certificat envoyé le"
+msgstr ""
+
+#. module: macavrac_base
+#: selection:res.partner,state_request:0
+msgid "Certificat à envoyer"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history__change
+msgid "Change"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.act_window,name:beesdoo_shift.act_assign_new_super_coop
+msgid "Change Super Coop"
+msgstr "Changer de référent"
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.coop_status_form_view
+msgid "Clear History"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__color
+msgid "Color"
+msgstr "Couleur"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__color
+msgid "Color Index"
+msgstr "Couleur"
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__comment_request
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__comment_request
+msgid "Commentaire"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__is_compensation
+msgid "Compensation shift"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__sc
+msgid "Compensation shifts counter"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.server,name:beesdoo_shift.ir_cron_compute_shift_counter_ir_actions_server
+#: model:ir.cron,cron_name:beesdoo_shift.ir_cron_compute_shift_counter
+#: model:ir.cron,name:beesdoo_shift.ir_cron_compute_shift_counter
+msgid "Compute Shift Counter"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.ui.menu,name:beesdoo_shift.menu_configuration_top
+msgid "Configuration"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.assign_super_coop_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.extension_coop_wizard_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.holiday_coop_wizard_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.planning_instanciate_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.subscribe_coop_wizard_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_generation_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.temporary_exemption_wizard_view_form
+msgid "Confirm"
+msgstr "Confirmer"
+
+#. modules: macavrac_base, beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_res_partner
+#: model:ir.model,name:macavrac_base.model_res_partner
+msgid "Contact"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__coop_number
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__coop_number
+msgid "Coop N°"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:res.groups,name:beesdoo_shift.group_cooperative_admin
+msgid "Cooperative Admin"
+msgstr "Shifts - Administrateur"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__status
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__state
+#: model:ir.ui.menu,name:beesdoo_shift.menu_status
+msgid "Cooperative Status"
+msgstr "Statut du coopérateur"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__cooperative_status_ids
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_users__cooperative_status_ids
+msgid "Cooperative Statuses"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_action_mixin__cooperator_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_extension__cooperator_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_holiday__cooperator_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__cooperator_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_temporary_exemption__cooperator_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__cooperator_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history__cooperator_id
+msgid "Cooperator"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.act_window,name:beesdoo_shift.action_coop_status
+msgid "Cooperator Status"
+msgstr "Statut du coopérateur"
+
+#. module: beesdoo_shift
+#: selection:cooperative.status.history,type:0
+msgid "Counter Change"
+msgstr "Changement du compteur"
+
+#. module: beesdoo_shift
+#: model:ir.actions.act_window,name:beesdoo_shift.action_journal
+msgid "Counter Journal"
+msgstr "Journal des compteurs"
+
+#. module: beesdoo_shift
+#: model:ir.ui.menu,name:beesdoo_shift.menu_journal
+msgid "Counter Update Journal"
+msgstr "Journal de mise à jour des compteurs"
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.coop_status_form_view
+msgid "Counter and Status"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_assign_super_coop__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_planning__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template_line__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_daynumber__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_extension__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_holiday__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_journal__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_planning__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_temporary_exemption__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_type__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_exempt_reason__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__create_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history__create_uid
+msgid "Created by"
+msgstr "Créé par"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_assign_super_coop__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_planning__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template_line__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_daynumber__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_extension__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_holiday__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_journal__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_planning__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_temporary_exemption__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_type__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_exempt_reason__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__create_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history__create_date
+msgid "Created on"
+msgstr "Créé le"
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.subscribe_coop_wizard_view_form
+msgid "Current worker has more than one shift, subscribing him\n"
+" to a new shift will erase all previous shifts."
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_generation_view_form
+msgid "Daily Schedule"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_journal__date
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.coop_status_form_view
+msgid "Date"
+msgstr "Date "
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__birthdate
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__birthdate
+msgid "Date d'anniversaire"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__payment_date
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__payment_date
+msgid "Date de paiement"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,help:macavrac_base.field_res_partner__date_stamp
+#: model:ir.model.fields,help:macavrac_base.field_res_users__date_stamp
+msgid "Date de remplissage du formulaire"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__info_session_date
+msgid "Date of information session"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template__day_ids
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__day_nb_id
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "Day"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.act_window,name:beesdoo_shift.action_day_number
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_daynumber__number
+msgid "Day Number"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_shift_view_kanban
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_kanban
+msgid "Delete"
+msgstr "Supprimer"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_type__description
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.type_view_form
+msgid "Description"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_assign_super_coop__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_planning__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template_line__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_action_mixin__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_daynumber__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_extension__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_holiday__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_journal__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_planning__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_temporary_exemption__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_type__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_exempt_reason__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__display_name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history__display_name
+msgid "Display Name"
+msgstr "Nom affiché"
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_shift_view_kanban
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_kanban
+msgid "Dropdown menu"
+msgstr "Menu déroulant"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__duration
+msgid "Duration"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_beesdoo_shift_template__duration
+msgid "Duration in Hour"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__payment_details
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__payment_details
+msgid "Détail de paiement"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_shift_view_kanban
+msgid "Edit Shift"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_kanban
+msgid "Edit Shift\n"
+" Template"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__email_sent
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__email_sent
+msgid "Email envoyé"
+msgstr ""
+
+#. module: macavrac_base
+#: selection:res.partner,state_request:0
+msgid "En attente de paiement"
+msgstr ""
+
+#. module: macavrac_base
+#: selection:res.partner,state_request:0
+msgid "En ordre"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__end_date
+msgid "End Date"
+msgstr "Date de fin"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template_line__end_time
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__end_time
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__end_time
+msgid "End Time"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_holiday__holiday_end_day
+msgid "End date for the holiday (included)"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.act_window,name:beesdoo_shift.action_exempt_reason
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__exempt_reason_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_temporary_exemption__temporary_exempt_reason_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__exempt_reason_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__exempt_reason_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_users__exempt_reason_id
+#: model:ir.ui.menu,name:beesdoo_shift.menu_exempt_reason
+msgid "Exempt Reason"
+msgstr "Raison d'exemption"
+
+#. module: beesdoo_shift
+#: selection:beesdoo.shift.subscribe,working_mode:0
+#: selection:cooperative.status,working_mode:0
+msgid "Exempted"
+msgstr "Exempté"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_extension__extension_days
+msgid "Extension Days"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__time_extension
+msgid "Extension Days NB"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__extension_start_time
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__extension_start_time
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_users__extension_start_time
+msgid "Extension Start Day"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_cooperative_status__today
+msgid "Field that allow to compute field and store them even if they are based on the current date"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_planning__date_start
+msgid "First Day of planning (should be monday)"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__info_session
+msgid "Followed an information session"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_follower_ids
+msgid "Followers"
+msgstr "Abonnés"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_channel_ids
+msgid "Followers (Channels)"
+msgstr "Abonnés (Canaux)"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_partner_ids
+msgid "Followers (Partners)"
+msgstr "Abonnés (Partenaires)"
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.coop_status_form_view
+msgid "For testing purpose only"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_beesdoo_shift_daynumber__number
+msgid "From 1 to N, When you will instanciate your planning, Day 1 will be the start date of the instance, Day 2 the second, etc..."
+msgstr ""
+
+#. modules: macavrac_base, beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__future_alert_date
+#: model:ir.model.fields,field_description:macavrac_base.field_cooperative_status__future_alert_date
+msgid "Future Alert Date"
+msgstr ""
+
+#. module: macavrac_base
+#: selection:res.partner,gender:0
+msgid "Féminin"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.coop_status_form_view
+msgid "General information"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.server,name:beesdoo_shift.ir_cron_generate_next_planning_ir_actions_server
+#: model:ir.cron,cron_name:beesdoo_shift.ir_cron_generate_next_planning
+#: model:ir.cron,name:beesdoo_shift.ir_cron_generate_next_planning
+msgid "Generate Next Planning"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.act_window,name:beesdoo_shift.action_generate_shift_template_wizard
+msgid "Generate Shift Template"
+msgstr "Générer les templates de shift"
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.type_view_form
+msgid "Generate shift Templates"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.planning_view_form
+msgid "Generate shifts"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/wizard/instanciate_planning.py:26
+#, python-format
+msgid "Generated Shift"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/wizard/batch_template.py:50
+#, python-format
+msgid "Generated Shift Template"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__gender
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__gender
+msgid "Genre"
+msgstr ""
+
+#. module: macavrac_base
+#: model_terms:ir.ui.view,arch_db:macavrac_base.macavrac_coop_partner_inherited_view_form
+msgid "Google Sheet Infos"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "Group By"
+msgstr "Regrouper par"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__history_ids
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.coop_status_form_view
+msgid "History"
+msgstr "Historique"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__holiday_end_time
+msgid "Holidays End Day"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__holiday_start_time
+msgid "Holidays Start Day"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__iban
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__iban
+msgid "IBAN"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_assign_super_coop__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_planning__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template_line__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_action_mixin__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_daynumber__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_extension__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_holiday__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_journal__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_planning__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_temporary_exemption__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_type__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_exempt_reason__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history__id
+msgid "ID"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_beesdoo_shift_shift__message_unread
+msgid "If checked new messages require your attention."
+msgstr "Si coché, de nouveaux messages demandent votre attention."
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_beesdoo_shift_shift__message_needaction
+msgid "If checked, new messages require your attention."
+msgstr "Si coché, de nouveaux messages demandent votre attention."
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_beesdoo_shift_shift__message_has_error
+msgid "If checked, some messages have a delivery error."
+msgstr "Si actif, certains messages ont une erreur de livraison."
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__info_session
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__info_session
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_users__info_session
+msgid "Information Session ?"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__info_session_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__info_session_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_users__info_session_date
+msgid "Information Session Date"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.act_window,name:beesdoo_shift.action_generate_shift_wizard
+msgid "Instanciate Planning Action"
+msgstr "Instancier 'Planning Action'"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__irregular_absence_counter
+msgid "Irregular Absence Counter"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__irregular_absence_date
+msgid "Irregular Absence Date"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__irregular_start_date
+msgid "Irregular Start Date"
+msgstr ""
+
+#. module: beesdoo_shift
+#: selection:beesdoo.shift.subscribe,working_mode:0
+#: selection:cooperative.status,working_mode:0
+msgid "Irregular worker"
+msgstr "Volant"
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/cooperative_status.py:178
+#, python-format
+msgid "Irregular workers must have an irregular start date."
+msgstr "Les travailleurs volants doivent avoir une date de début."
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_is_follower
+msgid "Is Follower"
+msgstr "Est un abonné"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__can_shop
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_users__can_shop
+msgid "Is worker allowed to shop?"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "J-1"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "J-2"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "J-3"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "J-4"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "J-5"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_assign_super_coop____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_planning____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template_line____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_action_mixin____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_daynumber____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_extension____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_holiday____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_journal____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_planning____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_temporary_exemption____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_type____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_exempt_reason____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status____last_update
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history____last_update
+msgid "Last Modified on"
+msgstr "Dernière modification le"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_assign_super_coop__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_planning__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template_line__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_daynumber__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_extension__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_holiday__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_journal__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_planning__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_temporary_exemption__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_type__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_exempt_reason__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__write_uid
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history__write_uid
+msgid "Last Updated by"
+msgstr "Dernière mise à jour par"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_assign_super_coop__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_planning__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template_line__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_daynumber__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_extension__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_holiday__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_journal__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_planning__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_temporary_exemption__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_type__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_exempt_reason__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__write_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history__write_date
+msgid "Last Updated on"
+msgstr "Dernière mise à jour le"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template__line_ids
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_journal__line_ids
+msgid "Line"
+msgstr "Ligne"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_main_attachment_id
+msgid "Main Attachment"
+msgstr "Pièce jointe principale"
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/res_partner.py:99
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.super_coop_partner_inherited_view_form
+#, python-format
+msgid "Manual Extension"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_cooperative_status__unsubscribed
+msgid "Manually unsubscribed"
+msgstr ""
+
+#. module: macavrac_base
+#: selection:res.partner,gender:0
+msgid "Masculin"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_beesdoo_shift_template__worker_nb
+msgid "Max number of worker for this task"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_has_error
+msgid "Message Delivery error"
+msgstr "Erreur d'envoi du message"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_ids
+msgid "Messages"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__share_amount
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__share_amount
+msgid "Montant"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "My Shift"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_search
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "My Team Shift"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_daynumber__name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_planning__name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_type__name
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_exempt_reason__name
+msgid "Name"
+msgstr "Nom"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_assign_super_coop__super_coop_id
+msgid "New Super Cooperative"
+msgstr "Nouveau Référent"
+
+#. modules: macavrac_base, beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__next_countdown_date
+#: model:ir.model.fields,field_description:macavrac_base.field_cooperative_status__next_countdown_date
+msgid "Next Countdown Date"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__share_qty
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__share_qty
+msgid "Nombre de part"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_needaction_counter
+msgid "Number of Actions"
+msgstr "Nombre d'actions"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_has_error_counter
+msgid "Number of error"
+msgstr "Nombre d'erreurs"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_beesdoo_shift_shift__message_needaction_counter
+msgid "Number of messages which requires an action"
+msgstr "Nombre de messages exigeant une action"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_beesdoo_shift_shift__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr "Nombre de messages avec des erreurs d'envoi"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__nb_shifts
+msgid "Number of shifts"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_beesdoo_shift_shift__message_unread_counter
+msgid "Number of unread messages"
+msgstr "Nombre de messages non lus"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__worker_nb
+msgid "Number of worker"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__share_numbers
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__share_numbers
+msgid "Numéro de parts"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__national_register_number
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__national_register_number
+msgid "Numéro de registre national"
+msgstr ""
+
+#. module: macavrac_base
+#: selection:res.partner,cooperator_type:0
+msgid "Part A"
+msgstr ""
+
+#. module: macavrac_base
+#: selection:res.partner,cooperator_type:0
+msgid "Part B"
+msgstr ""
+
+#. module: macavrac_base
+#: selection:res.partner,cooperator_type:0
+msgid "Part C"
+msgstr ""
+
+#. module: macavrac_base
+#: selection:res.partner,cooperator_type:0
+msgid "Part D"
+msgstr ""
+
+#. module: macavrac_base
+#: selection:res.partner,state_request:0
+msgid "Parts revendues"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_search
+msgid "Place Available"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_planning__planning_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template__planning_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__planning_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__planning_id
+#: model:ir.ui.menu,name:beesdoo_shift.menu_task_top
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_search
+msgid "Planning"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.act_window,name:beesdoo_shift.action_planning
+#: model:ir.actions.act_window,name:beesdoo_shift.action_shift_template
+msgid "Planning Action"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:res.groups,name:beesdoo_shift.group_planning_management
+msgid "Planning Management"
+msgstr "Shifts - Planning"
+
+#. module: beesdoo_shift
+#: model:ir.ui.menu,name:beesdoo_shift.menu_planning
+msgid "Planning Week"
+msgstr "Planning (par semaine)"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__worker_ids
+msgid "Recurrent worker assigned"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_form
+msgid "Recurring Workers"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/res_partner.py:117
+#, python-format
+msgid "Register Holiday"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.super_coop_partner_inherited_view_form
+msgid "Register Holidays"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_shift_view_kanban
+msgid "Regular Shift"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__is_regular
+msgid "Regular shift"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__sr
+msgid "Regular shifts counter"
+msgstr ""
+
+#. module: beesdoo_shift
+#: selection:beesdoo.shift.subscribe,working_mode:0
+#: selection:cooperative.status,working_mode:0
+msgid "Regular worker"
+msgstr "Travailleur régulier"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__remaining_worker
+msgid "Remaining Place"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__replaced_id
+msgid "Replaced"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_shift_view_kanban
+msgid "Replacement worker:"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__reset_compensation_counter
+msgid "Reset Compensation Counter"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__reset_counter
+msgid "Reset Counter"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__resigning
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__resigning
+msgid "Resigning"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__revert_info
+msgid "Revert Info"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.journal_form_view
+msgid "Run again for this day"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.server,name:beesdoo_shift.ir_cron_send_weekly_emails_ir_actions_server
+#: model:ir.cron,cron_name:beesdoo_shift.ir_cron_send_weekly_emails
+#: model:ir.cron,name:beesdoo_shift.ir_cron_send_weekly_emails
+msgid "Send weekly shift summary"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_planning__sequence
+msgid "Sequence"
+msgstr "Séquence"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_assign_super_coop__shift_ids
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__shift_id
+msgid "Shift"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.ui.menu,name:beesdoo_shift.menu_configuration_day
+msgid "Shift Day"
+msgstr "Configuration des jours"
+
+#. module: beesdoo_shift
+#: model:ir.ui.menu,name:beesdoo_shift.menu_root
+msgid "Shift Management"
+msgstr "Gestion des shifts"
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "Shift Template"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.act_window,name:beesdoo_shift.action_type
+#: model:ir.ui.menu,name:beesdoo_shift.menu_configuration_type
+msgid "Shift Type"
+msgstr "Type de shift"
+
+#. module: beesdoo_shift
+#: model:res.groups,name:beesdoo_shift.group_shift_attendance
+msgid "Shift and Worker Read Access"
+msgstr "Shifts - Présences"
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/task.py:119
+#, python-format
+msgid "Shift state of a future shift can't be set to 'present' or 'absent'."
+msgstr "Vous ne pouvez inscrire un shift futur comme 'present' ou 'absent'."
+
+#. module: beesdoo_shift
+#: model:ir.actions.act_window,name:beesdoo_shift.action_task
+#: model:ir.ui.menu,name:beesdoo_shift.menu_task
+msgid "Shifts"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.planning_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.planning_view_tree
+msgid "Shifts Template"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:res.groups,name:beesdoo_shift.group_shift_management
+msgid "Shifts and Attendance Sheets Management"
+msgstr "Shifts et feuilles de présence - Gestion"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__irregular_start_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__start_date
+msgid "Start Date"
+msgstr "Date de début"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template_line__start_time
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__start_time
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__start_time
+msgid "Start Time"
+msgstr ""
+
+#. module: macavrac_base
+#: model_terms:ir.ui.view,arch_db:macavrac_base.coop_status_form_view_inherit
+msgid "Start date"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_extension__extension_start_date
+msgid "Start date for the extension"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_holiday__holiday_start_day
+msgid "Start date for the holiday"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__state
+msgid "State"
+msgstr "État"
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__state_request
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__state_request
+msgid "State Request"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history__status_id
+#: model:ir.ui.menu,name:beesdoo_shift.menu_status_top
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "Status"
+msgstr "Statut"
+
+#. module: beesdoo_shift
+#: selection:cooperative.status.history,type:0
+msgid "Status Change"
+msgstr "Changement de statut "
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_shift_view_kanban
+msgid "Status:"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/res_partner.py:82
+#, python-format
+msgid "Subscribe Cooperator"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.super_coop_partner_inherited_view_form
+msgid "Subscribe to shift"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__subscribed_shift_ids
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_users__subscribed_shift_ids
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.super_coop_partner_inherited_view_form
+msgid "Subscribed Shift"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_shift_view_kanban
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_kanban
+msgid "Super Coop:"
+msgstr "Référent"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__super_coop_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__super_coop_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__super
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__super
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_users__super
+msgid "Super Cooperative"
+msgstr "Référent"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__super
+msgid "Super Cooperator"
+msgstr "Référent"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_planning__task_template_ids
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__task_template_id
+msgid "Task Template"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__task_type_id
+msgid "Task Type"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.ui.menu,name:beesdoo_shift.menu_template_top
+msgid "Templates"
+msgstr "Modèles"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_temporary_exemption__temporary_exempt_end_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__temporary_exempt_end_date
+msgid "Temporary Exempt End Date"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__temporary_exempt_reason_id
+msgid "Temporary Exempt Reason"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_temporary_exemption__temporary_exempt_start_date
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__temporary_exempt_start_date
+msgid "Temporary Exempt Start Date"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/res_partner.py:128
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.coop_status_form_view
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.super_coop_partner_inherited_view_form
+#, python-format
+msgid "Temporary Exemption"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/wizard/subscribe.py:167
+#, python-format
+msgid "There is no remaining space for this shift"
+msgstr "Il n'y a plus de places libres pour ce shift"
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__date_stamp
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__date_stamp
+msgid "Timestamp"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.coop_status_form_view
+msgid "Timing information"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__today
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "Today"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/res_partner.py:111
+#, python-format
+msgid "Trigger Grace Delay"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template__type_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__task_type_id
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history__type
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "Type"
+msgstr ""
+
+#. module: macavrac_base
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__cooperator_type
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__cooperator_type
+msgid "Type de Part"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_shift_view_kanban
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_kanban
+msgid "Type:"
+msgstr "Type :"
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_view_search
+msgid "Unassigned"
+msgstr "Non assigné"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_unread
+msgid "Unread Messages"
+msgstr "Messages non lus"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__message_unread_counter
+msgid "Unread Messages Counter"
+msgstr "Compteur de messages non lus"
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.super_coop_partner_inherited_view_form
+msgid "Unsubscribe"
+msgstr "Se désabonner"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__unsubscribed
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.actions.server,name:beesdoo_shift.ir_cron_update_today_ir_actions_server
+#: model:ir.cron,cron_name:beesdoo_shift.ir_cron_update_today
+#: model:ir.cron,name:beesdoo_shift.ir_cron_update_today
+msgid "Update Cooperatoor status base on the date"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status_history__user_id
+msgid "User"
+msgstr "Utilisateur"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,help:beesdoo_shift.field_beesdoo_shift_subscribe__resigning
+#: model:ir.model.fields,help:beesdoo_shift.field_cooperative_status__resigning
+msgid "Want to leave the beescoop"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/planning.py:270
+#, python-format
+msgid "Warning"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_search
+msgid "Week Day"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template_line__wizard_id
+msgid "Wizard"
+msgstr "Assistant"
+
+#. module: beesdoo_shift
+#: model:ir.actions.act_window,name:beesdoo_shift.action_worker
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__worker_id
+#: model:ir.ui.menu,name:beesdoo_shift.menu_worker
+#: model:ir.ui.menu,name:beesdoo_shift.menu_worker_top
+msgid "Worker"
+msgstr "Travailleur"
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_template__worker_name
+msgid "Worker Name"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesddoo_shift_generate_shift_template_line__worker_nb
+msgid "Worker Nb"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_kanban
+msgid "Worker Number:"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__worker_store
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_users__worker_store
+msgid "Worker Store"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.super_coop_partner_inherited_view_form
+msgid "Worker information"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_shift_view_kanban
+msgid "Worker:"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_subscribe__working_mode
+msgid "Working Mode"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_beesdoo_shift_shift__working_mode
+#: model:ir.model.fields,field_description:beesdoo_shift.field_cooperative_status__working_mode
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__working_mode
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_users__working_mode
+msgid "Working mode"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/task.py:300
+#, python-format
+msgid "Working mode is not properly defined. Please check if the worker is subscribed "
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/cooperative_status.py:395
+#: sql_constraint:beesdoo.shift.journal:0
+#, python-format
+msgid "You can only create one journal per day"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/cooperative_status.py:170
+#: sql_constraint:cooperative.status:0
+#, python-format
+msgid "You can only set one cooperator status per cooperator"
+msgstr "Vous ne pouvez assigner qu'un statut de coopérateur par coopérateur"
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/planning.py:182
+#, python-format
+msgid "You cannot assign more workers than the maximal number defined on template. "
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/task.py:283
+#, python-format
+msgid "You cannot change to the status %s if no worker is defined for the shift "
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/wizard/holiday.py:26
+#, python-format
+msgid "You cannot encode new holidays since the previous holidays encoded are not over yet "
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/wizard/temporary_exemption.py:29
+#, python-format
+msgid "You cannot encode new temporary exemption since the previous one are not over yet "
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/wizard/subscribe.py:29
+#, python-format
+msgid "You cannot perform this operation on yourself"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/cooperative_status.py:404
+#, python-format
+msgid "You don't have the access to perform this action"
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/wizard/subscribe.py:21
+#, python-format
+msgid "You don't have the required access for this operation."
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/models/task.py:108
+#, python-format
+msgid "You must choose between Regular Shift or Compensation Shift."
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/wizard/extension.py:48
+#, python-format
+msgid "You should not make a manual extension when the grace delay has not been triggered yet "
+msgstr ""
+
+#. module: beesdoo_shift
+#: code:addons/beesdoo_shift/wizard/extension.py:58
+#, python-format
+msgid "You should not start a manual extension during the grace delay "
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:mail.template,subject:beesdoo_shift.email_template_shift_summary
+msgid "Your next shift (${format_tz(object.start_time,object.worker_id.tz or 'Europe/Brussels','%d.%m.%Y - %H:%M')})"
+msgstr "Votre prochain shift (${format_tz(object.start_time,object.worker_id.tz or 'Europe/Brussels','%d.%m.%Y - %H:%M')})"
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesddoo_shift_assign_super_coop
+msgid "beesddoo.shift.assign_super_coop"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesddoo_shift_generate_planning
+msgid "beesddoo.shift.generate_planning"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesddoo_shift_generate_shift_template
+msgid "beesddoo.shift.generate_shift_template"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesddoo_shift_generate_shift_template_line
+msgid "beesddoo.shift.generate_shift_template.line"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_action_mixin
+msgid "beesdoo.shift.action_mixin"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_daynumber
+msgid "beesdoo.shift.daynumber"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_extension
+msgid "beesdoo.shift.extension"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_holiday
+msgid "beesdoo.shift.holiday"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_journal
+msgid "beesdoo.shift.journal"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_planning
+msgid "beesdoo.shift.planning"
+msgstr ""
+
+#. modules: macavrac_base, beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_shift
+#: model:ir.model,name:macavrac_base.model_beesdoo_shift_shift
+msgid "beesdoo.shift.shift"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_stage
+msgid "beesdoo.shift.stage"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_subscribe
+msgid "beesdoo.shift.subscribe"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_template
+msgid "beesdoo.shift.template"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_temporary_exemption
+msgid "beesdoo.shift.temporary_exemption"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_beesdoo_shift_type
+msgid "beesdoo.shift.type"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_cooperative_exempt_reason
+msgid "cooperative.exempt.reason"
+msgstr ""
+
+#. modules: macavrac_base, beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_cooperative_status
+#: model:ir.model,name:macavrac_base.model_cooperative_status
+msgid "cooperative.status"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model:ir.model,name:beesdoo_shift.model_cooperative_status_history
+msgid "cooperative.status.history"
+msgstr ""
+
+#. modules: macavrac_base, beesdoo_shift
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_partner__is_worker
+#: model:ir.model.fields,field_description:beesdoo_shift.field_res_users__is_worker
+#: model:ir.model.fields,field_description:macavrac_base.field_res_partner__is_worker
+#: model:ir.model.fields,field_description:macavrac_base.field_res_users__is_worker
+msgid "is Worker"
+msgstr ""
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.planning_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_view_form
+msgid "name"
+msgstr "nom"
+
+#. module: beesdoo_shift
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.assign_super_coop_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.extension_coop_wizard_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.planning_instanciate_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.subscribe_coop_wizard_view_form
+#: model_terms:ir.ui.view,arch_db:beesdoo_shift.task_template_generation_view_form
+msgid "or"
+msgstr "ou"
+
diff --git a/macavrac_base/models/__init__.py b/macavrac_base/models/__init__.py
index 91fed54d4..8d6b8ab43 100644
--- a/macavrac_base/models/__init__.py
+++ b/macavrac_base/models/__init__.py
@@ -1 +1,2 @@
from . import res_partner
+from . import planning
\ No newline at end of file
diff --git a/macavrac_base/models/planning.py b/macavrac_base/models/planning.py
new file mode 100644
index 000000000..7559a45ac
--- /dev/null
+++ b/macavrac_base/models/planning.py
@@ -0,0 +1,286 @@
+from datetime import datetime
+
+from odoo import api, models, fields
+from odoo.addons.beesdoo_shift.models.cooperative_status import add_days_delta
+
+class TaskType(models.Model):
+ _inherit = "beesdoo.shift.type"
+
+ super_only = fields.Boolean('Referent Only')
+
+class TaskTemplate(models.Model):
+ _inherit = 'beesdoo.shift.template'
+
+ super_only = fields.Boolean(related="task_type_id.super_only")
+ shift_presence_value = fields.Float(default=1.0)
+
+class WizardSubscribe(models.TransientModel):
+ _inherit = 'beesdoo.shift.subscribe'
+
+ def _get_mode(self):
+ partner = self.env["res.partner"].browse(self._context.get("active_id"))
+ return partner.working_mode or 'irregular'
+
+ working_mode = fields.Selection(selection=[
+ ("irregular", "worker"),
+ ("exempt", "Exempted"),
+ ], default=_get_mode)
+
+class Task(models.Model):
+ _inherit = 'beesdoo.shift.shift'
+
+ can_unsubscribe = fields.Boolean(compute="_compute_can_unsubscribe")
+ super_only = fields.Boolean(related="task_type_id.super_only")
+
+ def _get_selection_status(self):
+ return [
+ ("open","Confirmed"),
+ ("done","Attended"),
+ ("absent","Absent"),
+ ("cancel","Cancelled")
+ ]
+
+ def _get_counter_date_state_change(self, new_state):
+ """
+ Return the cooperator_status of the cooperator that need to be
+ change and data that need to be change. It does not perform the
+ change directly. The cooperator_status will be changed by the
+ _change_counter function.
+
+ Check has been done to ensure that worker is legitimate.
+ """
+ data = {}
+ status = self.worker_id.cooperative_status_ids[0]
+ if new_state == "done":
+ data['sr'] = self.task_template_id.shift_presence_value or 1.0
+
+ return data, status
+
+ def _compute_can_unsubscribe(self):
+ now = datetime.now()
+ ICP = self.env["ir.config_parameter"].sudo()
+ max_hours = int(ICP.get_param("max_hours_to_unsubscribe", 2))
+ for rec in self:
+ if now > rec.start_time or rec.state != 'open':
+ rec.can_unsubscribe = False
+ else:
+ delta = (rec.start_time - now)
+ delta = delta.seconds / 3600.0 + delta.days * 24
+ rec.can_unsubscribe = delta >= max_hours
+
+
+ # def write(self, vals):
+ # if 'worker_id' in vals:
+ # template_unsubscribed = self.env.ref("macavrac_base.email_template_shift_unsubscribed")
+ # template_subscribed = self.env.ref("macavrac_base.email_template_shift_subscribed")
+ # new_worker_id = self.env['beesdoo.shift.shift'].browse(vals.get('worker_id'))
+ # for record in self:
+ # old_worker_id = record.worker_id
+ # if old_worker_id:
+ # template_unsubscribed.send_mail(record.id)
+ # if new_worker_id and old_worker_id != new_worker_id:
+ # res = super(Task, record).write(vals)
+ # template_subscribed.send_mail(record.id)
+ # return super(Task, self).write(vals)
+
+
+class CooperativeStatus(models.Model):
+ _inherit = 'cooperative.status'
+
+ def _get_status(self):
+ return [
+ ("ok", "Up to Date"),
+ ("alert", "Alerte"),
+ ("suspended", "Suspended"),
+ ("exempted", "Exempted"),
+ ("unsubscribed", "Unsubscribed"),
+ ("resigning", "Resigning"),
+ ]
+ # TODO auto init for automatic migration
+ sr = fields.Float()
+ future_alert_date = fields.Date(compute="_compute_future_alert_date")
+ next_countdown_date = fields.Date(compute="_compute_next_countdown_date")
+
+ ########################################################
+ # Method to override #
+ # To define the behavior of the status #
+ # #
+ # By default: everyone is always up to date #
+ ########################################################
+
+ ##############################
+ # Computed field section #
+ ##############################
+ def _next_countdown_date(self, irregular_start_date, today):
+ """
+ Return the next countdown date given irregular_start_date and
+ today dates.
+ This does not take holiday and other status into account.
+ """
+
+ delta = (today - irregular_start_date).days
+ if not delta % self._period:
+ return today
+ return add_days_delta(today, self._period - (delta % self._period))
+
+
+ @api.depends(
+ "today",
+ "sr",
+ "temporary_exempt_start_date",
+ "temporary_exempt_end_date",
+ )
+ def _compute_future_alert_date(self):
+ """Compute date before which the worker is up to date"""
+ for rec in self:
+ #TODO fix infinite loop
+ rec.future_alert_date = False
+ continue
+ # Only for irregular worker
+ # Alert start time already set
+ real_today = rec.today
+ if rec.alert_start_time:
+ rec.future_alert_date = False
+ elif rec.working_mode != "irregular" or not rec.irregular_start_date:
+ rec.future_alert_date = False
+ else:
+ date = rec.today
+ counter = rec.sr
+ next_countdown_date = False
+ while counter >= 0:
+ next_countdown_date = self._next_countdown_date(rec.irregular_start_date, date)
+ rec.today = next_countdown_date
+ if rec.status != 'exempted':
+ counter -= 1
+ rec.today = real_today
+ date = add_days_delta(next_countdown_date, 1)
+ rec.future_alert_date = next_countdown_date
+ rec.today = real_today
+
+
+ @api.depends(
+ "today",
+ "irregular_start_date",
+ "holiday_start_time",
+ "holiday_end_time",
+ "temporary_exempt_start_date",
+ "temporary_exempt_end_date",
+ )
+ def _compute_next_countdown_date(self):
+ """
+ Compute the following countdown date. This date is the date when
+ the worker will see his counter changed du to the cron. This
+ date is like the birthday date of the worker that occurred each
+ PERIOD.
+ """
+ for rec in self:
+ #TODO fix infinite loop
+ rec.next_countdown_date = False
+ continue
+ real_today = rec.today
+ # Only for irregular worker
+ if rec.working_mode != "irregular" or not rec.irregular_start_date:
+ rec.next_countdown_date = False
+ else:
+ next_countdown_date = rec.today
+ while True:
+ next_countdown_date = self._next_countdown_date(rec.irregular_start_date, next_countdown_date)
+ rec.today = next_countdown_date
+ if rec.status != 'exempted':
+ rec.next_countdown_date = next_countdown_date
+ rec.today = real_today
+ break
+ else:
+ next_countdown_date = add_days_delta(next_countdown_date, 1)
+
+ #####################################
+ # Status Change implementation #
+ #####################################
+
+ def _get_regular_status(self):
+ """
+ Return the value of the status
+ for the regular worker
+ """
+ ICP = self.env["ir.config_parameter"].sudo()
+ suspended_count = int(ICP.get_param("suspended_count", -2))
+ unsubscribed_count = int(ICP.get_param("unsubscribed_count", -4))
+ if (self.temporary_exempt_start_date
+ and self.temporary_exempt_end_date
+ and self.today >= self.temporary_exempt_start_date
+ and self.today <= self.temporary_exempt_end_date
+ ):
+ return 'exempted'
+ if self.sr >= 0:
+ return 'ok'
+
+ if self.sr <= unsubscribed_count:
+ return 'unsubscribed'
+ if self.sr <= suspended_count:
+ return 'suspended'
+ if self.sr < 0:
+ return 'alert'
+ return 'ok'
+
+ def _get_irregular_status(self):
+ """
+ Return the value of the status
+ for the irregular worker
+ """
+ return self._get_regular_status()
+
+ def _state_change(self, new_state):
+ """
+ Hook to watch change in the state
+ """
+ self.ensure_one()
+ if new_state == "unsubscribed" or new_state == "resigning":
+ # Remove worker from task_templates
+ self.cooperator_id.sudo().write(
+ {"subscribed_shift_ids": [(5, 0, 0)]}
+ )
+ # Remove worker from supercoop in task_templates
+ task_tpls = self.env["beesdoo.shift.template"].search(
+ [("super_coop_id", "in", self.cooperator_id.user_ids.ids)]
+ )
+ task_tpls.write({"super_coop_id": False})
+ # Remove worker for future tasks (remove also supercoop)
+ self.env["beesdoo.shift.shift"].sudo().unsubscribe_from_today(
+ [self.cooperator_id.id], now=fields.Datetime.now()
+ )
+ if new_state == "alert":
+ self.write({"alert_start_time": self.today})
+
+ def _change_counter(self, data):
+ """
+ Call when a shift state is changed
+ use data generated by _get_counter_date_state_change
+ """
+ self.sr += data.get("sr", 0)
+
+
+ ###############################################
+ ###### Irregular Cron implementation ##########
+ ###############################################
+
+ def _get_irregular_worker_domain(self, today):
+ """
+ return the domain the give the list
+ of valid irregular worker that should
+ get their counter changed by the cron
+ """
+ return [
+ ("status", "not in", ["unsubscribed", "exempted", "resigning"]),
+ ("irregular_start_date", "!=", False),
+ ("working_mode", "!=", "exempt"),
+ ]
+
+ def _change_irregular_counter(self):
+ """
+ Define how the counter will change
+ for the irregular worker
+ where today - start_date is a multiple of the period
+ by default 28 days
+ """
+ self.sr -= 1
+
diff --git a/macavrac_base/models/res_partner.py b/macavrac_base/models/res_partner.py
index 202150c82..b39244589 100644
--- a/macavrac_base/models/res_partner.py
+++ b/macavrac_base/models/res_partner.py
@@ -59,6 +59,12 @@ class Partner(models.Model):
readonly=True,
related="",
)
+ need_referent = fields.Boolean(
+ compute="_compute_need_referent",
+ search="_search_need_referent",
+ string="Need Referent",
+ readonly=True,
+ )
@api.depends("share_qty")
def _compute_share_amount(self):
@@ -70,10 +76,21 @@ def _compute_share_amount(self):
@api.depends("cooperator_type")
def _compute_is_worker(self):
for rec in self:
- rec.is_worker = rec.cooperator_type == "share_b"
+ rec.is_worker = rec.cooperator_type in ('share_a', 'share_b')
def _search_is_worker(self, operator, value):
- if (operator == "=" and value) or (operator == "!=" and not value):
- return [("cooperator_type", "=", "share_b")]
+ if (operator == '=' and value) or (operator == '!=' and not value):
+ return [('cooperator_type', 'in', ('share_a', 'share_b'))]
+ else:
+ return ['&', ('cooperator_type', '!=', 'share_a'), ('cooperator_type', '!=', 'share_b')]
+
+ @api.depends("super")
+ def _compute_need_referent(self):
+ for rec in self:
+ rec.need_referent = rec.super
+
+ def _search_need_referent(self, operator, value):
+ if (operator == '=' and value) or (operator == '!=' and not value):
+ return [('super', '=', True)]
else:
- return [("cooperator_type", "!=", "share_b")]
+ return []
diff --git a/macavrac_base/views/shift.xml b/macavrac_base/views/shift.xml
new file mode 100644
index 000000000..c33c21f91
--- /dev/null
+++ b/macavrac_base/views/shift.xml
@@ -0,0 +1,191 @@
+
+
+ Shift Type Form Inherit
+ beesdoo.shift.type
+
+
+
+
+
+
+
+
+
+ Task Template Form Inherit
+ beesdoo.shift.template
+
+
+
+ 1
+
+
+
+
+
+
+ [("is_worker", "=", True), ('need_referent', '=', super_only)]
+
+
+
+
+
+ Task Form inherit
+
+ beesdoo.shift.shift
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+ [('cooperative_status_ids.status', 'not in', ('unsubscribed', 'resigning')), ('need_referent', '=', super_only)]
+
+
+
+
+
+ Coop Status Form View Inherit
+
+ cooperative.status
+
+
+
+ Start date
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+ Partner Macavrac
+ res.partner
+
+ 50
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+ Subscribe Cooperator
+ beesdoo.shift.subscribe
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+
+ Unsubscribe
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/polln_base/__init__.py b/polln_base/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/polln_base/__manifest__.py b/polln_base/__manifest__.py
new file mode 100644
index 000000000..1239d5a58
--- /dev/null
+++ b/polln_base/__manifest__.py
@@ -0,0 +1,19 @@
+# Copyright 2021 Polln
+# - Patricia Daloze
+# - Thibault François
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+{
+ "name": "Polln Base Module",
+ "summary": """
+ Module that customize the base module and contains some python tools
+ """,
+ "website": "https://github.com/beescoop/Obeesdoo",
+ "category": "Sales",
+ "version": "12.0.1.0.1",
+ "depends": ["beesdoo_base"],
+ "data": [
+ "report/pollncard.xml",
+ ],
+ "installable": True,
+ "license": "AGPL-3",
+}
diff --git a/polln_base/report/pollncard.xml b/polln_base/report/pollncard.xml
new file mode 100644
index 000000000..4dd14a422
--- /dev/null
+++ b/polln_base/report/pollncard.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ :
+
+
+
+
+
+
+
+
+
+
diff --git a/polln_base/static/font/Roboto-Bold.ttf b/polln_base/static/font/Roboto-Bold.ttf
new file mode 100644
index 000000000..91ec21227
Binary files /dev/null and b/polln_base/static/font/Roboto-Bold.ttf differ
diff --git a/polln_base/static/font/Roboto-Regular.ttf b/polln_base/static/font/Roboto-Regular.ttf
new file mode 100644
index 000000000..7d9a6c4c3
Binary files /dev/null and b/polln_base/static/font/Roboto-Regular.ttf differ
diff --git a/polln_base/static/src/img/logo-polln.png b/polln_base/static/src/img/logo-polln.png
new file mode 100644
index 000000000..228f1788e
Binary files /dev/null and b/polln_base/static/src/img/logo-polln.png differ
diff --git a/polln_shift/README.rst b/polln_shift/README.rst
new file mode 100644
index 000000000..431469665
--- /dev/null
+++ b/polln_shift/README.rst
@@ -0,0 +1,53 @@
+====================
+Polln Shift Module
+====================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-beescoop%2Fobeesdoo-lightgray.png?logo=github
+ :target: https://github.com/beescoop/obeesdoo/tree/12.0/polln_shift
+ :alt: beescoop/obeesdoo
+
+|badge1| |badge2| |badge3|
+
+Module with basic customizations for the Macavrac cooperative.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Patricia Daloze
+* Thibault Francois
+
+Maintainers
+~~~~~~~~~~~
+
+This module is part of the `beescoop/obeesdoo `_ project on GitHub.
+
+You are welcome to contribute.
diff --git a/polln_shift/__init__.py b/polln_shift/__init__.py
new file mode 100644
index 000000000..38718f084
--- /dev/null
+++ b/polln_shift/__init__.py
@@ -0,0 +1,2 @@
+from . import models
+from . import controllers
\ No newline at end of file
diff --git a/polln_shift/__manifest__.py b/polln_shift/__manifest__.py
new file mode 100644
index 000000000..9fb0dee5f
--- /dev/null
+++ b/polln_shift/__manifest__.py
@@ -0,0 +1,18 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+{
+ "name": "Polln Shift Module",
+ "summary": """
+ Module with basic customizations for the Polln cooperative.
+ """,
+ "author": "Patricia Daloze, Thibault Francois",
+ "category": "Sales",
+ "version": "12.0.1.0.0",
+ "depends": ["beesdoo_shift", "beesdoo_website_shift", "contacts", "beesdoo_easy_my_coop"],
+ "data": [
+ # "data/mail_template.xml",
+ "views/res_partner.xml",
+ "views/shift.xml",
+ ],
+ "installable": True,
+ "license": "AGPL-3",
+}
diff --git a/polln_shift/controllers/__init__.py b/polln_shift/controllers/__init__.py
new file mode 100644
index 000000000..deec4a8b8
--- /dev/null
+++ b/polln_shift/controllers/__init__.py
@@ -0,0 +1 @@
+from . import main
\ No newline at end of file
diff --git a/polln_shift/controllers/main.py b/polln_shift/controllers/main.py
new file mode 100644
index 000000000..2d3109440
--- /dev/null
+++ b/polln_shift/controllers/main.py
@@ -0,0 +1,16 @@
+
+from odoo import http
+from odoo.http import request
+
+from werkzeug.exceptions import Forbidden
+
+class WebsiteMacavracShiftController(http.Controller):
+
+ @http.route("/shift//unsubscribe", auth="user", website=True)
+ def unsubscribe_to_shift(self, shift_id=-1, **kw):
+ shift = request.env["beesdoo.shift.shift"].sudo().browse(shift_id)
+ # Get current user
+ if request.env.user.partner_id != shift.worker_id or not shift.can_unsubscribe:
+ raise Forbidden()
+ shift.worker_id = False
+ return request.redirect(kw["nexturl"])
\ No newline at end of file
diff --git a/polln_shift/data/mail_template.xml b/polln_shift/data/mail_template.xml
new file mode 100644
index 000000000..acd15f6d7
--- /dev/null
+++ b/polln_shift/data/mail_template.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Shift Subscribed
+
+
+
+
+ Shift Unsubscribed
+
+
+
+
diff --git a/polln_shift/models/__init__.py b/polln_shift/models/__init__.py
new file mode 100644
index 000000000..8d6b8ab43
--- /dev/null
+++ b/polln_shift/models/__init__.py
@@ -0,0 +1,2 @@
+from . import res_partner
+from . import planning
\ No newline at end of file
diff --git a/polln_shift/models/planning.py b/polln_shift/models/planning.py
new file mode 100644
index 000000000..a51bd3013
--- /dev/null
+++ b/polln_shift/models/planning.py
@@ -0,0 +1,418 @@
+import re
+
+from datetime import datetime, timedelta
+
+from odoo import api, models, fields, _
+from odoo.addons.beesdoo_shift.models.cooperative_status import add_days_delta
+from odoo.addons.beesdoo_shift.models.planning import float_to_time
+from odoo.osv import expression
+
+
+def time_to_float(t):
+ hour, minute = t.split(':')
+ return float(hour) + float(minute) / 60
+
+class TaskTemplate(models.Model):
+ _inherit = 'beesdoo.shift.template'
+
+ shift_presence_value = fields.Float(default=1.0)
+
+class WizardSubscribe(models.TransientModel):
+ _inherit = 'beesdoo.shift.subscribe'
+
+ def _get_mode(self):
+ partner = self.env["res.partner"].browse(self._context.get("active_id"))
+ return partner.working_mode or 'irregular'
+
+ working_mode = fields.Selection(selection=[
+ ("irregular", "worker"),
+ ("exempt", "Exempted"),
+ ], default=_get_mode)
+
+ def subscribe(self):
+ res = super().subscribe()
+ if self.shift_id:
+ # Write the shift whatever the mode is
+ self.cooperator_id.sudo().write(
+ {"subscribed_shift_ids": [(6, 0, [self.shift_id.id])]}
+ )
+
+ # TODO put in beesdoo_shift + Doc
+ if self.shift_id and self.cooperator_id.super and not self.shift_id.super_coop_id and self.cooperator_id.user_ids:
+ self.shift_id.super_coop_id = self.cooperator_id.user_ids[0]
+
+ # Should work with module beesdoo_easy_my_coop but don't
+ self.cooperator_id.eater = 'worker_eater'
+ return res
+
+class TaskTemplate(models.Model):
+ _inherit = "beesdoo.shift.template"
+
+ def name_get(self):
+ res = []
+ for rec in self:
+ name = "%s %s %s (%s-%s)" % (
+ rec.name,
+ rec.planning_id.name,
+ rec.day_nb_id.name,
+ float_to_time(rec.start_time),
+ float_to_time(rec.end_time)
+ )
+ res.append((rec.id, name))
+ return res
+
+ @api.model
+ def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
+ domain = []
+ time_domain = []
+ FIELDS = ['planning_id', 'name', 'day_nb_id']
+ for n in name.split(" "):
+ if re.search(r"^\(\d{2}:\d{2}-\d{2}:\d{2}\)$", n):
+ start, end = n[1:-1].split('-')
+ start, end = time_to_float(start), time_to_float(end)
+ time_domain = [['&', ('start_time', '=', start), ('end_time', '=', end)]]
+ elif n.startswith('('): # Ignore missformed hour
+ continue
+ else:
+ domain.append(expression.OR([[(f, 'ilike', n)] for f in FIELDS]))
+ return self.search(expression.AND(domain + time_domain)).name_get()
+
+class Task(models.Model):
+ _inherit = 'beesdoo.shift.shift'
+
+ _period = 28
+
+ can_unsubscribe = fields.Boolean(compute="_compute_can_unsubscribe")
+
+ def _get_selection_status(self):
+ return [
+ ("open", _("Confirmed")),
+ ("done", _("Attended (+1)")),
+ ("absent", _("Absent (-1)")),
+ ("excused", _("Excused (+0)")),
+ ("cancel", _("Cancelled")),
+ ]
+
+ def _get_counter_date_state_change(self, new_state):
+ """
+ Return the cooperator_status of the cooperator that need to be
+ change and data that need to be change. It does not perform the
+ change directly. The cooperator_status will be changed by the
+ _change_counter function.
+
+ Check has been done to ensure that worker is legitimate.
+ """
+ data = {}
+ status = self.worker_id.cooperative_status_ids[0]
+ if new_state == "done":
+ data['sr'] = self.task_template_id.shift_presence_value or 1.0
+ if new_state == "absent":
+ data['sr'] = -self.task_template_id.shift_presence_value or -1.0
+ return data, status
+
+ def _compute_can_unsubscribe(self):
+ now = datetime.now()
+ ICP = self.env["ir.config_parameter"].sudo()
+ max_hours = int(ICP.get_param("max_hours_to_unsubscribe", 2))
+ for rec in self:
+ if now > rec.start_time or rec.state != 'open':
+ rec.can_unsubscribe = False
+ else:
+ delta = (rec.start_time - now)
+ delta = delta.seconds / 3600.0 + delta.days * 24
+ rec.can_unsubscribe = delta >= max_hours
+
+ def _get_final_state(self):
+ """ Disable constrains on shift that cannot be changed
+ """
+ return []
+
+
+ # def write(self, vals):
+ # if 'worker_id' in vals:
+ # template_unsubscribed = self.env.ref("macavrac_base.email_template_shift_unsubscribed")
+ # template_subscribed = self.env.ref("macavrac_base.email_template_shift_subscribed")
+ # new_worker_id = self.env['beesdoo.shift.shift'].browse(vals.get('worker_id'))
+ # for record in self:
+ # old_worker_id = record.worker_id
+ # if old_worker_id:
+ # template_unsubscribed.send_mail(record.id)
+ # if new_worker_id and old_worker_id != new_worker_id:
+ # res = super(Task, record).write(vals)
+ # template_subscribed.send_mail(record.id)
+ # return super(Task, self).write(vals)
+
+
+class CooperativeStatus(models.Model):
+ _inherit = 'cooperative.status'
+
+ def _get_status(self):
+ return [
+ ("ok", _("Up to Date")),
+ ("alert", _("Alerte")),
+ ("suspended", _("Suspended")),
+ ("unsubscribed", _("Unsubscribed")),
+ ("holiday", _("shift_status_holidays")),
+ ("exempted", _("Exempted")),
+ ("resigning", _("Resigning")),
+ ]
+
+ sr = fields.Float(compute='_get_sr', inverse="_set_sr")
+ # alter table cooperative_status add column sr_store double precision;
+ # update cooperative_status set sr_store = sr;
+ sr_store = fields.Float()
+ future_alert_date = fields.Date(compute="_compute_future_alert_date")
+ next_countdown_date = fields.Date(compute="_compute_next_countdown_date")
+
+ def _get_sr(self):
+ for record in self:
+ record.sr = record.sr_store
+
+ def _set_sr(self):
+ print("Set SR", self.mapped('sr'))
+ for record in self:
+ record.sr_store = record.sr
+
+ ########################################################
+ # Method to override #
+ # To define the behavior of the status #
+ # #
+ # By default: everyone is always up to date #
+ ########################################################
+
+ ##############################
+ # Computed field section #
+ ##############################
+ def _next_countdown_date(self, irregular_start_date, today):
+ """
+ Return the next countdown date given irregular_start_date and
+ today dates.
+ This does not take holiday and other status into account.
+ """
+
+ delta = (today - irregular_start_date).days
+ if not delta % self._period:
+ return today
+ return add_days_delta(today, self._period - (delta % self._period))
+
+ @api.depends(
+ "today",
+ "irregular_start_date",
+ "sr",
+ "holiday_start_time",
+ "holiday_end_time",
+ "temporary_exempt_start_date",
+ "temporary_exempt_end_date",
+ )
+ def _compute_future_alert_date(self):
+ """Compute date before which the worker is up to date"""
+ for rec in self:
+ # Only for subscribed irregular worker
+ if (
+ rec.working_mode != "irregular"
+ or not rec.irregular_start_date
+ ):
+ rec.future_alert_date = False
+ # Alert start time already set
+ elif rec.alert_start_time:
+ rec.future_alert_date = False
+ # Holidays are not set properly
+ elif bool(rec.holiday_start_time) != bool(rec.holiday_end_time):
+ rec.future_alert_date = False
+ # Exemption have not a start and end time
+ elif bool(rec.temporary_exempt_start_date) != bool(
+ rec.temporary_exempt_end_date
+ ):
+ rec.future_alert_date = False
+ else:
+ date = rec.today
+ counter = rec.sr
+ # Simulate the countdown
+ while counter > -2:
+ date = self._next_countdown_date(
+ rec.irregular_start_date, date
+ )
+ # Check holidays
+ if (
+ rec.holiday_start_time
+ and rec.holiday_end_time
+ and date >= rec.holiday_start_time
+ and date <= rec.holiday_end_time
+ ):
+ date = add_days_delta(date, 1)
+ continue
+ # Check temporary exemption
+ if (
+ rec.temporary_exempt_start_date
+ and rec.temporary_exempt_end_date
+ and date >= rec.temporary_exempt_start_date
+ and date <= rec.temporary_exempt_end_date
+ ):
+ date = add_days_delta(date, 1)
+ continue
+ # Otherwise
+ date = add_days_delta(date, 1)
+ counter -= 1
+ rec.future_alert_date = self._next_countdown_date(
+ rec.irregular_start_date, date
+ )
+
+ @api.depends(
+ "today",
+ "irregular_start_date",
+ "holiday_start_time",
+ "holiday_end_time",
+ "temporary_exempt_start_date",
+ "temporary_exempt_end_date",
+ )
+ def _compute_next_countdown_date(self):
+ """
+ Compute the following countdown date. This date is the date when
+ the worker will see his counter changed du to the cron. This
+ date is like the birthday date of the worker that occurred each
+ PERIOD.
+ """
+ for rec in self:
+ # Only for irregular worker
+ if (
+ rec.working_mode != "irregular"
+ and not rec.irregular_start_date
+ ):
+ rec.next_countdown_date = False
+ # Holidays are not set properly
+ elif bool(rec.holiday_start_time) != bool(rec.holiday_end_time):
+ rec.next_countdown_date = False
+ # Exemption have not a start and end time
+ elif bool(rec.temporary_exempt_start_date) != bool(
+ rec.temporary_exempt_end_date
+ ):
+ rec.next_countdown_date = False
+ else:
+ date = rec.today
+ next_countdown_date = False
+ while not next_countdown_date:
+ date = self._next_countdown_date(
+ rec.irregular_start_date, date
+ )
+ # Check holidays
+ if (
+ rec.holiday_start_time
+ and rec.holiday_end_time
+ and date >= rec.holiday_start_time
+ and date <= rec.holiday_end_time
+ ):
+ date = add_days_delta(date, 1)
+ continue
+ # Check temporary exemption
+ if (
+ rec.temporary_exempt_start_date
+ and rec.temporary_exempt_end_date
+ and date >= rec.temporary_exempt_start_date
+ and date <= rec.temporary_exempt_end_date
+ ):
+ date = add_days_delta(date, 1)
+ continue
+ # Otherwise
+ next_countdown_date = date
+ rec.next_countdown_date = next_countdown_date
+
+ #####################################
+ # Status Change implementation #
+ #####################################
+
+ def _get_regular_status(self):
+ """
+ Return the value of the status
+ for the regular worker
+ """
+ # TODO change
+ ICP = self.env["ir.config_parameter"].sudo()
+ alert_count = int(ICP.get_param("alert_count", -2))
+ unsubscribed_count = int(ICP.get_param("unsubscribed_count", -4))
+ default_alert_time = int(ICP.get_param("alert_time", 28))
+ if (self.temporary_exempt_start_date and self.temporary_exempt_end_date and
+ self.today >= self.temporary_exempt_start_date and self.today <= self.temporary_exempt_end_date):
+ return 'exempted'
+ if (self.holiday_start_time and self.holiday_end_time and
+ self.today >= self.holiday_start_time and self.today <= self.holiday_end_time):
+ return 'holiday'
+ if self.sr >= 0:
+ return 'ok'
+
+ if self.sr <= unsubscribed_count:
+ return 'unsubscribed'
+ if self.sr <= alert_count and not self.alert_start_time:
+ return 'alert'
+ if self.alert_start_time:
+ if self.today < self.alert_start_time + timedelta(days=default_alert_time+self.time_extension):
+ return 'alert'
+ else:
+ return 'suspended'
+ return 'ok'
+
+ def _get_irregular_status(self):
+ """
+ Return the value of the status
+ for the irregular worker
+ """
+ return self._get_regular_status()
+
+ def _state_change(self, new_state):
+ """
+ Hook to watch change in the state
+ """
+ self.ensure_one()
+ if new_state == "unsubscribed" or new_state == "resigning":
+ # Remove worker from task_templates
+ self.cooperator_id.sudo().write(
+ {"subscribed_shift_ids": [(5, 0, 0)]}
+ )
+ # Remove worker from supercoop in task_templates
+ task_tpls = self.env["beesdoo.shift.template"].search(
+ [("super_coop_id", "in", self.cooperator_id.user_ids.ids)]
+ )
+ task_tpls.write({"super_coop_id": False})
+ # Remove worker for future tasks (remove also supercoop)
+ self.env["beesdoo.shift.shift"].sudo().unsubscribe_from_today(
+ self.cooperator_id, now=fields.Datetime.now()
+ )
+ if new_state == "alert":
+ self.write({"alert_start_time": self.today})
+
+ def _change_counter(self, data):
+ """
+ Call when a shift state is changed
+ use data generated by _get_counter_date_state_change
+ """
+ self.sr += data.get("sr", 0)
+
+
+ ###############################################
+ ###### Irregular Cron implementation ##########
+ ###############################################
+
+ def _get_irregular_worker_domain(self, today):
+ """
+ return the domain the give the list
+ of valid irregular worker that should
+ get their counter changed by the cron
+ """
+ return [
+ ("status", "not in", ["unsubscribed", "exempted", "resigning"]),
+ ("irregular_start_date", "!=", False),
+ ("working_mode", "!=", "exempt"),
+ ]
+
+ def _change_irregular_counter(self):
+ """
+ Define how the counter will change
+ for the irregular worker
+ where today - start_date is a multiple of the period
+ by default 28 days
+ """
+ self.sr -= 1
+
+
+
+
+# TODO: nombre de coop nécessaire pour remplir le planning
\ No newline at end of file
diff --git a/polln_shift/models/res_partner.py b/polln_shift/models/res_partner.py
new file mode 100644
index 000000000..0737541c2
--- /dev/null
+++ b/polln_shift/models/res_partner.py
@@ -0,0 +1,26 @@
+from odoo import api, fields, models, _
+
+
+class Partner(models.Model):
+ _inherit = "res.partner"
+
+ cooperator_type = fields.Selection(string="Cooperator Type", store=True,
+ selection="_get_share_type",
+ compute="_compute_cooperator_type",
+ )
+ shift_task_ids = fields.One2many( 'beesdoo.shift.shift', 'worker_id', string="Shifts")
+
+ @api.depends(
+ "share_ids",
+ "share_ids.share_product_id",
+ "share_ids.share_product_id.default_code",
+ "share_ids.share_number",
+ )
+ def _compute_cooperator_type(self):
+ for partner in self:
+ share_type = ""
+ for line in partner.share_ids:
+ if line.share_number > 0:
+ share_type = line.share_product_id.default_code
+ break
+ partner.cooperator_type = share_type
\ No newline at end of file
diff --git a/polln_shift/readme/CONTRIBUTORS.rst b/polln_shift/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..bd002d0a7
--- /dev/null
+++ b/polln_shift/readme/CONTRIBUTORS.rst
@@ -0,0 +1,2 @@
+* Thibault Francois
+* Patricia Daloze
\ No newline at end of file
diff --git a/polln_shift/readme/DESCRIPTION.rst b/polln_shift/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..78589fbcb
--- /dev/null
+++ b/polln_shift/readme/DESCRIPTION.rst
@@ -0,0 +1 @@
+Module with basic customizations for the Macavrac cooperative.
diff --git a/polln_shift/views/res_partner.xml b/polln_shift/views/res_partner.xml
new file mode 100644
index 000000000..ba5585ba7
--- /dev/null
+++ b/polln_shift/views/res_partner.xml
@@ -0,0 +1,111 @@
+
+
+ Polln Coop Form View
+ res.partner
+
+ 99
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Polln Coop Form View
+ res.partner
+
+ 99
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/polln_shift/views/shift.xml b/polln_shift/views/shift.xml
new file mode 100644
index 000000000..5808a765a
--- /dev/null
+++ b/polln_shift/views/shift.xml
@@ -0,0 +1,199 @@
+
+
+ Task Template Form Inherit
+ beesdoo.shift.template
+
+
+
+
+
+
+ [("is_worker", "=", True)]
+
+
+
+
+
+ Task Form inherit
+
+ beesdoo.shift.shift
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ [('cooperative_status_ids.status', 'not in', ('unsubscribed', 'resigning')), ('cooperative_status_ids.working_mode', '=', 'irregular')]
+
+
+
+
+
+ Coop Status Form View Inherit
+
+ cooperative.status
+
+
+
+ Start date
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+ Coop Status Tree View Inherit
+
+ cooperative.status
+
+
+ 1
+
+
+
+
+
+
+
+
+ Shift Kanban
+ beesdoo.shift.shift
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Subscribe Cooperator
+ beesdoo.shift.subscribe
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unsubscribe
+
+
+
+
+
+
+
+
+
+
+ Subscribe Cooperator
+ beesdoo.shift.subscribe
+
+
+
+
+
+
+
+
\ No newline at end of file