@@ -67,6 +67,8 @@ export function createSituation(
6767 pregnancyStatus = { } ,
6868 headAge = DEFAULT_AGE ,
6969 spouseAge = DEFAULT_AGE ,
70+ esiStatus = { } ,
71+ inNYC = false ,
7072) {
7173 const members = [ "you" ] ;
7274 const maritalUnitMembers = [ "you" ] ;
@@ -77,6 +79,7 @@ export function createSituation(
7779 employment_income : { [ year ] : headIncome } ,
7880 is_disabled : { [ year ] : disabilityStatus . head || false } ,
7981 is_pregnant : { [ year ] : pregnancyStatus . head || false } ,
82+ ...( esiStatus . head ? { has_esi : { [ year ] : true } } : { } ) ,
8083 } ,
8184 } ;
8285
@@ -86,6 +89,7 @@ export function createSituation(
8689 employment_income : { [ year ] : spouseIncome } ,
8790 is_disabled : { [ year ] : disabilityStatus . spouse || false } ,
8891 is_pregnant : { [ year ] : pregnancyStatus . spouse || false } ,
92+ ...( esiStatus . spouse ? { has_esi : { [ year ] : true } } : { } ) ,
8993 } ;
9094 members . push ( "your partner" ) ;
9195 maritalUnitMembers . push ( "your partner" ) ;
@@ -119,6 +123,7 @@ export function createSituation(
119123 "your household" : {
120124 members : [ ...members ] ,
121125 state_name : { [ year ] : stateCode } ,
126+ ...( inNYC ? { in_nyc : { [ year ] : true } } : { } ) ,
122127 } ,
123128 } ,
124129 } ;
@@ -296,6 +301,8 @@ export async function getPrograms(
296301 pregnancyStatus = { } ,
297302 headAge = DEFAULT_AGE ,
298303 spouseAge = DEFAULT_AGE ,
304+ esiStatus = { } ,
305+ inNYC = false ,
299306) {
300307 const situation = createSituation (
301308 stateCode ,
@@ -307,6 +314,8 @@ export async function getPrograms(
307314 pregnancyStatus ,
308315 headAge ,
309316 spouseAge ,
317+ esiStatus ,
318+ inNYC ,
310319 ) ;
311320 addOutputVariables ( situation , year , stateCode ) ;
312321
@@ -351,6 +360,8 @@ export async function getCategorizedPrograms(
351360 pregnancyStatus = { } ,
352361 headAge = DEFAULT_AGE ,
353362 spouseAge = DEFAULT_AGE ,
363+ esiStatus = { } ,
364+ inNYC = false ,
354365) {
355366 const [ married , headSingle , spouseSingle ] = await Promise . all ( [
356367 getPrograms (
@@ -363,6 +374,8 @@ export async function getCategorizedPrograms(
363374 pregnancyStatus ,
364375 headAge ,
365376 spouseAge ,
377+ esiStatus ,
378+ inNYC ,
366379 ) ,
367380 getPrograms (
368381 stateCode ,
@@ -373,6 +386,9 @@ export async function getCategorizedPrograms(
373386 year ,
374387 { head : pregnancyStatus . head || false } ,
375388 headAge ,
389+ DEFAULT_AGE ,
390+ { head : esiStatus . head || false } ,
391+ inNYC ,
376392 ) ,
377393 getPrograms (
378394 stateCode ,
@@ -383,6 +399,9 @@ export async function getCategorizedPrograms(
383399 year ,
384400 { head : pregnancyStatus . spouse || false } ,
385401 spouseAge ,
402+ DEFAULT_AGE ,
403+ { head : esiStatus . spouse || false } ,
404+ inNYC ,
386405 ) ,
387406 ] ) ;
388407
@@ -401,13 +420,15 @@ export async function getHeatmapData(
401420 spouseIncome = 0 ,
402421 headAge = DEFAULT_AGE ,
403422 spouseAge = DEFAULT_AGE ,
423+ esiStatus = { } ,
424+ inNYC = false ,
404425) {
405426 const rawMax = Math . max ( 80000 , headIncome , spouseIncome ) ;
406427 const step = Math . ceil ( rawMax / 32 / 2500 ) * 2500 ;
407428 const maxIncome = step * 32 ;
408429 const count = 33 ;
409430
410- function buildHeatmapSituation ( includeSpouse , childrenList , disability , pregnancy , hAge , sAge ) {
431+ function buildHeatmapSituation ( includeSpouse , childrenList , disability , pregnancy , hAge , sAge , esi ) {
411432 const situation = createSituation (
412433 stateCode ,
413434 maxIncome ,
@@ -418,6 +439,8 @@ export async function getHeatmapData(
418439 pregnancy ,
419440 hAge ,
420441 sAge ,
442+ esi || { } ,
443+ inNYC ,
421444 ) ;
422445 addOutputVariables ( situation , year , stateCode ) ;
423446
@@ -436,15 +459,17 @@ export async function getHeatmapData(
436459 }
437460
438461 const marriedSituation = buildHeatmapSituation (
439- true , children , disabilityStatus , pregnancyStatus , headAge , spouseAge ,
462+ true , children , disabilityStatus , pregnancyStatus , headAge , spouseAge , esiStatus ,
440463 ) ;
441464 const headSingleSituation = buildHeatmapSituation (
442465 false , children , disabilityStatus ,
443- { head : pregnancyStatus . head || false } , headAge ,
466+ { head : pregnancyStatus . head || false } , headAge , undefined ,
467+ { head : esiStatus . head || false } ,
444468 ) ;
445469 const spouseSingleSituation = buildHeatmapSituation (
446470 false , [ ] , { head : disabilityStatus . spouse || false } ,
447- { head : pregnancyStatus . spouse || false } , spouseAge ,
471+ { head : pregnancyStatus . spouse || false } , spouseAge , undefined ,
472+ { head : esiStatus . spouse || false } ,
448473 ) ;
449474
450475 const [ marriedResult , headResult , spouseResult ] = await Promise . all ( [
@@ -504,17 +529,24 @@ export async function getHeatmapData(
504529 // Transpose: API returns head-major (row=head, col=spouse) but Plotly
505530 // z[row][col] maps to y[row],x[col] and x=head, y=spouse, so we need
506531 // row=spouse, col=head.
507- return deltaGrid [ 0 ] . map ( ( _ , col ) =>
532+ const transposed = deltaGrid [ 0 ] . map ( ( _ , col ) =>
508533 deltaGrid . map ( ( row ) => row [ col ] ) ,
509534 ) ;
535+ return { grid : transposed , headLine : headFlat , spouseLine : spouseFlat } ;
510536 }
511537
538+ const headLines = { } ;
539+ const spouseLines = { } ;
540+
512541 for ( let v = 0 ; v < gridVars . length ; v ++ ) {
513542 const varName = gridVars [ v ] ;
514- const transposed = buildDeltaGrid (
543+ const { grid : transposed , headLine , spouseLine } = buildDeltaGrid (
515544 marriedData [ varName ] , headData [ varName ] , spouseData [ varName ] ,
516545 ) ;
517546
547+ headLines [ tabNames [ v ] ] = headLine ;
548+ spouseLines [ tabNames [ v ] ] = spouseLine ;
549+
518550 if ( varName === "household_tax_before_refundable_credits" ) {
519551 grids [ tabNames [ v ] ] = transposed . map ( ( row ) => row . map ( ( val ) => - val ) ) ;
520552 } else {
@@ -528,8 +560,14 @@ export async function getHeatmapData(
528560 grids [ "Federal Credits" ] = totalCreditsGrid . map ( ( row , i ) =>
529561 row . map ( ( val , j ) => val - stateCreditsGrid [ i ] [ j ] ) ,
530562 ) ;
563+ headLines [ "Federal Credits" ] = ( headLines [ "Refundable Tax Credits" ] || [ ] ) . map (
564+ ( v , i ) => v - ( headLines [ "State Credits" ] ?. [ i ] || 0 ) ,
565+ ) ;
566+ spouseLines [ "Federal Credits" ] = ( spouseLines [ "Refundable Tax Credits" ] || [ ] ) . map (
567+ ( v , i ) => v - ( spouseLines [ "State Credits" ] ?. [ i ] || 0 ) ,
568+ ) ;
531569
532- return { grids, maxIncome, count, programData, stateCreditEntries } ;
570+ return { grids, maxIncome, count, programData, stateCreditEntries, headLines , spouseLines } ;
533571}
534572
535573export function buildCellResults ( programData , headIdx , spouseIdx , count , stateCreditEntries ) {
0 commit comments