diff --git a/l10n_it_ricevute_bancarie/README.rst b/l10n_it_ricevute_bancarie/README.rst index a21f8f61e50..38ae6700752 100644 --- a/l10n_it_ricevute_bancarie/README.rst +++ b/l10n_it_ricevute_bancarie/README.rst @@ -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. @@ -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 ====================== @@ -135,6 +151,8 @@ Contributors * `Ooops `_: * Giovanni Serra +* Nextev Srl + Maintainers ~~~~~~~~~~~ diff --git a/l10n_it_ricevute_bancarie/__manifest__.py b/l10n_it_ricevute_bancarie/__manifest__.py index 9d8099dbf4e..2834f38dc6e 100644 --- a/l10n_it_ricevute_bancarie/__manifest__.py +++ b/l10n_it_ricevute_bancarie/__manifest__.py @@ -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"], diff --git a/l10n_it_ricevute_bancarie/models/account.py b/l10n_it_ricevute_bancarie/models/account.py index d42bea83c41..f1260725ab5 100644 --- a/l10n_it_ricevute_bancarie/models/account.py +++ b/l10n_it_ricevute_bancarie/models/account.py @@ -4,6 +4,7 @@ # Copyright (C) 2012 Associazione OpenERP Italia # (). # 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 @@ -57,6 +58,19 @@ 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() + 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")) + else: + invoice.open_amount = 0.0 + riba_accredited_ids = fields.One2many( "riba.distinta", "accreditation_move_id", "Credited C/O Slips", readonly=True ) @@ -64,6 +78,13 @@ def _compute_is_unsolved(self): "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", @@ -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 { + "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): diff --git a/l10n_it_ricevute_bancarie/models/riba.py b/l10n_it_ricevute_bancarie/models/riba.py index ee9ce36249e..c5cafb203b1 100644 --- a/l10n_it_ricevute_bancarie/models/riba.py +++ b/l10n_it_ricevute_bancarie/models/riba.py @@ -4,9 +4,9 @@ # Copyright (C) 2012 Associazione OpenERP Italia # (). # 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 @@ -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 + for line in riba.line_ids: + riba.total_amount += line.amount + _name = "riba.distinta" _description = "C/O Slip" _inherit = ["mail.thread"] @@ -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", @@ -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_riba.detail_riba_action").read()[0] + action["domain"] = [("slip_id", "=", self.id)] + return action + class RibaListLine(models.Model): _name = "riba.distinta.line" @@ -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"] @@ -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, } ) @@ -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() + class RibaListMoveLine(models.Model): _name = "riba.distinta.move.line" diff --git a/l10n_it_ricevute_bancarie/models/riba_config.py b/l10n_it_ricevute_bancarie/models/riba_config.py index 92229b2b6ff..11954fcd81d 100644 --- a/l10n_it_ricevute_bancarie/models/riba_config.py +++ b/l10n_it_ricevute_bancarie/models/riba_config.py @@ -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", diff --git a/l10n_it_ricevute_bancarie/readme/CONFIGURE.rst b/l10n_it_ricevute_bancarie/readme/CONFIGURE.rst index fa435df3606..8cf318cddc1 100644 --- a/l10n_it_ricevute_bancarie/readme/CONFIGURE.rst +++ b/l10n_it_ricevute_bancarie/readme/CONFIGURE.rst @@ -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. diff --git a/l10n_it_ricevute_bancarie/readme/CONTRIBUTORS.rst b/l10n_it_ricevute_bancarie/readme/CONTRIBUTORS.rst index dc7b23f106a..1cb5e1ff41d 100644 --- a/l10n_it_ricevute_bancarie/readme/CONTRIBUTORS.rst +++ b/l10n_it_ricevute_bancarie/readme/CONTRIBUTORS.rst @@ -12,3 +12,5 @@ * `Ooops `_: * Giovanni Serra + +* Nextev Srl diff --git a/l10n_it_ricevute_bancarie/readme/USAGE.rst b/l10n_it_ricevute_bancarie/readme/USAGE.rst index ba6c6858a4f..2f49be5d478 100644 --- a/l10n_it_ricevute_bancarie/readme/USAGE.rst +++ b/l10n_it_ricevute_bancarie/readme/USAGE.rst @@ -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". diff --git a/l10n_it_ricevute_bancarie/security/ir.model.access.csv b/l10n_it_ricevute_bancarie/security/ir.model.access.csv index c037b87c217..1541f9c851f 100644 --- a/l10n_it_ricevute_bancarie/security/ir.model.access.csv +++ b/l10n_it_ricevute_bancarie/security/ir.model.access.csv @@ -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 diff --git a/l10n_it_ricevute_bancarie/static/description/index.html b/l10n_it_ricevute_bancarie/static/description/index.html index 0541dd2f537..f813930a406 100644 --- a/l10n_it_ricevute_bancarie/static/description/index.html +++ b/l10n_it_ricevute_bancarie/static/description/index.html @@ -404,7 +404,11 @@

