- Progressive Web App with Express + JSON backend - PIN-based auth, multi-device sync - Invoice + Statement PDF generation (branded, Grandstander + Nunito) - Mobile + Desktop responsive layouts - n8n backup integration - Custom logo upload - Settings for business info, fees, banking - Bulk invoice generation - Web Share API integration
443 lines
No EOL
12 KiB
JSON
443 lines
No EOL
12 KiB
JSON
{
|
|
"business": [
|
|
{
|
|
"name": "Slim Uiltjies AfterCare",
|
|
"tagline": "A safe place to learn, grow and shine!",
|
|
"address": "A loving aftercare, a second home.",
|
|
"phone": "084 770 7077",
|
|
"email": "",
|
|
"facebook": "Slim Uiltjies AfterCare",
|
|
"currency": "R",
|
|
"currencyCode": "ZAR",
|
|
"taxNote": "",
|
|
"bankName": "",
|
|
"accountHolder": "",
|
|
"accountNumber": "",
|
|
"branchCode": "",
|
|
"referenceNote": "Use child name as payment reference",
|
|
"footerNote": "We truly appreciate your timely payments.\nTogether we make a difference in our children's future!",
|
|
"receiptPrefix": "SU",
|
|
"nextReceiptNumber": 1,
|
|
"defaultFullDayFee": 500,
|
|
"defaultHalfDayFee": 300,
|
|
"updatedAt": "2026-08-07T23:56:14.316Z",
|
|
"id": "business",
|
|
"logoDataUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFGUlEQVR4AeyYaWxVRRTHf7wWiyy2QSg0NBAJNSoiGhTUuAYXCKgg0ZAYFE38YIhxDWmDuCTyyQUFt0QJmICRqHxwhaiAwVRciDaCAg2kaADRaEVBUIR6/rzevPvuvW+Z19LW9+5N5s7MmTNnZv5zzpkzk2ibs6StlFOCEv9iAEpcAYg1INaAEkcgNoESV4DYCcYmEJtAiSMQm0CJK0DpnQLBDY9NIIhIqdVjDeiUHR80ACbUwYwJMOdauGcyzLwYLjkD1NYpg5wYIR3TgCGVUD8NHr0JZl0KV46GM4dBXU1y8QJBbQ3GUzsw8wrmXg+L70hPAi9zD3hqVjq/+vfvk61HZFvhAEwaCw/NgGwL84YcZosXUNMu8CjpeUVv6AVpqaKcrF9ZGWn86l/uvhz3Htg3cghMGcfxCeDwXTUGxo106HDiWQsD4M6JRC6+rQ1+/RN+/wtUJuKbfTn0tt2LaOoOUsJ50D6mrgMCtnb0GLz0Idy9FB55w0zj9WT5rc/D4nuZro4dEaZ3E8UdgCgVXrcFNv8YXoLojdvC9DHDw7RuorgD0LciPNWyLGLWfQdHjqanKBlhqV1CyTLzDOM37w03XGHH3+TzIMoL722F+15NT8+vCcvoJkrCedyWX8zBBXqZWTPFAFg4Gx67GW6xmGB0LZGOkp71uQOg+bf8rH84CYhT+8NFdXDXNbDIgpvHZ8Ktl4GCpnCPbqcUBsDC9+CPQ7knL0Cq+sL4UTDfgial6lNy9+tCjsIAOGbn/YJV8P3usDlkm7y0oGE69ItwpNn6daAtV9fCAJDUg3+DnNn95uBWNsLOfUlPr7ZsSUHQg9dl4+jStsIB8KapI27DVnjazELefv5KWPUF7MgCyGAzg5NP8iRE5+U5osWE7CvQ1RQzQMlZdQdA42pwf/IP03oQ1m4G+QkB8ubGaDM5qzbV69A/qbJXynWzU0Tp8Xp5Pn7J423P3QGot6vtotvNw/vS6TXt4iKy9RYINbWEG4YPStGiJj60KtUeLOmk0Ub46bp7KPlpeZTdAVBgExQ86dwgJb1e1S+9rtqBw/onU+uBZO7/jxpKxkuTgi4/r8oyReWOKeHID9v2hLvoAUTvA+EWuPocGDE43OK/IzRuD7fLWerYDPqCiWfDhRZnBHvssgAtSMuj7g7AN7tAtz+/cKnjVHsfeNJeaebdCA9MhYft3Ff9hvMJRYS6LusUof3b/Rv46+1kBlpQ9cxtIDkLLKCS6U0f77Wm5x+Z30mn5FVzB0AO65W10cJ1Va4x2z2tGqorQfUgp+z0hYi7gJxlkNerS06lBVRyvB7Nn+/bD1sibqN+ngxldwAk6NsfYHVTtHdXe6akAGrZJ7DHLkhBni93gK7PQXquunzJE2/n4srYXhgAEvfuJlNzO/O3mk/Idf6qvclMZ+5y2LRTvaOTHlAWr4b99qIUzZGi/muPMJ+Z72h4DQ4fSdEdS4UDoIF05j9nE65fwfEXIYHyle1k80/Jhar+or0UaeEvf5zfROVk59mLktI7BvLGZthuV3DJ/NqOUx2rikDvXQYrPnXXQs3blzoGgCdIDkwvQjILqfiz78PS9UkzkW3Kb3i8+ebSgjVmZss3WMzxAUjmEvM98hW6g+QrJwdf5wCQY5Ce3BwD0JN3pyvmVnQa4ApaDIArYsXGH2tAse2o63piDXBFrNj4Yw0oth11XU+sAa6IFRt/rAHFtqOu64k1wBWxYuOPNeD/vqMdnf9/AAAA///19YHFAAAABklEQVQDAO1X7hAmzgS4AAAAAElFTkSuQmCC"
|
|
}
|
|
],
|
|
"parents": [
|
|
{
|
|
"id": 1,
|
|
"name": "Valentine",
|
|
"phone": "082 123 4567",
|
|
"email": "valentine@example.com",
|
|
"address": "12 Acacia Street, Pretoria",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.317Z"
|
|
},
|
|
{
|
|
"id": 2,
|
|
"name": "Nomsa Dlamini",
|
|
"phone": "073 555 0102",
|
|
"email": "nomsa@example.com",
|
|
"address": "4 Violet Lane, Centurion",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.317Z"
|
|
},
|
|
{
|
|
"id": 3,
|
|
"name": "Pieter van Wyk",
|
|
"phone": "083 444 9988",
|
|
"email": "pieter@example.com",
|
|
"address": "78 Garden Road, Hatfield",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.317Z"
|
|
}
|
|
],
|
|
"children": [
|
|
{
|
|
"id": 1,
|
|
"parentId": 1,
|
|
"name": "Tshireletso",
|
|
"plan": "full",
|
|
"monthlyFee": 500,
|
|
"startDate": "2025-01-01",
|
|
"endDate": "",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.317Z"
|
|
},
|
|
{
|
|
"id": 2,
|
|
"parentId": 2,
|
|
"name": "Lerato",
|
|
"plan": "full",
|
|
"monthlyFee": 500,
|
|
"startDate": "2025-02-01",
|
|
"endDate": "",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.317Z"
|
|
},
|
|
{
|
|
"id": 3,
|
|
"parentId": 2,
|
|
"name": "Themba",
|
|
"plan": "half",
|
|
"monthlyFee": 300,
|
|
"startDate": "2025-02-01",
|
|
"endDate": "",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.317Z"
|
|
},
|
|
{
|
|
"id": 4,
|
|
"parentId": 3,
|
|
"name": "Mia",
|
|
"plan": "full",
|
|
"monthlyFee": 500,
|
|
"startDate": "2025-03-01",
|
|
"endDate": "",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.317Z"
|
|
}
|
|
],
|
|
"invoices": [
|
|
{
|
|
"id": 1,
|
|
"number": "SU-0001",
|
|
"parentId": 1,
|
|
"childId": 1,
|
|
"period": "2026-01",
|
|
"issueDate": "2026-01-05",
|
|
"dueDate": "2026-01-25",
|
|
"items": [
|
|
{
|
|
"description": "AfterCare Fees — January 2026",
|
|
"quantity": 1,
|
|
"unitPrice": 500,
|
|
"total": 500
|
|
}
|
|
],
|
|
"subtotal": 500,
|
|
"total": 500,
|
|
"paid": 500,
|
|
"balance": 0,
|
|
"status": "paid",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.318Z"
|
|
},
|
|
{
|
|
"id": 2,
|
|
"number": "SU-0002",
|
|
"parentId": 1,
|
|
"childId": 1,
|
|
"period": "2026-02",
|
|
"issueDate": "2026-02-05",
|
|
"dueDate": "2026-02-25",
|
|
"items": [
|
|
{
|
|
"description": "AfterCare Fees — February 2026",
|
|
"quantity": 1,
|
|
"unitPrice": 500,
|
|
"total": 500
|
|
}
|
|
],
|
|
"subtotal": 500,
|
|
"total": 500,
|
|
"paid": 500,
|
|
"balance": 0,
|
|
"status": "paid",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.319Z"
|
|
},
|
|
{
|
|
"id": 3,
|
|
"number": "SU-0003",
|
|
"parentId": 1,
|
|
"childId": 1,
|
|
"period": "2026-03",
|
|
"issueDate": "2026-03-05",
|
|
"dueDate": "2026-03-25",
|
|
"items": [
|
|
{
|
|
"description": "AfterCare Fees — March 2026",
|
|
"quantity": 1,
|
|
"unitPrice": 500,
|
|
"total": 500
|
|
}
|
|
],
|
|
"subtotal": 500,
|
|
"total": 500,
|
|
"paid": 0,
|
|
"balance": 500,
|
|
"status": "unpaid",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.319Z"
|
|
},
|
|
{
|
|
"id": 4,
|
|
"number": "SU-0004",
|
|
"parentId": 1,
|
|
"childId": 1,
|
|
"period": "2026-04",
|
|
"issueDate": "2026-04-05",
|
|
"dueDate": "2026-04-25",
|
|
"items": [
|
|
{
|
|
"description": "AfterCare Fees — April 2026",
|
|
"quantity": 1,
|
|
"unitPrice": 500,
|
|
"total": 500
|
|
}
|
|
],
|
|
"subtotal": 500,
|
|
"total": 500,
|
|
"paid": 1000,
|
|
"balance": 0,
|
|
"status": "paid",
|
|
"notes": "March + April combined payment",
|
|
"createdAt": "2026-08-07T23:56:14.319Z"
|
|
},
|
|
{
|
|
"id": 5,
|
|
"number": "SU-0005",
|
|
"parentId": 1,
|
|
"childId": 1,
|
|
"period": "2026-05",
|
|
"issueDate": "2026-05-05",
|
|
"dueDate": "2026-05-25",
|
|
"items": [
|
|
{
|
|
"description": "AfterCare Fees — May 2026",
|
|
"quantity": 1,
|
|
"unitPrice": 500,
|
|
"total": 500
|
|
}
|
|
],
|
|
"subtotal": 500,
|
|
"total": 500,
|
|
"paid": 500,
|
|
"balance": 0,
|
|
"status": "paid",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.320Z"
|
|
},
|
|
{
|
|
"id": 6,
|
|
"number": "SU-0006",
|
|
"parentId": 1,
|
|
"childId": 1,
|
|
"period": "2026-06",
|
|
"issueDate": "2026-06-05",
|
|
"dueDate": "2026-06-25",
|
|
"items": [
|
|
{
|
|
"description": "AfterCare Fees — June 2026",
|
|
"quantity": 1,
|
|
"unitPrice": 500,
|
|
"total": 500
|
|
}
|
|
],
|
|
"subtotal": 500,
|
|
"total": 500,
|
|
"paid": 500,
|
|
"balance": 0,
|
|
"status": "paid",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.320Z"
|
|
},
|
|
{
|
|
"id": 7,
|
|
"number": "SU-0007",
|
|
"parentId": 2,
|
|
"childId": 2,
|
|
"period": "2026-08",
|
|
"issueDate": "2026-08-01",
|
|
"dueDate": "2026-08-25",
|
|
"items": [
|
|
{
|
|
"description": "AfterCare Fees — August 2026",
|
|
"quantity": 1,
|
|
"unitPrice": 500,
|
|
"total": 500
|
|
}
|
|
],
|
|
"subtotal": 500,
|
|
"total": 500,
|
|
"paid": 0,
|
|
"balance": 500,
|
|
"status": "unpaid",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.320Z"
|
|
},
|
|
{
|
|
"id": 8,
|
|
"number": "SU-0008",
|
|
"parentId": 2,
|
|
"childId": 2,
|
|
"period": "2026-07",
|
|
"issueDate": "2026-07-01",
|
|
"dueDate": "2026-07-25",
|
|
"items": [
|
|
{
|
|
"description": "AfterCare Fees — July 2026",
|
|
"quantity": 1,
|
|
"unitPrice": 500,
|
|
"total": 500
|
|
}
|
|
],
|
|
"subtotal": 500,
|
|
"total": 500,
|
|
"paid": 500,
|
|
"balance": 0,
|
|
"status": "paid",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.320Z"
|
|
},
|
|
{
|
|
"id": 9,
|
|
"number": "SU-0009",
|
|
"parentId": 3,
|
|
"childId": 4,
|
|
"period": "2026-08",
|
|
"issueDate": "2026-08-01",
|
|
"dueDate": "2026-08-25",
|
|
"items": [
|
|
{
|
|
"description": "AfterCare Fees — August 2026",
|
|
"quantity": 1,
|
|
"unitPrice": 500,
|
|
"total": 500
|
|
}
|
|
],
|
|
"subtotal": 500,
|
|
"total": 500,
|
|
"paid": 500,
|
|
"balance": 0,
|
|
"status": "paid",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.320Z"
|
|
},
|
|
{
|
|
"id": 10,
|
|
"number": "SU-0010",
|
|
"parentId": 2,
|
|
"childId": 3,
|
|
"period": "2026-08",
|
|
"issueDate": "2026-08-01",
|
|
"dueDate": "2026-08-25",
|
|
"items": [
|
|
{
|
|
"description": "AfterCare Fees (Half Day) — August 2026",
|
|
"quantity": 1,
|
|
"unitPrice": 300,
|
|
"total": 300
|
|
}
|
|
],
|
|
"subtotal": 300,
|
|
"total": 300,
|
|
"paid": 300,
|
|
"balance": 0,
|
|
"status": "paid",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.321Z"
|
|
}
|
|
],
|
|
"payments": [
|
|
{
|
|
"id": 1,
|
|
"invoiceId": 1,
|
|
"date": "2026-01-07",
|
|
"amount": 500,
|
|
"method": "cash",
|
|
"receivedBy": "Syl-Marie",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.319Z"
|
|
},
|
|
{
|
|
"id": 2,
|
|
"invoiceId": 2,
|
|
"date": "2026-02-25",
|
|
"amount": 500,
|
|
"method": "cash",
|
|
"receivedBy": "Syl-Marie",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.319Z"
|
|
},
|
|
{
|
|
"id": 3,
|
|
"invoiceId": 4,
|
|
"date": "2026-04-24",
|
|
"amount": 1000,
|
|
"method": "cash",
|
|
"receivedBy": "Syl-Marie",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.319Z"
|
|
},
|
|
{
|
|
"id": 4,
|
|
"invoiceId": 5,
|
|
"date": "2026-05-23",
|
|
"amount": 500,
|
|
"method": "cash",
|
|
"receivedBy": "Syl-Marie",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.320Z"
|
|
},
|
|
{
|
|
"id": 5,
|
|
"invoiceId": 6,
|
|
"date": "2026-06-29",
|
|
"amount": 500,
|
|
"method": "cash",
|
|
"receivedBy": "Syl-Marie",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.320Z"
|
|
},
|
|
{
|
|
"id": 6,
|
|
"invoiceId": 8,
|
|
"date": "2026-07-15",
|
|
"amount": 500,
|
|
"method": "eft",
|
|
"receivedBy": "Syl-Marie",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.320Z"
|
|
},
|
|
{
|
|
"id": 7,
|
|
"invoiceId": 9,
|
|
"date": "2026-08-10",
|
|
"amount": 500,
|
|
"method": "cash",
|
|
"receivedBy": "Syl-Marie",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.321Z"
|
|
},
|
|
{
|
|
"id": 8,
|
|
"invoiceId": 10,
|
|
"date": "2026-08-12",
|
|
"amount": 300,
|
|
"method": "eft",
|
|
"receivedBy": "Syl-Marie",
|
|
"notes": "",
|
|
"createdAt": "2026-08-07T23:56:14.321Z"
|
|
}
|
|
],
|
|
"meta": [
|
|
{
|
|
"id": "nextReceipt",
|
|
"value": 11
|
|
},
|
|
{
|
|
"id": "seeded",
|
|
"value": true
|
|
},
|
|
{
|
|
"id": "seededAt",
|
|
"value": "2026-08-07T23:56:14.321Z"
|
|
}
|
|
],
|
|
"version": 1,
|
|
"_updatedAt": "2026-08-08T00:00:25.392Z"
|
|
} |