OCA / l10n-italy

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

Errore su documenti collegati durante creazione fattura da vendita #2163

Closed LivingWithHippos closed 2 years ago

LivingWithHippos commented 3 years ago

Versioni coinvolte:

Installazione "pulita" con fatturazione + magazzino + acquisti + vendite e tutti gli addon installati a seguito di fatturapa_pec

Passi per riprodurre:

Comportamento osservato:

La creazione della fattura fallisce con il messaggio

L'operazione richiesta non può essere completata per questioni di di sicurezza. Si prega di contattare l'amministratore di sistema.

(Tipo documento: Sales Order Line, Operazione: read) - (Utente: 2, Campi: related_documents)  

Dalla console web:

Server application error
 Error code: 200 
 Error message: Odoo Server Error 
 Error data message:
 L'operazione richiesta non può essere completata per questioni di di sicurezza. Si prega di contattare l'amministratore di sistema.

(Tipo documento: Sales Order Line, Operazione: read) - (Utente: 2, Campi: related_documents)
None 
 Error data debug:
 Traceback (most recent call last):
  File "/opt/bitnami/odoo/odoo/api.py", line 1049, in get
    value = self._data[key][field][record._ids[0]]
KeyError: 2

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/bitnami/odoo/odoo/fields.py", line 1032, in __get__
    value = record.env.cache.get(record, self)
  File "/opt/bitnami/odoo/odoo/api.py", line 1051, in get
    raise CacheMiss(record, field)
