@classytic/ca-tax 0.0.20 → 0.0.22
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/CHANGELOG.md +117 -0
- package/README.md +16 -0
- package/dist/forms/index.d.mts +2 -2
- package/dist/forms/index.mjs +2 -2
- package/dist/forms.mjs +5350 -1426
- package/dist/index.d.mts +1020 -5
- package/dist/index.mjs +3 -3
- package/dist/index3.d.mts +271 -10
- package/dist/index4.d.mts +3 -3
- package/dist/t2/index.d.mts +3 -3
- package/dist/t2/index.mjs +3 -3
- package/dist/t2.mjs +202 -40
- package/docs/STATUTORY-DATA.md +109 -0
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
|
@@ -144,6 +144,26 @@ interface FormField {
|
|
|
144
144
|
from?: FormLineRef;
|
|
145
145
|
/** Where the figure goes, when the form says to enter it elsewhere. */
|
|
146
146
|
to?: FormLineRef;
|
|
147
|
+
/**
|
|
148
|
+
* What the form itself prints over the box to say where the figure is taken
|
|
149
|
+
* from, verbatim — `'Federal Schedule 1 line 403'`,
|
|
150
|
+
* `'Schedule 15 lines 007 + 019 +031'`, `'Schedule 16 line 016 OR line 20'`.
|
|
151
|
+
*
|
|
152
|
+
* Distinct from both neighbours, and it needs to be:
|
|
153
|
+
*
|
|
154
|
+
* `from` is the STRUCTURED link, and can only exist where the print names
|
|
155
|
+
* exactly one line. Roughly a quarter of AT1 Schedule 12's sources
|
|
156
|
+
* are sums, a conditional, or a multiplier — no single ref states
|
|
157
|
+
* them, and picking one line out of a sum states a source the form
|
|
158
|
+
* does not.
|
|
159
|
+
* `note` is THIS codebase's own explanation, as its own doc says. Putting
|
|
160
|
+
* the page's words there mixes the two, and leaves a renderer no
|
|
161
|
+
* way to show the printed source as the source.
|
|
162
|
+
*
|
|
163
|
+
* So: set `sourceText` for every box the form annotates, and `from` as well
|
|
164
|
+
* for the subset that names one line.
|
|
165
|
+
*/
|
|
166
|
+
sourceText?: string;
|
|
147
167
|
/**
|
|
148
168
|
* Anything a reader needs that the caption does not say — a cap, a statutory
|
|
149
169
|
* reference, a trap. This is the field that stops knowledge decaying into
|
|
@@ -168,12 +188,122 @@ interface FormSection {
|
|
|
168
188
|
page?: number;
|
|
169
189
|
/** Shown under the heading — the guidance a preparer needs at that point. */
|
|
170
190
|
description?: string;
|
|
191
|
+
/**
|
|
192
|
+
* Text the form prints immediately BEFORE this section's heading, verbatim.
|
|
193
|
+
*
|
|
194
|
+
* Distinct from `description` for the same reason `FormField.sourceText` is
|
|
195
|
+
* distinct from `FormField.note`: that is this codebase's own guidance, this
|
|
196
|
+
* is the page's own words.
|
|
197
|
+
*
|
|
198
|
+
* AT1 Schedule 20 is why it exists. Between the gifts continuity and the
|
|
199
|
+
* carryforward-by-year-of-origin block, the page sets a paragraph in bold
|
|
200
|
+
* telling a preparer where to enter a medicine-gift claim — on Schedule 12,
|
|
201
|
+
* not here. It belongs to neither block; it is not a footnote (nothing marks
|
|
202
|
+
* it, and it is set inline rather than in the margin); and it is not a line,
|
|
203
|
+
* so no `FormField` can hold it. Put in `description` it would read as our
|
|
204
|
+
* advice about the block beneath it, which it is not about at all.
|
|
205
|
+
*/
|
|
206
|
+
printedBefore?: string;
|
|
207
|
+
/**
|
|
208
|
+
* Text the form prints inside this box, AFTER its last numbered line.
|
|
209
|
+
*
|
|
210
|
+
* The mirror of `printedBefore`, and needed for the same reason: it is the
|
|
211
|
+
* page's own words, so it cannot go in `description`, and it is not a line,
|
|
212
|
+
* so no `FormField` can hold it.
|
|
213
|
+
*
|
|
214
|
+
* AT1 Schedule 1's first box is why. It contains one line — 001, "Is the
|
|
215
|
+
* corporation associated with one or more Canadian-controlled private
|
|
216
|
+
* corporations?" — and then, in bold beneath it, `If "Yes", complete AREA A
|
|
217
|
+
* on page 2.` That instruction is the entire reason the question is asked,
|
|
218
|
+
* and {@link PrintedBlockHeading} cannot carry it: `aboveLine` needs a line
|
|
219
|
+
* BELOW the text, and there is none — 001 is the last line in the box. (On
|
|
220
|
+
* AT1 Schedule 29 the equivalent instruction does have a line beneath it,
|
|
221
|
+
* line 102, so that one is a block heading.)
|
|
222
|
+
*/
|
|
223
|
+
printedAfter?: string;
|
|
171
224
|
/**
|
|
172
225
|
* Continuation and overflow sections a typical return leaves empty. The
|
|
173
226
|
* interface may collapse these; the data still transmits.
|
|
174
227
|
*/
|
|
175
228
|
secondary?: boolean;
|
|
176
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* A heading the page prints INSIDE a section, above the lines it governs.
|
|
232
|
+
*
|
|
233
|
+
* `FormSection` cannot hold this: a section is a titled box, and these are
|
|
234
|
+
* headings *within* one box. Inventing a section per heading is the wrong fix —
|
|
235
|
+
* it draws a boundary the page does not, and doing it on AT1 Schedule 18 had to
|
|
236
|
+
* be reverted (see the note on that file's `SECTIONS`).
|
|
237
|
+
*
|
|
238
|
+
* Lives here rather than beside the first schedule that needed it, because the
|
|
239
|
+
* second one proved it general. Two quite different pages print these:
|
|
240
|
+
*
|
|
241
|
+
* AT1 Schedule 18 one line of bold text over lines 077-079, naming the
|
|
242
|
+
* flow-through-share case the pair exists for — without it
|
|
243
|
+
* neither caption says WHICH property.
|
|
244
|
+
* AT1 Schedule 29 the grant calculation's own structure. "Part I calculation:
|
|
245
|
+
* Non-Associated and Associated at 8%", then "Part II
|
|
246
|
+
* calculation: ... at 12%" with "(a) Non-Associated" and
|
|
247
|
+
* "(b) Associated" beneath it. Lines 112 and 125 are two
|
|
248
|
+
* mutually exclusive formulas for the same credit, and these
|
|
249
|
+
* four headings are the only thing on the page that says so.
|
|
250
|
+
*
|
|
251
|
+
* Two headings may share an `aboveLine` — Schedule 29 stacks "Part II
|
|
252
|
+
* calculation" and "(a) Non-Associated" over line 112 — so a renderer prints
|
|
253
|
+
* every match, in array order.
|
|
254
|
+
*/
|
|
255
|
+
interface PrintedBlockHeading {
|
|
256
|
+
/** The printed line the heading stands immediately above. */
|
|
257
|
+
aboveLine: string;
|
|
258
|
+
/** Verbatim, including any trailing colon the page sets. */
|
|
259
|
+
text: string;
|
|
260
|
+
/**
|
|
261
|
+
* Which of `FormDefinition.footnotes` the page marks inside THIS text.
|
|
262
|
+
*
|
|
263
|
+
* A footnote's anchor is not always a numbered box. AT1 Schedule 1's Area A
|
|
264
|
+
* opens with a paragraph reading `the "base amount"* of $200,000`, and that
|
|
265
|
+
* asterisk is the only thing on the page pointing at the note which states
|
|
266
|
+
* the Alberta Small Business Threshold history. Without this the glyph has
|
|
267
|
+
* nowhere to be drawn, and the note renders at the foot of the box with
|
|
268
|
+
* nothing leading to it.
|
|
269
|
+
*/
|
|
270
|
+
footnoteMarks?: readonly number[];
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Where on the page a footnote is printed, and the glyph that marks it.
|
|
274
|
+
*
|
|
275
|
+
* `FormDefinition.footnotes` is a flat list, and a renderer given only that can
|
|
276
|
+
* do one thing with it: print all of them at the bottom. Most forms print them
|
|
277
|
+
* at the foot of the BOX they belong to, mid-page — AT1 Schedule 1 sets its
|
|
278
|
+
* partnership note directly under line 015, and its three Area A notes directly
|
|
279
|
+
* under the Area A table, a page away from each other.
|
|
280
|
+
*
|
|
281
|
+
* ── Why the glyph is data and not derivable ─────────────────────────────────
|
|
282
|
+
*
|
|
283
|
+
* Because the asterisk runs RESTART at every box. On AT1 Schedule 29 page 2 the
|
|
284
|
+
* expenditure-limit box runs "*" then "**" and the grant-calculation box below
|
|
285
|
+
* it starts over at "*" — so one footnote index is "*" and a later one is "*"
|
|
286
|
+
* again, meaning a leap-year rule and a Base Amount rule respectively. Nothing
|
|
287
|
+
* about a footnote's position in the array tells you that. Numbering them 1..n
|
|
288
|
+
* instead would be legible and would not be the page.
|
|
289
|
+
*
|
|
290
|
+
* `mark` is absent where the page anchors a note WITHOUT a glyph: Schedule 29
|
|
291
|
+
* page 3 prints a "Notes" block whose entries open with the line they govern
|
|
292
|
+
* ("Line 270: total must not exceed line 208"). Same relationship, no asterisk
|
|
293
|
+
* to print, and inventing one sends a reader hunting the page for it.
|
|
294
|
+
*
|
|
295
|
+
* A footnote with no placement entry is an unmarked instruction block — the
|
|
296
|
+
* header text a form prints above its first heading, which belongs at the foot
|
|
297
|
+
* of the rendering with nothing pointing at it.
|
|
298
|
+
*/
|
|
299
|
+
interface FormFootnotePlacement {
|
|
300
|
+
/** Index into {@link FormDefinition.footnotes}. */
|
|
301
|
+
footnote: number;
|
|
302
|
+
/** The {@link FormSection} id at whose foot the page prints it. */
|
|
303
|
+
section: string;
|
|
304
|
+
/** The glyph the page prints — `'*'`, `'**'`, `'***'`. */
|
|
305
|
+
mark?: string;
|
|
306
|
+
}
|
|
177
307
|
/** Where a definition came from, so a reader can check it against the original. */
|
|
178
308
|
interface FormProvenance {
|
|
179
309
|
/** Repository-relative path to the primary document. */
|
|
@@ -209,8 +339,22 @@ interface FormDefinition {
|
|
|
209
339
|
* `research/field-maps/*.md` doc where one exists — those are already
|
|
210
340
|
* verified against the live form and often name the trap, not just the
|
|
211
341
|
* rule — rather than re-transcribing the PDF from scratch.
|
|
342
|
+
*
|
|
343
|
+
* Order is load-bearing: {@link FormField.footnoteMarks} and
|
|
344
|
+
* {@link footnotePlacement} both index into this array by POSITION, so
|
|
345
|
+
* inserting one silently repoints every mark after it. Put the marked ones
|
|
346
|
+
* first, in page order, and say so in a comment beside the array.
|
|
212
347
|
*/
|
|
213
348
|
footnotes?: readonly string[];
|
|
349
|
+
/**
|
|
350
|
+
* Which box the page prints each footnote at the foot of, and with what
|
|
351
|
+
* glyph — see {@link FormFootnotePlacement}.
|
|
352
|
+
*
|
|
353
|
+
* Optional, and its absence means what it always meant: a renderer prints
|
|
354
|
+
* the whole list at the bottom. Supply it for any form whose notes are set
|
|
355
|
+
* mid-page, which is most of them.
|
|
356
|
+
*/
|
|
357
|
+
footnotePlacement?: readonly FormFootnotePlacement[];
|
|
214
358
|
}
|
|
215
359
|
/** Index a definition's fields by line number. */
|
|
216
360
|
declare function indexByLine(form: FormDefinition): ReadonlyMap<string, FormField>;
|
|
@@ -234,7 +378,120 @@ declare const AT4970: FormDefinition;
|
|
|
234
378
|
declare const AT4970_JURISDICTIONS: readonly ["alberta", "britishColumbia", "manitoba", "newBrunswick", "newfoundlandAndLabrador", "northwestTerritories", "novaScotia", "nunavut", "ontario", "princeEdwardIsland", "quebec", "saskatchewan", "yukon", "other"];
|
|
235
379
|
//#endregion
|
|
236
380
|
//#region src/t2/at1/forms/jacket.d.ts
|
|
381
|
+
/**
|
|
382
|
+
* Nine lines the RSI still carries and the printed AT1 no longer shows.
|
|
383
|
+
*
|
|
384
|
+
* Four are closed programmes (064, 071, 074, 081) and five are contact details
|
|
385
|
+
* the current form dropped (018-024 assessment address, 027 fax, 093 NOA fax).
|
|
386
|
+
* Every one keeps being emitted where the specification marks it mandatory —
|
|
387
|
+
* the RSI format stays stable across reassessment years — and every one needs
|
|
388
|
+
* a reader to know it is not on the page they are holding, which is what the
|
|
389
|
+
* notes below say.
|
|
390
|
+
*
|
|
391
|
+
* Stated here AND derivable from {@link PRINTED_ORDER} (a field absent from
|
|
392
|
+
* that list has no printed position), which is deliberate: a test asserts the
|
|
393
|
+
* two agree, so transcribing a line into the printed order without striking it
|
|
394
|
+
* from this list — or the reverse — fails rather than leaving the definition
|
|
395
|
+
* quietly self-contradictory.
|
|
396
|
+
*/
|
|
397
|
+
declare const AT1_JACKET_LINES_NOT_PRINTED: readonly string[];
|
|
398
|
+
/**
|
|
399
|
+
* The coded answers behind the printed tick boxes.
|
|
400
|
+
*
|
|
401
|
+
* Six of the jacket's fields are `kind: 'code'`, and a code field with no code
|
|
402
|
+
* list is unusable in both directions: an interface cannot offer the choices,
|
|
403
|
+
* and a reader given a filed "3" at line 051 cannot tell whether the
|
|
404
|
+
* corporation went bankrupt or amalgamated. The page prints every option with
|
|
405
|
+
* its number beside a tick box; nothing else in this package held them.
|
|
406
|
+
*
|
|
407
|
+
* 028 is `code` too and is NOT here: its value is a four-digit SIC code from a
|
|
408
|
+
* published classification of hundreds of entries, not a printed list of five.
|
|
409
|
+
*/
|
|
410
|
+
interface At1JacketCodeOption {
|
|
411
|
+
/** The digit the page prints beside the tick box, and the value transmitted. */
|
|
412
|
+
code: string;
|
|
413
|
+
/** The option's label, verbatim. */
|
|
414
|
+
label: string;
|
|
415
|
+
}
|
|
416
|
+
declare const AT1_JACKET_CODE_OPTIONS: Readonly<Record<string, readonly At1JacketCodeOption[]>>;
|
|
417
|
+
/**
|
|
418
|
+
* "Basic Alberta Tax Payable" — the six day counts, lettered (A) to (F).
|
|
419
|
+
*
|
|
420
|
+
* The page does not apply one rate to the year. It asks for the number of days
|
|
421
|
+
* the tax year spent in each of five rate bands, and then prorates. None of
|
|
422
|
+
* the six boxes has a line number, so no `FormField` can hold them, and
|
|
423
|
+
* without them line 068's caption — "Total (line G + line H + line I + line J
|
|
424
|
+
* + line K)" — names five letters defined nowhere.
|
|
425
|
+
*/
|
|
426
|
+
interface At1JacketDayBand {
|
|
427
|
+
/** The letter the page prints beside the box, parentheses included. */
|
|
428
|
+
letter: string;
|
|
429
|
+
/** The date range, verbatim. */
|
|
430
|
+
label: string;
|
|
431
|
+
}
|
|
432
|
+
declare const AT1_JACKET_DAY_BANDS: readonly At1JacketDayBand[];
|
|
433
|
+
/**
|
|
434
|
+
* The five prorated tax amounts, lettered (G) to (K), that total to line 068.
|
|
435
|
+
*
|
|
436
|
+
* `rate` is not on the page as a number — the page prints it inside the
|
|
437
|
+
* formula, as `.100` — and it is carried separately for one reason: it makes
|
|
438
|
+
* this table a CHECK on `AB_GENERAL_RATE_BANDS` rather than a second copy of
|
|
439
|
+
* it. A test asserts the five multipliers printed here are the five rates that
|
|
440
|
+
* module holds, in band order. That is the same arrangement as
|
|
441
|
+
* `AT1_SCHEDULE_1_RATE_PERIODS`, and it earned its keep there.
|
|
442
|
+
*/
|
|
443
|
+
interface At1JacketRateRow {
|
|
444
|
+
/** The letter the page prints beside the box, parentheses included. */
|
|
445
|
+
letter: string;
|
|
446
|
+
/** The arithmetic, verbatim, trailing "=" and capital X included. */
|
|
447
|
+
formula: string;
|
|
448
|
+
/** Which {@link AT1_JACKET_DAY_BANDS} letter the formula divides by (F). */
|
|
449
|
+
daysLetter: string;
|
|
450
|
+
/** The multiplier the formula states, as a number. */
|
|
451
|
+
rate: number;
|
|
452
|
+
}
|
|
453
|
+
declare const AT1_JACKET_RATE_ROWS: readonly At1JacketRateRow[];
|
|
454
|
+
/**
|
|
455
|
+
* The headings and instruction blocks the page prints INSIDE a box.
|
|
456
|
+
*
|
|
457
|
+
* Three of these carry routing a preparer cannot get from any caption. The two
|
|
458
|
+
* stacked over line 062 decide whether Schedule 12 is required at all and
|
|
459
|
+
* which federal lines 062 must equal; the paragraph over 101 is the
|
|
460
|
+
* certification itself, and it is the sentence the signature attests to.
|
|
461
|
+
*
|
|
462
|
+
* Two share `aboveLine: '062'` — the page sets the Schedule 12 warning, then
|
|
463
|
+
* the box heading, then the federal-equality instruction. A renderer prints
|
|
464
|
+
* every match, in array order.
|
|
465
|
+
*/
|
|
466
|
+
declare const AT1_JACKET_BLOCK_HEADINGS: readonly PrintedBlockHeading[];
|
|
237
467
|
declare const AT1_JACKET: FormDefinition;
|
|
468
|
+
/**
|
|
469
|
+
* The "For Department Use" box, and the one printed number this file does not
|
|
470
|
+
* model.
|
|
471
|
+
*
|
|
472
|
+
* Page 1 opens with a bordered box headed "For Department Use" holding three
|
|
473
|
+
* numbered fields — 001, 004 and 005 — and a pre-printed "01RT". Two of them
|
|
474
|
+
* are known: 005 is the Software Approval Code the specification tabulates,
|
|
475
|
+
* and 001 is the association answer four accepted certification samples file
|
|
476
|
+
* as the first value under Schedule 000.
|
|
477
|
+
*
|
|
478
|
+
* **004 is printed and is not here.** The specification's cross-reference
|
|
479
|
+
* tables (as extracted) have no row for it, no certification sample files it,
|
|
480
|
+
* and the page gives it no caption — the box heading is the only text near it.
|
|
481
|
+
* So there is nothing to transcribe: a field captioned "For Department Use"
|
|
482
|
+
* would be this codebase guessing, and the package's first rule is that a
|
|
483
|
+
* caption comes from the primary document or the line does not go in. A wrong
|
|
484
|
+
* line is worse than a missing one.
|
|
485
|
+
*
|
|
486
|
+
* Recorded here rather than left silent so the gap is findable. What would
|
|
487
|
+
* close it: a row for 000004 in §3.2.3.1, or a sample that files it.
|
|
488
|
+
*/
|
|
489
|
+
declare const AT1_JACKET_DEPARTMENT_USE: Readonly<{
|
|
490
|
+
heading: "For Department Use"; /** Printed beside 005, pre-filled on the form. */
|
|
491
|
+
preprinted: "01RT"; /** The three numbered boxes inside it, in printed order. */
|
|
492
|
+
lines: readonly string[]; /** The one with no caption anywhere, and therefore no field. */
|
|
493
|
+
unmodelled: readonly string[];
|
|
494
|
+
}>;
|
|
238
495
|
/** 000080001 — Alberta tax payable, before credits. */
|
|
239
496
|
declare const AT1_TAX_PAYABLE_LINE: string;
|
|
240
497
|
/** 000090001 — the balance, signed. Negative is an overpayment. */
|
|
@@ -249,6 +506,11 @@ declare const AT1_BALANCE_LINE: string;
|
|
|
249
506
|
* 088 = 129 + 082 + 085 + 086 + 115 + 087
|
|
250
507
|
* 090 = 080 − 088
|
|
251
508
|
*
|
|
509
|
+
* Both of those are now line 088's and line 090's own captions in this
|
|
510
|
+
* definition, verbatim, and a test asserts this array names the same six lines
|
|
511
|
+
* the 088 caption does — so the claim below is checked against the page
|
|
512
|
+
* instead of resting on this comment.
|
|
513
|
+
*
|
|
252
514
|
* The Net File specification (AT1-Chapter3 §3.2.3.1, line 090) instead says
|
|
253
515
|
* `000080 - (000081 + 000082 + 00085 + 000086 + 000087)` — which includes 081,
|
|
254
516
|
* the Alberta SR&ED tax credit, and omits BOTH 129 (Innovation Employment
|
|
@@ -272,21 +534,342 @@ declare const AT1_BALANCE_LINE: string;
|
|
|
272
534
|
* so a preparer sees the disagreement before transmitting rather than
|
|
273
535
|
* discovering it on assessment.
|
|
274
536
|
*
|
|
275
|
-
* 088
|
|
276
|
-
*
|
|
537
|
+
* 088 is in the form DEFINITION (it is printed, and page-2 arithmetic does not
|
|
538
|
+
* close without it) but is not filed and is not in this list: the RSI carries
|
|
539
|
+
* the parts and 090.
|
|
277
540
|
*/
|
|
278
541
|
declare const AT1_BALANCE_CREDIT_LINES: readonly string[];
|
|
542
|
+
/**
|
|
543
|
+
* What {@link AT1_BALANCE_CREDIT_LINES} would be under the specification's own
|
|
544
|
+
* line-090 rule. Kept so the review layer can compute both and report the
|
|
545
|
+
* difference rather than asserting one is right in silence.
|
|
546
|
+
*/
|
|
547
|
+
declare const AT1_BALANCE_CREDIT_LINES_PER_SPEC: readonly string[];
|
|
548
|
+
/**
|
|
549
|
+
* The deductions 080 subtracts, per the PRINTED AT1's line 079.
|
|
550
|
+
*
|
|
551
|
+
* Three lines, where §3.2.3.1's own 080 formula subtracts five: it adds 071
|
|
552
|
+
* and 074, both always nil and both absent from the printed page. The two
|
|
553
|
+
* therefore agree for every filable year, and `at1TaxPayableDeductions`
|
|
554
|
+
* deliberately follows the SPECIFICATION rather than this — a mandatory field
|
|
555
|
+
* must be output even when nil, and the filing layer reconciles against the
|
|
556
|
+
* formula TRA recomputes with. This exists so the printed subtotal can be
|
|
557
|
+
* rendered from the same data, and so the difference is stated once rather
|
|
558
|
+
* than rediscovered.
|
|
559
|
+
*/
|
|
560
|
+
declare const AT1_PRINTED_DEDUCTION_LINES: readonly string[];
|
|
279
561
|
//#endregion
|
|
280
562
|
//#region src/t2/at1/forms/schedule1.d.ts
|
|
563
|
+
/**
|
|
564
|
+
* One column of the "Calculation of the Alberta Small Business Deduction" table.
|
|
565
|
+
*
|
|
566
|
+
* The page numbers none of the seven — only the total at 031 below them — so
|
|
567
|
+
* they carry a letter and a heading and nothing else, the same arrangement as
|
|
568
|
+
* {@link AT1_SCHEDULE_4_COLUMNS} and {@link AT1_SCHEDULE_18_COLUMNS}.
|
|
569
|
+
*/
|
|
570
|
+
interface AlbertaSbdColumn {
|
|
571
|
+
column: 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G';
|
|
572
|
+
/** The heading printed beneath the letter, verbatim, arithmetic included. */
|
|
573
|
+
heading: string;
|
|
574
|
+
/** Which of `AT1_SCHEDULE_1.footnotes` the page marks against this column. */
|
|
575
|
+
footnoteMarks?: readonly number[];
|
|
576
|
+
}
|
|
577
|
+
declare const AT1_SCHEDULE_1_COLUMNS: readonly AlbertaSbdColumn[];
|
|
578
|
+
/**
|
|
579
|
+
* The six rate periods the table PRE-PRINTS, with their percentage and rate.
|
|
580
|
+
*
|
|
581
|
+
* These are not preparer input and not engine input — they are printed cell
|
|
582
|
+
* content on revision 2023-04, and a view that draws the table without them
|
|
583
|
+
* draws six blank rows. Transcribed here for that reason, and for no other: the
|
|
584
|
+
* engine does not read them (`at1-tax.ts` works from `AB_GENERAL_RATE_BANDS` and
|
|
585
|
+
* `SMALL_BUSINESS_RATE`, and derives the deduction as a residual — see line
|
|
586
|
+
* 031's note). A test cross-checks every `sbdRate` below against those two, so
|
|
587
|
+
* this table is a CHECK on the rate book rather than a second copy of it.
|
|
588
|
+
*
|
|
589
|
+
* ── The sixth band, and what it settles ─────────────────────────────────────
|
|
590
|
+
*
|
|
591
|
+
* There are six rows here and only five general-rate bands, because Alberta cut
|
|
592
|
+
* the general rate at 2015-07-01, 2019-07-01, 2020-01-01 and 2020-07-01 but cut
|
|
593
|
+
* the SMALL BUSINESS rate at 2017-01-01 — a date the general table has no
|
|
594
|
+
* reason to know about. Subtracting the two gives this column exactly:
|
|
595
|
+
*
|
|
596
|
+
* 2009-04-01 10% − 3% = 7% 2019-07-01 11% − 2% = 9%
|
|
597
|
+
* 2015-07-01 12% − 3% = 9% 2020-01-01 10% − 2% = 8%
|
|
598
|
+
* 2017-01-01 12% − 2% = 10% 2020-07-01 8% − 2% = 6%
|
|
599
|
+
*
|
|
600
|
+
* That is worth more than the table: `alberta-rates.ts` records
|
|
601
|
+
* SMALL_BUSINESS_RATE (2%) as a GAP, appearing "in NO vendored source" because
|
|
602
|
+
* the AT1 spec states no small-business rate at all. This page is a vendored
|
|
603
|
+
* primary source, and its column F pins the rate to 2% after 2016-12-31 and 3%
|
|
604
|
+
* before — see that module's own `@statutory-data` block, now updated.
|
|
605
|
+
*/
|
|
606
|
+
interface AlbertaSbdRatePeriod {
|
|
607
|
+
/** The period label printed in column A's row, verbatim. */
|
|
608
|
+
label: string;
|
|
609
|
+
/** Column B, verbatim — the same on every row of this revision. */
|
|
610
|
+
percentage: string;
|
|
611
|
+
/** Column F, as printed: a three-decimal rate. */
|
|
612
|
+
sbdRate: number;
|
|
613
|
+
}
|
|
614
|
+
declare const AT1_SCHEDULE_1_RATE_PERIODS: readonly AlbertaSbdRatePeriod[];
|
|
615
|
+
/** The row label the page prints beneath column A's six periods. */
|
|
616
|
+
declare const AT1_SCHEDULE_1_TOTAL_DAYS_LABEL = "Total Days in the Taxation Year:";
|
|
617
|
+
/**
|
|
618
|
+
* Area A's four printed columns.
|
|
619
|
+
*
|
|
620
|
+
* 044 was absent entirely — the percentage of the business limit, which the
|
|
621
|
+
* page's own `**` note says MUST equal the federal Schedule 23 split and which
|
|
622
|
+
* column 045 is computed from ("$200,000 X % in Col 044"). Without it the
|
|
623
|
+
* agreement table showed the allocated dollars with nothing saying where the
|
|
624
|
+
* split came from.
|
|
625
|
+
*/
|
|
626
|
+
interface SbdAgreementColumn {
|
|
627
|
+
line: string;
|
|
628
|
+
/** The heading printed above the column, verbatim. */
|
|
629
|
+
heading: string;
|
|
630
|
+
kind: 'text' | 'code' | 'rate' | 'money';
|
|
631
|
+
/** What the page prints in this column's cell of the "Totals:" row. */
|
|
632
|
+
total?: string;
|
|
633
|
+
}
|
|
634
|
+
declare const AT1_SCHEDULE_1_AGREEMENT_COLUMNS: readonly SbdAgreementColumn[];
|
|
635
|
+
/** The label the page prints on Area A's totals row. */
|
|
636
|
+
declare const AT1_SCHEDULE_1_AGREEMENT_TOTALS_LABEL = "Totals:";
|
|
637
|
+
/**
|
|
638
|
+
* AREA B — "Determination of the Value for Line 015".
|
|
639
|
+
*
|
|
640
|
+
* ── Why this is a companion export and not a section ────────────────────────
|
|
641
|
+
*
|
|
642
|
+
* Because none of it is numbered. Area B is a worksheet of ELEVEN lettered
|
|
643
|
+
* amounts, (a) through (k), and a `FormField` needs a line: under the
|
|
644
|
+
* `tra-line-item-id` scheme `validateFormDefinition` requires nine digits, and
|
|
645
|
+
* `(c)` is not a line number in any scheme. A `FormSection` is no use either —
|
|
646
|
+
* one with no fields is itself a validation error. So the page's own letters
|
|
647
|
+
* stay the identifiers, exactly as {@link AT1_SCHEDULE_2_FORMULAS} keeps its
|
|
648
|
+
* A/B/C/D column letters.
|
|
649
|
+
*
|
|
650
|
+
* ── Not modelling it was the same mistake twice ─────────────────────────────
|
|
651
|
+
*
|
|
652
|
+
* This module's doc comment said Area B was "numbered only (a)-(k), so none of
|
|
653
|
+
* it has a line to file against" and left it out. AT1 Schedule 2's doc comment
|
|
654
|
+
* already answers that, about its own Area B, in as many words: *"That is a
|
|
655
|
+
* reason not to COMPUTE them. It was not a reason to leave them out of the form
|
|
656
|
+
* definition, and treating the two as the same thing is why the schedule
|
|
657
|
+
* reached the interface looking like a four-line form."*
|
|
658
|
+
*
|
|
659
|
+
* A preparer with a short taxation year or an associated group over $10,000,000
|
|
660
|
+
* of taxable capital MUST work this cascade to get line 015, and line 015 feeds
|
|
661
|
+
* column C, which feeds the deduction. Leaving it out made the schedule look as
|
|
662
|
+
* though it ended at line 013 and 015 came from nowhere.
|
|
663
|
+
*
|
|
664
|
+
* ── The cascade has three exits, and that is the whole difficulty ───────────
|
|
665
|
+
*
|
|
666
|
+
* Area B is not a formula; it is a decision tree with three places a preparer
|
|
667
|
+
* may stop, and the page marks each in bold:
|
|
668
|
+
*
|
|
669
|
+
* (a) no adjustment required → enter (a)
|
|
670
|
+
* (b) short year, group under $10,000,000 → enter (b)
|
|
671
|
+
* (k) everything else → enter (j) or (k)
|
|
672
|
+
*
|
|
673
|
+
* Getting the exit wrong is how a return claims the wrong small business
|
|
674
|
+
* threshold, so `exitTo015` carries each instruction verbatim on the step it
|
|
675
|
+
* follows rather than being flattened into prose.
|
|
676
|
+
*
|
|
677
|
+
* ── Two printed collisions, both preserved ─────────────────────────────────
|
|
678
|
+
*
|
|
679
|
+
* The page labels TWO different amounts `(c)` — one for taxation years starting
|
|
680
|
+
* before 2022-04-07 and one for after, with different divisors ($11,250 vs
|
|
681
|
+
* $90,000). And it uses `(i)` for both a section number ("(i) Prorated Base
|
|
682
|
+
* Amount…") and, further down, an amount ("Business Limit the CCPC assigns per
|
|
683
|
+
* line 515 of the federal T2 divided by 2.5 … (i)"). Neither is a transcription
|
|
684
|
+
* error; de-duplicating either would make this stop matching the page.
|
|
685
|
+
*/
|
|
686
|
+
interface AlbertaBaseAmountStep {
|
|
687
|
+
/** The letter the page labels this amount with, in its own parentheses. */
|
|
688
|
+
letter: string;
|
|
689
|
+
/** The text printed to the left of the box, verbatim. */
|
|
690
|
+
label: string;
|
|
691
|
+
/** The arithmetic the page sets beside the label, where it sets any. */
|
|
692
|
+
formula?: string;
|
|
693
|
+
/** A sub-heading the page prints immediately above this step. */
|
|
694
|
+
heading?: string;
|
|
695
|
+
/**
|
|
696
|
+
* The bold instruction printed after this amount, naming it as a place the
|
|
697
|
+
* cascade may STOP and line 015 be taken from. Absent on intermediate steps.
|
|
698
|
+
*/
|
|
699
|
+
exitTo015?: string;
|
|
700
|
+
}
|
|
701
|
+
/** The heading the page gives this box. */
|
|
702
|
+
declare const AT1_SCHEDULE_1_AREA_B_TITLE = "Area B - Determination of the Value for Line 015";
|
|
703
|
+
/**
|
|
704
|
+
* What the page prints between the heading and the first amount: the rule, then
|
|
705
|
+
* the two adjustments by name. Both are conditions, and a preparer who reads
|
|
706
|
+
* only the worksheet below cannot tell whether either applies to them.
|
|
707
|
+
*/
|
|
708
|
+
declare const AT1_SCHEDULE_1_AREA_B_PREAMBLE: readonly string[];
|
|
709
|
+
declare const AT1_SCHEDULE_1_AREA_B_STEPS: readonly AlbertaBaseAmountStep[];
|
|
710
|
+
/**
|
|
711
|
+
* The "Large Corporations" block — what A and B mean in the two (c) formulas.
|
|
712
|
+
*
|
|
713
|
+
* Printed between the (c) amounts and the passive-income block, and without it
|
|
714
|
+
* the (c) rows read "Small business threshold A X B / $11,250" against two
|
|
715
|
+
* letters defined nowhere. B has three mutually exclusive cases turning on the
|
|
716
|
+
* association history across TWO years, which is the part a preparer is most
|
|
717
|
+
* likely to get wrong: cases 1 and 2 differ only in which year's taxable
|
|
718
|
+
* capital is used.
|
|
719
|
+
*/
|
|
720
|
+
declare const AT1_SCHEDULE_1_AREA_B_LARGE_CORPORATIONS: readonly string[];
|
|
721
|
+
/**
|
|
722
|
+
* The headings and instructions the page prints INSIDE a box.
|
|
723
|
+
*
|
|
724
|
+
* Six of them, and not one was here. Three carry real routing: "Corporations
|
|
725
|
+
* with permanent establishments only in Alberta, ignore lines 019, 020 and 021
|
|
726
|
+
* and go directly to the table below" is the difference between three boxes a
|
|
727
|
+
* preparer must fill and three they must skip, and nothing in 019/020/021's own
|
|
728
|
+
* captions says so.
|
|
729
|
+
*
|
|
730
|
+
* Two stack over line 041 — "Allocation Agreement:" then the $200,000
|
|
731
|
+
* paragraph, which is where the page's first "*" is anchored (on the words
|
|
732
|
+
* "base amount"). A renderer prints every match, in array order.
|
|
733
|
+
*/
|
|
734
|
+
declare const AT1_SCHEDULE_1_BLOCK_HEADINGS: readonly PrintedBlockHeading[];
|
|
281
735
|
declare const AT1_SCHEDULE_1: FormDefinition;
|
|
282
736
|
//#endregion
|
|
283
737
|
//#region src/t2/at1/forms/schedule2.d.ts
|
|
738
|
+
/**
|
|
739
|
+
* Column I — the Alberta Allocation Factor, one per formula.
|
|
740
|
+
*
|
|
741
|
+
* Every row on both pages has an I cell and NONE of them carries a line
|
|
742
|
+
* number: the `▪` marking a transmitted box is absent throughout that column.
|
|
743
|
+
* There is one factor per return whatever formula produced it, and it is filed
|
|
744
|
+
* once, on the jacket at 000065. A `FormField` per I cell would invent nine
|
|
745
|
+
* lines the form does not have.
|
|
746
|
+
*
|
|
747
|
+
* But the cell is still on the page, and a preparer reading the grid needs to
|
|
748
|
+
* see the arithmetic that turns their four inputs into the factor. So it is
|
|
749
|
+
* carried here instead — beside the `FormDefinition` rather than inside it,
|
|
750
|
+
* the same way {@link AT1_SCHEDULE_21_POOLS} and `AT1_SCHEDULE_13_COLUMNS`
|
|
751
|
+
* carry grid shapes that `FormField` has no room for.
|
|
752
|
+
*
|
|
753
|
+
* `factor` is the page's own notation, verbatim — "x 1/2", not "× ½".
|
|
754
|
+
*/
|
|
755
|
+
interface AlbertaAllocationFormula {
|
|
756
|
+
/** The matching `FormSection.id` on {@link AT1_SCHEDULE_2}. */
|
|
757
|
+
section: string;
|
|
758
|
+
/** The regulation the page names for this type of operation. */
|
|
759
|
+
regulation: string;
|
|
760
|
+
/** Column I as printed, in the page's own letters. */
|
|
761
|
+
factor: string;
|
|
762
|
+
/**
|
|
763
|
+
* Which field each letter in {@link factor} refers to, as the printed
|
|
764
|
+
* three-digit number.
|
|
765
|
+
*
|
|
766
|
+
* The page heads its columns A, B, C, D — but those letters appear nowhere
|
|
767
|
+
* except the column headings, and a consumer that lists the fields by line
|
|
768
|
+
* number (as every one of ours does) renders "(A/B + C/D) x 1/2" against
|
|
769
|
+
* rows labelled 002, 004, 006 and 008. The formula then names nothing the
|
|
770
|
+
* reader can see.
|
|
771
|
+
*
|
|
772
|
+
* So the letters stay — they are what the form prints — and this says what
|
|
773
|
+
* they stand for, leaving the substitution to whoever is displaying it.
|
|
774
|
+
*/
|
|
775
|
+
columns: Readonly<Record<string, string>>;
|
|
776
|
+
/** Extra wording the page prints under the factor, where it prints any. */
|
|
777
|
+
note?: string;
|
|
778
|
+
}
|
|
779
|
+
/** Where every factor goes, whichever formula produced it — printed above the I column on both pages. */
|
|
780
|
+
declare const AT1_SCHEDULE_2_FACTOR_DESTINATION: FormLineRef;
|
|
781
|
+
declare const AT1_SCHEDULE_2_FORMULAS: readonly AlbertaAllocationFormula[];
|
|
284
782
|
declare const AT1_SCHEDULE_2: FormDefinition;
|
|
285
783
|
//#endregion
|
|
286
784
|
//#region src/t2/at1/forms/schedule3.d.ts
|
|
785
|
+
/**
|
|
786
|
+
* One column of a carry-forward-by-year-of-origin table.
|
|
787
|
+
*
|
|
788
|
+
* Pages 2 and 3 carry three of these tables — one per credit — and none of it
|
|
789
|
+
* was modelled. `computeSchedule3`'s own doc comment explains why the ENGINE
|
|
790
|
+
* does not compute the ITC/CITC split (the spec gives no allocation rule, and
|
|
791
|
+
* every business rule on those lines reconciles back to aggregates it already
|
|
792
|
+
* produces), and that reasoning stands. It is not a reason to leave two printed
|
|
793
|
+
* pages out of a transcription of the form, which is the same mistake AT1
|
|
794
|
+
* Schedules 1 and 29 had to be corrected for.
|
|
795
|
+
*/
|
|
796
|
+
interface VintageColumn {
|
|
797
|
+
/** The printed line. Each row of the table is one OCCURRENCE of it. */
|
|
798
|
+
line: string;
|
|
799
|
+
/** The column heading, verbatim, including any arithmetic it states. */
|
|
800
|
+
heading: string;
|
|
801
|
+
kind: 'code' | 'date' | 'money';
|
|
802
|
+
role: 'input' | 'computed';
|
|
803
|
+
/**
|
|
804
|
+
* Year-of-origin indexes the page SHADES OUT for this column — 0 is
|
|
805
|
+
* "Current", 1 the 1st preceding taxation year, and so on.
|
|
806
|
+
*
|
|
807
|
+
* Half of what these tables say is which cells do not apply, and a flat
|
|
808
|
+
* field list cannot hold it. A shaded cell is not an empty one: the page is
|
|
809
|
+
* stating that the quantity does not exist for that vintage.
|
|
810
|
+
*/
|
|
811
|
+
shadedYears?: readonly number[];
|
|
812
|
+
/** True where the page prints a cell for this column in the "Totals:" row. */
|
|
813
|
+
totalled?: boolean;
|
|
814
|
+
/** Which of `AT1_SCHEDULE_3.footnotes` the page marks against this heading. */
|
|
815
|
+
footnoteMarks?: readonly number[];
|
|
816
|
+
}
|
|
817
|
+
interface VintageTable {
|
|
818
|
+
/** Matches the `FormSection` id its columns belong to. */
|
|
819
|
+
section: 'itc-vintage' | 'citc-vintage' | 'apitc-vintage';
|
|
820
|
+
/** The heading printed above the table, verbatim. */
|
|
821
|
+
title: string;
|
|
822
|
+
/**
|
|
823
|
+
* The highest preceding-year row the table prints.
|
|
824
|
+
*
|
|
825
|
+
* FOUR for the Investor Tax Credit and TEN for the other two — the ITC
|
|
826
|
+
* carries forward five years including the current one, the CITC and APITC
|
|
827
|
+
* eleven. Rendering all three at the same depth would invent five ITC
|
|
828
|
+
* vintages the form has no rows for.
|
|
829
|
+
*/
|
|
830
|
+
maxPrecedingYear: number;
|
|
831
|
+
columns: readonly VintageColumn[];
|
|
832
|
+
}
|
|
833
|
+
declare const AT1_SCHEDULE_3_VINTAGE_TABLES: readonly VintageTable[];
|
|
834
|
+
/** The label the page prints on each table's totals row. */
|
|
835
|
+
declare const AT1_SCHEDULE_3_VINTAGE_TOTALS_LABEL = "Totals:";
|
|
836
|
+
/**
|
|
837
|
+
* The row label for one year-of-origin index, as the page prints it.
|
|
838
|
+
*
|
|
839
|
+
* "Current", then "1st preceding taxation year" upward. The page sets the
|
|
840
|
+
* ordinal and the words "preceding taxation year" on separate lines; joined
|
|
841
|
+
* here, since nothing downstream can reproduce a two-line table cell.
|
|
842
|
+
*/
|
|
843
|
+
declare function albertaVintageRowLabel(yearIndex: number): string;
|
|
287
844
|
declare const AT1_SCHEDULE_3: FormDefinition;
|
|
288
845
|
//#endregion
|
|
289
846
|
//#region src/t2/at1/forms/schedule4.d.ts
|
|
847
|
+
/**
|
|
848
|
+
* The eight printed columns, A-H.
|
|
849
|
+
*
|
|
850
|
+
* THREE of them have no line number — C, D and G — and they are the whole
|
|
851
|
+
* derivation: C is the Alberta allocation factor, D prorates the income by it
|
|
852
|
+
* and by the jacket's own 068/066 ratio, and G nets the foreign tax against
|
|
853
|
+
* the federal credit and scales it the same way. H is then the lesser of D and
|
|
854
|
+
* G. Modelling only the five numbered boxes leaves the form showing an
|
|
855
|
+
* "Allowable Credit" with nothing behind it, which is how this definition
|
|
856
|
+
* stood: a reader could see 002/004/006/008/012 and not one of the three
|
|
857
|
+
* quantities that turns them into 012.
|
|
858
|
+
*
|
|
859
|
+
* `FormField` cannot hold an unnumbered column, so they live here — the same
|
|
860
|
+
* arrangement as `AT1_SCHEDULE_18_COLUMNS` and `AT1_SCHEDULE_2_FORMULAS`.
|
|
861
|
+
* Headings are the page's own, including its capital "X" for multiplication.
|
|
862
|
+
*/
|
|
863
|
+
interface ForeignCreditColumn {
|
|
864
|
+
column: 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H';
|
|
865
|
+
/** The heading printed beneath the letter, verbatim. */
|
|
866
|
+
heading: string;
|
|
867
|
+
/** The printed line — absent on C, D and G, which the page does not number. */
|
|
868
|
+
line?: string;
|
|
869
|
+
/** Which of `AT1_SCHEDULE_4.footnotes` the page marks against this column. */
|
|
870
|
+
footnoteMarks?: readonly number[];
|
|
871
|
+
}
|
|
872
|
+
declare const AT1_SCHEDULE_4_COLUMNS: readonly ForeignCreditColumn[];
|
|
290
873
|
declare const AT1_SCHEDULE_4: FormDefinition;
|
|
291
874
|
//#endregion
|
|
292
875
|
//#region src/t2/at1/forms/schedule10.d.ts
|
|
@@ -313,6 +896,38 @@ interface AlbertaReconcilingPair {
|
|
|
313
896
|
*/
|
|
314
897
|
emitOnlyWhenDifferent: boolean;
|
|
315
898
|
note?: string;
|
|
899
|
+
/**
|
|
900
|
+
* What the form prints in small type ABOVE each box — where that figure is
|
|
901
|
+
* to be taken from. Verbatim, including the page's own spacing quirks
|
|
902
|
+
* (`'Schedule 15 lines 007 + 019 +031'`) and its arithmetic.
|
|
903
|
+
*
|
|
904
|
+
* This is the only place the page says where a reconciling amount comes
|
|
905
|
+
* from, and it was not recorded anywhere: every pair reached the interface
|
|
906
|
+
* with a bare box, so a preparer had no way to know that line 004 is
|
|
907
|
+
* Schedule 13 line 027 without going back to the paper form.
|
|
908
|
+
*
|
|
909
|
+
* Not every source names a single line — several are sums
|
|
910
|
+
* (`'Schedule 15 lines 061 + 081'`), one is conditional
|
|
911
|
+
* (`'Schedule 16 line 016 OR line 20'`), one carries a multiplier
|
|
912
|
+
* (`'Schedule 21 line 061 x Inclusion Rate'`), and two are four-part
|
|
913
|
+
* composites. A string states all of them exactly; {@link federalFrom} /
|
|
914
|
+
* {@link albertaFrom} add the machine-readable link for the subset that
|
|
915
|
+
* does name exactly one line. Absent where the form prints nothing — the
|
|
916
|
+
* four farming-inventory rows have no Alberta source.
|
|
917
|
+
*/
|
|
918
|
+
federalSource?: string;
|
|
919
|
+
albertaSource?: string;
|
|
920
|
+
/**
|
|
921
|
+
* The structured half of {@link federalSource} / {@link albertaSource},
|
|
922
|
+
* set ONLY where the printed text names exactly one line. The registry
|
|
923
|
+
* checks these against the target form, so a renumbered line fails the
|
|
924
|
+
* suite instead of shipping a citation that points nowhere — which a
|
|
925
|
+
* string alone cannot give us. Deliberately omitted for the sums and
|
|
926
|
+
* conditionals rather than picking one line out of them and implying the
|
|
927
|
+
* others do not matter.
|
|
928
|
+
*/
|
|
929
|
+
federalFrom?: FormLineRef;
|
|
930
|
+
albertaFrom?: FormLineRef;
|
|
316
931
|
}
|
|
317
932
|
declare const AT1_SCHEDULE_12_PAIRS: readonly AlbertaReconcilingPair[];
|
|
318
933
|
declare const AT1_SCHEDULE_12: FormDefinition;
|
|
@@ -353,7 +968,192 @@ declare const AT1_SCHEDULE_13_COLUMNS: readonly AlbertaCcaColumn[];
|
|
|
353
968
|
declare const AT1_SCHEDULE_13: FormDefinition;
|
|
354
969
|
//#endregion
|
|
355
970
|
//#region src/t2/at1/forms/schedule15.d.ts
|
|
971
|
+
/**
|
|
972
|
+
* One labelled row of a two-column continuity table.
|
|
973
|
+
*
|
|
974
|
+
* `regular` and `successor` are each absent in two distinct cases the renderer
|
|
975
|
+
* must tell apart, which is what {@link shaded} exists for: the page either
|
|
976
|
+
* SHADES the cell out (the quantity does not exist on that side) or prints an
|
|
977
|
+
* open box with no number beside it (the "Amount Available" rows). Both look
|
|
978
|
+
* like "no line" in the data and mean opposite things on paper.
|
|
979
|
+
*/
|
|
980
|
+
interface ResourceContinuityRow {
|
|
981
|
+
/** The row label, verbatim, as the page prints it once for both columns. */
|
|
982
|
+
label: string;
|
|
983
|
+
/** The printed line in the Regular Expenses column. */
|
|
984
|
+
regular?: string;
|
|
985
|
+
/** The printed line in the Successor Expenses column. */
|
|
986
|
+
successor?: string;
|
|
987
|
+
/**
|
|
988
|
+
* Which columns the page SHADES OUT on this row — the quantity does not
|
|
989
|
+
* exist for that side. Distinct from a cell that is simply unnumbered.
|
|
990
|
+
*/
|
|
991
|
+
shaded?: readonly ('regular' | 'successor')[];
|
|
992
|
+
/**
|
|
993
|
+
* The page prints an open box in both columns and numbers neither — the
|
|
994
|
+
* "Amount Available" subtotal rows. Where each area anchors its
|
|
995
|
+
* negative-balance footnote, so it is load-bearing rather than decorative.
|
|
996
|
+
*/
|
|
997
|
+
unnumbered?: boolean;
|
|
998
|
+
/**
|
|
999
|
+
* The page prints this row in a BOX OF ITS OWN, below the area's footnotes,
|
|
1000
|
+
* repeating the two column headings above it.
|
|
1001
|
+
*
|
|
1002
|
+
* One row on the whole schedule does this: "Foreign-source resource income"
|
|
1003
|
+
* (231 / 233) under Area F. It is not a continuity row — it neither adds to
|
|
1004
|
+
* nor deducts from the pool — it is the income figure that CAPS the Area F
|
|
1005
|
+
* claim, which is why the page sets it apart. Modelled as a row of Area F
|
|
1006
|
+
* rather than an area of its own because the page gives that box no heading,
|
|
1007
|
+
* and inventing one would be this codebase's words on a form definition.
|
|
1008
|
+
*/
|
|
1009
|
+
separateBox?: boolean;
|
|
1010
|
+
/** Which of `AT1_SCHEDULE_15.footnotes` the page marks against this row. */
|
|
1011
|
+
footnoteMarks?: readonly number[];
|
|
1012
|
+
}
|
|
1013
|
+
/** One of the page's lettered AREA boxes. */
|
|
1014
|
+
interface ResourceContinuityArea {
|
|
1015
|
+
/** Matches the {@link FormSection} id its lines belong to. */
|
|
1016
|
+
section: string;
|
|
1017
|
+
/** The box heading, verbatim — 'AREA A - CONTINUITY OF EARNED DEPLETION BASE'. */
|
|
1018
|
+
title: string;
|
|
1019
|
+
/**
|
|
1020
|
+
* The line the page prints immediately under the box heading, verbatim.
|
|
1021
|
+
*
|
|
1022
|
+
* Area F's is routing, not description: "Foreign exploration and development
|
|
1023
|
+
* expenses are those that are not in respect of a country. If they are in
|
|
1024
|
+
* respect of a country, complete AREA G or H." A preparer who fills in Area
|
|
1025
|
+
* F for country-specific expenses has completed the wrong box, and nothing
|
|
1026
|
+
* in any caption says so.
|
|
1027
|
+
*/
|
|
1028
|
+
subtitle?: string;
|
|
1029
|
+
/**
|
|
1030
|
+
* The two column headings, verbatim. **Absent on Area B**, which prints one
|
|
1031
|
+
* unheaded column — it has no successor side at all, and heading it
|
|
1032
|
+
* "Regular Expenses ($)" would invent a distinction the page does not draw.
|
|
1033
|
+
*/
|
|
1034
|
+
columnHeadings?: readonly [string, string];
|
|
1035
|
+
rows: readonly ResourceContinuityRow[];
|
|
1036
|
+
/**
|
|
1037
|
+
* The bold instruction the page prints under the table, verbatim.
|
|
1038
|
+
*
|
|
1039
|
+
* Not a footnote and not a caption: it states the arithmetic that carries
|
|
1040
|
+
* the area's claim to AT1 Schedule 12, and AT1 Schedule 12's own definition
|
|
1041
|
+
* records the mirror of it in `albertaSource`. A test asserts the two agree,
|
|
1042
|
+
* so these strings are checked against a second page rather than trusted.
|
|
1043
|
+
*/
|
|
1044
|
+
carryForward?: string;
|
|
1045
|
+
/**
|
|
1046
|
+
* The same instruction as structured data — the claim lines it names, and
|
|
1047
|
+
* the AT1 Schedule 12 line they total to.
|
|
1048
|
+
*
|
|
1049
|
+
* Stated rather than parsed out of {@link carryForward}: "Total lines 007 +
|
|
1050
|
+
* 019 + 031 and carry this amount forward to Schedule 12, line 022" holds
|
|
1051
|
+
* four three-digit numbers and only three of them are claims. A regex over
|
|
1052
|
+
* the printed sentence would have to know which, which is the knowledge
|
|
1053
|
+
* this field exists to hold. A test asserts every line named here appears in
|
|
1054
|
+
* the printed text, so the two cannot drift apart.
|
|
1055
|
+
*/
|
|
1056
|
+
carryForwardTo?: {
|
|
1057
|
+
line: string;
|
|
1058
|
+
claims: readonly string[];
|
|
1059
|
+
};
|
|
1060
|
+
}
|
|
1061
|
+
/**
|
|
1062
|
+
* One column of a per-country table.
|
|
1063
|
+
*
|
|
1064
|
+
* Pages 5 and 6 are a different shape from every area before them. Areas A-F
|
|
1065
|
+
* are labelled ROWS with two columns; these are labelled COLUMNS with one row
|
|
1066
|
+
* per COUNTRY, so a printed line is a column and each row is one occurrence of
|
|
1067
|
+
* it — the same arrangement as {@link AT1_SCHEDULE_3_VINTAGE_TABLES}, where
|
|
1068
|
+
* the rows are years rather than countries.
|
|
1069
|
+
*
|
|
1070
|
+
* The page heads each column with a LETTER, and those letters are the only
|
|
1071
|
+
* vocabulary its footnotes and its own arithmetic have: "Amount available
|
|
1072
|
+
* (A+B+C-D)", "If an amount in column E is negative…", "the greater of the
|
|
1073
|
+
* total of all amounts in column H and 10% of the total of all amounts
|
|
1074
|
+
* available in column E". Drop the letters and none of that text resolves.
|
|
1075
|
+
*/
|
|
1076
|
+
interface PerCountryColumn {
|
|
1077
|
+
/** The letter the page heads this column with. Absent on the country stub. */
|
|
1078
|
+
letter?: string;
|
|
1079
|
+
/** The heading, verbatim, including any arithmetic it states. */
|
|
1080
|
+
heading: string;
|
|
1081
|
+
/**
|
|
1082
|
+
* The printed line. **Absent on the four "Amount available" columns** (E, N,
|
|
1083
|
+
* FF, OO), which the page computes and numbers nowhere — and which are
|
|
1084
|
+
* exactly the columns its negative-balance footnotes are about.
|
|
1085
|
+
*/
|
|
1086
|
+
line?: string;
|
|
1087
|
+
kind: 'code' | 'money';
|
|
1088
|
+
role: 'input' | 'computed';
|
|
1089
|
+
footnoteMarks?: readonly number[];
|
|
1090
|
+
}
|
|
1091
|
+
/** The regular or successor half of one per-country area. */
|
|
1092
|
+
interface PerCountryTable {
|
|
1093
|
+
/** The page's own sub-heading — 'Regular Expenses' / 'Successor Expenses'. */
|
|
1094
|
+
title: string;
|
|
1095
|
+
columns: readonly PerCountryColumn[];
|
|
1096
|
+
/**
|
|
1097
|
+
* The grand total the page prints under the table: a box with a LETTER and
|
|
1098
|
+
* no line number, totalling the claim column across every country.
|
|
1099
|
+
*
|
|
1100
|
+
* These four — I, R, JJ and SS — are named in the schedule's closing
|
|
1101
|
+
* instruction ("Enter the total of lines 209, 221, I, R, JJ, and SS at line
|
|
1102
|
+
* 030 of Schedule 12") alongside two real line numbers. Four of the six
|
|
1103
|
+
* terms that reach AT1 Schedule 12 line 030 are therefore letters, which is
|
|
1104
|
+
* why {@link AT1_SCHEDULE_15_CLOSING_INSTRUCTION} keeps them apart from the
|
|
1105
|
+
* lines rather than pretending they are lines.
|
|
1106
|
+
*/
|
|
1107
|
+
grandTotal: {
|
|
1108
|
+
letter: string;
|
|
1109
|
+
ofColumn: string;
|
|
1110
|
+
};
|
|
1111
|
+
}
|
|
1112
|
+
/** One of the two per-country areas, each with a regular and a successor table. */
|
|
1113
|
+
interface PerCountryArea {
|
|
1114
|
+
/** Matches the {@link FormSection} id its lines belong to. */
|
|
1115
|
+
section: string;
|
|
1116
|
+
/** The box heading, verbatim. */
|
|
1117
|
+
title: string;
|
|
1118
|
+
/** The paragraph the page prints under the heading, verbatim. */
|
|
1119
|
+
subtitle: string;
|
|
1120
|
+
tables: readonly PerCountryTable[];
|
|
1121
|
+
}
|
|
1122
|
+
declare const AT1_SCHEDULE_15_PER_COUNTRY: readonly PerCountryArea[];
|
|
1123
|
+
/**
|
|
1124
|
+
* The instruction the page closes with, verbatim.
|
|
1125
|
+
*
|
|
1126
|
+
* It belongs to no area: it is printed in bold at the foot of page 6, below
|
|
1127
|
+
* Area H, and it totals Area F's two claims with the four per-country grand
|
|
1128
|
+
* totals. Four of its six terms are LETTERS — I, R, JJ and SS — boxes the page
|
|
1129
|
+
* numbers nowhere, which is why `lines` and `letters` are separate fields
|
|
1130
|
+
* rather than one list of "terms". A caller that treated the letters as line
|
|
1131
|
+
* numbers would look for 015I00001.
|
|
1132
|
+
*
|
|
1133
|
+
* AT1 Schedule 12's own definition records the mirror from its side, on its
|
|
1134
|
+
* line 030: `albertaSource: 'Schedule 15 lines 209 +221 + I + R + JJ + SS'`.
|
|
1135
|
+
* A test asserts the two pages agree.
|
|
1136
|
+
*/
|
|
1137
|
+
declare const AT1_SCHEDULE_15_CLOSING_INSTRUCTION: Readonly<{
|
|
1138
|
+
text: "Enter the total of lines 209, 221, I, R, JJ, and SS at line 030 of Schedule 12."; /** AT1 Schedule 12's line, as `SSSFFFOOO`. */
|
|
1139
|
+
to: "012030001"; /** The two real line numbers it names. */
|
|
1140
|
+
lines: readonly string[]; /** The four unnumbered grand totals it names, by printed letter. */
|
|
1141
|
+
letters: readonly string[];
|
|
1142
|
+
}>;
|
|
1143
|
+
declare const AT1_SCHEDULE_15_AREAS: readonly ResourceContinuityArea[];
|
|
356
1144
|
declare const AT1_SCHEDULE_15: FormDefinition;
|
|
1145
|
+
/**
|
|
1146
|
+
* The claim lines each carry-forward instruction names, by AT1 Schedule 12
|
|
1147
|
+
* destination.
|
|
1148
|
+
*
|
|
1149
|
+
* Derived from the areas, so there is one declaration of it. Exists as its own
|
|
1150
|
+
* export because AT1 Schedule 12's definition records the MIRROR of the same
|
|
1151
|
+
* fact in `albertaSource` — its line 022 reads `Schedule 15 lines 007 + 019
|
|
1152
|
+
* +031`, transcribed from Schedule 12's own page, spurious missing space and
|
|
1153
|
+
* all. A test asserts the two pages name the same lines, which is what makes
|
|
1154
|
+
* either one worth trusting.
|
|
1155
|
+
*/
|
|
1156
|
+
declare const AT1_SCHEDULE_15_CARRY_FORWARD: Readonly<Record<string, readonly string[]>>;
|
|
357
1157
|
//#endregion
|
|
358
1158
|
//#region src/t2/at1/forms/schedule16.d.ts
|
|
359
1159
|
declare const AT1_SCHEDULE_16: FormDefinition;
|
|
@@ -389,18 +1189,189 @@ declare const AT1_SCHEDULE_17: FormDefinition;
|
|
|
389
1189
|
/** One category of disposed property, and its four columns. */
|
|
390
1190
|
interface DispositionCategory {
|
|
391
1191
|
label: string;
|
|
1192
|
+
/**
|
|
1193
|
+
* Which of the page's TWO grids prints this row.
|
|
1194
|
+
*
|
|
1195
|
+
* The form does not lay the six categories out as one table. Shares get a
|
|
1196
|
+
* grid of their own, and between the two grids sit lines 053 and 054 — see
|
|
1197
|
+
* {@link AT1_SCHEDULE_18_GRIDS}.
|
|
1198
|
+
*/
|
|
1199
|
+
grid: 'shares' | 'properties';
|
|
392
1200
|
/** A — proceeds of disposition. */
|
|
393
1201
|
proceeds: string;
|
|
394
1202
|
/** B — adjusted cost base. */
|
|
395
1203
|
adjustedCostBase: string;
|
|
396
1204
|
/** C — outlays and expenses. */
|
|
397
1205
|
outlays: string;
|
|
398
|
-
/**
|
|
399
|
-
|
|
1206
|
+
/**
|
|
1207
|
+
* D — the resulting gain or loss, where the grid numbers that cell.
|
|
1208
|
+
*
|
|
1209
|
+
* ABSENT on shares, and that absence is the point: the shares grid leaves
|
|
1210
|
+
* its column D **unnumbered**. The shares gain is not filed from inside the
|
|
1211
|
+
* grid — it is struck below it at line 054, *after* line 053 has added
|
|
1212
|
+
* federal Schedule 6 line 160 into it. Treating 054 as the shares row's
|
|
1213
|
+
* column D drops 053 from the return entirely.
|
|
1214
|
+
*/
|
|
1215
|
+
gainOrLoss?: string;
|
|
400
1216
|
/** Losses on this category are not deductible against ordinary gains. */
|
|
401
1217
|
lossRestricted?: boolean;
|
|
1218
|
+
/**
|
|
1219
|
+
* Which of `AT1_SCHEDULE_18.footnotes` the page marks against this ROW.
|
|
1220
|
+
*
|
|
1221
|
+
* The page prints the mark once, on the row's description cell — this model
|
|
1222
|
+
* has no field for a description, so every cell of the row carries it, the
|
|
1223
|
+
* same reasoning as {@link DispositionCategory.restrictionNote} below.
|
|
1224
|
+
*/
|
|
1225
|
+
footnoteMarks?: readonly number[];
|
|
1226
|
+
/**
|
|
1227
|
+
* Why this category's losses are restricted, in its own terms — carried on
|
|
1228
|
+
* every one of its four columns, because the rule governs the whole row.
|
|
1229
|
+
*
|
|
1230
|
+
* The two restricted categories are restricted for DIFFERENT reasons, and a
|
|
1231
|
+
* shared "losses are not deductible" flattens them: a personal-use loss is
|
|
1232
|
+
* simply denied, while a listed personal property loss is deductible — but
|
|
1233
|
+
* only against listed personal property gains, which is why line 060 exists
|
|
1234
|
+
* to apply it and why it has its own cap. One sentence for both said
|
|
1235
|
+
* neither.
|
|
1236
|
+
*/
|
|
1237
|
+
restrictionNote?: string;
|
|
402
1238
|
}
|
|
403
1239
|
declare const AT1_SCHEDULE_18_CATEGORIES: readonly DispositionCategory[];
|
|
1240
|
+
/**
|
|
1241
|
+
* The four printed columns, and the prefix §3.2.3.19 puts on each column's own
|
|
1242
|
+
* Line Name — "Adjusted cost base: Total of all shares", not "Shares — B".
|
|
1243
|
+
* Column A carries no prefix at all in the spec, which is why its entry is empty.
|
|
1244
|
+
*
|
|
1245
|
+
* The personal-use and listed-personal-property rows word column D as "Gain:"
|
|
1246
|
+
* rather than "Gain or (loss):", because a loss on those categories is not
|
|
1247
|
+
* deductible — the page says so twice ("Report gain only", "Note: losses are not
|
|
1248
|
+
* deductible"), and 018058's own rule is "if amount is negative, default to
|
|
1249
|
+
* zero". See `gainColumnPrefix` below.
|
|
1250
|
+
*/
|
|
1251
|
+
/**
|
|
1252
|
+
* The four columns the grid is laid out in, with the letter the page heads
|
|
1253
|
+
* each one with and the heading it prints under that letter.
|
|
1254
|
+
*
|
|
1255
|
+
* Kept BESIDE the captions rather than folded into them. The captions above
|
|
1256
|
+
* are §3.2.3.19's transmittal Line Names verbatim — which is why column A's
|
|
1257
|
+
* prefix is empty, that column having no prefix in the spec — and a renderer
|
|
1258
|
+
* that wants "A" has no business rewriting a filed Line Name to get it. It
|
|
1259
|
+
* reads this instead, the same arrangement as
|
|
1260
|
+
* {@link AT1_SCHEDULE_2_FORMULAS} and `AT1_SCHEDULE_13_COLUMNS`.
|
|
1261
|
+
*
|
|
1262
|
+
* The headings are the grid's own, read off the XFA template — the page heads
|
|
1263
|
+
* each column with its letter on one line and the heading beneath it, which is
|
|
1264
|
+
* why they are two values here and not one string. Note the capital E in
|
|
1265
|
+
* "Outlays and Expenses": the grid capitalises it, the ABIL part below does
|
|
1266
|
+
* not, and both are reproduced as printed rather than normalised to each other.
|
|
1267
|
+
*
|
|
1268
|
+
* The ABIL table stacks its letters the same way — see
|
|
1269
|
+
* {@link AT1_SCHEDULE_18_ABIL_COLUMNS}, and the correction recorded there.
|
|
1270
|
+
*/
|
|
1271
|
+
interface DispositionColumn {
|
|
1272
|
+
column: 'A' | 'B' | 'C' | 'D';
|
|
1273
|
+
heading: string;
|
|
1274
|
+
/** Which {@link DispositionCategory} key holds this column's line. */
|
|
1275
|
+
key: 'proceeds' | 'adjustedCostBase' | 'outlays' | 'gainOrLoss';
|
|
1276
|
+
}
|
|
1277
|
+
declare const AT1_SCHEDULE_18_COLUMNS: readonly DispositionColumn[];
|
|
1278
|
+
/**
|
|
1279
|
+
* The page's two grids, and the only thing that differs between them.
|
|
1280
|
+
*
|
|
1281
|
+
* Columns A, B and C are headed identically in both. Column D is not: the
|
|
1282
|
+
* shares grid heads it with the arithmetic alone, the properties grid puts
|
|
1283
|
+
* "Gain or (loss)" above the same arithmetic. A renderer that draws one table
|
|
1284
|
+
* for all six categories prints one of those two headings over the other
|
|
1285
|
+
* grid's rows.
|
|
1286
|
+
*
|
|
1287
|
+
* The rows themselves come from {@link AT1_SCHEDULE_18_CATEGORIES}, filtered
|
|
1288
|
+
* on `grid` — kept there rather than nested here so the six categories stay
|
|
1289
|
+
* one list in one order, which is how every consumer but the paper view reads
|
|
1290
|
+
* them.
|
|
1291
|
+
*/
|
|
1292
|
+
interface DispositionGridSpec {
|
|
1293
|
+
id: DispositionCategory['grid'];
|
|
1294
|
+
/** Column D's heading on this grid, verbatim. */
|
|
1295
|
+
gainHeading: string;
|
|
1296
|
+
}
|
|
1297
|
+
declare const AT1_SCHEDULE_18_GRIDS: readonly DispositionGridSpec[];
|
|
1298
|
+
/**
|
|
1299
|
+
* The ABIL table's printed columns.
|
|
1300
|
+
*
|
|
1301
|
+
* Unlike the two grids on page 1, this one REPEATS: one row per small business
|
|
1302
|
+
* corporation, so 082-092 each carry an occurrence and column D is struck per
|
|
1303
|
+
* row. The page numbers column D nowhere and totals it in a row captioned only
|
|
1304
|
+
* "Totals:", whose total is what line 094 applies the inclusion rate to.
|
|
1305
|
+
*
|
|
1306
|
+
* ── The letters are column headings here too ────────────────────────────────
|
|
1307
|
+
*
|
|
1308
|
+
* A comment in this file used to say the ABIL part "genuinely prints its column
|
|
1309
|
+
* letters in the caption — 088 reads 'A - Proceeds of disposition' on the
|
|
1310
|
+
* page". The XFA template says otherwise: A/B/C/D sit at y=85 and the headings
|
|
1311
|
+
* at y=94-115, stacked in the column exactly as page 1 stacks them. So the
|
|
1312
|
+
* `A - ` on those captions is §3.2.3.19's transmittal Line Name, not the page,
|
|
1313
|
+
* and a view that wants to LOOK like the form reads the letters from here —
|
|
1314
|
+
* the same arrangement as {@link AT1_SCHEDULE_18_COLUMNS}. The captions are
|
|
1315
|
+
* left as the spec writes them; only the claim about where they come from was
|
|
1316
|
+
* wrong.
|
|
1317
|
+
*
|
|
1318
|
+
* Note the bracketing on column D: this part prints "Cols. A - (B + C)" where
|
|
1319
|
+
* the dispositions grid prints "Col. A - (Cols. B + C)". Same arithmetic, two
|
|
1320
|
+
* printings, both verbatim.
|
|
1321
|
+
*/
|
|
1322
|
+
interface AbilColumn {
|
|
1323
|
+
/** The letter the page heads this column with, where it heads one at all. */
|
|
1324
|
+
column?: 'A' | 'B' | 'C' | 'D';
|
|
1325
|
+
/** The heading printed beneath that letter, verbatim. */
|
|
1326
|
+
heading: string;
|
|
1327
|
+
/** The printed line — absent on column D, which the page does not number. */
|
|
1328
|
+
line?: string;
|
|
1329
|
+
}
|
|
1330
|
+
declare const AT1_SCHEDULE_18_ABIL_COLUMNS: readonly AbilColumn[];
|
|
1331
|
+
/** The label the page prints on the row that totals the ABIL column D. */
|
|
1332
|
+
declare const AT1_SCHEDULE_18_ABIL_TOTALS_LABEL = "Totals:";
|
|
1333
|
+
/**
|
|
1334
|
+
* The one heading this page prints inside a section.
|
|
1335
|
+
*
|
|
1336
|
+
* The dispositions block has exactly one printed heading of its own —
|
|
1337
|
+
* "CAPITAL PROPERTY DISPOSITIONS" — and the tail of the page runs on beneath it
|
|
1338
|
+
* without a second one, which is why an earlier attempt to invent an
|
|
1339
|
+
* "Adjustments to the total gain" section was reverted (see the note on
|
|
1340
|
+
* SECTIONS). But the page DOES set one line of bold text mid-block, over lines
|
|
1341
|
+
* 077-079, and it is not a heading a reader can do without: 077 and 078 are
|
|
1342
|
+
* captioned "Add: Exemption threshold at time of disposal" and "Add: Total of
|
|
1343
|
+
* all capital gains from the disposition of the actual property", neither of
|
|
1344
|
+
* which says WHICH property, or that the pair exists only for a donated
|
|
1345
|
+
* flow-through share. That was recorded as a six-word `note` on 077; the page
|
|
1346
|
+
* gives it a line of its own.
|
|
1347
|
+
*
|
|
1348
|
+
* {@link PrintedBlockHeading} was declared here, then moved to the shared form
|
|
1349
|
+
* model when AT1 Schedule 29's "Part I / Part II (a) / (b)" headings turned out
|
|
1350
|
+
* to be the same shape. It is still re-exported from this module so nothing
|
|
1351
|
+
* importing it from here breaks.
|
|
1352
|
+
*/
|
|
1353
|
+
declare const AT1_SCHEDULE_18_BLOCK_HEADINGS: readonly PrintedBlockHeading[];
|
|
1354
|
+
/**
|
|
1355
|
+
* Lines the page prints somewhere other than where their NUMBER would put them.
|
|
1356
|
+
*
|
|
1357
|
+
* Line 076 is the last figure on the schedule — the taxable capital gain,
|
|
1358
|
+
* struck from 099 below the two carry-forward sentences — but it numbers lower
|
|
1359
|
+
* than 077-099, so anything ordering by line number prints the answer six rows
|
|
1360
|
+
* ABOVE the arithmetic that produces it, captioned "Line 099 X 50%" while 099
|
|
1361
|
+
* is still further down the page. Numeric order is the right default for every
|
|
1362
|
+
* other line here; this records the one place the page departs from it.
|
|
1363
|
+
*
|
|
1364
|
+
* Keyed line → the line it is printed after.
|
|
1365
|
+
*/
|
|
1366
|
+
declare const AT1_SCHEDULE_18_PRINTED_AFTER: Readonly<Record<string, string>>;
|
|
1367
|
+
/**
|
|
1368
|
+
* Column D's arithmetic, in the page's own column letters.
|
|
1369
|
+
*
|
|
1370
|
+
* Every category computes D the same way; only the lines differ. Each D field
|
|
1371
|
+
* additionally carries the sum in ITS OWN line numbers as a note, because a
|
|
1372
|
+
* reader looking at a list of numbered rows cannot see a column letter.
|
|
1373
|
+
*/
|
|
1374
|
+
declare const AT1_SCHEDULE_18_GAIN_FORMULA = "Col. A - (Cols. B + C)";
|
|
404
1375
|
declare const AT1_SCHEDULE_18: FormDefinition;
|
|
405
1376
|
/** Lines 096 and 098 gross the federal Schedule 73 figures back up. */
|
|
406
1377
|
declare const AT1_SECTION_34_2_GROSS_UP = 2;
|
|
@@ -553,6 +1524,50 @@ declare const CONTINUITY_ORDER: (keyof typeof CONTINUITY_CAPTIONS)[];
|
|
|
553
1524
|
declare const AT1_SCHEDULE_21: FormDefinition;
|
|
554
1525
|
//#endregion
|
|
555
1526
|
//#region src/t2/at1/forms/schedule29.d.ts
|
|
1527
|
+
/**
|
|
1528
|
+
* The five headings the page prints inside a box, above the lines they govern.
|
|
1529
|
+
*
|
|
1530
|
+
* Four of them carry the grant calculation's entire structure, and none was
|
|
1531
|
+
* here before. Without them a reader meets lines 110, 112 and 125 as three
|
|
1532
|
+
* numbered rows that each multiply something by a rate, with nothing saying
|
|
1533
|
+
* that 112 and 125 are MUTUALLY EXCLUSIVE — one per return, chosen by whether
|
|
1534
|
+
* the corporation is associated. Each field's `note` now says so too, but the
|
|
1535
|
+
* page says it structurally, which is how a preparer actually reads it.
|
|
1536
|
+
*
|
|
1537
|
+
* The fifth is the instruction the expenditure-limit box sets between lines 100
|
|
1538
|
+
* and 102. It is genuinely a heading over 102-104: both of those lines open
|
|
1539
|
+
* "If the corporation is associated…" / "If the corporation is not
|
|
1540
|
+
* associated…", and page 3 is what the Yes branch requires.
|
|
1541
|
+
*/
|
|
1542
|
+
declare const AT1_SCHEDULE_29_BLOCK_HEADINGS: readonly PrintedBlockHeading[];
|
|
1543
|
+
/**
|
|
1544
|
+
* One column of page 3's allocation grid.
|
|
1545
|
+
*
|
|
1546
|
+
* The grid is the shape a flat field list cannot hold, for the same reason AT1
|
|
1547
|
+
* Schedules 4, 13 and 18 each needed one of these: which cells share a row,
|
|
1548
|
+
* what each column is headed, and — here uniquely — which line the page prints
|
|
1549
|
+
* in that column's cell of the "Totals" row. Three of the ten columns are not
|
|
1550
|
+
* totalled at all (there is no sum of a business number), and a renderer that
|
|
1551
|
+
* lays seven totals across ten columns puts every one of them under the wrong
|
|
1552
|
+
* heading.
|
|
1553
|
+
*/
|
|
1554
|
+
interface IegAllocationColumn {
|
|
1555
|
+
/** The printed line for each MEMBER's own cell in this column. */
|
|
1556
|
+
line: string;
|
|
1557
|
+
/** The heading printed above the column, verbatim. */
|
|
1558
|
+
heading: string;
|
|
1559
|
+
kind: 'text' | 'date' | 'money';
|
|
1560
|
+
/** Whether the preparer fills this column, or the page derives it. */
|
|
1561
|
+
role: 'input' | 'computed';
|
|
1562
|
+
/**
|
|
1563
|
+
* The line the page prints in this column's cell of the Totals row — absent
|
|
1564
|
+
* on the three columns the page leaves untotalled.
|
|
1565
|
+
*/
|
|
1566
|
+
totalsLine?: string;
|
|
1567
|
+
}
|
|
1568
|
+
declare const AT1_SCHEDULE_29_ALLOCATION_COLUMNS: readonly IegAllocationColumn[];
|
|
1569
|
+
/** The label the page prints on the row that totals the allocation grid. */
|
|
1570
|
+
declare const AT1_SCHEDULE_29_ALLOCATION_TOTALS_LABEL = "Totals";
|
|
556
1571
|
declare const AT1_SCHEDULE_29: FormDefinition;
|
|
557
1572
|
/** Eight per cent, on the full capped eligible expenditures. */
|
|
558
1573
|
declare const AT1_IEG_BASE_RATE = 0.08;
|
|
@@ -886,4 +1901,4 @@ declare function describeLine(formId: string, line: string): string;
|
|
|
886
1901
|
*/
|
|
887
1902
|
declare function findBrokenLinks(): string[];
|
|
888
1903
|
//#endregion
|
|
889
|
-
export { SCHEDULE_5_REVENUE_OFFSET as $,
|
|
1904
|
+
export { SCHEDULE_5_REVENUE_OFFSET as $, AT1_SCHEDULE_1_COLUMNS as $n, AT1_SCHEDULE_18_BLOCK_HEADINGS as $t, T2_SCHEDULE_24 as A, AlbertaReconcilingPair as An, FormLineRef as Ar, AT1_IEG_MAX_EXPENDITURE as At, SCHEDULE_8_CCA_LINE as B, albertaVintageRowLabel as Bn, CONTINUITY_CAPTIONS as Bt, T2_SCHEDULE_43 as C, ResourceContinuityArea as Cn, FormDefinition as Cr, CO17_QUEBEC_PROPORTION_BOX as Ct, SCHEDULE_31_GENERAL_SRED_RATE as D, AlbertaCcaColumn as Dn, FormFieldRole as Dr, AT1_IEG_BASE_RATE as Dt, SCHEDULE_31_ENHANCED_SRED_RATE as E, AT1_SCHEDULE_13_COLUMNS as En, FormFieldRequirement as Er, CO17_TAX_PAYABLE_BOX as Et, T2_SCHEDULE_21 as F, AT1_SCHEDULE_3 as Fn, fieldsInSection as Fr, AT1_SCHEDULE_29_BLOCK_HEADINGS as Ft, SCHEDULE_7_ADJUSTED_AII_LINE as G, AT1_SCHEDULE_1 as Gn, AT1_SCHEDULE_20_POOLS as Gt, SCHEDULE_8_RECAPTURE_LINE as H, AT1_SCHEDULE_2_FACTOR_DESTINATION as Hn, scheduleTwentyOneLineId as Ht, ReserveRow as I, AT1_SCHEDULE_3_VINTAGE_TABLES as In, indexByLine as Ir, IegAllocationColumn as It, DispositionGrid as J, AT1_SCHEDULE_1_AREA_B_LARGE_CORPORATIONS as Jn, ContinuityRow as Jt, SCHEDULE_7_PASSIVE_INCOME_THRESHOLD as K, AT1_SCHEDULE_1_AGREEMENT_COLUMNS as Kn, COMPUTED_CONTINUITY_ROWS as Kt, SCHEDULE_13_RESERVE_ROWS as L, AT1_SCHEDULE_3_VINTAGE_TOTALS_LABEL as Ln, inputFields as Lr, AT1_SCHEDULE_21 as Lt, T2_SCHEDULE_23 as M, AT1_SCHEDULE_4 as Mn, FormSection as Mr, AT1_SCHEDULE_29 as Mt, SCHEDULE_21_BUSINESS_CREDIT_LINE as N, AT1_SCHEDULE_4_COLUMNS as Nn, LineNumberScheme as Nr, AT1_SCHEDULE_29_ALLOCATION_COLUMNS as Nt, T2_SCHEDULE_31 as O, AT1_SCHEDULE_12 as On, FormFieldSide as Or, AT1_IEG_ENHANCED_RATE as Ot, SCHEDULE_21_NON_BUSINESS_CREDIT_LINE as P, ForeignCreditColumn as Pn, PrintedBlockHeading as Pr, AT1_SCHEDULE_29_ALLOCATION_TOTALS_LABEL as Pt, SCHEDULE_5_JURISDICTIONS as Q, AT1_SCHEDULE_1_BLOCK_HEADINGS as Qn, AT1_SCHEDULE_18_ABIL_TOTALS_LABEL as Qt, T2_SCHEDULE_13 as R, VintageColumn as Rn, isEnterableLine as Rr, AT1_SCHEDULE_21_POOLS as Rt, SCHEDULE_43_DIVIDEND_ALLOWANCE as S, PerCountryTable as Sn, AT4970_JURISDICTIONS as Sr, T2_TOTAL_TAX_PAYABLE_LINE as St, T2_SCHEDULE_33 as T, AT1_SCHEDULE_13 as Tn, FormFieldKind as Tr, CO17_TAXABLE_INCOME_BOX as Tt, SCHEDULE_8_TERMINAL_LOSS_LINE as U, AT1_SCHEDULE_2_FORMULAS as Un, AT1_DONATION_CARRYFORWARD_YEARS as Ut, SCHEDULE_8_COLUMNS as V, AT1_SCHEDULE_2 as Vn, CONTINUITY_ORDER as Vt, T2_SCHEDULE_8 as W, AlbertaAllocationFormula as Wn, AT1_SCHEDULE_20 as Wt, T2_SCHEDULE_6 as X, AT1_SCHEDULE_1_AREA_B_STEPS as Xn, AT1_SCHEDULE_18 as Xt, SCHEDULE_6_GRIDS as Y, AT1_SCHEDULE_1_AREA_B_PREAMBLE as Yn, DonationPool as Yt, AllocationJurisdiction as Z, AT1_SCHEDULE_1_AREA_B_TITLE as Zn, AT1_SCHEDULE_18_ABIL_COLUMNS as Zt, SCHEDULE_53_CLOSING_GRIP_LINE as _, AT1_SCHEDULE_15_CARRY_FORWARD as _n, AT1_TAX_PAYABLE_LINE as _r, T2_BASE_PART_I_RATE as _t, getField as a, AT1_SECTION_34_2_GROSS_UP as an, SbdAgreementColumn as ar, T2_SCHEDULE_4 as at, SCHEDULE_50_DISCLOSURE_THRESHOLD as b, PerCountryArea as bn, At1JacketRateRow as br, T2_SMALL_BUSINESS_DEDUCTION_RATE as bt, CaptionRow as c, DispositionColumn as cn, AT1_BALANCE_LINE as cr, T2_SCHEDULE_3 as ct, buildFields as d, AT1_SCHEDULE_17_RESERVES as dn, AT1_JACKET_CODE_OPTIONS as dr, T2_SCHEDULE_2 as dt, AT1_SCHEDULE_18_CATEGORIES as en, AT1_SCHEDULE_1_RATE_PERIODS as er, SCHEDULE_5_SALARIES_OFFSET as et, SCHEDULE_141_PREPARER_IDENTIFIED_LINE as f, AlbertaReserveKind as fn, AT1_JACKET_DAY_BANDS as fr, SCHEDULE_1_LINES as ft, T2_SCHEDULE_55 as g, AT1_SCHEDULE_15_AREAS as gn, AT1_PRINTED_DEDUCTION_LINES as gr, T2_SCHEDULE_1 as gt, T2_SCHEDULE_130 as h, AT1_SCHEDULE_15 as hn, AT1_JACKET_RATE_ROWS as hr, SCHEDULE_1_TOTAL_DEDUCTIONS_LINE as ht, formsForProgram as i, AT1_SCHEDULE_18_PRINTED_AFTER as in, AlbertaSbdRatePeriod as ir, SCHEDULE_4_NON_CAPITAL_CARRYFORWARD_YEARS as it, SCHEDULE_23_GROUP_BUSINESS_LIMIT as j, AT1_SCHEDULE_10 as jn, FormProvenance as jr, AT1_IEG_PRIOR_YEARS as jt, SCHEDULE_24_OPERATION_TYPE_LINE as k, AT1_SCHEDULE_12_PAIRS as kn, FormFootnotePlacement as kr, AT1_IEG_JACKET_LINE as kt, LineBand as l, DispositionGridSpec as ln, AT1_JACKET as lr, SCHEDULE_2_CARRYFORWARD_YEARS as lt, T2_SCHEDULE_141 as m, AT1_SCHEDULE_16_CARRYFORWARD_LINE as mn, AT1_JACKET_LINES_NOT_PRINTED as mr, SCHEDULE_1_TOTAL_ADDITIONS_LINE as mt, describeLine as n, AT1_SCHEDULE_18_GAIN_FORMULA as nn, AlbertaBaseAmountStep as nr, SCHEDULE_4_CARRYBACK_YEARS as nt, getForm as o, AbilColumn as on, AT1_BALANCE_CREDIT_LINES as or, SCHEDULE_3_ELIGIBLE_PAID_LINE as ot, SCHEDULE_141_RESERVATION_LINE as p, AT1_SCHEDULE_16 as pn, AT1_JACKET_DEPARTMENT_USE as pr, SCHEDULE_1_LINE_BY_NUMBER as pt, T2_SCHEDULE_7 as q, AT1_SCHEDULE_1_AGREEMENT_TOTALS_LABEL as qn, CONTINUITY_ROWS as qt, findBrokenLinks as r, AT1_SCHEDULE_18_GRIDS as rn, AlbertaSbdColumn as rr, SCHEDULE_4_LPP_CARRYFORWARD_YEARS as rt, BuildFieldsSpec as s, DispositionCategory as sn, AT1_BALANCE_CREDIT_LINES_PER_SPEC as sr, SCHEDULE_3_TAXABLE_PAID_LINE as st, FORMS as t, AT1_SCHEDULE_18_COLUMNS as tn, AT1_SCHEDULE_1_TOTAL_DAYS_LABEL as tr, T2_SCHEDULE_5 as tt, UnclassifiedLineError as u, AT1_SCHEDULE_17 as un, AT1_JACKET_BLOCK_HEADINGS as ur, SCHEDULE_2_CHARITABLE_CURRENT_LINE as ut, SCHEDULE_53_GENERAL_RATE_FACTOR as v, AT1_SCHEDULE_15_CLOSING_INSTRUCTION as vn, At1JacketCodeOption as vr, T2_JACKET as vt, SCHEDULE_33_TAXABLE_CAPITAL_IN_CANADA_LINE as w, ResourceContinuityRow as wn, FormField as wr, CO17_RETURN as wt, T2_SCHEDULE_50 as x, PerCountryColumn as xn, AT4970 as xr, T2_TAXABLE_INCOME_LINE as xt, T2_SCHEDULE_53 as y, AT1_SCHEDULE_15_PER_COUNTRY as yn, At1JacketDayBand as yr, T2_NET_INCOME_FOR_TAX_LINE as yt, CcaColumn as z, VintageTable as zn, validateFormDefinition as zr, AlbertaLossPool as zt };
|