@classytic/ca-tax 0.0.2 → 0.0.5
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 +93 -0
- package/dist/forms/index.d.mts +2 -2
- package/dist/forms/index.mjs +2 -2
- package/dist/forms.mjs +184 -2
- package/dist/index.d.mts +6 -1
- package/dist/index.mjs +3 -3
- package/dist/index3.d.mts +348 -9
- 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 +374 -36
- package/package.json +4 -2
package/dist/t2.mjs
CHANGED
|
@@ -262,7 +262,8 @@ const AT1_SCHEDULES_WITH_BUILDERS = Object.freeze([
|
|
|
262
262
|
"018",
|
|
263
263
|
"020",
|
|
264
264
|
"021",
|
|
265
|
-
"029"
|
|
265
|
+
"029",
|
|
266
|
+
"4970"
|
|
266
267
|
]);
|
|
267
268
|
/**
|
|
268
269
|
* Schedules the engine computes but cannot yet file.
|
|
@@ -435,6 +436,15 @@ function schedule18Values(result) {
|
|
|
435
436
|
* Field ids read off the live, TRA-certified form
|
|
436
437
|
* (`research/sources/tra-forms/pdf/AT1SCH29-*.pdf`, Rev. 2026-06):
|
|
437
438
|
*
|
|
439
|
+
* Page 1 — Eligible Expenditures, filed only when the caller supplies
|
|
440
|
+
* `eligible` (from `computeIegEligibleExpenditures` in
|
|
441
|
+
* `schedule29-eligible-expenditures.ts`):
|
|
442
|
+
* 003 federal amount of qualified/current SR&ED expenditures (T661 line
|
|
443
|
+
* 559 or 557 — see `iegT661SourceLine`)
|
|
444
|
+
* 005/007/009/011/025 the five adjustments; 031 = 005 − 007 + 009 + 011 + 025
|
|
445
|
+
* 040 primary field of science or technology (1–4), when the caller
|
|
446
|
+
* supplies `primaryFieldCode`
|
|
447
|
+
*
|
|
438
448
|
* Page 1/2 — the grant itself:
|
|
439
449
|
* 110 8% of the capped expenditures
|
|
440
450
|
* 112 12% of the increment above base — the non-associated path. Filed
|
|
@@ -477,12 +487,22 @@ function schedule18Values(result) {
|
|
|
477
487
|
* band. See `schedule29-ieg.ts` for why 128 exists and the one unresolved
|
|
478
488
|
* discrepancy in how 130 is meant to be computed.
|
|
479
489
|
*/
|
|
480
|
-
function schedule29Values(result, agreement) {
|
|
490
|
+
function schedule29Values(result, agreement, eligible, primaryFieldCode) {
|
|
481
491
|
const values = [];
|
|
482
492
|
const put = (fieldId, value, occurrence = 1) => values.push({
|
|
483
493
|
lineItemId: at1LineItemId("029", fieldId, occurrence),
|
|
484
494
|
value
|
|
485
495
|
});
|
|
496
|
+
if (eligible) {
|
|
497
|
+
put("003", eligible.federalAmount);
|
|
498
|
+
put("005", eligible.albertaPortion);
|
|
499
|
+
if (eligible.federalProxyAmount > 0) put("007", eligible.federalProxyAmount);
|
|
500
|
+
if (eligible.albertaProxyAmount > 0) put("009", eligible.albertaProxyAmount);
|
|
501
|
+
if (eligible.iegReducingFederalExpenditure > 0) put("011", eligible.iegReducingFederalExpenditure);
|
|
502
|
+
if (eligible.repaymentOrContractPayment > 0) put("025", eligible.repaymentOrContractPayment);
|
|
503
|
+
put("031", eligible.totalEligibleExpenditures);
|
|
504
|
+
}
|
|
505
|
+
if (primaryFieldCode !== void 0) put("040", primaryFieldCode);
|
|
486
506
|
put("110", result.creditAtBaseRate);
|
|
487
507
|
put(result.enhancedRateBasis === "associated" ? "125" : "112", result.creditAtEnhancedRate);
|
|
488
508
|
put("126", result.taxableCapital);
|
|
@@ -524,6 +544,70 @@ function schedule29Values(result, agreement) {
|
|
|
524
544
|
};
|
|
525
545
|
}
|
|
526
546
|
/**
|
|
547
|
+
* A separate attachment from Schedule 29 itself, one occurrence per Alberta
|
|
548
|
+
* SR&ED project (101/103/105/107/109/111/113), a TOTAL row (repeats the same
|
|
549
|
+
* field ids at a fixed trailing occurrence — see below), and the jurisdiction
|
|
550
|
+
* table (135–170, occurrence 1, no per-jurisdiction row structure since each
|
|
551
|
+
* jurisdiction has its own field id already).
|
|
552
|
+
*
|
|
553
|
+
* ⚠ The schedule id (`'4970'`) and line-item id scheme used here are a
|
|
554
|
+
* PLACEHOLDER — TRA's own published Guide confirms the field NUMBERS
|
|
555
|
+
* (verified twice, independently) but not the NetFile wire-format encoding
|
|
556
|
+
* for this attachment. See `at4970-ieg-projects.ts` and `forms/at4970.ts`
|
|
557
|
+
* for the same caveat. Verify before relying on this for live filing.
|
|
558
|
+
*
|
|
559
|
+
* The TOTAL row is filed at occurrence `projects.length + 1` — one past the
|
|
560
|
+
* last project row — so a real project can never collide with it.
|
|
561
|
+
*/
|
|
562
|
+
function schedule4970Values(result) {
|
|
563
|
+
const values = [];
|
|
564
|
+
const put = (fieldId, value, occurrence = 1) => values.push({
|
|
565
|
+
lineItemId: `4970${fieldId}${String(occurrence).padStart(3, "0")}`,
|
|
566
|
+
value
|
|
567
|
+
});
|
|
568
|
+
result.projects.forEach((p, i) => {
|
|
569
|
+
const n = i + 1;
|
|
570
|
+
put("101", p.title, n);
|
|
571
|
+
if (p.projectCode !== void 0) put("103", p.projectCode, n);
|
|
572
|
+
put("105", p.albertaPortion, n);
|
|
573
|
+
put("107", p.otherPortion, n);
|
|
574
|
+
put("109", p.salariesAndWages, n);
|
|
575
|
+
if (p.federalProxyAmount > 0) put("111", p.federalProxyAmount, n);
|
|
576
|
+
if (p.albertaProxyAmount > 0) put("113", p.albertaProxyAmount, n);
|
|
577
|
+
});
|
|
578
|
+
const totalRow = result.projects.length + 1;
|
|
579
|
+
put("105", result.totals.albertaPortion, totalRow);
|
|
580
|
+
put("107", result.totals.otherPortion, totalRow);
|
|
581
|
+
put("109", result.totals.salariesAndWages, totalRow);
|
|
582
|
+
put("111", result.totals.federalProxyAmount, totalRow);
|
|
583
|
+
put("113", result.totals.albertaProxyAmount, totalRow);
|
|
584
|
+
const jurisdictionFields = {
|
|
585
|
+
alberta: "135",
|
|
586
|
+
britishColumbia: "137",
|
|
587
|
+
manitoba: "139",
|
|
588
|
+
newBrunswick: "141",
|
|
589
|
+
newfoundlandAndLabrador: "143",
|
|
590
|
+
northwestTerritories: "145",
|
|
591
|
+
novaScotia: "147",
|
|
592
|
+
nunavut: "149",
|
|
593
|
+
ontario: "151",
|
|
594
|
+
princeEdwardIsland: "153",
|
|
595
|
+
quebec: "155",
|
|
596
|
+
saskatchewan: "157",
|
|
597
|
+
yukon: "159",
|
|
598
|
+
other: "161"
|
|
599
|
+
};
|
|
600
|
+
for (const j of result.jurisdictions) {
|
|
601
|
+
const fieldId = jurisdictionFields[j.jurisdiction];
|
|
602
|
+
if (fieldId && j.amountIncurred > 0) put(fieldId, j.amountIncurred);
|
|
603
|
+
}
|
|
604
|
+
if (result.jurisdictionTotal > 0) put("170", result.jurisdictionTotal);
|
|
605
|
+
return {
|
|
606
|
+
scheduleId: "4970",
|
|
607
|
+
values
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
527
611
|
* The Schedule 21 → Schedule 12 carry-forwards, as the form states them beside
|
|
528
612
|
* each line:
|
|
529
613
|
*
|
|
@@ -822,6 +906,37 @@ function schedule16Values(result) {
|
|
|
822
906
|
};
|
|
823
907
|
}
|
|
824
908
|
//#endregion
|
|
909
|
+
//#region src/t2/at1/schedules/at4970-ieg-projects.ts
|
|
910
|
+
const nn$25 = (v) => Math.max(0, Math.round(v ?? 0));
|
|
911
|
+
function computeAt4970(input) {
|
|
912
|
+
const projects = input.projects.map((p) => ({
|
|
913
|
+
title: p.title,
|
|
914
|
+
...p.projectCode !== void 0 ? { projectCode: p.projectCode } : {},
|
|
915
|
+
albertaPortion: nn$25(p.albertaPortion),
|
|
916
|
+
otherPortion: nn$25(p.otherPortion),
|
|
917
|
+
salariesAndWages: nn$25(p.salariesAndWages),
|
|
918
|
+
federalProxyAmount: nn$25(p.federalProxyAmount),
|
|
919
|
+
albertaProxyAmount: nn$25(p.albertaProxyAmount)
|
|
920
|
+
}));
|
|
921
|
+
const totals = {
|
|
922
|
+
albertaPortion: projects.reduce((s, p) => s + p.albertaPortion, 0),
|
|
923
|
+
otherPortion: projects.reduce((s, p) => s + p.otherPortion, 0),
|
|
924
|
+
salariesAndWages: projects.reduce((s, p) => s + p.salariesAndWages, 0),
|
|
925
|
+
federalProxyAmount: projects.reduce((s, p) => s + p.federalProxyAmount, 0),
|
|
926
|
+
albertaProxyAmount: projects.reduce((s, p) => s + p.albertaProxyAmount, 0)
|
|
927
|
+
};
|
|
928
|
+
const jurisdictions = (input.jurisdictions ?? []).map((j) => ({
|
|
929
|
+
jurisdiction: j.jurisdiction,
|
|
930
|
+
amountIncurred: nn$25(j.amountIncurred)
|
|
931
|
+
}));
|
|
932
|
+
return {
|
|
933
|
+
projects,
|
|
934
|
+
totals,
|
|
935
|
+
jurisdictions,
|
|
936
|
+
jurisdictionTotal: jurisdictions.reduce((s, j) => s + j.amountIncurred, 0)
|
|
937
|
+
};
|
|
938
|
+
}
|
|
939
|
+
//#endregion
|
|
825
940
|
//#region src/t2/at1/schedules/schedule2.ts
|
|
826
941
|
/** Round to six decimal places — the AT1 allocation-factor precision. */
|
|
827
942
|
function round6(n) {
|
|
@@ -842,6 +957,100 @@ function computeAllocationFactor(input) {
|
|
|
842
957
|
return round6(factor);
|
|
843
958
|
}
|
|
844
959
|
//#endregion
|
|
960
|
+
//#region src/t2/at1/schedules/schedule29-eligible-expenditures.ts
|
|
961
|
+
/**
|
|
962
|
+
* AT1 Schedule 29 page 1 — Eligible Expenditures for IEG Purposes (lines
|
|
963
|
+
* 001–040). AT29's own worksheet for deriving the "eligible expenditures"
|
|
964
|
+
* figure (line 031) that everything else on this schedule — the base amount,
|
|
965
|
+
* the increment, the Agreement's per-member 245/250/260 — is built from.
|
|
966
|
+
*
|
|
967
|
+
* ── Why this module exists separately from `schedule29-ieg.ts` ─────────────
|
|
968
|
+
*
|
|
969
|
+
* `computeIeg` took `eligibleExpenditures` as a bare number input. It is not
|
|
970
|
+
* one — it is DERIVED, by a six-line formula off federal T661, and a prior
|
|
971
|
+
* version of this package never modelled that derivation at all: it skipped
|
|
972
|
+
* page 1 of the live form entirely (only pages 2 and 3 were ever rendered),
|
|
973
|
+
* so every caller had to compute line 031 by hand outside the engine, with
|
|
974
|
+
* nothing here to check the arithmetic. Confirmed missing by rendering the
|
|
975
|
+
* live, TRA-certified form (`research/sources/tra-forms/pdf/AT1SCH29-*.pdf`,
|
|
976
|
+
* page 1) and independently re-verified against two of TRA's own published
|
|
977
|
+
* worked examples (`research/sources/tra-guides/tra-guide-claiming-the-
|
|
978
|
+
* innovation-employment-grant.pdf`, Examples 3 and 4) — see
|
|
979
|
+
* `research/knowledge-base/at1-schedule-29-ieg-mechanics.md`.
|
|
980
|
+
*
|
|
981
|
+
* ── The formula ──────────────────────────────────────────────────────────
|
|
982
|
+
*
|
|
983
|
+
* 003 federal amount of qualified/current SR&ED expenditures, T661 line
|
|
984
|
+
* 559 or 557 (see below)
|
|
985
|
+
* 005 portion of 003 carried out in Alberta — normally the sum of every
|
|
986
|
+
* AT4970 project row's own 105 column (`at4970-ieg-projects.ts`)
|
|
987
|
+
* 007 deduct: federal prescribed proxy amount included in the Alberta
|
|
988
|
+
* portion of 003 — normally Σ AT4970's 111 column
|
|
989
|
+
* 009 add: Alberta proxy amount — normally Σ AT4970's 113 column
|
|
990
|
+
* 011 add: IEG that reduced the federal expenditure IN THE TAXATION YEAR
|
|
991
|
+
* — zero for a first-time current-year claim reported on the
|
|
992
|
+
* pre-deduction federal figures (see the Step 1 / Step 2 note below)
|
|
993
|
+
* 025 add: the Alberta portion of a repayment of government assistance
|
|
994
|
+
* (other than an IEG) OR A CONTRACT PAYMENT, relating to amounts in
|
|
995
|
+
* 005 from the current year or ANY PRECEDING taxation year — two
|
|
996
|
+
* independent triggers, not one
|
|
997
|
+
* 031 TOTAL = 005 − 007 + 009 + 011 + 025
|
|
998
|
+
*
|
|
999
|
+
* 031 is what `computeIeg` calls `eligibleExpenditures` and what an
|
|
1000
|
+
* Agreement member's own `currentYearExpenditures` (line 245) is — the same
|
|
1001
|
+
* formula, computed once per corporation per year, whether or not that
|
|
1002
|
+
* corporation is associated.
|
|
1003
|
+
*
|
|
1004
|
+
* ── The federal T661 line 557 vs 559 split (Fall 2026 re-certification) ────
|
|
1005
|
+
*
|
|
1006
|
+
* TRA's own certification correspondence and the live form agree: for a
|
|
1007
|
+
* taxation year ending ON OR BEFORE 2024-12-15, line 003 comes from federal
|
|
1008
|
+
* T661 line 559 (qualified SR&ED expenditures); for a taxation year ending
|
|
1009
|
+
* ON OR AFTER 2024-12-16, it comes from T661 line 557 (CURRENT SR&ED
|
|
1010
|
+
* expenditures) instead — a different federal figure, not a renumbering.
|
|
1011
|
+
* `iegT661SourceLine` below is purely informational (which federal line a
|
|
1012
|
+
* preparer should be told to copy from); it does not change the Alberta
|
|
1013
|
+
* arithmetic itself, which is identical either way.
|
|
1014
|
+
*
|
|
1015
|
+
* ── The "Step 1 / Step 2" columns in TRA's Guide are not two form fields ────
|
|
1016
|
+
*
|
|
1017
|
+
* The Guide illustrates every page-1 line twice — once using the federal
|
|
1018
|
+
* figures BEFORE the current year's own IEG is netted against them as
|
|
1019
|
+
* government assistance (T661 line 513), once AFTER, with line 011 adding
|
|
1020
|
+
* the IEG back. Both worked examples land on the IDENTICAL line 031 either
|
|
1021
|
+
* way (011 exists specifically to undo the 513 netting for ALBERTA's own
|
|
1022
|
+
* base, so it cannot shrink itself). Only ONE set of figures is filed. Every
|
|
1023
|
+
* TRA test case gives the pre-deduction ("Step 1") federal figures — use
|
|
1024
|
+
* those directly, with 011 = 0 for a first-time current-year claim. Do not
|
|
1025
|
+
* build a literal two-pass loop; there is nothing for it to converge on that
|
|
1026
|
+
* isn't already true of the Step 1 figures alone.
|
|
1027
|
+
*
|
|
1028
|
+
* Whole dollars, pure.
|
|
1029
|
+
*/
|
|
1030
|
+
/** Which federal T661 line line 003 sources from, given a taxation year end. */
|
|
1031
|
+
function iegT661SourceLine(taxationYearEnd) {
|
|
1032
|
+
return taxationYearEnd >= "2024-12-16" ? "557" : "559";
|
|
1033
|
+
}
|
|
1034
|
+
const nn$24 = (v) => Math.round(v ?? 0);
|
|
1035
|
+
/** Line 031 = 005 − 007 + 009 + 011 + 025. Every term but 005 defaults to nil. */
|
|
1036
|
+
function computeIegEligibleExpenditures(input) {
|
|
1037
|
+
const federalAmount = nn$24(input.federalAmount);
|
|
1038
|
+
const albertaPortion = nn$24(input.albertaPortion);
|
|
1039
|
+
const federalProxyAmount = nn$24(input.federalProxyAmount);
|
|
1040
|
+
const albertaProxyAmount = nn$24(input.albertaProxyAmount);
|
|
1041
|
+
const iegReducingFederalExpenditure = nn$24(input.iegReducingFederalExpenditure);
|
|
1042
|
+
const repaymentOrContractPayment = nn$24(input.repaymentOrContractPayment);
|
|
1043
|
+
return {
|
|
1044
|
+
federalAmount,
|
|
1045
|
+
albertaPortion,
|
|
1046
|
+
federalProxyAmount,
|
|
1047
|
+
albertaProxyAmount,
|
|
1048
|
+
iegReducingFederalExpenditure,
|
|
1049
|
+
repaymentOrContractPayment,
|
|
1050
|
+
totalEligibleExpenditures: albertaPortion - federalProxyAmount + albertaProxyAmount + iegReducingFederalExpenditure + repaymentOrContractPayment
|
|
1051
|
+
};
|
|
1052
|
+
}
|
|
1053
|
+
//#endregion
|
|
845
1054
|
//#region src/t2/at1/schedules/schedule29-ieg.ts
|
|
846
1055
|
/**
|
|
847
1056
|
* AT1 Schedule 29 — Alberta Innovation Employment Grant (IEG). AT1 line 129.
|
|
@@ -1014,6 +1223,37 @@ function computeIeg(input) {
|
|
|
1014
1223
|
* contributes its taxable capital to the grind. Both cases appear in the Alberta
|
|
1015
1224
|
* certification material and both are modelled.
|
|
1016
1225
|
*
|
|
1226
|
+
* ── ⚠ This module's "group aggregated base amount" has no line on the real form ──
|
|
1227
|
+
*
|
|
1228
|
+
* Rendering Schedule 29 page 2 in full (a prior version of this package only
|
|
1229
|
+
* ever rendered pages 2 and 3's CREDIT section, never page 1) shows the base
|
|
1230
|
+
* amount (lines 114/116/118) captioned "*If the corporation is NOT
|
|
1231
|
+
* associated with one or more corporations in the taxation year, the Base
|
|
1232
|
+
* Amount is the amount that is the average of the eligible expenditures OF
|
|
1233
|
+
* THE CORPORATION for the two immediately preceding taxation years" — the
|
|
1234
|
+
* CLAIMANT's own figures alone, no group aggregation, and used ONLY for the
|
|
1235
|
+
* non-associated path (line 112). Confirmed blank in both of TRA's own
|
|
1236
|
+
* published worked examples whenever the corporation IS associated — the
|
|
1237
|
+
* associated path (line 125) uses no base amount at all, replacing the
|
|
1238
|
+
* whole mechanism with the Agreement's Allowed Amount instead (see
|
|
1239
|
+
* `computeIegAgreement` below). The live form also states an associated
|
|
1240
|
+
* corporation MUST complete the Agreement ("If 'Yes', complete page 3") —
|
|
1241
|
+
* so there is no scenario on the real form where a group is associated but
|
|
1242
|
+
* has not filed one. `computeIegGroupFigures`'s "aggregate every member's
|
|
1243
|
+
* prior-two-years spending into one shared base amount", used regardless of
|
|
1244
|
+
* associated/non-associated status by `computeAlbertaReturn`, therefore
|
|
1245
|
+
* does not correspond to anything a preparer could actually file — it is
|
|
1246
|
+
* harmless ONLY because `computeIeg`'s associated branch ignores
|
|
1247
|
+
* `baseAmount` entirely. Left in place rather than removed: not exercised by
|
|
1248
|
+
* any of TRA's Fall 2026 certification test cases (all either non-associated
|
|
1249
|
+
* with a genuine single-corporation base, or associated with a filed
|
|
1250
|
+
* Agreement whose own figures are what actually reach the credit), so a full
|
|
1251
|
+
* rearchitecture is deferred rather than rushed. `taxableCapital` for the
|
|
1252
|
+
* associated path is already sourced from the Agreement, not from here — see
|
|
1253
|
+
* `alberta-return.ts`. See `research/knowledge-base/
|
|
1254
|
+
* at1-schedule-29-ieg-mechanics.md` for the full comparison against the live
|
|
1255
|
+
* form and both of TRA's published worked examples.
|
|
1256
|
+
*
|
|
1017
1257
|
* Whole dollars, pure.
|
|
1018
1258
|
*/
|
|
1019
1259
|
const nn$23 = (v) => Math.max(0, Math.round(v ?? 0));
|
|
@@ -1095,17 +1335,20 @@ function allocateIegEvenly(groupExpenditureLimit, names) {
|
|
|
1095
1335
|
allocated: i === 0 ? each + remainder : each
|
|
1096
1336
|
})));
|
|
1097
1337
|
}
|
|
1098
|
-
function computeAgreementMember(m) {
|
|
1338
|
+
function computeAgreementMember(m, index, issues) {
|
|
1099
1339
|
const allocatedExpenditureLimit = nn$23(m.allocatedExpenditureLimit);
|
|
1100
1340
|
const currentYearExpenditures = nn$23(m.currentYearExpenditures);
|
|
1101
1341
|
const priorYear1 = nn$23(m.priorYear1);
|
|
1102
1342
|
const priorYear2 = nn$23(m.priorYear2);
|
|
1103
1343
|
const base = Math.round((priorYear1 + priorYear2) / 2);
|
|
1104
|
-
const individualMaximumAllowedAmount =
|
|
1344
|
+
const individualMaximumAllowedAmount = currentYearExpenditures - base;
|
|
1105
1345
|
const days = Math.max(0, Math.min(m.daysInTaxYear ?? 365, 366));
|
|
1106
1346
|
const dayProratedLimit = Math.round(4e6 * (days / 365));
|
|
1107
|
-
const dayProratedComponent = Math.
|
|
1108
|
-
const
|
|
1347
|
+
const dayProratedComponent = Math.min(dayProratedLimit, currentYearExpenditures) - base;
|
|
1348
|
+
const isClaimant = index === 0;
|
|
1349
|
+
if (m.hasAlbertaPermanentEstablishment === void 0 && !isClaimant) issues.push(`Alberta Schedule 29 Agreement: ${m.name} did not state whether it has a permanent establishment in Alberta. Treated as no permanent establishment (line 268 = nil) — a member without one is not eligible for the IEG even when its own formula would allow an amount. Confirm and re-enter if this member does have an Alberta PE.`);
|
|
1350
|
+
const hasAlbertaPermanentEstablishment = m.hasAlbertaPermanentEstablishment ?? isClaimant;
|
|
1351
|
+
const allocatedAllowedAmount = hasAlbertaPermanentEstablishment ? Math.max(0, Math.min(allocatedExpenditureLimit, individualMaximumAllowedAmount, dayProratedComponent)) : 0;
|
|
1109
1352
|
return {
|
|
1110
1353
|
name: m.name,
|
|
1111
1354
|
...m.federalBusinessNumber !== void 0 ? { federalBusinessNumber: m.federalBusinessNumber } : {},
|
|
@@ -1116,6 +1359,7 @@ function computeAgreementMember(m) {
|
|
|
1116
1359
|
priorYear1,
|
|
1117
1360
|
priorYear2,
|
|
1118
1361
|
taxableCapitalPriorYear: nn$23(m.taxableCapitalPriorYear),
|
|
1362
|
+
hasAlbertaPermanentEstablishment,
|
|
1119
1363
|
individualMaximumAllowedAmount,
|
|
1120
1364
|
allocatedAllowedAmount
|
|
1121
1365
|
};
|
|
@@ -1130,7 +1374,7 @@ function computeIegAgreement(input) {
|
|
|
1130
1374
|
if (input.members.length === 0) issues.push("Alberta Schedule 29 Agreement: no members were supplied. The claiming corporation must appear as the first row even in a two-corporation group.");
|
|
1131
1375
|
const days = Math.max(0, Math.min(input.daysInLongestYear, 366));
|
|
1132
1376
|
const maximumExpenditureLimit = Math.round(4e6 * (days / 365));
|
|
1133
|
-
const members = input.members.map(computeAgreementMember);
|
|
1377
|
+
const members = input.members.map((m, i) => computeAgreementMember(m, i, issues));
|
|
1134
1378
|
const sum = (get) => members.reduce((s, m) => s + get(m), 0);
|
|
1135
1379
|
const totalAllocatedLimit = sum((m) => m.allocatedExpenditureLimit);
|
|
1136
1380
|
const totalCurrentYearExpenditures = sum((m) => m.currentYearExpenditures);
|
|
@@ -1190,28 +1434,48 @@ function computeAlbertaReturn(input) {
|
|
|
1190
1434
|
const issues = [];
|
|
1191
1435
|
let iegGroup;
|
|
1192
1436
|
let iegAgreement;
|
|
1437
|
+
let iegEligibleExpenditures;
|
|
1193
1438
|
let ieg;
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1439
|
+
let at4970;
|
|
1440
|
+
if (input.ieg) {
|
|
1441
|
+
if (input.ieg.at4970) at4970 = computeAt4970(input.ieg.at4970);
|
|
1442
|
+
let resolvedEligibleExpenditures = input.ieg.eligibleExpenditures ?? 0;
|
|
1443
|
+
if (input.ieg.eligible) {
|
|
1444
|
+
const e = input.ieg.eligible;
|
|
1445
|
+
const federalProxyAmount = e.federalProxyAmount ?? at4970?.totals.federalProxyAmount;
|
|
1446
|
+
const albertaProxyAmount = e.albertaProxyAmount ?? at4970?.totals.albertaProxyAmount;
|
|
1447
|
+
iegEligibleExpenditures = computeIegEligibleExpenditures({
|
|
1448
|
+
federalAmount: e.federalAmount,
|
|
1449
|
+
albertaPortion: e.albertaPortion ?? at4970?.totals.albertaPortion ?? 0,
|
|
1450
|
+
...federalProxyAmount !== void 0 ? { federalProxyAmount } : {},
|
|
1451
|
+
...albertaProxyAmount !== void 0 ? { albertaProxyAmount } : {},
|
|
1452
|
+
...e.iegReducingFederalExpenditure !== void 0 ? { iegReducingFederalExpenditure: e.iegReducingFederalExpenditure } : {},
|
|
1453
|
+
...e.repaymentOrContractPayment !== void 0 ? { repaymentOrContractPayment: e.repaymentOrContractPayment } : {}
|
|
1454
|
+
});
|
|
1455
|
+
resolvedEligibleExpenditures = iegEligibleExpenditures.totalEligibleExpenditures;
|
|
1456
|
+
}
|
|
1457
|
+
if (input.ieg.group.length === 0) issues.push("AT1 Schedule 29: no associated-group members were supplied, so no grant was claimed. Pass the claimant itself even when it has no associated corporations — an empty group would otherwise imply no taxable-capital grind and a nil base, producing the maximum possible grant on absent data.");
|
|
1458
|
+
else {
|
|
1459
|
+
iegGroup = computeIegGroupFigures(input.ieg.group);
|
|
1460
|
+
issues.push(...iegGroup.issues);
|
|
1461
|
+
const allocation = allocateIegExpenditureLimit(iegGroup.groupExpenditureLimit, [{
|
|
1462
|
+
name: "claimant",
|
|
1463
|
+
allocated: input.ieg.allocatedLimit ?? iegGroup.groupExpenditureLimit
|
|
1464
|
+
}]);
|
|
1465
|
+
issues.push(...allocation.issues);
|
|
1466
|
+
if (input.ieg.agreement) {
|
|
1467
|
+
iegAgreement = computeIegAgreement(input.ieg.agreement);
|
|
1468
|
+
issues.push(...iegAgreement.issues);
|
|
1469
|
+
}
|
|
1470
|
+
ieg = computeIeg({
|
|
1471
|
+
eligibleExpenditures: resolvedEligibleExpenditures,
|
|
1472
|
+
baseAmount: iegGroup.groupBaseAmount,
|
|
1473
|
+
expenditureLimit: allocation.allocations[0]?.allocated ?? 0,
|
|
1474
|
+
taxableCapital: iegAgreement ? iegAgreement.totalTaxableCapitalPriorYear : iegGroup.groupTaxableCapital,
|
|
1475
|
+
...input.ieg.recapture !== void 0 ? { recapture: input.ieg.recapture } : {},
|
|
1476
|
+
...iegAgreement ? { associatedAllowedAmount: iegAgreement.claimantAllocatedAllowedAmount } : {}
|
|
1477
|
+
});
|
|
1206
1478
|
}
|
|
1207
|
-
ieg = computeIeg({
|
|
1208
|
-
eligibleExpenditures: input.ieg.eligibleExpenditures,
|
|
1209
|
-
baseAmount: iegGroup.groupBaseAmount,
|
|
1210
|
-
expenditureLimit: allocation.allocations[0]?.allocated ?? 0,
|
|
1211
|
-
taxableCapital: iegGroup.groupTaxableCapital,
|
|
1212
|
-
...input.ieg.recapture !== void 0 ? { recapture: input.ieg.recapture } : {},
|
|
1213
|
-
...iegAgreement ? { associatedAllowedAmount: iegAgreement.claimantAllocatedAllowedAmount } : {}
|
|
1214
|
-
});
|
|
1215
1479
|
}
|
|
1216
1480
|
const schedulePayloads = [];
|
|
1217
1481
|
const sched = input.schedules;
|
|
@@ -1225,7 +1489,8 @@ function computeAlbertaReturn(input) {
|
|
|
1225
1489
|
if (sched?.dispositions) schedulePayloads.push(schedule18Values(sched.dispositions));
|
|
1226
1490
|
if (sched?.donations) schedulePayloads.push(schedule20Values(sched.donations));
|
|
1227
1491
|
if (sched?.losses) schedulePayloads.push(schedule21Values(sched.losses));
|
|
1228
|
-
if (ieg) schedulePayloads.push(schedule29Values(ieg, iegAgreement));
|
|
1492
|
+
if (ieg) schedulePayloads.push(schedule29Values(ieg, iegAgreement, iegEligibleExpenditures, input.ieg?.primaryFieldCode));
|
|
1493
|
+
if (at4970) schedulePayloads.push(schedule4970Values(at4970));
|
|
1229
1494
|
return {
|
|
1230
1495
|
allocationFactor,
|
|
1231
1496
|
albertaTax,
|
|
@@ -1233,6 +1498,7 @@ function computeAlbertaReturn(input) {
|
|
|
1233
1498
|
schedulePayloads,
|
|
1234
1499
|
...iegGroup ? { iegGroup } : {},
|
|
1235
1500
|
...iegAgreement ? { iegAgreement } : {},
|
|
1501
|
+
...iegEligibleExpenditures ? { iegEligibleExpenditures } : {},
|
|
1236
1502
|
...ieg ? { ieg } : {},
|
|
1237
1503
|
innovationEmploymentGrant: ieg?.ieg ?? 0,
|
|
1238
1504
|
issues
|
|
@@ -1382,6 +1648,7 @@ const AT1_MANDATORY_WITHOUT_DEFAULT = Object.freeze([
|
|
|
1382
1648
|
function assertAt1MandatoryComplete(d) {
|
|
1383
1649
|
const blank = (v) => v === void 0 || v === null || String(v).trim() === "";
|
|
1384
1650
|
const missing = AT1_MANDATORY_WITHOUT_DEFAULT.filter(([key]) => blank(d[key])).map(([, label]) => label);
|
|
1651
|
+
if (d.transmitter?.isAmended && blank(d.transmitter.amendmentDescription)) missing.push("EDI073 description of changes (required when the amended return indicator is set)");
|
|
1385
1652
|
if (missing.length > 0) throw new At1MandatoryFieldMissingError(missing);
|
|
1386
1653
|
}
|
|
1387
1654
|
/** Refuse to render when any critical mandatory field is absent. */
|
|
@@ -1741,6 +2008,16 @@ const AT1_EDI_LINE_ITEMS = [
|
|
|
1741
2008
|
id: "EDI041001",
|
|
1742
2009
|
get: (t) => t.contact.email,
|
|
1743
2010
|
fmt: "text"
|
|
2011
|
+
},
|
|
2012
|
+
{
|
|
2013
|
+
id: "EDI071001",
|
|
2014
|
+
get: (t) => t.isAmended ? "1" : void 0,
|
|
2015
|
+
fmt: "text"
|
|
2016
|
+
},
|
|
2017
|
+
{
|
|
2018
|
+
id: "EDI073001",
|
|
2019
|
+
get: (t) => t.isAmended ? t.amendmentDescription : void 0,
|
|
2020
|
+
fmt: "text"
|
|
1744
2021
|
}
|
|
1745
2022
|
];
|
|
1746
2023
|
//#endregion
|
|
@@ -2232,8 +2509,9 @@ function albertaCurrentYearLoss(result) {
|
|
|
2232
2509
|
*
|
|
2233
2510
|
* The STRAIGHT-LINE classes (13 leasehold interests, 14 limited-life intangibles)
|
|
2234
2511
|
* are deliberately NOT here — they use their own arithmetic in Reg 1100(1)(b) and
|
|
2235
|
-
* 1100(1)(c), so `computeCcaClass`
|
|
2236
|
-
*
|
|
2512
|
+
* 1100(1)(c), so `computeCcaClass` never looks them up in this table. It handles
|
|
2513
|
+
* an EXISTING opening-UCC pool for them directly (see `schedule8.ts`); a NEW
|
|
2514
|
+
* addition needs the full layer/property mechanics in `schedules/cca-straight-line.ts`.
|
|
2237
2515
|
*
|
|
2238
2516
|
* Class 14.1 IS a declining-balance class (5%) and belongs here. Its pre-2027
|
|
2239
2517
|
* transitional additional allowance — which keeps pre-2017 expenditures moving at
|
|
@@ -2519,19 +2797,79 @@ function computeClass141AdditionalAllowance(input) {
|
|
|
2519
2797
|
* Terminal loss: if the class is EMPTIED (no assets left) with positive UCC, the
|
|
2520
2798
|
* remaining UCC is deducted as a terminal loss, no CCA, closing UCC nil.
|
|
2521
2799
|
*
|
|
2522
|
-
*
|
|
2523
|
-
*
|
|
2524
|
-
* the
|
|
2800
|
+
* Class 13/14 (straight-line, Reg 1100(1)(b)/(c)): this function accepts them
|
|
2801
|
+
* too, but ONLY as an existing opening-UCC pool being drawn down — no rate, no
|
|
2802
|
+
* half-year rule, no AIIP; the claim is capped at the UCC before CCA and
|
|
2803
|
+
* nothing else. A current-year ADDITION on one of these classes is refused
|
|
2804
|
+
* (see `UnsupportedCcaClassError`) rather than silently claimed without the
|
|
2805
|
+
* 5-year floor / remaining-life proration Schedule III and Reg 1100(1)(c)
|
|
2806
|
+
* require for a NEW layer or property — that full mechanic is
|
|
2807
|
+
* `computeClass13` / `computeClass14` in `cca-straight-line.ts`, which this
|
|
2808
|
+
* entry point does not have layer/remaining-life data to drive.
|
|
2809
|
+
*
|
|
2810
|
+
* NOT modelled (caller / other schedules): a NEW class 13/14 addition (see
|
|
2811
|
+
* above), class 14.1's transitional additional allowance, the shared $1.5M
|
|
2812
|
+
* immediate-expensing limit across an associated group (caller passes the
|
|
2813
|
+
* already-capped eligible amount), and the 2024+ AIIP phase-out factor.
|
|
2525
2814
|
*/
|
|
2526
2815
|
var UnsupportedCcaClassError = class extends Error {
|
|
2527
2816
|
ccaClass;
|
|
2528
|
-
constructor(ccaClass) {
|
|
2529
|
-
super(`CCA class ${ccaClass} is not a declining-balance class this engine computes yet (straight-line / special classes like 13, 14, 14.1 use different mechanics).`);
|
|
2817
|
+
constructor(ccaClass, reason) {
|
|
2818
|
+
super(reason ?? `CCA class ${ccaClass} is not a declining-balance class this engine computes yet (straight-line / special classes like 13, 14, 14.1 use different mechanics).`);
|
|
2530
2819
|
this.name = "UnsupportedCcaClassError";
|
|
2531
2820
|
this.ccaClass = ccaClass;
|
|
2532
2821
|
}
|
|
2533
2822
|
};
|
|
2823
|
+
/** Class 13/14 accept only an opening-UCC drawdown here — see the file docstring. */
|
|
2824
|
+
const STRAIGHT_LINE_OPENING_BALANCE_ONLY = /* @__PURE__ */ new Set(["13", "14"]);
|
|
2825
|
+
/**
|
|
2826
|
+
* Class 13/14, opening-balance drawdown only: no rate, no half-year rule, no
|
|
2827
|
+
* AIIP, no immediate expensing — none of those concepts apply to a
|
|
2828
|
+
* straight-line class. The claim is simply capped at the UCC before CCA.
|
|
2829
|
+
* Recapture and terminal loss reuse the same general rules as every other
|
|
2830
|
+
* class (s.13(1) / s.20(16) are not declining-balance-specific).
|
|
2831
|
+
*/
|
|
2832
|
+
function computeStraightLineOpeningBalanceClass(input) {
|
|
2833
|
+
if (Math.max(0, input.additions ?? 0) > 0) throw new UnsupportedCcaClassError(input.ccaClass, `CCA class ${input.ccaClass}: a current-year addition needs the detailed leasehold/limited-life schedule (computeClass13 / computeClass14 in cca-straight-line.ts), which this entry point has no lease-term / remaining-life data to drive. Drawing down an EXISTING opening balance (no addition this year) is supported directly.`);
|
|
2834
|
+
const dispositions = Math.max(0, input.dispositions ?? 0);
|
|
2835
|
+
const netAdjustments = input.netAdjustments ?? 0;
|
|
2836
|
+
const uccBeforeCca = input.openingUCC + netAdjustments - dispositions;
|
|
2837
|
+
const base = {
|
|
2838
|
+
ccaClass: input.ccaClass,
|
|
2839
|
+
rate: 0,
|
|
2840
|
+
uccBeforeCca,
|
|
2841
|
+
immediateExpensingClaim: 0,
|
|
2842
|
+
halfYearAdjustment: 0,
|
|
2843
|
+
aiipEnhancement: 0,
|
|
2844
|
+
ccaBase: 0,
|
|
2845
|
+
maxCca: 0,
|
|
2846
|
+
ccaClaimed: 0,
|
|
2847
|
+
closingUCC: 0,
|
|
2848
|
+
recapture: 0,
|
|
2849
|
+
terminalLoss: 0
|
|
2850
|
+
};
|
|
2851
|
+
if (uccBeforeCca < 0) return {
|
|
2852
|
+
...base,
|
|
2853
|
+
closingUCC: 0,
|
|
2854
|
+
recapture: -uccBeforeCca
|
|
2855
|
+
};
|
|
2856
|
+
if (input.classEmptied && uccBeforeCca > 0) return {
|
|
2857
|
+
...base,
|
|
2858
|
+
closingUCC: 0,
|
|
2859
|
+
terminalLoss: uccBeforeCca
|
|
2860
|
+
};
|
|
2861
|
+
const maxCca = uccBeforeCca;
|
|
2862
|
+
const ccaClaimed = input.claim != null ? Math.min(Math.max(0, input.claim), maxCca) : maxCca;
|
|
2863
|
+
return {
|
|
2864
|
+
...base,
|
|
2865
|
+
ccaBase: uccBeforeCca,
|
|
2866
|
+
maxCca,
|
|
2867
|
+
ccaClaimed,
|
|
2868
|
+
closingUCC: uccBeforeCca - ccaClaimed
|
|
2869
|
+
};
|
|
2870
|
+
}
|
|
2534
2871
|
function computeCcaClass(input, rates = CCA_DECLINING_BALANCE_RATES_2024, prorationFactor = 1) {
|
|
2872
|
+
if (STRAIGHT_LINE_OPENING_BALANCE_ONLY.has(input.ccaClass)) return computeStraightLineOpeningBalanceClass(input);
|
|
2535
2873
|
const rate = rates[input.ccaClass];
|
|
2536
2874
|
if (rate === void 0) throw new UnsupportedCcaClassError(input.ccaClass);
|
|
2537
2875
|
const additions = Math.max(0, input.additions ?? 0);
|
|
@@ -6389,4 +6727,4 @@ function computeMpDeduction(input, rates = MP_RATES_2024) {
|
|
|
6389
6727
|
};
|
|
6390
6728
|
}
|
|
6391
6729
|
//#endregion
|
|
6392
|
-
export { computeProvincialAllocation as $, at1TaxPayableDeductions as $n, CEC_DEDUCTION_RATE as $t, runConformance as A, reconcileAlbertaNetIncome as An,
|
|
6730
|
+
export { computeProvincialAllocation as $, at1TaxPayableDeductions as $n, CEC_DEDUCTION_RATE as $t, runConformance as A, reconcileAlbertaNetIncome as An, schedule29Values as Ar, computeCcpcActiveBusinessTax as At, computeGrip as B, formatRsiText as Bn, earliestRateYear as Br, AT1_DONATION_GAIN_RATE as Bt, computeQuebecTax as C, albertaCcaScheduleAdjustments as Cn, schedule13Values as Cr, blendProvinceRateTable as Ct, T2_LINE_META as D, albertaReserveDifference as Dn, schedule1Values as Dr, dividendsDeductibleS112 as Dt, resolveQuebecTaxRates as E, albertaRecaptureDifference as En, schedule18Values as Er, computeTaxableIncome as Et, normalizeSchedule88 as F, RSI_NEGATIVE_PREFIX as Fn, AB_GENERAL_RATE_BANDS as Fr, CORP_TAX_RATE_BOOK as Ft, ITC_RECAPTURE_PERIOD_YEARS as G, AT1_CRITICAL_MANDATORY_FIELDS as Gn, SECTION_34_2_GROSS_UP as Gt, LARGE_CORPORATION_THRESHOLD as H, renderRsiHeader as Hn, hasExactRateYear as Hr, computeDonationMaximum as Ht, computeSchedule55 as I, RSI_WORD_GAP as In, computeDayWeightedGeneralTax as Ir, resolveCorpTaxRates as It, allocateEvenly as J, At1TaxPayableMismatchError as Jn, AT1_RESERVE_LINES as Jt, computeItcRecapture as K, At1CriticalFieldMissingError as Kn, computeAlbertaSchedule18 as Kt, LRIP_INVESTMENT_CORPORATION_MULTIPLE as L, RsiLineItemError as Ln, AB_TAX_2024 as Lr, T2_CERTIFICATION_FIXTURES as Lt, computeFederalT2 as M, computeLossCarryback as Mn, schedule4970Values as Mr, computeBusinessLimit as Mt, computeSchedule101 as N, RSI_COLUMN_GAP as Nn, computeAlbertaTax as Nr, computeSBD as Nt, foldT2Lines as O, albertaTerminalLossDifference as On, schedule20Values as Or, netCapitalLossApplied as Ot, SCHEDULE_88_MAX_URLS as P, RSI_DELIMITER as Pn, computeAlbertaSbd as Pr, CORP_TAX_2024 as Pt, computeSchedule6 as Q, assertCriticalFields as Qn, computeAlbertaSchedule16 as Qt, LRIP_INVESTMENT_INCOME_FACTOR as R, formatRsiAmount as Rn, AB_TAX_RATE_BOOK as Rr, computeLossSchedule as Rt, computeQuebecAllocationFactor as S, albertaCcaDifference as Sn, schedule12Values as Sr, resolveProvinceRates as St, QC_TAX_RATE_BOOK as T, albertaDispositionAdjustments as Tn, schedule17Values as Tr, charitableDonationsDeduction as Tt, computeTaxableCapital as U, renderRsiLineItem as Un, latestRateYear as Ur, computeSchedule20 as Ut, computeSchedule43 as V, renderAt1Rsi as Vn, extendRateBook as Vr, AT1_DONATION_INCOME_RATE as Vt, computeSchedule31 as W, renderAt1NetFile as Wn, resolveRates as Wr, AT1_DISPOSITION_CATEGORIES as Wt, computeSchedule21 as X, assertAt1MandatoryComplete as Xn, computeAlbertaSchedule17 as Xt, computeBusinessLimitAllocation as Y, albertaBalanceUnpaid as Yn, AT1_RESERVE_TOTAL_LINES as Yt, computeSchedule13 as Z, assertAt1TaxPayableReconciles as Zn, assistanceFrom as Zt, renderT2DraftReturn as _, CCA_RATE_BOOK as _n, AT1_SCHEDULES_WITHOUT_BUILDERS as _r, EIFEL_EFFECTIVE_FROM as _t, PART_VI_1_DEDUCTION_BANDS as a, computeCcaClass as an, allocateIegExpenditureLimit as ar, computeSchedule2 as at, co17Engine as b, albertaAbilDifference as bn, schedule10Values as br, PROVINCE_RATE_BOOK as bt, EIFEL_FIRST_YEAR_START as c, CLASS_14_1_MINIMUM_DEDUCTION as cn, IEG_2024 as cr, assertSchedule1Fileable as ct, EIFEL_TRANSITIONAL_RATIO as d, MIN_LEASEHOLD_PERIODS as dn, computeIegReductionFactor as dr, deferredIncomeTaxProvisionAddBack as dt, CEC_INCLUSION_RATE as en, at1YesNo as er, computeSchedule5 as et, computeEifelLimitation as f, computeClass13 as fn, computeIegEligibleExpenditures as fr, findSchedule1LineDefects as ft, computeT2Settlement as g, CCA_DECLINING_BALANCE_RATES_2024 as gn, computeAt4970 as gr, terminalLossDeduction as gt, computeAdjustedTaxableIncome as h, leaseholdPeriods as hn, computeAllocationFactor as hr, recaptureAddBack as ht, computeMpDeduction as i, UnsupportedCcaClassError as in, allocateIegEvenly as ir, computePart4Rdtoh as it, runConformanceSuite as j, LossCarrybackError as jn, schedule2Values as jr, computePartITax as jt, formatConformanceReport as k, computeSchedule12 as kn, schedule21Values as kr, nonCapitalLossApplied as kt, EIFEL_STANDARD_RATIO as l, CLASS_14_1_TRANSITIONAL_RATE as ln, computeIeg as lr, ccaDeduction as lt, FOREIGN_TAX_CREDIT_GROSS_UP as m, computeClass141AdditionalAllowance as mn, SINGLE_JURISDICTION_ALBERTA_FACTOR as mr, mealsAndEntertainmentAddBack as mt, MP_GROSS_REVENUE_THRESHOLD as n, computeAlbertaSchedule14 as nn, at1Engine as nr, PART_IV_RATE as nt, computePartVI1Deduction as o, computeCcaSchedule as on, computeIegAgreement as or, Schedule1NotFileableError as ot, ratioOfPermissibleExpenses as p, computeClass14 as pn, iegT661SourceLine as pr, incomeTaxProvisionAddBack as pt, computeZetm as q, At1MandatoryFieldMissingError as qn, AT1_RESERVE_KINDS as qt, MP_RATES_2024 as r, computeAlbertaSchedule13 as rn, computeAlbertaReturn as rr, REFUNDABLE_PART_I_RATE as rt, partVI1DeductionMultiple as s, computeSchedule8 as sn, computeIegGroupFigures as sr, amortizationAddBack as st, MP_EXCLUDED_ACTIVITIES as t, cecScheduleAppliesToTaxYear as tn, xmlEscape as tr, computeSchedule4Losses as tt, EIFEL_STANDARD_RATIO_FROM as u, MAX_LEASEHOLD_PERIODS as un, computeIegBaseAmount as ur, computeSchedule1 as ut, t2Engine as v, isDecliningBalanceClass as vn, AT1_SCHEDULES_WITH_BUILDERS as vr, assessEifel as vt, QC_TAX_2024 as w, albertaCurrentYearLoss as wn, schedule16Values as wr, dayWeightedRate as wt, computeQuebecReturn as x, albertaCapitalGainDifference as xn, schedule12LossDeductions as xr, isSchedule5Province as xt, renderCo17DraftReturn as y, resolveCcaRates as yn, at1LineItemId as yr, PROVINCE_RATES_2024 as yt, computeSchedule54 as z, formatRsiDate as zn, resolveAlbertaTaxRates as zr, computeLossContinuity as zt };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@classytic/ca-tax",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "Canadian corporate tax engine for @classytic/tax-core — federal T2, Alberta AT1 and Québec CO-17 with form definitions traced to the published forms, plus GST/HST/PST/QST with dated provincial regimes.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -63,7 +63,8 @@
|
|
|
63
63
|
"lint": "biome check src/ tests/",
|
|
64
64
|
"lint:fix": "biome check src/ tests/ --write",
|
|
65
65
|
"check": "biome ci src/ tests/ --diagnostic-level=error",
|
|
66
|
-
"prepublishOnly": "npm run check && npm run build && npm run typecheck && npm test"
|
|
66
|
+
"prepublishOnly": "npm run check && npm run build && npm run typecheck && npm test",
|
|
67
|
+
"push": "classytic-push"
|
|
67
68
|
},
|
|
68
69
|
"peerDependencies": {
|
|
69
70
|
"@classytic/primitives": ">=0.9.0",
|
|
@@ -71,6 +72,7 @@
|
|
|
71
72
|
},
|
|
72
73
|
"devDependencies": {
|
|
73
74
|
"@biomejs/biome": "^2.4.10",
|
|
75
|
+
"@classytic/dev-tools": "^0.2.1",
|
|
74
76
|
"@classytic/primitives": "^0.9.0",
|
|
75
77
|
"@classytic/tax-core": "^0.1.0",
|
|
76
78
|
"@types/node": "^25.6.0",
|