Explorar o código

Este módulo calendario festivo

SEBAS hai 2 semanas
achega
2c5d8f5810

+ 21 - 0
README.rst

@@ -0,0 +1,21 @@
+.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
+    :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+    :alt: License: AGPL-3
+
+================
+Calendar holiday
+================
+
+This module allows you to define holiday calendars and employee calendars.
+
+* Holiday calendars are available in Human Resources > Configuration.
+* Employee calendars are available in Human Resources > Human Resources.
+
+* The employee calendar is generated from his contract.
+* New scheduled action for generate calendar in contracts annually.
+
+Contributors
+------------
+* Ana Juaristi <anajuaristi@avanzosc.es>
+* Alfredo de la Fuente <alfredodelafuente@avanzosc.es>
+* Eider Oyarbide <eideroyarbide@avanzosc.es>

+ 6 - 0
__init__.py

@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# (c) 2016 Alfredo de la Fuente AvanzOSC
+# (c) 2018 Eider Oyarbide - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+from . import models
+from . import wizard

BIN=BIN
__init__.pyc


+ 36 - 0
__openerp__.py

@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# (c) 2016 Alfredo de la Fuente, Eider Oyarbide - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+{
+    "name": "Calendar Holiday",
+    "version": "8.0.1.3.0",
+    "license": "AGPL-3",
+    "author": "AvanzOSC",
+    "website": "http://www.avanzosc.es",
+    "contributors": [
+        "Ana Juaristi <anajuaristi@avanzosc.es>",
+        "Alfredo de la Fuente <alfredodelafuente@avanzosc.es>",
+        "Eider Oyarbide <eideroyarbide@avanzosc.es>",
+    ],
+    "category": "Human Resources",
+    "depends": [
+        "mail",
+        "hr_contract",
+        "hr_holidays",
+        "hr_employee_catch_partner",
+    ],
+    "data": [
+        "security/ir.model.access.csv",
+        "data/calendar_holiday_data.xml",
+        "wizard/wiz_calculate_workable_festive_view.xml",
+        "views/calendar_holiday_view.xml",
+        "views/calendar_holiday_day_view.xml",
+        "views/res_partner_calendar_view.xml",
+        "views/res_partner_calendar_day_view.xml",
+        "views/hr_employee_view.xml",
+        "views/hr_contract_view.xml",
+        "views/hr_holidays_view.xml",
+        "wizard/wiz_assign_calendar_holiday_view.xml"
+    ],
+    "installable": True,
+}

+ 16 - 0
data/calendar_holiday_data.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data noupdate="1">
+        <record forcecreate="True" id="ir_cron_hr_contract_calendar_action" model="ir.cron">
+            <field name="name">Generate calendars in contracts</field>
+            <field eval="False" name="active" />
+            <field name="user_id" ref="base.user_root" />
+            <field name="interval_number">12</field>
+            <field name="interval_type">months</field>
+            <field name="numbercall">-1</field>
+            <field eval="'hr.contract'" name="model" />
+            <field eval="'automatic_process_generate_calendar'" name="function" />
+            <field eval="'(None, )'" name="args" />
+        </record>
+    </data>
+</openerp>

+ 526 - 0
i18n/es.po