odoo.exceptions.CacheMiss: ('sale.order.line(2,).related_documents', None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/bitnami/odoo/odoo/models.py", line 2880, in _prefetch_field
    result = records.read([f.name for f in fs], load='_classic_write')
  File "/opt/bitnami/odoo/odoo/models.py", line 2800, in read
    fields = self.check_field_access_rights('read', fields)
  File "/opt/bitnami/odoo/odoo/models.py", line 2780, in check_field_access_rights
    + ' - ({} {}, {} {})'.format(_('User:'), self._uid, _('Fields:'), ', '.join(invalid_fields))
odoo.exceptions.AccessError: ("L'operazione richiesta non può essere completata per questioni di di sicurezza. Si prega di contattare l'amministratore di sistema.\n\n(Tipo documento: Sales Order Line, Operazione: read) - (Utente: 2, Campi: related_documents)", None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/bitnami/odoo/odoo/http.py", line 656, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "/opt/bitnami/odoo/odoo/http.py", line 314, in _handle_exception
    raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
  File "/opt/bitnami/odoo/odoo/tools/pycompat.py", line 87, in reraise
    raise value
  File "/opt/bitnami/odoo/odoo/http.py", line 698, in dispatch
    result = self._call_function(**self.params)
  File "/opt/bitnami/odoo/odoo/http.py", line 346, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "/opt/bitnami/odoo/odoo/service/model.py", line 98, in wrapper
    return f(dbname, *args, **kwargs)
  File "/opt/bitnami/odoo/odoo/http.py", line 339, in checked_call
    result = self.endpoint(*a, **kw)
  File "/opt/bitnami/odoo/odoo/http.py", line 941, in __call__
    return self.method(*args, **kw)
  File "/opt/bitnami/odoo/odoo/http.py", line 519, in response_wrap
    response = f(*args, **kw)
  File "/opt/bitnami/odoo/odoo/addons/web/controllers/main.py", line 967, in call_button
    action = self._call_kw(model, method, args, {})
  File "/opt/bitnami/odoo/odoo/addons/web/controllers/main.py", line 955, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "/opt/bitnami/odoo/odoo/api.py", line 759, in call_kw
    return _call_kw_multi(method, model, args, kwargs)
  File "/opt/bitnami/odoo/odoo/api.py", line 746, in _call_kw_multi
    result = method(recs, *args, **kwargs)
  File "/opt/bitnami/odoo/odoo/addons/sale/wizard/sale_make_invoice_advance.py", line 136, in create_invoices
    sale_orders.action_invoice_create()
  File "/opt/bitnami/odoo/odoo/addons/sale/models/sale.py", line 608, in action_invoice_create
    invoices[group_key].id, line.qty_to_invoice
  File "/opt/bitnami/odoo/odoo/addons/sale/models/sale.py", line 1445, in invoice_line_create_vals
    vals = line._prepare_invoice_line(qty=qty)
  File "/opt/bitnami/odoo/addons/l10n-italy/l10n_it_fatturapa_sale/models/sale_order_line.py", line 28, in _prepare_invoice_line
    sale_line_documents = self.related_documents
  File "/opt/bitnami/odoo/odoo/fields.py", line 1036, in __get__
    self.determine_value(record)
  File "/opt/bitnami/odoo/odoo/fields.py", line 1139, in determine_value
    record._prefetch_field(self)
  File "/opt/bitnami/odoo/odoo/models.py", line 2883, in _prefetch_field
    result = self.read([f.name for f in fs], load='_classic_write')
  File "/opt/bitnami/odoo/odoo/models.py", line 2800, in read
    fields = self.check_field_access_rights('read', fields)
  File "/opt/bitnami/odoo/odoo/models.py", line 2780, in check_field_access_rights
    + ' - ({} {}, {} {})'.format(_('User:'), self._uid, _('Fields:'), ', '.join(invalid_fields))
odoo.exceptions.AccessError: ("L'operazione richiesta non può essere completata per questioni di di sicurezza. Si prega di contattare l'amministratore di sistema.\n\n(Tipo documento: Sales Order Line, Operazione: read) - (Utente: 2, Campi: related_documents)", None)

Comportamento atteso:

La fattura viene creata.

Questa funzionalità mi sembra sia stata creata da #1708

LivingWithHippos commented 3 years ago

Smanettando un pò ho visto che usando il superutente posso creare la fattura, quindi sembra essere effettivamente un problema di permessi.

Qualche altro dettaglio:

Ho fatto delle prove con i test con questo comando

docker-compose run web \
      --test-enable \
      --stop-after-init \
      -d odoo \
      -i l10n_it_fatturapa_sale

e i test sembrano passare, in compenso l'errore salta fuori testando il modulo di vendite sale (che a quanto pare è diverso dall'applicazione di vendite di sale_management):

INFO odoo odoo.modules.module: odoo.addons.sale.tests.test_access_rights running tests. 
INFO odoo odoo.addons.sale.tests.test_access_rights: test_access_employee (odoo.addons.sale.tests.test_access_rights.TestAccessRights) 
INFO odoo odoo.addons.sale.tests.test_access_rights: ` Test classic employee's access rights 
INFO odoo odoo.addons.base.models.ir_model: Access Denied by ACLs for operation: read, uid: 48, model: sale.order 
INFO odoo odoo.addons.base.models.ir_model: Access Denied by ACLs for operation: write, uid: 48, model: sale.order 
INFO odoo odoo.addons.base.models.ir_model: Access Denied by ACLs for operation: create, uid: 48, model: sale.order 
INFO odoo odoo.addons.base.models.ir_model: Access Denied by ACLs for operation: read, uid: 48, model: sale.order 
INFO odoo odoo.addons.base.models.ir_model: Access Denied by ACLs for operation: read, uid: 48, model: sale.order 
INFO odoo odoo.addons.sale.tests.test_access_rights: test_access_portal_user (odoo.addons.sale.tests.test_access_rights.TestAccessRights) 
INFO odoo odoo.addons.sale.tests.test_access_rights: ` Test portal user's access rights 
INFO odoo odoo.models: L'operazione richiesta non può essere completata a causa delle regole di registrazione: Tipo di documento: sale.order, Operazione: read, Record: 41, Utente: 52 
INFO odoo odoo.addons.base.models.ir_model: Access Denied by ACLs for operation: write, uid: 52, model: sale.order 
INFO odoo odoo.addons.base.models.ir_model: Access Denied by ACLs for operation: read, uid: 52, model: ir.sequence 
INFO odoo odoo.models: Access Denied by ACLs for operation: read, uid: 52, model: sale.order, fields: related_documents 
INFO odoo odoo.models: Access Denied by ACLs for operation: read, uid: 52, model: sale.order, fields: related_documents 
INFO odoo odoo.addons.sale.tests.test_access_rights: test_access_sales_manager (odoo.addons.sale.tests.test_access_rights.TestAccessRights) 
INFO odoo odoo.addons.sale.tests.test_access_rights: ` Test sales manager's access rights 
INFO odoo odoo.models: Access Denied by ACLs for operation: read, uid: 54, model: sale.order, fields: related_documents 
INFO odoo odoo.models: Access Denied by ACLs for operation: read, uid: 54, model: sale.order, fields: related_documents 
ERROR odoo odoo.addons.sale.tests.test_access_rights: ERROR 
INFO odoo odoo.addons.sale.tests.test_access_rights: test_access_sales_person (odoo.addons.sale.tests.test_access_rights.TestAccessRights) 
INFO odoo odoo.addons.sale.tests.test_access_rights: ` Test Salesperson's access rights 
INFO odoo odoo.models: L'operazione richiesta non può essere completata a causa delle regole di registrazione: Tipo di documento: sale.order, Operazione: read, Record: 44, Utente: 61 
INFO odoo odoo.models: Access Denied by record rules for operation: read on record ids: [45], uid: 61, model: sale.order 
INFO odoo odoo.models: Access Denied by ACLs for operation: read, uid: 61, model: sale.order, fields: related_documents 
INFO odoo odoo.models: Access Denied by ACLs for operation: read, uid: 61, model: sale.order, fields: related_documents 
INFO odoo odoo.addons.sale.tests.test_access_rights: ====================================================================== 
ERROR odoo odoo.addons.sale.tests.test_access_rights: ERROR: test_access_sales_manager (odoo.addons.sale.tests.test_access_rights.TestAccessRights) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: ` Test sales manager's access rights 
ERROR odoo odoo.addons.sale.tests.test_access_rights: Traceback (most recent call last): 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/api.py", line 1049, in get 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     value = self._data[key][field][record._ids[0]] 
ERROR odoo odoo.addons.sale.tests.test_access_rights: ` KeyError: 43 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `  
ERROR odoo odoo.addons.sale.tests.test_access_rights: ` During handling of the above exception, another exception occurred: 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `  
ERROR odoo odoo.addons.sale.tests.test_access_rights: ` Traceback (most recent call last): 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/fields.py", line 1065, in __get__ 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     value = record.env.cache.get(record, self) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/api.py", line 1051, in get 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     raise CacheMiss(record, field) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: ` odoo.exceptions.CacheMiss: ('sale.order(43,).related_documents', None) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `  
ERROR odoo odoo.addons.sale.tests.test_access_rights: ` During handling of the above exception, another exception occurred: 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `  
ERROR odoo odoo.addons.sale.tests.test_access_rights: ` Traceback (most recent call last): 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/models.py", line 2880, in _prefetch_field 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     result = records.read([f.name for f in fs], load='_classic_write') 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/models.py", line 2800, in read 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     fields = self.check_field_access_rights('read', fields) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/models.py", line 2780, in check_field_access_rights 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     + ' - ({} {}, {} {})'.format(_('User:'), self._uid, _('Fields:'), ', '.join(invalid_fields)) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: ` odoo.exceptions.AccessError: ("L'operazione richiesta non può essere completata per questioni di di sicurezza. Si prega di contattare l'amministratore di sistema.\n\n(Tipo documento: Sale Order, Operazione: read) - (Utente: 54, Campi: related_documents)", None) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `  
ERROR odoo odoo.addons.sale.tests.test_access_rights: ` During handling of the above exception, another exception occurred: 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `  
ERROR odoo odoo.addons.sale.tests.test_access_rights: ` Traceback (most recent call last): 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/addons/sale/tests/test_access_rights.py", line 78, in test_access_sales_manager 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     sale_order.sudo(self.user_manager).unlink() 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/mnt/extra-addons/l10n-italy/l10n_it_fatturapa_sale/models/sale_order.py", line 36, in unlink 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     related_documents = self.mapped('related_documents') 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/models.py", line 4914, in mapped 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     recs = recs._mapped_func(operator.itemgetter(name)) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/models.py", line 4893, in _mapped_func 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     vals = [func(rec) for rec in self] 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/models.py", line 4893, in <listcomp> 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     vals = [func(rec) for rec in self] 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/models.py", line 5167, in __getitem__ 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     return self._fields[key].__get__(self, type(self)) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/fields.py", line 1069, in __get__ 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     self.determine_value(record) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/fields.py", line 1172, in determine_value 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     record._prefetch_field(self) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/models.py", line 2883, in _prefetch_field 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     result = self.read([f.name for f in fs], load='_classic_write') 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/models.py", line 2800, in read 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     fields = self.check_field_access_rights('read', fields) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `   File "/usr/lib/python3/dist-packages/odoo/models.py", line 2780, in check_field_access_rights 
ERROR odoo odoo.addons.sale.tests.test_access_rights: `     + ' - ({} {}, {} {})'.format(_('User:'), self._uid, _('Fields:'), ', '.join(invalid_fields)) 
ERROR odoo odoo.addons.sale.tests.test_access_rights: ` odoo.exceptions.AccessError: ("L'operazione richiesta non può essere completata per questioni di di sicurezza. Si prega di contattare l'amministratore di sistema.\n\n(Tipo documento: Sale Order, Operazione: read) - (Utente: 54, Campi: related_documents)", None) 
INFO odoo odoo.addons.sale.tests.test_access_rights: Ran 4 tests in 3.923s 
ERROR odoo odoo.addons.sale.tests.test_access_rights: FAILED 
INFO odoo odoo.addons.sale.tests.test_access_rights:  (errors=1) 
ERROR odoo odoo.modules.module: Module sale: 0 failures, 1 errors

Ho provato a guardare i permessi su regole su record e diritti di accesso ma non ho ancora imparato a destreggiarmi abbastanza... Scusa se ti pingo @SimoRubi , hai qualche suggerimento?

SimoRubi commented 3 years ago

Ciao, questo succede perché il collegamento tra le righe d'ordine di vendita e i documenti correlati (ossia il campo related_documents nel modello sale.order.line) è accessibile solo agli utenti nel gruppo Mostrare funzionalità contabili complete: https://github.com/OCA/l10n-italy/blob/f01ef9c96319b45ac8e777e338476b60f67ac75a/l10n_it_fatturapa_sale/models/sale_order_line.py#L15 devi quindi assegnare questo gruppo agli utenti che ti interessano per non avere più l'errore.

Volendo cambiare questo comportamento, si può modificare il gruppo che può accedere ai Documenti correlati in account.group_account_invoice (lo stesso gruppo che può aprire i documenti correlati, le fatture ecc).

SimoRubi commented 3 years ago

@OCA/local-italy-maintainers che ne dite si può chiudere o la teniamo aperta e modifichiamo il comportamento attuale?

LivingWithHippos commented 3 years ago

Confermo che aggiungere l'utente funziona.

A parte il cambiamento di gruppo posso suggerire di aggiungere una specifica al readme di l10n_it_fatturapa_sale che indichi di aggiungere l'utente al gruppo "Mostrare funzionalità contabili complete".

Un altra curiosità, dal codice avrei potuto effettivamente trovare il gruppo group_account_user ma come si può risalire da quello a "Mostrare funzionalità contabili complete"? Il menù gruppi mostra solo i nomi "funzionali"

SimoRubi commented 3 years ago

Un altra curiosità, dal codice avrei potuto effettivamente trovare il gruppo group_account_user ma come si può risalire da quello a "Mostrare funzionalità contabili complete"? Il menù gruppi mostra solo i nomi "funzionali"

In Settings > Technical > Sequences & Identifiers > External Identifiers puoi cercare group_account_user e troverai: image che mostra il nome funzionale. Aprendo la riga puoi anche trovare un collegamento al record del gruppo

eLBati commented 3 years ago

In generale se il campo è accessibile solo da "Mostrare funzionalità contabili complete" , gli utenti che non hanno quel gruppo non dovrebbero ottenere errore, dovrebbero non accedere al (non vedere il) campo

SimoRubi commented 3 years ago

In generale se il campo è accessibile solo da "Mostrare funzionalità contabili complete" , gli utenti che non hanno quel gruppo non dovrebbero ottenere errore, dovrebbero non accedere al (non vedere il) campo

Vero, infatti l'errore non c'è perché l'interfaccia prova a visualizzarlo (in quel caso semplicemente non si vedrebbe), ma perché lo si cerca di leggere lato codice, nello specifico in https://github.com/OCA/l10n-italy/blob/22bc525078fdfbfb778d652fbfb74670afa39da7/l10n_it_fatturapa_sale/models/sale_order_line.py#L28

Quindi pur restando vero che si può aggirare entrando nel gruppo "Mostrare funzionalità contabili complete", penso sia da correggere il codice: https://github.com/OCA/l10n-italy/pull/2334

francesco-ooops commented 3 years ago

@SimoRubi sarebbe ottimo se si riuscisse a mergiare #2334 perchè anche a livello di runbot (oca italy e interno) non si riesce a testare il giro della fatturazione se non perdendo tempo ad investigare come risolvere l'errore, per poi arrivare alla conclusione di dover disinstallare fatturapa_sale o trovare questa issue per capire che bisogna attivare le funzionalità contabili complete (dato che non è scritto nel readme)

SimoRubi commented 3 years ago

@SimoRubi sarebbe ottimo se si riuscisse a mergiare #2334 perchè anche a livello di runbot (oca italy e interno) non si riesce a testare il giro della fatturazione se non perdendo tempo ad investigare come risolvere l'errore, per poi arrivare alla conclusione di dover disinstallare fatturapa_sale o trovare questa issue per capire che bisogna attivare le funzionalità contabili complete (dato che non è scritto nel readme)

Eh sì concordo, puoi lasciare un'approvazione nella PR in modo da sveltire il merge? Lo puoi fare seguendo https://www.odoo-italia.org/documentazione/12.0/sviluppo/review.html#revisione

TheMule71 commented 2 years ago

Sarebbe da provare se la #2084 fixa. L'avevo creata su segnalazione specifica, i dettagli non li ricordo.

SimoRubi commented 2 years ago

@LivingWithHippos puoi verificare se il problema è risolto in 12.0? Io ho appena provato in runboat e il comportamento è quello atteso

francesco-ooops commented 2 years ago

@LivingWithHippos puoi verificare se il problema è risolto in 12.0? Io ho appena provato in runboat e il comportamento è quello atteso

in 12.0 è ok in 14.0 crei fattura solo con le funzionalità contabili complete

GSLabIt commented 2 years ago

v 14: https://github.com/OCA/l10n-italy/pull/2767

francesco-ooops commented 2 years ago

@OCA/local-italy-maintainers mergiamo e chiudiamo? :)

OpenCode commented 2 years ago

@OCA/local-italy-maintainers mergiamo e chiudiamo? :)

Questa è una issue. Cosa intendi con mergiare?

francesco-ooops commented 2 years ago

v 14: #2767

mergiare la PR che risolve la issue

OpenCode commented 2 years ago

Merge dell PRs eseguito. Chiudo.