60 lines
2.7 KiB
Python
60 lines
2.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo import models, fields, api
|
|
|
|
# Tipos de recurso físico de la agenda. Los códigos son estables: la lógica
|
|
# interna solo usa `code`/`tipo` como etiqueta, nunca para decidir solapes.
|
|
RECURSO_TIPOS = [
|
|
('cabina', 'Cabina'),
|
|
('sala', 'Sala'),
|
|
('consultorio', 'Consultorio'),
|
|
('equipo', 'Equipo'),
|
|
('otro', 'Otro'),
|
|
]
|
|
|
|
|
|
class SkeenRecurso(models.Model):
|
|
"""Recurso físico que se puede asignar a las citas (cabina, sala, equipo).
|
|
|
|
Sustituye a las dos opciones que estaban hardcodeadas en la lista de
|
|
espera ('cabina'/'consultoria'): los recursos semilla conservan esos
|
|
códigos para que los registros históricos sigan mostrándose igual.
|
|
|
|
`sucursales` vacío = el recurso aplica a todas las sucursales.
|
|
Todo el módulo queda apagado con `recursos.activo=False` (por defecto):
|
|
mientras no se active, este catálogo no cambia nada en la agenda.
|
|
"""
|
|
_name = 'skeen.recurso'
|
|
_description = 'Recurso de la agenda (cabina, sala, consultorio, equipo)'
|
|
_order = 'sequence, name'
|
|
|
|
name = fields.Char(string='Nombre', required=True, translate=True)
|
|
code = fields.Char(string='Código', required=True, copy=False,
|
|
help='Identificador estable que se guarda en citas y bloqueos.')
|
|
tipo = fields.Selection(RECURSO_TIPOS, string='Tipo', default='cabina', required=True)
|
|
activo = fields.Boolean(string='Activo', default=True)
|
|
sequence = fields.Integer(string='Secuencia', default=10)
|
|
sucursales = fields.Many2many(
|
|
'skeen.sucursal', 'skeen_recurso_sucursal_rel', 'recurso_id', 'sucursal_id',
|
|
string='Sucursales',
|
|
help='Sucursales donde está disponible. Vacío = todas.')
|
|
capacidad = fields.Integer(string='Capacidad', default=0)
|
|
costo_hora = fields.Float(string='Costo por hora', default=0.0,
|
|
help='Costo operativo del recurso por hora, para estimar ingresos en reportes.')
|
|
color = fields.Char(string='Color', help='Color hex para distinguirlo en la agenda (p. ej. #1abc9c).')
|
|
notas = fields.Text(string='Notas')
|
|
|
|
cita_ids = fields.Many2many('skeen.cita', string='Citas')
|
|
|
|
_sql_constraints = [
|
|
('unique_code', 'unique(code)', 'El código del recurso debe ser único!')
|
|
]
|
|
|
|
@api.model
|
|
def _seleccion_activos(self):
|
|
"""[(code, name)] de los recursos activos. Fallback a los valores de
|
|
siempre cuando todavía no hay recursos (instancia sin migrar)."""
|
|
recs = self.sudo().search([('activo', '=', True)], order='sequence, name')
|
|
seleccion = [(r.code, r.name) for r in recs if r.code]
|
|
return seleccion or [('consultoria', 'Consultoría'), ('cabina', 'Cabina')]
|