Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[14.0][IMP] supporto per la conversione degli importi in EUR per fatture in valuta estera #2563

Merged
merged 21 commits into from
Apr 15, 2022

Conversation

TheMule71
Copy link
Contributor

@TheMule71 TheMule71 commented Dec 17, 2021

Vd. discussione in #2042, in particolare #2042 (comment)

Qui l'XML viene generato con Divisa EUR e gli importi convertiti. Per le righe fattura in AltriDatiGestionali vengono riportati i valori originali.

#2590

Aggionamento
Include #2753 e #2763

OCA/OCB@674eaa3
apparently broke odoo.addons.account.tests.common.AccountTestInvoicingCommon
method init_invoice() when called with two opposed values as amounts
(throws odoo.exceptions.UserError: Cannot create unbalanced journal
entry)

One test (test_intra_EU_zero_total) disabled. If/when init_invoice() is
fixed, it will trigger a failure, or the test will be rewritten to adapt
to the new behaviour, whichever comes first.

After
odoo/odoo@81aac30
tests that depend on having a coa installed must be tagged 'post-install'

@TheMule71 TheMule71 changed the title [IMP] supporto per la conversione degli importi in EUR per fatture in valuta estera [14.0][IMP] supporto per la conversione degli importi in EUR per fatture in valuta estera Dec 17, 2021
@francescapenso
Copy link

testata funzionante.
Due note: potrebbe essere utile fare in modo che se il cap non è settato metta il valore default consifligato da ADE
e se righe con note o righe sezione (ovvero con prezzo 0) non venga fatta la "traduzione in valuta

<Divisa>EUR</Divisa>
<Data>2021-12-16</Data>
<Numero>INV/2021/12/0001</Numero>
<ImportoTotaleDocumento>14.00</ImportoTotaleDocumento>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eventuale alternativa: Campo Divisa in USD e ImportoTotaleDocumento in USD e il resto tutto uguale

@TheMule71 TheMule71 force-pushed the 14.0-efattura-out-noeuro branch from 1b351d0 to d3f3aff Compare January 14, 2022 11:30
@TheMule71
Copy link
Contributor Author

TheMule71 commented Jan 14, 2022

