jaz-cli 2.8.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.
Files changed (45) hide show
  1. package/assets/skills/api/SKILL.md +1 -1
  2. package/assets/skills/conversion/SKILL.md +1 -1
  3. package/assets/skills/jobs/SKILL.md +58 -1
  4. package/assets/skills/jobs/references/sg-tax/add-backs-guide.md +354 -0
  5. package/assets/skills/jobs/references/sg-tax/capital-allowances-guide.md +343 -0
  6. package/assets/skills/jobs/references/sg-tax/data-extraction.md +408 -0
  7. package/assets/skills/jobs/references/sg-tax/enhanced-deductions.md +248 -0
  8. package/assets/skills/jobs/references/sg-tax/exemptions-and-rebates.md +197 -0
  9. package/assets/skills/jobs/references/sg-tax/form-cs-fields.md +191 -0
  10. package/assets/skills/jobs/references/sg-tax/ifrs16-tax-adjustment.md +194 -0
  11. package/assets/skills/jobs/references/sg-tax/losses-and-carry-forwards.md +269 -0
  12. package/assets/skills/jobs/references/sg-tax/overview.md +207 -0
  13. package/assets/skills/jobs/references/sg-tax/wizard-workflow.md +391 -0
  14. package/assets/skills/transaction-recipes/SKILL.md +1 -1
  15. package/dist/__tests__/jobs-audit-prep.test.js +3 -3
  16. package/dist/__tests__/jobs-bank-recon.test.js +5 -5
  17. package/dist/__tests__/jobs-credit-control.test.js +1 -1
  18. package/dist/__tests__/jobs-fa-review.test.js +1 -1
  19. package/dist/__tests__/jobs-payment-run.test.js +3 -3
  20. package/dist/__tests__/jobs-supplier-recon.test.js +6 -6
  21. package/dist/__tests__/tax-sg-capital-allowances.test.js +389 -0
  22. package/dist/__tests__/tax-sg-exemptions.test.js +232 -0
  23. package/dist/__tests__/tax-sg-form-cs.test.js +687 -0
  24. package/dist/__tests__/tax-validate.test.js +208 -0
  25. package/dist/commands/init.js +7 -2
  26. package/dist/commands/jobs.js +1 -1
  27. package/dist/commands/tax.js +195 -0
  28. package/dist/index.js +2 -0
  29. package/dist/jobs/audit-prep.js +4 -4
  30. package/dist/jobs/bank-recon.js +4 -4
  31. package/dist/jobs/credit-control.js +5 -5
  32. package/dist/jobs/fa-review.js +4 -4
  33. package/dist/jobs/gst-vat.js +3 -3
  34. package/dist/jobs/payment-run.js +4 -4
  35. package/dist/jobs/supplier-recon.js +3 -3
  36. package/dist/tax/format.js +18 -0
  37. package/dist/tax/sg/capital-allowances.js +160 -0
  38. package/dist/tax/sg/constants.js +63 -0
  39. package/dist/tax/sg/exemptions.js +76 -0
  40. package/dist/tax/sg/form-cs.js +349 -0
  41. package/dist/tax/sg/format-sg.js +134 -0
  42. package/dist/tax/types.js +9 -0
  43. package/dist/tax/validate.js +124 -0
  44. package/dist/utils/template.js +1 -1
  45. 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.