70 lines
3.0 KiB
Python
70 lines
3.0 KiB
Python
# -*- 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
|