OCA / l10n-italy

Odoo Italian localization
https://www.odoo-italia.org
GNU Affero General Public License v3.0
154 stars 305 forks source link

[14.0] l10n_it_fatturapa_in: la migrazione fallisce se ci sono fatture fornitore in bozza #3786

Open odooNextev opened 11 months ago

odooNextev commented 11 months ago

Module

l10n_it_fatturapa_in

Describe the bug

Se durante la migrazione dalla versione 12.0 alla 14.0 sono presenti fatture fornitore in bozza lo script va in errore perché non viene trovata l'account.move collegata ad un'account.invoice in bozza (importato XML, creata fattura, ma non validata).

2023-12-22 13:07:54,793 182605 INFO odoo-14-mig odoo.modules.loading: Loading module l10n_it_fatturapa_in (139/146) 
2023-12-22 13:07:54,978 182605 INFO odoo-14-mig odoo.modules.migration: module l10n_it_fatturapa_in: Running migration [>13.0.1.0.0] pre-migration 
2023-12-22 13:07:54,984 182605 DEBUG odoo-14-mig OpenUpgrade: -1 rows affected after 0:00:00.001954 running ALTER TABLE "einvoice_line" DROP CONSTRAINT "einvoice_line_invoice_id_fkey" 
2023-12-22 13:07:55,541 182605 DEBUG odoo-14-mig OpenUpgrade: 56947 rows affected after 0:00:00.556501 running 
update einvoice_line eil
set
    invoice_id = am.id
from account_invoice inv
    join account_move am on am.id = inv.move_id
where
    eil.invoice_id = inv.id;

2023-12-22 13:07:56,214 182605 INFO odoo-14-mig odoo.modules.registry: module l10n_it_fatturapa_in: creating or updating database tables 
2023-12-22 13:07:56,538 182605 INFO odoo-14-mig odoo.models: Storing computed values of fatturapa.attachment.in.inconsistencies 
2023-12-22 13:07:56,758 182605 INFO odoo-14-mig odoo.schema: Keep unexpected index account_move_statement_line_id_index on table account_move 
2023-12-22 13:07:56,863 182605 ERROR odoo-14-mig odoo.sql_db: bad query: ALTER TABLE "einvoice_line" ADD FOREIGN KEY ("invoice_id") REFERENCES "account_move"("id") ON DELETE cascade
ERROR: insert or update on table "einvoice_line" violates foreign key constraint "einvoice_line_invoice_id_fkey"
DETAIL:  Key (invoice_id)=(21553) is not present in table "account_move".

To Reproduce

Affected versions:

  1. Accedere ad un'istanza Odoo 12.0
  2. Importare XML di una fattura
  3. Creare la fattura dal XML in bozza e non validarla
  4. Migrare il DB alla versione 13.0 e poi alla 14.0 con OpenUpgrade
francesco-ooops commented 10 months ago

@odooNextev quale errore? :)

odooNextev commented 10 months ago

@odooNextev quale errore? :)

Riporto il log appena rieseguo la migrazione

odooNextev commented 10 months ago

@francesco-ooops @tafaRU ho inserito tutto il log dell'errore. Ho rimosso la 16 dalla descrizione perché lo script di migrazione appartiene alla versione 14 e basta.

odooNextev commented 10 months ago

Provo a buttarla lì: la query eseguita nella migrazione non funziona del tutto perché le vecchie account.invoice creano le account.move solo alla validazione perciò non trova l'ID in account.move https://github.com/OCA/l10n-italy/blob/14.0/l10n_it_fatturapa_in/migrations/13.0.1.0.0/pre-migration.py#L32

Cosa ne pensi @tafaRU ?

tafaRU commented 10 months ago

Cosa ne pensi @tafaRU ?

penso che la tua analisi sia corretta :+1: e che prima di fare l'update bisognerebbe verificare che la colonna esista.

odooNextev commented 10 months ago

penso che la tua analisi sia corretta 👍 e che prima di fare l'update bisognerebbe verificare che la colonna esista.

Mi sa che ti riferisci alla colonna old_invoice_id, di cui bisogna solitamente verificarne l'esistenza, ma in questo caso non è chiamata in causa: mi sbaglio? Infatti la colonna invoice_id "normale" c'era già nella versione 12 però si riferiva ad account.invoice, mentre nella 14 a account.move. Questo update https://github.com/OCA/l10n-italy/blob/14.0/l10n_it_fatturapa_in/migrations/13.0.1.0.0/pre-migration.py#L32 di per sè non è errato, ma lascia invariati i campi invoice_id delle einvoice_line delle fatture in bozza, ovvero che non hanno ancora generato una corrispondenza in account.move. Le soluzioni sono 2:

  1. La più veloce sarebbe inserire prima o dopo la query nel pre-migration questa UPDATE per evitare di cercare gli id di account.invoice in account.move creando errori o associazioni errate.
update einvoice_line eil
set invoice_id = NULL
where invoice_id not in (
    select id from account_move
)

Potrebbe funzionare, ma queste einvoice_line rimarranno orfane anche validando la fattura.

  1. Aggiungere uno script di migrazione per creare le account.move relative alle fatture in bozza
odooNextev commented 4 months ago

@tafaRU quale soluzione tra le 2 sarebbe migliore?