Skip to content

Commit

Permalink
[IMP]l10n_it_ricevute_bancarie: Add exposure/risk and improve managem…
Browse files Browse the repository at this point in the history
…ent of unsolved riba
  • Loading branch information
odooNextev authored and toita86 committed Nov 26, 2024
1 parent ce388d4 commit 1514290
Show file tree
Hide file tree
Showing 20 changed files with 490 additions and 199 deletions.
20 changes: 19 additions & 1 deletion l10n_it_ricevute_bancarie/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ Nella configurazione delle Ri.Ba. è possibile specificare se si tratti di
utilizzare al momento dell'accettazione della distinta da parte della banca.
Tale conto deve essere di tipo 'Crediti' (ad esempio "Ri.Ba. all'incasso",
eventualmente da creare).
Selezionando 'Salvo buon fine' è necessario impostare il tipo di
incasso, immediato o a maturazione valuta: questo influisce sulla gestione
degli insoluti perchè solo nel caso di incasso immediato vengono stornate
le registrazioni di presentazione della RiBa.

La configurazione relativa alla fase di accredito, verrà usata nel momento in
cui la banca accredita l'importo della distinta.
Expand Down Expand Up @@ -90,11 +94,23 @@ I possibili stati della distinta sono: *Bozza*, *Accettata*, *Accreditata*,
Ad ogni passaggio di stato sarà possibile generare le relative registrazioni
contabili, le quali verranno riepilogate nella scheda «Contabilità».
Questa scheda è presente sia sulla distinta che sulle sue righe.
Queste ultime hanno una vista dedicata per facilitare le
operazioni sul singolo elemento invece che su tutta la distinta.

La voce di menù 'Presentazione Riba' permette di estrarre le riba fino al
raggiungimento dell'importo massimo inserito dall'utente. La stessa procedura
guidata è possibile utilizzarla selezionando i records dalla vista a lista e poi
cliccare su 'Presentazione Riba' tra le azioni.
cliccare su 'Presentazione Riba' tra le azioni.

Nella lista delle fatture è presente una colonna per monitorare l'
esposizione, cioè l'importo dovuto dal cliente a fronte dell'emissione
della RiBa non ancora scaduta.

In maniera predefinita la data delle registrazioni dei pagamenti viene
impostata con la data di scadenza della RiBa, ma è possibile modificarla
successivamente a pagamento effettivamente avvenuto selezionando la
registrazione dalla vista ed elenco ed eseguendo l'azione "Imposta data
di pagamento RiBa".

Known issues / Roadmap
======================
Expand Down Expand Up @@ -135,6 +151,8 @@ Contributors
* `Ooops <https://www.ooops404.com>`_:
* Giovanni Serra <[email protected]>

* Nextev Srl <[email protected]>

Maintainers
~~~~~~~~~~~

Expand Down
1 change: 1 addition & 0 deletions l10n_it_ricevute_bancarie/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
"views/distinta_report.xml",
"views/riba_detail_view.xml",
"views/wizard_presentation.xml",
"views/wizard_riba_payment_date.xml",
"views/wizard_due_date_settlement.xml",
],
"demo": ["demo/riba_demo.xml"],
Expand Down
31 changes: 31 additions & 0 deletions l10n_it_ricevute_bancarie/models/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
# Copyright (C) 2012 Associazione OpenERP Italia
# (<http://www.odoo-italia.org>).
# Copyright (C) 2012-2018 Lorenzo Battistini - Agile Business Group
# Copyright 2024 Nextev Srl
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import _, api, fields, models
Expand Down Expand Up @@ -57,13 +58,33 @@ def _compute_is_unsolved(self):
if len(invoice.unsolved_move_line_ids) != reconciled_unsolved:
invoice.is_unsolved = True

def _compute_open_amount(self):
today = fields.Date.today()

Check warning on line 62 in l10n_it_ricevute_bancarie/models/account.py

View check run for this annotation

Codecov / codecov/patch

l10n_it_ricevute_bancarie/models/account.py#L62

Added line #L62 was not covered by tests
for invoice in self:
if invoice.is_riba_payment:
open_amount_line_ids = invoice.line_ids.filtered(
lambda line, today=today: line.riba
and line.display_type == "payment_term"
and line.date_maturity > today
)
invoice.open_amount = sum(open_amount_line_ids.mapped("balance"))

Check warning on line 70 in l10n_it_ricevute_bancarie/models/account.py

View check run for this annotation

Codecov / codecov/patch

l10n_it_ricevute_bancarie/models/account.py#L70

Added line #L70 was not covered by tests
else:
invoice.open_amount = 0.0

Check warning on line 72 in l10n_it_ricevute_bancarie/models/account.py