@@ -0,0 +1,526 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# 	* calendar_holiday
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-02-09 10:05+0000\n"
+"PO-Revision-Date: 2017-02-09 11:06+0100\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: \n"
+"X-Generator: Poedit 1.5.4\n"
+
+#. module: calendar_holiday
+#: field:calendar.holiday.day,absence_type:0
+msgid "Absence Type"
+msgstr "Tipo ausencia"
+
+#. module: calendar_holiday
+#: view:calendar.holiday.day:calendar_holiday.calendar_holiday_day_search_view
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_search_view
+#: field:res.partner.calendar.day,absence_type:0
+#: field:res.partner.calendar.day,absence_type_from_employee_contract:0
+msgid "Absence type"
+msgstr "Tipo ausencia"
+
+#. module: calendar_holiday
+#: view:wiz.calculate.workable.festive:calendar_holiday.wiz_calculate_workable_festive_view
+msgid "Calculate"
+msgstr "Calcular"
+
+#. module: calendar_holiday
+#: view:hr.contract:calendar_holiday.hr_contract_view_form_inh_calendarholiday
+msgid "Calculate workables and festives in the calendar of the employee"
+msgstr "Calcular laborables y festivos en el calendario del empleado"
+
+#. module: calendar_holiday
+#: field:calendar.holiday.day,calendar_holiday:0
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_search_view
+#: field:res.partner.calendar.day,calendar:0
+msgid "Calendar"
+msgstr "Calendario"
+
+#. module: calendar_holiday
+#: field:res.partner.calendar,dates:0
+msgid "Calendar dates"
+msgstr "Fechas calendario"
+
+#. module: calendar_holiday
+#: view:calendar.holiday:calendar_holiday.calendar_holiday_form_view
+#: view:calendar.holiday:calendar_holiday.calendar_holiday_tree_view
+#: view:calendar.holiday.day:calendar_holiday.calendar_holiday_day_search_view
+#: model:ir.model,name:calendar_holiday.model_calendar_holiday
+msgid "Calendar holiday"
+msgstr "Calendario festivo"
+
+#. module: calendar_holiday
+#: field:res.partner.calendar.day,calendar_holiday_day:0
+msgid "Calendar holiday day"
+msgstr "Día calendario festivos"
+
+#. module: calendar_holiday
+#: view:calendar.holiday.day:calendar_holiday.calendar_holiday_day_tree_view
+#: model:ir.actions.act_window,name:calendar_holiday.action_calendar_holiday_day_view
+#: model:ir.ui.menu,name:calendar_holiday.calendar_holiday_day_option_view
+msgid "Calendar holiday days"
+msgstr "Días calendario festivo"
+
+#. module: calendar_holiday
+#: view:calendar.holiday:calendar_holiday.calendar_holiday_form_view
+#: model:ir.model,name:calendar_holiday.model_calendar_holiday_day
+msgid "Calendar holiday lines"
+msgstr "Líneas calendario festivo"
+
+#. module: calendar_holiday
+#: model:ir.actions.act_window,name:calendar_holiday.action_calendar_holiday_view
+#: model:ir.ui.menu,name:calendar_holiday.calendar_holiday_option_view
+msgid "Calendar holidays"
+msgstr "Calendario festivos"
+
+#. module: calendar_holiday
+#: view:wiz.calculate.workable.festive:calendar_holiday.wiz_calculate_workable_festive_view
+msgid "Cancel"
+msgstr "Cancelar"
+
+#. module: calendar_holiday
+#: model:ir.model,name:calendar_holiday.model_hr_contract
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_search_view
+msgid "Contract"
+msgstr "Contrato"
+
+#. module: calendar_holiday
+#: field:hr.contract,partner:0
+#: view:hr.employee:calendar_holiday.view_employee_filter_inh_calendarholiday
+#: view:hr.employee:calendar_holiday.view_employee_tree_inh_calendarholiday
+msgid "Contract employee"
+msgstr "Asociado a"
+
+#. module: calendar_holiday
+#: field:calendar.holiday,create_uid:0 field:calendar.holiday.day,create_uid:0
+#: field:res.partner.calendar,create_uid:0
+#: field:res.partner.calendar.day,create_uid:0
+#: field:wiz.calculate.workable.festive,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: calendar_holiday
+#: field:calendar.holiday,create_date:0
+#: field:calendar.holiday.day,create_date:0
+#: field:res.partner.calendar,create_date:0
+#: field:res.partner.calendar.day,create_date:0
+#: field:wiz.calculate.workable.festive,create_date:0
+msgid "Created on"
+msgstr "Creado el"
+
+#. module: calendar_holiday
+#: field:calendar.holiday.day,date:0 field:res.partner.calendar.day,date:0
+msgid "Date"
+msgstr "Fecha"
+
+#. module: calendar_holiday
+#: help:hr.contract,message_last_post:0
+#: help:res.partner.calendar,message_last_post:0
+msgid "Date of the last message posted on the record."
+msgstr "Fecha del último mensaje publicado en el registro."
+
+#. module: calendar_holiday
+#: view:calendar.holiday:calendar_holiday.calendar_holiday_form_view
+#: view:res.partner.calendar:calendar_holiday.res_partner_calendar_form_view
+msgid "Days"
+msgstr "Días"
+
+#. module: calendar_holiday
+#: field:calendar.holiday,name:0
+msgid "Description"
+msgstr "Descripción"
+
+#. module: calendar_holiday
+#: field:calendar.holiday,display_name:0
+#: field:calendar.holiday.day,display_name:0
+#: field:res.partner.calendar,display_name:0
+#: field:res.partner.calendar.day,display_name:0
+#: field:wiz.calculate.workable.festive,display_name:0
+msgid "Display Name"
+msgstr "Mostrar descripción"
+
+#. module: calendar_holiday
+#: model:ir.actions.act_window,name:calendar_holiday.action_res_partner_calendar_view
+#: model:ir.model,name:calendar_holiday.model_res_partner_calendar
+#: model:ir.ui.menu,name:calendar_holiday.res_partner_calendar_option_view
+#: view:res.partner.calendar:calendar_holiday.res_partner_calendar_form_view
+#: view:res.partner.calendar:calendar_holiday.res_partner_calendar_tree_view
+msgid "Employee calendar"
+msgstr "Calendario empleado"
+
+#. module: calendar_holiday
+#: model:ir.model,name:calendar_holiday.model_res_partner_calendar_day
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_form_view
+msgid "Employee calendar day"
+msgstr "Día calendario empleado"
+
+#. module: calendar_holiday
+#: field:hr.contract,calendar_days:0
+#: model:ir.actions.act_window,name:calendar_holiday.action_res_partner_calendar_day_view
+#: model:ir.ui.menu,name:calendar_holiday.res_partner_calendar_day_option_view
+#: view:res.partner.calendar:calendar_holiday.res_partner_calendar_form_view
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_tree_view
+msgid "Employee calendar days"
+msgstr "Días calendario empleado"
+
+#. module: calendar_holiday
+#: view:wiz.calculate.workable.festive:calendar_holiday.wiz_calculate_workable_festive_view
+#: field:wiz.calculate.workable.festive,year:0
+msgid "Employee calendar year"
+msgstr "Año calendario empleado"
+
+#. module: calendar_holiday
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_calendar_view
+msgid "Employees days"
+msgstr "Días empleados"
+
+#. module: calendar_holiday
+#: field:res.partner.calendar.day,estimated_hours:0
+msgid "Estimated hours"
+msgstr "Horas estimadas"
+
+#. module: calendar_holiday
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_search_view
+#: field:res.partner.calendar.day,festive:0
+msgid "Festive"
+msgstr "Festivo"
+
+#. module: calendar_holiday
+#: field:hr.contract,message_follower_ids:0
+#: field:res.partner.calendar,message_follower_ids:0
+msgid "Followers"
+msgstr "Seguidores"
+
+#. module: calendar_holiday
+#: selection:res.partner.calendar.day,weekday:0
+msgid "Friday"
+msgstr "Viernes"
+
+#. module: calendar_holiday
+#: view:calendar.holiday.day:calendar_holiday.calendar_holiday_day_search_view
+#: view:res.partner.calendar:calendar_holiday.res_partner_calendar_search_view
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_search_view
+msgid "Group By"
+msgstr "Agrupar por"
+
+#. module: calendar_holiday
+#: help:hr.contract,message_summary:0
+#: help:res.partner.calendar,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+
+#. module: calendar_holiday
+#: field:calendar.holiday,lines:0
+msgid "Holiday Days"
+msgstr "Días vacaciones"
+
+#. module: calendar_holiday
+#: view:hr.contract:calendar_holiday.hr_contract_view_form_inh_calendarholiday
+#: field:hr.contract,holiday_calendars:0
+msgid "Holiday calendars"
+msgstr "Calendario festivos"
+
+#. module: calendar_holiday
+#: field:calendar.holiday,id:0 field:calendar.holiday.day,id:0
+#: field:res.partner.calendar,id:0 field:res.partner.calendar.day,id:0
+#: field:wiz.calculate.workable.festive,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: calendar_holiday
+#: help:hr.contract,message_unread:0
+#: help:res.partner.calendar,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr "Si chequeado nuevos mensajes requieren su atención."
+
+#. module: calendar_holiday
+#: field:hr.contract,message_is_follower:0
+#: field:res.partner.calendar,message_is_follower:0
+msgid "Is a Follower"
+msgstr "Es un seguidor"
+
+#. module: calendar_holiday
+#: field:hr.contract,message_last_post:0
+#: field:res.partner.calendar,message_last_post:0
+msgid "Last Message Date"
+msgstr "Fecha último mensaje"
+
+#. module: calendar_holiday
+#: field:calendar.holiday,__last_update:0
+#: field:calendar.holiday.day,__last_update:0
+#: field:res.partner.calendar,__last_update:0
+#: field:res.partner.calendar.day,__last_update:0
+#: field:wiz.calculate.workable.festive,__last_update:0
+msgid "Last Modified on"
+msgstr "Last Modified on"
+
+#. module: calendar_holiday
+#: field:calendar.holiday,write_uid:0 field:calendar.holiday.day,write_uid:0
+#: field:res.partner.calendar,write_uid:0
+#: field:res.partner.calendar.day,write_uid:0
+#: field:wiz.calculate.workable.festive,write_uid:0
+msgid "Last Updated by"
+msgstr "Última actualización por"
+
+#. module: calendar_holiday
+#: field:calendar.holiday,write_date:0 field:calendar.holiday.day,write_date:0
+#: field:res.partner.calendar,write_date:0
+#: field:res.partner.calendar.day,write_date:0
+#: field:wiz.calculate.workable.festive,write_date:0
+msgid "Last Updated on"
+msgstr "Última actualización el"
+
+#. module: calendar_holiday
+#: model:ir.model,name:calendar_holiday.model_hr_holidays
+msgid "Leave"
+msgstr "Ausencia"
+
+#. module: calendar_holiday
+#: view:hr.employee:calendar_holiday.view_employee_filter_inh_calendarholiday
+msgid "Manager"
+msgstr "Director"
+
+#. module: calendar_holiday
+#: field:hr.contract,message_ids:0 field:res.partner.calendar,message_ids:0
+msgid "Messages"
+msgstr "Mensajes"
+
+#. module: calendar_holiday
+#: help:hr.contract,message_ids:0 help:res.partner.calendar,message_ids:0
+msgid "Messages and communication history"
+msgstr "Historial de mensajes y comunicaciones"
+
+#. module: calendar_holiday
+#: selection:res.partner.calendar.day,weekday:0
+msgid "Monday"
+msgstr "Lunes"
+
+#. module: calendar_holiday
+#: view:calendar.holiday.day:calendar_holiday.calendar_holiday_day_search_view
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_search_view
+msgid "Month"
+msgstr "Mes"
+
+#. module: calendar_holiday
+#: view:hr.employee:calendar_holiday.view_employee_form_inh_calendarholiday
+#: model:ir.model,name:calendar_holiday.model_res_partner
+#: view:res.partner.calendar:calendar_holiday.res_partner_calendar_search_view
+#: field:res.partner.calendar,partner:0
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_search_view
+#: field:res.partner.calendar.day,partner:0
+msgid "Partner"
+msgstr "Empresa"
+
+#. module: calendar_holiday
+#: field:res.partner.calendar.day,contract:0
+msgid "Partner contract"
+msgstr "Contrato"
+
+#. module: calendar_holiday
+#: field:res.partner.calendar.day,real_hours:0
+msgid "Real hours"
+msgstr "Horas reales"
+
+#. module: calendar_holiday
+#: selection:res.partner.calendar.day,weekday:0
+msgid "Saturday"
+msgstr "Sábado"
+
+#. module: calendar_holiday
+#: view:calendar.holiday:calendar_holiday.calendar_holiday_search_view
+msgid "Search calendar holiday"
+msgstr "Buscar calendario festivo"
+
+#. module: calendar_holiday
+#: view:calendar.holiday.day:calendar_holiday.calendar_holiday_day_search_view
+msgid "Search calendar holiday day"
+msgstr "Buscar día calendario festivo"
+
+#. module: calendar_holiday
+#: view:res.partner.calendar:calendar_holiday.res_partner_calendar_search_view
+msgid "Search employee calendar"
+msgstr "Buscar calendario empleado"
+
+#. module: calendar_holiday
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_search_view
+msgid "Search employee calendar day"
+msgstr "Buscar día calendario empleado"
+
+#. module: calendar_holiday
+#: view:res.partner.calendar:calendar_holiday.res_partner_calendar_form_view
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_tree_view
+msgid "Sum. estimated hours"
+msgstr "Sum. horas estimadas"
+
+#. module: calendar_holiday
+#: view:res.partner.calendar:calendar_holiday.res_partner_calendar_form_view
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_tree_view
+msgid "Sum. real hours"
+msgstr "Sum. horas reales"
+
+#. module: calendar_holiday
+#: field:hr.contract,message_summary:0
+#: field:res.partner.calendar,message_summary:0
+msgid "Summary"
+msgstr "Sumario"
+
+#. module: calendar_holiday
+#: selection:res.partner.calendar.day,weekday:0
+msgid "Sunday"
+msgstr "Domingo"
+
+#. module: calendar_holiday
+#: code:addons/calendar_holiday/models/res_partner.py:65
+#, python-format
+msgid "The calendar %s was not found, for employee %s"
+msgstr "El calendario %s no ha sido encontrado,para el empleado %s"
+
+#. module: calendar_holiday
+#: code:addons/calendar_holiday/models/res_partner.py:72
+#, python-format
+msgid "The day %s was not found in the calendar %s, for employee %s"
+msgstr "El día %s no ha sido encontrado en el calendario %s, del empleado %s"
+
+#. module: calendar_holiday
+#: selection:res.partner.calendar.day,weekday:0
+msgid "Thursday"
+msgstr "Jueves"
+
+#. module: calendar_holiday
+#: selection:res.partner.calendar.day,weekday:0
+msgid "Tuesday"
+msgstr "Martes"
+
+#. module: calendar_holiday
+#: field:hr.contract,message_unread:0
+#: field:res.partner.calendar,message_unread:0
+msgid "Unread Messages"
+msgstr "Mensajes sin leer"
+
+#. module: calendar_holiday
+#: field:hr.contract,website_message_ids:0
+#: field:res.partner.calendar,website_message_ids:0
+msgid "Website Messages"
+msgstr "Website Messages"
+
+#. module: calendar_holiday
+#: help:hr.contract,website_message_ids:0
+#: help:res.partner.calendar,website_message_ids:0
+msgid "Website communication history"
+msgstr "Website communication history"
+
+#. module: calendar_holiday
+#: selection:res.partner.calendar.day,weekday:0
+msgid "Wednesday"
+msgstr "Miércoles"
+
+#. module: calendar_holiday
+#: view:calendar.holiday.day:calendar_holiday.calendar_holiday_day_search_view
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_search_view
+msgid "Week"
+msgstr "Semana"
+
+#. module: calendar_holiday
+#: field:res.partner.calendar.day,weekday:0
+msgid "Weekday"
+msgstr "Día semana"
+
+#. module: calendar_holiday
+#: model:ir.actions.act_window,name:calendar_holiday.action_calculate_workables_festives
+#: view:wiz.calculate.workable.festive:calendar_holiday.wiz_calculate_workable_festive_view
+msgid ""
+"Wizard for calculate workable and festive days in the calendar of the "
+"employee"
+msgstr ""
+"Wizard para calcular días laborables y festivos en el calendario de empleado"
+
+#. module: calendar_holiday
+#: model:ir.model,name:calendar_holiday.model_wiz_calculate_workable_festive
+msgid "Wizard for calculate workables and festives"
+msgstr "Wizard para calcular laborables y festivos"
+
+#. module: calendar_holiday
+#: view:hr.contract:calendar_holiday.hr_contract_view_form_inh_calendarholiday
+msgid "Work Permit"
+msgstr "Permiso de trabajo"
+
+#. module: calendar_holiday
+#: view:res.partner.calendar:calendar_holiday.res_partner_calendar_search_view
+#: field:res.partner.calendar,year:0
+msgid "Year"
+msgstr "Año"
+
+#. module: calendar_holiday
+#: code:addons/calendar_holiday/wizard/wiz_calculate_workable_festive.py:41
+#, python-format
+msgid "Year introduced less than year contract beginning"
+msgstr "El año introducido es menor que el año de inicio de contrato"
+
+#. module: calendar_holiday
+#: code:addons/calendar_holiday/wizard/wiz_calculate_workable_festive.py:46
+#, python-format
+msgid "Year introduced more than year end contract"
+msgstr "El año introducido el mayor que el año fin del contrado"
+
+#. module: calendar_holiday
+#: view:wiz.calculate.workable.festive:calendar_holiday.wiz_calculate_workable_festive_view
+msgid "or"
+msgstr "o"
+
+#. module: calendar_holiday
+#: view:calendar.holiday.day:calendar_holiday.calendar_holiday_day_search_view
+#: view:res.partner.calendar.day:calendar_holiday.res_partner_calendar_day_search_view
+#: field:res.partner.calendar.day,year:0
+msgid "year"
+msgstr "año"
+
+#. module: calendar_holiday
+#: view:hr.contract:calendar_holiday.hr_contract_view_search_inh_calendarholiday
+msgid "Associated to"
+msgstr "Asociado a"
+
+#. module: calendar_holiday
+#: field:wiz.assign.calendar.holiday,calendar_holidays_ids:0
+msgid "Assign holidays"
+msgstr "Asignar festivos"
+
+#. module: calendar_holiday
+#: field:wiz.assign.calendar.holiday,calendar_year:0
+msgid "Generated calendar for year"
+msgstr "Generar caldendario para el año"
+
+#. module: calendar_holiday
+#: view:wiz.assign.calendar.holiday:calendar_holiday.wiz_assign_calendar_holiday_view
+msgid "Wizard for assign calendar holidays in employee contract"
+msgstr "Wizard para asignar calendario festivo a los contratos de los empleados"
+
+#. module: calendar_holiday
+#: view:wiz.assign.calendar.holiday:calendar_holiday.wiz_assign_calendar_holiday_view
+msgid "Calendar Holidays"
+msgstr "Calendario de festivos"
+
+#. module: calendar_holiday
+#: view:wiz.assign.calendar.holiday:calendar_holiday.wiz_assign_calendar_holiday_view
+msgid "Assign calendar"
+msgstr "Asignar calendario"
+
+#. module: calendar_holiday
+#: view:wiz.assign.calendar.holiday:calendar_holiday.wiz_assign_calendar_holiday_view
+#: view:wiz.calculate.workable.festive:calendar_holiday.wiz_calculate_workable_festive_view
+msgid "Cancel"
+msgstr "Cancelar"
+

