60 lines
2.5 KiB
Python
60 lines
2.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Metas de comisión por empleado y periodo.
|
|
|
|
Una meta compara la venta (base comisionable del periodo, según la base
|
|
configurada) del empleado contra `monto_objetivo`. Al alcanzarla se paga el
|
|
bono: `fijo` (monto en m.n.) o `porcentaje` (sobre la base del empleado). Se
|
|
evalúa al cerrar el periodo (al generar la liquidación) y también en vivo.
|
|
|
|
`periodo` acepta 'AAAA-MM' (mes concreto) o 'mensual' (cualquier mes). Se
|
|
documenta así para no ambigüedad: una meta 'mensual' aplica a todo periodo
|
|
consultado; una meta 'AAAA-MM' solo al mes que coincide con el inicio del rango.
|
|
"""
|
|
|
|
from odoo import models, fields, api
|
|
from odoo.exceptions import ValidationError
|
|
|
|
TIPOS_BONO = ('fijo', 'porcentaje')
|
|
|
|
|
|
class SkeenComisionMeta(models.Model):
|
|
_name = 'skeen.comision.meta'
|
|
_description = 'Meta de comisión SKEEN'
|
|
_order = 'empleado_id, periodo'
|
|
|
|
empleado_id = fields.Many2one('hr.employee', string='Empleado', required=True,
|
|
ondelete='cascade', index=True)
|
|
periodo = fields.Char(string='Periodo', required=True,
|
|
help="'AAAA-MM' para un mes concreto o 'mensual' para cualquiera.")
|
|
monto_objetivo = fields.Float(string='Monto objetivo', default=0.0)
|
|
bono = fields.Float(string='Bono', default=0.0)
|
|
tipo_bono = fields.Selection(
|
|
[('fijo', 'Monto fijo'), ('porcentaje', 'Porcentaje sobre la venta')],
|
|
string='Tipo de bono', default='fijo', required=True)
|
|
activo = fields.Boolean(string='Activa', default=True)
|
|
notas = fields.Text(string='Notas')
|
|
company_id = fields.Many2one('res.company', string='Compañía',
|
|
default=lambda self: self.env.company)
|
|
|
|
@api.constrains('periodo')
|
|
def _check_periodo(self):
|
|
for m in self:
|
|
p = (m.periodo or '').strip()
|
|
if p == 'mensual':
|
|
continue
|
|
try:
|
|
anio, mes = p.split('-')
|
|
int(anio)
|
|
mes_i = int(mes)
|
|
if not (1 <= mes_i <= 12) or len(mes) != 2:
|
|
raise ValueError
|
|
except (ValueError, AttributeError):
|
|
raise ValidationError(
|
|
"El periodo debe ser 'AAAA-MM' (p. ej. 2026-10) o 'mensual'.")
|
|
|
|
def aplica_a(self, periodo_mes):
|
|
"""True si la meta cubre el mes 'AAAA-MM' dado."""
|
|
self.ensure_one()
|
|
p = (self.periodo or '').strip()
|
|
return p == 'mensual' or p == periodo_mes
|