hr_contract.py 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. # -*- coding: utf-8 -*-
  2. # (c) 2016 Alfredo de la Fuente - AvanzOSC
  3. # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
  4. from openerp import models, fields, api
  5. class HrContract(models.Model):
  6. _name = 'hr.contract'
  7. _inherit = ['hr.contract', 'mail.thread', 'ir.needaction_mixin']
  8. holiday_calendars = fields.Many2many(
  9. comodel_name='calendar.holiday', string='Calendarios de vacaciones')
  10. partner = fields.Many2one(
  11. comodel_name='res.partner', string='Empleado contratado',
  12. related='employee_id.address_home_id', store=True)
  13. calendar_days = fields.One2many(
  14. comodel_name='res.partner.calendar.day', inverse_name='contract',
  15. string='Días naturales del empleado')
  16. @api.model
  17. def create(self, vals):
  18. contract = super(HrContract, self).create(vals)
  19. if contract.partner:
  20. contract.message_subscribe(contract.partner.ids)
  21. return contract
  22. @api.multi
  23. def write(self, vals):
  24. result = super(HrContract, self).write(vals)
  25. for contract in self.filtered('partner'):
  26. contract.message_subscribe(contract.partner.ids)
  27. return result
  28. @api.multi
  29. def _generate_calendar_from_wizard(self, year):
  30. holidays_obj = self.env['hr.holidays']
  31. date_from = '{}-01-01'.format(year)
  32. for contract in self:
  33. contract.partner._generate_calendar(year)
  34. if (contract.working_hours and
  35. contract.working_hours.attendance_ids):
  36. contract.partner._put_estimated_hours_in_calendar(year,
  37. contract)
  38. if contract.holiday_calendars:
  39. for calendar in contract.holiday_calendars:
  40. contract.partner._generate_festives_in_calendar(year,
  41. calendar)
  42. cond = [('employee_id', '=', contract.employee_id.id),
  43. ('type', '=', 'remove'),
  44. ('date_to', '>=', date_from),
  45. ('state', 'in', ('validate', 'validate1'))]
  46. for holiday in holidays_obj.search(cond):
  47. days = holiday._find_calendar_days_from_holidays()
  48. days.write(self._prepare_partner_day_information(
  49. holiday.holiday_status_id.id))
  50. self._put_contract_in_employee_calendar_day(year)
  51. def _prepare_partner_day_information(self, absence_type):
  52. return {'absence_type': absence_type}
  53. def _put_contract_in_employee_calendar_day(self, year):
  54. day_obj = self.env['res.partner.calendar.day']
  55. date_from = '{}-01-01'.format(year)
  56. date_to = '{}-12-31'.format(year)
  57. cond = [('employee_id', '=', self.employee_id.id),
  58. '|', ('date_end', '=', False), ('date_end', '>=', date_from)]
  59. contracts = self.search(cond)
  60. for contract in contracts:
  61. cond = [('partner', '=', contract.partner.id),
  62. ('date', '>=', max(date_from, contract.date_start)),
  63. ('date', '<=', date_to if not contract.date_end else
  64. min(date_to, contract.date_end))]
  65. days = day_obj.search(cond)
  66. days.write({'contract': contract.id})
  67. @api.multi
  68. def automatic_process_generate_calendar(self):
  69. contract_obj = self.env['hr.contract']
  70. date_begin = '{}-01-01'.format(fields.Date.from_string(
  71. fields.Date.today()).year)
  72. cond = ['|', ('date_end', '=', False),
  73. ('date_end', '>=', date_begin)]
  74. contracts = contract_obj.search(cond)
  75. for contract in contracts:
  76. contract._generate_calendar_from_wizard(
  77. fields.Date.from_string(fields.Date.today()).year)