@paro.io/expert-shared-components 1.14.59 → 1.14.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/lib/README.md +2 -0
  2. package/lib/components/DocumentCenter/MultiFileUploadSection.js +121 -220
  3. package/lib/components/TaxAxis/TaxAxisApi.d.ts +1 -0
  4. package/lib/components/TaxAxis/TaxAxisShell.js +52 -3
  5. package/lib/components/shared/UploadClient.d.ts +1 -2
  6. package/lib/components/shared/UploadClient.js +2 -6
  7. package/lib/index.d.ts +13 -2
  8. package/lib/index.js +27 -3
  9. package/lib/package.json +68 -0
  10. package/lib/tax-axis/components/clientReport/ExecutiveSummary.d.ts +1 -4
  11. package/lib/tax-axis/components/clientReport/ExecutiveSummary.js +6 -10
  12. package/lib/tax-axis/components/clientReport/Methodology.js +2 -2
  13. package/lib/tax-axis/components/clientReport/RecommendedStrategies.d.ts +1 -6
  14. package/lib/tax-axis/components/clientReport/RecommendedStrategies.js +24 -26
  15. package/lib/tax-axis/components/clientReport/StrategyCard.d.ts +1 -1
  16. package/lib/tax-axis/components/clientReport/StrategyCard.js +23 -39
  17. package/lib/tax-axis/components/clientReport/TaxAxisClientReport.d.ts +2 -8
  18. package/lib/tax-axis/components/clientReport/TaxAxisClientReport.js +7 -9
  19. package/lib/tax-axis/components/dashboard/DashboardActions.js +5 -6
  20. package/lib/tax-axis/components/dashboard/DashboardSummary.d.ts +1 -6
  21. package/lib/tax-axis/components/dashboard/DashboardSummary.js +10 -19
  22. package/lib/tax-axis/components/dashboard/StrategyDetailPanel.d.ts +1 -1
  23. package/lib/tax-axis/components/dashboard/StrategyDetailPanel.js +95 -122
  24. package/lib/tax-axis/components/dashboard/TaxAxisDashboard.d.ts +2 -59
  25. package/lib/tax-axis/components/dashboard/TaxAxisDashboard.js +49 -433
  26. package/lib/tax-axis/components/documents/DocumentCard.d.ts +3 -8
  27. package/lib/tax-axis/components/documents/DocumentCard.js +14 -83
  28. package/lib/tax-axis/components/documents/DocumentTier.d.ts +2 -5
  29. package/lib/tax-axis/components/documents/DocumentTier.js +2 -2
  30. package/lib/tax-axis/components/documents/TaxAxisDocuments.d.ts +1 -36
  31. package/lib/tax-axis/components/documents/TaxAxisDocuments.js +86 -363
  32. package/lib/tax-axis/components/extractionReview/TaxAxisExtractionReview.js +17 -17
  33. package/lib/tax-axis/components/intake/ClientParametersSection.js +30 -14
  34. package/lib/tax-axis/components/intake/CpaIntakeQuestionsSection.js +3 -3
  35. package/lib/tax-axis/components/intake/IntakeCtaCards.d.ts +2 -1
  36. package/lib/tax-axis/components/intake/IntakeCtaCards.js +13 -6
  37. package/lib/tax-axis/components/intake/RefineAnalysisSection.js +7 -7
  38. package/lib/tax-axis/components/intake/TaxAxisIntake.js +45 -6
  39. package/lib/tax-axis/components/intake/intakeSchema.d.ts +3 -0
  40. package/lib/tax-axis/components/intake/intakeSchema.js +4 -2
  41. package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.d.ts +2 -26
  42. package/lib/tax-axis/components/preparerWorkpaper/TaxAxisPreparerWorkpaper.js +4 -15
  43. package/lib/tax-axis/components/processing/TaxAxisProcessing.d.ts +1 -3
  44. package/lib/tax-axis/components/processing/TaxAxisProcessing.js +31 -102
  45. package/lib/tax-axis/components/prospectReport/ProspectPrintView.js +2 -0
  46. package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.d.ts +8 -1
  47. package/lib/tax-axis/components/prospectReport/ProspectStrategyCard.js +5 -5
  48. package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.d.ts +27 -1
  49. package/lib/tax-axis/components/prospectReport/TaxAxisProspectReport.js +43 -25
  50. package/lib/tax-axis/index.d.ts +0 -4
  51. package/lib/tax-axis/index.js +1 -6
  52. package/lib/tax-axis/lib/adapters/useEngineOutput.d.ts +13 -138
  53. package/lib/tax-axis/lib/adapters/useEngineOutput.js +7 -156
  54. package/lib/tax-axis/lib/data/documents.d.ts +2 -3
  55. package/lib/tax-axis/lib/data/documents.js +25 -225
  56. package/lib/tax-axis/lib/data/strategies.js +9 -9
  57. package/lib/tax-axis/lib/documentFieldCatalog.d.ts +12 -7
  58. package/lib/tax-axis/lib/documentFieldCatalog.js +8 -805
  59. package/lib/tax-axis/lib/types/index.d.ts +1 -13
  60. package/package.json +1 -1
