Skip to content

Commit

Permalink
Handle multi-item incentives, and more items (#158)
Browse files Browse the repository at this point in the history
## Description

This adds human-friendly labels for all the new items, plus labels for
a few specific groups of items. (E.g. an incentive for both
`ducted_heat_pump` and `ductless_heat_pump` will be shown as being for
"an air-source heat pump".)

I factored out the name logic into a new file because it's getting
pretty extensive.

The Spanish translations are taken from existing translations of
incentive descriptions (which, helpfully, serves to validate that all
the new items exist in incentives we already have). So I can't fully
vouch for them myself, but they are sourced from our human-vetted
translations.

## Test Plan

Cypress tests pass. New unit test for names of multi-item incentives.

Manual testing of a few queries. The results should still match prod
exactly because none of the new items are used in the backend yet.
(The exception is the non-HP dryers and water heaters -- those are
already being used in the backend so will newly show up in the
frontend with this PR. Looked at those in English and Spanish to make
sure the headline looks good. ZIPs 81130 + Gunnison County Electric
and 81004 + San Isabel Electric)
  • Loading branch information
oyamauchi authored May 7, 2024
1 parent 4c6013f commit 6438117
Show file tree
Hide file tree
Showing 9 changed files with 616 additions and 87 deletions.
61 changes: 40 additions & 21 deletions src/api/calculator-types-v1.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,25 +28,46 @@ export interface Amount {
unit?: AmountUnit;
}

export type ItemType =
| 'battery_storage_installation'
| 'efficiency_rebates'
| 'electric_panel'
| 'electric_stove'
| 'electric_vehicle_charger'
| 'electric_wiring'
| 'geothermal_heating_installation'
| 'heat_pump_air_conditioner_heater'
| 'heat_pump_clothes_dryer'
| 'heat_pump_water_heater'
| 'new_electric_vehicle'
| 'rooftop_solar_installation'
| 'used_electric_vehicle'
| 'weatherization';
export const ITEMS = [
'air_sealing',
'air_to_water_heat_pump',
'attic_or_roof_insulation',
'basement_insulation',
'battery_storage_installation',
'central_air_conditioner',
'crawlspace_insulation',
'door_replacement',
'duct_replacement',
'duct_sealing',
'ducted_heat_pump',
'ductless_heat_pump',
'efficiency_rebates',
'electric_panel',
'electric_stove',
'electric_vehicle_charger',
'electric_wiring',
'energy_audit',
'floor_insulation',
'geothermal_heating_installation',
'heat_pump_air_conditioner_heater',
'heat_pump_clothes_dryer',
'heat_pump_water_heater',
'new_electric_vehicle',
'new_plugin_hybrid_vehicle',
'non_heat_pump_clothes_dryer',
'non_heat_pump_water_heater',
'other_heat_pump',
'other_insulation',
'other_weatherization',
'rooftop_solar_installation',
'used_electric_vehicle',
'used_plugin_hybrid_vehicle',
'wall_insulation',
'weatherization',
'window_replacement',
] as const;

export interface Item {
type: ItemType;
}
export type ItemType = (typeof ITEMS)[number];

export interface Incentive {
payment_methods: IncentiveType[];
Expand All @@ -55,9 +76,7 @@ export interface Incentive {
program: string;
program_url: string;
more_info_url?: string;
// TODO when "items" backend change is deployed, remove "item"
item: Item;
items?: ItemType[];
items: ItemType[];
amount: Amount;
start_date?: string;
end_date?: string;
Expand Down
27 changes: 27 additions & 0 deletions src/i18n/strings/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@ import { str } from '../str';

export const templates = {
s019265199296d7b0: `Hawái`,
s025c15001425a689: `reemplazo de ventanas`,
s04009ba1826b5fca: `Idaho`,
s04c4b18eb3941d37: `California`,
s07ecbff17886eb50: `un vehículo eléctrico usado`,
s08fb6007b5965c82: `Vehículo eléctrico`,
s0ec469a91a15f4a5: `kilovatio hora`,
s0f06604c95e47b84: `Wisconsin`,
s12603afef80b713c: `Estufa/cocina`,
s12bb428bacdba1ab: `un calentador de agua eléctrico`,
s12c2889034735d5e: `Empresa de servicios eléctricos`,
s13c6836e829c6f0d: `instalación de calefacción geotérmica`,
s16c70c46d6c9d383: `techo solar`,
Expand All @@ -26,6 +28,8 @@ export const templates = {
s1cc63fbd986ae5d9: `Descuento en impermeabilización`,
s1e73057deee4510e: `Sin embargo, los reembolsos se aplicarán de forma diferente en cada estado, de manera que no podemos garantizar los montos finales, la elegibilidad ni los plazos.`,
s1f0dc611dbdf4115: `Ingresa sus ingresos brutos (ingresos antes de impuestos). Incluye salarios y sueldos, además de otras formas de ingresos, como pensiones, intereses, dividendos e ingresos por alquiler. Si está casado y presenta una declaración conjunta, incluye los ingresos de su cónyuge.`,
s22fdf6e102292d52: `un vehículo híbrido enchufable`,
s2361ab00b9155f96: `una bomba de calor de aire a agua`,
s24ea3f43230aae41: `[email protected]`,
s255857544a9d5ec0: `Reiniciar`,
s26946b3c896d36d6: `Vehículo eléctrico`,
Expand Down Expand Up @@ -58,10 +62,14 @@ export const templates = {
s459781c939bc83e5: `Ingresos del hogar`,
s45d344440b59c309: `Manténgase al día sobre incentivos, reembolsos, y más de Rewiring America.`,
s475d01cc643aa9fc: `Subscríbase para recibir actualizaciones de Rewiring America.`,
s48ad5711856cfb44: `un vehículo híbrido enchufable nuevo`,
s48b23a6c3431c19e: `una secadora con bomba de calor`,
s4b0d7bd386d61b46: `Colorado`,
s4b3298c4c6db9310: str`\$${0} de descuento en ${1}`,
s4c498b8628becdec: `un calentador de agua`,
s4fc629e3c9345af1: `un vehículo usado`,
s50994ba3f0a45429: `Presentado en colaboración con`,
s50c22fc6197c004a: `un vehículo nuevo`,
s50e95c2064db3522: `Calculadora por`,
s56f9b2194465973e: `tonelada`,
s57355ce02837df3c: `Illinois`,
Expand All @@ -75,6 +83,7 @@ export const templates = {
s635e3d7c474426ce: `Descuento en una secadora con bomba de calor`,
s64fbe9b97e397b12: `Estamos dedicados a proteger su privacidad.`,
s675cdfc08b387d5a: `Ohio`,
s67d20e39f7ca49f9: `aislamiento del piso`,
s67ef2eb5002eaaa5: `Podría ser que no hay incentivos en su área o que usted no califica financieramente para recibir ningún incentivo.`,
s682a379fdd67cad0: `Alabama`,
s68467de4d67c9732: `pie cuadrado`,
Expand All @@ -89,16 +98,22 @@ export const templates = {
s777612e8117ff021: `Tennessee`,
s79fd9ba9e498d3da: str`${0} del costo de ${1}, hasta \$${2}`,
s7a73c90a7c3b43b4: `un calentador de agua con bomba de calor`,
s7ac656d7ee9d3ee9: `una auditoría energética`,
s7b55523ddae83552: `sellado de ductos`,
s7bd0de02e230dc75: `Calentador de agua`,
s7d340cf80adae3a4: `Misuri`,
s7f5b705d1bd02849: `La elegibilidad depende de la ubicación de residencia.`,
s8194d17164cbd6de: `Florida`,
s81aa671e64f2010e: `Dakota del Norte`,
s82397872ac9bddcf: `Tamaño del hogar`,
s863623721dcb0072: str`Esperado en ${0}`,
s8735995522894316: `una secadora`,
s8b29a87eb1bdd138: `Otros incentivos disponibles para usted`,
s8d144dc64bfb64a5: `un vehículo híbrido enchufable usado`,
s8e22cc4a5315cc18: `sellado del aire`,
s8e35f6b4e6e0adb9: `Pensilvania`,
s8e7e52ad112342ab: `un cargador de vehículos eléctricos`,
s8eb01eb62cbb17ed: `reemplazo de puertas`,
s8ee1a34f2ada948d: str`Los lineamientos federals permiten un reembolso de hasta \$${0}, basado en el ahorro de energía simulado o en el ahorro de energía medido logrado por el reacondicionamiento.`,
s8f668dd0fa1b8c4e: `Reembolso por eficiencia`,
s8fd029fdcc452602: `Ingrese su código postal para seleccionar una empresa de servicios eléctricos.`,
Expand All @@ -111,9 +126,11 @@ export const templates = {
s9eba0933010df96e: `Más información`,
s9fbb21f25571fff1: `Le informaremos sobre incentivos, reembolsos, y más de Rewiring America.`,
s9fc7054353f62fda: `Casado que presenta una declaración por separado`,
sa23c90be33fdda77: `una secadora eléctrica`,
sa413e4572603726f: `Almacenamiento de baterías`,
sa59611704b7a37f7: `Maryland`,
sa8693630efda6dd3: `Crédito fiscal`,
sa9e16de0ec0154b3: `aire acondicionado central`,
saa36bebd89cbd670: `Alaska`,
sab07cf2bfae8483f: `Política de privacidad`,
sabd5662f3f0a76be: `Descuento por adelantado`,
Expand All @@ -133,18 +150,23 @@ export const templates = {
sb661e8297dd681e2: `Incentivo`,
sb694f3d582a0dbb9: `Selecciona "Cabeza de familia" si tiene un hijo o pariente que vive con usted y paga más de la mitad de los gastos de su hogar. Selecciona "Conjunta" si declara sus impuestos como pareja casada.`,
sb6975fd8aa3fa26f: `Climatización`,
sb842284a98e8aed1: `una bomba de calor sin ductos`,
sb932cf0734934406: `Su código postal ayuda a determinar la cantidad de descuentos y créditos fiscales para los que califica.`,
sb9e8a9bfc8bcf398: `Rhode Island`,
sba0e115b257c6647: `una bomba de calor de fuente de aire`,
sbafed52303428041: `https://homes.rewiringamerica.org/es/federal-incentives/home-efficiency-rebates`,
sbc39e1d2cd027ca9: `una bomba de calor con ductos`,
sbc39ee880f922370: `Ninguno seleccionado`,
sbc6f031a2851e3fd: str`\$${0}/${1} de descuento en ${2}, hasta \$${3}`,
sbd6f35e4bb46fc68: `una estufa eléctrica/inducción`,
sbd73a9b9860a2ae3: `Massachusetts`,
sbe4508f09222c889: `Soltero`,
sc026bbb64721085f: `Casado que presenta una declaración conjunta`,
sc2e0d466583b17f8: `aislamiento del entrepiso`,
sc373af4c1a974b57: `Cocina`,
sc5b20cb72269bc4f: `Los propietarios y inquilinos califican para diferentes incentivos.`,
sc9266b1b6ae1aad4: `Esperado en 2024-2025`,
sc991c5ecbb3023ef: `aislamiento térmico`,
sc997cfdf24ba9b58: `Aún no tenemos datos sobre las empresas de servicios eléctricos en su área.`,
sc9e494c8346b7cb5: `Otra`,
sca61f9664c0f6099: `https://homes.rewiringamerica.org/es/federal-incentives/home-electrification-appliance-rebates`,
Expand All @@ -162,6 +184,7 @@ export const templates = {
sdb1f28de105f079e: `Dirección de correo electrónico (opcional)`,
sdc1f8a2139793221: `Volver a la calculadora`,
sdca5ca4d7a86693d: `Deseleccionar todo`,
se024b39a39b61641: `aislamiento del muro`,
se0f90ce39968b1d5: `Cabeza de familia`,
se4572a1a2528a7d4: `Código postal`,
se510125be9bcd015: `Seleccione su empresa de servicios eléctricos`,
Expand All @@ -170,11 +193,15 @@ export const templates = {
se6845b7d2d664ad8: `Dakota del Sur`,
se86b0c32ca2d7413: `Ahora está suscrito a nuestro boletín informativo.`,
se94a76041107bbf3: `Eléctrico`,
sec13c0ca288e67eb: `aislamiento del desván/techo`,
secc3df112f8ab69d: `un vehículo eléctrico`,
sf05c1c17e90b0ddd: `Inquilino`,
sf12bd6cb13bc154f: `Arizona`,
sf1e2063bc64f3539: `Arkansas`,
sf3affd5c9f2915e0: `Connecticut`,
sf459faf797f733a9: `Impermeabilización`,
sf59668536419404a: `aislamiento del sótano`,
sf685070e5a85e7d1: `reemplazo de ductos`,
sf844ac31d5fba2c9: `impermeabilización`,
sf8b5deb9ea9f5054: `Descuento en una estufa eléctrica`,
sfa7338035e1ef173: `Alquilar o poseer`,
Expand Down
6 changes: 6 additions & 0 deletions src/i18n/use-translated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,9 @@ export const useTranslated = (): { msg: MsgFn; locale: Locale } => {

return { msg, locale };
};

/** FOR TESTING ONLY: a version of msg that just passes the original through. */
export const passthroughMsg: MsgFn = str =>
typeof str === 'string'
? str
: assembleStrResult(str.template, str.values, null);
4 changes: 2 additions & 2 deletions src/ira-rebates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ const hearRebates: {
maxAmount: 2500,
},
{
project: 'heat_pump_water_heater',
project: 'water_heater',
getHeadline: msg => msg('Discount off a heat pump water heater'),
maxAmount: 1750,
},
Expand All @@ -44,7 +44,7 @@ const hearRebates: {
maxAmount: 8000,
},
{
project: 'heat_pump_clothes_dryer',
project: 'clothes_dryer',
getHeadline: msg => msg('Discount off a heat pump clothes dryer'),
maxAmount: 840,
},
Expand Down
Loading

0 comments on commit 6438117

Please sign in to comment.