from odoo import _, api, fields, models from odoo.exceptions import ValidationError from odoo.tools import check_barcode_encoding class AcRoleType(models.Model): _name = 'l10n_es_edi_facturae.ac_role_type' _description = 'Administrative Center Role Type' code = fields.Char(required=True) name = fields.Char(required=True, translate=True) class Partner(models.Model): _inherit = 'res.partner' invoice_edi_format = fields.Selection(selection_add=[('es_facturae', 'Facturae')]) type = fields.Selection(selection_add=[('facturae_ac', 'FACe Center'), ('other',)]) l10n_es_edi_facturae_ac_center_code = fields.Char(string='Code', size=10, help="Code of the issuing department.") l10n_es_edi_facturae_ac_role_type_ids = fields.Many2many( string='Roles', comodel_name='l10n_es_edi_facturae.ac_role_type', help="It indicates the role played by the Operational Point defined as a Workplace/Department.\n" "These functions are:\n" "- Receiver: Workplace associated to the recipient's tax identification number where the invoice will be received.\n" "- Payer: Workplace associated to the recipient's tax identification number responsible for paying the invoice.\n" "- Buyer: Workplace associated to the recipient's tax identification number who issued the purchase order.\n" "- Collector: Workplace associated to the issuer's tax identification number responsible for handling the collection.\n" "- Fiscal: Workplace associated to the recipient's tax identification number, where an Operational Point mailbox is shared " "by different client companies with different tax identification numbers and it is necessary to differentiate between " "where the message is received (shared letterbox) and the workplace where it must be stored (recipient company).", ) l10n_es_edi_facturae_ac_physical_gln = fields.Char( string='Physical GLN', size=14, help="Identification of the connection point to the VAN EDI (Global Location Number). Barcode of 13 standard positions. " "Codes are registered in Spain by AECOC. The code is made up of the country code (2 positions) Spain is '84' " "+ Company code (5 positions) + the remaining positions. The last one is the product + check digit." ) l10n_es_edi_facturae_ac_logical_operational_point = fields.Char( string='Logical Operational Point', size=14, help="Code identifying the company. Barcode of 13 standard positions. Codes are registered in Spain by AECOC. " "The code is made up of the country code (2 positions) Spain is '84' + Company code (5 positions) + the remaining positions. " "The last one is the product + check digit.", ) l10n_es_edi_facturae_residence_type = fields.Char(string='Facturae EDI Residency Type Code', compute='_compute_l10n_es_edi_facturae_residence_type', store=False, readonly=True,) @api.constrains('l10n_es_edi_facturae_ac_physical_gln') def _validate_l10n_es_edi_facturae_ac_physical_gln(self): for p in self: if not p.l10n_es_edi_facturae_ac_physical_gln: continue if not check_barcode_encoding(p.l10n_es_edi_facturae_ac_physical_gln, 'ean13'): raise ValidationError(_('The Physical GLN entered is not valid.')) @api.constrains('l10n_es_edi_facturae_ac_logical_operational_point') def _validate_l10n_es_edi_facturae_ac_logical_operational_point(self): for p in self: if not p.l10n_es_edi_facturae_ac_logical_operational_point: continue if not check_barcode_encoding(p.l10n_es_edi_facturae_ac_logical_operational_point, 'ean13'): raise ValidationError(_('The Logical Operational Point entered is not valid.')) @api.depends('country_id') def _compute_l10n_es_edi_facturae_residence_type(self): eu_country_ids = self.env.ref('base.europe').country_ids.ids for partner in self: country = partner.country_id if country.code == 'ES': partner.l10n_es_edi_facturae_residence_type = 'R' elif country.id in eu_country_ids: partner.l10n_es_edi_facturae_residence_type = 'U' else: partner.l10n_es_edi_facturae_residence_type = 'E' def _get_suggested_invoice_edi_format(self): # EXTENDS 'account' if self.country_code == 'ES': return 'es_facturae' return super()._get_suggested_invoice_edi_format()