Implementate entrambe le opzioni. Ho aggiunto una cosa, le info dei pagamenti (che non c'erano) e ho deciso di trasformare in EUR anche quelli se la Divisa viene forzata a EUR, lasciare gli importi originali altrimenti.
È apparso un settaggio con due opzioni: Force euro oppure Keep original. Il comportamento è deciso in base al valore di quella opzione nella company della fattura (NON in quella corrente dell'utente) al momento della creazione dell'XML.

Aggiunto anche un test per il caso.

Cortesemente validatemi i due XML:
IT06363391001_00015.xml per il force EUR (Francesca style)
IT06363391001_00016.xml per il keep orig (Marco M. style)

@TheMule71
Copy link
Contributor Author

testata funzionante. Due note: potrebbe essere utile fare in modo che se il cap non è settato metta il valore default consifligato da ADE e se righe con note o righe sezione (ovvero con prezzo 0) non venga fatta la "traduzione in valuta

Fatto.

@TheMule71 TheMule71 force-pushed the 14.0-efattura-out-noeuro branch 3 times, most recently from 63f9df7 to 9ac46a1 Compare January 14, 2022 12:06
@eLBati
Copy link
Member

eLBati commented Jan 20, 2022

Cortesemente validatemi i due XML:
IT06363391001_00015.xml per il force EUR (Francesca style)
IT06363391001_00016.xml per il keep orig (Marco M. style)

Gli XML sono validi per ADE.
Grazie

@francescapenso
Copy link

Io l'ho provata e direi ok anche dal mio punto di vista

@AntonioMariaVigliotti
Copy link

Ho provato in locale e quando genero un file xml mi viene questo errore se manca la città del cliente.
Sembra un errore del software ma invece è una caxxata dell'utente. Cmq un messagio di avviso farebbe capire all'utente di aver sbagliato

Traceback (most recent call last):
File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/ir_http.py", line 237, in _dispatch
result = request.dispatch()
File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 684, in dispatch
result = self._call_function(**self.params)
File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 360, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/home/antoniomaria/odoo/oca14/odoo/service/model.py", line 94, in wrapper
return f(dbname, *args, **kwargs)
File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 348, in checked_call
result = self.endpoint(*a, **kw)
File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 913, in call
return self.method(*args, **kw)
File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 532, in response_wrap
response = f(*args, **kw)
File "/home/antoniomaria/odoo/oca14/addons/web/controllers/main.py", line 1393, in call_button
action = self._call_kw(model, method, args, kwargs)
File "/home/antoniomaria/odoo/oca14/addons/web/controllers/main.py", line 1381, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/antoniomaria/odoo/oca14/odoo/api.py", line 399, in call_kw
result = _call_kw_multi(method, model, args, kwargs)
File "/home/antoniomaria/odoo/oca14/odoo/api.py", line 386, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "/home/antoniomaria/odoo/tmp/TheMule71/l10n_it_fatturapa_out/wizard/wizard_export_fatturapa.py", line 151, in exportFatturaPA
attach = self.saveAttachment(fatturapa, progressivo_invio)
File "/home/antoniomaria/odoo/tmp/TheMule71/l10n_it_fatturapa_out/wizard/wizard_export_fatturapa.py", line 52, in saveAttachment
attach_str = fatturapa.to_xml(self.env)
File "/home/antoniomaria/odoo/tmp/TheMule71/l10n_it_fatturapa_out/wizard/efattura.py", line 322, in to_xml
)._render(template_values)
File "/home/antoniomaria/odoo/oca14/addons/web_editor/models/ir_ui_view.py", line 28, in _render
return super(IrUiView, self)._render(values=values, engine=engine, minimal_qcontext=minimal_qcontext)
File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/ir_ui_view.py", line 1717, in _render
return self.env[engine]._render(self.id, qcontext)
File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/ir_qweb.py", line 55, in _render
result = super(IrQWeb, self)._render(id_or_xml_id, values=values, **context)
File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 258, in _render
self.compile(template, options)(self, body.append, values or {})
File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 333, in _compiled_fn
raise e
File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 331, in _compiled_fn
return compiled(self, append, new, options, log)
File "", line 1, in template_l10n_it_fatturapa_out_account_invoice_it_FatturaPA_export_721
File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 333, in _compiled_fn
raise e
File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 331, in _compiled_fn
return compiled(self, append, new, options, log)
File "", line 1, in template_l10n_it_fatturapa_out_account_invoice_it_cessionario_committente_790
File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 338, in _compiled_fn
raise QWebException("Error to render compiling AST", e, path, node and etree.tostring(node[0], encoding='unicode'), name)
Exception

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 640, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 316, in _handle_exception
raise exception.with_traceback(None) from new_cause
odoo.addons.base.models.qweb.QWebException: expected string or bytes-like object
Traceback (most recent call last):
File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 331, in _compiled_fn
return compiled(self, append, new, options, log)
File "", line 1, in template_l10n_it_fatturapa_out_account_invoice_it_FatturaPA_sede_769
File "/home/antoniomaria/odoo/tmp/TheMule71/l10n_it_account/tools/account_tools.py", line 9, in encode_for_export
reg_whitespace.sub(" ", string_to_encode)
TypeError: expected string or bytes-like object

Error to render compiling AST
TypeError: expected string or bytes-like object
Template: l10n_it_fatturapa_out.account_invoice_it_FatturaPA_sede
Path: /t/Comune
Node:

@AntonioMariaVigliotti
Copy link

Quando è impostato a EUR tutto Ok
Quando è impostato in valuta, c'è il codice divisa corretto
Le righe però sono in EUR: mi sembrava di aver capito che le righe sarebbero state in valuta ma forse ricordo male.

@francescapenso
Copy link

Quando è impostato a EUR tutto Ok Quando è impostato in valuta, c'è il codice divisa corretto Le righe però sono in EUR: mi sembrava di aver capito che le righe sarebbero state in valuta ma forse ricordo male.

secondo me è giusto come fatto. Riprendendo anche il riassunto che aveva fatto Simone che copio qui sotto, trovo il comportamento coerente e per altro validato anche da ADE come citava sopra Lorenzo
image

@TheMule71
Copy link
Contributor Author

TheMule71 commented Jan 28, 2022

Ho provato in locale e quando genero un file xml mi viene questo errore se manca la città del cliente. Sembra un errore del software ma invece è una caxxata dell'utente. Cmq un messagio di avviso farebbe capire all'utente di aver sbagliato

Traceback (most recent call last): File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/ir_http.py", line 237, in _dispatch result = request.dispatch() File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 684, in dispatch result = self._call_function(**self.params) File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 360, in _call_function return checked_call(self.db, *args, **kwargs) File "/home/antoniomaria/odoo/oca14/odoo/service/model.py", line 94, in wrapper return f(dbname, *args, **kwargs) File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 348, in checked_call result = self.endpoint(*a, **kw) File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 913, in call return self.method(*args, **kw) File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 532, in response_wrap response = f(*args, **kw) File "/home/antoniomaria/odoo/oca14/addons/web/controllers/main.py", line 1393, in call_button action = self._call_kw(model, method, args, kwargs) File "/home/antoniomaria/odoo/oca14/addons/web/controllers/main.py", line 1381, in _call_kw return call_kw(request.env[model], method, args, kwargs) File "/home/antoniomaria/odoo/oca14/odoo/api.py", line 399, in call_kw result = _call_kw_multi(method, model, args, kwargs) File "/home/antoniomaria/odoo/oca14/odoo/api.py", line 386, in _call_kw_multi result = method(recs, *args, **kwargs) File "/home/antoniomaria/odoo/tmp/TheMule71/l10n_it_fatturapa_out/wizard/wizard_export_fatturapa.py", line 151, in exportFatturaPA attach = self.saveAttachment(fatturapa, progressivo_invio) File "/home/antoniomaria/odoo/tmp/TheMule71/l10n_it_fatturapa_out/wizard/wizard_export_fatturapa.py", line 52, in saveAttachment attach_str = fatturapa.to_xml(self.env) File "/home/antoniomaria/odoo/tmp/TheMule71/l10n_it_fatturapa_out/wizard/efattura.py", line 322, in to_xml )._render(template_values) File "/home/antoniomaria/odoo/oca14/addons/web_editor/models/ir_ui_view.py", line 28, in _render return super(IrUiView, self)._render(values=values, engine=engine, minimal_qcontext=minimal_qcontext) File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/ir_ui_view.py", line 1717, in _render return self.env[engine]._render(self.id, qcontext) File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/ir_qweb.py", line 55, in _render result = super(IrQWeb, self)._render(id_or_xml_id, values=values, **context) File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 258, in _render self.compile(template, options)(self, body.append, values or {}) File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 333, in _compiled_fn raise e File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 331, in _compiled_fn return compiled(self, append, new, options, log) File "", line 1, in template_l10n_it_fatturapa_out_account_invoice_it_FatturaPA_export_721 File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 333, in _compiled_fn raise e File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 331, in _compiled_fn return compiled(self, append, new, options, log) File "", line 1, in template_l10n_it_fatturapa_out_account_invoice_it_cessionario_committente_790 File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 338, in _compiled_fn raise QWebException("Error to render compiling AST", e, path, node and etree.tostring(node[0], encoding='unicode'), name) Exception

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 640, in _handle_exception return super(JsonRequest, self)._handle_exception(exception) File "/home/antoniomaria/odoo/oca14/odoo/http.py", line 316, in _handle_exception raise exception.with_traceback(None) from new_cause odoo.addons.base.models.qweb.QWebException: expected string or bytes-like object Traceback (most recent call last): File "/home/antoniomaria/odoo/oca14/odoo/addons/base/models/qweb.py", line 331, in _compiled_fn return compiled(self, append, new, options, log) File "", line 1, in template_l10n_it_fatturapa_out_account_invoice_it_FatturaPA_sede_769 File "/home/antoniomaria/odoo/tmp/TheMule71/l10n_it_account/tools/account_tools.py", line 9, in encode_for_export reg_whitespace.sub(" ", string_to_encode) TypeError: expected string or bytes-like object

Error to render compiling AST TypeError: expected string or bytes-like object Template: l10n_it_fatturapa_out.account_invoice_it_FatturaPA_sede Path: /t/Comune Node:

Il problema è di fatturapa_out, non riguarda il codice di questa PR, ma già che ci siamo (visto che ho già in canna un commit separato di fix su problema analogo, integro anche questa fix).

Edit: concetto giusto, PR sbagliata, la fix la metto in #2606.

@eLBati
Copy link
Member

eLBati commented Feb 4, 2022

Come mai 2 commit?
BTW ci sono conflitti

@TheMule71
Copy link
Contributor Author

Come mai 2 commit? BTW ci sono conflitti

Il commit sarebbe uno, ma ho separato le modifiche per modulo uno per fatturapa_out e l'altro per fatturapa_out_sp.

#2559 ha spaccato un paio di cose, ma lo sapevamo. Va fatto un refactoring.

Copy link

@zeroincombenze zeroincombenze left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Funziona come concordato in ambedue le casistiche

@TheMule71 TheMule71 force-pushed the 14.0-efattura-out-noeuro branch from 9ac46a1 to 7648b2c Compare February 11, 2022 11:16
@TheMule71
Copy link
Contributor Author

TheMule71 commented Feb 11, 2022

Adesso sistema fatturapa_out, fatturapa_out_sp e fatturapa_out_rc.
Al momento, non risulta nessun altro modulo mergiato che modifichi ImportoTotaleDocumento.
Il nuovo sistema non è ideale, ma va tenuto conto che il refactoring della parte efattura.py è già previsto, e molte cose finiranno nel wizard.

A proposito, toccando 3 moduli, ho splittato il commit in 3 parti. Questo dovrebbe agevolare il porting futuro (se non altro in fase di git show o equivalenti, non ti trovi modifiche a file esterni al modulo che stai guardando).

@TheMule71 TheMule71 requested a review from eLBati February 11, 2022 12:29
@francescapenso
Copy link

@eLBati riesci a fare la review di questa?

@TheMule71 TheMule71 force-pushed the 14.0-efattura-out-noeuro branch from 59c10af to 480f766 Compare April 15, 2022 12:41
env.ref("product.product_product_10") is a demo data we use in tests

Prior to commit 86febae278f08864e83017d43f6aa9d67165d664 in odoo
the original price (14.0 USD) was taken as EUR (from the company
currency), and converted to 16.38 USD when added to a invoice
with currency USD. This module used to convert it back to 14.0 EUR.

After 86febae278f08864e83017d43f6aa9d67165d664, the product is added
to a invoice with currency == USD with the correct price, 14.00,
which is later converted to 11.97 EUR by this module.
@TheMule71 TheMule71 force-pushed the 14.0-efattura-out-noeuro branch from 480f766 to e1875f3 Compare April 15, 2022 13:22
@TheMule71
Copy link
Contributor Author

Include #2753 e #2763, altrimenti nessuna delle 3 potrebbe avere i test verdi.

@robyf70
Copy link
Contributor

robyf70 commented Apr 15, 2022

@TheMule71 Gli importi non vanno convertiti in EURO, vanno lasciati in valuta indicando la divisa e il cambio utilizzati

@robyf70
Copy link
Contributor

robyf70 commented Apr 15, 2022

scusate se arrivo solo adesso.

Copy link
Member

@tafaRU tafaRU left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

review tecnica 👍

@TheMule71
Copy link
Contributor Author

scusate se arrivo solo adesso.

La discussione c'è da 1 anno e passa. Vd. #2042. La parte rilevante è:

 l’operatore dovrà specificare in fattura (anche nei campi descrittivi) che gli importi dell’imponibile e dell’IVA
delle singole righe e dei dati di riepilogo sono in Euro e solo l’importo totale della fattura (che il SdI non
controlla) si intenderà in valuta estera.
 gli importi delle singole righe dei <DatiRiepilogo> e, in particolare, dei campi 2.2.2.5
<ImponibileImporto> e 2.2.2.6 <Imposta> saranno considerati dall’Agenzia delle Entrate in Euro;

@robyf70
Copy link
Contributor

robyf70 commented Apr 15, 2022

scusate se arrivo solo adesso.

La discussione c'è da 1 anno e passa. Vd. #2042. La parte rilevante è:

 l’operatore dovrà specificare in fattura (anche nei campi descrittivi) che gli importi dell’imponibile e dell’IVA
delle singole righe e dei dati di riepilogo sono in Euro e solo l’importo totale della fattura (che il SdI non
controlla) si intenderà in valuta estera.
 gli importi delle singole righe dei <DatiRiepilogo> e, in particolare, dei campi 2.2.2.5
<ImponibileImporto> e 2.2.2.6 <Imposta> saranno considerati dall’Agenzia delle Entrate in Euro;

Si ho visto rileggendo bene tutto :)!

