Skip to content

Commit

Permalink
Merge PR #1355 into 17.0
Browse files Browse the repository at this point in the history
Signed-off-by pedrobaeza
  • Loading branch information
OCA-git-bot committed Aug 14, 2024
2 parents 0559e35 + b140571 commit 462b9a9
Show file tree
Hide file tree
Showing 28 changed files with 2,845 additions and 0 deletions.
139 changes: 139 additions & 0 deletions hr_employee_calendar_planning/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
==========================
Employee Calendar Planning
==========================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:284506a493efa30b083dbb0cfa7dec6704dd8d03c0def4a8747d89b7d55d2065
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fhr-lightgray.png?logo=github
:target: https://github.com/OCA/hr/tree/17.0/hr_employee_calendar_planning
:alt: OCA/hr
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/hr-17-0/hr-17-0-hr_employee_calendar_planning
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/hr&target_branch=17.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module allows to manage employee working time with profiles by date
intervals.

The profiles are regular working time calendars, but they are treated as
master ones here, allowing you to compose complexes working times by
dates.

Under the hook, a unique working time is created for each employee with
the proper composition for not affecting the rest of the functionality
linked to this model.

**Table of contents**

.. contents::
:local:

Installation
============

During the installation of the module, current working times are split
by start/end dates for having consistent data, and the potential new
composed calendar planning is saved instead on the employee.

Configuration
=============

1. Go to *Employees > Employees*.
2. Open or create a new one.
3. On the "Work Information" tab, fill the section "Working Hours" with:

- Starting date (optional).
- Ending date (optional).
- Working time to apply during that date interval.

Known issues / Roadmap
======================

- Add a wizard for generating next year calendar planning based on
current one in batch.
- Add constraint for avoiding planning lines overlapping.
- Avoid the regeneration of whole private calendars each time a change
is detected.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/hr/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/hr/issues/new?body=module:%20hr_employee_calendar_planning%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Tecnativa

Contributors
------------

- `Tecnativa <https://www.tecnativa.com>`__:

- Pedro M. Baeza
- Víctor Martínez

- `Creu Blanca <https://www.creu-blanca.es/>`__:

- Jaime Arroyo

- `ForgeFlow <https://www.forgeflow.com/>`__:

- Jordi Ballester Alomar ([email protected])
- Nattapong W. <[email protected]>

- `PeGon <https://www.pegon.ch>`__:

- Pedro Evaristo Gonzalez Sanchez <[email protected]>

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

.. |maintainer-victoralmau| image:: https://github.com/victoralmau.png?size=40px
:target: https://github.com/victoralmau
:alt: victoralmau
.. |maintainer-pedrobaeza| image:: https://github.com/pedrobaeza.png?size=40px
:target: https://github.com/pedrobaeza
:alt: pedrobaeza

Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-victoralmau| |maintainer-pedrobaeza|

