Skip to content

Commit

Permalink
[MIG] l10n_ar_afipws_caea: Migration to 16.0
Browse files Browse the repository at this point in the history
closes #43

Signed-off-by: Nicolas Mac Rouillon <nmr@adhoc.com.ar>
  • Loading branch information
filoquin committed Feb 7, 2023
1 parent 995290d commit 626aeab
Show file tree
Hide file tree
Showing 32 changed files with 379 additions and 210 deletions.
2 changes: 1 addition & 1 deletion l10n_ar_afipws/wizard/upload_certificate_wizard.py
Expand Up @@ -26,6 +26,6 @@ def get_certificate(self):
def action_confirm(self):
""" """
self.ensure_one()
self.certificate_id.write({"crt": base64.decodestring(self.certificate_file)})
self.certificate_id.write({"crt": base64.decodebytes(self.certificate_file)})
self.certificate_id.action_confirm()
return True
18 changes: 9 additions & 9 deletions l10n_ar_afipws_caea/README.rst
@@ -1,37 +1,37 @@
=========================================
===========================================
Implemenar CAEA en los Web Services de AFIP
=========================================
===========================================
¿Que es el CAEA?
--------------------------
----------------
Permite consignar en los comprobantes respaldatorios de las operaciones, el Código de Autorización Electrónico Anticipado "CAEA", en reemplazo del "CAE"
http://www.afip.gov.ar/genericos/guiavirtual/directorio_subcategoria_nivel3.aspx?id_nivel1=562id_nivel2=603&id_nivel3=1663

Requisitos
--------------------------
------------
http://www.afip.gov.ar/genericos/guiavirtual/consultas_detalle.aspx?id=13872311
Hayan emitido en cada mes calendario un mínimo de 1.800 comprobantes (Facturas, recibos, notas de crédito y notas de débito clases "A", "A" con leyenda "PAGO EN CBU INFORMADA", "M", "B" y "C"), en el período de 3 meses calendarios inmediatos anteriores a la solicitud de incorporación al procedimiento especial.
No podrán considerarse para el cumplimiento de la mencionada condición los comprobantes por operaciones con consumidores finales

¿Cómo se realiza la solicitud de adhesión al régimen?
--------------------------
-------------------------------------------------------
La solicitud de adhesión deberá realizarse ingresando al servicio con clave fiscal "Regímenes de Facturación y Registración (REAR/RECE/RFI)". Asimismo, se deberá comunicar el período a partir del cual comenzará a aplicar el procedimiento especial y si la adhesión se efectúa bajo la modalidad de emisión complementaria a la principal - contingencia - (p.ej. Controlador Fiscal, Factura Electrónica) conforme lo previsto en el Título III RG 4290/18.

constancia de la presentación realizada y admitida, el sistema emitirá un comprobante que tendrá el carácter de acuse de recibo.

¿Se debe habilitar un nuevo punto de venta para el CAEA?
--------------------------
---------------------------------------------------------
Para los comprobantes que se emitan bajo la modalidad excepcional complementaria a la principal (contingencia) conforme a lo previsto en el Título III RG 4290/18, se deberán habilitar puntos de venta específicos por dicha modalidad asociados al mismo domicilio de la modalidad de emisión principal y a su condición ante el impuesto al valor agregado.

¿Cómo debo proceder en caso de no haber solicitado el CAEA durante una quincena?
--------------------------
--------------------------------------------------------------------------------
Si el contribuyente es un obligado a Factura Electrónica y no puede realizar los comprobantes con CAEA deberán ser generados con CAE. Al no haber solicitado CAEA, no deben informar nada para esa quincena.

¿Hay un límite en la cantidad de comprobantes a emitir por medios alternativos de contingencia?
--------------------------
-----------------------------------------------------------------------------------------------
Las modalidades alternativas ante inconvenientes con el uso del controlador fiscal o de la emisión de comprobantes electrónicos, sólo deben ser utilizadas en condiciones de excepcionalidad.

Se considera que no se cumple con la condición de excepcionalidad cuando
----------------------------
-------------------------------------------------------------------------
Durante 2 meses consecutivos o 3 meses alternados en un año calendario, se observe alguna de las siguientes irregularidades:

a) que la emisión de comprobantes con CAEA o CAI excedan significativamente el nivel de facturación regular, es decir la cantidad de comprobantes emitidos mensualmente por excepción representan un 5%, o más, respecto del total de la sucursal.
Expand Down
2 changes: 1 addition & 1 deletion l10n_ar_afipws_caea/__init__.py
@@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-

from . import models
from . import wizard
15 changes: 9 additions & 6 deletions l10n_ar_afipws_caea/__manifest__.py
@@ -1,29 +1,32 @@
{
"name": "Factura Electrónica Argentina CAEA",
"summary": """
Habilita la gestion de CAEA""",
Habilita la gestion de CAEA para modo contingencia""",
"sequence": 14,
"author": "Filoquin",
"website": "http://www.sipecu.com.ar",
"license": "LGPL-3",
"category": "Localization/Argentina",
"version": "15.0.1.0.0",
"version": "16.0.1.0.0",
"depends": ["l10n_ar_afipws_fe"],
"data": [
"security/ir.model.access.csv",
"views/asset.xml",
"views/account_journal.xml",
"views/afipws_caea.xml",
"views/company.xml",
"views/res_config_settings.xml",
"views/pyafipws_dummy.xml",
"wizard/res_config_settings.xml",
"wizard/pyafipws_dummy.xml",
"views/account_move.xml",
"data/ir_cron.xml",
],
"qweb": [
"static/src/xml/systray_afip_caea.xml",
],
"installable": False,
'assets': {
#'web.assets_backend': ['/l10n_ar_afipws_caea/static/src/js/systray_afip_caea.js'],
#'web.assets_qweb': ['/l10n_ar_afipws_caea/static/src/xml/systray_afip_caea.xml'],
},
"installable": True,
"auto_install": False,
"application": False,
}
3 changes: 0 additions & 3 deletions l10n_ar_afipws_caea/models/__init__.py
@@ -1,8 +1,5 @@
# -*- coding: utf-8 -*-

from . import afipws_caea
from . import account_journal
from . import res_company
from . import account_move
from . import res_config_settings
from . import pyafipws_dummy
8 changes: 7 additions & 1 deletion l10n_ar_afipws_caea/models/account_journal.py
@@ -1,4 +1,4 @@
from odoo import fields, models, _
from odoo import fields, models, api, _
from odoo.exceptions import UserError

import logging
Expand All @@ -14,6 +14,12 @@ class AccountJournal(models.Model):
string="Caea journal",
)

@api.model
def _get_type_mapping(self):
vals = super()._get_type_mapping()
vals["CAEA"] = "wsfe"
return vals

def _get_l10n_ar_afip_pos_types_selection(self):
"""Add more options to the selection field AFIP POS System, re order options by common use"""
res = super()._get_l10n_ar_afip_pos_types_selection()
Expand Down
59 changes: 38 additions & 21 deletions l10n_ar_afipws_caea/models/account_move.py
Expand Up @@ -41,32 +41,20 @@ def _post(self, soft=True):
if len(inv.journal_id.caea_journal_id):
inv.journal_id = inv.journal_id.caea_journal_id.id

res = super()._post(soft)
return res
return super()._post(soft)

def do_pyafipws_request_cae(self):
caea_state = (
self.env["ir.config_parameter"]
.sudo()
.get_param("afip.ws.caea.state", "inactive")
)
if caea_state == "inactive":
return super().do_pyafipws_request_cae()
elif caea_state == "active":
return self.do_pyafipws_request_caea()
caea_inv = self.filtered(lambda x: x.journal_id.l10n_ar_afip_pos_system == "CAEA")
caea_inv.do_pyafipws_request_caea()
return super(AccountMove, self - caea_inv).do_pyafipws_request_cae()

def do_pyafipws_request_caea(self):
for inv in self:
if inv.journal_id.l10n_ar_afip_pos_system != "CAEA":
continue
# Ignore invoices with cae (do not check date)
if inv.afip_auth_code:
continue

afip_ws = inv.journal_id.afip_ws
if not afip_ws:
continue

# Ignore invoice if not ws on point of sale
if not afip_ws:
raise UserError(
Expand Down Expand Up @@ -166,12 +154,12 @@ def do_pyafipws_post_caea_invoice(self):
# escribe aca si no hay errores
_logger.info(
"CAEA solicitado con exito. %s. Resultado %s"
% (afip_auth_code, ws.Resultado)
% (ws.CAEA, ws.Resultado)
)
if hasattr(ws, "Vencimiento"):
vto = datetime.strptime(ws.Vencimiento, "%Y%m%d").date()
if hasattr(ws, "FchVencCAE"):
vto = datetime.strptime(ws.FchVencCAE, "%Y%m%d").date()

if hasattr(ws, "CbteFch"):
vto = datetime.strptime(ws.CbteFch, "%Y%m%d").date()


inv.write(
{
Expand All @@ -185,3 +173,32 @@ def do_pyafipws_post_caea_invoice(self):
)

inv._cr.commit()

def wsfe_pyafipws_caea_create_invoice(self, ws, invoice_info):
ws.CrearFactura(
invoice_info["concepto"],
invoice_info["tipo_doc"],
invoice_info["nro_doc"],
invoice_info["doc_afip_code"],
invoice_info["pos_number"],
invoice_info["cbt_desde"],
invoice_info["cbt_hasta"],
invoice_info["imp_total"],
invoice_info["imp_tot_conc"],
invoice_info["imp_neto"],
invoice_info["imp_iva"],
invoice_info["imp_trib"],
invoice_info["imp_op_ex"],
invoice_info["fecha_cbte"],
invoice_info["fecha_venc_pago"],
invoice_info["fecha_serv_desde"],
invoice_info["fecha_serv_hasta"],
invoice_info["moneda_id"],
invoice_info["moneda_ctz"],
invoice_info["caea"],
invoice_info["CbteFchHsGen"],
)


def wsfe_caea_request_autorization(self, ws, afip_ws):
ws.CAEARegInformativo()
56 changes: 24 additions & 32 deletions l10n_ar_afipws_caea/models/afipws_caea.py
@@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-

from odoo import models, fields, api
from datetime import datetime
Expand All @@ -15,7 +14,7 @@ class AfipwsCaea(models.Model):
_inherit = ["mail.thread", "mail.activity.mixin"]

_sql_constraints = [
("unique_caea", "unique (company_id,name,order)", "CAEA already exists!")
("name_uniq", "unique(name)", "CAEA already exists!")
]
state = fields.Selection(
[("draft", "draft"), ("active", "active"), ("reported", "reported")],
Expand Down Expand Up @@ -133,37 +132,30 @@ def _compute_date(self):
- relativedelta(days=1)
)

@api.model
def create(self, values):
"""exist = self.search([
('company_id', '=', values['company_id']),
('name', '=', values['name']),
('order', '=', values['order'])
])
if len(exist):
return"""
@api.model_create_multi
def create(self, vals_list):
self.env["ir.config_parameter"].set_param("afip.ws.caea.state", "inactive")

company_id = self.env["res.company"].search([("id", "=", values["company_id"])])
afip_ws = self.company_id.get_caea_ws()

ws = company_id.get_connection(afip_ws).connect()
caea = ws.CAEAConsultar(values["period"], values["order"])
# raise ValidationError(
# _('The Common Name must be lower than 50 characters long'))

# _logger.info("ws.ErrMsg " % ws.ErrMsg)
if caea == "":
caea = ws.CAEASolicitar(values["period"], values["order"])
_logger.info(ws.ErrMsg)
_logger.info(caea)

values["name"] = caea
values["afip_observations"] = ws.Obs
values["process_deadline"] = datetime.strptime(ws.FchTopeInf, "%Y%m%d")
values["state"] = "active"
# TODO: FchProceso
return super().create(values)
_logger.info(vals_list)

for vals in vals_list:
if 'name' not in vals:
company_id = self.env["res.company"].search([("id", "=", vals["company_id"])])
afip_ws = company_id.get_caea_ws()
ws = company_id.get_connection(afip_ws).connect()
caea = ws.CAEAConsultar(vals["period"], vals["order"])

# _logger.info("ws.ErrMsg " % ws.ErrMsg)
if caea == "":
caea = ws.CAEASolicitar(vals["period"], vals["order"])
_logger.info(ws.ErrMsg)
_logger.info(caea)

vals["name"] = caea
vals["afip_observations"] = ws.Obs
vals["process_deadline"] = datetime.strptime(ws.FchTopeInf, "%Y%m%d")
vals["state"] = "active"
# TODO: FchProceso
return super().create(vals_list)

def action_send_invoices(self):
self.env["ir.config_parameter"].set_param("afip.ws.caea.state", "inactive")
Expand Down
3 changes: 2 additions & 1 deletion l10n_ar_afipws_caea/security/ir.model.access.csv
Expand Up @@ -2,4 +2,5 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_afipws_caea_manager,afipws.caea.manager,model_afipws_caea,base.group_system,1,1,1,1
access_afipws_caea_user,afipws.caea.user,model_afipws_caea,base.group_user,1,0,0,0
access_afipws_caea_log_manager,afipws.caea.log.user,l10n_ar_afipws_caea.model_afipws_caea_log,base.group_user,1,0,0,0
ccess_afipws_caea_log_user,afipws.caea.log.manger,l10n_ar_afipws_caea.model_afipws_caea_log,account.group_account_invoice,1,1,1,0
access_afipws_caea_log_user,afipws.caea.log.manger,l10n_ar_afipws_caea.model_afipws_caea_log,account.group_account_invoice,1,1,1,0
access_pyafipws_dummy_user,afipws.dummy.user,model_pyafipws_dummy,base.group_user,1,1,1,1
53 changes: 28 additions & 25 deletions l10n_ar_afipws_caea/static/src/js/systray_afip_caea.js
@@ -1,32 +1,35 @@
odoo.define('afip.caea', function (require) {
"use strict";
/** @odoo-module **/
import SystrayMenu from 'web.SystrayMenu';
import Widget from 'web.Widget';
/**
* Menu item appended in the systray part of the navbar
*/

var SystrayMenu = require('web.SystrayMenu');
var Widget = require('web.Widget');
//var model_obj = new instance.web.Model('ir.model.data');
const { Component } = owl;
var CaeaMenu = Widget.extend({
name: 'caea_menu',
template: 'systray_afip.caea',
events: {
'click .caea_label': 'onclick_caea_icon',
},
onclick_caea_icon:function(){
var action = {
type: 'ir.actions.act_window',
res_model: 'pyafipws.dummy',
view_type: 'form',
views:[[false, 'form']],
target: 'new',
};

var ActionMenu = Widget.extend({
template: 'systray_afip.caea',
events: {
'click .caea_label': 'onclick_caea_icon',
},
onclick_caea_icon:function(){
var action = {
type: 'ir.actions.act_window',
res_model: 'pyafipws.dummy',
view_type: 'form',
views:[[false, 'form']],
target: 'new',
};

this.do_action(action);
},
//some functions
this.do_action(action);
},
//some functions

});
});

SystrayMenu.Items.push(ActionMenu);
return ActionMenu;
});

SystrayMenu.Items.push(CaeaMenu);

export default CaeaMenu;

20 changes: 8 additions & 12 deletions l10n_ar_afipws_caea/static/src/xml/systray_afip_caea.xml
@@ -1,15 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates>
<t t-name="systray_afip.caea">
<li class="caea_icon">
<label class="caea_label" style="margin-bottom:0px;"
title="Afip state">
<div class="icon_div">
<div class="toggle-icon"><i class="fa fa-plug"
id="fa-icon"/>
</div>
</div>
</label>
</li>
</t>
</templates>
<div class="o_caea_systray_item">
<a class="o-no-caret caea_label" data-display="static" aria-expanded="false" title="afip" href="#" role="button">
<i class="fa fa-plug" role="img" aria-label="Afip"/>
</a>

</div>
</t>
</templates>
2 changes: 1 addition & 1 deletion l10n_ar_afipws_caea/views/account_journal.xml
Expand Up @@ -5,7 +5,7 @@
<field name="model">account.journal</field>
<field name="inherit_id" ref="l10n_ar.view_account_journal_form"/>
<field name="arch" type="xml">
<field name="l10n_ar_share_sequences" position="after">
<field name="l10n_ar_afip_pos_system" position="after">
<field attrs="{'invisible':[('afip_ws','=', False)]}" domain="[('l10n_ar_afip_pos_system', '=', 'CAEA')]" name="caea_journal_id"/>
</field>
</field>
Expand Down

0 comments on commit 626aeab

Please sign in to comment.