Add the ERPNext settings UI, History and detail controls, and voiced.invoice.v1 export (Phase F3)
- Settings gets an Integrations tab: connection fields with a write-only API secret, a CA PEM option, Test connection with versions and warnings, live mapping lists loaded after a test, naming mode, toggles and its own Save. - Pushing for a GST-registered vendor is refused until a connection test result is stored. The UI shows the reason and disables Send. - History shows an ERPNext status column from one bulk call, a row Send and Open in ERPNext, and a bulk Send selected with a draft-or-submit confirm step and per-row results that never abort the batch. The detail view gets an ERPNext panel and per-payment send. All of it is hidden or disabled when the integration is not configured. - Optional auto-push after issue runs in the background and never blocks or fails the issue. - Generic export: a deterministic voiced.invoice.v1 JSON (and CSV line items) for selected invoices, documented in docs/voiced-invoice-v1.md with a golden test. Money is integer paise plus a decimal string. The new screens have not been run in a webview yet. The ERPNext Payment Entry deduction fields still need a live check.
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
[
|
||||
{
|
||||
"schema": "voiced.invoice.v1",
|
||||
"number": "INV/2026-001",
|
||||
"issue_date": "2026-04-01",
|
||||
"due_date": "2026-05-01",
|
||||
"document_type": "tax_invoice",
|
||||
"status": "issued",
|
||||
"cancelled": false,
|
||||
"cancelled_at": null,
|
||||
"cancel_reason": null,
|
||||
"currency": "INR",
|
||||
"po_number": "PO-9",
|
||||
"supplier": {
|
||||
"name": "Test Vendor",
|
||||
"address": "1 Main Rd\nPune",
|
||||
"gstin": "27AAPFU0939F1ZV",
|
||||
"pan": "AAPFU0939F",
|
||||
"gst_registration": "regular",
|
||||
"state": {
|
||||
"code": "27",
|
||||
"name": "Maharashtra"
|
||||
}
|
||||
},
|
||||
"client": {
|
||||
"name": "Client Ltd",
|
||||
"gstin": "29AABCU9603R1ZJ",
|
||||
"gst_category": "registered_regular",
|
||||
"address": {
|
||||
"text": "12 MG Road\nBengaluru 560001",
|
||||
"line1": "12 MG Road",
|
||||
"line2": null,
|
||||
"city": "Bengaluru",
|
||||
"pincode": "560001",
|
||||
"state": {
|
||||
"code": "29",
|
||||
"name": "Karnataka"
|
||||
}
|
||||
},
|
||||
"place_of_supply": {
|
||||
"code": "29",
|
||||
"name": "Karnataka"
|
||||
}
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"line": 1,
|
||||
"description": "Design",
|
||||
"hsn_sac": "998391",
|
||||
"quantity": "1",
|
||||
"unit": null,
|
||||
"rate_paise": 500010,
|
||||
"rate": "5000.10",
|
||||
"taxable_value_paise": 500010,
|
||||
"taxable_value": "5000.10"
|
||||
},
|
||||
{
|
||||
"line": 2,
|
||||
"description": "Consulting",
|
||||
"hsn_sac": null,
|
||||
"quantity": "2",
|
||||
"unit": "hour",
|
||||
"rate_paise": 115505,
|
||||
"rate": "1155.05",
|
||||
"taxable_value_paise": 231000,
|
||||
"taxable_value": "2310.00"
|
||||
}
|
||||
],
|
||||
"tax": {
|
||||
"cgst": {
|
||||
"rate": "0",
|
||||
"amount_paise": 0,
|
||||
"amount": "0.00"
|
||||
},
|
||||
"sgst": {
|
||||
"rate": "0",
|
||||
"amount_paise": 0,
|
||||
"amount": "0.00"
|
||||
},
|
||||
"utgst": {
|
||||
"rate": "0",
|
||||
"amount_paise": 0,
|
||||
"amount": "0.00"
|
||||
},
|
||||
"igst": {
|
||||
"rate": "18",
|
||||
"amount_paise": 131400,
|
||||
"amount": "1314.00"
|
||||
}
|
||||
},
|
||||
"totals": {
|
||||
"subtotal_paise": 731010,
|
||||
"subtotal": "7310.10",
|
||||
"discount_paise": 1010,
|
||||
"discount": "10.10",
|
||||
"taxable_value_paise": 730000,
|
||||
"taxable_value": "7300.00",
|
||||
"tax_paise": 131400,
|
||||
"tax": "1314.00",
|
||||
"total_paise": 861400,
|
||||
"total": "8614.00",
|
||||
"amount_in_words": "Rupees Eight Thousand Six Hundred Fourteen Only"
|
||||
},
|
||||
"reverse_charge": false,
|
||||
"notes": "Thank you",
|
||||
"payments": [
|
||||
{
|
||||
"date": "2026-04-10",
|
||||
"amount_paise": 700000,
|
||||
"amount": "7000.00",
|
||||
"tds_paise": 70000,
|
||||
"tds": "700.00",
|
||||
"mode": "bank_transfer",
|
||||
"reference": "UTR123"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user