+ 40 - 0
migrations/8.0.1.2.0/post-migration.py

@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+# © 2016 Esther Martín - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+
+
+def assign_contract_in_partner_calendar(cr):
+    contracts = []
+    sql = ("SELECT c.id as contract_id, r.id as partner_id, "
+           "c.date_start, c.date_end "
+           "FROM   hr_contract c, res_partner r "
+           "where  c.employee_id = r.employee_id")
+    cr.execute(sql)
+    for contract in cr.fetchall():
+        vals = {'contract_id': contract[0],
+                'partner': contract[1],
+                'date_start': contract[2],
+                'date_end': contract[3]}
+        contracts.append(vals)
+    for contract in contracts:
+        if contract.get('date_end', False):
+            cr.execute(("UPDATE res_partner_calendar_day "
+                        "set contract = %s "
+                        "where partner = %s "
+                        "and   date >= '%s' "
+                        "and   date <= '%s'") %
+                       (contract.get('contract_id'), contract.get('partner'),
+                        contract.get('date_start'), contract.get('date_end')))
+        else:
+            cr.execute(("UPDATE res_partner_calendar_day "
+                        "set contract = %s "
+                        "where partner = %s "
+                        "and   date >= '%s'") %
+                       (contract.get('contract_id'), contract.get('partner'),
+                        contract.get('date_start')))
+
+
+def migrate(cr, version):
+    if not version:
+        return
+    assign_contract_in_partner_calendar(cr)

+ 7 - 0
models/__init__.py

@@ -0,0 +1,7 @@
+# -*- coding: utf-8 -*-
+# (c) 2016 Alfredo de la Fuente - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+from . import calendar_holiday
+from . import res_partner
+from . import hr_contract
+from . import hr_holidays

BIN=BIN
models/__init__.pyc


+ 28 - 0
models/calendar_holiday.py

@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# (c) 2016 Alfredo de la Fuente - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+from openerp import models, fields
+
+
+class CalendarHoliday(models.Model):
+    _name = 'calendar.holiday'
+    _description = 'Calendar holiday'
+
+    name = fields.Char(string='Description', required=True)
+    lines = fields.One2many(
+        comodel_name='calendar.holiday.day',
+        inverse_name='calendar_holiday', string='Holiday Days')
+
+
+class CalendarHolidayDay(models.Model):
+    _name = 'calendar.holiday.day'
+    _description = 'Calendar holiday lines'
+    _rec_name = 'date'
+    _order = 'date'
+
+    calendar_holiday = fields.Many2one(
+        comodel_name='calendar.holiday', string='Calendar',
+        ondelete='cascade')
+    date = fields.Date(string='Date')
+    absence_type = fields.Many2one(
+        comodel_name='hr.holidays.status', string='Absence Type')

BIN=BIN
models/calendar_holiday.pyc


+ 86 - 0
models/hr_contract.py