@TheMule71
Copy link
Contributor Author

scusate se arrivo solo adesso.

La discussione c'è da 1 anno e passa. Vd. #2042. La parte rilevante è:

 l’operatore dovrà specificare in fattura (anche nei campi descrittivi) che gli importi dell’imponibile e dell’IVA
delle singole righe e dei dati di riepilogo sono in Euro e solo l’importo totale della fattura (che il SdI non
controlla) si intenderà in valuta estera.
 gli importi delle singole righe dei <DatiRiepilogo> e, in particolare, dei campi 2.2.2.5
<ImponibileImporto> e 2.2.2.6 <Imposta> saranno considerati dall’Agenzia delle Entrate in Euro;

Si ho visto rileggendo bene tutto :)!

Quindi approvata?

@robyf70
Copy link
Contributor

robyf70 commented Apr 15, 2022

scusate se arrivo solo adesso.

La discussione c'è da 1 anno e passa. Vd. #2042. La parte rilevante è:

 l’operatore dovrà specificare in fattura (anche nei campi descrittivi) che gli importi dell’imponibile e dell’IVA
delle singole righe e dei dati di riepilogo sono in Euro e solo l’importo totale della fattura (che il SdI non
controlla) si intenderà in valuta estera.
 gli importi delle singole righe dei <DatiRiepilogo> e, in particolare, dei campi 2.2.2.5