@@ -49,8 +49,8 @@ const Chevron = () => (react_1.default.createElement("svg", { className: "absolu
49
49
  react_1.default.createElement("path", { d: "M3 4.5l3 3 3-3", stroke: "#E6E8F5", strokeWidth: "1.5", strokeLinecap: "round" })));
50
50
  /* ═══ Option lists (spec-canonical) ═══ */
51
51
  const ENTITY_OPTIONS = [
52
- "C-Corporation",
53
52
  "S-Corporation",
53
+ "C-Corporation",
54
54
  "LLC",
55
55
  "Partnership",
56
56
  "Sole Proprietor",
@@ -67,15 +67,23 @@ const INDUSTRY_OPTIONS = [
67
67
  "Other",
68
68
  ];
69
69
  const PERIOD_OPTIONS = ["Full Year", "YTD"];
70
- const YEAR_OPTIONS = ["2024", "2025", "2026"];
70
+ // Dynamic year options based on analysis period
71
+ const CURRENT_YEAR = new Date().getFullYear();
72
+ function getYearOptions(period) {
73
+ if (period === "YTD") {
74
+ return [String(CURRENT_YEAR)];
75
+ }
76
+ // Full Year — only completed years
77
+ return [
78
+ String(CURRENT_YEAR - 1),
79
+ String(CURRENT_YEAR - 2),
80
+ String(CURRENT_YEAR - 3),
81
+ ];
82
+ }
71
83
  function ClientParametersSection({ userContext = "expert", }) {
72
- const { control, formState: { errors }, } = (0, react_hook_form_1.useFormContext)();
73
- // TECH DEBT (post-BDO): Analysis Period dropdown is local useState only —
74
- // value does not persist to form state because ClientProfile has no `period`
75
- // field. computeAllStrategies does not read this value. Spec defect.
76
- // Resolve post-BDO by either adding `period` to ClientProfile or removing
77
- // the field entirely.
78
- const [analysisPeriod, setAnalysisPeriod] = (0, react_1.useState)("Full Year");
84
+ const { control, watch, setValue, formState: { errors }, } = (0, react_hook_form_1.useFormContext)();
85
+ const period = watch("period") || "Full Year";
86
+ const yearOptions = getYearOptions(period);
79
87
  const [expanded, setExpanded] = (0, react_1.useState)(true);
80
88
  return (react_1.default.createElement(TaxAxisCard_1.TaxAxisCard, null,
81
89
  react_1.default.createElement("div", { onClick: () => setExpanded((prev) => !prev), className: "flex items-center justify-between cursor-pointer", style: { marginBottom: expanded ? 14 : 0 } },
@@ -83,7 +91,7 @@ function ClientParametersSection({ userContext = "expert", }) {
83
91
  react_1.default.createElement("svg", { className: `transition-transform ${expanded ? "rotate-180" : "rotate-0"}`, width: "10", height: "10", viewBox: "0 0 12 12", fill: "none" },
84
92
  react_1.default.createElement("path", { d: "M3 4.5l3 3 3-3", stroke: "#9498B8", strokeWidth: "1.5", strokeLinecap: "round" }))),
85
93
  expanded && (react_1.default.createElement(react_1.default.Fragment, null,
86
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3" },
94
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3" },
87
95
  react_1.default.createElement("div", null,
88
96
  react_1.default.createElement("label", { className: labelCls }, "Business Name"),
89
97
  react_1.default.createElement(react_hook_form_1.Controller, { name: "bizName", control: control, render: ({ field }) => (react_1.default.createElement("input", Object.assign({}, field, { placeholder: "Acme Consulting LLC", className: inputCls }))) }),
@@ -106,9 +114,17 @@ function ClientParametersSection({ userContext = "expert", }) {
106
114
  errors.industry && react_1.default.createElement("div", { className: errCls }, errors.industry.message)),
107
115
  react_1.default.createElement("div", null,
108
116
  react_1.default.createElement("label", { className: labelCls }, "Analysis Period"),
109
- react_1.default.createElement("div", { className: "relative" },
110
- react_1.default.createElement("select", { value: analysisPeriod, onChange: e => setAnalysisPeriod(e.target.value), className: selectCls }, PERIOD_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
111
- react_1.default.createElement(Chevron, null))),
117
+ react_1.default.createElement(react_hook_form_1.Controller, { name: "period", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
118
+ react_1.default.createElement("select", Object.assign({}, field, { value: field.value || "Full Year", onChange: e => {
119
+ field.onChange(e.target.value);
120
+ // When switching period, auto-fix year to valid option
121
+ const nextOptions = getYearOptions(e.target.value);
122
+ const currentYear = watch("year");
123
+ if (!nextOptions.includes(currentYear || "")) {
124
+ setValue("year", nextOptions[0]);
125
+ }
126
+ }, className: selectCls }), PERIOD_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
127
+ react_1.default.createElement(Chevron, null))) })),
112
128
  react_1.default.createElement("div", null,
113
129
  react_1.default.createElement("label", { className: labelCls }, "Annual Revenue"),
114
130
  react_1.default.createElement(react_hook_form_1.Controller, { name: "revenue", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
@@ -126,7 +142,7 @@ function ClientParametersSection({ userContext = "expert", }) {
126
142
  react_1.default.createElement("div", null,
127
143
  react_1.default.createElement("label", { className: labelCls }, "Tax Year"),
128
144
  react_1.default.createElement(react_hook_form_1.Controller, { name: "year", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
129
- react_1.default.createElement("select", Object.assign({}, field, { className: selectCls }), YEAR_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
145
+ react_1.default.createElement("select", Object.assign({}, field, { className: selectCls, disabled: period === "YTD", style: period === "YTD" ? { opacity: 0.6, cursor: "not-allowed" } : undefined }), yearOptions.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
130
146
  react_1.default.createElement(Chevron, null))) }),
131
147
  errors.year && react_1.default.createElement("div", { className: errCls }, errors.year.message))),
132
148
  react_1.default.createElement("div", { className: "border-t border-tax-axis-border pt-3 mt-3.5" },
@@ -50,7 +50,7 @@ function CpaIntakeQuestionsSection({ userContext = "expert", }) {
50
50
  react_1.default.createElement("svg", { className: `transition-transform ${expanded ? "rotate-180" : "rotate-0"}`, width: "10", height: "10", viewBox: "0 0 12 12", fill: "none" },
51
51
  react_1.default.createElement("path", { d: "M3 4.5l3 3 3-3", stroke: "#9498B8", strokeWidth: "1.5", strokeLinecap: "round" }))),
52
52
  expanded && (react_1.default.createElement("div", null,
53
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 mb-2.5" },
53
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
54
54
  react_1.default.createElement("div", null,
55
55
  react_1.default.createElement("label", { className: labelCls }, "Overtime Premium Paid"),
56
56
  react_1.default.createElement(react_hook_form_1.Controller, { name: "overtimePremium", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
@@ -63,7 +63,7 @@ function CpaIntakeQuestionsSection({ userContext = "expert", }) {
63
63
  react_1.default.createElement("input", Object.assign({}, field, { placeholder: "0", className: `${inputCls} pr-6` })),
64
64
  react_1.default.createElement("span", { className: "absolute right-2.5 top-1/2 -translate-y-1/2 text-tax-axis-text-3 text-[13px]" }, "%"))) }),
65
65
  industry !== "Restaurant / Hospitality" && (react_1.default.createElement("div", { className: helperCls }, "Typically relevant for Restaurant / Hospitality")))),
66
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 mb-2.5" },
66
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
67
67
  react_1.default.createElement("div", null,
68
68
  react_1.default.createElement("label", { className: labelCls }, "Retirement Plan Contributions"),
69
69
  react_1.default.createElement(react_hook_form_1.Controller, { name: "retirementContributions", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
@@ -79,7 +79,7 @@ function CpaIntakeQuestionsSection({ userContext = "expert", }) {
79
79
  react_1.default.createElement(react_hook_form_1.Controller, { name: "hsaContributions", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
80
80
  react_1.default.createElement("span", { className: "absolute left-2.5 top-1/2 -translate-y-1/2 text-tax-axis-text-3 text-[13px]" }, "$"),
81
81
  react_1.default.createElement("input", Object.assign({}, field, { placeholder: "0", className: `${inputCls} pl-6` })))) }))))),
82
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 mb-2.5" },
82
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
83
83
  react_1.default.createElement("div", null,
84
84
  react_1.default.createElement("label", { className: labelCls }, "WOTC Qualifying Hires"),
85
85
  react_1.default.createElement(react_hook_form_1.Controller, { name: "wotcHires", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
@@ -4,6 +4,7 @@ interface IntakeCtaCardsProps {
4
4
  onProspect: () => void;
5
5
  onFullAnalysis: () => void;
6
6
  userContext?: UserContext;
7
+ missingFields?: string[];
7
8
  }
8
- export declare function IntakeCtaCards({ onProspect, onFullAnalysis, userContext, }: IntakeCtaCardsProps): React.JSX.Element;
9
+ export declare function IntakeCtaCards({ onProspect, onFullAnalysis, userContext, missingFields, }: IntakeCtaCardsProps): React.JSX.Element;
9
10
  export {};
@@ -7,15 +7,19 @@ exports.IntakeCtaCards = IntakeCtaCards;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const TaxAxisButton_1 = require("../shared/TaxAxisButton");
9
9
  const TaxAxisBadge_1 = require("../shared/TaxAxisBadge");
10
- function IntakeCtaCards({ onProspect, onFullAnalysis, userContext = "expert", }) {
11
- return (react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3" },
10
+ function IntakeCtaCards({ onProspect, onFullAnalysis, userContext = "expert", missingFields = [], }) {
11
+ const disabled = missingFields.length > 0;
12
+ return (react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3", style: { position: "sticky", bottom: 0, zIndex: 10, paddingTop: 12, paddingBottom: 4, background: "linear-gradient(to bottom, transparent 0%, #060821 16%)" } },
12
13
  react_1.default.createElement("div", { className: "bg-tax-axis-surface border border-tax-axis-border rounded-xl p-4 min-h-[140px] flex flex-col transition-all" },
13
14
  react_1.default.createElement("div", { className: "text-[11px] font-bold text-tax-axis-orange uppercase tracking-widest mb-2.5 font-tax-axis-body" }, "Prospect Report"),
14
15
  react_1.default.createElement("div", { className: "text-xs text-tax-axis-text-3 font-tax-axis-body mb-3" }, "Top 3 strategies \u00B7 Savings ranges \u00B7 ~2 min \u00B7 No docs"),
15
16
  react_1.default.createElement("div", { className: "flex-1" }),
16
- react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { variant: "orange", onClick: onProspect, className: "w-full text-xs" }, userContext === "cpa-firm-client"
17
+ react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { variant: "orange", onClick: onProspect, className: "w-full text-xs", disabled: disabled }, userContext === "cpa-firm-client"
17
18
  ? "Generate My Savings Report"
18
- : "Generate Prospect Report")),
19
+ : "Generate Prospect Report"),
20
+ disabled && (react_1.default.createElement("div", { className: "text-[10px] text-tax-axis-text-4 mt-1.5 font-tax-axis-body leading-tight" },
21
+ "Missing: ",
22
+ missingFields.join(", ")))),
19
23
  react_1.default.createElement("div", { className: "bg-tax-axis-surface border border-tax-axis-teal rounded-xl p-4 min-h-[140px] flex flex-col transition-all", style: {
20
24
  background: "radial-gradient(ellipse at 50% 0%,rgba(36,131,132,0.06) 0%,transparent 70%) #0F1330",
21
25
  boxShadow: "0 0 30px rgba(36,131,132,0.15)",
@@ -24,7 +28,10 @@ function IntakeCtaCards({ onProspect, onFullAnalysis, userContext = "expert", })
24
28
  react_1.default.createElement("div", { className: "text-[11px] font-bold text-tax-axis-teal uppercase tracking-widest mt-2 mb-2.5 font-tax-axis-body" }, "Full Analysis"),
25
29
  react_1.default.createElement("div", { className: "text-xs text-tax-axis-text-3 font-tax-axis-body mb-3" }, "All 25 strategies \u00B7 Real dollar savings \u00B7 ~15 min"),
26
30
  react_1.default.createElement("div", { className: "flex-1" }),
27
- react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { variant: "primary", onClick: onFullAnalysis, className: "w-full text-xs" }, userContext === "cpa-firm-client"
31
+ react_1.default.createElement(TaxAxisButton_1.TaxAxisButton, { variant: "primary", onClick: onFullAnalysis, className: "w-full text-xs", disabled: disabled }, userContext === "cpa-firm-client"
28
32
  ? "Run Full Analysis on My Business"
29
- : "Start Full Analysis"))));
33
+ : "Start Full Analysis"),
34
+ disabled && (react_1.default.createElement("div", { className: "text-[10px] text-tax-axis-text-4 mt-1.5 font-tax-axis-body leading-tight" },
35
+ "Missing: ",
36
+ missingFields.join(", "))))));
30
37
  }
@@ -70,7 +70,7 @@ function RefineAnalysisSection({ userContext: _userContext, }) {
70
70
  expanded && (react_1.default.createElement("div", null,
71
71
  react_1.default.createElement("div", { className: "text-[11px] text-tax-axis-text-4 italic mb-3" }, "These fields improve accuracy. Many will be auto-populated when documents are uploaded."),
72
72
  react_1.default.createElement("div", { className: subHeaderCls, style: { marginTop: 0 } }, "Client Profile"),
73
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 mb-2.5" },
73
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
74
74
  react_1.default.createElement("div", null,
75
75
  react_1.default.createElement("label", { className: labelCls }, "Filing Status"),
76
76
  react_1.default.createElement(react_hook_form_1.Controller, { name: "filingStatus", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
@@ -79,7 +79,7 @@ function RefineAnalysisSection({ userContext: _userContext, }) {
79
79
  react_1.default.createElement("div", null,
80
80
  react_1.default.createElement("label", { className: labelCls }, "Age"),
81
81
  react_1.default.createElement(react_hook_form_1.Controller, { name: "age", control: control, render: ({ field }) => (react_1.default.createElement("input", Object.assign({}, field, { type: "number", placeholder: "45", className: inputCls }))) }))),
82
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 mb-2.5" },
82
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
83
83
  react_1.default.createElement("div", null,
84
84
  react_1.default.createElement("label", { className: labelCls }, "SSTB"),
85
85
  react_1.default.createElement(react_hook_form_1.Controller, { name: "sstb", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
@@ -91,7 +91,7 @@ function RefineAnalysisSection({ userContext: _userContext, }) {
91
91
  react_1.default.createElement(react_hook_form_1.Controller, { name: "ownsRealEstate", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
92
92
  react_1.default.createElement("select", Object.assign({}, field, { className: selectCls }), REAL_ESTATE_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
93
93
  react_1.default.createElement(Chevron, null))) }))),
94
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 mb-2.5" },
94
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
95
95
  react_1.default.createElement("div", null,
96
96
  react_1.default.createElement("label", { className: labelCls }, "Itemizes Deductions"),
97
97
  react_1.default.createElement(react_hook_form_1.Controller, { name: "itemizesDeductions", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
@@ -103,7 +103,7 @@ function RefineAnalysisSection({ userContext: _userContext, }) {
103
103
  react_1.default.createElement("select", Object.assign({}, field, { className: selectCls }), SINGLE_OWNER_OPTIONS.map(o => (react_1.default.createElement("option", { key: o, value: o, className: "bg-tax-axis-surface-2" }, o)))),
104
104
  react_1.default.createElement(Chevron, null))) }))),
105
105
  react_1.default.createElement("div", { className: subHeaderCls }, "Financial Data"),
106
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 mb-2.5" },
106
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
107
107
  react_1.default.createElement("div", null,
108
108
  react_1.default.createElement("label", { className: labelCls }, "Net Income"),
109
109
  react_1.default.createElement(react_hook_form_1.Controller, { name: "netIncome", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
@@ -114,7 +114,7 @@ function RefineAnalysisSection({ userContext: _userContext, }) {
114
114
  react_1.default.createElement(react_hook_form_1.Controller, { name: "equipmentPurchased", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
115
115
  react_1.default.createElement("span", { className: "absolute left-2.5 top-1/2 -translate-y-1/2 text-tax-axis-text-3 text-[13px]" }, "$"),
116
116
  react_1.default.createElement("input", Object.assign({}, field, { placeholder: "0", className: `${inputCls} pl-6` })))) }))),
117
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 mb-2.5" },
117
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
118
118
  ownsRealEstate !== "No" ? (react_1.default.createElement("div", { className: "transition-opacity" },
119
119
  react_1.default.createElement("label", { className: labelCls }, "Real Estate Value"),
120
120
  react_1.default.createElement(react_hook_form_1.Controller, { name: "realEstateValue", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
@@ -126,7 +126,7 @@ function RefineAnalysisSection({ userContext: _userContext, }) {
126
126
  react_1.default.createElement("span", { className: "absolute left-2.5 top-1/2 -translate-y-1/2 text-tax-axis-text-3 text-[13px]" }, "$"),
127
127
  react_1.default.createElement("input", Object.assign({}, field, { placeholder: "0", className: `${inputCls} pl-6` })))) }))),
128
128
  react_1.default.createElement("div", { className: subHeaderCls }, "Tax Profile"),
129
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 mb-2.5" },
129
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
130
130
  react_1.default.createElement("div", null,
131
131
  react_1.default.createElement("label", { className: labelCls }, "Federal Marginal Rate"),
132
132
  react_1.default.createElement(react_hook_form_1.Controller, { name: "federalRate", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
@@ -137,7 +137,7 @@ function RefineAnalysisSection({ userContext: _userContext, }) {
137
137
  react_1.default.createElement(react_hook_form_1.Controller, { name: "stateRate", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
138
138
  react_1.default.createElement("input", Object.assign({}, field, { placeholder: "4.95", className: `${inputCls} pr-6` })),
139
139
  react_1.default.createElement("span", { className: "absolute right-2.5 top-1/2 -translate-y-1/2 text-tax-axis-text-3 text-[13px]" }, "%"))) }))),
140
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 mb-2.5" },
140
+ react_1.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-2.5" },
141
141
  react_1.default.createElement("div", null,
142
142
  react_1.default.createElement("label", { className: labelCls }, "Tax Data Years Available"),
143
143
  react_1.default.createElement(react_hook_form_1.Controller, { name: "taxDataYears", control: control, render: ({ field }) => (react_1.default.createElement("div", { className: "relative" },
@@ -1,18 +1,56 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
4
24
  };
5
25
  Object.defineProperty(exports, "__esModule", { value: true });
6
26
  exports.TaxAxisIntake = TaxAxisIntake;
7
- const react_1 = __importDefault(require("react"));
27
+ const react_1 = __importStar(require("react"));
8
28
  const react_hook_form_1 = require("react-hook-form");
9
29
  const yup_1 = require("@hookform/resolvers/yup");
30
+ const compute_1 = require("../../lib/compute");
10
31
  const intakeSchema_1 = require("./intakeSchema");
11
32
  const ClientParametersSection_1 = require("./ClientParametersSection");
12
33
  const RefineAnalysisSection_1 = require("./RefineAnalysisSection");
13
34
  const CpaIntakeQuestionsSection_1 = require("./CpaIntakeQuestionsSection");
14
35
  const StrategyRadar_1 = require("./StrategyRadar");
15
36
  const IntakeCtaCards_1 = require("./IntakeCtaCards");
37
+ /** Returns a list of human-readable labels for missing required fields. */
38
+ function getMissingFields(p) {
39
+ const missing = [];
40
+ if (!p.entity)
41
+ missing.push("Entity Type");
42
+ if (!p.states || p.states.length === 0)
43
+ missing.push("State");
44
+ if (!p.revenue || (0, compute_1.parseNum)(p.revenue) <= 0)
45
+ missing.push("Revenue");
46
+ const fedPct = parseFloat((p.federalRate || "0").replace("%", ""));
47
+ if (!fedPct || fedPct <= 0)
48
+ missing.push("Federal Rate");
49
+ const statePct = parseFloat((p.stateRate || "0").replace("%", ""));
50
+ if (!statePct || statePct <= 0)
51
+ missing.push("State Rate");
52
+ return missing;
53
+ }
16
54
  function TaxAxisIntake({ userContext = "expert", onProspect, onFullAnalysis, initialProfile, }) {
17
55
  const methods = (0, react_hook_form_1.useForm)({
18
56
  resolver: (0, yup_1.yupResolver)(intakeSchema_1.intakeSchema), // yupResolver generic incompatibility with RHF v7 — cast is intentional
@@ -20,6 +58,7 @@ function TaxAxisIntake({ userContext = "expert", onProspect, onFullAnalysis, ini
20
58
  mode: "onChange",
21
59
  });
22
60
  const profile = methods.watch();
61
+ const missingFields = (0, react_1.useMemo)(() => getMissingFields(profile), [profile]);
23
62
  const handleProspect = () => {
24
63
  methods.handleSubmit((valid) => onProspect(valid), () => { })();
25
64
  };
@@ -27,12 +66,12 @@ function TaxAxisIntake({ userContext = "expert", onProspect, onFullAnalysis, ini
27
66
  methods.handleSubmit((valid) => onFullAnalysis(valid), () => { })();
28
67
  };
29
68
  return (react_1.default.createElement(react_hook_form_1.FormProvider, Object.assign({}, methods),
30
- react_1.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-5" },
69
+ react_1.default.createElement("div", { className: "grid grid-cols-[1fr_1fr] gap-5" },
31
70
  react_1.default.createElement("div", { className: "flex flex-col gap-4" },
32
71
  react_1.default.createElement(ClientParametersSection_1.ClientParametersSection, { userContext: userContext }),
33
72
  react_1.default.createElement(RefineAnalysisSection_1.RefineAnalysisSection, { userContext: userContext }),
34
73
  react_1.default.createElement(CpaIntakeQuestionsSection_1.CpaIntakeQuestionsSection, { userContext: userContext }),
35
- react_1.default.createElement(IntakeCtaCards_1.IntakeCtaCards, { onProspect: handleProspect, onFullAnalysis: handleFull, userContext: userContext })),
36
- react_1.default.createElement("div", { className: "hidden sm:block sm:sticky sm:top-5 sm:self-start" },
74
+ react_1.default.createElement(IntakeCtaCards_1.IntakeCtaCards, { onProspect: handleProspect, onFullAnalysis: handleFull, userContext: userContext, missingFields: missingFields })),
75
+ react_1.default.createElement("div", { className: "sticky top-5 self-start", style: { minWidth: 0, overflow: 'hidden' } },
37
76
  react_1.default.createElement(StrategyRadar_1.StrategyRadar, { profile: profile })))));
38
77
  }
@@ -20,6 +20,7 @@ export declare const intakeSchema: Yup.ObjectSchema<import("yup/lib/object").Ass
20
20
  equipmentPurchased: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
21
21
  realEstateValue: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
22
22
  capitalGains: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
23
+ period: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
23
24
  federalRate: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
24
25
  stateRate: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
25
26
  taxDataYears: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
@@ -51,6 +52,7 @@ export declare const intakeSchema: Yup.ObjectSchema<import("yup/lib/object").Ass
51
52
  equipmentPurchased: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
52
53
  realEstateValue: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
53
54
  capitalGains: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
55
+ period: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
54
56
  federalRate: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
55
57
  stateRate: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
56
58
  taxDataYears: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
@@ -82,6 +84,7 @@ export declare const intakeSchema: Yup.ObjectSchema<import("yup/lib/object").Ass
82
84
  equipmentPurchased: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
83
85
  realEstateValue: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
84
86
  capitalGains: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
87
+ period: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
85
88
  federalRate: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
86
89
  stateRate: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
87
90
  taxDataYears: Yup.StringSchema<string, import("yup/lib/types").AnyObject, string>;
@@ -45,6 +45,7 @@ exports.intakeSchema = Yup.object().shape({
45
45
  equipmentPurchased: Yup.string().ensure(),
46
46
  realEstateValue: Yup.string().ensure(),
47
47
  capitalGains: Yup.string().ensure(),
48
+ period: Yup.string().ensure(),
48
49
  federalRate: Yup.string().ensure(),
49
50
  stateRate: Yup.string().ensure(),
50
51
  taxDataYears: Yup.string().ensure(),
@@ -60,13 +61,13 @@ exports.intakeSchema = Yup.object().shape({
60
61
  exports.intakeDefaultValues = {
61
62
  bizName: "",
62
63
  cpaName: "",
63
- entity: "C-Corporation",
64
+ entity: "S-Corporation",
64
65
  industry: "Professional Services",
65
66
  revenue: "",
66
67
  netIncome: "",
67
68
  ownerComp: "",
68
69
  employees: "",
69
- year: "2026",
70
+ year: String(new Date().getFullYear() - 1),
70
71
  states: [],
71
72
  filingStatus: "MFJ",
72
73
  age: "",
@@ -77,6 +78,7 @@ exports.intakeDefaultValues = {
77
78
  equipmentPurchased: "0",
78
79
  realEstateValue: "0",
79
80
  capitalGains: "0",
81
+ period: "Full Year",
80
82
  federalRate: "24%",
81
83
  stateRate: "",
82
84
  taxDataYears: "1 year",
@@ -1,33 +1,9 @@
1
1
  import React from "react";
2
- import type { ClientProfile, Strategy, ComputedMap } from "../../lib/types";
2
+ import type { ClientProfile } from "../../lib/types";
3
3
  import type { TaxAxisScreenProps } from "../../lib/types";
4
4
  export interface TaxAxisPreparerWorkpaperProps extends TaxAxisScreenProps {
5
5
  profile: ClientProfile;
6
6
  onBack: () => void;
7
7
  onToggleToClient?: () => void;
8
- /** When provided, bypasses local filterEligibleStrategies + computeAllStrategies. */
9
- liveStrategies?: Strategy[];
10
- /** When provided, bypasses local computeAllStrategies. Must accompany liveStrategies. */
11
- liveComputedMap?: ComputedMap;
12
- /** Live cpa_workflow from engine output */
13
- cpaWorkflow?: {
14
- workpaper_codes?: string[] | null;
15
- section_6694_notices?: Array<{
16
- strategy_id: string;
17
- position_strength: string;
18
- notice: string;
19
- }>;
20
- prior_year_flags?: string[];
21
- engagement_recommendations?: string[];
22
- };
23
- /** Live risk disclosures from engine output */
24
- riskDisclosures?: string[];
25
- /** Live business profile from engine output */
26
- businessProfile?: {
27
- confidence_tier?: string;
28
- data_years?: number;
29
- data_quality_flags?: string[];
30
- effective_tax_rate?: number;
31
- };
32
8
  }
33
- export declare function TaxAxisPreparerWorkpaper({ profile, onBack, onToggleToClient, liveStrategies, liveComputedMap, cpaWorkflow, riskDisclosures, businessProfile }: TaxAxisPreparerWorkpaperProps): React.JSX.Element;
9
+ export declare function TaxAxisPreparerWorkpaper({ profile, onBack, onToggleToClient }: TaxAxisPreparerWorkpaperProps): React.JSX.Element;
@@ -32,14 +32,12 @@ const ReportToolbar_1 = require("../shared/ReportToolbar");
32
32
  const EngagementHeader_1 = require("./EngagementHeader");
33
33
  const Section6694Summary_1 = require("./Section6694Summary");
34
34
  const PriorityGroup_1 = require("./PriorityGroup");
35
- function TaxAxisPreparerWorkpaper({ profile, onBack, onToggleToClient, liveStrategies, liveComputedMap, cpaWorkflow, riskDisclosures, businessProfile }) {
35
+ function TaxAxisPreparerWorkpaper({ profile, onBack, onToggleToClient }) {
36
36
  const [expanded, setExpanded] = (0, react_1.useState)({});
37
37
  const [printMode, setPrintMode] = (0, react_1.useState)(false);
38
38
  const toggle = (rank, section) => setExpanded(prev => (Object.assign(Object.assign({}, prev), { [rank + "-" + section]: !prev[rank + "-" + section] })));
39
- const staticEligible = (0, react_1.useMemo)(() => (0, compute_1.filterEligibleStrategies)(profile), [profile]);
40
- const staticComputed = (0, react_1.useMemo)(() => (0, compute_1.computeAllStrategies)(profile), [profile]);
41
- const eligible = liveStrategies !== null && liveStrategies !== void 0 ? liveStrategies : staticEligible;
42
- const computed = liveComputedMap !== null && liveComputedMap !== void 0 ? liveComputedMap : staticComputed;
39
+ const eligible = (0, react_1.useMemo)(() => (0, compute_1.filterEligibleStrategies)(profile), [profile]);
40
+ const computed = (0, react_1.useMemo)(() => (0, compute_1.computeAllStrategies)(profile), [profile]);
43
41
  const states = profile.states || [];
44
42
  const bizName = profile.bizName || "Client";
45
43
  const rev = parseInt((profile.revenue || "0").replace(/,/g, "")) || 0;
@@ -113,7 +111,7 @@ function TaxAxisPreparerWorkpaper({ profile, onBack, onToggleToClient, liveStrat
113
111
  .flex.flex-col.w-full { margin-top: 0 !important; }
114
112
  main.w-full { width: 100% !important; margin-left: 0 !important; padding: 0 !important; }
115
113
  * { color-adjust: exact; -webkit-print-color-adjust: exact; }
116
- p, span, div, td, th, li { color: #212529 !important; }
114
+ body, p, span, div, td, th, li { color: #212529 !important; }
117
115
  h1, h2, h3, h4, h5, h6, strong, b { color: #060821 !important; }
118
116
  }
119
117
  `),
@@ -168,15 +166,6 @@ function TaxAxisPreparerWorkpaper({ profile, onBack, onToggleToClient, liveStrat
168
166
  "$" + interactionAdj.toLocaleString() + " ",
169
167
  react_1.default.createElement("span", { style: { fontWeight: 400, fontSize: 10 } }, "(\u221215%)")),
170
168
  react_1.default.createElement("td", { colSpan: 2 })))))),
171
- (cpaWorkflow === null || cpaWorkflow === void 0 ? void 0 : cpaWorkflow.engagement_recommendations) && cpaWorkflow.engagement_recommendations.length > 0 && (react_1.default.createElement("div", { style: Object.assign(Object.assign({}, card), { marginBottom: 24 }) },
172
- react_1.default.createElement("div", { style: sectionTitle }, "CPA ENGAGEMENT NOTES"),
173
- cpaWorkflow.engagement_recommendations.map((rec, i) => (react_1.default.createElement("div", { key: i, style: { fontSize: 12, color: palette_1.P.gray700, lineHeight: 1.7, fontFamily: palette_1.P.body, padding: '8px 0', borderTop: i > 0 ? '1px solid ' + palette_1.P.gray100 : 'none' } }, rec))))),
174
- riskDisclosures && riskDisclosures.length > 0 && (react_1.default.createElement("div", { style: Object.assign(Object.assign({}, card), { marginBottom: 24, borderColor: '#FDBA74' }) },
175
- react_1.default.createElement("div", { style: Object.assign(Object.assign({}, sectionTitle), { color: palette_1.P.orange }) }, "RISK DISCLOSURES"),
176
- riskDisclosures.map((r, i) => (react_1.default.createElement("div", { key: i, style: { fontSize: 11, color: palette_1.P.gray600, lineHeight: 1.65, fontFamily: palette_1.P.body, padding: '6px 0', borderTop: i > 0 ? '1px solid ' + palette_1.P.gray100 : 'none' } }, r))))),
177
- (businessProfile === null || businessProfile === void 0 ? void 0 : businessProfile.data_quality_flags) && businessProfile.data_quality_flags.length > 0 && (react_1.default.createElement("div", { style: Object.assign(Object.assign({}, card), { marginBottom: 24, borderColor: '#FDBA74' }) },
178
- react_1.default.createElement("div", { style: Object.assign(Object.assign({}, sectionTitle), { color: palette_1.P.orange }) }, "DATA QUALITY FLAGS"),
179
- businessProfile.data_quality_flags.map((f, i) => (react_1.default.createElement("div", { key: i, style: { fontSize: 11, color: palette_1.P.gray600, padding: '4px 0', fontFamily: palette_1.P.body } }, f))))),
180
169
  react_1.default.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", padding: "12px 0", borderTop: "1px solid " + palette_1.P.gray200, fontSize: 11, color: palette_1.P.gray500, fontFamily: palette_1.P.body } },
181
170
  react_1.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: 6 } },
182
171
  react_1.default.createElement("div", { style: { width: 16, height: 16, borderRadius: 4, background: palette_1.P.navy, display: "flex", alignItems: "center", justifyContent: "center" } },
@@ -3,7 +3,5 @@ import { ClientProfile, TaxAxisScreenProps } from "../../lib/types";
3
3
  export interface TaxAxisProcessingProps extends TaxAxisScreenProps {
4
4
  onComplete: () => void;
5
5
  profile?: ClientProfile;
6
- /** Set to true by the shell poller when stage===REPORT_READY is detected. */
7
- reportReady?: boolean;
8
6
  }
9
- export declare function TaxAxisProcessing({ onComplete, profile, reportReady, userContext: _userContext, }: TaxAxisProcessingProps): React.JSX.Element;
7
+ export declare function TaxAxisProcessing({ onComplete, profile, userContext: _userContext, }: TaxAxisProcessingProps): React.JSX.Element;