@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+# (c) 2016 Alfredo de la Fuente - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+from openerp import models, fields, api
+
+
+class HrContract(models.Model):
+    _name = 'hr.contract'
+    _inherit = ['hr.contract', 'mail.thread', 'ir.needaction_mixin']
+
+    holiday_calendars = fields.Many2many(
+        comodel_name='calendar.holiday', string='Calendarios de vacaciones')
+    partner = fields.Many2one(
+        comodel_name='res.partner', string='Empleado contratado',
+        related='employee_id.address_home_id', store=True)
+    calendar_days = fields.One2many(
+        comodel_name='res.partner.calendar.day', inverse_name='contract',
+        string='Días naturales del empleado')
+
+    @api.model
+    def create(self, vals):
+        contract = super(HrContract, self).create(vals)
+        if contract.partner:
+            contract.message_subscribe(contract.partner.ids)
+        return contract
+
+    @api.multi
+    def write(self, vals):
+        result = super(HrContract, self).write(vals)
+        for contract in self.filtered('partner'):
+            contract.message_subscribe(contract.partner.ids)
+        return result
+
+    @api.multi
+    def _generate_calendar_from_wizard(self, year):
+        holidays_obj = self.env['hr.holidays']
+        date_from = '{}-01-01'.format(year)
+        for contract in self:
+            contract.partner._generate_calendar(year)
+            if (contract.working_hours and
+                    contract.working_hours.attendance_ids):
+                contract.partner._put_estimated_hours_in_calendar(year,
+                                                                  contract)
+            if contract.holiday_calendars:
+                for calendar in contract.holiday_calendars:
+                    contract.partner._generate_festives_in_calendar(year,
+                                                                    calendar)
+            cond = [('employee_id', '=', contract.employee_id.id),
+                    ('type', '=', 'remove'),
+                    ('date_to', '>=', date_from),
+                    ('state', 'in', ('validate', 'validate1'))]
+            for holiday in holidays_obj.search(cond):
+                days = holiday._find_calendar_days_from_holidays()
+                days.write(self._prepare_partner_day_information(
+                    holiday.holiday_status_id.id))
+            self._put_contract_in_employee_calendar_day(year)
+
+    def _prepare_partner_day_information(self, absence_type):
+        return {'absence_type': absence_type}
+
+    def _put_contract_in_employee_calendar_day(self, year):
+        day_obj = self.env['res.partner.calendar.day']
+        date_from = '{}-01-01'.format(year)
+        date_to = '{}-12-31'.format(year)
+        cond = [('employee_id', '=', self.employee_id.id),
+                '|', ('date_end', '=', False), ('date_end', '>=', date_from)]
+        contracts = self.search(cond)
+        for contract in contracts:
+            cond = [('partner', '=', contract.partner.id),
+                    ('date', '>=', max(date_from, contract.date_start)),
+                    ('date', '<=', date_to if not contract.date_end else
+                     min(date_to, contract.date_end))]
+            days = day_obj.search(cond)
+            days.write({'contract': contract.id})
+
+    @api.multi
+    def automatic_process_generate_calendar(self):
+        contract_obj = self.env['hr.contract']
+        date_begin = '{}-01-01'.format(fields.Date.from_string(
+            fields.Date.today()).year)
+        cond = ['|', ('date_end', '=', False),
+                ('date_end', '>=', date_begin)]
+        contracts = contract_obj.search(cond)
+        for contract in contracts:
+            contract._generate_calendar_from_wizard(
+                fields.Date.from_string(fields.Date.today()).year)

BIN=BIN
models/hr_contract.pyc


+ 105 - 0
models/hr_holidays.py

@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+# (c) 2016 Alfredo de la Fuente - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+from openerp import models, fields, api
+from pytz import timezone, utc
+
+
+class HrHolidays(models.Model):
+    _inherit = 'hr.holidays'
+
+    @api.multi
+    def onchange_employee(self, employee_id, date_to, date_from):
+        res = super(HrHolidays, self).onchange_employee(employee_id)
+        val = self.onchange_date_from(date_to, date_from, employee_id)
+        if date_to and date_from:
+            res['value']['number_of_days_temp'] = (
+                val['value'].get('number_of_days_temp', False))
+        return res
+
+    @api.multi
+    def onchange_date_from(self, date_to, date_from, employee_id):
+        res = super(HrHolidays, self).onchange_date_from(date_to, date_from)
+        if date_from and not date_to:
+            date_to = res['value'].get('date_to', False)
+        if (date_from and date_to and employee_id and
+                res['value'].get('number_of_days_temp', False) > 0):
+            res['value']['number_of_days_temp'] = self._remove_holidays(
+                int(res['value'].get('number_of_days_temp')), date_to,
+                date_from, employee_id)
+        return res
+
+    @api.multi
+    def onchange_date_to(self, date_to, date_from, employee_id):
+        res = super(HrHolidays, self).onchange_date_to(date_to, date_from)
+        if (date_from and date_to and employee_id and
+                res['value'].get('number_of_days_temp', False) > 0):
+            res['value']['number_of_days_temp'] = self._remove_holidays(
+                int(res['value'].get('number_of_days_temp')), date_to,
+                date_from, employee_id)
+        return res
+
+    def _remove_holidays(self, days, date_to, date_from, employee_id):
+        employee = self.env['hr.employee'].browse(employee_id)
+        if not employee.address_home_id:
+            return days
+        date_to = fields.Date.to_string(
+            fields.Datetime.from_string(date_to).date())
+        date_from = fields.Date.to_string(
+            fields.Datetime.from_string(date_from).date())
+        cond = [('partner', '=', employee.address_home_id.id),
+                ('date', '>=', date_from),
+                ('date', '<=', date_to),
+                ('festive', '=', True)]
+        return days - len(self.env['res.partner.calendar.day'].search(cond))
+
+    @api.multi
+    def holidays_validate(self):
+        contract_obj = self.env['hr.contract']
+        res = super(
+            HrHolidays,
+            self.with_context(tracking_disable=True)).holidays_validate()
+        for holiday in self.filtered(lambda x: x.type == 'remove'):
+            days = holiday._find_calendar_days_from_holidays()
+            days.write(contract_obj._prepare_partner_day_information(
+                holiday.holiday_status_id.id))
+        return res
+
+    @api.multi
+    def holidays_refuse(self):
+        res = super(HrHolidays, self).holidays_refuse()
+        for holiday in self.filtered(lambda x: x.type == 'remove'):
+            days = holiday._find_calendar_days_from_holidays()
+            days.write({'absence_type': False})
+        return res
+
+    @api.multi
+    def _find_calendar_days_from_holidays(self):
+        calendar_day_obj = self.env['res.partner.calendar.day']
+        new_date = (fields.Datetime.from_string(self.date_from) if
+                    isinstance(self.date_from, str) else
+                    self.date_from)
+        new_date = new_date.replace(tzinfo=utc)
+        date_from = new_date.astimezone(
+            timezone(self.env.user.tz)).replace(tzinfo=None)
+        new_date = (fields.Datetime.from_string(self.date_to) if
+                    isinstance(self.date_to, str) else
+                    self.date_to)
+        new_date = new_date.replace(tzinfo=utc)
+        date_to = new_date.astimezone(
+            timezone(self.env.user.tz)).replace(tzinfo=None)
+        cond = [('partner', '=', self.employee_id.address_home_id.id),
+                ('date', '>=', date_from.date()),
+                ('date', '<=', date_to.date())]
+        days = calendar_day_obj.search(cond)
+        return days
+
+    @api.multi
+    def write(self, values):
+        if (('state' in values and values.get('state') == 'validate') or
+            ('manager_id' in values or 'manager_id2' in values or
+             'meeting_id' in values)):
+            return super(
+                HrHolidays,
+                self.with_context(tracking_disable=True)).write(values)
+        return super(HrHolidays, self).write(values)

BIN=BIN
models/hr_holidays.pyc


+ 173 - 0
models/res_partner.py

