# -*- coding: utf-8 -*- """Proveedores sobre `res.partner`. No se duplica el modelo de persona: un proveedor es un `res.partner` marcado con `skeen_es_proveedor` más un puñado de campos propios de negocio (días de crédito, contacto, datos de pago y notas). Nota de compatibilidad: el `supplier_rank` estándar de Odoo lo define el módulo `account`, que NO está instalado en todas las instancias (p. ej. la de pruebas). Por eso la fuente de verdad es el flag propio `skeen_es_proveedor`; si la instancia sí tiene `supplier_rank`, se sincroniza para no perder la integración con el estándar. El flag `skeen_proveedor_activo` permite "desactivar" un proveedor con historial sin borrar los datos ni romper las compras pasadas. """ from odoo import models, fields, api from odoo.exceptions import ValidationError class ResPartner(models.Model): _inherit = 'res.partner' skeen_es_proveedor = fields.Boolean( string='Es proveedor', default=False, index=True, help='Marca propia de proveedor. Se sincroniza con supplier_rank si la ' 'instancia tiene el módulo account instalado.') skeen_proveedor_activo = fields.Boolean( string='Proveedor activo', default=True, help='Se apaga al "eliminar" un proveedor con compras registradas.') skeen_dias_credito = fields.Integer( string='Días de crédito', default=0) skeen_contacto = fields.Char( string='Contacto de compras') skeen_banco = fields.Char(string='Banco') skeen_cuenta_pago = fields.Char(string='Cuenta / CLABE de pago') skeen_notas_proveedor = fields.Text(string='Notas de proveedor') skeen_compra_ids = fields.One2many( 'skeen.compra', 'partner_id', string='Compras') skeen_compras_count = fields.Integer( string='Número de compras', compute='_compute_skeen_compras_count') skeen_saldo = fields.Float( string='Saldo por pagar', compute='_compute_skeen_saldo', help='Suma de los saldos de las compras no canceladas.') @api.depends('skeen_compra_ids') def _compute_skeen_compras_count(self): for p in self: p.skeen_compras_count = len(p.skeen_compra_ids) @api.depends('skeen_compra_ids.saldo', 'skeen_compra_ids.estado') def _compute_skeen_saldo(self): for p in self: p.skeen_saldo = sum( c.saldo for c in p.skeen_compra_ids if c.estado not in ('cancelada',)) @api.constrains('skeen_dias_credito') def _check_dias_credito(self): for p in self: if p.skeen_dias_credito is not None and p.skeen_dias_credito < 0: raise ValidationError('Los días de crédito no pueden ser negativos.') def action_marcar_proveedor(self): """Marca al partner como proveedor (flag propio + supplier_rank si existe).""" for p in self: p.skeen_es_proveedor = True if 'supplier_rank' in p._fields and (p.supplier_rank or 0) <= 0: p.supplier_rank = 1 p.skeen_proveedor_activo = True