Skip to main content

ZRA Smart Invoice Integration

Related docs: Data Models · Order Lifecycle · Payment Architecture · Microservices


1. Overview

Pakashop integrates with the Zambia Revenue Authority (ZRA) Smart Invoice system via the VSDC (Virtual Sales Data Controller) API. The pakashop-invoicing microservice (Node.js, port 3013) handles automated invoice generation, transmission, and logging.


2. Architecture

Order Confirmed (PAID)


pakashop-backend (port 3080)

├──► Check feature flag: zra_invoicing_enabled
├──► Check vendor TPIN validity
└──► Queue ZRA invoice job (BullMQ)


pakashop-invoicing (port 3013)

├──► Generate Smart Invoice payload
├──► Sign payload with vendor certificate
├──► Transmit to ZRA VSDC API
│ │
│ ├──► Success: Log transmission receipt
│ └──► Failure: Queue retry (3 attempts)

└──► Store result in ZraInvoice table

3. Configuration

3.1 Feature Flags

FlagDefaultDescription
zra_invoicing_enabledfalseMaster switch for ZRA integration
zra_mock_modefalseSimulate transmissions without calling ZRA API

3.2 Environment Variables

# ZRA VSDC API
ZRA_VSDC_API_URL=https://vsdc.zra.org.zm/api/v1
ZRA_VSDC_API_KEY=your_api_key
ZRA_VSDC_CLIENT_ID=your_client_id
ZRA_VSDC_CLIENT_SECRET=your_client_secret

# Mock mode
ZRA_MOCK_MODE=false

# Feature flag
FEATURE_FLAGS_REDIS_KEY=pakashop:feature_flags

4. Smart Invoice Payload

4.1 Invoice Structure

{
"invoice": {
"seller": {
"tpin": "1234567890",
"businessName": "Banda Electronics Ltd",
"address": "Plot 123, Cairo Road, Lusaka",
"phone": "+260977123456"
},
"buyer": {
"name": "John Banda",
"address": "Plot 456, Great East Road, Lusaka",
"phone": "+260977654321"
},
"items": [
{
"itemCode": "ELC-001",
"description": "Samsung Galaxy S24",
"quantity": 1,
"unitPrice": 5000.00,
"totalPrice": 5000.00,
"taxCode": "VAT16",
"taxRate": 0.16,
"taxAmount": 689.66,
"discount": 0.00
}
],
"summary": {
"subtotal": 5000.00,
"totalTax": 689.66,
"totalDiscount": 0.00,
"totalAmount": 5689.66,
"currency": "ZMW"
},
"payment": {
"method": "MOBILE_MONEY",
"transactionId": "pawa-debit-abc123",
"amount": 5689.66
},
"invoiceNumber": "PKS-20260512-001",
"invoiceDate": "2026-05-12T10:00:00Z",
"vsdcNumber": "VSDC-123456789"
}
}

4.2 Field Mapping

ZRA FieldPakashop Source
seller.tpinShop.tpin
seller.businessNameShop.name
buyer.nameOrder.shippingAddress.firstName + lastName
items.itemCodeProduct.zraItemCode
items.taxCodeProduct.zraTaxCode or default VAT16
items.taxRate0.16 (16% VAT)
invoiceNumberAuto-generated: PKS-{YYYYMMDD}-{SEQUENCE}
vsdcNumberReturned by ZRA API on successful transmission

5. Transmission Flow

5.1 Normal Flow

5.2 Mock Mode Flow

5.3 Retry Logic

AttemptDelayAction
1ImmediateInitial transmission
25 minutesFirst retry
315 minutesSecond retry
41 hourFinal retry
FailtransmissionStatus = FAILED; admin notified

6. Data Model

model ZraInvoice {
id String @id @default(cuid())
orderId String @unique
tpin String
vsdcNumber String?
invoiceNumber String @unique
payload Json
transmissionStatus String @default("PENDING") // PENDING, SENT, FAILED, MOCK
responsePayload Json?
retryCount Int @default(0)
lastRetryAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt

order Order @relation(fields: [orderId], references: [id])
}

7. Admin Dashboard

7.1 Transmission Log

The admin dashboard displays:

  • All ZRA transmissions with status filters
  • Failed transmissions with retry options
  • Per-vendor TPIN validation status
  • Monthly transmission statistics

7.2 Actions

ActionDescription
View DetailsSee full payload and response
RetryManually trigger re-transmission
DownloadExport invoice as PDF
Validate TPINCheck vendor TPIN against ZRA registry

8. API Endpoints

8.1 Internal Endpoints (Backend → Invoicing Service)

MethodPathDescription
POST/internal/generateQueue invoice generation for order
POST/internal/retry/:idRetry failed transmission

8.2 Admin Endpoints

MethodPathAuthDescription
GET/admin/zra/transmissionsPLATFORM_ADMIN, FINANCE_ADMINList all transmissions
GET/admin/zra/transmissions/:idPLATFORM_ADMIN, FINANCE_ADMINGet transmission details
POST/admin/zra/retransmit/:idPLATFORM_ADMIN, FINANCE_ADMINRetry failed transmission
POST/admin/zra/validate-tpinPLATFORM_ADMIN, FINANCE_ADMINValidate vendor TPIN

9. Monitoring

MetricDescriptionAlert Threshold
zra_transmission_success_ratePercentage of successful transmissions< 95%
zra_transmission_latency_msTime to transmit and receive response> 5000ms p95
zra_failed_transmissionsCount of failed transmissions> 5/day
zra_mock_transmissionsCount of mock transmissionsTrack for testing
zra_invalid_tpin_countVendors with invalid TPINs> 0

10. Compliance Notes

  • All invoices must be transmitted within 24 hours of order confirmation.
  • Failed transmissions must be resolved within 72 hours.
  • Mock mode should only be enabled in staging and local development.
  • Production ZRA API credentials must be rotated quarterly.
  • Invoice payloads are retained for 7 years per ZRA requirements.

For internal use only. Do not distribute outside Pakashop engineering.