View check run for this annotation

Codecov / codecov/patch

l10n_it_ricevute_bancarie/models/account.py#L72

Added line #L72 was not covered by tests

riba_accredited_ids = fields.One2many(
"riba.distinta", "accreditation_move_id", "Credited C/O Slips", readonly=True
)
riba_unsolved_ids = fields.One2many(
"riba.distinta.line", "unsolved_move_id", "Past Due C/O Slips", readonly=True
)

open_amount = fields.Float(
digits="Account",
compute="_compute_open_amount",
default=0.0,
help="Amount currently only supposed to be paid, but has actually not happened",
)

unsolved_move_line_ids = fields.Many2many(
"account.move.line",
"invoice_unsolved_line_rel",
Expand Down Expand Up @@ -265,6 +286,16 @@ def copy(self, default=None):
def get_due_cost_line_ids(self):
return self.invoice_line_ids.filtered(lambda l: l.due_cost_line).ids

def action_riba_payment_date(self):
return {

Check warning on line 290 in l10n_it_ricevute_bancarie/models/account.py

View check run for this annotation

Codecov / codecov/patch

l10n_it_ricevute_bancarie/models/account.py#L290

Added line #L290 was not covered by tests
"type": "ir.actions.act_window",
"name": "RiBa Payment Date",
"res_model": "riba.payment.date",
"view_mode": "form",
"target": "new",
"context": self.env.context,
}


# se distinta_line_ids == None allora non è stata emessa
class AccountMoveLine(models.Model):
Expand Down
27 changes: 24 additions & 3 deletions l10n_it_ricevute_bancarie/models/riba.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
# Copyright (C) 2012 Associazione OpenERP Italia
# (<http://www.odoo-italia.org>).
# Copyright (C) 2012-2017 Lorenzo Battistini - Agile Business Group
# Copyright 2024 Nextev Srl
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from datetime import date

from odoo import _, api, fields, models
from odoo.exceptions import Warning as UserError
Expand Down Expand Up @@ -34,6 +34,12 @@ def _compute_payment_ids(self):
move_lines |= line.payment_ids
riba.payment_ids = move_lines

def _compute_total_amount(self):
for riba in self:
riba.total_amount = 0.0

Check warning on line 39 in l10n_it_ricevute_bancarie/models/riba.py

View check run for this annotation

Codecov / codecov/patch

l10n_it_ricevute_bancarie/models/riba.py#L39

Added line #L39 was not covered by tests
for line in riba.line_ids:
riba.total_amount += line.amount

Check warning on line 41 in l10n_it_ricevute_bancarie/models/riba.py

View check run for this annotation

Codecov / codecov/patch

l10n_it_ricevute_bancarie/models/riba.py#L41

Added line #L41 was not covered by tests

_name = "riba.distinta"
_description = "C/O Slip"
_inherit = ["mail.thread"]
Expand Down Expand Up @@ -127,6 +133,11 @@ def _compute_payment_ids(self):
help="Keep empty to use the current date.",
)

total_amount = fields.Float(
string="Amount",
compute="_compute_total_amount",
)

def action_riba_export(self):
return {
"type": "ir.actions.act_window",
Expand Down Expand Up @@ -216,6 +227,11 @@ def action_cancel_draft(self):
for line in riba_list.line_ids:
line.state = "draft"

def action_open_lines(self):
action = self.env.ref("l10n_it_ricevute_bancarie.detail_riba_action").read()[0]
action["domain"] = [("slip_id", "=", self.id)]
return action

Check warning on line 233 in l10n_it_ricevute_bancarie/models/riba.py

View check run for this annotation

Codecov / codecov/patch

l10n_it_ricevute_bancarie/models/riba.py#L231-L233

Added lines #L231 - L233 were not covered by tests


class RibaListLine(models.Model):
_name = "riba.distinta.line"
Expand Down Expand Up @@ -388,7 +404,7 @@ def confirm(self):
line.invoice_number, line.distinta_id.name, line.sequence
),
"journal_id": journal.id,
"date": line.distinta_id.registration_date,
"date": line.due_date,
}
)
to_be_reconciled = self.env["account.move.line"]
Expand Down Expand Up @@ -494,7 +510,7 @@ def riba_line_settlement(self):
"journal_id": (
riba_line.distinta_id.config_id.settlement_journal_id.id
),
"date": date.today().strftime("%Y-%m-%d"),
"date": riba_line.due_date.strftime("%Y-%m-%d"),
"ref": move_ref,
}
)
Expand Down Expand Up @@ -530,6 +546,11 @@ def riba_line_settlement(self):

to_be_settled.reconcile()

def settle_riba_line(self):
for line in self:
if line.state == "credited":
line.riba_line_settlement()