@@ -0,0 +1,173 @@
+# -*- coding: utf-8 -*-
+# (c) 2016 Alfredo de la Fuente - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+from openerp import models, fields, api, exceptions, _
+from dateutil.relativedelta import relativedelta
+
+
+class ResPartner(models.Model):
+    _inherit = 'res.partner'
+
+    def _generate_calendar(self, year):
+        calendar_obj = self.env['res.partner.calendar']
+        day_vals = []
+        start_date = fields.Date.from_string('{}-01-01'.format(year))
+        end_date = fields.Date.from_string('{}-12-31'.format(year))
+        while start_date <= end_date:
+            day_vals.append((0, 0, {'partner': self.id, 'date': start_date}))
+            start_date = (fields.Date.from_string(str(start_date)) +
+                          (relativedelta(days=1)))
+        cond = [('partner', '=', self.id),
+                ('year', '=', year)]
+        calendar = calendar_obj.search(cond, limit=1)
+        if calendar:
+            calendar.dates.unlink()
+            calendar.write({'dates': day_vals})
+        else:
+            calendar_vals = {
+                'partner': self.id,
+                'year': year,
+                'dates': day_vals,
+            }
+            calendar = calendar_obj.create(calendar_vals)
+        self._put_contract_in_partner_calendar_day(year)
+
+    def _put_contract_in_partner_calendar_day(self, year):
+        contract_obj = self.env['hr.contract']
+        date_begin = '{}-01-01'.format(year)
+        cond = [('type_id', '=',
+                 self.env.ref('hr_contract.hr_contract_type_emp').id),
+                ('employee_id', '=', self.employee_id.id),
+                '|', ('date_end', '=', False),
+                ('date_end', '>=', date_begin)]
+        contracts = contract_obj.search(cond)
+        for contract in contracts:
+            date_start = '{}-01-01'.format(year)
+            if contract.date_start > date_start:
+                date_start = contract.date_start
+            date_end = '{}-12-31'.format(year)
+            if contract.date_end and contract.date_end < date_end:
+                date_end = contract.date_end
+            cond = [('partner', '=', self.id),
+                    ('date', '>=', date_start),
+                    ('date', '<=', date_end)]
+            days = self.env['res.partner.calendar.day'].search(cond)
+            days.write({'contract': contract.id})
+
+    def _put_estimated_hours_in_calendar(self, year, contract):
+        partner_calendar_day_obj = self.env['res.partner.calendar.day']
+        for attendance in contract.working_hours.attendance_ids:
+            cond = [('partner', '=', contract.partner.id),
+                    ('year', '=', year),
+                    ('weekday', '=', attendance.dayofweek)]
+            if attendance.date_from:
+                cond.append(('date', '>=', attendance.date_from))
+            elif contract.date_start:
+                cond.append(('date', '>=', contract.date_start))
+            if contract.date_end:
+                cond.append(('date', '<=', contract.date_end))
+            else:
+                cond.append(('date', '<=', "{}-12-31".format(year)))
+            partner_calendar_days = partner_calendar_day_obj.search(cond)
+            if partner_calendar_days:
+                for day in partner_calendar_days:
+                    hours = attendance.hour_to - attendance.hour_from
+                    day.estimated_hours = day.estimated_hours + hours
+
+    def _generate_festives_in_calendar(self, year, calendar):
+        calendar_obj = self.env['res.partner.calendar']
+        calendar_day_obj = self.env['res.partner.calendar.day']
+        for line in calendar.lines:
+            date = fields.Datetime.from_string(line.date).date()
+            new_date = str(year) + '-' + str(date.month) + '-' + str(date.day)
+            cond = [('partner', '=', self.id),
+                    ('year', '=', year)]
+            partner_calendar = calendar_obj.search(cond, limit=1)
+            if not partner_calendar:
+                raise exceptions.Warning(
+                    _('The calendar %s was not found, for employee %s')
+                    % (str(year), self.name))
+            cond = [('partner', '=', self.id),
+                    ('date', '=', new_date)]
+            calendar_day = calendar_day_obj.search(cond, limit=1)
+            if not calendar_day:
+                raise exceptions.Warning(
+                    _('The day %s was not found in the calendar %s, for'
+                      ' employee %s') % (new_date, str(year), self.name))
+            calendar_day.write({'estimated_hours': 0,
+                                'festive': True,
+                                'absence_type': line.absence_type.id,
+                                'calendar_holiday_day': line.id,
+                                'absence_type_from_employee_contract':
+                                line.absence_type.id})
+
+
+class ResPartnerCalendar(models.Model):
+    _name = 'res.partner.calendar'
+    _inherit = ['mail.thread', 'ir.needaction_mixin']
+    _description = 'Employee calendar'
+    _rec_name = 'year'
+
+    partner = fields.Many2one(
+        comodel_name='res.partner', string='Partner', ondelete='cascade')
+    year = fields.Integer(string='Year', size=4)
+    dates = fields.One2many(
+        comodel_name='res.partner.calendar.day', inverse_name='calendar',
+        string='Calendar dates')
+
+    @api.model
+    def create(self, values):
+        res = super(ResPartnerCalendar, self).create(values)
+        if values.get('partner', False):
+            res.message_subscribe([values.get('partner')])
+        return res
+
+    @api.multi
+    def write(self, values):
+        res = super(ResPartnerCalendar, self).write(values)
+        if values.get('partner', False):
+            self.message_subscribe([values.get('partner')])
+        return res
+
+
+class ResPartnerCalendarDay(models.Model):
+    _name = 'res.partner.calendar.day'
+    _description = 'Employee calendar day'
+    _rec_name = 'date'
+
+    @api.depends('date')
+    def _compute_weekday(self):
+        for day in self:
+            date = fields.Date.from_string(day.date)
+            day.year = date.year
+            day.weekday = str(date.weekday())
+
+    calendar = fields.Many2one(
+        comodel_name='res.partner.calendar', string='Calendar',
+        ondelete='cascade')
+    partner = fields.Many2one(
+        comodel_name='res.partner', related='calendar.partner',
+        string='Partner', store=True, select=True)
+    date = fields.Date(string='Date', select=True)
+    year = fields.Integer(
+        string='year', compute='_compute_weekday', store=True)
+    weekday = fields.Selection(
+        [('0', 'Monday'),
+         ('1', 'Tuesday'),
+         ('2', 'Wednesday'),
+         ('3', 'Thursday'),
+         ('4', 'Friday'),
+         ('5', 'Saturday'),
+         ('6', 'Sunday')],
+        string='Weekday', compute='_compute_weekday', store=True)
+    contract = fields.Many2one(
+        comodel_name='hr.contract', string='Partner contract')
+    estimated_hours = fields.Float(string='Estimated hours', default=0.0)
+    real_hours = fields.Float(string='Real hours', default=0.0)
+    festive = fields.Boolean(string='Festive', default=False)
+    absence_type = fields.Many2one(
+        comodel_name='hr.holidays.status', string='Absence type')
+    absence_type_from_employee_contract = fields.Many2one(
+        comodel_name='hr.holidays.status', string='Absence type')
+    calendar_holiday_day = fields.Many2one(
+        comodel_name='calendar.holiday.day', string='Calendar holiday day')

BIN=BIN
models/res_partner.pyc


+ 10 - 0
security/ir.model.access.csv

@@ -0,0 +1,10 @@
+"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+"access_calendar_holiday_manager","calendar_holiday","calendar_holiday.model_calendar_holiday","base.group_hr_manager",1,1,1,1
+"access_calendar_holiday_day_manager","calendar_holiday_day","calendar_holiday.model_calendar_holiday_day","base.group_hr_manager",1,1,1,1
+"access_res_partner_calendar_manager","res_partner_calendar","calendar_holiday.model_res_partner_calendar","base.group_hr_manager",1,1,1,1
+"access_res_partner_calendar_day_manager","res_partner_calendar_day","calendar_holiday.model_res_partner_calendar_day","base.group_hr_manager",1,1,1,1
+"access_calendar_holiday_user","calendar_holiday","calendar_holiday.model_calendar_holiday","base.group_hr_user",1,0,0,0
+"access_calendar_holiday_day_user","calendar_holiday_day","calendar_holiday.model_calendar_holiday_day","base.group_hr_user",1,0,0,0
+"access_res_partner_calendar_user","res_partner_calendar","calendar_holiday.model_res_partner_calendar","base.group_hr_user",1,0,0,0
+"access_res_partner_calendar_day_user","res_partner_calendar_day","calendar_holiday.model_res_partner_calendar_day","base.group_hr_user",1,0,0,0
+

+ 4 - 0
tests/__init__.py

@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+# (c) 2016 Alfredo de la Fuente - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+from . import test_calendar_holiday

+ 181 - 0
tests/test_calendar_holiday.py

