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,391 @@
|
|
|
1
|
+
# SG Corporate Income Tax — Wizard Workflow
|
|
2
|
+
|
|
3
|
+
Step-by-step procedure an AI agent follows to produce a complete Form C-S corporate income tax computation for a Singapore company. The wizard collects data through four phases — context, extraction, classification, and compute — ultimately assembling a `SgFormCsInput` JSON and running the computation engine.
|
|
4
|
+
|
|
5
|
+
**CLI:** `jaz tax sg-cs --json`
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Phase 1: Context (3 Questions)
|
|
10
|
+
|
|
11
|
+
Establish the filing parameters before touching any financial data.
|
|
12
|
+
|
|
13
|
+
### Step 1: Determine YA and basis period
|
|
14
|
+
|
|
15
|
+
The Year of Assessment (YA) is the year **after** the financial year-end. A company with FY ending 31 Dec 2025 files for YA 2026.
|
|
16
|
+
|
|
17
|
+
**API call:**
|
|
18
|
+
```
|
|
19
|
+
GET /api/v1/organization
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**What to look for:** `data.financialYearEnd` (month number, e.g. 12 = December). The basis period is the 12-month FY ending in the calendar year before the YA. For a standard Dec year-end company filing YA 2026, the basis period is 01 Jan 2025 to 31 Dec 2025.
|
|
23
|
+
|
|
24
|
+
**Question to ask:** "Your financial year ends in [month]. I'll prepare the computation for YA [N] (basis period [start] to [end]). Is that correct?"
|
|
25
|
+
|
|
26
|
+
**Maps to:**
|
|
27
|
+
- `ya` — Year of Assessment
|
|
28
|
+
- `basisPeriodStart` — FY start date (YYYY-MM-DD)
|
|
29
|
+
- `basisPeriodEnd` — FY end date (YYYY-MM-DD)
|
|
30
|
+
|
|
31
|
+
### Step 2: Check Form C-S eligibility
|
|
32
|
+
|
|
33
|
+
Form C-S is the simplified return for qualifying small companies. A company qualifies if **all** of these are true:
|
|
34
|
+
|
|
35
|
+
| Criterion | Threshold |
|
|
36
|
+
|-----------|-----------|
|
|
37
|
+
| Annual revenue | <= $5,000,000 |
|
|
38
|
+
| No investment income | Dividends, interest, rental from investments |
|
|
39
|
+
| No capital gains/losses on fixed asset disposal | Gains on sale of property, equipment (SG has no CGT but IRAS can treat recurring gains as trading income) |
|
|
40
|
+
| No foreign-sourced income | Income earned or received from outside SG |
|
|
41
|
+
| Singapore-incorporated | Must be incorporated in SG |
|
|
42
|
+
|
|
43
|
+
**Question to ask:** "Does the company have any of the following? (a) Revenue over $5M, (b) Investment income (dividends, rental, interest from investments), (c) Capital gains from asset disposal, (d) Foreign-sourced income. If yes to any, Form C-S may not be applicable."
|
|
44
|
+
|
|
45
|
+
If revenue <= $200,000: the company may use **Form C-S Lite** (even simpler — 6 fields only).
|
|
46
|
+
|
|
47
|
+
**Maps to:** `revenue` (for threshold check); eligibility is validated by the computation engine.
|
|
48
|
+
|
|
49
|
+
### Step 3: Determine exemption type (SUTE vs PTE)
|
|
50
|
+
|
|
51
|
+
**Question to ask:** "When was the company incorporated (year)?"
|
|
52
|
+
|
|
53
|
+
**Decision logic:**
|
|
54
|
+
- If the YA is within the first 3 YAs from incorporation (e.g., incorporated 2024 -> first 3 YAs are 2025, 2026, 2027) **AND** the company meets the SUTE conditions:
|
|
55
|
+
- <= 20 shareholders, all individuals or at least 1 individual holding >= 10%
|
|
56
|
+
-> `exemptionType: 'sute'`
|
|
57
|
+
- Otherwise -> `exemptionType: 'pte'`
|
|
58
|
+
- In rare cases (e.g., companies electing out) -> `exemptionType: 'none'`
|
|
59
|
+
|
|
60
|
+
**Follow-up question (if SUTE-eligible):** "Does the company have 20 or fewer shareholders, with at least one individual shareholder holding 10% or more of the shares?"
|
|
61
|
+
|
|
62
|
+
**Maps to:** `exemptionType`
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Phase 2: Data Extraction
|
|
67
|
+
|
|
68
|
+
Pull the financial reports from the platform. These provide the raw numbers for the computation.
|
|
69
|
+
|
|
70
|
+
### Step 4: Pull Profit & Loss report
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
POST /api/v1/generate-reports/profit-and-loss
|
|
74
|
+
{
|
|
75
|
+
"primarySnapshotDate": "2025-12-31",
|
|
76
|
+
"secondarySnapshotDate": "2025-01-01"
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**What to extract:**
|
|
81
|
+
- **Total revenue** — top line. Maps to `revenue`.
|
|
82
|
+
- **Total expenses** — for cross-reference.
|
|
83
|
+
- **Net profit/(loss)** — bottom line. Maps to `accountingProfit`.
|
|
84
|
+
- Scan expense categories for accounts that will need add-back review (depreciation, entertainment, donations, penalties, etc.)
|
|
85
|
+
|
|
86
|
+
**Maps to:** `revenue`, `accountingProfit`
|
|
87
|
+
|
|
88
|
+
### Step 5: Pull Trial Balance
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
POST /api/v1/generate-reports/trial-balance
|
|
92
|
+
{
|
|
93
|
+
"startDate": "2025-01-01",
|
|
94
|
+
"endDate": "2025-12-31"
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**What to extract:**
|
|
99
|
+
- Cross-reference total revenue and total expenses to P&L (they must agree)
|
|
100
|
+
- Identify control accounts: GST receivable/payable, fixed asset accumulated depreciation, provision accounts, lease liability, ROU assets
|
|
101
|
+
- Note any suspense account balances (these need clearing before tax computation)
|
|
102
|
+
|
|
103
|
+
**Purpose:** The trial balance gives you the full chart of accounts view. Many add-back items are identified by scanning account names here.
|
|
104
|
+
|
|
105
|
+
### Step 6: Pull Fixed Asset Summary
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
POST /api/v1/generate-reports/fixed-assets-summary
|
|
109
|
+
{}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**What to extract:**
|
|
113
|
+
- **Total accounting depreciation** for the year — this is always added back. Maps to `addBacks.depreciation`.
|
|
114
|
+
- **Asset list** with cost, accumulated depreciation, NBV — needed for capital allowance classification in Phase 3.
|
|
115
|
+
- Note any disposals during the year (proceeds vs NBV = gain/loss, which may need add-back or deduction).
|
|
116
|
+
|
|
117
|
+
### Step 7: Pull GL detail for targeted accounts
|
|
118
|
+
|
|
119
|
+
For each ambiguous expense account identified in Steps 4-5, drill into the general ledger:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
POST /api/v1/cashflow-transactions/search
|
|
123
|
+
{
|
|
124
|
+
"filter": {
|
|
125
|
+
"chartOfAccountResourceId": { "eq": "<account-resource-id>" },
|
|
126
|
+
"valueDate": { "between": ["2025-01-01", "2025-12-31"] }
|
|
127
|
+
},
|
|
128
|
+
"sort": { "sortBy": ["valueDate"], "order": "ASC" },
|
|
129
|
+
"limit": 1000
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**When to use this:** When an expense account name is ambiguous (e.g., "Professional Fees" could contain deductible audit fees AND non-deductible fines). You need transaction-level detail to classify correctly.
|
|
134
|
+
|
|
135
|
+
**Common accounts to drill into:**
|
|
136
|
+
- "Other Expenses" or "Sundry Expenses" — catch-all accounts often contain non-deductible items
|
|
137
|
+
- "Professional Fees" — may include tax penalty payments
|
|
138
|
+
- "Motor Vehicle" — need to split S-plated (non-deductible) from commercial vehicles
|
|
139
|
+
- "Entertainment" — need to identify non-deductible portion
|
|
140
|
+
- "Repairs & Maintenance" — may contain capital expenditure incorrectly expensed
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Phase 3: Tax Classification (AI Judgment + Human Confirmation)
|
|
145
|
+
|
|
146
|
+
This is the core of the tax computation. For each add-back category, scan the data, pattern-match, present to the user for confirmation, and classify.
|
|
147
|
+
|
|
148
|
+
**Golden rule:** Present your analysis and let the user confirm. Never silently classify an item.
|
|
149
|
+
|
|
150
|
+
### Steps 8-16: Add-back categories
|
|
151
|
+
|
|
152
|
+
Work through each add-back category in order. For each one:
|
|
153
|
+
|
|
154
|
+
1. **Scan** — look at the P&L, TB, and GL data for matching items
|
|
155
|
+
2. **Pattern-match** — use account names, transaction descriptions, and amounts to identify candidates
|
|
156
|
+
3. **Present** — show the user what you found and your proposed classification
|
|
157
|
+
4. **Confirm** — get explicit confirmation before recording the amount
|
|
158
|
+
5. **Map** — record the confirmed amount in the corresponding `addBacks` field
|
|
159
|
+
|
|
160
|
+
| # | Category | What to scan for | Input field |
|
|
161
|
+
|---|----------|-----------------|-------------|
|
|
162
|
+
| 8 | **Depreciation** | FA summary total, "Depreciation" accounts on TB. Always 100% add-back. | `addBacks.depreciation` |
|
|
163
|
+
| 9 | **Amortization** | "Amortization" accounts — intangible assets (goodwill, patents, software). Always add back. | `addBacks.amortization` |
|
|
164
|
+
| 10 | **IFRS 16 — ROU depreciation** | "Right-of-Use" or "ROU" accounts. See `references/sg-tax/ifrs16-tax-adjustment.md`. | `addBacks.rouDepreciation` |
|
|
165
|
+
| 11 | **IFRS 16 — Lease interest** | "Lease Liability Interest" accounts. See IFRS 16 reference. | `addBacks.leaseInterest` |
|
|
166
|
+
| 12 | **Provisions** | "Provision", "ECL", "Warranty", "Restructuring" accounts. General provisions are added back; specific provisions (e.g., specific bad debt write-off) may be deductible. | `addBacks.generalProvisions` |
|
|
167
|
+
| 13 | **Donations** | "Donation" accounts. Add back the full amount, then claim 250% as enhanced deduction separately. | `addBacks.donations` |
|
|
168
|
+
| 14 | **Entertainment** | "Entertainment", "Meals", "Client hospitality". Ask: "What portion is non-deductible (e.g., personal, excessive)?" | `addBacks.entertainment` |
|
|
169
|
+
| 15 | **Penalties & fines** | "Penalty", "Fine", "Surcharge", "Late payment interest". All non-deductible. | `addBacks.penalties` |
|
|
170
|
+
| 16 | **Other categories** | Private car (`addBacks.privateCar`), capital items expensed (`addBacks.capitalExpOnPnl`), unrealized FX losses (`addBacks.unrealizedFxLoss`), exempt dividends (`addBacks.exemptDividends`), other (`addBacks.otherNonDeductible`). | Various |
|
|
171
|
+
|
|
172
|
+
**Question to ask (template):** "I found $X in [account name]. This appears to be [category]. Should I add back $[amount] for [reason]?"
|
|
173
|
+
|
|
174
|
+
### Step 16b: Deductions
|
|
175
|
+
|
|
176
|
+
Similarly, identify items that reduce taxable income but weren't deducted in the accounts:
|
|
177
|
+
|
|
178
|
+
| Item | What to scan for | Input field |
|
|
179
|
+
|------|-----------------|-------------|
|
|
180
|
+
| **Actual lease payments** | Bank/cash entries to lessors. See IFRS 16 reference. | `deductions.actualLeasePayments` |
|
|
181
|
+
| **Unrealized FX gains** | "Unrealized FX Gain" on P&L. Not taxable until crystallized. | `deductions.unrealizedFxGain` |
|
|
182
|
+
| **Exempt income** | SG one-tier dividends received, tax-exempt grants. | `deductions.exemptIncome` |
|
|
183
|
+
| **Other deductions** | Any other items. | `deductions.otherDeductions` |
|
|
184
|
+
|
|
185
|
+
### Step 17: Capital allowances
|
|
186
|
+
|
|
187
|
+
Present the fixed asset list from Step 6 and ask the user to classify each asset.
|
|
188
|
+
|
|
189
|
+
**Question to ask:** "Here are your fixed assets. For each, I need to know the IRAS capital allowance category:"
|
|
190
|
+
|
|
191
|
+
| Category | Code | Rate | Section |
|
|
192
|
+
|----------|------|------|---------|
|
|
193
|
+
| Computer equipment | `computer` | 100% Year 1 | S19A(1) |
|
|
194
|
+
| Automation equipment | `automation` | 100% Year 1 | S19A(1) |
|
|
195
|
+
| Low-value assets (<= $5K each) | `low-value` | 100% Year 1 (cap $30K/YA total) | S19A(2) |
|
|
196
|
+
| General P&M | `general` | 33.33% x 3 years | S19 |
|
|
197
|
+
| IP / patents | `ip` | 20% x 5 years (or 10/15 years) | S19B |
|
|
198
|
+
| Renovation | `renovation` | 33.33% x 3 years ($300K per 3-year block cap) | S14Q |
|
|
199
|
+
|
|
200
|
+
For each asset, record: `description`, `cost`, `acquisitionDate`, `category`, `priorYearsClaimed`.
|
|
201
|
+
|
|
202
|
+
**Maps to:** `capitalAllowances.currentYearClaim` (compute via `jaz calc` or the CA schedule engine), `capitalAllowances.assets`
|
|
203
|
+
|
|
204
|
+
**Calculator:** `jaz tax sg-ca --json` computes the per-asset CA schedule.
|
|
205
|
+
|
|
206
|
+
### Step 18: Enhanced deductions
|
|
207
|
+
|
|
208
|
+
**Questions to ask:**
|
|
209
|
+
|
|
210
|
+
1. "Does the company do research and development? How much qualifying expenditure? Is it under S14C (250%) or S14E (400%, requires pre-approval)?"
|
|
211
|
+
- Maps to: `enhancedDeductions.rdExpenditure`, `enhancedDeductions.rdMultiplier` (2.5 or 4.0)
|
|
212
|
+
|
|
213
|
+
2. "Did the company register any patents, trademarks, or designs this year? What was the cost?"
|
|
214
|
+
- Maps to: `enhancedDeductions.ipRegistration`, `enhancedDeductions.ipMultiplier` (2.0 or 4.0)
|
|
215
|
+
|
|
216
|
+
3. "Were any donations made to approved IPCs (Institutions of a Public Character)?"
|
|
217
|
+
- This should already be captured in `addBacks.donations` — confirm the same amount.
|
|
218
|
+
- Maps to: `enhancedDeductions.donations250Base` (should equal `addBacks.donations`)
|
|
219
|
+
|
|
220
|
+
4. "Did the company incur renovation/refurbishment costs for business premises?"
|
|
221
|
+
- Maps to: `enhancedDeductions.s14qRenovation` (the net uplift portion)
|
|
222
|
+
|
|
223
|
+
See `references/sg-tax/enhanced-deductions.md` for full detail.
|
|
224
|
+
|
|
225
|
+
### Step 19: Carry-forwards from prior years
|
|
226
|
+
|
|
227
|
+
**Questions to ask:**
|
|
228
|
+
|
|
229
|
+
1. "Does the company have unabsorbed trade losses from prior years? If so, how much?"
|
|
230
|
+
- Maps to: `losses.broughtForward`
|
|
231
|
+
|
|
232
|
+
2. "Does the company have unabsorbed capital allowances from prior years?"
|
|
233
|
+
- Maps to: `capitalAllowances.balanceBroughtForward`
|
|
234
|
+
|
|
235
|
+
3. "Does the company have unabsorbed donation deductions from prior years? (Maximum 5 years old, FIFO basis.)"
|
|
236
|
+
- Maps to: `donationsCarryForward.broughtForward`
|
|
237
|
+
|
|
238
|
+
4. "Has the company's shareholding remained at least 50% the same between the relevant dates?" (Required for loss and CA carry-forward claims.)
|
|
239
|
+
|
|
240
|
+
See `references/sg-tax/losses-and-carry-forwards.md` for the set-off order and rules.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Phase 4: Compute
|
|
245
|
+
|
|
246
|
+
### Step 20: Assemble the `SgFormCsInput` JSON
|
|
247
|
+
|
|
248
|
+
Compile all gathered data into the input structure. Example:
|
|
249
|
+
|
|
250
|
+
```json
|
|
251
|
+
{
|
|
252
|
+
"ya": 2026,
|
|
253
|
+
"basisPeriodStart": "2025-01-01",
|
|
254
|
+
"basisPeriodEnd": "2025-12-31",
|
|
255
|
+
"currency": "SGD",
|
|
256
|
+
"revenue": 2500000,
|
|
257
|
+
"accountingProfit": 350000,
|
|
258
|
+
"addBacks": {
|
|
259
|
+
"depreciation": 45000,
|
|
260
|
+
"amortization": 0,
|
|
261
|
+
"rouDepreciation": 18000,
|
|
262
|
+
"leaseInterest": 4200,
|
|
263
|
+
"generalProvisions": 12000,
|
|
264
|
+
"donations": 5000,
|
|
265
|
+
"entertainment": 3500,
|
|
266
|
+
"penalties": 800,
|
|
267
|
+
"privateCar": 6000,
|
|
268
|
+
"capitalExpOnPnl": 0,
|
|
269
|
+
"unrealizedFxLoss": 2100,
|
|
270
|
+
"exemptDividends": 0,
|
|
271
|
+
"otherNonDeductible": 0
|
|
272
|
+
},
|
|
273
|
+
"deductions": {
|
|
274
|
+
"actualLeasePayments": 20000,
|
|
275
|
+
"unrealizedFxGain": 1500,
|
|
276
|
+
"exemptIncome": 0,
|
|
277
|
+
"otherDeductions": 0
|
|
278
|
+
},
|
|
279
|
+
"capitalAllowances": {
|
|
280
|
+
"currentYearClaim": 62000,
|
|
281
|
+
"assets": [],
|
|
282
|
+
"balanceBroughtForward": 15000
|
|
283
|
+
},
|
|
284
|
+
"enhancedDeductions": {
|
|
285
|
+
"rdExpenditure": 0,
|
|
286
|
+
"rdMultiplier": 2.5,
|
|
287
|
+
"ipRegistration": 0,
|
|
288
|
+
"ipMultiplier": 2.0,
|
|
289
|
+
"donations250Base": 5000,
|
|
290
|
+
"s14qRenovation": 0
|
|
291
|
+
},
|
|
292
|
+
"losses": { "broughtForward": 0 },
|
|
293
|
+
"donationsCarryForward": { "broughtForward": 0 },
|
|
294
|
+
"exemptionType": "pte"
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**Validation:** Before running the computation, verify:
|
|
299
|
+
- `addBacks.donations` == `enhancedDeductions.donations250Base` (they must match)
|
|
300
|
+
- `revenue` is consistent with the P&L
|
|
301
|
+
- `accountingProfit` is consistent with the P&L
|
|
302
|
+
- All amounts are >= 0 (the engine validates this too)
|
|
303
|
+
|
|
304
|
+
### Step 21: Run the computation
|
|
305
|
+
|
|
306
|
+
**CLI:**
|
|
307
|
+
```bash
|
|
308
|
+
jaz tax sg-cs --json
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Or call `computeFormCs(input)` directly if running programmatically.
|
|
312
|
+
|
|
313
|
+
**What you get back:** A `SgFormCsResult` containing:
|
|
314
|
+
- `schedule` — the full tax computation schedule (line-by-line workpaper)
|
|
315
|
+
- `formFields` — mapped to Form C-S box numbers
|
|
316
|
+
- `workings` — human-readable text version of the computation
|
|
317
|
+
- Carry-forward amounts for next YA
|
|
318
|
+
|
|
319
|
+
### Step 22: Present results
|
|
320
|
+
|
|
321
|
+
Present the results to the user in three sections:
|
|
322
|
+
|
|
323
|
+
**a) Tax Computation Schedule**
|
|
324
|
+
The `schedule` array rendered as a table — this is the workpaper.
|
|
325
|
+
|
|
326
|
+
**b) Form C-S Field Mapping**
|
|
327
|
+
Show the `formFields` mapped to the actual form boxes:
|
|
328
|
+
|
|
329
|
+
| Box | Field | Amount | Source |
|
|
330
|
+
|-----|-------|--------|--------|
|
|
331
|
+
| 1 | Adjusted profit/loss | $X | Accounting profit + add-backs - deductions |
|
|
332
|
+
| 2 | Chargeable income | $X | After all reliefs |
|
|
333
|
+
| 4 | Revenue | $X | P&L total revenue |
|
|
334
|
+
| 6 | Tax at 17% | $X | Taxable income x 17% |
|
|
335
|
+
| 7 | Net tax payable | $X | Gross tax - CIT rebate |
|
|
336
|
+
|
|
337
|
+
**c) Carry-forwards**
|
|
338
|
+
Report amounts to carry forward:
|
|
339
|
+
- Unabsorbed trade losses: `unabsorbedLosses`
|
|
340
|
+
- Unabsorbed capital allowances: `unabsorbedCapitalAllowances`
|
|
341
|
+
- Unabsorbed donations: `unabsorbedDonations`
|
|
342
|
+
|
|
343
|
+
### Step 23: Filing guidance
|
|
344
|
+
|
|
345
|
+
**Filing:** Log into IRAS myTax Portal > Corporate Tax > File Form C-S (or C-S Lite). Enter the box amounts from the form field mapping. Submit before 30 November of the YA.
|
|
346
|
+
|
|
347
|
+
**Key dates:**
|
|
348
|
+
| Event | Deadline |
|
|
349
|
+
|-------|----------|
|
|
350
|
+
| ECI filing | Within 3 months of FY end |
|
|
351
|
+
| Form C-S filing | 30 November of the YA |
|
|
352
|
+
| Tax payment | Within 1 month of Notice of Assessment |
|
|
353
|
+
|
|
354
|
+
**Offer:** "Would you like me to save the workpaper as a PDF/export for your records?"
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Wizard Checklist (Quick Reference)
|
|
359
|
+
|
|
360
|
+
| # | Step | Phase | Conditional |
|
|
361
|
+
|---|------|-------|-------------|
|
|
362
|
+
| 1 | Determine YA and basis period | Context | Always |
|
|
363
|
+
| 2 | Check C-S eligibility | Context | Always |
|
|
364
|
+
| 3 | Determine exemption type | Context | Always |
|
|
365
|
+
| 4 | Pull P&L report | Extraction | Always |
|
|
366
|
+
| 5 | Pull Trial Balance | Extraction | Always |
|
|
367
|
+
| 6 | Pull FA Summary | Extraction | If fixed assets exist |
|
|
368
|
+
| 7 | Pull GL for targeted accounts | Extraction | If ambiguous accounts exist |
|
|
369
|
+
| 8-16 | Classify add-backs | Classification | Always (per category) |
|
|
370
|
+
| 16b | Classify deductions | Classification | If IFRS 16 / FX / exempt income |
|
|
371
|
+
| 17 | Capital allowances | Classification | If fixed assets exist |
|
|
372
|
+
| 18 | Enhanced deductions | Classification | If R&D / IP / donations / renovation |
|
|
373
|
+
| 19 | Carry-forwards | Classification | If prior year losses/CA/donations |
|
|
374
|
+
| 20 | Assemble input JSON | Compute | Always |
|
|
375
|
+
| 21 | Run computation | Compute | Always |
|
|
376
|
+
| 22 | Present results | Compute | Always |
|
|
377
|
+
| 23 | Filing guidance | Compute | Always |
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## Common Mistakes
|
|
382
|
+
|
|
383
|
+
1. **Forgetting to add back accounting depreciation.** This is the single most common error. Accounting depreciation is ALWAYS added back — the tax deduction comes through capital allowances instead.
|
|
384
|
+
|
|
385
|
+
2. **Double-counting donations.** Donations are added back (Step 13) AND claimed at 250% as an enhanced deduction (Step 18). The add-back removes the P&L expense; the enhanced deduction gives the 250% tax deduction. If you skip the add-back, you get 250% + 100% = 350%.
|
|
386
|
+
|
|
387
|
+
3. **IFRS 16 confusion.** Three adjustments are needed (add back ROU depreciation, add back lease interest, deduct actual payments). Missing any one produces an incorrect result. See `references/sg-tax/ifrs16-tax-adjustment.md`.
|
|
388
|
+
|
|
389
|
+
4. **Using PTE when SUTE applies.** SUTE saves significantly more tax in the first 3 YAs. Always check incorporation year.
|
|
390
|
+
|
|
391
|
+
5. **Forgetting the shareholding test.** Carry-forward losses and CA require >= 50% shareholder continuity. If ownership changed, the carry-forwards may be lost.
|