Configuration

‘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).

+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. È possibile utilizzare un registro creato appositamente, ad esempio “Accredito Ri.Ba.”, @@ -431,11 +435,21 @@

Usage

Pagata, Insoluta e Annullata. 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.

+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.

+

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

@@ -469,6 +483,7 @@

Contributors

  • Sergio Corato <https://github.com/sergiocorato>
  • Ooops: * Giovanni Serra <giovanni@gslab.it>
  • +
  • Nextev Srl <odoo@nextev.it>
  • diff --git a/l10n_it_ricevute_bancarie/tests/riba_common.py b/l10n_it_ricevute_bancarie/tests/riba_common.py index ef8ace99e8f..e58d3c4f5f8 100644 --- a/l10n_it_ricevute_bancarie/tests/riba_common.py +++ b/l10n_it_ricevute_bancarie/tests/riba_common.py @@ -67,8 +67,12 @@ def setUp(self): ], limit=1, ) + self.account_payment_term_riba = self.env.ref( + "l10n_it_riba.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", @@ -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): @@ -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( { @@ -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, diff --git a/l10n_it_ricevute_bancarie/tests/test_riba.py b/l10n_it_ricevute_bancarie/tests/test_riba.py index c6c62d3ff4e..5360f6bd321 100644 --- a/l10n_it_ricevute_bancarie/tests/test_riba.py +++ b/l10n_it_ricevute_bancarie/tests/test_riba.py @@ -68,35 +68,8 @@ def test_delete_due_cost_line(self): # Collection fees line has been unlink self.assertEqual(len(self.invoice.invoice_line_ids), 1) - def test_riba_flow(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 - ) - invoice = 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, - }, - ) - ], - } - ) + def riba_sbf_common(self, configuration_id): + invoice = self._create_sbf_invoice() invoice._onchange_riba_partner_bank_id() invoice.action_post() riba_move_line_id = False @@ -121,7 +94,7 @@ def test_riba_flow(self): # issue wizard wizard_riba_issue = self.env["riba.issue"].create( - {"configuration_id": self.riba_config.id} + {"configuration_id": configuration_id} ) action = wizard_riba_issue.with_context( {"active_ids": [riba_move_line_id]} @@ -169,6 +142,10 @@ def test_riba_flow(self): ) wiz_accreditation.create_move() self.assertEqual(riba_list.state, "accredited") + return invoice, riba_list + + def test_riba_sbf_maturation_flow(self): + invoice, riba_list = self.riba_sbf_common(self.riba_config_sbf_maturation.id) bank_accreditation_line = False for accr_line in riba_list.accreditation_move_id.line_ids: @@ -241,6 +218,59 @@ def test_riba_flow(self): self.assertEqual(riba_list.state, "accredited") self.assertEqual(riba_list.line_ids[0].state, "accredited") + def test_riba_sbf_immediate_flow(self): + invoice, riba_list = self.riba_sbf_common(self.riba_config_sbf_immediate.id) + + # past due wizard + past_due_wizard = ( + self.env["riba.past_due"] + .with_context( + active_model="riba.slip.line", + active_ids=[riba_list.line_ids[0].id], + active_id=riba_list.line_ids[0].id, + ) + .create( + { + "bank_amount": 455, + "expense_amount": 5, + } + ) + ) + past_due_wizard.create_move() + self.assertEqual(riba_list.state, "past_due") + self.assertEqual(len(riba_list.line_ids), 1) + self.assertEqual(riba_list.line_ids[0].state, "past_due") + self.assertTrue(invoice.past_due_move_line_ids) + + # Verifica storno registrazioni di presentazione della RiBa + past_due_line_ids = riba_list.line_ids.past_due_move_id.line_ids + past_due_line_id_bills = past_due_line_ids.filtered( + lambda line: line.name == "Bills" + ) + self.assertEqual(len(past_due_line_id_bills), 1) + self.assertEqual( + past_due_line_id_bills.account_id, past_due_wizard.effects_account_id + ) + self.assertEqual(past_due_line_id_bills.credit, past_due_wizard.effects_amount) + past_due_line_id_riba = past_due_line_ids.filtered( + lambda line: line.name == "RiBa" + ) + self.assertEqual(len(past_due_line_id_riba), 1) + self.assertEqual( + past_due_line_id_riba.account_id, past_due_wizard.riba_bank_account_id + ) + self.assertEqual(past_due_line_id_riba.debit, past_due_wizard.riba_bank_amount) + + # Se la compute non viene invocata il test fallisce + riba_list._compute_past_due_move_ids() + self.assertEqual(len(riba_list.past_due_move_ids), 1) + bank_past_due_line = False + for past_due_line in riba_list.past_due_move_ids[0].line_ids: + if past_due_line.account_id.id == self.bank_account.id: + bank_past_due_line = past_due_line + break + self.assertTrue(bank_past_due_line) + def test_unsolved_riba(self): # create another invoice to test past due C/O self.partner.property_account_receivable_id = self.account_rec1_id.id @@ -278,7 +308,7 @@ def test_unsolved_riba(self): riba_move_line_id = move_line.id # issue wizard wizard_riba_issue = self.env["riba.issue"].create( - {"configuration_id": self.riba_config.id} + {"configuration_id": self.riba_config_sbf_maturation.id} ) action = wizard_riba_issue.with_context( {"active_ids": [riba_move_line_id]} @@ -356,11 +386,6 @@ def test_unsolved_riba(self): # self.assertTrue( # bank_unsolved_line.id in [l.id for l in move_lines_for_rec]) - riba_list.line_ids[0].unsolved_move_id.line_ids.remove_move_reconcile() - self.assertEqual(riba_list.state, "accredited") - self.assertEqual(len(riba_list.line_ids), 1) - self.assertEqual(riba_list.line_ids[0].state, "accredited") - def test_riba_fatturapa(self): self.partner.property_account_receivable_id = self.account_rec1_id.id recent_date = ( @@ -409,7 +434,7 @@ def test_riba_fatturapa(self): lambda x: x.account_id == self.account_rec1_id ) wizard_riba_issue = self.env["riba.issue"].create( - {"configuration_id": self.riba_config.id} + {"configuration_id": self.riba_config_sbf_maturation.id} ) action = wizard_riba_issue.with_context( {"active_ids": [riba_move_line_id.id]} @@ -512,7 +537,7 @@ def test_riba_fatturapa_group(self): lambda x: x.account_id == self.account_rec1_id ) wizard_riba_issue = self.env["riba.issue"].create( - {"configuration_id": self.riba_config.id} + {"configuration_id": self.riba_config_sbf_maturation.id} ) action = wizard_riba_issue.with_context( {"active_ids": [riba_move_line_id.id, riba_move_line1_id.id]} diff --git a/l10n_it_ricevute_bancarie/views/account_view.xml b/l10n_it_ricevute_bancarie/views/account_view.xml index bf342280da3..ca8f5d58bb7 100644 --- a/l10n_it_ricevute_bancarie/views/account_view.xml +++ b/l10n_it_ricevute_bancarie/views/account_view.xml @@ -170,6 +170,7 @@ + diff --git a/l10n_it_ricevute_bancarie/views/configuration_view.xml b/l10n_it_ricevute_bancarie/views/configuration_view.xml index 95bf159b90a..e4345d267b3 100644 --- a/l10n_it_ricevute_bancarie/views/configuration_view.xml +++ b/l10n_it_ricevute_bancarie/views/configuration_view.xml @@ -12,6 +12,10 @@ + + diff --git a/l10n_it_ricevute_bancarie/views/riba_view.xml b/l10n_it_ricevute_bancarie/views/riba_view.xml index f68bf9a3979..63af580d18f 100644 --- a/l10n_it_ricevute_bancarie/views/riba_view.xml +++ b/l10n_it_ricevute_bancarie/views/riba_view.xml @@ -51,6 +51,7 @@ + @@ -63,61 +64,63 @@ riba.distinta.line
    - - - + + + - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - + - + + - -
    - - - - - - - - - - - - - - - - - - - - - +
    + + + + + + + + +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + +
    + +
    @@ -167,80 +170,96 @@ /> - - - - - - - - - - - - - - - - - -
    + + + + + + + + + + + + + + + + + +