@@ -0,0 +1,181 @@
+# -*- coding: utf-8 -*-
+# © 2016 Alfredo de la Fuente - AvanzOSC
+# © 2016 Oihane Crucelaegui - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+
+import openerp.tests.common as common
+from openerp import fields, exceptions
+
+
+class TestCalendarHoliday(common.TransactionCase):
+
+    def setUp(self):
+        super(TestCalendarHoliday, self).setUp()
+        self.holiday_model = self.env['calendar.holiday']
+        self.contract_model = self.env['hr.contract']
+        self.calendar_model = self.env['res.partner.calendar']
+        self.calendar_day_model = self.env['res.partner.calendar.day']
+        self.wiz_model = self.env['wiz.calculate.workable.festive']
+        self.wiz_assign_model = self.env['wiz.assign.calendar.holiday']
+        self.holidays_model = self.env['hr.holidays']
+        self.today = fields.Date.from_string(fields.Date.today())
+        self.partner = self.env['res.partner'].create({
+            'name': 'Partner',
+        })
+        self.partner2 = self.env['res.partner'].create({
+            'name': 'Partner 2',
+        })
+        self.user = self.env['res.users'].create({
+            'partner_id': self.partner.id,
+            'login': 'user',
+            'password': 'pass',
+        })
+        employee_model = self.env['hr.employee']
+        employee_vals = {
+            'name': 'Test Employee',
+            'user_id': self.user.id,
+        }
+        employee_vals.update(
+            employee_model.onchange_user(
+                user_id=employee_vals['user_id'])['value'])
+        self.employee = employee_model.create(employee_vals)
+        calendar_line_vals = {
+            'date': self.today.replace(month=1, day=6),
+            'absence_type': self.ref('hr_holidays.holiday_status_comp'),
+        }
+        calendar_vals = {
+            'name': 'Holidays calendar',
+            'lines': [(0, 0, calendar_line_vals)],
+        }
+        self.calendar_holiday = self.holiday_model.create(calendar_vals)
+        contract_vals = {
+            'name': 'Test Employee Contract',
+            'date_start': self.today.replace(month=1, day=2),
+            'date_end': self.today.replace(month=12, day=30),
+            'employee_id': self.employee.id,
+            'wage': 500,
+            'working_hours': self.ref('resource.timesheet_group1'),
+            'holiday_calendars': [(6, 0, [self.calendar_holiday.id])],
+        }
+        self.contract = self.contract_model.create(contract_vals)
+        date_from = '{}-02-02 08:00:00'.format(self.today.year)
+        date_to = '{}-02-05 18:00:00'.format(self.today.year)
+        hr_holidays_vals = {'name': 'Employee holidays',
+                            'holiday_type': 'employee',
+                            'holiday_status_id':
+                            self.ref('hr_holidays.holiday_status_comp'),
+                            'employee_id': self.employee.id,
+                            'date_from': date_from,
+                            'date_to': date_to,
+                            'number_of_days_temp': 4}
+        self.hr_holidays = self.holidays_model.create(hr_holidays_vals)
+
+    def test_calendar_holiday(self):
+        self.contract.write({})
+        cond = [('partner', '=', self.contract.partner.id),
+                ('year', '=', self.today.year)]
+        calendar = self.calendar_model.search(cond)
+        self.assertEquals(len(calendar), 0)
+        wiz = self.wiz_model.with_context(
+            active_id=self.contract.id).create({'year': 2000})
+        with self.assertRaises(exceptions.Warning):
+            wiz.button_calculate_workables_and_festives()
+        wiz.year = self.today.year+5
+        with self.assertRaises(exceptions.Warning):
+            wiz.button_calculate_workables_and_festives()
+        wiz.year = 0
+        self.wiz_model.with_context(
+            active_id=self.contract.id).default_get([])
+        wiz.year = self.today.year
+        wiz.button_calculate_workables_and_festives()
+        self.wiz_model.with_context(
+            active_id=self.contract.id).default_get([])
+        self.assertEquals(
+            wiz.year, fields.Date.from_string(self.contract.date_start).year)
+        calendar = self.calendar_model.search(cond)
+        self.assertNotEquals(len(calendar), 0)
+        with self.assertRaises(exceptions.Warning):
+            self.partner2._generate_festives_in_calendar(self.today.year,
+                                                         self.calendar_holiday)
+        self.hr_holidays.signal_workflow('validate')
+        date_from = '{}-01-01'.format(self.today.year)
+        date_to = '{}-12-31'.format(self.today.year)
+        cond = [('date', '>=', date_from),
+                ('date', '<=', date_to),
+                ('absence_type', '=',
+                 self.ref('hr_holidays.holiday_status_comp')),
+                ('partner', '=', self.employee.address_home_id.id)]
+        days = self.calendar_day_model.search(cond)
+        self.assertEquals(
+            len(days), 5, 'Employee calendar holiday days not found(1)')
+        wiz.button_calculate_workables_and_festives()
+        days = self.calendar_day_model.search(cond)
+        self.assertEquals(
+            len(days), 5, 'Employee calendar holiday days not found(2)')
+        self.hr_holidays.signal_workflow('refuse')
+        days = self.calendar_day_model.search(cond)
+        self.assertEquals(
+            len(days), 1, 'Employee with holiday days')
+        wiz2 = self.wiz_model.with_context(active_id=self.contract.id).create(
+            {'year': fields.Date.from_string(self.contract.date_end).year})
+        wiz2.button_calculate_workables_and_festives()
+        date_from = str(fields.Datetime.from_string(
+            fields.Datetime.now()).replace(month=1, day=1))
+        vals = self.holidays_model.onchange_date_from(
+            False, date_from, self.employee.id)
+        date_to = str(fields.Datetime.from_string(
+            fields.Datetime.now()).replace(month=1, day=7))
+        date_from = str(fields.Datetime.from_string(
+            fields.Datetime.now()).replace(month=1, day=1))
+        vals = self.holidays_model.onchange_date_from(
+            date_to, date_from, self.employee.id)
+        days = int(vals['value'].get('number_of_days_temp'))
+        self.assertEqual(days, 6, 'Absent days(1) badly calculated')
+        vals = self.holidays_model.onchange_date_to(
+            date_to, date_from, self.employee.id)
+        days = int(vals['value'].get('number_of_days_temp'))
+        self.assertEqual(days, 6, 'Absent days(2) badly calculated')
+        vals = self.holidays_model.onchange_employee(
+            self.employee.id, date_to, date_from)
+        days = int(vals['value'].get('number_of_days_temp'))
+        self.assertEqual(days, 6, 'Absent days(3) badly calculated')
+        cond = [('calendar', '=', calendar.id),
+                ('partner', '=', self.partner.id),
+                ('date', '=', self.today.replace(month=1, day=6))]
+        self.calendar_day_model.search(cond, limit=1). unlink()
+        with self.assertRaises(exceptions.Warning):
+            self.partner._generate_festives_in_calendar(self.today.year,
+                                                        self.calendar_holiday)
+        self.employee.address_home_id = False
+        res = self.hr_holidays._remove_holidays(
+            20, False, False, self.employee.id)
+        self.assertEqual(res, 20, 'Bad days of employee without partner')
+
+    def test_calendar_holiday_calendar_Scheduler(self):
+        self.contract.write({
+            'date_start': self.today.replace(
+                year=self.today.year + 1, month=1, day=2),
+            'date_end': self.today.replace(
+                year=self.today.year + 1, month=12, day=30),
+        })
+        self.contract.automatic_process_generate_calendar()
+        cond = [('partner', '=', self.contract.partner.id)]
+        calendars = self.calendar_model.search(cond)
+        self.assertEquals(
+            len(calendars), 1, 'Calendar no generated for employee')
+
+    def test_wiz_assign_calendar_holiday(self):
+        cond = [('partner', '=', self.contract.partner.id)]
+        calendars = self.calendar_model.search(cond)
+        calendars.unlink()
+        wiz_vals = {
+            'calendar_holidays_ids': [(6, 0, self.calendar_holiday.ids)],
+            'calendar_year': self.today.year}
+        wiz = self.wiz_assign_model.create(wiz_vals)
+        c = self.contract.ids
+        wiz.with_context(
+            active_ids=c).button_assign_calendar_holiday_in_contracts()
+        cond = [('partner', '=', self.contract.partner.id),
+                ('year', '=', self.today.year)]
+        calendar = self.calendar_model.search(cond)
+        self.assertEquals(len(calendar), 1)

+ 43 - 0
views/calendar_holiday_day_view.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="calendar_holiday_day_tree_view" model="ir.ui.view">
+            <field name="name">calendar.holiday.day.tree.view</field>
+            <field name="model">calendar.holiday.day</field>
+            <field name="arch" type="xml">
+                <tree string="Calendar holiday days" editable="top">
+                    <field name="calendar_holiday" required="1"/>
+                    <field name="date" required="1"/>
+                    <field name="absence_type" required="1"/>
+                </tree>
+            </field>
+        </record>
+        <record id="calendar_holiday_day_search_view" model="ir.ui.view">
+            <field name="name">calendar.holiday.day.search.view</field>
+            <field name="model">calendar.holiday.day</field>
+            <field name="arch" type="xml">
+                <search string="Search calendar holiday day">
+                    <field name="calendar_holiday" />
+                    <field name="absence_type" />
+                    <group expand="0" string="Group By">
+                        <filter string="Calendar holiday"  domain="[]" context="{'group_by':'calendar_holiday'}"/>
+                        <filter string="Absence type" domain="[]" context="{'group_by':'absence_type'}"/>
+                        <filter string="year" domain="[]" context="{'group_by': 'date:year'}"/>
+                        <filter string="Month" domain="[]" context="{'group_by': 'date:month'}"/>
+                        <filter string="Week" domain="[]" context="{'group_by': 'date:week'}"/>
+                   </group>
+                </search>
+            </field>
+        </record>
+        <record id="action_calendar_holiday_day_view" model="ir.actions.act_window">
+            <field name="name">Calendar holiday days</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">calendar.holiday.day</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+        </record>
+        <menuitem id="calendar_holiday_day_option_view" name="Calendar holiday days"
+                  action="action_calendar_holiday_day_view" 
+                  parent="hr.menu_hr_configuration" sequence="81" />
+    </data>
+</openerp>

+ 59 - 0
views/calendar_holiday_view.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="calendar_holiday_tree_view" model="ir.ui.view">
+            <field name="name">calendar.holiday.tree.view</field>
+            <field name="model">calendar.holiday</field>
+            <field name="arch" type="xml">
+                <tree string="Calendar holiday">
+                    <field name="name" />
+                </tree>
+            </field>
+        </record>
+        <record id="calendar_holiday_search_view" model="ir.ui.view">
+            <field name="name">calendar.holiday.search.view</field>
+            <field name="model">calendar.holiday</field>
+            <field name="arch" type="xml">
+                <search string="Search calendar holiday">
+                    <field name="name" />
+                </search>
+            </field>
+        </record>
+       <record id="calendar_holiday_form_view" model="ir.ui.view">
+            <field name="name">calendar.holiday.form.view</field>
+            <field name="model">calendar.holiday</field>
+            <field name="arch" type="xml">
+                <form string="Calendar holiday">
+                    <sheet>
+                        <h1>
+                            <field name="name" required="1"/>
+                        </h1>
+                        <group name="body" colspan="4" >
+                            <group name="days" colspan="4">
+                                <separator string="Days" colspan="4" />
+                                <field name="lines" nolabel="1" colspan="4"
+                                        context="{'default_calendar_holiday': active_id}">
+                                    <tree string="Calendar holiday lines" editable="bottom">
+                                        <field name="calendar_holiday" invisible="1"/>
+                                        <field name="date" required="1"/>
+                                        <field name="absence_type" required="1"/>
+                                    </tree>
+                                </field>
+                            </group>
+                        </group>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+        <record id="action_calendar_holiday_view" model="ir.actions.act_window">
+            <field name="name">Calendar holidays</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">calendar.holiday</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+        </record>
+        <menuitem id="calendar_holiday_option_view" name="Calendar holidays"
+                  action="action_calendar_holiday_view" 
+                  parent="hr.menu_hr_configuration" sequence="80" />
+    </data>
+</openerp>

