Skip to content

Commit 5ac5729

Browse files
authored
fix(TaxForms/W9): differenciate org/signer names (#1164)
* fix(TaxForms/W9): differenciate org/signer names * fix(TaxForms/W8BenE): add conditional logic for claims explanation field
1 parent b626e5c commit 5ac5729

File tree

4 files changed

+27
-23
lines changed

4 files changed

+27
-23
lines changed

server/lib/tax-forms/frontend-types.ts

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,6 @@ export enum NFFEStatus {
5757
NonProfitOrganization = 'NonProfitOrganization',
5858
}
5959

60-
export type TaxFormNameValues = { firstName?: string; middleName?: string; lastName?: string };
61-
62-
export type TaxFormLocationValues = {
63-
country?: string;
64-
structured?: { address1?: string; address2?: string; city?: string; zone?: string; postalCode?: string };
65-
};
66-
6760
export type BaseFormValues = {
6861
isUSPersonOrEntity?: boolean;
6962
submitterType?: SubmitterType;
@@ -80,6 +73,7 @@ export type W9TaxFormValues = {
8073
email?: string;
8174
signer?: { firstName?: string; middleName?: string; lastName?: string };
8275
isSigned?: boolean;
76+
organizationName?: string;
8377
businessName?: string;
8478
federalTaxClassificationDetails?: string;
8579
exemptPayeeCode?: string;
@@ -102,6 +96,7 @@ export type W8BenTaxFormValues = ({
10296
email?: string;
10397
signer?: { firstName?: string; middleName?: string; lastName?: string };
10498
isSigned?: boolean;
99+
hasConfirmedTOS?: boolean;
105100
beneficialOwner?: { firstName?: string; middleName?: string; lastName?: string };
106101
taxpayerIdentificationNumberTypeUS?: 'SSN' | 'ITIN';
107102
taxpayerIdentificationNumberUS?: string;
@@ -116,7 +111,6 @@ export type W8BenTaxFormValues = ({
116111
country?: string;
117112
structured?: { address1?: string; address2?: string; city?: string; zone?: string; postalCode?: string };
118113
};
119-
hasConfirmedTOS?: boolean;
120114
claimsSpecialRatesAndConditions?: boolean;
121115
isSignerTheBeneficialOwner?: boolean;
122116
certifiesResidentCountry?: boolean;
@@ -130,11 +124,12 @@ export type W8BenTaxFormValues = ({
130124
| { claimsSpecialRatesAndConditions?: false }
131125
| {
132126
claimsSpecialRatesAndConditions?: true;
133-
hasTaxTreatySpecialRatesAndConditions?: boolean;
134127
certifiesResidentCountry?: boolean;
128+
hasTaxTreatySpecialRatesAndConditions?: boolean;
135129
}
136130
) &
137131
(
132+
| { hasTaxTreatySpecialRatesAndConditions?: any }
138133
| { hasTaxTreatySpecialRatesAndConditions?: false }
139134
| {
140135
hasTaxTreatySpecialRatesAndConditions?: true;
@@ -154,6 +149,14 @@ export type W8BenETaxFormValues = ((({
154149
signer?: { firstName?: string; middleName?: string; lastName?: string };
155150
isSigned?: boolean;
156151
businessName?: string;
152+
hasConfirmedTOS?: boolean;
153+
taxpayerIdentificationNumberUS?: string;
154+
taxpayerIdentificationNumberForeign?: string;
155+
claimsSpecialRatesAndConditions?: boolean;
156+
claimsArticleAndParagraph?: string;
157+
claimsRate?: number;
158+
claimsIncomeType?: string;
159+
claimsExplanation?: string;
157160
businessCountryOfIncorporationOrOrganization?: string;
158161
businessAddress?: {
159162
country?: string;
@@ -167,23 +170,15 @@ export type W8BenETaxFormValues = ((({
167170
chapter3Status?: Chapter3Status;
168171
hasCapacityToSign?: boolean;
169172
certifyStatus?: boolean;
170-
taxpayerIdentificationNumberForeign?: string;
171-
taxpayerIdentificationNumberUS?: string;
172173
giin?: string;
173174
reference?: string;
174-
hasConfirmedTOS?: boolean;
175175
isHybridEntity?: boolean;
176-
claimsSpecialRatesAndConditions?: boolean;
177176
nffeStatus?: NFFEStatus;
178177
certifyDerivesIncome?: boolean;
179178
typeOfLimitationOnBenefitsProvisions?: TypeOfLimitationOnBenefitsProvisions;
180179
typeOfLimitationOnBenefitsProvisionsOther?: string;
181180
certifyBeneficialOwnerCountry?: boolean;
182181
certifyForeignCorporation?: boolean;
183-
claimsArticleAndParagraph?: string;
184-
claimsRate?: number;
185-
claimsIncomeType?: string;
186-
claimsExplanation?: string;
187182
usOwners?: {
188183
name?: string;
189184
address?: {
@@ -197,7 +192,6 @@ export type W8BenETaxFormValues = ((({
197192
| { nffeStatus?: NFFEStatus.NonProfitOrganization }
198193
| {
199194
nffeStatus?: NFFEStatus.PassiveNFFE;
200-
entityHasNoUSOwners?: boolean;
201195
usOwners?: {
202196
name?: string;
203197
address?: {
@@ -206,16 +200,17 @@ export type W8BenETaxFormValues = ((({
206200
};
207201
tin?: string;
208202
}[];
203+
entityHasNoUSOwners?: boolean;
209204
}
210205
)) &
211206
(
212207
| { isHybridEntity?: boolean }
213208
| {
209+
claimsSpecialRatesAndConditions?: boolean;
214210
isHybridEntity?: boolean;
215-
certifyBeneficialOwnerCountry?: boolean;
216211
certifyDerivesIncome?: boolean;
212+
certifyBeneficialOwnerCountry?: boolean;
217213
certifyForeignCorporation?: boolean;
218-
claimsSpecialRatesAndConditions?: boolean;
219214
}
220215
)) &
221216
(

server/lib/tax-forms/w8-ben-e.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export const W8BenEFieldsDefinition: Partial<Record<keyof W8BenETaxFormValues, P
8282
},
8383
claimsExplanation: {
8484
type: 'split-text',
85+
if: (value, values) => values.claimsSpecialRatesAndConditions,
8586
fields: [
8687
{ formPath: 'topmostSubform[0].Page2[0].f2_14[0]', maxLength: 18 },
8788
{ formPath: 'topmostSubform[0].Page2[0].f2_15[0]', maxLength: 120 },

server/lib/tax-forms/w9.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,19 @@ import dayjs from '../dayjs.js';
22
import { PDFDocument, PDFFont } from 'pdf-lib';
33
import { addSignature, fillPDFFormFromValues, PDFFieldDefinition } from '../pdf-lib-utils.js';
44
import { getFullName } from './utils.js';
5-
import { W9TaxFormValues } from './frontend-types.js';
5+
import { SubmitterType, W9TaxFormValues } from './frontend-types.js';
66
import { getCountryName } from '../i18n.js';
77

88
export const W9FieldsDefinition: Partial<Record<keyof W9TaxFormValues, PDFFieldDefinition>> = {
9-
signer: { formPath: 'topmostSubform[0].Page1[0].f1_01[0]', transform: getFullName },
9+
signer: {
10+
formPath: 'topmostSubform[0].Page1[0].f1_01[0]',
11+
transform: getFullName,
12+
if: (value, values) => values.submitterType === SubmitterType.Individual,
13+
},
14+
organizationName: {
15+
formPath: 'topmostSubform[0].Page1[0].f1_01[0]',
16+
if: (value, values) => values.submitterType === SubmitterType.Business,
17+
},
1018
businessName: 'topmostSubform[0].Page1[0].f1_02[0]',
1119
accountNumbers: 'topmostSubform[0].Page1[0].f1_10[0]',
1220
exemptPayeeCode: 'topmostSubform[0].Page1[0].f1_05[0]',

server/routes/tax-forms.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ router.get('/:formType.pdf', async (req: express.Request, res: express.Response)
5454

5555
// Set metadata
5656
const signerFullName = getFullName(values.signer);
57-
const entityName = values.businessName || signerFullName;
57+
const entityName = values.organizationName || values.businessName || signerFullName;
5858
pdfDoc.setTitle(`${formType} Form - ${entityName}`);
5959
pdfDoc.setSubject(`${formType} Form`);
6060
pdfDoc.setAuthor(signerFullName || '');

0 commit comments

Comments
 (0)