47 lines
2.3 KiB
Python
47 lines
2.3 KiB
Python
from odoo import _, api, models
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class IrAttachment(models.Model):
|
|
_inherit = 'ir.attachment'
|
|
|
|
@api.ondelete(at_uninstall=False)
|
|
def _unlink_except_rejected_zatca_document(self):
|
|
'''
|
|
Prevents unlinking of rejected XML documents
|
|
'''
|
|
descr = 'Rejected ZATCA Document not to be deleted - ثيقة ZATCA المرفوضة لا يجوز حذفها'
|
|
for attach in self.filtered(lambda a: a.description == descr and a.res_model == 'account.move'):
|
|
move = self.env['account.move'].browse(attach.res_id)
|
|
if move.country_code == "SA":
|
|
raise UserError(_("You can't unlink an attachment being an EDI document refused by the government."))
|
|
|
|
@api.ondelete(at_uninstall=False)
|
|
def _unlink_except_validated_pdf_invoices(self):
|
|
'''
|
|
Prevents unlinking of invoice pdfs linked to an invoice
|
|
where the pdf attachment was created after or at the same time as the edi_documents last write date.
|
|
'''
|
|
attachments_to_check = self.filtered(
|
|
lambda attachment: attachment.res_model == "account.move"
|
|
and attachment.res_field == "invoice_pdf_report_file"
|
|
)
|
|
res = self.env["account.edi.document"]._read_group(
|
|
domain=[("move_id", "in", attachments_to_check.mapped("res_id")), ("state", "=", "sent"), ("edi_format_id.code", "=", "sa_zatca")],
|
|
aggregates=["write_date:min"],
|
|
groupby=["move_id"],
|
|
)
|
|
edi_documents = {doc[0].id: doc[1] for doc in res}
|
|
restricted_attachments = self.env["ir.attachment"]
|
|
for attachment in attachments_to_check:
|
|
if (document_date := edi_documents.get(attachment.res_id)) and attachment.create_date >= document_date:
|
|
restricted_attachments += attachment
|
|
if restricted_attachments:
|
|
raise UserError(_(
|
|
"Oops! The invoice PDF(s) are linked to a validated EDI document and cannot be deleted according to ZATCA rules: %s",
|
|
", ".join(restricted_attachments.mapped("name"))))
|
|
|
|
def _get_posted_pdf_moves_to_check(self):
|
|
# Extends l10n_sa: to bypass the unlink check in l10n_sa for posted moves
|
|
return super()._get_posted_pdf_moves_to_check().filtered(lambda rec: not rec.edi_state)
|