+ 58 - 0
views/hr_contract_view.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="hr_contract_view_tree_inh_calendarholiday" model="ir.ui.view">
+            <field name="name">hr.contract.view.tree.inh.calendarholiday</field>
+            <field name="model">hr.contract</field>
+            <field name="inherit_id" ref="hr_contract.hr_contract_view_tree"/>
+            <field name="arch" type="xml">
+                <field name="date_end" position="after">
+                    <field name="partner"/>
+                </field>
+            </field>
+        </record>
+        <record id="hr_contract_view_search_inh_calendarholiday" model="ir.ui.view">
+            <field name="name">hr.contract.view.search.inh.calendarholiday</field>
+            <field name="model">hr.contract</field>
+            <field name="inherit_id" ref="hr_contract.hr_contract_view_search"/>
+            <field name="arch" type="xml">
+                <field name="employee_id" position="after">
+                    <field name="partner"/>
+                </field>
+                <filter string="Employee" position="after">
+                    <filter string="Associated to" icon="terp-personal" domain="[]" context="{'group_by':'partner'}"/>
+                </filter>
+            </field>
+        </record>
+        <record id="hr_contract_view_form_inh_calendarholiday" model="ir.ui.view">
+            <field name="name">hr.contract.view.form.inh.calendarholiday</field>
+            <field name="model">hr.contract</field>
+            <field name="inherit_id" ref="hr_contract.hr_contract_view_form"/>
+            <field name="arch" type="xml">
+                <field name="type_id" position="after">
+                    <field name="partner" readonly="1"/>
+                </field>
+                <page string="Work Permit" position="after">
+                    <page string="Holiday calendars" attrs="{'invisible':[('partner','=',False)]}">
+                        <group colspan="4" col="10">
+                            <group colspan="10">
+                                <button name="%(action_calculate_workables_festives)d" type="action"
+                                    string="Calculate workables and festives in the calendar of the employee"/>
+                            </group>
+                            <group name ="holiday_calendars" colspan="10">
+                                <separator string="Holiday calendars" colspan="10" />
+                                <field name="holiday_calendars" nolabel="1" colspan="10" />
+                            </group>
+                        </group>
+                    </page>
+                </page>
+                <sheet position="after">
+                    <div class="oe_chatter">
+                        <field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
+                        <field name="message_ids" widget="mail_thread"/>
+                    </div>
+                </sheet>
+            </field>
+        </record>
+    </data>
+</openerp>

+ 38 - 0
views/hr_employee_view.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="view_employee_tree_inh_calendarholiday" model="ir.ui.view">
+            <field name="name">view.employee.tree.inh.calendarholiday</field>
+            <field name="model">hr.employee</field>
+            <field name="inherit_id" ref="hr.view_employee_tree"/>
+            <field name="arch" type="xml">
+                <field name="parent_id" position="after">
+                    <field name="address_home_id" string="Contract employee"/>
+                </field>
+            </field>
+        </record>
+        <record id="view_employee_filter_inh_calendarholiday" model="ir.ui.view">
+            <field name="name">view.employee.filter.inh.calendarholiday</field>
+            <field name="model">hr.employee</field>
+            <field name="inherit_id" ref="hr.view_employee_filter"/>
+            <field name="arch" type="xml">
+                <field name="name" position="after">
+                    <field name="address_home_id" string="Contract employee"/>
+                </field>
+                <filter string="Manager" position="after">
+                    <filter string="Contract employee" icon="terp-personal" domain="[]" context="{'group_by':'address_home_id'}"/>
+                </filter>
+            </field>
+        </record>
+        <record id="view_employee_form_inh_calendarholiday" model="ir.ui.view">
+            <field name="name">view.employee.form.inh.calendarholiday</field>
+            <field name="model">hr.employee</field>
+            <field name="inherit_id" ref="hr.view_employee_form"/>
+            <field name="arch" type="xml">
+                <field name="address_home_id" position="attributes">
+                    <attribute name="string">Partner</attribute>
+                </field>
+            </field>
+        </record>
+    </data>
+</openerp>

+ 21 - 0
views/hr_holidays_view.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="hr_holidays_form_view_inh_calendarholiday" model="ir.ui.view">
+            <field name="name">hr.holidays.form.view.inh.calendarholiday</field>
+            <field name="model">hr.holidays</field>
+            <field name="inherit_id" ref="hr_holidays.edit_holiday_new"/>
+            <field name="arch" type="xml">
+                <field name="date_from" position="attributes">
+                    <attribute name="on_change">onchange_date_from(date_to, date_from, employee_id)</attribute>
+                </field>
+                <field name="date_to" position="attributes">
+                    <attribute name="on_change">onchange_date_to(date_to, date_from, employee_id)</attribute>
+                </field>
+                <field name="employee_id" position="attributes">
+                    <attribute name="on_change">onchange_employee(employee_id, date_to, date_from)</attribute>
+                </field>
+            </field>
+        </record>
+    </data>
+</openerp>

+ 93 - 0
views/res_partner_calendar_day_view.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="res_partner_calendar_day_tree_view" model="ir.ui.view">
+            <field name="name">res.partner.calendar.day.tree.view</field>
+            <field name="model">res.partner.calendar.day</field>
+            <field name="arch" type="xml">
+                <tree string="Employee calendar days">
+                    <field name="partner" />
+                    <field name="calendar" />
+                    <field name="date" />
+                    <field name="contract" />
+                    <field name="festive" />
+                    <field name="absence_type" />
+                    <field name="estimated_hours"  widget="float_time" sum="Sum. estimated hours"/>
+                    <field name="real_hours"  widget="float_time" sum="Sum. real hours"/>
+                </tree>
+            </field>
+        </record>
+        <record id="res_partner_calendar_day_calendar_view" model="ir.ui.view">
+            <field name="name">res.partner.calendar.day.calendar.view</field>
+            <field name="model">res.partner.calendar.day</field>
+            <field name="arch" type="xml">
+                <calendar string="Employees days" color="absence_type" date_start="date">
+                    <field name="partner" />
+                    <field name="estimated_hours" />
+                    <field name="real_hours" />
+                </calendar>
+            </field>
+        </record>
+        <record id="res_partner_calendar_day_search_view" model="ir.ui.view">
+            <field name="name">res.partner.calendar.day.search.view</field>
+            <field name="model">res.partner.calendar.day</field>
+            <field name="arch" type="xml">
+                <search string="Search employee calendar day">
+                    <field name="partner" />
+                    <field name="calendar" />
+                    <field name="date" />
+                    <field name="contract" />
+                    <field name="festive" />
+                    <field name="absence_type" />
+                    <separator/>
+                    <filter string="Festive" domain="[('festive','=',True)]" name="my_festive_filter"/>
+                    <separator/>
+                    <group expand="0" string="Group By">
+                        <filter string="Partner" domain="[]" context="{'group_by':'partner'}"/>
+                        <filter string="Calendar" domain="[]" context="{'group_by':'calendar'}"/>
+                        <filter string="Contract" domain="[]" context="{'group_by':'contract'}"/>
+                        <filter string="Festive" domain="[]" context="{'group_by':'festive'}"/>
+                        <filter string="Absence type" domain="[]" context="{'group_by':'absence_type'}"/>
+                        <separator/>
+                        <filter string="year" domain="[]" context="{'group_by': 'date:year'}"/>
+                        <filter string="Month" domain="[]" context="{'group_by': 'date:month'}"/>
+                        <filter string="Week" domain="[]" context="{'group_by': 'date:week'}"/>
+                    </group>
+                </search>
+            </field>
+        </record>
+       <record id="res_partner_calendar_day_form_view" model="ir.ui.view">
+            <field name="name">res.partner.calendar.day.form.view</field>
+            <field name="model">res.partner.calendar.day</field>
+            <field name="arch" type="xml">
+                <form string="Employee calendar day">
+                    <sheet>
+                        <group name="head" colspan="4" col="8">
+                            <field name="partner" colspan="4" readonly="1" required="1" />
+                            <field name="calendar" readonly="1" required="1" />
+                            <field name="date"  readonly="1" required="1" />
+                        </group>
+                        <group name="body" colspan="4" >
+                            <field name="contract" />
+                            <field name="estimated_hours"  widget="float_time" />
+                            <field name="real_hours"  widget="float_time" />
+                            <field name="festive" />
+                            <field name="absence_type" />
+                        </group>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+        <record id="action_res_partner_calendar_day_view" model="ir.actions.act_window">
+            <field name="name">Employee calendar days</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">res.partner.calendar.day</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">calendar,tree,form</field>
+            <field name="domain">[('contract','!=',False)]</field>
+        </record>
+        <menuitem id="res_partner_calendar_day_option_view" name="Employee calendar days"
+                  action="action_res_partner_calendar_day_view" 
+                  parent="hr.menu_hr_main" sequence="86" />
+    </data>
+</openerp>

