1
# -*- encoding: utf-8 -*-
2
##############################################################################
4
# OpenERP, Open Source Management Solution
5
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
8
# This program is free software: you can redistribute it and/or modify
9
# it under the terms of the GNU General Public License as published by
10
# the Free Software Foundation, either version 3 of the License, or
11
# (at your option) any later version.
13
# This program is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
# GNU General Public License for more details.
18
# You should have received a copy of the GNU General Public License
19
# along with this program. If not, see <http://www.gnu.org/licenses/>.
21
##############################################################################
23
from osv import osv, fields
29
class hr_employee_estudios(osv.osv):
30
_name = 'hr.employee.estudios'
31
_description = 'Estudios que posee el empleado'
33
'descripcion': fields.text("Descripción"),
34
'empleado': fields.many2one('hr.employee', 'Empleado', ondelete='cascade'),
37
hr_employee_estudios()
39
class hr_employee_experiencia(osv.osv):
40
_name = 'hr.employee.experiencia'
41
_description = 'Experiencia que posee el empleado'
43
'descripcion': fields.text("Descripción"),
44
'empleado': fields.many2one('hr.employee', 'Empleado', ondelete='cascade'),
47
hr_employee_experiencia()
49
class hr_department(osv.osv):
50
_inherit = "hr.department"
52
# 'miembros_ids': fields.many2many('hr.employee', 'sg_formacion_department_employee_rel', 'department_id', 'employee_id', 'Miembros'),
53
# 'director_id': fields.many2one('hr.employee', 'Director'),
54
'empleado_ids': fields.one2many('sg.formacion.department.employee','departamento_id', 'Empleados del departamento'),
59
class sg_formacion_plan_anual(osv.osv):
60
_name = 'sg.formacion.plan.anual'
61
_description = 'Plan Anual de Formación'
63
'name' : fields.char("Nombre", size=145),
64
'ano': fields.char("Año", size=5, required=True),
65
'aprobado': fields.boolean('¿Aprobado?', help="¿Ha sido aprobado el plan anual?"),
66
'fecha_aprobacion': fields.date('Fecha de Aprobación'),
67
'responsable_aprobacion': fields.char("Responsable de la Aprobación", size=445),
68
'observaciones': fields.text('Notas'),
69
'registros_ids': fields.one2many('sg.formacion.plan.anual.registro', 'plan_anual_id', 'Cursos de Formación del Plan'),
70
'user_id': fields.many2one('res.users','Usuario', readonly=True),
74
'ano': lambda *a: time.strftime('%Y'),
75
'aprobado': lambda *a: False,
76
'user_id': lambda self, cr, uid, context: uid,
79
sg_formacion_plan_anual()
81
class sg_formacion_plan_anual_registro(osv.osv):
82
_name = 'sg.formacion.plan.anual.registro'
83
_description = 'Registros del Plan Anual de Formación'
85
'curso': fields.char("Curso", size=445, required=True, help="Nombre del curso de formación planeado."),
86
'duracion': fields.integer('Duración', help="Duración del curso (en horas)."),
87
'impartido': fields.char("Impartido por", size=445, help="Persona o personas que impartirán el curso."),
88
'destinatario': fields.char("Destinatario", size=445, help="Persona o colectivo a los que va dirigido el curso"),
89
#el destinatario puede ser un empleado o un departamento ¿enlazar?
90
'fecha_inicio': fields.date("Fecha de Inicio Prevista"),
91
'tipo': fields.selection([("I","Planificación inicial"),("A","Ampliación de la planificación")],"Momento de la Planificación"),
92
'tematica': fields.char("Temática del curso", size=445, required=True, help="Temática sobre la que versará el curso."),
93
'plan_anual_id': fields.many2one('sg.formacion.plan.anual', 'Plan Anual de Formación', required=True, ondelete='cascade'),
94
'state': fields.selection([('planeada','Planeada'),('realizada','Realizada')],'Estado', select=True, readonly=True),
95
'registro_ids': fields.one2many('sg.formacion.registro', 'registro_id', 'Registros de formación creados a partir del curso planeado'),
99
'tipo': lambda *a: 'I',
100
'state': lambda *a: 'planeada',
103
sg_formacion_plan_anual_registro()
105
class sg_formacion_perfil_puesto(osv.osv):
106
_name = 'sg.formacion.perfil.puesto'
107
_description = 'Perfil de puestos de trabajo'
109
'name': fields.char("Nombre del puesto", size=145, required=True),
110
'dependencia': fields.many2one('sg.formacion.perfil.puesto', 'Dependencia', help="Puesto del cual depende el actual."),
111
# 'departamento': fields.char("Departamento", size=45),
112
'aprobado': fields.boolean('¿Aprobado?', help="¿Ha sido aprobado?"),
113
'fecha_aprobacion': fields.date('Fecha de Aprobación'),
114
'responsable_aprobacion': fields.char("Responsable de la Aprobación", size=445),
115
'notas': fields.text('Notas'),
116
'departamento': fields.many2one('hr.department', 'Departamento', help="Departamento al que pertenece el perfil de puesto"),
117
#'empleados_ids': fields.many2many('hr.employee', 'sg_formacion_perfil_employee_rel', 'perfil_puesto_id', 'employee_id', 'Empleados que están o estuvieron en el puesto'),
118
'fun_ids': fields.one2many('sg.formacion.perfil.puesto.fun', 'perfil_puesto_id', 'Funciones del Puesto'),
119
'formacion_necesaria_ids': fields.one2many('sg.formacion.perfil.puesto.formacion.necesaria', 'perfil_puesto_id', 'Requisitos de Formación Necesarios'),
120
'formacion_adicional_ids': fields.one2many('sg.formacion.perfil.puesto.formacion.adicional', 'perfil_puesto_id', 'Requisitos de Formación Adicionales'),
121
'experiencia_ids': fields.one2many('sg.formacion.perfil.puesto.experiencia', 'perfil_puesto_id', 'Requisitos de Experiencia'),
122
'empleado_ids': fields.one2many('sg.formacion.perfil.employee','perfil_id', 'Empleados que desempeñan el puesto o lo hicieron.'),
125
sg_formacion_perfil_puesto()
127
class sg_formacion_perfil_puesto_fun(osv.osv):
128
_name = 'sg.formacion.perfil.puesto.fun'
129
_description = 'Funciones del puesto de trabajo'
131
'descripcion': fields.char("Descripción de la función", size=445, help="Descripción de la función a realizar en el puesto de trabajo"),
132
'perfil_puesto_id': fields.many2one('sg.formacion.perfil.puesto', 'Perfil del Puesto', ondelete='cascade'),
135
sg_formacion_perfil_puesto_fun()
137
class sg_formacion_perfil_puesto_formacion_necesaria(osv.osv):
138
_name = 'sg.formacion.perfil.puesto.formacion.necesaria'
139
_description = 'Formación necesaria en el puesto de trabajo'
141
'descripcion': fields.char("Descripción de la formación necesaria", size=445, help="Descripción de la formación necesaria en el puesto de trabajo"),
142
'perfil_puesto_id': fields.many2one('sg.formacion.perfil.puesto', 'Perfil del Puesto', ondelete='cascade'),
145
sg_formacion_perfil_puesto_formacion_necesaria()
147
class sg_formacion_perfil_puesto_formacion_adicional(osv.osv):
148
_name = 'sg.formacion.perfil.puesto.formacion.adicional'
149
_description = 'Formación adicional en el puesto de trabajo'
151
'descripcion': fields.char("Descripción de la formación adicional", size=445, help="Descripción de la formación adicional conveniente para el puesto de trabajo"),
152
'perfil_puesto_id': fields.many2one('sg.formacion.perfil.puesto', 'Perfil del Puesto', ondelete='cascade'),
155
sg_formacion_perfil_puesto_formacion_adicional()
157
class sg_formacion_perfil_puesto_experiencia(osv.osv):
158
_name = 'sg.formacion.perfil.puesto.experiencia'
159
_description = 'Experiencia necesaria para el puesto de trabajo'
161
'descripcion': fields.char("Descripción de la experiencia", size=445, help="Descripción de la experiencia necesaria en el puesto de trabajo"),
162
'perfil_puesto_id': fields.many2one('sg.formacion.perfil.puesto', 'Perfil del Puesto', ondelete='cascade'),
165
sg_formacion_perfil_puesto_experiencia()
167
class sg_formacion_registro(osv.osv):
169
def _valoracion_media(self, cr, uid, ids, field_name, arg, context={}):
171
for sg_formacion_registro in self.browse(cr,uid,ids):
175
for sg_formacion_registro_employee in sg_formacion_registro.empleado_ids:
176
val1 = sg_formacion_registro_employee.valoracion_objetivos
177
val2 = sg_formacion_registro_employee.valoracion_conocimientos
179
val = (float(val1)+float(val2))/2
183
res[sg_formacion_registro.id] = 0
185
res[sg_formacion_registro.id] = media / numemp
188
def _valoracion_media_responsable(self, cr, uid, ids, field_name, arg, context={}):
190
for sg_formacion_registro in self.browse(cr,uid,ids):
194
for sg_formacion_registro_employee in sg_formacion_registro.empleado_ids:
195
val = sg_formacion_registro_employee.valoracion_res_alum
201
res[sg_formacion_registro.id] = 0
203
res[sg_formacion_registro.id] = media / numemp
206
_name = 'sg.formacion.registro'
207
_description = 'Curso'
209
'name': fields.char("Denominación del curso", size=145, required=True),
210
'descripcion': fields.char("Descripción de la formación", size=445, help="Descripción de la formación"),
211
'duracion': fields.integer('Duración (Horas)', help="Duración del curso (en horas)."),
212
'fecha_inicio': fields.date("Fecha de Inicio"),
213
'fecha_fin': fields.date("Fecha de Fin"),
214
'tipo': fields.selection([("I","Interna (impartida por personal de la empresa)"),("E","Externa (impartida por personal ajeno a la empresa)")], "Tipo", required=True, help="INTERNA:impartida por personal de la empresa o EXTERNA:impartida por personal ajeno a la empresa."),
215
'impartido': fields.char("Docente (será personal ajeno a la empresa al ser el curso de tipo Externo)", size=445, help="Persona o personas que impartirán el curso."),
216
'empleado_profesor_id': fields.many2one('hr.employee', 'Docente (será un empleado al ser el curso de tipo Interno)', help="Persona o personas que impartirán el curso."),
217
'lugar': fields.char("Lugar", size=445, help="Lugar donde se realizará la formación."),
218
#'empleado_ids': fields.many2many('hr.employee', 'sg_formacion_registro_employee_rel', 'registro_id', 'employee_id', 'Alumnos'),
219
'observaciones': fields.text('Observaciones'),
220
'valoracion_total': fields.function(_valoracion_media, method=True, string='Valoración media del curso por los alumnos (0-10)', digits=(4,2), type='float', readonly=True),
221
'valoracion_observaciones': fields.text('Notas sobre la Valoración', help="Comentario sobre satisfacción y valoración general del curso."),
222
'responsable_valoracion': fields.char("Responsable de la Valoración del Curso", size=445),
223
# 'valoracion_responsable': fields.integer("Valoración global del curso por el responsable (0-10)"),
224
'valoracion_responsable': fields.function(_valoracion_media_responsable, method=True, string='Valoración global del curso por el responsable (0-10)', digits=(4,2), type='float', readonly=True),
225
'empleado_ids': fields.one2many('sg.formacion.registro.employee', 'registro_id', 'Valoración de los cursos por los alumnos'),
226
'registro_id': fields.many2one('sg.formacion.plan.anual.registro', 'Registro del plan anual del que procede'),
230
'tipo': lambda *a: 'I',
233
sg_formacion_registro()
235
class hr_employee(osv.osv):
236
_inherit = "hr.employee"
238
#'formacion_ids': fields.many2many('sg.formacion.registro', 'sg_formacion_registro_employee_rel', 'employee_id', 'registro_id', 'Alumnos'),
239
#'departamentos_ids': fields.many2many('hr.department', 'sg_formacion_department_employee_rel', 'employee_id', 'department_id', 'Pertenece o ha pertenecido a los departamentos'),
240
#'perfiles_ids': fields.many2many('sg.formacion.perfil.puesto', 'sg_formacion_perfil_employee_rel', 'employee_id', 'perfil_puesto_id', 'Perfiles de Puestos Desempeñados'),
241
'dni': fields.char("DNI", size=32),
242
'contratacion_ids': fields.one2many('sg.formacion.contratacion','empleado_id', 'Periodos de alta en la empresa'),
243
'estudios': fields.one2many('hr.employee.estudios', 'empleado', 'Estudios'),
244
'experiencia': fields.one2many('hr.employee.experiencia', 'empleado', 'Experiencia'),
245
'registro_ids': fields.one2many('sg.formacion.registro.employee','empleado_id', 'Valoración de los cursos por los alumnos'),
246
# 'departamento_ids': fields.one2many('sg.formacion.department.employee','empleado_id', 'Departamentos a los que pertenece'),
247
'perfil_ids': fields.one2many('sg.formacion.perfil.employee','empleado_id', 'Perfiles de puesto a los que pertenece o ha pertenecido.'),
252
class sg_formacion_contratacion(osv.osv):
253
_name = 'sg.formacion.contratacion'
255
'empleado_id': fields.many2one('hr.employee', 'Empleado'),
256
'alta': fields.date("Fecha de Alta"),
257
'baja': fields.date("Fecha de Baja"),
261
'alta': lambda *a: time.strftime('%Y-%m-%d'),
264
sg_formacion_contratacion()
267
class sg_formacion_registro_employee(osv.osv):
268
_name = 'sg.formacion.registro.employee'
270
'empleado_id': fields.many2one('hr.employee', 'Empleado', required=True, ondelete='cascade'),
271
'registro_id': fields.many2one('sg.formacion.registro', 'Curso', required=True, ondelete='cascade'),
272
#'valoracion_res_alum': fields.integer("Valoración numérica del alumno por parte del responsable (0-10)"),
273
'valoracion_res_alum': fields.selection([("0","0"),("1","1"),("2","2"),("3","3"),("4","4"),("5","5"),("6","6"),("7","7"),("8","8"),("9","9"),("10","10")],"Valoración numérica del alumno por parte del responsable (0-10)"),
274
'fecha': fields.date('Fecha'),
275
'valoracion_objetivos': fields.selection([("0","0"),("1","1"),("2","2"),("3","3"),("4","4"),("5","5"),("6","6"),("7","7"),("8","8"),("9","9"),("10","10")],"¿Se han conseguido los objetivos del curso? Respuesta del Alumno (0-10)"),
276
'valoracion_conocimientos': fields.selection([("0","0"),("1","1"),("2","2"),("3","3"),("4","4"),("5","5"),("6","6"),("7","7"),("8","8"),("9","9"),("10","10")],"¿Nivel de conocimientos adquiridos? Respuesta del Alumno (0-10)"),
280
'fecha': lambda *a: time.strftime('%Y-%m-%d'),
283
def create(self, cr, uid, vals, context={}):
285
return super(sg_formacion_registro_employee, self).create(cr, uid, vals, context)
287
sg_formacion_registro_employee()
289
class sg_formacion_department_employee(osv.osv):
290
#_inherit = "sg.formacion.department.employee.rel"
291
_name = 'sg.formacion.department.employee'
293
'empleado_id': fields.many2one('hr.employee', 'Empleado'),
294
'departamento_id': fields.many2one('hr.department', 'Departamento'),
295
'fecha_inicio': fields.date("Fecha de Inicio"),
296
'fecha_fin': fields.date("Fecha de Fin"),
299
sg_formacion_department_employee()
301
class sg_formacion_perfil_employee(osv.osv):
302
#_inherit = "sg.formacion.perfil.employee.rel"
303
_name = 'sg.formacion.perfil.employee'
305
'empleado_id': fields.many2one('hr.employee', 'Empleado'),
306
'perfil_id': fields.many2one('sg.formacion.perfil.puesto', 'Perfil de Puesto'),
307
'fecha_inicio': fields.date("Fecha de Inicio"),
308
'fecha_fin': fields.date("Fecha de Fin"),
311
sg_formacion_perfil_employee()
314
class ejecutar_formacion_planeada(osv.osv_memory):
315
_name = 'ejecutar.formacion.planeada'
316
_description = 'Ejecutar formación planeada'
319
'type': fields.selection([('I','Interna (impartida por personal de la empresa)'),
320
('E','Externa (impartida por personal ajeno a la empresa)')], 'Tipo de Formación'),
324
'type': lambda *a:'I',
327
def crear_y_abrir_registro_formacion(self, cr, uid, ids, context):
329
pool_obj = pooler.get_pool(cr.dbname)
330
obj_plan_registro = pool_obj.get('sg.formacion.plan.anual.registro')
331
# lanzo una excepción si se intenta crear un curso de formación sin haber guardado antes el registro del plan anual del cual procede
332
if not context['record_id']:
333
# raise wizard.except_wizard(('Warning'), ('Debe guardarse el registro del plan anual de formación\nantes de crear un curso a partir de él.'))
334
return {'type':'ir.actions.act_window_close'}
335
data_plan_registro = obj_plan_registro.browse(cr, uid, context['record_id'], context=context)
336
registro = pool_obj.get('sg.formacion.registro')
337
tipo = self.browse(cr, uid, ids[0]).type
338
clave = registro.create(cr, uid, {
339
'name': data_plan_registro.curso,
340
'descripcion': data_plan_registro.tematica,
341
'duracion': data_plan_registro.duracion,
343
'registro_id': data_plan_registro.id,
344
'fecha_inicio': time.strftime('%Y-%m-%d'),
346
idregistro = registro.search(cr, uid, [('id','=',clave)])
347
# netsvc.Logger().notifyChannel('sg.formacion.registro', netsvc.LOG_INFO, '%s/n'%idregistro)
348
pool_obj = pooler.get_pool(cr.dbname)
349
# ahora tengo que poner como realizado el registro del plan anual que acabo de convertir en curso real
350
obj_plan_registro.write(cr, uid, data_plan_registro.id, {'state':'realizada'})
351
model_data_ids = pool_obj.get('ir.model.data').search(cr,uid,[('model','=','ir.ui.view'),('name','=','view_registro_form')])
352
resource_id = pool_obj.get('ir.model.data').read(cr,uid,model_data_ids,fields=['res_id'])[0]['res_id']
354
'domain': "[('id','=', %d)]"%idregistro[0],
355
'name': 'Curso Creado',
357
'view_mode': 'tree,form',
358
'res_model': 'sg.formacion.registro',
359
'views': [(False,'tree'),(resource_id,'form')],
360
'type': 'ir.actions.act_window',
365
ejecutar_formacion_planeada()
367
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: