Skip to content

Commit

Permalink
[IMP] l10n_ar_edi_ux: agregar funcionalidad de debitar cheques propios.
Browse files Browse the repository at this point in the history
Tarea: 34995
Lo hacemos acá y no en l10n_ar_ux porque no tenemos enterprise y usamos acá un metodo de account_accountant.

closes #300

X-original-commit: 9454c75
Signed-off-by: Juan José Scarafía <jjs@adhoc.com.ar>
Signed-off-by: pablohmontenegro <pam@adhoc.com.ar>
  • Loading branch information
pablohmontenegro committed Dec 28, 2023
1 parent d14c11a commit 03cb5e2
Show file tree
Hide file tree
Showing 11 changed files with 136 additions and 3 deletions.
2 changes: 1 addition & 1 deletion account_accountant_ux/views/account_followup_views.xml
Expand Up @@ -7,7 +7,7 @@
<field name="arch" type="xml">
<field name="amount_residual_currency" position="after">
<field name="amount_residual" string="Residual Amount (cc)" help="Amount residual on company currency" widget="monetary" options="{'currency_field': 'company_currency_id'}"/>
<field name="company_currency_id" invisible="1"/>
<field name="company_currency_id" column_invisible="True"/>
</field>
</field>
</record>
Expand Down
5 changes: 4 additions & 1 deletion l10n_ar_edi_ux/__manifest__.py
@@ -1,6 +1,6 @@
{
'name': 'Argentinian Electronic Invoicing UX',
'version': "17.0.1.1.0",
'version': "17.0.1.2.0",
'category': 'Localization/Argentina',
'sequence': 14,
'author': 'ADHOC SA',
Expand All @@ -10,16 +10,19 @@
'depends': [
'l10n_ar_ux',
'l10n_ar_edi',
'account_accountant',
],
'external_dependencies': {
'python': ['zeep'],
},
'data': [
'wizards/res_partner_update_from_padron_wizard_view.xml',
'wizards/account_check_action_wizard_view.xml',
'views/res_partner_view.xml',
'views/account_move_view.xml',
'views/account_journal_view.xml',
'views/l10n_ar_boarding_permission_view.xml',
'views/account_payment_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 @@ -7,3 +7,4 @@
from . import account_move
from . import account_journal
from . import l10n_ar_boarding_permission
from . import account_payment
13 changes: 12 additions & 1 deletion l10n_ar_edi_ux/models/account_journal.py
@@ -1,4 +1,4 @@
from odoo import models, _
from odoo import models, fields, _, api
from odoo.exceptions import UserError
from odoo.tools import format_date
import datetime
Expand All @@ -7,6 +7,11 @@
class AccountJournal(models.Model):
_inherit = "account.journal"

check_add_debit_button = fields.Boolean(
string="Agregar botón de débito",
help="Si marca esta opción podrá debitar los cheques con un botón desde los mismo.")
check_debit_journal_id = fields.Many2one('account.journal', compute='_compute_check_debit_journal', store=True, readonly=False, domain="[('company_id', '=', company_id), ('type', '=', 'general')]", help="Debe seleccionar un diario de tipo 'Varios' donde se realizará el asiento del débito")

def l10n_ar_check_afip_doc_types(self):
""" This method shows the valid document types for each Webservice. """
self.ensure_one()
Expand Down Expand Up @@ -62,3 +67,9 @@ def _format_afip_doc_types(self, ws, response):
line += " hasta: " + date_to
msg += line + "\n"
return msg

@api.depends('check_add_debit_button')
def _compute_check_debit_journal(self):
""" En caso de que el campo 'Agregar botón de débito' (check_debit_journal_id) sea 'False' entonces debemos asegurarnos que el campo check_debit_journal_id esté vacío para evitar inconvenientes en caso de necesitar debitar un cheque. """
for journal in self.filtered(lambda x: not x.check_add_debit_button):
journal.check_debit_journal_id = False
9 changes: 9 additions & 0 deletions l10n_ar_edi_ux/models/account_payment.py
@@ -0,0 +1,9 @@
from odoo import fields, models


class AccountPayment(models.Model):
_inherit = 'account.payment'

# Diario de tipo varios que está vinculado al diario del pago del cheque (ver campo Check Debit Journal en el diario) para que nos permita hacer el débito del cheque.
# Lo utilizamos como un diario "puente". Si no está establecido entonces usamos este campo para hacer invisible el botón para debitar cheques en la vista form del payment (es decir, del cheque).
check_debit_journal_id = fields.Many2one(related='journal_id.check_debit_journal_id', readonly=True)
1 change: 1 addition & 0 deletions l10n_ar_edi_ux/security/ir.model.access.csv
Expand Up @@ -3,3 +3,4 @@ access_res_partner_update_from_padron_field,access_res_partner_update_from_padro
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
access_account_check_action_wizard,access_account_check_action_wizard,model_account_check_action_wizard,base.group_user,1,1,1,1
13 changes: 13 additions & 0 deletions l10n_ar_edi_ux/views/account_journal_view.xml
Expand Up @@ -10,4 +10,17 @@
</button>
</field>
</record>

<!-- Se agregan los campos necesarios en la vista form de diario para determinar si el diario está configurado para debitar o no cheques propios. -->
<record id="view_account_journal_tree" model="ir.ui.view">
<field name="name">account.journal.tree</field>
<field name="model">account.journal</field>
<field name="inherit_id" ref="l10n_latam_check.view_account_journal_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='l10n_latam_manual_checks']" position="after">
<field name="check_add_debit_button" invisible="not l10n_latam_manual_checks"/>
<field name="check_debit_journal_id" invisible="not check_add_debit_button" required="check_add_debit_button"/>
</xpath>
</field>
</record>
</odoo>
15 changes: 15 additions & 0 deletions l10n_ar_edi_ux/views/account_payment_view.xml
@@ -0,0 +1,15 @@
<odoo>
<!-- Heredamos la vista de account payment para agregar el botón para debitar cheques propios. -->
<record id="view_account_payment_form_inherited" model="ir.ui.view">
<field name="name">account.payment.form.inherited</field>
<field name="model">account.payment</field>
<field name="inherit_id" ref="account.view_account_payment_form" />
<field name="arch" type="xml">
<xpath expr="//button[@name='action_post']" position="after">
<field name='check_debit_journal_id' invisible="1"/>
<button name="%(action_debit_check_wizard)d" string="Debit check" type="action" invisible="payment_method_code != 'check_printing' or state != 'posted' or not is_move_sent or is_matched or not check_debit_journal_id"/>
</xpath>
</field>
</record>

</odoo>
1 change: 1 addition & 0 deletions l10n_ar_edi_ux/wizards/__init__.py
Expand Up @@ -4,3 +4,4 @@
##############################################################################
from . import res_partner_update_from_padron_wizard
from . import res_config_settings
from . import account_check_action_wizard
50 changes: 50 additions & 0 deletions l10n_ar_edi_ux/wizards/account_check_action_wizard.py
@@ -0,0 +1,50 @@
##############################################################################
# For copyright and license notices, see __manifest__.py file in module root
# directory
##############################################################################
from odoo import fields, models
from odoo.exceptions import ValidationError, UserError


class AccountCheckActionWizard(models.TransientModel):
_name = 'account.check.action.wizard'
_description = 'Account Check Action Wizard'

date = fields.Date(
default=fields.Date.context_today,
required=True,
)

def action_confirm(self):
""" Este método sirve para hacer el débito de cheques con cuenta outstanding desde los payments con método de pago de cheques. """
payment = self.env['account.payment'].browse(self._context.get('active_id', False))
if self.date < payment.date:
raise ValidationError(f'La fecha del débito del cheque {self.date} no puede ser inferior a la fecha de emisión del mismo {payment.date}.')
# Línea del cheque a conciliar.
liquidity_lines, counterpart_lines, writeoff_lines = payment._seek_for_lines()
move_line_ids = liquidity_lines.ids
# Obtenemos la cuenta outstanding del método de pago pentientes "manual" del diario del pago o bien la "Cuenta de pagos pentientes" de la compañía.
outstanding_account = self._get_outstanding_account(payment)
# Obtenemos fecha, importe, pasamos cuenta outstanding y el diario es de tipo varios que está vinculado al diario del pago del cheque (ver campo Check Debit Journal en el diario) para que nos permita hacer la conciliación. Lo utilizamos como un diario "puente".
new_mv_line_dicts = {'label': f'Débito cheque nro {payment.check_number}',
'amount': abs(sum(liquidity_lines.mapped('balance'))),
'account_id': outstanding_account.id,
'journal_id': payment.journal_id.check_debit_journal_id.id,
'date': self.date,
'move_line_ids': move_line_ids
}
# Aquí hacemos el asiento del débito.
wizard = self.env['account.reconcile.wizard'].with_context(active_model='account.move.line').new({})
for index, value in new_mv_line_dicts.items():
wizard[index] = value
wizard.reconcile()
payment.message_post(body=f'El cheque nro "{payment.check_number}" ha sido debitado.')

def _get_outstanding_account(self, payment):
""" Obtenemos la cuenta outstanding para hacer el débito de cheques y hacemos las validaciones correspondientes. """
journal = payment.journal_id
journal_manual_payment_method = journal.outbound_payment_method_line_ids.filtered(lambda x: x.code=='manual')
outstanding_account = (journal_manual_payment_method.payment_account_id or journal.company_id.account_journal_payment_credit_account_id)
if not outstanding_account:
raise UserError("No es posible crear un nuevo débito de cheque sin una cuenta outstanding de pagos establecida ya sea en la compañía o en el método de pagos 'manual' en el diario %s." % (payment.journal_id.display_name))
return outstanding_account
29 changes: 29 additions & 0 deletions l10n_ar_edi_ux/wizards/account_check_action_wizard_view.xml
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>

<!-- Este wizard solo sirve para determinar en que fecha se va a debitar el cheque propio correspondiente desde la vista form del payment. -->
<record model="ir.ui.view" id="account_check_action_wizard_form_view">
<field name="name">account.check.action.wizard.form</field>
<field name="model">account.check.action.wizard</field>
<field name="arch" type="xml">
<form string="Check Action">
<group >
<field name="date"/>
</group>
<footer>
<button string="Confirm" name="action_confirm" type="object" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>

<record id="action_debit_check_wizard" model="ir.actions.act_window">
<field name="name">Check Action</field>
<field name="res_model">account.check.action.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>

</odoo>

0 comments on commit 03cb5e2

Please sign in to comment.