@paro.io/expert-shared-components 1.14.42 → 1.14.45
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/LICENSE +21 -21
- package/README.md +2 -2
- package/lib/README.md +2 -0
- package/lib/components/ClientReferencesSection/DeleteButton.js +11 -11
- package/lib/components/ClientReferencesSection/ParoError.js +10 -10
- package/lib/components/ClientReferencesSection/TagsSection.js +2 -2
- package/lib/components/ClientReferencesSection/styles/BrandedTypography.js +2 -2
- package/lib/components/ClientReferencesSection/styles/Buttons.js +15 -15
- package/lib/components/ClientReferencesSection/styles/Name.js +5 -5
- package/lib/components/ClientReferencesSection/styles/NullContentConditionalColor.js +4 -4
- package/lib/components/ClientReferencesSection/styles/SectionBody.js +11 -11
- package/lib/components/ClientReferencesSection/styles/SectionTitle.js +6 -6
- package/lib/components/ClientReferencesSection/styles/Tags.js +2 -2
- package/lib/components/DiscussionThread/DiscussionThread.d.ts +25 -25
- package/lib/components/DiscussionThread/DiscussionThread.js +137 -137
- package/lib/components/DiscussionThread/chat.d.ts +22 -22
- package/lib/components/DiscussionThread/chat.js +106 -106
- package/lib/components/DiscussionThread/index.d.ts +1 -1
- package/lib/components/DiscussionThread/index.js +5 -5
- package/lib/components/DocumentCenter/DocumentTable.d.ts +15 -15
- package/lib/components/DocumentCenter/DocumentTable.js +350 -350
- package/lib/components/DocumentCenter/DragDropUpload.js +4 -4
- package/lib/components/DocumentCenter/MultiFileUploadSection.js +18 -51
- package/lib/components/DocumentCenter/UploadFilesButton.d.ts +6 -6
- package/lib/components/DocumentCenter/UploadFilesButton.js +29 -29
- package/lib/components/EarningsTracker/ActiveProjectCard.d.ts +52 -52
- package/lib/components/EarningsTracker/ActiveProjectCard.js +161 -161
- package/lib/components/EarningsTracker/CenterCardUI.d.ts +13 -13
- package/lib/components/EarningsTracker/CenterCardUI.js +134 -134
- package/lib/components/EarningsTracker/EarningsTracker.d.ts +52 -52
- package/lib/components/EarningsTracker/EarningsTracker.js +508 -508
- package/lib/components/EarningsTracker/EditDateModal.d.ts +22 -22
- package/lib/components/EarningsTracker/EditDateModal.js +149 -149
- package/lib/components/EarningsTracker/EmailModal.d.ts +14 -14
- package/lib/components/EarningsTracker/EmailModal.js +79 -79
- package/lib/components/EarningsTracker/EndProjectModal.d.ts +56 -56
- package/lib/components/EarningsTracker/EndProjectModal.js +221 -221
- package/lib/components/EarningsTracker/LeftCardUI.d.ts +18 -18
- package/lib/components/EarningsTracker/LeftCardUI.js +189 -189
- package/lib/components/EarningsTracker/LogTimeModalAuthenticated.d.ts +52 -52
- package/lib/components/EarningsTracker/LogTimeModalAuthenticated.js +358 -358
- package/lib/components/EarningsTracker/ProgressBar.d.ts +4 -4
- package/lib/components/EarningsTracker/ProgressBar.js +66 -66
- package/lib/components/EarningsTracker/ReviewRequestModal.d.ts +17 -17
- package/lib/components/EarningsTracker/ReviewRequestModal.js +135 -135
- package/lib/components/EarningsTracker/RightCardUI.d.ts +46 -46
- package/lib/components/EarningsTracker/RightCardUI.js +231 -231
- package/lib/components/EarningsTracker/index.d.ts +1 -1
- package/lib/components/EarningsTracker/index.js +5 -5
- package/lib/components/Escalations/CustomTag.d.ts +3 -3
- package/lib/components/Escalations/CustomTag.js +25 -25
- package/lib/components/Escalations/ViewReponseModal.d.ts +8 -8
- package/lib/components/Escalations/ViewReponseModal.js +27 -27
- package/lib/components/ExpertProfileHeader/ActionButtonSection.js +6 -6
- package/lib/components/ExpertProfileHeader/ProfileSection.js +7 -7
- package/lib/components/Invoices/TestDecisionSection.d.ts +1 -1
- package/lib/components/Invoices/TestDecisionSection.js +126 -126
- package/lib/components/OrganizationChart/OrganizationChart.d.ts +15 -15
- package/lib/components/OrganizationChart/OrganizationChart.js +312 -312
- package/lib/components/OrganizationChart/PersonCard.js +5 -5
- package/lib/components/OrganizationChart/utils.js +79 -79
- package/lib/components/ProjectCard/ProgressBar.js +4 -4
- package/lib/components/ProjectCard/ReviewRequestModal.js +5 -5
- package/lib/components/ProjectIntelligence/MissingInformation/index.js +1 -1
- package/lib/components/Reviews/Pagination.js +6 -6
- package/lib/components/ReviewsTab/RatingHeader.js +6 -6
- package/lib/components/ReviewsTab/expert-shared-components.code-workspace +20 -20
- package/lib/components/ReviewsTab/reviewRequestModal.js +5 -5
- package/lib/components/shared/Image.js +13 -13
- package/lib/components/shared/ProfileTextField.d.ts +18 -18
- package/lib/components/shared/ProfileTextField.js +16 -16
- package/lib/components/shared/StyledActionButtons.d.ts +7 -7
- package/lib/components/shared/StyledActionButtons.js +15 -15
- package/lib/components/shared/ToastNotification.d.ts +10 -10
- package/lib/components/shared/ToastNotification.js +63 -63
- package/lib/index.d.ts +13 -0
- package/lib/index.js +27 -1
- package/lib/package.json +68 -0
- package/lib/tax-axis/components/clientReport/ClientReportCover.d.ts +9 -0
- package/lib/tax-axis/components/clientReport/ClientReportCover.js +39 -0
- package/lib/tax-axis/components/clientReport/ClientReportTOC.d.ts +8 -0
- package/lib/tax-axis/components/clientReport/ClientReportTOC.js +24 -0
- package/lib/tax-axis/components/clientReport/ClientReportToolbar.d.ts +2 -0
- package/lib/tax-axis/components/clientReport/ClientReportToolbar.js +6 -0
- package/lib/tax-axis/components/clientReport/ETRChart.d.ts +10 -0
- package/lib/tax-axis/components/clientReport/ETRChart.js +50 -0
- package/lib/tax-axis/components/clientReport/ExecutiveSummary.d.ts +15 -0
- package/lib/tax-axis/components/clientReport/ExecutiveSummary.js +73 -0
- package/lib/tax-axis/components/clientReport/FootnoteBlock.d.ts +11 -0
- package/lib/tax-axis/components/clientReport/FootnoteBlock.js +34 -0
- package/lib/tax-axis/components/clientReport/ImplementationRoadmap.d.ts +26 -0
- package/lib/tax-axis/components/clientReport/ImplementationRoadmap.js +51 -0
- package/lib/tax-axis/components/clientReport/ImplementationTimelineChart.d.ts +10 -0
- package/lib/tax-axis/components/clientReport/ImplementationTimelineChart.js +49 -0
- package/lib/tax-axis/components/clientReport/Methodology.d.ts +10 -0
- package/lib/tax-axis/components/clientReport/Methodology.js +40 -0
- package/lib/tax-axis/components/clientReport/QuarterlyCashChart.d.ts +10 -0
- package/lib/tax-axis/components/clientReport/QuarterlyCashChart.js +56 -0
- package/lib/tax-axis/components/clientReport/RecommendedStrategies.d.ts +13 -0
- package/lib/tax-axis/components/clientReport/RecommendedStrategies.js +51 -0
- package/lib/tax-axis/components/clientReport/SavingsStackChart.d.ts +10 -0
- package/lib/tax-axis/components/clientReport/SavingsStackChart.js +66 -0
- package/lib/tax-axis/components/clientReport/SectionOpener.d.ts +11 -0
- package/lib/tax-axis/components/clientReport/SectionOpener.js +20 -0
- package/lib/tax-axis/components/clientReport/Sidebar.d.ts +8 -0
- package/lib/tax-axis/components/clientReport/Sidebar.js +37 -0
- package/lib/tax-axis/components/clientReport/StrategyCard.d.ts +16 -0
- package/lib/tax-axis/components/clientReport/StrategyCard.js +63 -0
- package/lib/tax-axis/components/clientReport/TaxAxisClientReport.d.ts +9 -0
- package/lib/tax-axis/components/clientReport/TaxAxisClientReport.js +125 -0
- package/lib/tax-axis/components/clientReport/applyFootnotes.d.ts +12 -0
- package/lib/tax-axis/components/clientReport/applyFootnotes.js +43 -0
- package/lib/tax-axis/components/clientReport/palette.d.ts +28 -0
- package/lib/tax-axis/components/clientReport/palette.js +34 -0
- package/lib/tax-axis/components/dashboard/ConfidenceArc.d.ts +7 -0
- package/lib/tax-axis/components/dashboard/ConfidenceArc.js +20 -0
- package/lib/tax-axis/components/dashboard/DashboardActions.d.ts +13 -0
- package/lib/tax-axis/components/dashboard/DashboardActions.js +96 -0
- package/lib/tax-axis/components/dashboard/DashboardSummary.d.ts +11 -0
- package/lib/tax-axis/components/dashboard/DashboardSummary.js +98 -0
- package/lib/tax-axis/components/dashboard/DashboardTopBar.d.ts +10 -0
- package/lib/tax-axis/components/dashboard/DashboardTopBar.js +48 -0
- package/lib/tax-axis/components/dashboard/StrategyDetailPanel.d.ts +10 -0
- package/lib/tax-axis/components/dashboard/StrategyDetailPanel.js +139 -0
- package/lib/tax-axis/components/dashboard/StrategyTile.d.ts +10 -0
- package/lib/tax-axis/components/dashboard/StrategyTile.js +82 -0
- package/lib/tax-axis/components/dashboard/TaxAxisDashboard.d.ts +12 -0
- package/lib/tax-axis/components/dashboard/TaxAxisDashboard.js +284 -0
- package/lib/tax-axis/components/dashboard/useCountUp.d.ts +1 -0
- package/lib/tax-axis/components/dashboard/useCountUp.js +25 -0
- package/lib/tax-axis/components/documents/DocumentCard.d.ts +18 -0
- package/lib/tax-axis/components/documents/DocumentCard.js +61 -0
- package/lib/tax-axis/components/documents/DocumentTier.d.ts +21 -0
- package/lib/tax-axis/components/documents/DocumentTier.js +23 -0
- package/lib/tax-axis/components/documents/TaxAxisDocuments.d.ts +8 -0
- package/lib/tax-axis/components/documents/TaxAxisDocuments.js +157 -0
- package/lib/tax-axis/components/extractionReview/DocumentCard.d.ts +17 -0
- package/lib/tax-axis/components/extractionReview/DocumentCard.js +105 -0
- package/lib/tax-axis/components/extractionReview/FieldRow.d.ts +17 -0
- package/lib/tax-axis/components/extractionReview/FieldRow.js +137 -0
- package/lib/tax-axis/components/extractionReview/PurposeBlock.d.ts +7 -0
- package/lib/tax-axis/components/extractionReview/PurposeBlock.js +18 -0
- package/lib/tax-axis/components/extractionReview/RerunFooter.d.ts +8 -0
- package/lib/tax-axis/components/extractionReview/RerunFooter.js +60 -0
- package/lib/tax-axis/components/extractionReview/TaxAxisExtractionReview.d.ts +11 -0
- package/lib/tax-axis/components/extractionReview/TaxAxisExtractionReview.js +186 -0
- package/lib/tax-axis/components/intake/ClientParametersSection.d.ts +7 -0
- package/lib/tax-axis/components/intake/ClientParametersSection.js +146 -0
- package/lib/tax-axis/components/intake/CpaIntakeQuestionsSection.d.ts +7 -0
- package/lib/tax-axis/components/intake/CpaIntakeQuestionsSection.js +93 -0
- package/lib/tax-axis/components/intake/IntakeCtaCards.d.ts +9 -0
- package/lib/tax-axis/components/intake/IntakeCtaCards.js +30 -0
- package/lib/tax-axis/components/intake/RefineAnalysisSection.d.ts +7 -0
- package/lib/tax-axis/components/intake/RefineAnalysisSection.js +151 -0
- package/lib/tax-axis/components/intake/StateMultiSelect.d.ts +7 -0
- package/lib/tax-axis/components/intake/StateMultiSelect.js +90 -0
- package/lib/tax-axis/components/intake/StrategyRadar.d.ts +7 -0
- package/lib/tax-axis/components/intake/StrategyRadar.js +240 -0
- package/lib/tax-axis/components/intake/TaxAxisIntake.d.ts +8 -0
- package/lib/tax-axis/components/intake/TaxAxisIntake.js +38 -0
- package/lib/tax-axis/components/intake/intakeSchema.d.ts +97 -0
- package/lib/tax-axis/components/intake/intakeSchema.js +91 -0
- package/lib/tax-axis/components/preparerWorkpaper/CalculationTraceAccordion.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/CalculationTraceAccordion.js +19 -0
- package/lib/tax-axis/components/preparerWorkpaper/EngagementHeader.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/EngagementHeader.js +43 -0
- package/lib/tax-axis/components/preparerWorkpaper/Position6694Accordion.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/Position6694Accordion.js +25 -0
- package/lib/tax-axis/components/preparerWorkpaper/PriorityGroup.d.ts +14 -0
- package/lib/tax-axis/components/preparerWorkpaper/PriorityGroup.js +20 -0
- package/lib/tax-axis/components/preparerWorkpaper/Section6694Summary.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/Section6694Summary.js +36 -0
- package/lib/tax-axis/components/preparerWorkpaper/SourceDocumentsAccordion.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/SourceDocumentsAccordion.js +20 -0
- package/lib/tax-axis/components/preparerWorkpaper/StrategyWorkpaperCard.d.ts +14 -0
- package/lib/tax-axis/components/preparerWorkpaper/StrategyWorkpaperCard.js +53 -0
- package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.d.ts +9 -0
- package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.js +175 -0
- package/lib/tax-axis/components/presentationMode/TaxAxisPresentationMode.d.ts +7 -0
- package/lib/tax-axis/components/presentationMode/TaxAxisPresentationMode.js +245 -0
- package/lib/tax-axis/components/processing/ProcessingStages.d.ts +7 -0
- package/lib/tax-axis/components/processing/ProcessingStages.js +17 -0
- package/lib/tax-axis/components/processing/TaxAxisProcessing.d.ts +7 -0
- package/lib/tax-axis/components/processing/TaxAxisProcessing.js +105 -0
- package/lib/tax-axis/components/prospectReport/ProspectCover.d.ts +10 -0
- package/lib/tax-axis/components/prospectReport/ProspectCover.js +47 -0
- package/lib/tax-axis/components/prospectReport/ProspectDocuments.d.ts +9 -0
- package/lib/tax-axis/components/prospectReport/ProspectDocuments.js +31 -0
- package/lib/tax-axis/components/prospectReport/ProspectNextSteps.d.ts +13 -0
- package/lib/tax-axis/components/prospectReport/ProspectNextSteps.js +37 -0
- package/lib/tax-axis/components/prospectReport/ProspectPrintView.d.ts +26 -0
- package/lib/tax-axis/components/prospectReport/ProspectPrintView.js +183 -0
- package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.d.ts +10 -0
- package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.js +52 -0
- package/lib/tax-axis/components/prospectReport/SampleAnalysisPreview.d.ts +7 -0
- package/lib/tax-axis/components/prospectReport/SampleAnalysisPreview.js +120 -0
- package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.d.ts +9 -0
- package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.js +173 -0
- package/lib/tax-axis/components/prospectReport/TaxPositionGap.d.ts +15 -0
- package/lib/tax-axis/components/prospectReport/TaxPositionGap.js +45 -0
- package/lib/tax-axis/components/prospectReport/theme.d.ts +26 -0
- package/lib/tax-axis/components/prospectReport/theme.js +33 -0
- package/lib/tax-axis/components/shared/ReportToolbar.d.ts +12 -0
- package/lib/tax-axis/components/shared/ReportToolbar.js +81 -0
- package/lib/tax-axis/components/shared/SectionHeader.d.ts +8 -0
- package/lib/tax-axis/components/shared/SectionHeader.js +15 -0
- package/lib/tax-axis/components/shared/TaxAxisBadge.d.ts +12 -0
- package/lib/tax-axis/components/shared/TaxAxisBadge.js +34 -0
- package/lib/tax-axis/components/shared/TaxAxisButton.d.ts +12 -0
- package/lib/tax-axis/components/shared/TaxAxisButton.js +17 -0
- package/lib/tax-axis/components/shared/TaxAxisCard.d.ts +9 -0
- package/lib/tax-axis/components/shared/TaxAxisCard.js +13 -0
- package/lib/tax-axis/index.d.ts +25 -0
- package/lib/tax-axis/index.js +51 -0
- package/lib/tax-axis/lib/compute/index.d.ts +8 -0
- package/lib/tax-axis/lib/compute/index.js +163 -0
- package/lib/tax-axis/lib/data/documents.d.ts +3 -0
- package/lib/tax-axis/lib/data/documents.js +33 -0
- package/lib/tax-axis/lib/data/extractedData.d.ts +2 -0
- package/lib/tax-axis/lib/data/extractedData.js +47 -0
- package/lib/tax-axis/lib/data/footnoteData.d.ts +2 -0
- package/lib/tax-axis/lib/data/footnoteData.js +48 -0
- package/lib/tax-axis/lib/data/index.d.ts +11 -0
- package/lib/tax-axis/lib/data/index.js +31 -0
- package/lib/tax-axis/lib/data/nextSteps.d.ts +2 -0
- package/lib/tax-axis/lib/data/nextSteps.js +35 -0
- package/lib/tax-axis/lib/data/sidebarLookup.d.ts +2 -0
- package/lib/tax-axis/lib/data/sidebarLookup.js +90 -0
- package/lib/tax-axis/lib/data/sourceDescriptions.d.ts +1 -0
- package/lib/tax-axis/lib/data/sourceDescriptions.js +32 -0
- package/lib/tax-axis/lib/data/states.d.ts +6 -0
- package/lib/tax-axis/lib/data/states.js +25 -0
- package/lib/tax-axis/lib/data/strategies.d.ts +8 -0
- package/lib/tax-axis/lib/data/strategies.js +166 -0
- package/lib/tax-axis/lib/data/strategyNarrative.d.ts +3 -0
- package/lib/tax-axis/lib/data/strategyNarrative.js +170 -0
- package/lib/tax-axis/lib/data/strategyProspect.d.ts +2 -0
- package/lib/tax-axis/lib/data/strategyProspect.js +66 -0
- package/lib/tax-axis/lib/data/workpaperInteractions.d.ts +1 -0
- package/lib/tax-axis/lib/data/workpaperInteractions.js +15 -0
- package/lib/tax-axis/lib/types/index.d.ts +183 -0
- package/lib/tax-axis/lib/types/index.js +7 -0
- package/package.json +68 -67
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
3
|
+
// TaxAxis — Pure computation & formatting (no React / JSX / hooks)
|
|
4
|
+
// Verbatim from the mock (App.jsx:398-514) + spec-canonical helpers.
|
|
5
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.fmtDollar = exports.fmtK = exports.fmtSavings = exports.fmtTax = exports.parseNum = void 0;
|
|
8
|
+
exports.filterEligibleStrategies = filterEligibleStrategies;
|
|
9
|
+
exports.computeAllStrategies = computeAllStrategies;
|
|
10
|
+
const data_1 = require("../data");
|
|
11
|
+
/* ═══ FORMAT HELPERS (spec-canonical, G7b-fix: string concatenation) ═══ */
|
|
12
|
+
const parseNum = (s) => parseInt((s || "0").toString().replace(/[$,]/g, "")) || 0;
|
|
13
|
+
exports.parseNum = parseNum;
|
|
14
|
+
const fmtTax = (n) => n >= 1000000 ? "$" + (n / 1000000).toFixed(1) + "M" : "$" + Math.round(n / 1000) + "K";
|
|
15
|
+
exports.fmtTax = fmtTax;
|
|
16
|
+
const fmtSavings = (n) => n >= 1000000 ? "$" + (n / 1000000).toFixed(1) + "M" : "$" + Math.round(n / 1000) + "K";
|
|
17
|
+
exports.fmtSavings = fmtSavings;
|
|
18
|
+
const fmtK = (n) => n >= 1000000 ? "$" + (n / 1000000).toFixed(1) + "M" : "$" + Math.round(n / 1000) + "K";
|
|
19
|
+
exports.fmtK = fmtK;
|
|
20
|
+
const fmtDollar = (n) => n.toLocaleString("en-US");
|
|
21
|
+
exports.fmtDollar = fmtDollar;
|
|
22
|
+
/* ═══ ENTITY_TO_BUCKETS — EntityType → StrategyEntityBucket mapping ═══ */
|
|
23
|
+
const ENTITY_TO_BUCKETS = {
|
|
24
|
+
"S-Corporation": ["S-Corporation"],
|
|
25
|
+
"C-Corporation": ["C-Corporation"],
|
|
26
|
+
"LLC": ["Partnership/LLC"],
|
|
27
|
+
"Partnership": ["Partnership/LLC"],
|
|
28
|
+
"Sole Proprietor": ["Sole Proprietorship"],
|
|
29
|
+
};
|
|
30
|
+
/* ═══ filterEligibleStrategies — de-duplicated from 5× inline predicate ═══ */
|
|
31
|
+
function filterEligibleStrategies(profile) {
|
|
32
|
+
const industry = profile.industry || "";
|
|
33
|
+
const employees = parseInt(profile.employees || "0") || 0;
|
|
34
|
+
const ownerComp = parseInt((profile.ownerComp || "0").replace(/,/g, "")) || 0;
|
|
35
|
+
const states = profile.states || [];
|
|
36
|
+
const hasPTE = states.some(s => data_1.PTE_STATES.has(s));
|
|
37
|
+
return data_1.STRATEGIES.filter(s => {
|
|
38
|
+
const buckets = ENTITY_TO_BUCKETS[profile.entity];
|
|
39
|
+
if (!buckets.some(b => s.entities.includes(b)))
|
|
40
|
+
return false;
|
|
41
|
+
if (s.needsPTE && !hasPTE)
|
|
42
|
+
return false;
|
|
43
|
+
if (s.onlyIndustry && !s.onlyIndustry.includes(industry))
|
|
44
|
+
return false;
|
|
45
|
+
if (s.excludeIndustry && s.excludeIndustry.includes(industry))
|
|
46
|
+
return false;
|
|
47
|
+
if (s.minEmployees && employees < s.minEmployees)
|
|
48
|
+
return false;
|
|
49
|
+
if (s.needsOwnerComp && ownerComp <= 0)
|
|
50
|
+
return false;
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/* ═══ computeAllStrategies — verbatim from App.jsx:400-514 ═══ */
|
|
55
|
+
function computeAllStrategies(profile) {
|
|
56
|
+
const rev = (0, exports.parseNum)(profile.revenue);
|
|
57
|
+
const net = (0, exports.parseNum)(profile.netIncome) || Math.round(rev * 0.3);
|
|
58
|
+
const ownerComp = (0, exports.parseNum)(profile.ownerComp);
|
|
59
|
+
const equip = (0, exports.parseNum)(profile.equipmentPurchased);
|
|
60
|
+
const reValue = (0, exports.parseNum)(profile.realEstateValue);
|
|
61
|
+
const overtime = (0, exports.parseNum)(profile.overtimePremium);
|
|
62
|
+
const age = parseInt(profile.age || "45") || 45;
|
|
63
|
+
const hsaExisting = (0, exports.parseNum)(profile.hsaContributions);
|
|
64
|
+
const retirementExisting = (0, exports.parseNum)(profile.retirementContributions);
|
|
65
|
+
const fedRate = parseFloat((profile.federalRate || "24").replace("%", "")) / 100 || 0.24;
|
|
66
|
+
const stateRate = parseFloat(profile.stateRate || "4.95") / 100;
|
|
67
|
+
const combinedRate = fedRate + stateRate;
|
|
68
|
+
const seTaxRate = 0.153;
|
|
69
|
+
const sstb = profile.sstb || "No";
|
|
70
|
+
const filingStatus = profile.filingStatus || "MFJ";
|
|
71
|
+
const isMFJ = filingStatus === "MFJ" || filingStatus.includes("Joint");
|
|
72
|
+
const qbiThreshold = isMFJ ? 383900 : 191950;
|
|
73
|
+
const results = new Map();
|
|
74
|
+
/* #1 Business Entity Structure §3121 */
|
|
75
|
+
if (profile.entity === "S-Corporation" && ownerComp > 0) {
|
|
76
|
+
const blsRanges = { "Professional Services": [58200, 85400, 112600], "Healthcare": [65000, 95000, 135000], "Technology": [70000, 105000, 145000], "Construction": [48000, 68000, 92000], "Restaurant / Hospitality": [38000, 52000, 72000], "Manufacturing": [50000, 72000, 98000], "Real Estate": [45000, 65000, 95000], "Financial Services": [62000, 92000, 128000], "Retail / E-Commerce": [40000, 58000, 82000], default: [50000, 75000, 105000] };
|
|
77
|
+
const bls = blsRanges[profile.industry] || blsRanges.default;
|
|
78
|
+
const reasonableSalary = Math.min(Math.max(ownerComp, bls[0]), bls[2]);
|
|
79
|
+
const distributionAmount = Math.max(net - reasonableSalary, 0);
|
|
80
|
+
const seSaved = Math.round(distributionAmount * seTaxRate);
|
|
81
|
+
results.set(1, { lo: Math.max(Math.round(seSaved * 0.7), 0), hi: Math.max(Math.round(seSaved * 1.15), 0),
|
|
82
|
+
sources: [{ doc: "Intake", line: "Owner W-2", value: `$${ownerComp.toLocaleString()}`, field: "Officer Salary" }, { doc: "Intake", line: "Net Income", value: `$${net.toLocaleString()}`, field: "Business Profit" }, { doc: "BLS OES 2026", line: profile.industry || "General", value: `$${bls[0].toLocaleString()}\u2013$${bls[2].toLocaleString()}`, field: "Industry Range" }],
|
|
83
|
+
trace: [{ n: 1, step: "Current salary ratio", formula: `${ownerComp.toLocaleString()} \u00F7 ${net.toLocaleString()}`, result: `${net > 0 ? Math.round(ownerComp / net * 100) : 0}%`, src: "Intake" }, { n: 2, step: "BLS reasonable salary", formula: "Industry midpoint", result: `$${reasonableSalary.toLocaleString()}`, src: "BLS" }, { n: 3, step: "Distribution amount", formula: `${net.toLocaleString()} \u2212 ${reasonableSalary.toLocaleString()}`, result: `$${distributionAmount.toLocaleString()}`, src: "Computed" }, { n: 4, step: "SE tax saved", formula: `${distributionAmount.toLocaleString()} \u00D7 15.3%`, result: `$${seSaved.toLocaleString()}`, src: "\u00A73121" }] });
|
|
84
|
+
}
|
|
85
|
+
/* #2 Section 179 Expensing */
|
|
86
|
+
if (equip > 0) {
|
|
87
|
+
const s179Limit = 1250000;
|
|
88
|
+
const s179Amount = Math.min(equip, s179Limit);
|
|
89
|
+
const s179Savings = Math.round(s179Amount * combinedRate);
|
|
90
|
+
results.set(2, { lo: Math.round(s179Savings * 0.85), hi: Math.round(s179Savings * 1.05),
|
|
91
|
+
sources: [{ doc: "Intake", line: "Equipment", value: `$${equip.toLocaleString()}`, field: "Purchases This Year" }, { doc: "IRS 2026", line: "\u00A7179 Limit", value: "$1,250,000", field: "Expensing Cap" }],
|
|
92
|
+
trace: [{ n: 1, step: "Qualifying equipment", formula: `Min(${equip.toLocaleString()}, 1,250,000)`, result: `$${s179Amount.toLocaleString()}`, src: "Fixed Assets" }, { n: 2, step: "Immediate deduction", formula: "100% first-year expensing", result: `$${s179Amount.toLocaleString()}`, src: "\u00A7179" }, { n: 3, step: "Tax savings", formula: `${s179Amount.toLocaleString()} \u00D7 ${(combinedRate * 100).toFixed(1)}%`, result: `$${s179Savings.toLocaleString()}`, src: "Combined rate" }] });
|
|
93
|
+
}
|
|
94
|
+
/* #4 QBI Deduction §199A */
|
|
95
|
+
{
|
|
96
|
+
const qbi = Math.max(net - ownerComp, 0);
|
|
97
|
+
let qbiDeductionRate = 0.20;
|
|
98
|
+
if (sstb === "Yes" && net > qbiThreshold) {
|
|
99
|
+
qbiDeductionRate = 0;
|
|
100
|
+
}
|
|
101
|
+
else if (sstb === "Yes" && net > qbiThreshold - 50000) {
|
|
102
|
+
qbiDeductionRate = 0.20 * (1 - (net - (qbiThreshold - 50000)) / 50000);
|
|
103
|
+
}
|
|
104
|
+
const qbiDeduction = Math.round(qbi * qbiDeductionRate);
|
|
105
|
+
const qbiSavings = Math.round(qbiDeduction * combinedRate);
|
|
106
|
+
results.set(4, { lo: Math.max(Math.round(qbiSavings * 0.85), 0), hi: Math.max(Math.round(qbiSavings * 1.10), 0),
|
|
107
|
+
sources: [{ doc: "Intake", line: "Net Income", value: `$${net.toLocaleString()}`, field: "Business Income" }, { doc: "Intake", line: "Owner W-2", value: `$${ownerComp.toLocaleString()}`, field: "W-2 Wages" }, { doc: "Intake", line: "SSTB", value: sstb, field: "Service Business" }],
|
|
108
|
+
trace: [{ n: 1, step: "Qualified Business Income", formula: `${net.toLocaleString()} \u2212 ${ownerComp.toLocaleString()}`, result: `$${qbi.toLocaleString()}`, src: "\u00A7199A(c)" }, { n: 2, step: "QBI deduction rate", formula: sstb === "Yes" && net > qbiThreshold - 50000 ? "SSTB phase-out applied" : "Standard 20%", result: `${(qbiDeductionRate * 100).toFixed(1)}%`, src: "\u00A7199A" }, { n: 3, step: "QBI deduction", formula: `${qbi.toLocaleString()} \u00D7 ${(qbiDeductionRate * 100).toFixed(1)}%`, result: `$${qbiDeduction.toLocaleString()}`, src: "\u00A7199A" }, { n: 4, step: "Tax savings", formula: `${qbiDeduction.toLocaleString()} \u00D7 ${(combinedRate * 100).toFixed(1)}%`, result: `$${qbiSavings.toLocaleString()}`, src: "Combined rate" }] });
|
|
109
|
+
}
|
|
110
|
+
/* #7 Retirement Plan Upgrade */
|
|
111
|
+
{
|
|
112
|
+
const employeeDeferral = 23500;
|
|
113
|
+
const catchUp = age >= 50 ? 7500 : 0;
|
|
114
|
+
const employerContrib = Math.round(Math.min(net * 0.25, 69000 - employeeDeferral - catchUp));
|
|
115
|
+
const maxContrib = employeeDeferral + catchUp + Math.max(employerContrib, 0);
|
|
116
|
+
const additional = Math.max(maxContrib - retirementExisting, 0);
|
|
117
|
+
const retirementSavings = Math.round(additional * combinedRate);
|
|
118
|
+
results.set(7, { lo: Math.max(Math.round(retirementSavings * 0.85), 0), hi: Math.max(Math.round(retirementSavings * 1.05), 0),
|
|
119
|
+
sources: [{ doc: "Intake", line: "Age", value: `${age}`, field: "Owner Age" }, { doc: "Intake", line: "Net Income", value: `$${net.toLocaleString()}`, field: "Business Income" }, { doc: "Intake", line: "Existing", value: `$${retirementExisting.toLocaleString()}`, field: "Current Contributions" }],
|
|
120
|
+
trace: [{ n: 1, step: "Employee deferral", formula: `$23,500 base${catchUp > 0 ? ` + $7,500 catch-up (age ${age})` : ""}`, result: `$${(employeeDeferral + catchUp).toLocaleString()}`, src: "Rev. Proc." }, { n: 2, step: "Employer contribution", formula: `25% \u00D7 ${net.toLocaleString()}`, result: `$${Math.max(employerContrib, 0).toLocaleString()}`, src: "\u00A7401(k)" }, { n: 3, step: "Max total contribution", formula: `${(employeeDeferral + catchUp).toLocaleString()} + ${Math.max(employerContrib, 0).toLocaleString()}`, result: `$${maxContrib.toLocaleString()}`, src: "2026 limit" }, { n: 4, step: "Additional available", formula: `${maxContrib.toLocaleString()} \u2212 ${retirementExisting.toLocaleString()}`, result: `$${additional.toLocaleString()}`, src: "Computed" }, { n: 5, step: "Tax savings", formula: `${additional.toLocaleString()} \u00D7 ${(combinedRate * 100).toFixed(1)}%`, result: `$${retirementSavings.toLocaleString()}`, src: "Combined rate" }] });
|
|
121
|
+
}
|
|
122
|
+
/* #8 Cost Segregation */
|
|
123
|
+
if (reValue > 0) {
|
|
124
|
+
const reclassPct = 0.30;
|
|
125
|
+
const reclassAmount = Math.round(reValue * reclassPct);
|
|
126
|
+
const costSegSavings = Math.round(reclassAmount * combinedRate);
|
|
127
|
+
results.set(8, { lo: Math.round(reValue * 0.20 * combinedRate), hi: Math.round(reValue * 0.40 * combinedRate),
|
|
128
|
+
sources: [{ doc: "Intake", line: "RE Value", value: `$${reValue.toLocaleString()}`, field: "Property Value" }],
|
|
129
|
+
trace: [{ n: 1, step: "Property value", formula: "Appraisal / purchase records", result: `$${reValue.toLocaleString()}`, src: "Intake" }, { n: 2, step: "Reclassifiable (est. 30%)", formula: `${reValue.toLocaleString()} \u00D7 30%`, result: `$${reclassAmount.toLocaleString()}`, src: "Industry avg" }, { n: 3, step: "Bonus depreciation", formula: "100% permanent under OBBBA", result: `$${reclassAmount.toLocaleString()} yr 1`, src: "\u00A7168(k)" }, { n: 4, step: "Tax savings", formula: `${reclassAmount.toLocaleString()} \u00D7 ${(combinedRate * 100).toFixed(1)}%`, result: `$${costSegSavings.toLocaleString()}`, src: "Combined rate" }] });
|
|
130
|
+
}
|
|
131
|
+
/* #9 HSA Maximization */
|
|
132
|
+
{
|
|
133
|
+
const hsaLimit = 8550;
|
|
134
|
+
const hsaAdditional = Math.max(hsaLimit - hsaExisting, 0);
|
|
135
|
+
const hsaSavings = Math.round(hsaAdditional * (combinedRate + 0.0765));
|
|
136
|
+
results.set(9, { lo: Math.max(Math.round(hsaSavings * 0.90), 0), hi: Math.max(Math.round(hsaSavings * 1.05), 0),
|
|
137
|
+
sources: [{ doc: "Intake", line: "HSA", value: `$${hsaExisting.toLocaleString()}`, field: "YTD Contributions" }, { doc: "IRS 2026", line: "Rev. Proc.", value: "$8,550", field: "Family Limit" }],
|
|
138
|
+
trace: [{ n: 1, step: "2026 family limit", formula: "Rev. Proc. 2025-32", result: "$8,550", src: "IRS" }, { n: 2, step: "Already contributed", formula: "W-2 Box 12 Code W", result: `$${hsaExisting.toLocaleString()}`, src: "Intake" }, { n: 3, step: "Remaining room", formula: `8,550 \u2212 ${hsaExisting.toLocaleString()}`, result: `$${hsaAdditional.toLocaleString()}`, src: "Computed" }, { n: 4, step: "Tax savings", formula: `${hsaAdditional.toLocaleString()} \u00D7 ${((combinedRate + 0.0765) * 100).toFixed(1)}%`, result: `$${hsaSavings.toLocaleString()}`, src: "Triple tax" }] });
|
|
139
|
+
}
|
|
140
|
+
/* #15 SALT/PTE Optimization */
|
|
141
|
+
{
|
|
142
|
+
const statesTaxPaid = Math.round(net * stateRate);
|
|
143
|
+
const pteSavings = Math.round(statesTaxPaid * 0.70);
|
|
144
|
+
results.set(15, { lo: Math.max(Math.round(pteSavings * 0.80), 0), hi: Math.max(Math.round(pteSavings * 1.10), 0),
|
|
145
|
+
sources: [{ doc: "Intake", line: "Net Income", value: `$${net.toLocaleString()}`, field: "Pass-through Income" }, { doc: "Intake", line: "State Rate", value: `${(stateRate * 100).toFixed(2)}%`, field: "Marginal State Rate" }, { doc: "OBBBA \u00A770109", line: "SALT Cap", value: "$40,400", field: "2026 Cap" }],
|
|
146
|
+
trace: [{ n: 1, step: "Entity-level state tax", formula: `${net.toLocaleString()} \u00D7 ${(stateRate * 100).toFixed(2)}%`, result: `$${statesTaxPaid.toLocaleString()}`, src: "Intake" }, { n: 2, step: "PTE deduction value", formula: "Entity-level deduction bypasses SALT cap", result: `$${statesTaxPaid.toLocaleString()}`, src: "Notice 2020-75" }, { n: 3, step: "Net savings (credit offset)", formula: `${statesTaxPaid.toLocaleString()} \u00D7 70% recovery`, result: `$${pteSavings.toLocaleString()}`, src: "State credit" }] });
|
|
147
|
+
}
|
|
148
|
+
/* #22 Overtime Pay Deduction (OBBBA) */
|
|
149
|
+
if (overtime > 0) {
|
|
150
|
+
const overtimeSavings = Math.round(overtime * combinedRate);
|
|
151
|
+
results.set(22, { lo: Math.round(overtimeSavings * 0.80), hi: Math.round(overtimeSavings * 1.10),
|
|
152
|
+
sources: [{ doc: "Intake", line: "Overtime", value: `$${overtime.toLocaleString()}`, field: "Premium Paid" }],
|
|
153
|
+
trace: [{ n: 1, step: "Overtime premium reported", formula: "CPA intake", result: `$${overtime.toLocaleString()}`, src: "Intake" }, { n: 2, step: "OBBBA deduction", formula: "100% of premium", result: `$${overtime.toLocaleString()}`, src: "OBBBA \u00A770302" }, { n: 3, step: "Tax savings", formula: `${overtime.toLocaleString()} \u00D7 ${(combinedRate * 100).toFixed(1)}%`, result: `$${overtimeSavings.toLocaleString()}`, src: "Combined rate" }] });
|
|
154
|
+
}
|
|
155
|
+
/* Fallback: scale static values for non-computed strategies */
|
|
156
|
+
const scale = Math.min(Math.max(rev / 500000, 0.3), 3.0) * (fedRate / 0.24);
|
|
157
|
+
data_1.STRATEGIES.forEach(s => {
|
|
158
|
+
if (!results.has(s.rank)) {
|
|
159
|
+
results.set(s.rank, { lo: Math.round(s.lo * scale), hi: Math.round(s.hi * scale), sources: s.sources, trace: s.trace });
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
return results;
|
|
163
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
3
|
+
// TaxAxis — Document checklist base + profile-aware resolver
|
|
4
|
+
// Verbatim from the mock (App.jsx:575-603).
|
|
5
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DOC_SPECS_BASE = void 0;
|
|
8
|
+
exports.getDocSpecs = getDocSpecs;
|
|
9
|
+
const states_1 = require("./states");
|
|
10
|
+
exports.DOC_SPECS_BASE = [
|
|
11
|
+
{ id: "1120s", name: "Federal Tax Return (1120S/1065/1040)", accept: [".pdf"], strategies: ["QBI \u00A7199A", "S-Corp Structure", "\u00A7179 Expensing", "Bonus Depreciation", "Business Interest \u00A7163(j)"], required: "optional", help: "Optional \u2014 startups or new entities may not have prior returns. Improves accuracy if available." },
|
|
12
|
+
{ id: "state-return", name: "State Return(s)", accept: [".pdf"], strategies: ["SALT / PTE Optimization", "State Nexus Analysis"], required: "conditional", help: "Required if client operates in income-tax states. Not needed for WY, NV, TX, FL, etc." },
|
|
13
|
+
{ id: "payroll", name: "Payroll Records (W-3 / 941)", accept: [".pdf", ".xlsx", ".csv"], strategies: ["S-Corp Salary", "HSA Maximization", "WOTC", "Overtime Deduction"], required: "optional", help: "Optional for V1 \u2014 intake questions substitute for most payroll data." },
|
|
14
|
+
{ id: "pnl", name: "Profit & Loss Statement (Current Year)", accept: [".pdf", ".xlsx", ".csv"], strategies: ["QBI \u00A7199A", "R&D Credit", "Business Meals", "Professional Fees", "Home Office"], required: true, help: "Required \u2014 current year P&L is the minimum input for savings calculations." },
|
|
15
|
+
{ id: "balance", name: "Balance Sheet (Current Year)", accept: [".pdf", ".xlsx"], strategies: ["Business Interest \u00A7163(j)", "\u00A7179 Expensing", "Opportunity Zone"], required: true, help: "Required \u2014 needed for asset-based strategies and financial health assessment." },
|
|
16
|
+
{ id: "cashflow", name: "Cash Flow Statement", accept: [".pdf", ".xlsx"], strategies: ["Income Deferral", "Tax Method Elections", "Estimated Tax Timing"], required: "optional", help: "Recommended \u2014 helps with income deferral and timing strategies." },
|
|
17
|
+
{ id: "fixed-assets", name: "Fixed Asset Schedule", accept: [".pdf", ".xlsx"], strategies: ["\u00A7179", "Bonus Depreciation \u00A7168(k)", "Cost Segregation"], required: "conditional", help: "Required for real estate clients (cost segregation). Optional otherwise." },
|
|
18
|
+
{ id: "prior-returns", name: "Prior Year Returns (2022\u20132024)", accept: [".pdf"], strategies: ["R&E Catch-Up \u00A7174A", "Charitable Bunching", "Confidence Intervals"], required: false, help: "More years = tighter estimates. 1 year: \u00B130% range. 2\u20133 years: \u00B115%. 4\u20135 years: \u00B15%." },
|
|
19
|
+
];
|
|
20
|
+
function getDocSpecs(profile) {
|
|
21
|
+
const states = (profile === null || profile === void 0 ? void 0 : profile.states) || [];
|
|
22
|
+
const industry = (profile === null || profile === void 0 ? void 0 : profile.industry) || "";
|
|
23
|
+
const allNoTax = states.length > 0 && states.every(s => states_1.NO_INCOME_TAX.has(s));
|
|
24
|
+
const isRealEstate = industry === "Real Estate" || industry === "Construction";
|
|
25
|
+
return exports.DOC_SPECS_BASE.map(d => {
|
|
26
|
+
let req = d.required;
|
|
27
|
+
if (d.id === "state-return")
|
|
28
|
+
req = allNoTax ? false : "optional";
|
|
29
|
+
if (d.id === "fixed-assets")
|
|
30
|
+
req = isRealEstate ? true : false;
|
|
31
|
+
return Object.assign(Object.assign({}, d), { required: req });
|
|
32
|
+
});
|
|
33
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
3
|
+
// TaxAxis — Extraction review data (document-centric)
|
|
4
|
+
// Verbatim from the mock (App.jsx:605-644).
|
|
5
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.EXTRACTED_DATA = void 0;
|
|
8
|
+
/* ═══ EXTRACTED DATA — Document-centric extraction results ═══ */
|
|
9
|
+
exports.EXTRACTED_DATA = [
|
|
10
|
+
{ docId: "payroll", docName: "Form W-3 (Payroll)", code: "W3", flagCount: 1, fields: [
|
|
11
|
+
{ field: "Officer W-2 Salary", line: "Box 1", value: "$65,000", status: "review", strategies: ["Entity Structure", "QBI \u00A7199A", "Retirement"] },
|
|
12
|
+
{ field: "Total Wages", line: "Box 1 (all)", value: "$142,000", status: "pass", strategies: ["QBI \u00A7199A"] },
|
|
13
|
+
{ field: "HSA Election", line: "Deductions", value: "$4,200", status: "pass", strategies: ["HSA Max"] },
|
|
14
|
+
] },
|
|
15
|
+
{ docId: "pnl", docName: "QBO Profit & Loss", code: "P&L", flagCount: 2, fields: [
|
|
16
|
+
{ field: "Annual Meals", line: "Meals line", value: "$8,400", status: "review", strategies: ["Meal Deductions"] },
|
|
17
|
+
{ field: "Tip Income", line: "Payroll", value: "$32,000", status: "review", strategies: ["Qualified Tips"] },
|
|
18
|
+
{ field: "Professional Fees", line: "Prof. fees", value: "$24,000", status: "pass", strategies: ["Prof. Services"] },
|
|
19
|
+
{ field: "R&D Expenses", line: "QRE total", value: "$120,000", status: "pass", strategies: ["R&D Credit \u00A741"] },
|
|
20
|
+
] },
|
|
21
|
+
{ docId: "brokerage", docName: "Brokerage Statement", code: "BRK", flagCount: 2, fields: [
|
|
22
|
+
{ field: "Capital Gains", line: "Realized", value: "$85,000", status: "review", strategies: ["Opp. Zone \u00A71400Z"] },
|
|
23
|
+
{ field: "Appreciated Stock", line: "Holdings", value: "$15,000", status: "review", strategies: ["Charitable \u00A7170"] },
|
|
24
|
+
] },
|
|
25
|
+
{ docId: "1120s", docName: "Federal Tax Return (1120S)", code: "1120S", flagCount: 0, fields: [
|
|
26
|
+
{ field: "Net Profit", line: "Line 1", value: "$142,000", status: "pass", strategies: ["QBI \u00A7199A", "Entity Structure"] },
|
|
27
|
+
{ field: "Revenue", line: "Line 1a", value: "$500,000", status: "pass", strategies: ["Income Deferral", "Tax Methods"] },
|
|
28
|
+
{ field: "Business Interest", line: "Interest", value: "$18,000", status: "pass", strategies: ["\u00A7163(j)"] },
|
|
29
|
+
] },
|
|
30
|
+
{ docId: "state-return", docName: "State Return(s)", code: "ST", flagCount: 0, fields: [
|
|
31
|
+
{ field: "State Tax Paid", line: "Total", value: "$9,108", status: "pass", strategies: ["SALT / PTE"] },
|
|
32
|
+
{ field: "Property Tax", line: "Sch A", value: "$9,200", status: "pass", strategies: ["SALT / PTE"] },
|
|
33
|
+
] },
|
|
34
|
+
{ docId: "balance", docName: "Balance Sheet", code: "BS", flagCount: 0, fields: [
|
|
35
|
+
{ field: "Total Assets", line: "Assets", value: "$340,000", status: "pass", strategies: ["\u00A7179", "Bonus Dep."] },
|
|
36
|
+
{ field: "Inventory", line: "Current", value: "$45,000", status: "pass", strategies: ["Tax Methods"] },
|
|
37
|
+
] },
|
|
38
|
+
{ docId: "cashflow", docName: "Cash Flow Statement", code: "CF", flagCount: 0, fields: [
|
|
39
|
+
{ field: "AR Aging", line: "30+ days", value: "$42,000", status: "pass", strategies: ["Income Deferral"] },
|
|
40
|
+
] },
|
|
41
|
+
{ docId: "fixed-assets", docName: "Fixed Asset Schedule", code: "FA", flagCount: 0, fields: [
|
|
42
|
+
{ field: "Equipment Purchases", line: "2026 additions", value: "$87,000", status: "pass", strategies: ["\u00A7179", "Bonus Dep. \u00A7168(k)", "Cost Seg."] },
|
|
43
|
+
] },
|
|
44
|
+
{ docId: "prior-returns", docName: "Prior Year Returns", code: "PY", flagCount: 0, fields: [
|
|
45
|
+
{ field: "Amortized R&E", line: "\u00A7174", value: "$95,000", status: "pass", strategies: ["R&E Catch-Up \u00A7174A"] },
|
|
46
|
+
] },
|
|
47
|
+
];
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
3
|
+
// TaxAxis — Footnote entries keyed by strategy rank (Patch F4)
|
|
4
|
+
// Verbatim from the mock (App.jsx:2925-2965).
|
|
5
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.FOOTNOTE_DATA = void 0;
|
|
8
|
+
/* ═══ FOOTNOTE_DATA (Patch F4) ═══ */
|
|
9
|
+
exports.FOOTNOTE_DATA = {
|
|
10
|
+
9: [
|
|
11
|
+
{
|
|
12
|
+
match: "The 2026 family HSA limit is $8,750",
|
|
13
|
+
note: "Rev. Proc. 2025-19. 2026 inflation-adjusted family HDHP limit."
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
match: "6% excise tax",
|
|
17
|
+
note: "IRC \u00A74973(a)(5). Excise tax applies annually to excess HSA contributions until withdrawn."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
match: "last-month rule testing period",
|
|
21
|
+
note: "IRC \u00A7223(b)(8); IRS Pub. 969. Coverage must continue through December 31 of the following year."
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
15: [
|
|
25
|
+
{
|
|
26
|
+
match: "$10,000 SALT cap (raised to $40,400 by OBBBA for 2026)",
|
|
27
|
+
note: "OBBBA \u00A770120; Rev. Proc. 2025-32. Cap rises 1% annually through 2029, reverts to $10,000 in 2030."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
match: "deducted as a business expense",
|
|
31
|
+
note: "IRS Notice 2020-75; IRC \u00A7164. Federal authority for state-level PTE workarounds."
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
7: [
|
|
35
|
+
{
|
|
36
|
+
match: "$24,500 in employee deferrals",
|
|
37
|
+
note: "IRS Notice 2025-67. 2026 inflation-adjusted 401(k) employee deferral limit."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
match: "25% of W-2 compensation as an employer match",
|
|
41
|
+
note: "IRC \u00A7404(a)(3); IRC \u00A7415(c)(1)(A). Combined employee + employer cap is $72,000 for 2026."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
match: "startup credit up to $5,000/yr for 3 years",
|
|
45
|
+
note: "IRC \u00A745E; SECURE 2.0 Act \u00A7102. Available to employers with 1\u201350 employees, 100% of qualified startup costs."
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./states";
|
|
2
|
+
export * from "./strategies";
|
|
3
|
+
export * from "./strategyNarrative";
|
|
4
|
+
export * from "./strategyProspect";
|
|
5
|
+
export * from "./extractedData";
|
|
6
|
+
export * from "./sidebarLookup";
|
|
7
|
+
export * from "./footnoteData";
|
|
8
|
+
export * from "./documents";
|
|
9
|
+
export * from "./sourceDescriptions";
|
|
10
|
+
export * from "./nextSteps";
|
|
11
|
+
export * from "./workpaperInteractions";
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
3
|
+
// TaxAxis — data barrel
|
|
4
|
+
// Re-exports every mock constant ported under src/tax-axis/lib/data/.
|
|
5
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
18
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
__exportStar(require("./states"), exports);
|
|
22
|
+
__exportStar(require("./strategies"), exports);
|
|
23
|
+
__exportStar(require("./strategyNarrative"), exports);
|
|
24
|
+
__exportStar(require("./strategyProspect"), exports);
|
|
25
|
+
__exportStar(require("./extractedData"), exports);
|
|
26
|
+
__exportStar(require("./sidebarLookup"), exports);
|
|
27
|
+
__exportStar(require("./footnoteData"), exports);
|
|
28
|
+
__exportStar(require("./documents"), exports);
|
|
29
|
+
__exportStar(require("./sourceDescriptions"), exports);
|
|
30
|
+
__exportStar(require("./nextSteps"), exports);
|
|
31
|
+
__exportStar(require("./workpaperInteractions"), exports);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
3
|
+
// TaxAxis — Next-step copy keyed by strategy rank
|
|
4
|
+
// Verbatim from the mock (App.jsx:3090-3116).
|
|
5
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.INTERACTION_PAIRS = exports.NEXT_STEPS = void 0;
|
|
8
|
+
exports.NEXT_STEPS = {
|
|
9
|
+
1: "Your preparer will prepare a salary benchmarking memo using industry data. One payroll adjustment is all that's needed.",
|
|
10
|
+
2: "No action required — your preparer will identify qualifying equipment on your current fixed asset schedule.",
|
|
11
|
+
3: "Same as above — applies automatically to qualifying property placed in service.",
|
|
12
|
+
4: "No action required from you. Your preparer claims this deduction when filing your return.",
|
|
13
|
+
5: "Your preparer will evaluate qualifying R&D activities and prepare the credit calculation.",
|
|
14
|
+
6: "Confirm that Form 8850 was submitted for qualifying hires. Your preparer will compute the credit.",
|
|
15
|
+
7: "Open or upgrade your retirement plan before December 31. Your preparer will recommend the optimal plan type and contribution level.",
|
|
16
|
+
8: "Provide your property appraisal or purchase records. A cost segregation study will identify reclassifiable assets.",
|
|
17
|
+
9: "Increase your payroll HSA deduction this pay period. Your preparer will confirm your remaining contribution room.",
|
|
18
|
+
10: "Start logging business meals with date, attendees, and business purpose. 50% of qualifying meals are deductible.",
|
|
19
|
+
11: "Review your current professional service expenses with your preparer to ensure all are properly categorized.",
|
|
20
|
+
12: "Photograph your dedicated workspace and collect mortgage and utility bills for the year.",
|
|
21
|
+
13: "Your preparer will evaluate your current employee health insurance setup for credit eligibility.",
|
|
22
|
+
14: "Consider bunching two years of charitable contributions into one year for maximum deduction impact.",
|
|
23
|
+
15: "Your preparer will file a PTE election with your state. Deadline varies by state.",
|
|
24
|
+
16: "Your preparer will review your business interest expense for §163(j) optimization.",
|
|
25
|
+
17: "Discuss year-end timing of income and expenses with your preparer before December.",
|
|
26
|
+
18: "Identify qualifying capital gains and potential Opportunity Zone investments with your advisor.",
|
|
27
|
+
19: "Have your commercial property evaluated for energy efficiency certification.",
|
|
28
|
+
20: "Your preparer will review your current accounting method for optimization opportunities.",
|
|
29
|
+
21: "Provide your POS tip reporting data. Your preparer will calculate the deduction.",
|
|
30
|
+
22: "Provide your payroll overtime summary. Your preparer will calculate the OBBBA deduction.",
|
|
31
|
+
23: "Your preparer will review prior-year R&E amortization for catch-up eligibility.",
|
|
32
|
+
24: "Document your employer-provided childcare facilities or referral services.",
|
|
33
|
+
25: "Your preparer will evaluate Trump Account eligibility and optimal contribution levels.",
|
|
34
|
+
};
|
|
35
|
+
exports.INTERACTION_PAIRS = [[1, 4], [1, 7], [2, 3]];
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
3
|
+
// TaxAxis — IRC sidebar lookup entries (Patch F3)
|
|
4
|
+
// Verbatim from the mock (App.jsx:2807-2889).
|
|
5
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SIDEBAR_LOOKUP = void 0;
|
|
8
|
+
/* ═══ SIDEBAR_LOOKUP (Patch F3) ═══ */
|
|
9
|
+
exports.SIDEBAR_LOOKUP = {
|
|
10
|
+
"\u00A7199A": {
|
|
11
|
+
title: "QBI deduction is fragile",
|
|
12
|
+
body: "OBBBA made \u00A7199A permanent and widened the SSTB phase-in range. The deduction phases out for specified service trades like health, law, accounting, consulting, and financial services above the income threshold. Above the phase-out, the deduction depends on W-2 wages paid and unadjusted basis of qualified property. Entity structure and reasonable compensation choices made now determine whether the deduction survives at filing."
|
|
13
|
+
},
|
|
14
|
+
"\u00A73121": {
|
|
15
|
+
title: "Reasonable compensation",
|
|
16
|
+
body: "S-corporation shareholder-employees must pay themselves reasonable compensation as W-2 wages before taking distributions. The IRS scrutinizes low salary / high distribution patterns, and reclassification of distributions as wages triggers payroll tax liability plus penalties. Industry benchmarks, role complexity, and time devoted to the business are the standard defense factors."
|
|
17
|
+
},
|
|
18
|
+
"\u00A7168(k)": {
|
|
19
|
+
title: "Bonus depreciation timing",
|
|
20
|
+
body: "OBBBA permanently restored 100% bonus depreciation for property both acquired and placed in service after January 19, 2025. Both conditions must be met independently \u2014 equipment ordered before that date but installed after is generally ineligible. 'Placed in service' means ready and available for its assigned function, not the invoice date. Documentation of both dates is the audit-defense pivot point."
|
|
21
|
+
},
|
|
22
|
+
"\u00A7168": {
|
|
23
|
+
title: "Cost segregation mechanics",
|
|
24
|
+
body: "A cost segregation study reclassifies building components from 39-year nonresidential real property into shorter recovery periods \u2014 generally 5, 7, or 15 years \u2014 making them eligible for accelerated depreciation and bonus depreciation. The study requires an engineering-based analysis of construction documents or physical inspection. Quality of documentation directly affects audit defensibility."
|
|
25
|
+
},
|
|
26
|
+
"\u00A7179": {
|
|
27
|
+
title: "\u00A7179 vs \u00A7168(k)",
|
|
28
|
+
body: "For 2026, \u00A7179 caps elective expensing at $2.56M with phase-out beginning at $4.09M of total qualifying purchases. \u00A7179 cannot create a loss \u2014 it is limited to taxable income from active trades or businesses \u2014 while \u00A7168(k) bonus depreciation is automatic and can create a loss. For property qualifying for both, ordering affects state conformity, since many states decouple from \u00A7168(k) but follow \u00A7179."
|
|
29
|
+
},
|
|
30
|
+
"\u00A741": {
|
|
31
|
+
title: "R&D credit four-part test",
|
|
32
|
+
body: "Qualifying research must be technological in nature, intended to develop a new or improved business component, involve a process of experimentation, and aim to eliminate technical uncertainty. Software development qualifies under specific rules. Contemporaneous documentation of the experimentation process \u2014 not the result \u2014 is the most common defect in audited claims."
|
|
33
|
+
},
|
|
34
|
+
"\u00A7174A": {
|
|
35
|
+
title: "R&E catch-up window",
|
|
36
|
+
body: "OBBBA restored full first-year expensing of domestic research and experimental expenditures for amounts paid or incurred starting January 1, 2025, ending the \u00A7174 amortization regime imposed by TCJA. Eligible small business taxpayers can retroactively apply immediate expensing to 2022, 2023, and 2024 R&E costs, subject to specific election procedures with hard deadlines."
|
|
37
|
+
},
|
|
38
|
+
"\u00A745F": {
|
|
39
|
+
title: "Employer childcare credit",
|
|
40
|
+
body: "The credit covers a percentage of qualified childcare facility expenditures and resource and referral expenditures, up to an annual cap. Facility costs must include actual operation of an on-site or contracted childcare facility, not just employee reimbursement. Documentation of expenditure type and use of services drives the credit calculation."
|
|
41
|
+
},
|
|
42
|
+
"\u00A745R": {
|
|
43
|
+
title: "Small employer health credit",
|
|
44
|
+
body: "Available to employers with fewer than 25 full-time equivalent employees, average annual wages below the indexed threshold ($34,100 for 2026), and a qualified health plan offered through the SHOP marketplace. The credit phases out as FTE count and average wages rise. Two consecutive taxable years is the maximum claim window."
|
|
45
|
+
},
|
|
46
|
+
"\u00A751": {
|
|
47
|
+
title: "WOTC certification deadline",
|
|
48
|
+
body: "The Work Opportunity Tax Credit applies to wages paid to employees from targeted groups, including qualified veterans, long-term unemployment recipients, and SNAP recipients. Form 8850 must be submitted to the state workforce agency within 28 days of the employee's start date. Missing this deadline forfeits the credit entirely, regardless of the employee's qualifying status."
|
|
49
|
+
},
|
|
50
|
+
"\u00A7163(j)": {
|
|
51
|
+
title: "Business interest limitation",
|
|
52
|
+
body: "Business interest expense is generally limited to 30% of adjusted taxable income plus business interest income and floor plan financing. Small business taxpayers under the \u00A7448(c) gross receipts threshold ($32M for 2026) are exempt. Real property and farming businesses may elect out, with consequences for depreciation methods on existing assets that lock in for multiple years."
|
|
53
|
+
},
|
|
54
|
+
"\u00A7170": {
|
|
55
|
+
title: "Charitable contribution limits",
|
|
56
|
+
body: "Cash contributions to public charities are deductible up to 60% of AGI. Long-term appreciated property is generally limited to 30% of AGI but deductible at fair market value, avoiding capital gains on the appreciation. Bunching multiple years of contributions into a donor-advised fund concentrates deductions in a single tax year while preserving multi-year giving cadence."
|
|
57
|
+
},
|
|
58
|
+
"\u00A7274": {
|
|
59
|
+
title: "Business meal substantiation",
|
|
60
|
+
body: "Business meals are generally 50% deductible. Substantiation requires the amount, date, business purpose, and names of attendees \u2014 receipts alone are insufficient. Entertainment expenses remain nondeductible after TCJA, so meals separately invoiced from entertainment events must be documented to preserve the meal portion."
|
|
61
|
+
},
|
|
62
|
+
"\u00A7280A": {
|
|
63
|
+
title: "Home office substantiation",
|
|
64
|
+
body: "The home office must be used regularly and exclusively as the principal place of business or for meeting clients in the normal course of business. Square-footage allocation drives the deduction; the simplified method caps at 300 square feet at $5 per square foot. Photographic documentation of the dedicated workspace defends the exclusive-use requirement under audit."
|
|
65
|
+
},
|
|
66
|
+
"\u00A7179D": {
|
|
67
|
+
title: "\u00A7179D sunset",
|
|
68
|
+
body: "The energy efficient commercial buildings deduction is repealed by OBBBA for property whose construction begins after June 30, 2026. Projects with construction beginning on or before that date remain eligible. The deduction ranges on a sliding scale based on energy savings, with the higher tier available only when prevailing wage and apprenticeship requirements are met."
|
|
69
|
+
},
|
|
70
|
+
"\u00A7223": {
|
|
71
|
+
title: "HSA contribution mechanics",
|
|
72
|
+
body: "HSA contributions are deductible above the line and reduce AGI directly, regardless of whether the taxpayer itemizes. Eligibility is determined month-by-month based on HDHP coverage. The last-month rule allows full-year contributions if HDHP coverage is in place on December 1, subject to a 13-month testing period \u2014 coverage must continue through December 31 of the following year or contributions are recaptured plus a 10% additional tax."
|
|
73
|
+
},
|
|
74
|
+
"\u00A7401(k)": {
|
|
75
|
+
title: "Solo 401(k) deadlines",
|
|
76
|
+
body: "Plan documents must generally be signed by December 31 of the contribution year. SECURE 2.0 \u00A7317 lets sole proprietors with no common-law employees adopt a Solo 401(k) and make first-year employee deferrals as late as the personal tax filing deadline (without extensions). Employer contributions can be made up to the extended filing deadline for all entity types."
|
|
77
|
+
},
|
|
78
|
+
"\u00A71400Z": {
|
|
79
|
+
title: "Opportunity Zone timing",
|
|
80
|
+
body: "Capital gains invested in a Qualified Opportunity Fund within 180 days of recognition can defer the gain and, if held long enough, exclude appreciation on the QOF investment from federal tax. The 180-day window is strict, and the fund must satisfy substantial-improvement and active-business requirements at the property level. Documentation of the gain trigger date is the audit-defense anchor."
|
|
81
|
+
},
|
|
82
|
+
"OBBBA \u00A770109": {
|
|
83
|
+
title: "PTE election irrevocability",
|
|
84
|
+
body: "The pass-through entity tax election converts entity-level state tax into a federal business deduction, bypassing the individual SALT cap. Federal authority comes from IRS Notice 2020-75. State elections are typically irrevocable for the year and have state-specific filing deadlines. The PTE workaround remains the primary tool for owners whose income exceeds the OBBBA SALT cap phase-down threshold."
|
|
85
|
+
},
|
|
86
|
+
"OBBBA": {
|
|
87
|
+
title: "OBBBA new deductions",
|
|
88
|
+
body: "OBBBA introduced new individual deductions for qualified tip income and qualified overtime pay, plus the new Trump Accounts savings vehicle for minor beneficiaries. Each provision has its own eligibility rules, income phase-outs, and documentation requirements. These are individual-return items that interact with employer payroll reporting; coordination with the W-2 process matters."
|
|
89
|
+
}
|
|
90
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const SOURCE_DESC: Record<string, string>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
3
|
+
// TaxAxis — IRC source descriptions for methodology section
|
|
4
|
+
// Verbatim from the mock (App.jsx:2781-2805).
|
|
5
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SOURCE_DESC = void 0;
|
|
8
|
+
exports.SOURCE_DESC = {
|
|
9
|
+
"§3121": "FICA wages and reasonable compensation for S-corp shareholder-employees",
|
|
10
|
+
"§179": "Election to expense qualifying tangible property in the year placed in service (OBBBA: $2.5M cap, $4M phase-out)",
|
|
11
|
+
"§168(k)": "Bonus depreciation on qualified property; OBBBA restored 100% for property placed in service after Jan 19, 2025",
|
|
12
|
+
"§199A": "Qualified Business Income deduction for pass-through entities, up to 20% of QBI",
|
|
13
|
+
"§41": "Credit for Increasing Research Activities; qualified research expenses with four-part test",
|
|
14
|
+
"§51": "Work Opportunity Tax Credit for hiring from targeted groups",
|
|
15
|
+
"§401(k)": "Qualified retirement plan contributions and employer matching",
|
|
16
|
+
"§168": "MACRS depreciation; cost segregation studies reclassify building components to shorter recovery periods",
|
|
17
|
+
"§223": "Health Savings Account contributions for HDHP-covered taxpayers",
|
|
18
|
+
"§274": "Business meal deductions, generally limited to 50% of qualifying expenses",
|
|
19
|
+
"§162": "Ordinary and necessary business expenses",
|
|
20
|
+
"§280A": "Home office deduction for the business use of a residence",
|
|
21
|
+
"§45R": "Small employer health insurance credit",
|
|
22
|
+
"§170": "Charitable contribution deductions",
|
|
23
|
+
"OBBBA §70109": "Pass-through entity tax election workaround for the SALT cap",
|
|
24
|
+
"§163(j)": "Business interest expense limitation, subject to ATI-based cap",
|
|
25
|
+
"§451": "Timing of income recognition under the all-events test",
|
|
26
|
+
"§1400Z": "Qualified Opportunity Zone capital gains deferral",
|
|
27
|
+
"§179D": "Energy efficient commercial buildings deduction",
|
|
28
|
+
"§446": "Permissible accounting methods and changes",
|
|
29
|
+
"OBBBA": "OBBBA-introduced deductions and credits (Qualified Tips, Overtime Pay, Trump Accounts)",
|
|
30
|
+
"§174A": "OBBBA-restored full expensing for domestic research and experimental expenditures",
|
|
31
|
+
"§45F": "Employer-provided childcare facilities and services credit",
|
|
32
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
3
|
+
// TaxAxis — US states and state tax rule sets
|
|
4
|
+
// Verbatim from the mock (App.jsx:56-73).
|
|
5
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.NO_INCOME_TAX = exports.PTE_STATES = exports.US_STATES = void 0;
|
|
8
|
+
/* ═══ ALL 50 STATES + DC ═══ */
|
|
9
|
+
exports.US_STATES = [
|
|
10
|
+
{ code: "AL", name: "Alabama" }, { code: "AK", name: "Alaska" }, { code: "AZ", name: "Arizona" }, { code: "AR", name: "Arkansas" },
|
|
11
|
+
{ code: "CA", name: "California" }, { code: "CO", name: "Colorado" }, { code: "CT", name: "Connecticut" }, { code: "DE", name: "Delaware" },
|
|
12
|
+
{ code: "DC", name: "District of Columbia" }, { code: "FL", name: "Florida" }, { code: "GA", name: "Georgia" }, { code: "HI", name: "Hawaii" },
|
|
13
|
+
{ code: "ID", name: "Idaho" }, { code: "IL", name: "Illinois" }, { code: "IN", name: "Indiana" }, { code: "IA", name: "Iowa" },
|
|
14
|
+
{ code: "KS", name: "Kansas" }, { code: "KY", name: "Kentucky" }, { code: "LA", name: "Louisiana" }, { code: "ME", name: "Maine" },
|
|
15
|
+
{ code: "MD", name: "Maryland" }, { code: "MA", name: "Massachusetts" }, { code: "MI", name: "Michigan" }, { code: "MN", name: "Minnesota" },
|
|
16
|
+
{ code: "MS", name: "Mississippi" }, { code: "MO", name: "Missouri" }, { code: "MT", name: "Montana" }, { code: "NE", name: "Nebraska" },
|
|
17
|
+
{ code: "NV", name: "Nevada" }, { code: "NH", name: "New Hampshire" }, { code: "NJ", name: "New Jersey" }, { code: "NM", name: "New Mexico" },
|
|
18
|
+
{ code: "NY", name: "New York" }, { code: "NC", name: "North Carolina" }, { code: "ND", name: "North Dakota" }, { code: "OH", name: "Ohio" },
|
|
19
|
+
{ code: "OK", name: "Oklahoma" }, { code: "OR", name: "Oregon" }, { code: "PA", name: "Pennsylvania" }, { code: "RI", name: "Rhode Island" },
|
|
20
|
+
{ code: "SC", name: "South Carolina" }, { code: "SD", name: "South Dakota" }, { code: "TN", name: "Tennessee" }, { code: "TX", name: "Texas" },
|
|
21
|
+
{ code: "UT", name: "Utah" }, { code: "VT", name: "Vermont" }, { code: "VA", name: "Virginia" }, { code: "WA", name: "Washington" },
|
|
22
|
+
{ code: "WV", name: "West Virginia" }, { code: "WI", name: "Wisconsin" }, { code: "WY", name: "Wyoming" },
|
|
23
|
+
];
|
|
24
|
+
exports.PTE_STATES = new Set(["AL", "AZ", "AR", "CA", "CO", "CT", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "UT", "VT", "VA", "WI"]);
|
|
25
|
+
exports.NO_INCOME_TAX = new Set(["AK", "FL", "NV", "NH", "SD", "TN", "TX", "WA", "WY"]);
|