Zatca
A comprehensive Frappe/ERPNext application for Saudi Arabia's ZATCA (Zakat, Tax and Customs Authority) E-Invoicing Phase-2 compliance. This app enables businesses to generate, sign, and submit e-invoices in accordance with Saudi Arabian tax regulations.
- Author: sowaan
- Repository: https://github.com/sowaan/zatca
- GitHub stars: 0
- Forks: 3
- License: MIT
- Category: Localization
- Maintenance: Actively Maintained
Install Zatca
bench get-app https://github.com/sowaan/zatca
Add the Frappe Gems badge to your README
Maintain Zatca? Paste this into your README:
[](https://frappegems.com/gems/apps/sowaan/zatca)
About Zatca
ZATCA E-Invoicing (Fatoora)
A comprehensive Frappe/ERPNext application for Saudi Arabia's ZATCA (Zakat, Tax and Customs Authority) E-Invoicing Phase-2 compliance. This app enables businesses to generate, sign, and submit e-invoices in accordance with Saudi Arabian tax regulations.
Table of Contents
- Overview
- Features
- Requirements
- Installation
- Configuration
- Usage
- Technical Details
- Support
- Contributing
- License
Overview
The ZATCA E-Invoicing app implements Saudi Arabia's mandatory e-invoicing requirements (also known as "Fatoora"). This solution ensures full compliance with ZATCA Phase-2 regulations, supporting both simplified and standard tax invoices with digital signatures, QR code generation, and direct integration with ZATCA's systems.
Key Capabilities
- Simplified Tax Invoices: B2C transactions with QR code generation
- Standard Tax Invoices: B2B transactions with full XML structure
- Digital Signatures: Cryptographic signing using ECDSA (SECP256K1)
- ZATCA Integration: Direct API integration for invoice submission and validation
- Compliance Checking: Built-in compliance validation tools
- Multi-Company Support: Handle multiple entities with separate configurations
Features
🔐 Security & Compliance
- CSR Generation: Create Certificate Signing Requests with company-specific data
- Private Key Management: Secure generation and storage of cryptographic keys
- Digital Signatures: XML invoice signing using X.509 certificates
- Certificate Lifecycle: Support for both compliance (CCSID) and production (PCSID) certificates
📄 Invoice Management
- XML Generation: UBL 2.1 compliant XML invoices
- QR Code Generation: TLV-encoded QR codes for simplified invoices
- Invoice Hashing: SHA-256 hashing for invoice integrity
- PIH (Previous Invoice Hash): Cryptographic chaining of invoices
- ICV (Invoice Counter Value): Sequential invoice numbering
🔌 ZATCA API Integration
- Sandbox Testing: Test invoices in ZATCA sandbox environment
- Simulation Mode: Pre-production validation
- Production Mode: Live invoice submission
- Compliance Checks: Automated validation against ZATCA rules
- Success Logging: Track all successful submissions
🎨 User Interface
- Custom Fields: Extended Sales Invoice and Company doctypes
- ZATCA Settings: Centralized configuration interface
- Multiple Settings: Support for different invoice scenarios
- Status Tracking: Real-time e-invoice submission status
- Attachments: Auto-attach XML and QR codes to invoices
📊 Supported Documents
- Sales Invoices
- Credit Notes
- Debit Notes
- Fee Collections (custom implementation)
Requirements
- Frappe Framework: Version 15.0 or higher
- ERPNext: Version 15.0 or higher
- Python: 3.10 or higher
- Dependencies:
asn1~= 2.7.0- Standard cryptography libraries (included with Frappe)
Installation
Using Bench
Navigate to your bench directory:
cd frappe-benchGet the app from GitHub:
bench get-app https://github.com/sowaan/zatca.gitOr for local development:
bench get-app /path/to/zatcaInstall the app on your site:
bench --site your-site-name install-app zatcaRun database migrations:
bench --site your-site-name migrateRestart bench:
bench restart
Manual Installation
Clone the repository into the
appsdirectory:cd frappe-bench/apps git clone https://github.com/sowaan/zatca.gitInstall dependencies:
cd zatca pip install -e .Install on site and migrate:
bench --site your-site-name install-app zatca bench --site your-site-name migrate
Configuration
Initial Setup
Navigate to ZATCA Settings:
- Go to:
Setup > ZATCA > ZATCA Setting
- Go to:
Configure Company Details:
- Select your company
- Enter company abbreviation
- Enable ZATCA invoice processing
CSR Configuration: Create a CSR configuration in your Company doctype with the following format:
csr.common.name=Your Company Name csr.serial.number=1-Your|2-VAT123456|3-Invoice csr.organization.identifier=VAT-Number-Without-3 csr.organization.unit.name=Your Unit csr.organization.name=Your Organization csr.country.name=SA csr.invoice.type=1100 csr.location.address=Your Address csr.industry.business.category=Your IndustryGenerate Cryptographic Materials:
- Click "Create CSR" to generate CSR and private keys
- The system will automatically generate and store private/public keys
Obtain Certificates:
Compliance Phase (Testing):
- Enter OTP received from ZATCA
- Generate compliance CSID (Certificate ID)
- Test with sample invoices
- Verify all compliance checks pass
Production Phase:
- Generate production CSID
- Configure production credentials
API Endpoints:
- Sandbox URL: For initial development
- Simulation URL: For pre-production testing
- Production URL: For live invoices
Company Configuration
In the Company doctype, configure: - VAT Number: Your 15-digit VAT number - CSR Config: Certificate signing request parameters - Address Details: Complete address information - Custom Fields: Populated automatically by the app
Settings Options
- Attach XML with Invoice: Automatically attach generated XML
- Attach QR Code: Include QR code images
- Send to ZATCA: Enable automatic submission
- Background Processing: Process invoices asynchronously
Usage
Creating E-Invoices
Standard Invoice (B2B)
- Create a Sales Invoice as usual in ERPNext
- Ensure customer has valid VAT number and address
- Submit the invoice
- The system will automatically:
- Generate UBL 2.1 XML
- Create digital signature
- Generate invoice hash
- Submit to ZATCA (if enabled)
Simplified Invoice (B2C)
- Create a Sales Invoice for B2C customer
- Submit the invoice
- System generates:
- Simplified XML structure
- QR code with TLV encoding
- Cryptographic hash
- Auto-submits to ZATCA
Manual Operations
Check Compliance:
# From ZATCA Settings
1. Select validation type
2. Choose sample invoice
3. Click "Check Compliance"
Regenerate Invoice:
# From Sales Invoice
1. Click "Actions"
2. Select "Regenerate ZATCA Invoice"
API Methods
# Generate QR Code
from zatca.zatca.zatcaqr import get_fatoora_qr
qr_image = get_fatoora_qr(
company="Company Name",
tax_number="VAT123456",
date="2025-12-23T15:30:00",
total="1150.00",
tax_amount="150.00"
)
# Sign Invoice
from zatca.zatca.sign_invoice import get_signed_invoice_xml
signed_xml = get_signed_invoice_xml(invoice_number="INV-001")
Technical Details
Architecture
zatca/
├── zatca/ # Main module
│ ├── sign_invoice.py # Cryptographic signing
│ ├── createxml.py # XML generation (UBL 2.1)
│ ├── zatcaqr.py # QR code generation
│ ├── validations.py # Business rule validations
│ ├── check_certificate_vat.py # Certificate verification
│ └── doctype/ # Custom doctypes
│ ├── zatca_setting/ # Configuration
│ ├── zatca_multiple_setting/
│ └── zatca_success_log/ # Submission logs
├── public/js/ # Client-side scripts
│ ├── our_sales_invoice.js # Sales Invoice customization
│ ├── company.js # Company enhancements
│ └── address.js # Address validations
└── fixtures/ # Custom fields
XML Structure
The app generates UBL 2.1 compliant XML with: - Invoice Header: ICV, PIH, UUID, timestamps - Parties: Supplier and customer details - Lines: Item details with taxes - Totals: Tax breakdown and totals - Signature: UBL signature extension
Cryptographic Flow
- Key Generation: ECDSA with SECP256K1 curve
- CSR Creation: X.509 certificate request with custom OIDs
- Certificate Issuance: ZATCA provides signed certificate
- Invoice Signing:
- Canonicalize XML
- Hash signed properties
- Sign hash with private key
- Embed signature in XML
QR Code Format
TLV (Tag-Length-Value) encoding with: - Tag 1: Seller Name - Tag 2: VAT Number - Tag 3: Timestamp - Tag 4: Total with VAT - Tag 5: VAT Amount
Database Schema
Custom Fields Added: - Sales Invoice: ZATCA status, XML, hash, counter - Company: CSR config, private key, certificate - Address: Country code mapping - Customer: VAT validation fields
Troubleshooting
Common Issues
Certificate Errors: - Ensure CSR config is correct - Verify OTP is valid (expires in 1 hour) - Check private key exists
Validation Failures: - Verify customer VAT number format - Ensure address has all required fields - Check item tax templates
Submission Errors: - Confirm network connectivity to ZATCA - Validate credentials (Basic Auth) - Check invoice counter sequence
Logs
Check logs for debugging:
bench --site your-site-name console
frappe.get_all("ZATCA Success Log",
fields=["*"],
filters={"invoice_number": "INV-001"}
)
Support
For issues, questions, or feature requests:
- Publisher: Sowaan
- Email: support@sowaan.com
- GitHub Issues: Create an issue
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Development Setup
# Get the app in development mode
bench get-app /path/to/zatca --skip-assets
# Install on a site
bench --site dev.local install-app zatca
# Enable developer mode
bench --site dev.local set-config developer_mode 1
# Watch for changes
bench watch
Roadmap
- [ ] Support for additional document types
- [ ] Enhanced reporting and analytics
- [ ] Batch invoice submission
- [ ] Integration with POS
- [ ] Multi-language support
- [ ] Advanced error recovery
Compliance Statement
This application is designed to comply with ZATCA's E-Invoicing requirements as per the official specifications. However, users are responsible for:
- Accurate configuration of company and tax details
- Proper testing in sandbox/simulation environments
- Maintaining security of cryptographic materials
- Regular updates to maintain compliance with regulatory changes
Changelog
Version 1.0.0
- Initial release
- Phase-2 compliance support
- Simplified and standard invoice types
- QR code generation
- ZATCA API integration
- Compliance checking tools
License
This project is licensed under the MIT License - see the LICENSE file for details.
Developed by Sowaan
Making ERPNext ZATCA-compliant, one invoice at a time. 🇸🇦
Related Localization apps for Frappe & ERPNext
- Wiki — Free and Open Source Wiki built on top of Frappe
- India Compliance — Simple, yet powerful compliance solutions for Indian businesses
- Nepal Compliance — Open source ERP for Nepal with HR, Payroll & Accounting compliance, based on ERPNext by Frappe Technologies.
- Erpnextswiss — ERPNext application for Switzerland-specific use cases
- Erpnext Germany — ERPNext customizations for German companies
- Ksa Compliance — KSA Compliance App for KSA E-invoice
- Zatca Erpgulf — Implementation of Zatca Phase-2 E-Invoicing - for FrappeCLoud
- Kenya Compliance — KRA eTIMS Tax Compliance Integration This app works to integrate ERPNext with KRA's eTIMS via the Online Sales Control Unit (OSCU) to allow for the sharing of information with the revenue authority.via OSCU with ERPNext