Skip to content

Commit

Permalink
[IMP] l10n_ar_edi_ux: boarding permission
Browse files Browse the repository at this point in the history
closes #282

Task: 29241
Signed-off-by: Katherine Zaoral <kz@adhoc.com.ar>
  • Loading branch information
pablohmontenegro committed Dec 15, 2023
1 parent b309738 commit 391993c
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 1 deletion.
3 changes: 2 additions & 1 deletion 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',
Expand All @@ -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': [
Expand Down
1 change: 1 addition & 0 deletions l10n_ar_edi_ux/models/__init__.py
Expand Up @@ -6,3 +6,4 @@
from . import res_partner
from . import account_move
from . import account_journal
from . import l10n_ar_boarding_permission
43 changes: 43 additions & 0 deletions l10n_ar_edi_ux/models/account_move.py
Expand Up @@ -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):
"""
Expand Down Expand Up @@ -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
27 changes: 27 additions & 0 deletions 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()
1 change: 1 addition & 0 deletions l10n_ar_edi_ux/security/ir.model.access.csv
Expand Up @@ -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
2 changes: 2 additions & 0 deletions l10n_ar_edi_ux/views/account_move_view.xml
Expand Up @@ -11,6 +11,8 @@
<div>
<field name="l10n_ar_afip_asoc_period_start" class="oe_inline"/> to <field name="l10n_ar_afip_asoc_period_end" class="oe_inline"/>
</div>
<field name='l10n_ar_boarding_permission_ids' widget="many2many_tags" attrs="{'invisible': [('l10n_ar_afip_ws', '!=', 'wsfex')]}" options="{'no_quick_create': True}"/>
<button name="check_valid_boarding_permission" string="Validar permisos de embarque" type="object" icon="fa-arrow-right" class="oe_link" colspan="2"/>
</field>
</field>
</record>
Expand Down
37 changes: 37 additions & 0 deletions l10n_ar_edi_ux/views/l10n_ar_boarding_permission_view.xml
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="l10n_ar_boarding_permission_tree" model="ir.ui.view">
<field name="name">l10n_ar.boarding_permission.tree</field>
<field name="model">l10n_ar.boarding_permission</field>
<field name="arch" type="xml">
<tree>
<field name="number"/>
<field name="dst_country"/>
<field name="company_id"/>
</tree>
</field>
</record>

<record id="l10n_ar_boarding_permission_form" model="ir.ui.view">
<field name="name">l10n_ar.boarding_permission.form</field>
<field name="model">l10n_ar.boarding_permission</field>
<field name="arch" type="xml">
<form>
<group>
<field name="number"/>
<field name="dst_country"/>
<field name="company_id"/>
</group>
</form>
</field>
</record>

<record model="ir.actions.act_window" id="action_l10n_ar_boarding_permission">
<field name="name">Permisos de embarque</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">l10n_ar.boarding_permission</field>
<field name="view_mode">tree,form</field>
</record>

<menuitem name="Permisos de embarque" action="action_l10n_ar_boarding_permission" id="menu_action_l10n_ar_boarding_permission" parent="l10n_ar.menu_afip_config"/>
</odoo>

0 comments on commit 391993c

Please sign in to comment.