Skip to content

E-Invoicing Module

The E-Invoicing module provides extensible tax authority integration for electronic invoice submission. It supports multiple gateways (ETA for Egypt, ZATCA for Saudi Arabia) with a driver pattern that allows adding future countries without modifying core code.

Architecture

Supported Gateways

GatewayCountryAPI FormatAuthStatus
ETAEgyptREST + JSONOAuth 2.0 (JWT)Implemented
ZATCASaudi ArabiaREST + UBL 2.1 XMLX.509 mTLSImplemented

Key Features

  • Per-branch activation — Different branches can use different gateways
  • Async submission — Queue-based with exponential backoff retries
  • Transaction logging — Full audit trail of every API call
  • Encrypted credentials — All secrets stored with Laravel encryption
  • Zero coupling — Events guarded by class_exists(), module removable without breaking Sales/Purchases

Database Tables

TablePurpose
e_invoice_configsPer company+branch gateway configuration
e_invoice_documentsLinks source docs to e-invoice lifecycle
e_invoice_submissionsAPI call transaction log

API Endpoints

All endpoints under api/einvoicing/ with auth:sanctum middleware.

Configuration (8 endpoints)

MethodEndpointDescription
GET/configList gateway configs
POST/configCreate config
GET/config/{id}Show config
PUT/config/{id}Update config
DELETE/config/{id}Delete config
POST/config/{id}/test-connectionTest API connectivity
POST/config/{id}/activateActivate gateway
POST/config/{id}/deactivateDeactivate gateway

Documents (9 endpoints)

MethodEndpointDescription
GET/documentsList documents (filterable)
GET/documents/{id}Show document + submissions
GET/documents/{id}/qrGet QR code (ZATCA)
POST/documents/{id}/submitManual submit
POST/documents/{id}/retryRetry failed
POST/documents/{id}/cancelRequest cancellation
POST/documents/{id}/check-statusPoll status
POST/documents/bulk-submitBulk submit
POST/documents/bulk-retryBulk retry

ZATCA Onboarding (4 endpoints)

MethodEndpointDescription
POST/zatca/generate-csrGenerate CSR
POST/zatca/compliance-csidRequest compliance CSID
POST/zatca/compliance-checkRun compliance check
POST/zatca/production-csidRequest production CSID

Submissions (2 endpoints)

MethodEndpointDescription
GET/submissionsList submissions (audit log)
GET/submissions/{id}Show full request/response

Scheduled Commands

CommandScheduleDescription
einvoicing:retry-failedEvery 15 minRetries failed submissions
einvoicing:poll-statusEvery 5 minPolls ETA for document status updates

Gateway Resolution

The system resolves the correct gateway using a priority chain:

  1. Branch-specific config — If a config exists for the exact company_id + branch_id, use it
  2. Company-wide config — If no branch config, fall back to company_id + branch_id = null
  3. No config — Skip e-invoicing silently

This allows multi-country setups: Egypt branches use ETA, Saudi branches use ZATCA.

Adding a New Gateway

  1. Add a value to GatewayCode enum
  2. Create Modules/EInvoicing/app/Gateways/NewCountry/NewCountryGateway.php implementing EInvoiceGateway
  3. Add gateway-specific services in the same directory
  4. Register in EInvoiceManager constructor
  5. Add nullable credential columns via migration if needed

Moon ERP API Documentation