Check warning on line 552 in l10n_it_ricevute_bancarie/models/riba.py

View check run for this annotation

Codecov / codecov/patch

l10n_it_ricevute_bancarie/models/riba.py#L552

Added line #L552 was not covered by tests


class RibaListMoveLine(models.Model):
_name = "riba.distinta.move.line"
Expand Down
4 changes: 4 additions & 0 deletions l10n_it_ricevute_bancarie/models/riba_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ class RibaConfiguration(models.Model):
"Issue Mode",
required=True,
)
sbf_collection_type = fields.Selection(
[("immediate", "Immediate"), ("maturation", "At currency maturation")],
"Collection Type",
)
bank_id = fields.Many2one(
"res.partner.bank",
"Bank Account",
Expand Down
4 changes: 4 additions & 0 deletions l10n_it_ricevute_bancarie/readme/CONFIGURE.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ Nella configurazione delle Ri.Ba. è possibile specificare se si tratti di
utilizzare al momento dell'accettazione della distinta da parte della banca.
Tale conto deve essere di tipo 'Crediti' (ad esempio "Ri.Ba. all'incasso",
eventualmente da creare).
Selezionando 'Salvo buon fine' è necessario impostare il tipo di
incasso, immediato o a maturazione valuta: questo influisce sulla gestione
degli insoluti perchè solo nel caso di incasso immediato vengono stornate
le registrazioni di presentazione della RiBa.

La configurazione relativa alla fase di accredito, verrà usata nel momento in
cui la banca accredita l'importo della distinta.
Expand Down
2 changes: 2 additions & 0 deletions l10n_it_ricevute_bancarie/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@

* `Ooops <https://www.ooops404.com>`_:
* Giovanni Serra <[email protected]>

* Nextev Srl <[email protected]>
14 changes: 13 additions & 1 deletion l10n_it_ricevute_bancarie/readme/USAGE.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,20 @@ I possibili stati della distinta sono: *Bozza*, *Accettata*, *Accreditata*,
Ad ogni passaggio di stato sarà possibile generare le relative registrazioni
contabili, le quali verranno riepilogate nella scheda «Contabilità».
Questa scheda è presente sia sulla distinta che sulle sue righe.
Queste ultime hanno una vista dedicata per facilitare le
operazioni sul singolo elemento invece che su tutta la distinta.

La voce di menù 'Presentazione Riba' permette di estrarre le riba fino al
raggiungimento dell'importo massimo inserito dall'utente. La stessa procedura
guidata è possibile utilizzarla selezionando i records dalla vista a lista e poi
cliccare su 'Presentazione Riba' tra le azioni.
cliccare su 'Presentazione Riba' tra le azioni.

Nella lista delle fatture è presente una colonna per monitorare l'
esposizione, cioè l'importo dovuto dal cliente a fronte dell'emissione
della RiBa non ancora scaduta.

In maniera predefinita la data delle registrazioni dei pagamenti viene
impostata con la data di scadenza della RiBa, ma è possibile modificarla
successivamente a pagamento effettivamente avvenuto selezionando la
registrazione dalla vista ed elenco ed eseguendo l'azione "Imposta data
di pagamento RiBa".
1 change: 1 addition & 0 deletions l10n_it_ricevute_bancarie/security/ir.model.access.csv
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,4 @@ access_riba_accreditation,riba_accreditation,model_riba_accreditation,account.gr
access_riba_file_export,riba_file_export,model_riba_file_export,account.group_account_invoice,1,1,1,1
access_presentation_riba_issue,access_presentation_riba_issue,model_presentation_riba_issue,account.group_account_invoice,1,1,1,1
access_riba_due_date_settlement,riba_due_date_settlement,model_riba_due_date_settlement,account.group_account_invoice,1,1,1,1
access_riba_payment_date,riba_payment_date,model_riba_payment_date,account.group_account_invoice,1,1,1,1
19 changes: 17 additions & 2 deletions l10n_it_ricevute_bancarie/static/description/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,11 @@ <h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
‘Salvo buon fine’, è necessario specificare almeno il registro e il conto da
utilizzare al momento dell’accettazione della distinta da parte della banca.
Tale conto deve essere di tipo ‘Crediti’ (ad esempio “Ri.Ba. all’incasso”,
eventualmente da creare).</p>
eventualmente da creare).
Selezionando ‘Salvo buon fine’ è necessario impostare il tipo di
incasso, immediato o a maturazione valuta: questo influisce sulla gestione
degli insoluti perchè solo nel caso di incasso immediato vengono stornate
le registrazioni di presentazione della RiBa.</p>
<p>La configurazione relativa alla fase di accredito, verrà usata nel momento in
cui la banca accredita l’importo della distinta.
È possibile utilizzare un registro creato appositamente, ad esempio “Accredito Ri.Ba.”,
Expand All @@ -431,11 +435,21 @@ <h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<em>Pagata</em>, <em>Insoluta</em> e <em>Annullata</em>.
Ad ogni passaggio di stato sarà possibile generare le relative registrazioni
contabili, le quali verranno riepilogate nella scheda «Contabilità».
Questa scheda è presente sia sulla distinta che sulle sue righe.</p>
Questa scheda è presente sia sulla distinta che sulle sue righe.
Queste ultime hanno una vista dedicata per facilitare le
operazioni sul singolo elemento invece che su tutta la distinta.</p>
<p>La voce di menù ‘Presentazione Riba’ permette di estrarre le riba fino al
raggiungimento dell’importo massimo inserito dall’utente. La stessa procedura
guidata è possibile utilizzarla selezionando i records dalla vista a lista e poi
cliccare su ‘Presentazione Riba’ tra le azioni.</p>
<p>Nella lista delle fatture è presente una colonna per monitorare l’
esposizione, cioè l’importo dovuto dal cliente a fronte dell’emissione
della RiBa non ancora scaduta.</p>
<p>In maniera predefinita la data delle registrazioni dei pagamenti viene
impostata con la data di scadenza della RiBa, ma è possibile modificarla
successivamente a pagamento effettivamente avvenuto selezionando la
registrazione dalla vista ed elenco ed eseguendo l’azione “Imposta data
di pagamento RiBa”.</p>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#toc-entry-3">Known issues / Roadmap</a></h1>
Expand Down Expand Up @@ -469,6 +483,7 @@ <h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<li>Sergio Corato &lt;<a class="reference external" href="https://github.com/sergiocorato">https://github.com/sergiocorato</a>&gt;</li>
<li><a class="reference external" href="https://www.ooops404.com">Ooops</a>:
* Giovanni Serra &lt;<a class="reference external" href="mailto:giovanni&#64;gslab.it">giovanni&#64;gslab.it</a>&gt;</li>
<li>Nextev Srl &lt;<a class="reference external" href="mailto:odoo&#64;nextev.it">odoo&#64;nextev.it</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
Expand Down
44 changes: 39 additions & 5 deletions l10n_it_ricevute_bancarie/tests/riba_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,12 @@ def setUp(self):
],
limit=1,
)
self.account_payment_term_riba = self.env.ref(
"l10n_it_ricevute_bancarie.account_payment_term_riba"
)
self.invoice = self._create_invoice()
self.invoice2 = self._create_invoice()
self.invoice_sbf = self._create_sbf_invoice()
self.sbf_effects = self.env["account.account"].create(
{
"code": "STC",
Expand Down Expand Up @@ -100,10 +104,8 @@ def setUp(self):
"company_id": self.company2.id,
}
)
self.riba_config = self.create_config()
self.account_payment_term_riba = self.env.ref(
"l10n_it_ricevute_bancarie.account_payment_term_riba"
)
self.riba_config_sbf_maturation = self.create_config("maturation")
self.riba_config_sbf_immediate = self.create_config("immediate")
self.company_bank.codice_sia = "AA555"

