diff --git a/l10n_ar_edi_ux/__manifest__.py b/l10n_ar_edi_ux/__manifest__.py index 51fe214a..cdd907b6 100644 --- a/l10n_ar_edi_ux/__manifest__.py +++ b/l10n_ar_edi_ux/__manifest__.py @@ -1,6 +1,6 @@ { 'name': 'Argentinian Electronic Invoicing UX', - 'version': "16.0.1.1.0", + 'version': "16.0.1.2.0", 'category': 'Localization/Argentina', 'sequence': 14, 'author': 'ADHOC SA', @@ -21,6 +21,7 @@ 'views/res_partner_view.xml', 'views/account_move_view.xml', 'views/account_journal_view.xml', + 'views/l10n_ar_boarding_permission_view.xml', 'security/ir.model.access.csv', ], 'demo': [ diff --git a/l10n_ar_edi_ux/models/__init__.py b/l10n_ar_edi_ux/models/__init__.py index 0fb1ae16..4b446457 100644 --- a/l10n_ar_edi_ux/models/__init__.py +++ b/l10n_ar_edi_ux/models/__init__.py @@ -6,3 +6,4 @@ from . import res_partner from . import account_move from . import account_journal +from . import l10n_ar_boarding_permission diff --git a/l10n_ar_edi_ux/models/account_move.py b/l10n_ar_edi_ux/models/account_move.py index c0ab7bc7..05d20da7 100644 --- a/l10n_ar_edi_ux/models/account_move.py +++ b/l10n_ar_edi_ux/models/account_move.py @@ -16,6 +16,7 @@ class AccountMove(models.Model): states={'draft': [('readonly', False)]}, help='Set this field if it is you are reporting debit/credit note and have not related invoice.' ' IMPORTANT: This is only applies on "Electronic Invoice - Web Service"') + l10n_ar_boarding_permission_ids = fields.Many2many('l10n_ar.boarding_permission', string="Permiso de Embarque", check_company=True, ondelete='restrict', help="Solo se envía esta información si la factura es de exportación y el 'Concepto AFIP' es 'Productos / Exportación definitiva de bienes'") def _found_related_invoice(self): """ @@ -88,3 +89,45 @@ def _post(self, soft=True): raise UserError(msg) return super(AccountMove, self - purchase_ar_edi_invoices)._post(soft=soft) + + def _get_permissions(self): + """ Get 'permiso de embarque' for foreign invoices. """ + self.ensure_one() + res = [] + invalid_permissions = self.check_valid_boarding_permission() + if invalid_permissions: + invalid_permissions_str = '\n'.join(invalid_permissions) + raise UserError(_('Invalid boarding permissions:\n %s') % invalid_permissions_str) + for permiso in self.l10n_ar_boarding_permission_ids: + res.append({'Id_permiso': permiso.number, 'Dst_merc': permiso.dst_country.l10n_ar_afip_code}) + return res + + @api.model + def wsfex_get_cae_request(self, last_id, client): + """ Set permiso de embarque to foreign invoice. """ + res = super(AccountMove, self).wsfex_get_cae_request(last_id, client) + if int(self.l10n_latam_document_type_id.code) == 19 and int(self.l10n_ar_afip_concept) == 1: + ArrayOfPermisions = client.get_type('ns0:ArrayOfPermiso') + permisos = self._get_permissions() + permiso_existente = "S" if permisos else "N" + res.update({'Permisos': ArrayOfPermisions(permisos) if permisos else None}) + res.update({'Permiso_existente': permiso_existente}) + return res + + def check_valid_boarding_permission(self): + """ This method is used to verify that the Permisos de embarque entered on the export invoice are valid. Receives the authentication credentials, cuit of the represented user, código de despacho and destination country and verifies their existence in the base de datos aduanera. """ + client, auth = self.company_id._l10n_ar_get_connection(self.journal_id.l10n_ar_afip_ws)._get_client() + valid_permissions = [] + invalid_permissions = [] + for perm in self.l10n_ar_boarding_permission_ids: + response = client.service['FEXCheck_Permiso'](auth, ID_Permiso=perm.number, Dst_merc=int(perm.dst_country.l10n_ar_afip_code)) + permission_status = response['FEXResultGet']['Status'] + if permission_status == 'OK': + valid_permissions.append(perm.display_name) + else: + invalid_permissions.append(perm.display_name) + valid_permissions_str = ', '.join(valid_permissions) + invalid_permissions_str = ', '.join(invalid_permissions) + msg = _('Valid boarding permissions: %s') % valid_permissions_str + _('. Invalid boarding permissions: %s') % invalid_permissions_str + self.message_post(body=msg) + return invalid_permissions diff --git a/l10n_ar_edi_ux/models/l10n_ar_boarding_permission.py b/l10n_ar_edi_ux/models/l10n_ar_boarding_permission.py new file mode 100644 index 00000000..a112aefe --- /dev/null +++ b/l10n_ar_edi_ux/models/l10n_ar_boarding_permission.py @@ -0,0 +1,27 @@ +from odoo import fields, models, api + + +class L10nArBoardingPermission(models.Model): + _name = "l10n_ar.boarding_permission" + _description = 'Boarding Permission' + + number = fields.Char(string="Permiso de embarque", required=True, size=16) + dst_country = fields.Many2one('res.country', string="País Origen", help="País donde se aplica permiso de embarque", required=True) + company_id = fields.Many2one('res.company', required=True, default=lambda self: self.env.company) + + def name_get(self): + result = [] + for rec in self: + result.append( + (rec.id, "%s - %s" % (rec.number, rec.dst_country.display_name))) + return result + + @api.model + def name_search(self, name, args=None, operator='ilike', limit=100): + args = args or [] + recs = self.browse() + if name: + recs = self.search([('number', operator, name)] + args, limit=limit) + if not recs: + recs = self.search([('dst_country', operator, name)] + args, limit=limit) + return recs.name_get() diff --git a/l10n_ar_edi_ux/security/ir.model.access.csv b/l10n_ar_edi_ux/security/ir.model.access.csv index 081c7bba..3a43bbf2 100644 --- a/l10n_ar_edi_ux/security/ir.model.access.csv +++ b/l10n_ar_edi_ux/security/ir.model.access.csv @@ -2,3 +2,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_res_partner_update_from_padron_field,access_res_partner_update_from_padron_field,model_res_partner_update_from_padron_field,base.group_user,1,1,1,1 access_res_partner_update_from_padron_wizard,access_res_partner_update_from_padron_wizard,model_res_partner_update_from_padron_wizard,base.group_user,1,1,1,0 access_res_partner_update_from_padron_info,access_res_partner_update_from_padron_info,model_res_partner_update_from_padron_info,base.group_user,1,1,1,1 +access_l10n_ar_boarding_permission,access_l10n_ar_boarding_permission,model_l10n_ar_boarding_permission,base.group_user,1,1,1,1 diff --git a/l10n_ar_edi_ux/views/account_move_view.xml b/l10n_ar_edi_ux/views/account_move_view.xml index 13910ea7..962be9d7 100644 --- a/l10n_ar_edi_ux/views/account_move_view.xml +++ b/l10n_ar_edi_ux/views/account_move_view.xml @@ -11,6 +11,8 @@
to
+ +