# -*- coding: utf-8 -*-

################################################################################
#                         INICIO DECLARACION BASE DE DATOS                     #
################################################################################

#------------------------------------------------------------------------------#
#                            MODULO DE SOLICITUD                               #
#------------------------------------------------------------------------------#

db.define_table('Solicitud',
    Field('prioridad',
          db.Prioridad,
          requires = IS_IN_DB(db(db.Prioridad.estado=='Activo'), db.Prioridad,'%(nombre_prioridad)s',
                     error_message='Debe seleccionar una prioridad.'),
          label=T('(*) Prioridad')),
    Field('fecha_realizacion',
          type='date',
          label=T('Fecha de Solicitud'),
          default=request.now,
          writable=False),
    Field('USBID',
          type='string',
          label=T('USBID del solicitante')),
    Field('area',
          db.Area,
          requires = IS_IN_DB(db(db.Area.estado=='Activo'), db.Area.id,'%(nombre_area)s',
                     error_message='Debe seleccionar un area de trabajo.'),
          label=T('(*) Area de Trabajo')),
    Field('tipo',
          label=T('(*) Departamento'),
          requires = IS_IN_SET(['Departamento de Mantenimiento', 'Departamento de Planificación', 'Departamento de Proyectos'],
                     error_message='Debe seleccionar un Departamento.')),
    Field('unidad',
          db.Unidad,
          requires = IS_IN_DB(db(db.Unidad.estado=='Activo'), db.Unidad.id,'%(nombre_unidad)s',
                     error_message='Debe seleccionar una Unidad.'),
          label=T('(*) Unidad Solicitante')),
    Field('nombre_contacto',
          label=T('(*) Persona Contacto'),
          requires=IS_NOT_EMPTY(error_message='Debe introducir un nombre de contacto.')),
    Field('info_contacto',
          label=T('(*) Email'),
          requires= [IS_EMAIL(error_message='Introduzca un email valido.'),
                     IS_NOT_EMPTY()]),
    Field('edificio',
          db.Edificio,
          requires = IS_IN_DB(db(db.Edificio.estado=='Activo'), db.Edificio.id, '%(nombre_edificio)s (%(nomenclatura)s)',
                     error_message='Debe seleccionar un Edificio'),
          label=T('(*) Edificio')),
    Field('espacio',
          db.Lugar,
          requires = IS_IN_DB(db(db.Lugar.estado=='Activo'), db.Lugar.id,'%(espacio)s',
                     error_message='Debe seleccionar un espacio.'),
          # widget = SQLFORM.widgets.autocomplete(request, db.Lugar.espacio, id_field=db.Lugar.id, limitby=(0,10), min_length=3),
         
          label=T('(*) Espacio')),
    Field('ubicacion',
          type="string",
          requires=IS_NOT_EMPTY(error_message='Introduzca una ubicación.'),
          # widget = SQLFORM.widgets.autocomplete(request, db.Lugar.espacio, id_field=db.Lugar.id, limitby=(0,10), min_length=3),
         
          label=T('(*) Ubicación')),
    Field('telefono',
          label=T('(*) Telefono (Extensión)'),
          requires = IS_MATCH('^(0\d{3}-\d{7}|\d{4})$', error_message='El telefono debe ser una extension: XXXX o un telefono con el formato: YYYY-XXXXXXX')),
    Field('requerimiento',
          type='text',
          label=T('(*) Descripcion del problema'),
          requires=[IS_NOT_EMPTY(error_message='Debe introducir algun requerimiento.'),
                    IS_LENGTH(140, error_message='No se permiten mas de 140 caracteres.')]),
    Field('observacion_solicitud',
          type='text',
          label=T('Observaciones'),
          requires=IS_LENGTH(140, error_message='No se permiten mas de 140 caracteres.')),
    Field('supervisor',
          type='string',
          label=T('Supervisor Responsable'),
          default=''),
    Field('fecha_inicio',
          type='date',
          label=T('Fecha de inicio')),
    Field('fecha_culminacion',
          type='date',
          label=T('Fecha de culminación')),
    Field('trabajador',
         db.Empleado,
         requires = IS_EMPTY_OR(IS_IN_DB(db(db.Empleado.estado=='Activo'), db.Empleado.id,'%(nombre)s',
                     error_message='Debe seleccionar un trabajador.')), 
         widget = SQLFORM.widgets.checkboxes.widget,
         label=T('Supervisor')),
    Field('observacion_ejecucion',
          type='text',
          label=T('Observaciones de Ejecución')),
    Field('status',
          db.Status_solicitud,
          requires = IS_EMPTY_OR(IS_IN_DB(db(db.Status_solicitud.estado=='Activo'), db.Status_solicitud.id,'%(nombre_status)s')),
          label=T('Estado')),
    Field('vision',
          label=T('(*) Vision'),
          requires = IS_IN_SET(['Publica', 'Privada'],
                     error_message='Debe seleccionar quien puede ver su solicitud.'),
          default = 'Privada'),
    migrate=True
    )
db.Solicitud.id.label=T('Numero de Solicitud')

db.define_table('Solicitud_Material',
    Field('solicitud',
          db.Solicitud,
          required = True,
      ),
    Field('material',
          db.Material,
          required = True,
          requires = IS_IN_DB(db(db.Material.cantidad > 0), db.Material.id, '%(nombre)s',
                      error_message="Debe seleccionar un material.")
      ),
    Field('cantidad',
          type = 'integer',
          required = True,
          requires = IS_INT_IN_RANGE(1,None,
                      error_message="Debe ser igual o mayor a 1.")
      ),
    migrate = True
    )


################################################################################
#                          FIN DECLARACION BASE DE DATOS                       #
################################################################################