This module is part of the `OCA/hr <https://github.com/OCA/hr/tree/17.0/hr_employee_calendar_planning>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
4 changes: 4 additions & 0 deletions hr_employee_calendar_planning/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from . import models
from .hooks import post_init_hook
19 changes: 19 additions & 0 deletions hr_employee_calendar_planning/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copyright 2019 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Employee Calendar Planning",
"version": "17.0.1.0.0",
"category": "Human Resources",
"website": "https://github.com/OCA/hr",
"author": "Tecnativa,Odoo Community Association (OCA)",
"license": "AGPL-3",
"installable": True,
"depends": ["hr"],
"data": [
"security/ir.model.access.csv",
"views/hr_employee_views.xml",
"views/resource_calendar_views.xml",
],
"post_init_hook": "post_init_hook",
"maintainers": ["victoralmau", "pedrobaeza"],
}
65 changes: 65 additions & 0 deletions hr_employee_calendar_planning/hooks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Copyright 2019 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from collections import defaultdict


def post_init_hook(env, employees=None):
"""Split current calendars by date ranges and assign new ones for
having proper initial data.
"""
if not employees:
employees = env["hr.employee"].search([])
calendars = employees.mapped("resource_calendar_id")
calendar_obj = env["resource.calendar"]
line_obj = env["resource.calendar.attendance"]
groups = line_obj.read_group(
[("calendar_id", "in", calendars.ids)],
["calendar_id", "date_from", "date_to"],
["calendar_id", "date_from:day", "date_to:day"],
lazy=False,
)
calendar_mapping = defaultdict(list)
for group in groups:
calendar = calendar_obj.browse(group["calendar_id"][0])
lines = line_obj.search(group["__domain"])
if len(calendar.attendance_ids) == len(lines):
# Don't alter calendar, as it's the same
new_calendar = calendar
else:
name = calendar.name + f" {lines[0].date_from}-{lines[0].date_to}"
attendances = []
for line in lines:
data = line.copy_data({"date_from": False, "date_to": False})[0]
data.pop("calendar_id")
attendances.append((0, 0, data))
new_calendar = calendar_obj.create(
{"name": name, "attendance_ids": attendances}
)
calendar_mapping[calendar].append(
(lines[0].date_from, lines[0].date_to, new_calendar),
)
for employee in employees.filtered("resource_calendar_id"):
calendar_lines = []
for data in calendar_mapping[employee.resource_calendar_id]:
calendar_lines.append(
(
0,
0,
{
"date_start": data[0],
"date_end": data[1],
"calendar_id": data[2].id,
},
)
)
# Extract employee's existing leaves so they are passed to the new
# automatic calendar.
leaves = employee.resource_calendar_id.leave_ids.filtered(
lambda x, e=employee: x.resource_id == e.resource_id
)
employee.calendar_ids = calendar_lines
employee.resource_calendar_id.active = False
# Now the automatic calendar has been created, so we link the
# leaves to that one so they count correctly.
leaves.write({"calendar_id": employee.resource_calendar_id.id})
163 changes: 163 additions & 0 deletions hr_employee_calendar_planning/i18n/ca.po
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * hr_employee_calendar_planning
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-03-21 14:17+0000\n"
"Last-Translator: Noel estudillo <[email protected]>\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"

#. module: hr_employee_calendar_planning
#. odoo-python
#: code:addons/hr_employee_calendar_planning/models/resource_calendar.py:0
#, python-format
msgid ""
"%(item_name)s is used in %(total_items)s employee(s) related to another "
"company."
msgstr ""

#. module: hr_employee_calendar_planning
#. odoo-python
#: code:addons/hr_employee_calendar_planning/models/resource_calendar.py:0
#, python-format
msgid ""
"%(item_name)s is used in %(total_items)s employee(s).You should change them "
"first."
msgstr ""

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_resource_calendar__active
msgid "Active"
msgstr "Actiu"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_resource_calendar__auto_generate
msgid "Auto Generate"
msgstr "Generació automàtica"

#. module: hr_employee_calendar_planning
#. odoo-python
#: code:addons/hr_employee_calendar_planning/models/hr_employee.py:0
#, python-format
msgid "Auto generated calendar for employee"
msgstr "Horari autogenerat per a l'empleat"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee__calendar_ids
msgid "Calendar planning"
msgstr "Pla d'horari"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar__company_id
msgid "Company"
msgstr "Companyia"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar__create_uid
msgid "Created by"
msgstr "Creat per"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar__create_date
msgid "Created on"
msgstr "Creat el"

#. module: hr_employee_calendar_planning
#: model:ir.model.constraint,message:hr_employee_calendar_planning.constraint_hr_employee_calendar_date_consistency
msgid "Date end should be higher than date start"
msgstr "La data de fi ha de ser més gran que la d'inici"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar__display_name
msgid "Display Name"
msgstr "Nom a mostrar"

#. module: hr_employee_calendar_planning
#: model:ir.model,name:hr_employee_calendar_planning.model_hr_employee
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar__employee_id
msgid "Employee"
msgstr "Empleat"

#. module: hr_employee_calendar_planning
#: model:ir.model,name:hr_employee_calendar_planning.model_hr_employee_calendar
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_resource_calendar__employee_calendar_ids
msgid "Employee Calendar"
msgstr "Horari de l'empleat"

#. module: hr_employee_calendar_planning
#: model_terms:ir.ui.view,arch_db:hr_employee_calendar_planning.resource_calendar_form
msgid "Employee Calendars"
msgstr ""

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar__date_end
msgid "End Date"
msgstr "Data de finalització"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar__id
msgid "ID"
msgstr "ID"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,help:hr_employee_calendar_planning.field_resource_calendar__active
msgid ""
"If the active field is set to false, it will allow you to hide the Working "
"Time without removing it."
msgstr ""
"Si el camp actiu està definit com a fals, us permetrà ocultar el temps de "
"treball sense eliminar-lo."

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar____last_update
msgid "Last Modified on"
msgstr "Darrera modificació el"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar__write_uid
msgid "Last Updated by"
msgstr "Darrera modificació per"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar__write_date
msgid "Last Updated on"
msgstr "Darrera modificació el"

#. module: hr_employee_calendar_planning
#: model:ir.model,name:hr_employee_calendar_planning.model_resource_calendar
msgid "Resource Working Time"
msgstr "Temps de treball"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar__date_start
msgid "Start Date"
msgstr "Data d'Inici"

#. module: hr_employee_calendar_planning
#: model:ir.model.fields,field_description:hr_employee_calendar_planning.field_hr_employee_calendar__calendar_id
msgid "Working Time"
msgstr "Temps de treball"

#. module: hr_employee_calendar_planning
#. odoo-python
#: code:addons/hr_employee_calendar_planning/models/hr_employee.py:0
#, python-format
msgid "You can not create employees without any calendar."
msgstr ""

#, python-format
#~ msgid "%s is used in %s employee(s) related to another company."
#~ msgstr "%s s'utilitza en %s empleats relacionats amb una altra empresa."

#, python-format
#~ msgid "%s is used in %s employee(s). You should change them first."
#~ msgstr "%s s'utilitza en %s empleat(s). Primer els hauries de canviar."
Loading

0 comments on commit 462b9a9

Please sign in to comment.