+ 74 - 0
views/res_partner_calendar_view.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="res_partner_calendar_tree_view" model="ir.ui.view">
+            <field name="name">res.partner.calendar.tree.view</field>
+            <field name="model">res.partner.calendar</field>
+            <field name="arch" type="xml">
+                <tree string="Employee calendar">
+                    <field name="partner" />
+                    <field name="year" />
+                    <field name="dates" />
+                </tree>
+            </field>
+        </record>
+        <record id="res_partner_calendar_search_view" model="ir.ui.view">
+            <field name="name">res.partner.calendar.search.view</field>
+            <field name="model">res.partner.calendar</field>
+            <field name="arch" type="xml">
+                <search string="Search employee calendar">
+                    <field name="partner" />
+                    <field name="year" />
+                    <group expand="0" string="Group By">
+                        <filter string="Partner" domain="[]" context="{'group_by':'partner'}"/>
+                        <filter string="Year" domain="[]" context="{'group_by':'year'}"/>
+                    </group>
+                </search>
+            </field>
+        </record>
+       <record id="res_partner_calendar_form_view" model="ir.ui.view">
+            <field name="name">res.partner.calendar.form.view</field>
+            <field name="model">res.partner.calendar</field>
+            <field name="arch" type="xml">
+                <form string="Employee calendar">
+                    <sheet>
+                        <group name="head" colspan="4" col="6">
+                            <field name="partner" required="1" colspan="4"/>
+                            <field name="year" required="1" colspan="2" />
+                        </group>
+                        <group name="body" colspan="4" >
+                            <separator string="Days" colspan="4" />
+                            <field name="dates" nolabel="1" colspan="4"
+                                    context="{'default_calendar': active_id}">
+                                <tree string="Employee calendar days">
+                                    <field name="partner" invisible="1"/>
+                                    <field name="calendar" invisible="1"/>
+                                    <field name="date" />
+                                    <field name="festive" />
+                                    <field name="contract" />
+                                    <field name="estimated_hours"  widget="float_time" sum="Sum. estimated hours"/>
+                                    <field name="real_hours"  widget="float_time" sum="Sum. real hours"/>
+                                    <field name="absence_type" />
+                                </tree>
+                            </field>
+                        </group>
+                    </sheet>
+                    <div class="oe_chatter">
+                        <field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
+                        <field name="message_ids" widget="mail_thread"/>
+                    </div>
+                </form>
+            </field>
+        </record>
+        <record id="action_res_partner_calendar_view" model="ir.actions.act_window">
+            <field name="name">Employee calendar</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">res.partner.calendar</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+        </record>
+        <menuitem id="res_partner_calendar_option_view" name="Employee calendar"
+                  action="action_res_partner_calendar_view" 
+                  parent="hr.menu_hr_main" sequence="85" />
+    </data>
+</openerp>

+ 6 - 0
wizard/__init__.py

@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+# For copyright and license notices, see __openerp__.py file in root directory
+##############################################################################
+from . import wiz_calculate_workable_festive
+from . import wiz_assign_calendar_holiday

BIN=BIN
wizard/__init__.pyc


+ 21 - 0
wizard/wiz_assign_calendar_holiday.py

@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# (c) 2018 Eider Oyarbide - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+from openerp import api, fields, models
+
+
+class WizAssignCalendarHoliday(models.TransientModel):
+    _name = 'wiz.assign.calendar.holiday'
+
+    calendar_holidays_ids = fields.Many2many(comodel_name="calendar.holiday",
+                                             string="Assign holidays")
+    calendar_year = fields.Integer(string="Generate calendar for year",
+                                   required="true")
+
+    @api.multi
+    def button_assign_calendar_holiday_in_contracts(self):
+        for contract in self.env['hr.contract'].browse(
+                self.env.context.get('active_ids')):
+            contract.holiday_calendars = [
+                (6, 0, self.calendar_holidays_ids.ids)]
+            contract._generate_calendar_from_wizard(self.calendar_year)

BIN=BIN
wizard/wiz_assign_calendar_holiday.pyc


+ 29 - 0
wizard/wiz_assign_calendar_holiday_view.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data>
+        <record model="ir.ui.view" id="wiz_assign_calendar_holiday_view">
+            <field name="name">wiz.assign.calendar.holiday.view</field>
+            <field name="model">wiz.assign.calendar.holiday</field>
+            <field name="arch" type="xml">
+                <form string="Wizard for assign calendar holidays in employee contract" version="7.0">
+                    <group colspan="4">
+                        <field name="calendar_year" colspan="4"/>
+                        <separator string="Calendar Holidays" colspan="4"/>
+                        <field name="calendar_holidays_ids" nolabel="1"/>
+                    </group>
+                    <footer>
+                        <button name="button_assign_calendar_holiday_in_contracts" type="object"
+                                string="Assign calendar" class="oe_highlight" />
+                        or
+                        <button string="Cancel" class="oe_link"
+                                special="cancel" />
+                    </footer>
+                </form>
+            </field>
+        </record>
+        <act_window id="action_assign_calendar_contracts"
+            key2="client_action_multi" name="Assign calendar in contracts"
+            res_model="wiz.assign.calendar.holiday" src_model="hr.contract"
+            view_mode="form" target="new" />
+    </data>
+</openerp>

+ 47 - 0
wizard/wiz_calculate_workable_festive.py

@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+# (c) 2016 Alfredo de la Fuente - AvanzOSC
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+from openerp import models, fields, api, exceptions, _
+
+
+class WizCalculateWorkableFestive(models.TransientModel):
+    _name = 'wiz.calculate.workable.festive'
+    _description = 'Wizard for calculate workables and festives'
+
+    year = fields.Integer(
+        string='Employee calendar year', size=4, required=True)
+
+    @api.model
+    def default_get(self, var_fields):
+        partner_calendar_obj = self.env['res.partner.calendar']
+        res = super(WizCalculateWorkableFestive, self).default_get(var_fields)
+        contract = self.env['hr.contract'].browse(
+            self.env.context['active_id'])
+        year_begin = fields.Datetime.from_string(contract.date_start).year
+        cond = [('partner', '=', contract.partner.id),
+                ('year', '=', year_begin)]
+        calendar = partner_calendar_obj.search(cond, limit=1)
+        if not calendar:
+            res.update({'year': year_begin})
+        else:
+            if contract.date_end:
+                year_end = fields.Datetime.from_string(contract.date_end).year
+                if year_begin == year_end:
+                    res.update({'year': year_begin})
+        return res
+
+    @api.multi
+    def button_calculate_workables_and_festives(self):
+        self.ensure_one()
+        contract = self.env['hr.contract'].browse(
+            self.env.context['active_id'])
+        date_begin = fields.Date.from_string(contract.date_start)
+        if self.year < date_begin.year:
+            raise exceptions.Warning(
+                _('Year introduced less than year contract beginning'))
+        if contract.date_end:
+            date_end = fields.Datetime.from_string(contract.date_end)
+            if self.year > date_end.year:
+                raise exceptions.Warning(
+                    _('Year introduced more than year end contract'))
+        contract._generate_calendar_from_wizard(self.year)

BIN=BIN
wizard/wiz_calculate_workable_festive.pyc


+ 32 - 0
wizard/wiz_calculate_workable_festive_view.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data>
+        <record model="ir.ui.view" id="wiz_calculate_workable_festive_view">
+            <field name="name">wiz.calculate.workable.festive.view</field>
+            <field name="model">wiz.calculate.workable.festive</field>
+            <field name="arch" type="xml">
+                <form string="Wizard for calculate workable and festive days in the calendar of the employee" version="7.0">
+                    <group>
+                        <field name="year" string="Employee calendar year"/>
+                    </group>    
+                    <footer>
+                        <button name="button_calculate_workables_and_festives" type="object" 
+                                string="Calculate" class="oe_highlight" />
+                        or
+                        <button string="Cancel" class="oe_link"
+                                special="cancel" />
+                    </footer>
+                </form>
+            </field>
+        </record>
+        <record model="ir.actions.act_window" id="action_calculate_workables_festives">
+            <field name="name">Wizard for calculate workable and festive days in the calendar of the employee</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">wiz.calculate.workable.festive</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">form</field>
+            <field name="target">new</field>
+            <field name="view_id" ref="wiz_calculate_workable_festive_view"/>
+        </record>
+    </data>
+</openerp>