feat: enforce electronic invoicing operator access

This commit is contained in:
Julien Denizot
2026-06-21 15:09:05 +00:00
parent 866bf4b213
commit 25a7b53b4e
11 changed files with 73 additions and 9 deletions
+3 -1
View File
@@ -10,6 +10,8 @@ from xml.etree import ElementTree
import frappe
from frappe import _
from enuxia_einvoice.permissions import require_sales_invoice_access
from frappe.utils import now_datetime
from frappe.utils.file_manager import save_file
@@ -194,7 +196,7 @@ def convert_sales_invoice_to_ubl(
"Sales Invoice",
invoice_name,
)
invoice.check_permission("write")
require_sales_invoice_access(invoice)
if invoice.docstatus != 1:
frappe.throw(
+5 -1
View File
@@ -9,6 +9,10 @@ from uuid import uuid4
import frappe
from frappe import _
from enuxia_einvoice.permissions import (
require_sales_invoice_access,
)
from frappe.utils import now_datetime
from enuxia_einvoice.sales_invoice import (
@@ -193,7 +197,7 @@ def prepare_sales_invoice_exchange(
"Sales Invoice",
invoice_name,
)
invoice.check_permission("write")
require_sales_invoice_access(invoice)
customer = frappe.get_doc(
"Customer",
+6 -1
View File
@@ -8,6 +8,8 @@ from typing import Any
import frappe
from frappe import _
from enuxia_einvoice.permissions import require_sales_invoice_access
from enuxia_einvoice.builders.en16931 import (
EN16931BuildError,
build_en16931_invoice,
@@ -185,7 +187,10 @@ def generate_sales_invoice_en16931(
"Sales Invoice",
invoice_name,
)
invoice.check_permission("read")
require_sales_invoice_access(
invoice,
permission="read",
)
if invoice.docstatus != 1:
frappe.throw(
+5 -1
View File
@@ -7,6 +7,10 @@ from typing import Any
import frappe
from frappe import _
from enuxia_einvoice.permissions import (
require_sales_invoice_access,
)
from frappe.utils import flt, now_datetime
from enuxia_einvoice.inbound_sync import (
@@ -38,7 +42,7 @@ def _get_submitted_sales_invoice(
invoice_name,
)
invoice.check_permission("write")
require_sales_invoice_access(invoice)
if invoice.docstatus != 1:
frappe.throw(
+21
View File
@@ -146,3 +146,24 @@ def require_exchange_access(
require_company_access(
exchange.company
)
def require_sales_invoice_access(
invoice,
*,
permission: str = "write",
minimum_role: str = ROLE_OPERATOR,
) -> None:
"""Autoriser une action électronique sur une facture de vente."""
require_einvoice_role(
minimum_role
)
invoice.check_permission(
permission
)
require_company_access(
invoice.company
)
+3 -1
View File
@@ -8,6 +8,8 @@ from uuid import uuid4
import frappe
from frappe import _
from enuxia_einvoice.permissions import require_sales_invoice_access
from frappe.utils import now_datetime
@@ -215,7 +217,7 @@ def validate_sales_invoice(
"Sales Invoice",
invoice_name,
)
invoice.check_permission("write")
require_sales_invoice_access(invoice)
customer = None
+6 -2
View File
@@ -11,6 +11,10 @@ from typing import Any
import frappe
from frappe import _
from enuxia_einvoice.permissions import (
require_sales_invoice_access,
)
from frappe.utils import get_datetime, now_datetime
from requests import RequestException
@@ -481,7 +485,7 @@ def send_sales_invoice(
"Sales Invoice",
invoice_name,
)
invoice.check_permission("write")
require_sales_invoice_access(invoice)
if invoice.docstatus != 1:
frappe.throw(
@@ -700,7 +704,7 @@ def sync_sales_invoice_status(
"Sales Invoice",
invoice_name,
)
invoice.check_permission("read")
require_sales_invoice_access(invoice)
exchange = _get_exchange(invoice)
@@ -12,6 +12,15 @@ from enuxia_einvoice.payment_reporting import (
class TestPaymentReporting(unittest.TestCase):
def setUp(self) -> None:
permission_patcher = patch(
"enuxia_einvoice.payment_reporting."
"require_sales_invoice_access"
)
permission_patcher.start()
self.addCleanup(
permission_patcher.stop
)
translation_patcher = patch(
"enuxia_einvoice.payment_reporting._",
side_effect=(
+9
View File
@@ -13,6 +13,15 @@ class TestElectronicInvoiceWorkflow(unittest.TestCase):
def setUp(self) -> None:
"""Neutraliser la traduction Frappe dans les tests unitaires purs."""
permission_patcher = patch(
"enuxia_einvoice.workflow."
"require_sales_invoice_access"
)
permission_patcher.start()
self.addCleanup(
permission_patcher.stop
)
translation_patcher = patch(
"enuxia_einvoice.workflow._",
side_effect=lambda message, *args, **kwargs: message,
+3 -1
View File
@@ -9,6 +9,8 @@ from typing import Any
import frappe
from frappe import _
from enuxia_einvoice.permissions import require_sales_invoice_access
from frappe.utils import now_datetime
from enuxia_einvoice.providers.superpdp.client import (
@@ -239,7 +241,7 @@ def validate_sales_invoice_ubl(
"Sales Invoice",
invoice_name,
)
invoice.check_permission("write")
require_sales_invoice_access(invoice)
exchange = _get_exchange(invoice)
+3 -1
View File
@@ -8,6 +8,8 @@ from typing import Any
import frappe
from frappe import _
from enuxia_einvoice.permissions import require_sales_invoice_access
from enuxia_einvoice.conversion import (
convert_sales_invoice_to_ubl,
)
@@ -47,7 +49,7 @@ def _get_submitted_invoice(
"Sales Invoice",
invoice_name,
)
invoice.check_permission("write")
require_sales_invoice_access(invoice)
if invoice.docstatus != 1:
frappe.throw(