Best Practice: Always validate your data before submission to avoid rejection.
Returns and Credit Notes
To create a return/credit note invoice:
$returnInvoice = Zatca::prepare()
->setInvoiceNumber('RET-001') // Unique return number
->setTotalAmount(-115.00) // Negative amount for returns
->setVatAmount(-15.00) // Negative VAT for returns
->setBuyerName('John Doe')
->isPOS()
->isInvoice(false) // Mark as return/credit note
->setDate(now())
->addItem('Product 1', 1, -100.00, -15.00); // Negative values
$result = $order->submitToZatca($returnInvoice->toArray());
Critical Notes for Returns:
All monetary values must be negative
Reference the original invoice number when possible
Use a unique return/credit note number
Keep the same VAT rate as the original invoice
Status Checking
Monitor your invoice status:
// Check submission status
if ($order->isSubmittedToZatca()) {
// Get current status
$status = $order->getZatcaStatus();
// Check for errors
if ($order->hasZatcaErrors()) {
$errors = $order->getZatcaErrors();
}
}
Available Methods
Invoice Operations
// Zatca Facade Methods
Zatca::prepare(); // Start new invoice
Zatca::submitInvoice($businessId, $invoiceData); // Submit regular invoice
Zatca::submitSimplifiedInvoice($businessId, $data); // Submit simplified invoice
Zatca::submitStandardInvoice($businessId, $data); // Submit standard invoice
Zatca::getInvoiceStatus($businessId, $invoiceNo); // Check status
Zatca::validateInvoice($invoiceData); // Validate before submit
Zatca::generateQRCode($invoiceData); // Generate QR code
// Model Methods (HasZatcaInvoice Trait)
$model->order(); // Get order relationship
$model->submitToZatca(); // Submit invoice
$model->isSubmittedToZatca(); // Check submission status
$model->getZatcaStatus(); // Get invoice status
$model->hasZatcaErrors(); // Check for errors
$model->getZatcaErrors(); // Get error details
Important Notes
General Guidelines
Data Accuracy
Always validate data before submission
Use proper rounding for monetary values
Ensure all required fields are filled
Error Handling
Always check for errors after submission
Log all errors for debugging
Implement proper error handling in your code
Performance
Consider implementing queueing for bulk submissions
Cache device information when possible
Monitor API rate limits
Common Pitfalls to Avoid
Not handling decimal places properly
Forgetting to mark returns as non-invoices
Missing required buyer information
Incorrect VAT calculations
Not validating data before submission
Best Practices
Data Validation
// Validate before submission
$isValid = Zatca::validateInvoice($invoiceData);
if ($isValid) {
$result = $order->submitToZatca($invoiceData);
}