<ImponibileImporto> e 2.2.2.6 <Imposta> saranno considerati dall’Agenzia delle Entrate in Euro;

Si ho visto rileggendo bene tutto :)!

Quindi approvata?

Stò facendo la review

@TheMule71
Copy link
Contributor Author

Stò facendo la review

Riesci a collegarti su discord? Noi avevamo il dito sul merge...

Copy link
Contributor

@robyf70 robyf70 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@robyf70
Copy link
Contributor

robyf70 commented Apr 15, 2022

Stò facendo la review

Riesci a collegarti su discord? Noi avevamo il dito sul merge...

Mi pare ok 👍

@tafaRU
Copy link
Member

tafaRU commented Apr 15, 2022

/ocabot merge patch

@OCA-git-bot
Copy link
Contributor

On my way to merge this fine PR!
Prepared branch 14.0-ocabot-merge-pr-2563-by-tafaRU-bump-patch, awaiting test results.

@OCA-git-bot OCA-git-bot merged commit 32300e3 into OCA:14.0 Apr 15, 2022
@OCA-git-bot
Copy link
Contributor

Congratulations, your PR was merged at d1a2fe4. Thanks a lot for contributing to OCA. ❤️

@TheMule71 TheMule71 deleted the 14.0-efattura-out-noeuro branch February 3, 2023 18:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants