jaz-cli 2.7.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/skills/api/SKILL.md +1 -1
- package/assets/skills/conversion/SKILL.md +1 -1
- package/assets/skills/jobs/SKILL.md +161 -0
- package/assets/skills/jobs/references/audit-prep.md +319 -0
- package/assets/skills/jobs/references/bank-recon.md +234 -0
- package/assets/skills/jobs/references/building-blocks.md +135 -0
- package/assets/skills/jobs/references/credit-control.md +273 -0
- package/assets/skills/jobs/references/fa-review.md +267 -0
- package/assets/skills/jobs/references/gst-vat-filing.md +250 -0
- package/assets/skills/jobs/references/month-end-close.md +308 -0
- package/assets/skills/jobs/references/payment-run.md +246 -0
- package/assets/skills/jobs/references/quarter-end-close.md +268 -0
- package/assets/skills/jobs/references/sg-tax/add-backs-guide.md +354 -0
- package/assets/skills/jobs/references/sg-tax/capital-allowances-guide.md +343 -0
- package/assets/skills/jobs/references/sg-tax/data-extraction.md +408 -0
- package/assets/skills/jobs/references/sg-tax/enhanced-deductions.md +248 -0
- package/assets/skills/jobs/references/sg-tax/exemptions-and-rebates.md +197 -0
- package/assets/skills/jobs/references/sg-tax/form-cs-fields.md +191 -0
- package/assets/skills/jobs/references/sg-tax/ifrs16-tax-adjustment.md +194 -0
- package/assets/skills/jobs/references/sg-tax/losses-and-carry-forwards.md +269 -0
- package/assets/skills/jobs/references/sg-tax/overview.md +207 -0
- package/assets/skills/jobs/references/sg-tax/wizard-workflow.md +391 -0
- package/assets/skills/jobs/references/supplier-recon.md +330 -0
- package/assets/skills/jobs/references/year-end-close.md +341 -0
- package/assets/skills/transaction-recipes/SKILL.md +1 -1
- package/dist/__tests__/jobs-audit-prep.test.js +125 -0
- package/dist/__tests__/jobs-bank-recon.test.js +108 -0
- package/dist/__tests__/jobs-credit-control.test.js +98 -0
- package/dist/__tests__/jobs-fa-review.test.js +104 -0
- package/dist/__tests__/jobs-gst-vat.test.js +113 -0
- package/dist/__tests__/jobs-month-end.test.js +162 -0
- package/dist/__tests__/jobs-payment-run.test.js +106 -0
- package/dist/__tests__/jobs-quarter-end.test.js +155 -0
- package/dist/__tests__/jobs-supplier-recon.test.js +115 -0
- package/dist/__tests__/jobs-validate.test.js +181 -0
- package/dist/__tests__/jobs-year-end.test.js +149 -0
- package/dist/__tests__/tax-sg-capital-allowances.test.js +389 -0
- package/dist/__tests__/tax-sg-exemptions.test.js +232 -0
- package/dist/__tests__/tax-sg-form-cs.test.js +687 -0
- package/dist/__tests__/tax-validate.test.js +208 -0
- package/dist/commands/init.js +7 -2
- package/dist/commands/jobs.js +184 -0
- package/dist/commands/tax.js +195 -0
- package/dist/index.js +4 -0
- package/dist/jobs/audit-prep.js +211 -0
- package/dist/jobs/bank-recon.js +163 -0
- package/dist/jobs/credit-control.js +126 -0
- package/dist/jobs/fa-review.js +121 -0
- package/dist/jobs/format.js +102 -0
- package/dist/jobs/gst-vat.js +187 -0
- package/dist/jobs/month-end.js +232 -0
- package/dist/jobs/payment-run.js +199 -0
- package/dist/jobs/quarter-end.js +135 -0
- package/dist/jobs/supplier-recon.js +132 -0
- package/dist/jobs/types.js +36 -0
- package/dist/jobs/validate.js +115 -0
- package/dist/jobs/year-end.js +153 -0
- package/dist/tax/format.js +18 -0
- package/dist/tax/sg/capital-allowances.js +160 -0
- package/dist/tax/sg/constants.js +63 -0
- package/dist/tax/sg/exemptions.js +76 -0
- package/dist/tax/sg/form-cs.js +349 -0
- package/dist/tax/sg/format-sg.js +134 -0
- package/dist/tax/types.js +9 -0
- package/dist/tax/validate.js +124 -0
- package/dist/types/index.js +2 -1
- package/dist/utils/template.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
# Data Extraction for SG CIT Computation
|
|
2
|
+
|
|
3
|
+
Step-by-step guide to extracting the data you need from the Jaz API to build the `SgFormCsInput` JSON for `jaz tax sg-cs`. Each phase pulls specific data and maps it to input fields.
|
|
4
|
+
|
|
5
|
+
**CLI:** `jaz tax sg-cs --input tax-data.json --json`
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Before You Start
|
|
10
|
+
|
|
11
|
+
**Confirm the basis period.** The financial year determines which date ranges to use for every API call. Ask the user:
|
|
12
|
+
- "What is your financial year-end?" (most SG companies: 31 December)
|
|
13
|
+
- "What Year of Assessment are we computing for?"
|
|
14
|
+
|
|
15
|
+
**Example:** YA 2026 with a Dec year-end means basis period = 1 Jan 2025 to 31 Dec 2025.
|
|
16
|
+
|
|
17
|
+
**All API calls assume:**
|
|
18
|
+
- `Authorization: Bearer <token>` header
|
|
19
|
+
- `x-api-key: <key>` header
|
|
20
|
+
- Base URL from the organization's Jaz instance
|
|
21
|
+
- All dates in `YYYY-MM-DD` format
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Phase 1: Organization Context
|
|
26
|
+
|
|
27
|
+
### Step 1: Get organization details
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
GET /api/v1/organization
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**What to extract:**
|
|
34
|
+
|
|
35
|
+
| Response Field | Maps To | Purpose |
|
|
36
|
+
|---------------|---------|---------|
|
|
37
|
+
| `data.currency` | `currency` input field | Confirm it is `SGD`. If not, FX considerations apply. |
|
|
38
|
+
| `data.name` | Display only | Company name for the workpaper header |
|
|
39
|
+
| `data.resourceId` | Internal reference | Needed for subsequent API calls |
|
|
40
|
+
|
|
41
|
+
**Tip:** If the response `currency` is not SGD, the company may have multi-currency transactions. All tax computation must be in SGD — ensure all amounts are converted before feeding into the CLI.
|
|
42
|
+
|
|
43
|
+
### Step 2: Confirm financial year dates
|
|
44
|
+
|
|
45
|
+
The Jaz API does not expose financial year settings directly. Confirm the basis period dates with the user:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
Input fields:
|
|
49
|
+
basisPeriodStart: "2025-01-01"
|
|
50
|
+
basisPeriodEnd: "2025-12-31"
|
|
51
|
+
ya: 2026
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Phase 2: Profit & Loss Report
|
|
57
|
+
|
|
58
|
+
The P&L provides the two most important input fields: `revenue` and `accountingProfit`.
|
|
59
|
+
|
|
60
|
+
### Step 3: Generate P&L for the basis period
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
POST /api/v1/generate-reports/profit-and-loss
|
|
64
|
+
{
|
|
65
|
+
"primarySnapshotDate": "2025-12-31",
|
|
66
|
+
"secondarySnapshotDate": "2025-01-01"
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**What to extract:**
|
|
71
|
+
|
|
72
|
+
| P&L Line | Maps To | Notes |
|
|
73
|
+
|----------|---------|-------|
|
|
74
|
+
| Total Revenue / Total Income | `revenue` | Top line — used for C-S eligibility check |
|
|
75
|
+
| Net Profit / (Loss) | `accountingProfit` | Bottom line — starting point for tax computation. Use negative for a loss. |
|
|
76
|
+
| Depreciation Expense | `addBacks.depreciation` | Always add back — first pass estimate before drilling into GL |
|
|
77
|
+
| Interest Expense | Review for `addBacks.leaseInterest` | Only the IFRS 16 lease interest portion |
|
|
78
|
+
| Other Expense lines | Scan for add-back candidates | Entertainment, donations, penalties, FX losses |
|
|
79
|
+
| Dividend Income | `addBacks.exemptDividends` | SG one-tier dividends are exempt |
|
|
80
|
+
| Interest Income | Review for taxability | Usually taxable under Section 10(1)(d) |
|
|
81
|
+
|
|
82
|
+
**Important:** The P&L gives you summary totals. For add-back classification, you need transaction-level detail from the General Ledger (Phase 5). Use the P&L as a roadmap — identify which account lines need drill-down.
|
|
83
|
+
|
|
84
|
+
### Step 4: Export P&L for records (optional)
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
POST /api/v1/data-exports/profit-and-loss
|
|
88
|
+
{
|
|
89
|
+
"startDate": "2025-01-01",
|
|
90
|
+
"endDate": "2025-12-31"
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Note:** The data export endpoint uses `startDate`/`endDate` field names, not the `primarySnapshotDate`/`secondarySnapshotDate` used by the report generator.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Phase 3: Trial Balance
|
|
99
|
+
|
|
100
|
+
The trial balance provides a cross-reference point and catches items that might not appear clearly on the P&L.
|
|
101
|
+
|
|
102
|
+
### Step 5: Generate trial balance
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
POST /api/v1/generate-reports/trial-balance
|
|
106
|
+
{
|
|
107
|
+
"startDate": "2025-01-01",
|
|
108
|
+
"endDate": "2025-12-31"
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**What to check:**
|
|
113
|
+
|
|
114
|
+
| TB Account | Purpose |
|
|
115
|
+
|-----------|---------|
|
|
116
|
+
| Depreciation Expense | Must match P&L depreciation. If different, investigate. |
|
|
117
|
+
| Accumulated Depreciation | Cross-reference to FA register (Phase 4) |
|
|
118
|
+
| Provision accounts (ECL, warranty, restructuring) | Identify general provisions for add-back |
|
|
119
|
+
| Unrealized FX Gain/Loss | May need to add back unrealized FX loss and deduct unrealized FX gain |
|
|
120
|
+
| Donation accounts | Identify IPC donations for 250% claim |
|
|
121
|
+
| Penalty/Fine accounts | Non-deductible — always add back |
|
|
122
|
+
|
|
123
|
+
**Tip:** Look for balance sheet accounts with P&L impact — provisions that increased during the year indicate a general provision expense that may need to be added back.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Phase 4: Fixed Asset Summary
|
|
128
|
+
|
|
129
|
+
Fixed assets drive two key tax adjustments: depreciation add-back and capital allowance claims.
|
|
130
|
+
|
|
131
|
+
### Step 6: Get FA summary
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
POST /api/v1/generate-reports/fixed-assets-summary
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**What to extract:**
|
|
138
|
+
|
|
139
|
+
| FA Data | Maps To | Notes |
|
|
140
|
+
|---------|---------|-------|
|
|
141
|
+
| Total depreciation charge for the period | `addBacks.depreciation` | Verify this matches the P&L depreciation line |
|
|
142
|
+
| Asset list with cost, type, useful life | `capitalAllowances.assets[]` | Each asset needs classification by CA category |
|
|
143
|
+
| Net book value per asset | Reference only | For the tax working paper |
|
|
144
|
+
|
|
145
|
+
### Step 7: Get FA reconciliation (movements)
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
POST /api/v1/generate-reports/fixed-assets-recon-summary
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
This shows opening NBV, additions, disposals, depreciation, and closing NBV. Use the depreciation figure to confirm the P&L charge.
|
|
152
|
+
|
|
153
|
+
### Step 8: Search fixed assets for per-item detail
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
POST /api/v1/fixed-assets/search
|
|
157
|
+
{
|
|
158
|
+
"filter": { "status": { "eq": "ACTIVE" } },
|
|
159
|
+
"sort": { "sortBy": ["purchaseDate"], "order": "ASC" },
|
|
160
|
+
"limit": 1000
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**What to extract per asset:**
|
|
165
|
+
|
|
166
|
+
| FA Field | Maps To (`CaAsset`) | Notes |
|
|
167
|
+
|----------|---------------------|-------|
|
|
168
|
+
| `name` | `description` | Asset description |
|
|
169
|
+
| `purchaseAmount` | `cost` | Original cost |
|
|
170
|
+
| `purchaseDate` | `acquisitionDate` | Date acquired |
|
|
171
|
+
| `typeName` | Used to determine `category` | Map to: computer, automation, low-value, general, ip, renovation |
|
|
172
|
+
| Prior years CA | `priorYearsClaimed` | User must provide — not stored in Jaz |
|
|
173
|
+
|
|
174
|
+
**Mapping asset types to CA categories:** See `capital-allowances-guide.md` for the full classification guide. The key question for each asset: "Which ITA section applies?"
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Phase 5: General Ledger Drill-Down
|
|
179
|
+
|
|
180
|
+
The GL provides transaction-level detail for accounts that need add-back classification. Do NOT pull the entire GL — target specific accounts identified in Phase 2.
|
|
181
|
+
|
|
182
|
+
### Step 9: Drill into specific accounts
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
POST /api/v1/generate-reports/general-ledger
|
|
186
|
+
{
|
|
187
|
+
"startDate": "2025-01-01",
|
|
188
|
+
"endDate": "2025-12-31",
|
|
189
|
+
"groupBy": "ACCOUNT"
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**Target these account categories:**
|
|
194
|
+
|
|
195
|
+
| GL Account Keywords | Add-Back Category | What to Look For |
|
|
196
|
+
|--------------------|--------------------|------------------|
|
|
197
|
+
| "Depreciation", "Amortization" | `depreciation`, `amortization` | Full amount — always add back |
|
|
198
|
+
| "Right-of-Use", "ROU" | `rouDepreciation` | IFRS 16 lease depreciation |
|
|
199
|
+
| "Lease Interest", "Lease Liability" | `leaseInterest` | IFRS 16 interest on lease liability |
|
|
200
|
+
| "Provision", "ECL", "Allowance" | `generalProvisions` | Only general (estimated) provisions — not specific write-offs |
|
|
201
|
+
| "Donation" | `donations` | Confirm if to approved IPC recipients |
|
|
202
|
+
| "Entertainment", "Meals" | `entertainment` | Non-deductible portion only |
|
|
203
|
+
| "Penalty", "Fine", "Surcharge" | `penalties` | Always non-deductible |
|
|
204
|
+
| "Motor Vehicle", "Car", "Parking" | `privateCar` | Only S-plated vehicles |
|
|
205
|
+
| "Unrealized", "FX", "Foreign Exchange" | `unrealizedFxLoss` / `deductions.unrealizedFxGain` | Separate gains from losses |
|
|
206
|
+
| "Dividend Income" | `exemptDividends` | SG one-tier dividends only |
|
|
207
|
+
|
|
208
|
+
**Tip:** For large GLs, you may need to paginate. Check the response for pagination metadata and follow up with offset/limit parameters.
|
|
209
|
+
|
|
210
|
+
### Step 10: Search for capital items on P&L
|
|
211
|
+
|
|
212
|
+
Look for large one-off expenses that might be capital in nature but were expensed on the P&L:
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
POST /api/v1/generate-reports/general-ledger
|
|
216
|
+
{
|
|
217
|
+
"startDate": "2025-01-01",
|
|
218
|
+
"endDate": "2025-12-31",
|
|
219
|
+
"groupBy": "ACCOUNT"
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Review expense accounts like "Miscellaneous Expenses", "Office Expenses", "Repairs & Maintenance" for items that:
|
|
224
|
+
- Exceed $5,000 in a single transaction
|
|
225
|
+
- Describe a new asset (e.g., "Purchase of air-conditioning unit")
|
|
226
|
+
- Improve or extend the useful life of an existing asset
|
|
227
|
+
|
|
228
|
+
These should be added back via `addBacks.capitalExpOnPnl` and may qualify for capital allowances.
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Phase 6: Transaction Search for Specific Items
|
|
233
|
+
|
|
234
|
+
For specific line items that need verification, use the transaction search endpoints.
|
|
235
|
+
|
|
236
|
+
### Step 11: Search invoices for revenue verification
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
POST /api/v1/invoices/search
|
|
240
|
+
{
|
|
241
|
+
"filter": {
|
|
242
|
+
"status": { "eq": "POSTED" },
|
|
243
|
+
"valueDate": { "between": ["2025-01-01", "2025-12-31"] }
|
|
244
|
+
},
|
|
245
|
+
"sort": { "sortBy": ["valueDate"], "order": "ASC" },
|
|
246
|
+
"limit": 1000
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Use this to verify the `revenue` figure if the P&L total seems inconsistent with invoice volume.
|
|
251
|
+
|
|
252
|
+
### Step 12: Search journals for specific adjustments
|
|
253
|
+
|
|
254
|
+
```
|
|
255
|
+
POST /api/v1/journals/search
|
|
256
|
+
{
|
|
257
|
+
"filter": {
|
|
258
|
+
"valueDate": { "between": ["2025-01-01", "2025-12-31"] }
|
|
259
|
+
},
|
|
260
|
+
"sort": { "sortBy": ["valueDate"], "order": "ASC" },
|
|
261
|
+
"limit": 1000
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Manual journal entries often contain year-end adjustments (provisions, accruals, write-offs) that are relevant to add-back classification.
|
|
266
|
+
|
|
267
|
+
### Step 13: Search for FX transactions
|
|
268
|
+
|
|
269
|
+
```
|
|
270
|
+
POST /api/v1/cashflow-transactions/search
|
|
271
|
+
{
|
|
272
|
+
"filter": {
|
|
273
|
+
"businessTransactionType": { "eq": "FX_REVALUATION" },
|
|
274
|
+
"valueDate": { "between": ["2025-01-01", "2025-12-31"] }
|
|
275
|
+
},
|
|
276
|
+
"sort": { "sortBy": ["valueDate"], "order": "ASC" },
|
|
277
|
+
"limit": 1000
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
FX revaluation journals create unrealized gains and losses. The loss portion maps to `addBacks.unrealizedFxLoss` and the gain portion maps to `deductions.unrealizedFxGain`.
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## Handling Pagination
|
|
286
|
+
|
|
287
|
+
All search endpoints support pagination. The standard pattern:
|
|
288
|
+
|
|
289
|
+
```json
|
|
290
|
+
{
|
|
291
|
+
"limit": 1000,
|
|
292
|
+
"offset": 0
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**Check the response metadata:**
|
|
297
|
+
- If `totalCount` exceeds your `limit`, make additional requests incrementing `offset` by `limit`
|
|
298
|
+
- Always aggregate totals across all pages before mapping to input fields
|
|
299
|
+
- Do not assume a single page contains all results
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Building the Input JSON
|
|
304
|
+
|
|
305
|
+
After completing all phases, assemble the `SgFormCsInput`:
|
|
306
|
+
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"ya": 2026,
|
|
310
|
+
"basisPeriodStart": "2025-01-01",
|
|
311
|
+
"basisPeriodEnd": "2025-12-31",
|
|
312
|
+
"currency": "SGD",
|
|
313
|
+
"revenue": 1200000.00,
|
|
314
|
+
"accountingProfit": 180000.00,
|
|
315
|
+
"addBacks": {
|
|
316
|
+
"depreciation": 45000.00,
|
|
317
|
+
"amortization": 0.00,
|
|
318
|
+
"rouDepreciation": 12000.00,
|
|
319
|
+
"leaseInterest": 3500.00,
|
|
320
|
+
"generalProvisions": 8000.00,
|
|
321
|
+
"donations": 5000.00,
|
|
322
|
+
"entertainment": 3200.00,
|
|
323
|
+
"penalties": 500.00,
|
|
324
|
+
"privateCar": 6000.00,
|
|
325
|
+
"capitalExpOnPnl": 0.00,
|
|
326
|
+
"unrealizedFxLoss": 2800.00,
|
|
327
|
+
"exemptDividends": 10000.00,
|
|
328
|
+
"otherNonDeductible": 0.00
|
|
329
|
+
},
|
|
330
|
+
"deductions": {
|
|
331
|
+
"actualLeasePayments": 14400.00,
|
|
332
|
+
"unrealizedFxGain": 1500.00,
|
|
333
|
+
"exemptIncome": 10000.00,
|
|
334
|
+
"otherDeductions": 0.00
|
|
335
|
+
},
|
|
336
|
+
"capitalAllowances": {
|
|
337
|
+
"currentYearClaim": 52000.00,
|
|
338
|
+
"balanceBroughtForward": 0.00,
|
|
339
|
+
"assets": [
|
|
340
|
+
{
|
|
341
|
+
"description": "MacBook Pro M3",
|
|
342
|
+
"cost": 4500.00,
|
|
343
|
+
"acquisitionDate": "2025-03-15",
|
|
344
|
+
"category": "computer",
|
|
345
|
+
"priorYearsClaimed": 0
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
"description": "Office Renovation",
|
|
349
|
+
"cost": 85000.00,
|
|
350
|
+
"acquisitionDate": "2024-06-01",
|
|
351
|
+
"category": "renovation",
|
|
352
|
+
"priorYearsClaimed": 28333.33
|
|
353
|
+
}
|
|
354
|
+
]
|
|
355
|
+
},
|
|
356
|
+
"enhancedDeductions": {
|
|
357
|
+
"rdExpenditure": 0.00,
|
|
358
|
+
"rdMultiplier": 2.5,
|
|
359
|
+
"ipRegistration": 0.00,
|
|
360
|
+
"ipMultiplier": 2.0,
|
|
361
|
+
"donations250Base": 5000.00,
|
|
362
|
+
"s14qRenovation": 0.00
|
|
363
|
+
},
|
|
364
|
+
"losses": {
|
|
365
|
+
"broughtForward": 0.00
|
|
366
|
+
},
|
|
367
|
+
"donationsCarryForward": {
|
|
368
|
+
"broughtForward": 0.00
|
|
369
|
+
},
|
|
370
|
+
"exemptionType": "pte"
|
|
371
|
+
}
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
## Data Extraction Checklist
|
|
377
|
+
|
|
378
|
+
| # | Step | Phase | API Endpoint | Input Fields Populated |
|
|
379
|
+
|---|------|-------|-------------|----------------------|
|
|
380
|
+
| 1 | Organization context | Org | `GET /organization` | `currency` |
|
|
381
|
+
| 2 | Confirm FY dates | Org | User-provided | `ya`, `basisPeriodStart`, `basisPeriodEnd` |
|
|
382
|
+
| 3 | P&L report | P&L | `POST /generate-reports/profit-and-loss` | `revenue`, `accountingProfit`, initial add-back estimates |
|
|
383
|
+
| 4 | P&L export | P&L | `POST /data-exports/profit-and-loss` | Working paper backup |
|
|
384
|
+
| 5 | Trial balance | TB | `POST /generate-reports/trial-balance` | Cross-reference all amounts |
|
|
385
|
+
| 6 | FA summary | FA | `POST /generate-reports/fixed-assets-summary` | `addBacks.depreciation` verification |
|
|
386
|
+
| 7 | FA reconciliation | FA | `POST /generate-reports/fixed-assets-recon-summary` | Depreciation charge confirmation |
|
|
387
|
+
| 8 | FA search | FA | `POST /fixed-assets/search` | `capitalAllowances.assets[]` |
|
|
388
|
+
| 9 | GL drill-down | GL | `POST /generate-reports/general-ledger` | All `addBacks.*` and `deductions.*` fields |
|
|
389
|
+
| 10 | Capital items on P&L | GL | `POST /generate-reports/general-ledger` | `addBacks.capitalExpOnPnl` |
|
|
390
|
+
| 11 | Invoice search | Txn | `POST /invoices/search` | `revenue` verification |
|
|
391
|
+
| 12 | Journal search | Txn | `POST /journals/search` | Year-end adjustment review |
|
|
392
|
+
| 13 | FX transactions | Txn | `POST /cashflow-transactions/search` | `addBacks.unrealizedFxLoss`, `deductions.unrealizedFxGain` |
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## Practitioner Tips
|
|
397
|
+
|
|
398
|
+
**Work top-down.** Start with the P&L summary (Phase 2) to identify which accounts are material. Only drill into the GL (Phase 5) for accounts that need classification. For a typical SMB with 20-30 expense accounts, you will drill into 5-8 accounts.
|
|
399
|
+
|
|
400
|
+
**Depreciation is the easiest add-back.** Get it from the FA summary (Phase 4), verify it matches the P&L. This single item is often the largest add-back and requires zero judgment.
|
|
401
|
+
|
|
402
|
+
**Ask the user for carry-forwards.** The Jaz API does not store prior-year tax computation data. You MUST ask: "Do you have any unabsorbed losses, capital allowances, or donations brought forward from previous YAs?" If they have a prior-year Form C-S or tax computation, the carry-forward figures are on that document.
|
|
403
|
+
|
|
404
|
+
**IFRS 16 is a common gotcha.** If the company has operating leases accounted for under IFRS 16, the P&L will show ROU depreciation and lease interest instead of the actual lease payments. For tax purposes: add back the ROU depreciation (`addBacks.rouDepreciation`) and lease interest (`addBacks.leaseInterest`), then deduct the actual lease payments (`deductions.actualLeasePayments`). Ask: "Do you have any operating leases (office, equipment) accounted for under IFRS 16?"
|
|
405
|
+
|
|
406
|
+
**Currency matters.** If the company's base currency in Jaz is SGD, all report figures are already in SGD. If the base currency is different (e.g., USD for a holding company), every amount must be converted to SGD at the appropriate exchange rate before building the input JSON.
|
|
407
|
+
|
|
408
|
+
**Do not over-extract.** Pulling every single transaction is unnecessary and slow. The phased approach (P&L summary first, then targeted GL drill-down) is faster and produces the same result. Only go to Phase 6 (transaction search) if Phases 2-5 leave ambiguity.
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# Enhanced Deductions for SG Corporate Tax
|
|
2
|
+
|
|
3
|
+
Enhanced deductions allow companies to claim more than 100% of certain qualifying expenditures as tax deductions. The "base" 100% is already in the P&L (as an expense that reduces accounting profit). The "enhanced" portion is the uplift above 100% — this is the additional tax deduction that must be explicitly claimed.
|
|
4
|
+
|
|
5
|
+
**Key concept:** The `enhancedDeductions` fields in `SgFormCsInput` capture only the **uplift portion** (the amount above the base 100%). The base is already reflected in accounting profit.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. R&D Tax Deduction (S14C / S14E)
|
|
10
|
+
|
|
11
|
+
Research and development expenditure qualifies for enhanced deductions under two schemes.
|
|
12
|
+
|
|
13
|
+
### S14C — Standard R&D deduction (no pre-approval needed)
|
|
14
|
+
|
|
15
|
+
| Item | Detail |
|
|
16
|
+
|------|--------|
|
|
17
|
+
| **Total deduction** | 250% of qualifying expenditure |
|
|
18
|
+
| **Breakdown** | 100% (already in P&L) + 150% uplift |
|
|
19
|
+
| **Pre-approval** | Not required |
|
|
20
|
+
| **Eligible expenditure** | Staff costs, consumables, IP costs for R&D, outsourced R&D (to SG research institutions) |
|
|
21
|
+
| **Cap** | None |
|
|
22
|
+
|
|
23
|
+
### S14E — Enhanced R&D deduction (requires IRAS pre-approval)
|
|
24
|
+
|
|
25
|
+
| Item | Detail |
|
|
26
|
+
|------|--------|
|
|
27
|
+
| **Total deduction** | 400% of qualifying expenditure |
|
|
28
|
+
| **Breakdown** | 100% (already in P&L) + 300% uplift |
|
|
29
|
+
| **Pre-approval** | Required — must be approved by IRAS before the R&D project starts |
|
|
30
|
+
| **Eligible expenditure** | Same categories as S14C, but must meet additional innovation criteria |
|
|
31
|
+
| **Cap** | None (but subject to IRAS approval of the specific project) |
|
|
32
|
+
|
|
33
|
+
### What qualifies as R&D
|
|
34
|
+
|
|
35
|
+
| Qualifying | NOT qualifying |
|
|
36
|
+
|-----------|---------------|
|
|
37
|
+
| Staff costs for R&D personnel | Market research or surveys |
|
|
38
|
+
| Consumables used in R&D | Routine quality testing |
|
|
39
|
+
| Payments to SG research institutions | Capital equipment purchases (claim CA instead) |
|
|
40
|
+
| IP costs directly related to R&D | Product adaptation for individual customers |
|
|
41
|
+
| Software development for new products | Maintenance of existing software |
|
|
42
|
+
|
|
43
|
+
### Input mapping
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
enhancedDeductions.rdExpenditure = [qualifying R&D spend]
|
|
47
|
+
enhancedDeductions.rdMultiplier = 2.5 (for S14C)
|
|
48
|
+
or 4.0 (for S14E)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The computation engine calculates the uplift as: `rdExpenditure * (rdMultiplier - 1)`
|
|
52
|
+
|
|
53
|
+
**Example:** $100,000 qualifying R&D under S14C:
|
|
54
|
+
- Base deduction (in P&L): $100,000
|
|
55
|
+
- Enhanced uplift (150%): $150,000
|
|
56
|
+
- Total tax deduction: $250,000
|
|
57
|
+
- Additional tax saving: $150,000 x 17% = $25,500
|
|
58
|
+
|
|
59
|
+
### Questions for the wizard
|
|
60
|
+
|
|
61
|
+
1. "Does the company perform research and development activities?"
|
|
62
|
+
2. "How much was spent on qualifying R&D during the basis period? (Staff costs, consumables, outsourced R&D.)"
|
|
63
|
+
3. "Is this under S14C (standard, 250%) or S14E (enhanced, 400%, requires pre-approval)?"
|
|
64
|
+
4. "For S14E: has IRAS approval been obtained?"
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 2. IP Registration Costs (S14A)
|
|
69
|
+
|
|
70
|
+
Intellectual property registration costs qualify for enhanced deduction.
|
|
71
|
+
|
|
72
|
+
| Item | Detail |
|
|
73
|
+
|------|--------|
|
|
74
|
+
| **Total deduction** | 200% of qualifying costs (first $100,000 per YA) |
|
|
75
|
+
| **Breakdown** | 100% (already in P&L) + 100% uplift |
|
|
76
|
+
| **Alternative** | 400% if under the IP Development Incentive (IDI) scheme |
|
|
77
|
+
| **Cap** | $100,000 of qualifying costs per YA (= max $100,000 uplift at 200%, or $300,000 uplift at 400%) |
|
|
78
|
+
|
|
79
|
+
### What qualifies
|
|
80
|
+
|
|
81
|
+
| Qualifying | NOT qualifying |
|
|
82
|
+
|-----------|---------------|
|
|
83
|
+
| Patent registration (SG or overseas) | Purchase of existing IP rights |
|
|
84
|
+
| Trademark registration | IP licensing fees |
|
|
85
|
+
| Registered design costs | Copyright (no registration in SG) |
|
|
86
|
+
| Plant variety registration | Internal costs of developing the IP |
|
|
87
|
+
|
|
88
|
+
### Input mapping
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
enhancedDeductions.ipRegistration = [qualifying IP costs, max $100,000]
|
|
92
|
+
enhancedDeductions.ipMultiplier = 2.0 (standard)
|
|
93
|
+
or 4.0 (IDI scheme)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The computation engine calculates the uplift as: `ipRegistration * (ipMultiplier - 1)`
|
|
97
|
+
|
|
98
|
+
**Example:** $30,000 trademark and patent registration costs:
|
|
99
|
+
- Base deduction (in P&L): $30,000
|
|
100
|
+
- Enhanced uplift (100%): $30,000
|
|
101
|
+
- Total tax deduction: $60,000
|
|
102
|
+
- Additional tax saving: $30,000 x 17% = $5,100
|
|
103
|
+
|
|
104
|
+
### Questions for the wizard
|
|
105
|
+
|
|
106
|
+
1. "Did the company register any patents, trademarks, or designs during the basis period?"
|
|
107
|
+
2. "What was the total cost of IP registration?"
|
|
108
|
+
3. "Is this under the standard scheme (200%) or the IP Development Incentive (400%)?"
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 3. Donation Deductions (S37)
|
|
113
|
+
|
|
114
|
+
Donations to approved Institutions of a Public Character (IPCs) qualify for a 250% tax deduction.
|
|
115
|
+
|
|
116
|
+
| Item | Detail |
|
|
117
|
+
|------|--------|
|
|
118
|
+
| **Total deduction** | 250% of qualifying donations |
|
|
119
|
+
| **Breakdown** | 100% (added back from P&L) + 250% claimed as donation relief |
|
|
120
|
+
| **Eligible donations** | Cash donations to approved IPCs |
|
|
121
|
+
| **Cap** | None per YA |
|
|
122
|
+
| **Carry-forward** | Unused donations can be carried forward up to 5 years (FIFO) |
|
|
123
|
+
|
|
124
|
+
### How donations work in the computation
|
|
125
|
+
|
|
126
|
+
Donations are handled differently from R&D and IP because they are set off **after** loss relief, not in the enhanced deductions step:
|
|
127
|
+
|
|
128
|
+
1. **Add-back:** The donation expense is added back to accounting profit (it's in the P&L, but the deduction comes later at 250%)
|
|
129
|
+
2. **Enhanced deduction step:** The uplift portion (250% - 100% = 150%) is claimed here as `donations250Base * 1.5`
|
|
130
|
+
3. **Donation relief step:** The full 250% amount is set off against chargeable income after loss relief
|
|
131
|
+
|
|
132
|
+
**Important:** The `addBacks.donations` and `enhancedDeductions.donations250Base` fields must contain the same amount (the base donation amount). The computation engine handles the 250% multiplier and the correct set-off order.
|
|
133
|
+
|
|
134
|
+
### Input mapping
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
addBacks.donations = [total IPC donations]
|
|
138
|
+
enhancedDeductions.donations250Base = [same amount as addBacks.donations]
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Example:** $10,000 cash donation to approved IPC:
|
|
142
|
+
- Add-back: $10,000 (removes the P&L expense)
|
|
143
|
+
- Donation relief: $10,000 x 250% = $25,000 (claimed after loss relief)
|
|
144
|
+
- Net tax benefit: $25,000 x 17% = $4,250
|
|
145
|
+
- Effective tax saving per dollar donated: 42.5 cents
|
|
146
|
+
|
|
147
|
+
### Carry-forward rules
|
|
148
|
+
|
|
149
|
+
- Unused donation deductions carry forward up to **5 years**
|
|
150
|
+
- Used on a **FIFO basis** (oldest donations used first)
|
|
151
|
+
- Subject to the same shareholding test as loss carry-forwards (>= 50% continuity)
|
|
152
|
+
- Input: `donationsCarryForward.broughtForward` (total from prior years, not yet used)
|
|
153
|
+
|
|
154
|
+
### Questions for the wizard
|
|
155
|
+
|
|
156
|
+
1. "Were any donations made to approved IPCs during the basis period?"
|
|
157
|
+
2. "What was the total donation amount?"
|
|
158
|
+
3. "Does the company have any unused donation deductions from prior years? If so, how much and from which YA?"
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 4. Renovation & Refurbishment Deduction (S14Q)
|
|
163
|
+
|
|
164
|
+
Renovation costs for business premises qualify for a special deduction spread over 3 years.
|
|
165
|
+
|
|
166
|
+
| Item | Detail |
|
|
167
|
+
|------|--------|
|
|
168
|
+
| **Total deduction** | 100% of qualifying costs over 3 years (33.33% per year) |
|
|
169
|
+
| **Cap** | $300,000 per rolling 3-year period |
|
|
170
|
+
| **Claimed via** | Capital allowances schedule (category: `renovation`, section S14Q) |
|
|
171
|
+
| **Enhanced uplift** | Only if there is a net uplift above what is already claimed via CA |
|
|
172
|
+
|
|
173
|
+
### What qualifies
|
|
174
|
+
|
|
175
|
+
| Qualifying | NOT qualifying |
|
|
176
|
+
|-----------|---------------|
|
|
177
|
+
| General renovation of business premises | New construction or building extension |
|
|
178
|
+
| Electrical wiring, plumbing | Land and structural improvements to property |
|
|
179
|
+
| Flooring, wall finishes, painting | Purchase of furniture or equipment (use CA instead) |
|
|
180
|
+
| Built-in furniture (e.g., reception desk) | Renovation of residential property |
|
|
181
|
+
| Signage and window displays | Motor vehicle modifications |
|
|
182
|
+
| Doors, windows, partitions | Landscaping |
|
|
183
|
+
|
|
184
|
+
### How S14Q works in the computation
|
|
185
|
+
|
|
186
|
+
S14Q renovation costs are primarily claimed through the **capital allowances schedule** — each qualifying renovation cost is entered as a `CaAsset` with `category: 'renovation'`. The CA engine computes the 33.33% annual claim.
|
|
187
|
+
|
|
188
|
+
The `enhancedDeductions.s14qRenovation` field captures only the **net uplift** — the portion of the S14Q deduction that is not already reflected in the CA schedule. In most cases, this is zero because the full deduction flows through the CA schedule.
|
|
189
|
+
|
|
190
|
+
Use the uplift field when renovation costs were expensed on the P&L (instead of capitalized) and you need to capture the additional deduction above what the CA schedule provides.
|
|
191
|
+
|
|
192
|
+
### Input mapping
|
|
193
|
+
|
|
194
|
+
For capitalized renovation (the normal case):
|
|
195
|
+
```
|
|
196
|
+
capitalAllowances.assets = [
|
|
197
|
+
{
|
|
198
|
+
description: "Office renovation - FY2025",
|
|
199
|
+
cost: 120000,
|
|
200
|
+
acquisitionDate: "2025-03-15",
|
|
201
|
+
category: "renovation",
|
|
202
|
+
priorYearsClaimed: 0
|
|
203
|
+
}
|
|
204
|
+
]
|
|
205
|
+
enhancedDeductions.s14qRenovation = 0 (already in CA schedule)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
For expensed renovation (unusual):
|
|
209
|
+
```
|
|
210
|
+
enhancedDeductions.s14qRenovation = [net uplift amount]
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 3-year rolling cap
|
|
214
|
+
|
|
215
|
+
The $300,000 cap applies per **rolling 3-year period**, not per YA. If the company spent $200,000 in Year 1, only $100,000 of new renovation in Years 2-3 qualifies. The AI agent should ask about prior year renovation claims to check the cap.
|
|
216
|
+
|
|
217
|
+
### Questions for the wizard
|
|
218
|
+
|
|
219
|
+
1. "Did the company incur renovation or refurbishment costs for business premises during the basis period?"
|
|
220
|
+
2. "What was the total renovation cost? Was it capitalized as a fixed asset or expensed on the P&L?"
|
|
221
|
+
3. "Were any renovation claims made in the prior 2 years? (To check the $300,000 rolling cap.)"
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Summary: Enhanced Deduction Input Fields
|
|
226
|
+
|
|
227
|
+
| Scheme | Input field | Multiplier field | Default | Uplift formula |
|
|
228
|
+
|--------|------------|-----------------|---------|----------------|
|
|
229
|
+
| R&D (S14C) | `enhancedDeductions.rdExpenditure` | `rdMultiplier` | 2.5 | expenditure x (2.5 - 1) = 150% |
|
|
230
|
+
| R&D (S14E) | `enhancedDeductions.rdExpenditure` | `rdMultiplier` | 4.0 | expenditure x (4.0 - 1) = 300% |
|
|
231
|
+
| IP (S14A) | `enhancedDeductions.ipRegistration` | `ipMultiplier` | 2.0 | costs x (2.0 - 1) = 100% |
|
|
232
|
+
| IP (IDI) | `enhancedDeductions.ipRegistration` | `ipMultiplier` | 4.0 | costs x (4.0 - 1) = 300% |
|
|
233
|
+
| Donations (S37) | `enhancedDeductions.donations250Base` | (fixed 250%) | n/a | base x 1.5 (enhanced step) |
|
|
234
|
+
| Renovation (S14Q) | `enhancedDeductions.s14qRenovation` | (net uplift) | n/a | typically 0 (flows via CA) |
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Common Mistakes
|
|
239
|
+
|
|
240
|
+
1. **Claiming the full 250% R&D deduction as an add-back.** The base 100% is already in the P&L. Only the uplift (150% or 300%) is the enhanced deduction. If you also add back the R&D expense, you've effectively claimed 350% or 500%.
|
|
241
|
+
|
|
242
|
+
2. **Not matching donations in add-backs and enhanced deductions.** `addBacks.donations` and `enhancedDeductions.donations250Base` must be the same amount. The add-back removes the P&L expense; the donation relief step claims the full 250%.
|
|
243
|
+
|
|
244
|
+
3. **Exceeding the IP registration cap.** Only the first $100,000 of qualifying IP costs per YA qualifies. If the company spent $150,000, only $100,000 goes into `enhancedDeductions.ipRegistration`.
|
|
245
|
+
|
|
246
|
+
4. **Forgetting the S14Q rolling cap.** The $300,000 cap spans 3 years. If $250,000 was claimed in Year 1, only $50,000 of new renovation qualifies in Years 2-3.
|
|
247
|
+
|
|
248
|
+
5. **Claiming S14E without pre-approval.** The 400% R&D deduction requires IRAS pre-approval BEFORE the project starts. Without it, only S14C (250%) applies.
|