def _create_service_due_cost(self):
Expand All @@ -115,6 +117,37 @@ def _create_service_due_cost(self):
}
)

def _create_sbf_invoice(self):
self.partner.property_account_receivable_id = self.account_rec1_id.id
recent_date = (
self.env["account.move"]
.search([("invoice_date", "!=", False)], order="invoice_date desc", limit=1)
.invoice_date
)
return self.env["account.move"].create(
{
"invoice_date": recent_date,
"move_type": "out_invoice",
"journal_id": self.sale_journal.id,
"partner_id": self.partner.id,
"invoice_payment_term_id": self.account_payment_term_riba.id,
"invoice_line_ids": [
(
0,
0,
{
"name": "product1",
"product_id": self.product1.id,
"quantity": 1.0,
"price_unit": 450.00,
"account_id": self.sale_account.id,
"tax_ids": [[6, 0, []]],
},
)
],
}
)

def _account_expense(self):
return self.env["account.account"].create(
{
Expand Down Expand Up @@ -207,11 +240,12 @@ def _create_pterm2(self):
}
)

def create_config(self):
def create_config(self, sbf_collection_type):
return self.env["riba.configuration"].create(
{
"name": "Subject To Collection",
"type": "sbf",
"sbf_collection_type": sbf_collection_type,
"bank_id": self.company_bank.id,
"acceptance_journal_id": self.bank_journal.id,
"accreditation_journal_id": self.bank_journal.id,
Expand Down
Loading

0 comments on commit 1514290

Please sign in to comment.