diff --git a/changelog.d/issue-8117-pa-unemployment-insurance.added.md b/changelog.d/issue-8117-pa-unemployment-insurance.added.md new file mode 100644 index 00000000000..e79a33d6b56 --- /dev/null +++ b/changelog.d/issue-8117-pa-unemployment-insurance.added.md @@ -0,0 +1 @@ +Pennsylvania Unemployment Compensation. diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/credit_week_minimum_earnings.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/credit_week_minimum_earnings.yaml new file mode 100644 index 00000000000..5f434783536 --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/credit_week_minimum_earnings.yaml @@ -0,0 +1,12 @@ +description: Pennsylvania sets this minimum weekly earnings amount for a calendar week to count as a credit week under the Unemployment Compensation program. + +values: + 2025-01-01: 116 + +metadata: + unit: currency-USD + period: week + label: Pennsylvania UC credit week minimum earnings + reference: + - title: Pennsylvania Unemployment Compensation Law § 4(g.1) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=16 diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/child_age_limit.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/child_age_limit.yaml new file mode 100644 index 00000000000..3912cf5778f --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/child_age_limit.yaml @@ -0,0 +1,12 @@ +description: Pennsylvania limits dependent children to those under this age for the dependency allowance under the Unemployment Compensation program. + +values: + 2025-01-01: 18 + +metadata: + unit: year + period: year + label: Pennsylvania UC dependent child age limit + reference: + - title: Pennsylvania Unemployment Compensation Law § 404(e)(3) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=159 diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/maximum.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/maximum.yaml new file mode 100644 index 00000000000..f4cf96fd348 --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/maximum.yaml @@ -0,0 +1,12 @@ +description: Pennsylvania limits the total weekly dependent allowance to this amount under the Unemployment Compensation program. + +values: + 2025-01-01: 8 + +metadata: + unit: currency-USD + period: week + label: Pennsylvania UC maximum dependent allowance + reference: + - title: Pennsylvania Unemployment Compensation Law § 404(e)(3) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=159 diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/second_child.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/second_child.yaml new file mode 100644 index 00000000000..960b0142d76 --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/second_child.yaml @@ -0,0 +1,12 @@ +description: Pennsylvania provides this additional weekly allowance for one other dependent child under the Unemployment Compensation program. + +values: + 2025-01-01: 3 + +metadata: + unit: currency-USD + period: week + label: Pennsylvania UC second dependent child allowance + reference: + - title: Pennsylvania Unemployment Compensation Law § 404(e)(3) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=159 diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/spouse_or_first_child.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/spouse_or_first_child.yaml new file mode 100644 index 00000000000..ab58fe8c0bc --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/dependent_allowance/spouse_or_first_child.yaml @@ -0,0 +1,12 @@ +description: Pennsylvania provides this weekly allowance for a dependent spouse, or for a first dependent child if there is no dependent spouse, under the Unemployment Compensation program. + +values: + 2025-01-01: 5 + +metadata: + unit: currency-USD + period: week + label: Pennsylvania UC dependent spouse or first child allowance + reference: + - title: Pennsylvania Unemployment Compensation Law § 404(e)(3) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=159 diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/index.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/index.yaml new file mode 100644 index 00000000000..5f5e014db56 --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/index.yaml @@ -0,0 +1,9 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: true + reference: + - title: Pennsylvania Unemployment Compensation Law (43 P.S. §§ 751-919) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf + - title: Pennsylvania UC Claimant Handbook (UCP-1) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/ucp-forms/ucp-1.pdf diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/maximum_weeks.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/maximum_weeks.yaml new file mode 100644 index 00000000000..d2e5471cc20 --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/maximum_weeks.yaml @@ -0,0 +1,12 @@ +description: Pennsylvania limits the duration of benefits to this many weeks under the Unemployment Compensation program. + +values: + 2025-01-01: 26 + +metadata: + unit: week + period: year + label: Pennsylvania UC maximum benefit weeks + reference: + - title: Pennsylvania Unemployment Compensation Law § 404(c) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=133 diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/minimum_credit_weeks.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/minimum_credit_weeks.yaml new file mode 100644 index 00000000000..27e0f0905cf --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/minimum_credit_weeks.yaml @@ -0,0 +1,12 @@ +description: Pennsylvania sets this minimum number of base-year credit weeks under the Unemployment Compensation program. + +values: + 2025-01-01: 18 + +metadata: + unit: week + period: year + label: Pennsylvania UC minimum credit weeks + reference: + - title: Pennsylvania Unemployment Compensation Law § 404(c) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=133 diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/minimum_high_quarter_wages.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/minimum_high_quarter_wages.yaml new file mode 100644 index 00000000000..c7cb1fba02f --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/minimum_high_quarter_wages.yaml @@ -0,0 +1,14 @@ +description: Pennsylvania sets this minimum amount of highest base-year quarterly wages under the Unemployment Compensation program. + +values: + 2025-01-01: 1_688 + +metadata: + unit: currency-USD + period: year + label: Pennsylvania UC minimum high quarter wages + reference: + - title: Pennsylvania Unemployment Compensation Law § 404(e)(1) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=136 + - title: 54 Pa.B. 8560, Doc. No. 24-1863 (December 28, 2024) — 2025 Table Specified by Law + href: https://www.pacodeandbulletin.gov/Display/pabull?file=/secure/pabulletin/data/vol54/54-52/1863.html diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/partial_benefit_credit/minimum.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/partial_benefit_credit/minimum.yaml new file mode 100644 index 00000000000..16c0cf6ed0e --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/partial_benefit_credit/minimum.yaml @@ -0,0 +1,12 @@ +description: Pennsylvania sets a floor on the partial benefit credit at this amount under the Unemployment Compensation program. + +values: + 2025-01-01: 6 + +metadata: + unit: currency-USD + period: week + label: Pennsylvania UC partial benefit credit minimum + reference: + - title: Pennsylvania Unemployment Compensation Law § 4(m.3) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=34 diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/partial_benefit_credit/rate.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/partial_benefit_credit/rate.yaml new file mode 100644 index 00000000000..0391e1d404b --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/partial_benefit_credit/rate.yaml @@ -0,0 +1,12 @@ +description: Pennsylvania excludes this share of the weekly benefit rate as the partial benefit credit under the Unemployment Compensation program. + +values: + 2025-01-01: 0.3 + +metadata: + unit: /1 + period: year + label: Pennsylvania UC partial benefit credit rate + reference: + - title: Pennsylvania Unemployment Compensation Law § 4(m.3) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=34 diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/qualifying_wages.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/qualifying_wages.yaml new file mode 100644 index 00000000000..a389f4f6fb1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/qualifying_wages.yaml @@ -0,0 +1,2214 @@ +description: Pennsylvania sets this total base-year qualifying wages amount based on highest quarterly wages under the Unemployment Compensation program. + +brackets: + - threshold: + 2025-01-01: 1_688 + amount: + 2025-01-01: 2_718 + - threshold: + 2025-01-01: 1_713 + amount: + 2025-01-01: 2_758 + - threshold: + 2025-01-01: 1_738 + amount: + 2025-01-01: 2_797 + - threshold: + 2025-01-01: 1_763 + amount: + 2025-01-01: 2_837 + - threshold: + 2025-01-01: 1_788 + amount: + 2025-01-01: 2_877 + - threshold: + 2025-01-01: 1_813 + amount: + 2025-01-01: 2_916 + - threshold: + 2025-01-01: 1_838 + amount: + 2025-01-01: 2_956 + - threshold: + 2025-01-01: 1_863 + amount: + 2025-01-01: 2_996 + - threshold: + 2025-01-01: 1_888 + amount: + 2025-01-01: 3_035 + - threshold: + 2025-01-01: 1_913 + amount: + 2025-01-01: 3_075 + - threshold: + 2025-01-01: 1_938 + amount: + 2025-01-01: 3_115 + - threshold: + 2025-01-01: 1_963 + amount: + 2025-01-01: 3_154 + - threshold: + 2025-01-01: 1_988 + amount: + 2025-01-01: 3_194 + - threshold: + 2025-01-01: 2_013 + amount: + 2025-01-01: 3_234 + - threshold: + 2025-01-01: 2_038 + amount: + 2025-01-01: 3_274 + - threshold: + 2025-01-01: 2_063 + amount: + 2025-01-01: 3_313 + - threshold: + 2025-01-01: 2_088 + amount: + 2025-01-01: 3_353 + - threshold: + 2025-01-01: 2_113 + amount: + 2025-01-01: 3_393 + - threshold: + 2025-01-01: 2_138 + amount: + 2025-01-01: 3_432 + - threshold: + 2025-01-01: 2_163 + amount: + 2025-01-01: 3_472 + - threshold: + 2025-01-01: 2_188 + amount: + 2025-01-01: 3_512 + - threshold: + 2025-01-01: 2_213 + amount: + 2025-01-01: 3_551 + - threshold: + 2025-01-01: 2_238 + amount: + 2025-01-01: 3_591 + - threshold: + 2025-01-01: 2_263 + amount: + 2025-01-01: 3_631 + - threshold: + 2025-01-01: 2_288 + amount: + 2025-01-01: 3_670 + - threshold: + 2025-01-01: 2_313 + amount: + 2025-01-01: 3_710 + - threshold: + 2025-01-01: 2_338 + amount: + 2025-01-01: 3_750 + - threshold: + 2025-01-01: 2_363 + amount: + 2025-01-01: 3_789 + - threshold: + 2025-01-01: 2_388 + amount: + 2025-01-01: 3_829 + - threshold: + 2025-01-01: 2_413 + amount: + 2025-01-01: 3_869 + - threshold: + 2025-01-01: 2_438 + amount: + 2025-01-01: 3_908 + - threshold: + 2025-01-01: 2_463 + amount: + 2025-01-01: 3_948 + - threshold: + 2025-01-01: 2_488 + amount: + 2025-01-01: 3_988 + - threshold: + 2025-01-01: 2_513 + amount: + 2025-01-01: 4_027 + - threshold: + 2025-01-01: 2_538 + amount: + 2025-01-01: 4_067 + - threshold: + 2025-01-01: 2_563 + amount: + 2025-01-01: 4_107 + - threshold: + 2025-01-01: 2_588 + amount: + 2025-01-01: 4_147 + - threshold: + 2025-01-01: 2_613 + amount: + 2025-01-01: 4_186 + - threshold: + 2025-01-01: 2_638 + amount: + 2025-01-01: 4_226 + - threshold: + 2025-01-01: 2_663 + amount: + 2025-01-01: 4_266 + - threshold: + 2025-01-01: 2_688 + amount: + 2025-01-01: 4_305 + - threshold: + 2025-01-01: 2_713 + amount: + 2025-01-01: 4_345 + - threshold: + 2025-01-01: 2_738 + amount: + 2025-01-01: 4_385 + - threshold: + 2025-01-01: 2_763 + amount: + 2025-01-01: 4_424 + - threshold: + 2025-01-01: 2_788 + amount: + 2025-01-01: 4_464 + - threshold: + 2025-01-01: 2_813 + amount: + 2025-01-01: 4_504 + - threshold: + 2025-01-01: 2_838 + amount: + 2025-01-01: 4_543 + - threshold: + 2025-01-01: 2_863 + amount: + 2025-01-01: 4_583 + - threshold: + 2025-01-01: 2_888 + amount: + 2025-01-01: 4_623 + - threshold: + 2025-01-01: 2_913 + amount: + 2025-01-01: 4_662 + - threshold: + 2025-01-01: 2_938 + amount: + 2025-01-01: 4_702 + - threshold: + 2025-01-01: 2_963 + amount: + 2025-01-01: 4_742 + - threshold: + 2025-01-01: 2_988 + amount: + 2025-01-01: 4_781 + - threshold: + 2025-01-01: 3_013 + amount: + 2025-01-01: 4_821 + - threshold: + 2025-01-01: 3_038 + amount: + 2025-01-01: 4_861 + - threshold: + 2025-01-01: 3_063 + amount: + 2025-01-01: 4_900 + - threshold: + 2025-01-01: 3_088 + amount: + 2025-01-01: 4_940 + - threshold: + 2025-01-01: 3_113 + amount: + 2025-01-01: 4_980 + - threshold: + 2025-01-01: 3_138 + amount: + 2025-01-01: 5_020 + - threshold: + 2025-01-01: 3_163 + amount: + 2025-01-01: 5_059 + - threshold: + 2025-01-01: 3_188 + amount: + 2025-01-01: 5_099 + - threshold: + 2025-01-01: 3_213 + amount: + 2025-01-01: 5_139 + - threshold: + 2025-01-01: 3_238 + amount: + 2025-01-01: 5_178 + - threshold: + 2025-01-01: 3_263 + amount: + 2025-01-01: 5_218 + - threshold: + 2025-01-01: 3_288 + amount: + 2025-01-01: 5_258 + - threshold: + 2025-01-01: 3_313 + amount: + 2025-01-01: 5_297 + - threshold: + 2025-01-01: 3_338 + amount: + 2025-01-01: 5_337 + - threshold: + 2025-01-01: 3_363 + amount: + 2025-01-01: 5_377 + - threshold: + 2025-01-01: 3_388 + amount: + 2025-01-01: 5_416 + - threshold: + 2025-01-01: 3_413 + amount: + 2025-01-01: 5_456 + - threshold: + 2025-01-01: 3_438 + amount: + 2025-01-01: 5_496 + - threshold: + 2025-01-01: 3_463 + amount: + 2025-01-01: 5_535 + - threshold: + 2025-01-01: 3_488 + amount: + 2025-01-01: 5_575 + - threshold: + 2025-01-01: 3_513 + amount: + 2025-01-01: 5_615 + - threshold: + 2025-01-01: 3_538 + amount: + 2025-01-01: 5_654 + - threshold: + 2025-01-01: 3_563 + amount: + 2025-01-01: 5_694 + - threshold: + 2025-01-01: 3_588 + amount: + 2025-01-01: 5_734 + - threshold: + 2025-01-01: 3_613 + amount: + 2025-01-01: 5_774 + - threshold: + 2025-01-01: 3_638 + amount: + 2025-01-01: 5_813 + - threshold: + 2025-01-01: 3_663 + amount: + 2025-01-01: 5_853 + - threshold: + 2025-01-01: 3_688 + amount: + 2025-01-01: 5_893 + - threshold: + 2025-01-01: 3_713 + amount: + 2025-01-01: 5_932 + - threshold: + 2025-01-01: 3_738 + amount: + 2025-01-01: 5_972 + - threshold: + 2025-01-01: 3_763 + amount: + 2025-01-01: 6_012 + - threshold: + 2025-01-01: 3_788 + amount: + 2025-01-01: 6_051 + - threshold: + 2025-01-01: 3_813 + amount: + 2025-01-01: 6_091 + - threshold: + 2025-01-01: 3_838 + amount: + 2025-01-01: 6_131 + - threshold: + 2025-01-01: 3_863 + amount: + 2025-01-01: 6_170 + - threshold: + 2025-01-01: 3_888 + amount: + 2025-01-01: 6_210 + - threshold: + 2025-01-01: 3_913 + amount: + 2025-01-01: 6_250 + - threshold: + 2025-01-01: 3_938 + amount: + 2025-01-01: 6_289 + - threshold: + 2025-01-01: 3_963 + amount: + 2025-01-01: 6_329 + - threshold: + 2025-01-01: 3_988 + amount: + 2025-01-01: 6_369 + - threshold: + 2025-01-01: 4_013 + amount: + 2025-01-01: 6_408 + - threshold: + 2025-01-01: 4_038 + amount: + 2025-01-01: 6_448 + - threshold: + 2025-01-01: 4_063 + amount: + 2025-01-01: 6_488 + - threshold: + 2025-01-01: 4_088 + amount: + 2025-01-01: 6_527 + - threshold: + 2025-01-01: 4_113 + amount: + 2025-01-01: 6_567 + - threshold: + 2025-01-01: 4_138 + amount: + 2025-01-01: 6_607 + - threshold: + 2025-01-01: 4_163 + amount: + 2025-01-01: 6_647 + - threshold: + 2025-01-01: 4_188 + amount: + 2025-01-01: 6_686 + - threshold: + 2025-01-01: 4_213 + amount: + 2025-01-01: 6_726 + - threshold: + 2025-01-01: 4_238 + amount: + 2025-01-01: 6_766 + - threshold: + 2025-01-01: 4_263 + amount: + 2025-01-01: 6_805 + - threshold: + 2025-01-01: 4_288 + amount: + 2025-01-01: 6_845 + - threshold: + 2025-01-01: 4_313 + amount: + 2025-01-01: 6_885 + - threshold: + 2025-01-01: 4_338 + amount: + 2025-01-01: 6_924 + - threshold: + 2025-01-01: 4_363 + amount: + 2025-01-01: 6_964 + - threshold: + 2025-01-01: 4_388 + amount: + 2025-01-01: 7_004 + - threshold: + 2025-01-01: 4_413 + amount: + 2025-01-01: 7_043 + - threshold: + 2025-01-01: 4_438 + amount: + 2025-01-01: 7_083 + - threshold: + 2025-01-01: 4_463 + amount: + 2025-01-01: 7_123 + - threshold: + 2025-01-01: 4_488 + amount: + 2025-01-01: 7_162 + - threshold: + 2025-01-01: 4_513 + amount: + 2025-01-01: 7_202 + - threshold: + 2025-01-01: 4_538 + amount: + 2025-01-01: 7_242 + - threshold: + 2025-01-01: 4_563 + amount: + 2025-01-01: 7_281 + - threshold: + 2025-01-01: 4_588 + amount: + 2025-01-01: 7_321 + - threshold: + 2025-01-01: 4_613 + amount: + 2025-01-01: 7_361 + - threshold: + 2025-01-01: 4_638 + amount: + 2025-01-01: 7_400 + - threshold: + 2025-01-01: 4_663 + amount: + 2025-01-01: 7_440 + - threshold: + 2025-01-01: 4_688 + amount: + 2025-01-01: 7_480 + - threshold: + 2025-01-01: 4_713 + amount: + 2025-01-01: 7_520 + - threshold: + 2025-01-01: 4_738 + amount: + 2025-01-01: 7_559 + - threshold: + 2025-01-01: 4_763 + amount: + 2025-01-01: 7_599 + - threshold: + 2025-01-01: 4_788 + amount: + 2025-01-01: 7_639 + - threshold: + 2025-01-01: 4_813 + amount: + 2025-01-01: 7_678 + - threshold: + 2025-01-01: 4_838 + amount: + 2025-01-01: 7_718 + - threshold: + 2025-01-01: 4_863 + amount: + 2025-01-01: 7_758 + - threshold: + 2025-01-01: 4_888 + amount: + 2025-01-01: 7_797 + - threshold: + 2025-01-01: 4_913 + amount: + 2025-01-01: 7_837 + - threshold: + 2025-01-01: 4_938 + amount: + 2025-01-01: 7_877 + - threshold: + 2025-01-01: 4_963 + amount: + 2025-01-01: 7_916 + - threshold: + 2025-01-01: 4_988 + amount: + 2025-01-01: 7_956 + - threshold: + 2025-01-01: 5_013 + amount: + 2025-01-01: 7_996 + - threshold: + 2025-01-01: 5_038 + amount: + 2025-01-01: 8_035 + - threshold: + 2025-01-01: 5_063 + amount: + 2025-01-01: 8_075 + - threshold: + 2025-01-01: 5_088 + amount: + 2025-01-01: 8_115 + - threshold: + 2025-01-01: 5_113 + amount: + 2025-01-01: 8_154 + - threshold: + 2025-01-01: 5_138 + amount: + 2025-01-01: 8_194 + - threshold: + 2025-01-01: 5_163 + amount: + 2025-01-01: 8_234 + - threshold: + 2025-01-01: 5_188 + amount: + 2025-01-01: 8_274 + - threshold: + 2025-01-01: 5_213 + amount: + 2025-01-01: 8_313 + - threshold: + 2025-01-01: 5_238 + amount: + 2025-01-01: 8_353 + - threshold: + 2025-01-01: 5_263 + amount: + 2025-01-01: 8_393 + - threshold: + 2025-01-01: 5_288 + amount: + 2025-01-01: 8_432 + - threshold: + 2025-01-01: 5_313 + amount: + 2025-01-01: 8_472 + - threshold: + 2025-01-01: 5_338 + amount: + 2025-01-01: 8_512 + - threshold: + 2025-01-01: 5_363 + amount: + 2025-01-01: 8_551 + - threshold: + 2025-01-01: 5_388 + amount: + 2025-01-01: 8_591 + - threshold: + 2025-01-01: 5_413 + amount: + 2025-01-01: 8_631 + - threshold: + 2025-01-01: 5_438 + amount: + 2025-01-01: 8_670 + - threshold: + 2025-01-01: 5_463 + amount: + 2025-01-01: 8_710 + - threshold: + 2025-01-01: 5_488 + amount: + 2025-01-01: 8_750 + - threshold: + 2025-01-01: 5_513 + amount: + 2025-01-01: 8_789 + - threshold: + 2025-01-01: 5_538 + amount: + 2025-01-01: 8_829 + - threshold: + 2025-01-01: 5_563 + amount: + 2025-01-01: 8_869 + - threshold: + 2025-01-01: 5_588 + amount: + 2025-01-01: 8_908 + - threshold: + 2025-01-01: 5_613 + amount: + 2025-01-01: 8_948 + - threshold: + 2025-01-01: 5_638 + amount: + 2025-01-01: 8_988 + - threshold: + 2025-01-01: 5_663 + amount: + 2025-01-01: 9_027 + - threshold: + 2025-01-01: 5_688 + amount: + 2025-01-01: 9_067 + - threshold: + 2025-01-01: 5_713 + amount: + 2025-01-01: 9_107 + - threshold: + 2025-01-01: 5_738 + amount: + 2025-01-01: 9_147 + - threshold: + 2025-01-01: 5_763 + amount: + 2025-01-01: 9_186 + - threshold: + 2025-01-01: 5_788 + amount: + 2025-01-01: 9_226 + - threshold: + 2025-01-01: 5_813 + amount: + 2025-01-01: 9_266 + - threshold: + 2025-01-01: 5_838 + amount: + 2025-01-01: 9_305 + - threshold: + 2025-01-01: 5_863 + amount: + 2025-01-01: 9_345 + - threshold: + 2025-01-01: 5_888 + amount: + 2025-01-01: 9_385 + - threshold: + 2025-01-01: 5_913 + amount: + 2025-01-01: 9_424 + - threshold: + 2025-01-01: 5_938 + amount: + 2025-01-01: 9_464 + - threshold: + 2025-01-01: 5_963 + amount: + 2025-01-01: 9_504 + - threshold: + 2025-01-01: 5_988 + amount: + 2025-01-01: 9_543 + - threshold: + 2025-01-01: 6_013 + amount: + 2025-01-01: 9_583 + - threshold: + 2025-01-01: 6_038 + amount: + 2025-01-01: 9_623 + - threshold: + 2025-01-01: 6_063 + amount: + 2025-01-01: 9_662 + - threshold: + 2025-01-01: 6_088 + amount: + 2025-01-01: 9_702 + - threshold: + 2025-01-01: 6_113 + amount: + 2025-01-01: 9_742 + - threshold: + 2025-01-01: 6_138 + amount: + 2025-01-01: 9_781 + - threshold: + 2025-01-01: 6_163 + amount: + 2025-01-01: 9_821 + - threshold: + 2025-01-01: 6_188 + amount: + 2025-01-01: 9_861 + - threshold: + 2025-01-01: 6_213 + amount: + 2025-01-01: 9_900 + - threshold: + 2025-01-01: 6_238 + amount: + 2025-01-01: 9_940 + - threshold: + 2025-01-01: 6_263 + amount: + 2025-01-01: 9_980 + - threshold: + 2025-01-01: 6_288 + amount: + 2025-01-01: 10_020 + - threshold: + 2025-01-01: 6_313 + amount: + 2025-01-01: 10_059 + - threshold: + 2025-01-01: 6_338 + amount: + 2025-01-01: 10_099 + - threshold: + 2025-01-01: 6_363 + amount: + 2025-01-01: 10_139 + - threshold: + 2025-01-01: 6_388 + amount: + 2025-01-01: 10_178 + - threshold: + 2025-01-01: 6_413 + amount: + 2025-01-01: 10_218 + - threshold: + 2025-01-01: 6_438 + amount: + 2025-01-01: 10_258 + - threshold: + 2025-01-01: 6_463 + amount: + 2025-01-01: 10_297 + - threshold: + 2025-01-01: 6_488 + amount: + 2025-01-01: 10_337 + - threshold: + 2025-01-01: 6_513 + amount: + 2025-01-01: 10_377 + - threshold: + 2025-01-01: 6_538 + amount: + 2025-01-01: 10_416 + - threshold: + 2025-01-01: 6_563 + amount: + 2025-01-01: 10_456 + - threshold: + 2025-01-01: 6_588 + amount: + 2025-01-01: 10_496 + - threshold: + 2025-01-01: 6_613 + amount: + 2025-01-01: 10_535 + - threshold: + 2025-01-01: 6_638 + amount: + 2025-01-01: 10_575 + - threshold: + 2025-01-01: 6_663 + amount: + 2025-01-01: 10_615 + - threshold: + 2025-01-01: 6_688 + amount: + 2025-01-01: 10_654 + - threshold: + 2025-01-01: 6_713 + amount: + 2025-01-01: 10_694 + - threshold: + 2025-01-01: 6_738 + amount: + 2025-01-01: 10_734 + - threshold: + 2025-01-01: 6_763 + amount: + 2025-01-01: 10_774 + - threshold: + 2025-01-01: 6_788 + amount: + 2025-01-01: 10_813 + - threshold: + 2025-01-01: 6_813 + amount: + 2025-01-01: 10_853 + - threshold: + 2025-01-01: 6_838 + amount: + 2025-01-01: 10_893 + - threshold: + 2025-01-01: 6_863 + amount: + 2025-01-01: 10_932 + - threshold: + 2025-01-01: 6_888 + amount: + 2025-01-01: 10_972 + - threshold: + 2025-01-01: 6_913 + amount: + 2025-01-01: 11_012 + - threshold: + 2025-01-01: 6_938 + amount: + 2025-01-01: 11_051 + - threshold: + 2025-01-01: 6_963 + amount: + 2025-01-01: 11_091 + - threshold: + 2025-01-01: 6_988 + amount: + 2025-01-01: 11_131 + - threshold: + 2025-01-01: 7_013 + amount: + 2025-01-01: 11_170 + - threshold: + 2025-01-01: 7_038 + amount: + 2025-01-01: 11_210 + - threshold: + 2025-01-01: 7_063 + amount: + 2025-01-01: 11_250 + - threshold: + 2025-01-01: 7_088 + amount: + 2025-01-01: 11_289 + - threshold: + 2025-01-01: 7_113 + amount: + 2025-01-01: 11_329 + - threshold: + 2025-01-01: 7_138 + amount: + 2025-01-01: 11_369 + - threshold: + 2025-01-01: 7_163 + amount: + 2025-01-01: 11_408 + - threshold: + 2025-01-01: 7_188 + amount: + 2025-01-01: 11_448 + - threshold: + 2025-01-01: 7_213 + amount: + 2025-01-01: 11_488 + - threshold: + 2025-01-01: 7_238 + amount: + 2025-01-01: 11_527 + - threshold: + 2025-01-01: 7_263 + amount: + 2025-01-01: 11_567 + - threshold: + 2025-01-01: 7_288 + amount: + 2025-01-01: 11_607 + - threshold: + 2025-01-01: 7_313 + amount: + 2025-01-01: 11_647 + - threshold: + 2025-01-01: 7_338 + amount: + 2025-01-01: 11_686 + - threshold: + 2025-01-01: 7_363 + amount: + 2025-01-01: 11_726 + - threshold: + 2025-01-01: 7_388 + amount: + 2025-01-01: 11_766 + - threshold: + 2025-01-01: 7_413 + amount: + 2025-01-01: 11_805 + - threshold: + 2025-01-01: 7_438 + amount: + 2025-01-01: 11_845 + - threshold: + 2025-01-01: 7_463 + amount: + 2025-01-01: 11_885 + - threshold: + 2025-01-01: 7_488 + amount: + 2025-01-01: 11_924 + - threshold: + 2025-01-01: 7_513 + amount: + 2025-01-01: 11_964 + - threshold: + 2025-01-01: 7_538 + amount: + 2025-01-01: 12_004 + - threshold: + 2025-01-01: 7_563 + amount: + 2025-01-01: 12_043 + - threshold: + 2025-01-01: 7_588 + amount: + 2025-01-01: 12_083 + - threshold: + 2025-01-01: 7_613 + amount: + 2025-01-01: 12_123 + - threshold: + 2025-01-01: 7_638 + amount: + 2025-01-01: 12_162 + - threshold: + 2025-01-01: 7_663 + amount: + 2025-01-01: 12_202 + - threshold: + 2025-01-01: 7_688 + amount: + 2025-01-01: 12_242 + - threshold: + 2025-01-01: 7_713 + amount: + 2025-01-01: 12_281 + - threshold: + 2025-01-01: 7_738 + amount: + 2025-01-01: 12_321 + - threshold: + 2025-01-01: 7_763 + amount: + 2025-01-01: 12_361 + - threshold: + 2025-01-01: 7_788 + amount: + 2025-01-01: 12_400 + - threshold: + 2025-01-01: 7_813 + amount: + 2025-01-01: 12_440 + - threshold: + 2025-01-01: 7_838 + amount: + 2025-01-01: 12_480 + - threshold: + 2025-01-01: 7_863 + amount: + 2025-01-01: 12_520 + - threshold: + 2025-01-01: 7_888 + amount: + 2025-01-01: 12_559 + - threshold: + 2025-01-01: 7_913 + amount: + 2025-01-01: 12_599 + - threshold: + 2025-01-01: 7_938 + amount: + 2025-01-01: 12_639 + - threshold: + 2025-01-01: 7_963 + amount: + 2025-01-01: 12_678 + - threshold: + 2025-01-01: 7_988 + amount: + 2025-01-01: 12_718 + - threshold: + 2025-01-01: 8_013 + amount: + 2025-01-01: 12_758 + - threshold: + 2025-01-01: 8_038 + amount: + 2025-01-01: 12_797 + - threshold: + 2025-01-01: 8_063 + amount: + 2025-01-01: 12_837 + - threshold: + 2025-01-01: 8_088 + amount: + 2025-01-01: 12_877 + - threshold: + 2025-01-01: 8_113 + amount: + 2025-01-01: 12_916 + - threshold: + 2025-01-01: 8_138 + amount: + 2025-01-01: 12_956 + - threshold: + 2025-01-01: 8_163 + amount: + 2025-01-01: 12_996 + - threshold: + 2025-01-01: 8_188 + amount: + 2025-01-01: 13_035 + - threshold: + 2025-01-01: 8_213 + amount: + 2025-01-01: 13_075 + - threshold: + 2025-01-01: 8_238 + amount: + 2025-01-01: 13_115 + - threshold: + 2025-01-01: 8_263 + amount: + 2025-01-01: 13_154 + - threshold: + 2025-01-01: 8_288 + amount: + 2025-01-01: 13_194 + - threshold: + 2025-01-01: 8_313 + amount: + 2025-01-01: 13_234 + - threshold: + 2025-01-01: 8_338 + amount: + 2025-01-01: 13_274 + - threshold: + 2025-01-01: 8_363 + amount: + 2025-01-01: 13_313 + - threshold: + 2025-01-01: 8_388 + amount: + 2025-01-01: 13_353 + - threshold: + 2025-01-01: 8_413 + amount: + 2025-01-01: 13_393 + - threshold: + 2025-01-01: 8_438 + amount: + 2025-01-01: 13_432 + - threshold: + 2025-01-01: 8_463 + amount: + 2025-01-01: 13_472 + - threshold: + 2025-01-01: 8_488 + amount: + 2025-01-01: 13_512 + - threshold: + 2025-01-01: 8_513 + amount: + 2025-01-01: 13_551 + - threshold: + 2025-01-01: 8_538 + amount: + 2025-01-01: 13_591 + - threshold: + 2025-01-01: 8_563 + amount: + 2025-01-01: 13_631 + - threshold: + 2025-01-01: 8_588 + amount: + 2025-01-01: 13_670 + - threshold: + 2025-01-01: 8_613 + amount: + 2025-01-01: 13_710 + - threshold: + 2025-01-01: 8_638 + amount: + 2025-01-01: 13_750 + - threshold: + 2025-01-01: 8_663 + amount: + 2025-01-01: 13_789 + - threshold: + 2025-01-01: 8_688 + amount: + 2025-01-01: 13_829 + - threshold: + 2025-01-01: 8_713 + amount: + 2025-01-01: 13_869 + - threshold: + 2025-01-01: 8_738 + amount: + 2025-01-01: 13_908 + - threshold: + 2025-01-01: 8_763 + amount: + 2025-01-01: 13_948 + - threshold: + 2025-01-01: 8_788 + amount: + 2025-01-01: 13_988 + - threshold: + 2025-01-01: 8_813 + amount: + 2025-01-01: 14_027 + - threshold: + 2025-01-01: 8_838 + amount: + 2025-01-01: 14_067 + - threshold: + 2025-01-01: 8_863 + amount: + 2025-01-01: 14_107 + - threshold: + 2025-01-01: 8_888 + amount: + 2025-01-01: 14_147 + - threshold: + 2025-01-01: 8_913 + amount: + 2025-01-01: 14_186 + - threshold: + 2025-01-01: 8_938 + amount: + 2025-01-01: 14_226 + - threshold: + 2025-01-01: 8_963 + amount: + 2025-01-01: 14_266 + - threshold: + 2025-01-01: 8_988 + amount: + 2025-01-01: 14_305 + - threshold: + 2025-01-01: 9_013 + amount: + 2025-01-01: 14_345 + - threshold: + 2025-01-01: 9_038 + amount: + 2025-01-01: 14_385 + - threshold: + 2025-01-01: 9_063 + amount: + 2025-01-01: 14_424 + - threshold: + 2025-01-01: 9_088 + amount: + 2025-01-01: 14_464 + - threshold: + 2025-01-01: 9_113 + amount: + 2025-01-01: 14_504 + - threshold: + 2025-01-01: 9_138 + amount: + 2025-01-01: 14_543 + - threshold: + 2025-01-01: 9_163 + amount: + 2025-01-01: 14_583 + - threshold: + 2025-01-01: 9_188 + amount: + 2025-01-01: 14_623 + - threshold: + 2025-01-01: 9_213 + amount: + 2025-01-01: 14_662 + - threshold: + 2025-01-01: 9_238 + amount: + 2025-01-01: 14_702 + - threshold: + 2025-01-01: 9_263 + amount: + 2025-01-01: 14_742 + - threshold: + 2025-01-01: 9_288 + amount: + 2025-01-01: 14_781 + - threshold: + 2025-01-01: 9_313 + amount: + 2025-01-01: 14_821 + - threshold: + 2025-01-01: 9_338 + amount: + 2025-01-01: 14_861 + - threshold: + 2025-01-01: 9_363 + amount: + 2025-01-01: 14_900 + - threshold: + 2025-01-01: 9_388 + amount: + 2025-01-01: 14_940 + - threshold: + 2025-01-01: 9_413 + amount: + 2025-01-01: 14_980 + - threshold: + 2025-01-01: 9_438 + amount: + 2025-01-01: 15_020 + - threshold: + 2025-01-01: 9_463 + amount: + 2025-01-01: 15_059 + - threshold: + 2025-01-01: 9_488 + amount: + 2025-01-01: 15_099 + - threshold: + 2025-01-01: 9_513 + amount: + 2025-01-01: 15_139 + - threshold: + 2025-01-01: 9_538 + amount: + 2025-01-01: 15_178 + - threshold: + 2025-01-01: 9_563 + amount: + 2025-01-01: 15_218 + - threshold: + 2025-01-01: 9_588 + amount: + 2025-01-01: 15_258 + - threshold: + 2025-01-01: 9_613 + amount: + 2025-01-01: 15_297 + - threshold: + 2025-01-01: 9_638 + amount: + 2025-01-01: 15_337 + - threshold: + 2025-01-01: 9_663 + amount: + 2025-01-01: 15_377 + - threshold: + 2025-01-01: 9_688 + amount: + 2025-01-01: 15_416 + - threshold: + 2025-01-01: 9_713 + amount: + 2025-01-01: 15_456 + - threshold: + 2025-01-01: 9_738 + amount: + 2025-01-01: 15_496 + - threshold: + 2025-01-01: 9_763 + amount: + 2025-01-01: 15_535 + - threshold: + 2025-01-01: 9_788 + amount: + 2025-01-01: 15_575 + - threshold: + 2025-01-01: 9_813 + amount: + 2025-01-01: 15_615 + - threshold: + 2025-01-01: 9_838 + amount: + 2025-01-01: 15_654 + - threshold: + 2025-01-01: 9_863 + amount: + 2025-01-01: 15_694 + - threshold: + 2025-01-01: 9_888 + amount: + 2025-01-01: 15_734 + - threshold: + 2025-01-01: 9_913 + amount: + 2025-01-01: 15_774 + - threshold: + 2025-01-01: 9_938 + amount: + 2025-01-01: 15_813 + - threshold: + 2025-01-01: 9_963 + amount: + 2025-01-01: 15_853 + - threshold: + 2025-01-01: 9_988 + amount: + 2025-01-01: 15_893 + - threshold: + 2025-01-01: 10_013 + amount: + 2025-01-01: 15_932 + - threshold: + 2025-01-01: 10_038 + amount: + 2025-01-01: 15_972 + - threshold: + 2025-01-01: 10_063 + amount: + 2025-01-01: 16_012 + - threshold: + 2025-01-01: 10_088 + amount: + 2025-01-01: 16_051 + - threshold: + 2025-01-01: 10_113 + amount: + 2025-01-01: 16_091 + - threshold: + 2025-01-01: 10_138 + amount: + 2025-01-01: 16_131 + - threshold: + 2025-01-01: 10_163 + amount: + 2025-01-01: 16_170 + - threshold: + 2025-01-01: 10_188 + amount: + 2025-01-01: 16_210 + - threshold: + 2025-01-01: 10_213 + amount: + 2025-01-01: 16_250 + - threshold: + 2025-01-01: 10_238 + amount: + 2025-01-01: 16_289 + - threshold: + 2025-01-01: 10_263 + amount: + 2025-01-01: 16_329 + - threshold: + 2025-01-01: 10_288 + amount: + 2025-01-01: 16_369 + - threshold: + 2025-01-01: 10_313 + amount: + 2025-01-01: 16_408 + - threshold: + 2025-01-01: 10_338 + amount: + 2025-01-01: 16_448 + - threshold: + 2025-01-01: 10_363 + amount: + 2025-01-01: 16_488 + - threshold: + 2025-01-01: 10_388 + amount: + 2025-01-01: 16_527 + - threshold: + 2025-01-01: 10_413 + amount: + 2025-01-01: 16_567 + - threshold: + 2025-01-01: 10_438 + amount: + 2025-01-01: 16_607 + - threshold: + 2025-01-01: 10_463 + amount: + 2025-01-01: 16_647 + - threshold: + 2025-01-01: 10_488 + amount: + 2025-01-01: 16_686 + - threshold: + 2025-01-01: 10_513 + amount: + 2025-01-01: 16_726 + - threshold: + 2025-01-01: 10_538 + amount: + 2025-01-01: 16_766 + - threshold: + 2025-01-01: 10_563 + amount: + 2025-01-01: 16_805 + - threshold: + 2025-01-01: 10_588 + amount: + 2025-01-01: 16_845 + - threshold: + 2025-01-01: 10_613 + amount: + 2025-01-01: 16_885 + - threshold: + 2025-01-01: 10_638 + amount: + 2025-01-01: 16_924 + - threshold: + 2025-01-01: 10_663 + amount: + 2025-01-01: 16_964 + - threshold: + 2025-01-01: 10_688 + amount: + 2025-01-01: 17_004 + - threshold: + 2025-01-01: 10_713 + amount: + 2025-01-01: 17_043 + - threshold: + 2025-01-01: 10_738 + amount: + 2025-01-01: 17_083 + - threshold: + 2025-01-01: 10_763 + amount: + 2025-01-01: 17_123 + - threshold: + 2025-01-01: 10_788 + amount: + 2025-01-01: 17_162 + - threshold: + 2025-01-01: 10_813 + amount: + 2025-01-01: 17_202 + - threshold: + 2025-01-01: 10_838 + amount: + 2025-01-01: 17_242 + - threshold: + 2025-01-01: 10_863 + amount: + 2025-01-01: 17_281 + - threshold: + 2025-01-01: 10_888 + amount: + 2025-01-01: 17_321 + - threshold: + 2025-01-01: 10_913 + amount: + 2025-01-01: 17_361 + - threshold: + 2025-01-01: 10_938 + amount: + 2025-01-01: 17_400 + - threshold: + 2025-01-01: 10_963 + amount: + 2025-01-01: 17_440 + - threshold: + 2025-01-01: 10_988 + amount: + 2025-01-01: 17_480 + - threshold: + 2025-01-01: 11_013 + amount: + 2025-01-01: 17_520 + - threshold: + 2025-01-01: 11_038 + amount: + 2025-01-01: 17_559 + - threshold: + 2025-01-01: 11_063 + amount: + 2025-01-01: 17_599 + - threshold: + 2025-01-01: 11_088 + amount: + 2025-01-01: 17_639 + - threshold: + 2025-01-01: 11_113 + amount: + 2025-01-01: 17_678 + - threshold: + 2025-01-01: 11_138 + amount: + 2025-01-01: 17_718 + - threshold: + 2025-01-01: 11_163 + amount: + 2025-01-01: 17_758 + - threshold: + 2025-01-01: 11_188 + amount: + 2025-01-01: 17_797 + - threshold: + 2025-01-01: 11_213 + amount: + 2025-01-01: 17_837 + - threshold: + 2025-01-01: 11_238 + amount: + 2025-01-01: 17_877 + - threshold: + 2025-01-01: 11_263 + amount: + 2025-01-01: 17_916 + - threshold: + 2025-01-01: 11_288 + amount: + 2025-01-01: 17_956 + - threshold: + 2025-01-01: 11_313 + amount: + 2025-01-01: 17_996 + - threshold: + 2025-01-01: 11_338 + amount: + 2025-01-01: 18_035 + - threshold: + 2025-01-01: 11_363 + amount: + 2025-01-01: 18_075 + - threshold: + 2025-01-01: 11_388 + amount: + 2025-01-01: 18_115 + - threshold: + 2025-01-01: 11_413 + amount: + 2025-01-01: 18_154 + - threshold: + 2025-01-01: 11_438 + amount: + 2025-01-01: 18_194 + - threshold: + 2025-01-01: 11_463 + amount: + 2025-01-01: 18_234 + - threshold: + 2025-01-01: 11_488 + amount: + 2025-01-01: 18_274 + - threshold: + 2025-01-01: 11_513 + amount: + 2025-01-01: 18_313 + - threshold: + 2025-01-01: 11_538 + amount: + 2025-01-01: 18_353 + - threshold: + 2025-01-01: 11_563 + amount: + 2025-01-01: 18_393 + - threshold: + 2025-01-01: 11_588 + amount: + 2025-01-01: 18_432 + - threshold: + 2025-01-01: 11_613 + amount: + 2025-01-01: 18_472 + - threshold: + 2025-01-01: 11_638 + amount: + 2025-01-01: 18_512 + - threshold: + 2025-01-01: 11_663 + amount: + 2025-01-01: 18_551 + - threshold: + 2025-01-01: 11_688 + amount: + 2025-01-01: 18_591 + - threshold: + 2025-01-01: 11_713 + amount: + 2025-01-01: 18_631 + - threshold: + 2025-01-01: 11_738 + amount: + 2025-01-01: 18_670 + - threshold: + 2025-01-01: 11_763 + amount: + 2025-01-01: 18_710 + - threshold: + 2025-01-01: 11_788 + amount: + 2025-01-01: 18_750 + - threshold: + 2025-01-01: 11_813 + amount: + 2025-01-01: 18_789 + - threshold: + 2025-01-01: 11_838 + amount: + 2025-01-01: 18_829 + - threshold: + 2025-01-01: 11_863 + amount: + 2025-01-01: 18_869 + - threshold: + 2025-01-01: 11_888 + amount: + 2025-01-01: 18_908 + - threshold: + 2025-01-01: 11_913 + amount: + 2025-01-01: 18_948 + - threshold: + 2025-01-01: 11_938 + amount: + 2025-01-01: 18_988 + - threshold: + 2025-01-01: 11_963 + amount: + 2025-01-01: 19_027 + - threshold: + 2025-01-01: 11_988 + amount: + 2025-01-01: 19_067 + - threshold: + 2025-01-01: 12_013 + amount: + 2025-01-01: 19_107 + - threshold: + 2025-01-01: 12_038 + amount: + 2025-01-01: 19_147 + - threshold: + 2025-01-01: 12_063 + amount: + 2025-01-01: 19_186 + - threshold: + 2025-01-01: 12_088 + amount: + 2025-01-01: 19_226 + - threshold: + 2025-01-01: 12_113 + amount: + 2025-01-01: 19_266 + - threshold: + 2025-01-01: 12_138 + amount: + 2025-01-01: 19_305 + - threshold: + 2025-01-01: 12_163 + amount: + 2025-01-01: 19_345 + - threshold: + 2025-01-01: 12_188 + amount: + 2025-01-01: 19_385 + - threshold: + 2025-01-01: 12_213 + amount: + 2025-01-01: 19_424 + - threshold: + 2025-01-01: 12_238 + amount: + 2025-01-01: 19_464 + - threshold: + 2025-01-01: 12_263 + amount: + 2025-01-01: 19_504 + - threshold: + 2025-01-01: 12_288 + amount: + 2025-01-01: 19_543 + - threshold: + 2025-01-01: 12_313 + amount: + 2025-01-01: 19_583 + - threshold: + 2025-01-01: 12_338 + amount: + 2025-01-01: 19_623 + - threshold: + 2025-01-01: 12_363 + amount: + 2025-01-01: 19_662 + - threshold: + 2025-01-01: 12_388 + amount: + 2025-01-01: 19_702 + - threshold: + 2025-01-01: 12_413 + amount: + 2025-01-01: 19_742 + - threshold: + 2025-01-01: 12_438 + amount: + 2025-01-01: 19_781 + - threshold: + 2025-01-01: 12_463 + amount: + 2025-01-01: 19_821 + - threshold: + 2025-01-01: 12_488 + amount: + 2025-01-01: 19_861 + - threshold: + 2025-01-01: 12_513 + amount: + 2025-01-01: 19_900 + - threshold: + 2025-01-01: 12_538 + amount: + 2025-01-01: 19_940 + - threshold: + 2025-01-01: 12_563 + amount: + 2025-01-01: 19_980 + - threshold: + 2025-01-01: 12_588 + amount: + 2025-01-01: 20_020 + - threshold: + 2025-01-01: 12_613 + amount: + 2025-01-01: 20_059 + - threshold: + 2025-01-01: 12_638 + amount: + 2025-01-01: 20_099 + - threshold: + 2025-01-01: 12_663 + amount: + 2025-01-01: 20_139 + - threshold: + 2025-01-01: 12_688 + amount: + 2025-01-01: 20_178 + - threshold: + 2025-01-01: 12_713 + amount: + 2025-01-01: 20_218 + - threshold: + 2025-01-01: 12_738 + amount: + 2025-01-01: 20_258 + - threshold: + 2025-01-01: 12_763 + amount: + 2025-01-01: 20_297 + - threshold: + 2025-01-01: 12_788 + amount: + 2025-01-01: 20_337 + - threshold: + 2025-01-01: 12_813 + amount: + 2025-01-01: 20_377 + - threshold: + 2025-01-01: 12_838 + amount: + 2025-01-01: 20_416 + - threshold: + 2025-01-01: 12_863 + amount: + 2025-01-01: 20_456 + - threshold: + 2025-01-01: 12_888 + amount: + 2025-01-01: 20_496 + - threshold: + 2025-01-01: 12_913 + amount: + 2025-01-01: 20_535 + - threshold: + 2025-01-01: 12_938 + amount: + 2025-01-01: 20_575 + - threshold: + 2025-01-01: 12_963 + amount: + 2025-01-01: 20_615 + - threshold: + 2025-01-01: 12_988 + amount: + 2025-01-01: 20_654 + - threshold: + 2025-01-01: 13_013 + amount: + 2025-01-01: 20_694 + - threshold: + 2025-01-01: 13_038 + amount: + 2025-01-01: 20_734 + - threshold: + 2025-01-01: 13_063 + amount: + 2025-01-01: 20_774 + - threshold: + 2025-01-01: 13_088 + amount: + 2025-01-01: 20_813 + - threshold: + 2025-01-01: 13_113 + amount: + 2025-01-01: 20_853 + - threshold: + 2025-01-01: 13_138 + amount: + 2025-01-01: 20_893 + - threshold: + 2025-01-01: 13_163 + amount: + 2025-01-01: 20_932 + - threshold: + 2025-01-01: 13_188 + amount: + 2025-01-01: 20_972 + - threshold: + 2025-01-01: 13_213 + amount: + 2025-01-01: 21_012 + - threshold: + 2025-01-01: 13_238 + amount: + 2025-01-01: 21_051 + - threshold: + 2025-01-01: 13_263 + amount: + 2025-01-01: 21_091 + - threshold: + 2025-01-01: 13_288 + amount: + 2025-01-01: 21_131 + - threshold: + 2025-01-01: 13_313 + amount: + 2025-01-01: 21_170 + - threshold: + 2025-01-01: 13_338 + amount: + 2025-01-01: 21_210 + - threshold: + 2025-01-01: 13_363 + amount: + 2025-01-01: 21_250 + - threshold: + 2025-01-01: 13_388 + amount: + 2025-01-01: 21_289 + - threshold: + 2025-01-01: 13_413 + amount: + 2025-01-01: 21_329 + - threshold: + 2025-01-01: 13_438 + amount: + 2025-01-01: 21_369 + - threshold: + 2025-01-01: 13_463 + amount: + 2025-01-01: 21_408 + - threshold: + 2025-01-01: 13_488 + amount: + 2025-01-01: 21_448 + - threshold: + 2025-01-01: 13_513 + amount: + 2025-01-01: 21_488 + - threshold: + 2025-01-01: 13_538 + amount: + 2025-01-01: 21_527 + - threshold: + 2025-01-01: 13_563 + amount: + 2025-01-01: 21_567 + - threshold: + 2025-01-01: 13_588 + amount: + 2025-01-01: 21_607 + - threshold: + 2025-01-01: 13_613 + amount: + 2025-01-01: 21_647 + - threshold: + 2025-01-01: 13_638 + amount: + 2025-01-01: 21_686 + - threshold: + 2025-01-01: 13_663 + amount: + 2025-01-01: 21_726 + - threshold: + 2025-01-01: 13_688 + amount: + 2025-01-01: 21_766 + - threshold: + 2025-01-01: 13_713 + amount: + 2025-01-01: 21_805 + - threshold: + 2025-01-01: 13_738 + amount: + 2025-01-01: 21_845 + - threshold: + 2025-01-01: 13_763 + amount: + 2025-01-01: 21_885 + - threshold: + 2025-01-01: 13_788 + amount: + 2025-01-01: 21_924 + - threshold: + 2025-01-01: 13_813 + amount: + 2025-01-01: 21_964 + - threshold: + 2025-01-01: 13_838 + amount: + 2025-01-01: 22_004 + - threshold: + 2025-01-01: 13_863 + amount: + 2025-01-01: 22_043 + - threshold: + 2025-01-01: 13_888 + amount: + 2025-01-01: 22_083 + - threshold: + 2025-01-01: 13_913 + amount: + 2025-01-01: 22_123 + - threshold: + 2025-01-01: 13_938 + amount: + 2025-01-01: 22_162 + - threshold: + 2025-01-01: 13_963 + amount: + 2025-01-01: 22_202 + - threshold: + 2025-01-01: 13_988 + amount: + 2025-01-01: 22_242 + - threshold: + 2025-01-01: 14_013 + amount: + 2025-01-01: 22_281 + - threshold: + 2025-01-01: 14_038 + amount: + 2025-01-01: 22_321 + - threshold: + 2025-01-01: 14_063 + amount: + 2025-01-01: 22_361 + - threshold: + 2025-01-01: 14_088 + amount: + 2025-01-01: 22_400 + - threshold: + 2025-01-01: 14_113 + amount: + 2025-01-01: 22_440 + - threshold: + 2025-01-01: 14_138 + amount: + 2025-01-01: 22_480 + - threshold: + 2025-01-01: 14_163 + amount: + 2025-01-01: 22_520 + - threshold: + 2025-01-01: 14_188 + amount: + 2025-01-01: 22_559 + - threshold: + 2025-01-01: 14_213 + amount: + 2025-01-01: 22_599 + - threshold: + 2025-01-01: 14_238 + amount: + 2025-01-01: 22_639 + - threshold: + 2025-01-01: 14_263 + amount: + 2025-01-01: 22_678 + - threshold: + 2025-01-01: 14_288 + amount: + 2025-01-01: 22_718 + - threshold: + 2025-01-01: 14_313 + amount: + 2025-01-01: 22_758 + - threshold: + 2025-01-01: 14_338 + amount: + 2025-01-01: 22_797 + - threshold: + 2025-01-01: 14_363 + amount: + 2025-01-01: 22_837 + - threshold: + 2025-01-01: 14_388 + amount: + 2025-01-01: 22_877 + - threshold: + 2025-01-01: 14_413 + amount: + 2025-01-01: 22_916 + - threshold: + 2025-01-01: 14_438 + amount: + 2025-01-01: 22_956 + - threshold: + 2025-01-01: 14_463 + amount: + 2025-01-01: 22_996 + - threshold: + 2025-01-01: 14_488 + amount: + 2025-01-01: 23_035 + - threshold: + 2025-01-01: 14_513 + amount: + 2025-01-01: 23_075 + - threshold: + 2025-01-01: 14_538 + amount: + 2025-01-01: 23_115 + - threshold: + 2025-01-01: 14_563 + amount: + 2025-01-01: 23_154 + - threshold: + 2025-01-01: 14_588 + amount: + 2025-01-01: 23_194 + - threshold: + 2025-01-01: 14_613 + amount: + 2025-01-01: 23_234 + - threshold: + 2025-01-01: 14_638 + amount: + 2025-01-01: 23_274 + - threshold: + 2025-01-01: 14_663 + amount: + 2025-01-01: 23_313 + - threshold: + 2025-01-01: 14_688 + amount: + 2025-01-01: 23_353 + - threshold: + 2025-01-01: 14_713 + amount: + 2025-01-01: 23_393 + - threshold: + 2025-01-01: 14_738 + amount: + 2025-01-01: 23_432 + - threshold: + 2025-01-01: 14_763 + amount: + 2025-01-01: 23_472 + - threshold: + 2025-01-01: 14_788 + amount: + 2025-01-01: 23_512 + - threshold: + 2025-01-01: 14_813 + amount: + 2025-01-01: 23_551 + - threshold: + 2025-01-01: 14_838 + amount: + 2025-01-01: 23_591 + - threshold: + 2025-01-01: 14_863 + amount: + 2025-01-01: 23_631 + - threshold: + 2025-01-01: 14_888 + amount: + 2025-01-01: 23_670 + - threshold: + 2025-01-01: 14_913 + amount: + 2025-01-01: 23_710 + - threshold: + 2025-01-01: 14_938 + amount: + 2025-01-01: 23_750 + - threshold: + 2025-01-01: 14_963 + amount: + 2025-01-01: 23_789 + - threshold: + 2025-01-01: 14_988 + amount: + 2025-01-01: 23_829 + - threshold: + 2025-01-01: 15_013 + amount: + 2025-01-01: 23_869 + - threshold: + 2025-01-01: 15_038 + amount: + 2025-01-01: 23_908 + - threshold: + 2025-01-01: 15_063 + amount: + 2025-01-01: 23_948 + - threshold: + 2025-01-01: 15_088 + amount: + 2025-01-01: 23_988 + - threshold: + 2025-01-01: 15_113 + amount: + 2025-01-01: 24_027 + - threshold: + 2025-01-01: 15_138 + amount: + 2025-01-01: 24_067 + - threshold: + 2025-01-01: 15_163 + amount: + 2025-01-01: 24_107 + - threshold: + 2025-01-01: 15_188 + amount: + 2025-01-01: 24_147 + - threshold: + 2025-01-01: 15_213 + amount: + 2025-01-01: 24_186 + - threshold: + 2025-01-01: 15_238 + amount: + 2025-01-01: 24_226 + - threshold: + 2025-01-01: 15_263 + amount: + 2025-01-01: 24_266 + - threshold: + 2025-01-01: 15_288 + amount: + 2025-01-01: 24_305 + - threshold: + 2025-01-01: 15_313 + amount: + 2025-01-01: 24_345 + - threshold: + 2025-01-01: 15_338 + amount: + 2025-01-01: 24_385 + - threshold: + 2025-01-01: 15_363 + amount: + 2025-01-01: 24_424 + - threshold: + 2025-01-01: 15_388 + amount: + 2025-01-01: 24_424 + +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: year + period: year + label: Pennsylvania UC qualifying wages table + reference: + - title: Pennsylvania Unemployment Compensation Law § 404(e)(1) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=136 + - title: 54 Pa.B. 8560, Doc. No. 24-1863 (December 28, 2024) — 2025 Table Specified by Law + href: https://www.pacodeandbulletin.gov/Display/pabull?file=/secure/pabulletin/data/vol54/54-52/1863.html + - title: 34 Pa. Code Ch. 65 App. A — Table Specified for the Determination of Rate and Amount of Benefits + href: https://www.pacodeandbulletin.gov/Display/pacode?file=/secure/pacode/data/034/chapter65/chap65toc.html&d= diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/rate_table.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/rate_table.yaml new file mode 100644 index 00000000000..cae2ba05f8e --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/rate_table.yaml @@ -0,0 +1,2216 @@ +description: Pennsylvania provides this weekly benefit rate based on highest quarterly wages under the Unemployment Compensation program. + +brackets: + - threshold: + 2025-01-01: 1_688 + amount: + 2025-01-01: 68 + - threshold: + 2025-01-01: 1_713 + amount: + 2025-01-01: 69 + - threshold: + 2025-01-01: 1_738 + amount: + 2025-01-01: 70 + - threshold: + 2025-01-01: 1_763 + amount: + 2025-01-01: 71 + - threshold: + 2025-01-01: 1_788 + amount: + 2025-01-01: 72 + - threshold: + 2025-01-01: 1_813 + amount: + 2025-01-01: 73 + - threshold: + 2025-01-01: 1_838 + amount: + 2025-01-01: 74 + - threshold: + 2025-01-01: 1_863 + amount: + 2025-01-01: 75 + - threshold: + 2025-01-01: 1_888 + amount: + 2025-01-01: 76 + - threshold: + 2025-01-01: 1_913 + amount: + 2025-01-01: 77 + - threshold: + 2025-01-01: 1_938 + amount: + 2025-01-01: 78 + - threshold: + 2025-01-01: 1_963 + amount: + 2025-01-01: 79 + - threshold: + 2025-01-01: 1_988 + amount: + 2025-01-01: 80 + - threshold: + 2025-01-01: 2_013 + amount: + 2025-01-01: 81 + - threshold: + 2025-01-01: 2_038 + amount: + 2025-01-01: 82 + - threshold: + 2025-01-01: 2_063 + amount: + 2025-01-01: 83 + - threshold: + 2025-01-01: 2_088 + amount: + 2025-01-01: 84 + - threshold: + 2025-01-01: 2_113 + amount: + 2025-01-01: 85 + - threshold: + 2025-01-01: 2_138 + amount: + 2025-01-01: 86 + - threshold: + 2025-01-01: 2_163 + amount: + 2025-01-01: 87 + - threshold: + 2025-01-01: 2_188 + amount: + 2025-01-01: 88 + - threshold: + 2025-01-01: 2_213 + amount: + 2025-01-01: 89 + - threshold: + 2025-01-01: 2_238 + amount: + 2025-01-01: 90 + - threshold: + 2025-01-01: 2_263 + amount: + 2025-01-01: 91 + - threshold: + 2025-01-01: 2_288 + amount: + 2025-01-01: 92 + - threshold: + 2025-01-01: 2_313 + amount: + 2025-01-01: 93 + - threshold: + 2025-01-01: 2_338 + amount: + 2025-01-01: 94 + - threshold: + 2025-01-01: 2_363 + amount: + 2025-01-01: 95 + - threshold: + 2025-01-01: 2_388 + amount: + 2025-01-01: 96 + - threshold: + 2025-01-01: 2_413 + amount: + 2025-01-01: 97 + - threshold: + 2025-01-01: 2_438 + amount: + 2025-01-01: 98 + - threshold: + 2025-01-01: 2_463 + amount: + 2025-01-01: 98 + - threshold: + 2025-01-01: 2_488 + amount: + 2025-01-01: 99 + - threshold: + 2025-01-01: 2_513 + amount: + 2025-01-01: 100 + - threshold: + 2025-01-01: 2_538 + amount: + 2025-01-01: 101 + - threshold: + 2025-01-01: 2_563 + amount: + 2025-01-01: 102 + - threshold: + 2025-01-01: 2_588 + amount: + 2025-01-01: 103 + - threshold: + 2025-01-01: 2_613 + amount: + 2025-01-01: 104 + - threshold: + 2025-01-01: 2_638 + amount: + 2025-01-01: 105 + - threshold: + 2025-01-01: 2_663 + amount: + 2025-01-01: 106 + - threshold: + 2025-01-01: 2_688 + amount: + 2025-01-01: 107 + - threshold: + 2025-01-01: 2_713 + amount: + 2025-01-01: 108 + - threshold: + 2025-01-01: 2_738 + amount: + 2025-01-01: 109 + - threshold: + 2025-01-01: 2_763 + amount: + 2025-01-01: 110 + - threshold: + 2025-01-01: 2_788 + amount: + 2025-01-01: 111 + - threshold: + 2025-01-01: 2_813 + amount: + 2025-01-01: 112 + - threshold: + 2025-01-01: 2_838 + amount: + 2025-01-01: 113 + - threshold: + 2025-01-01: 2_863 + amount: + 2025-01-01: 114 + - threshold: + 2025-01-01: 2_888 + amount: + 2025-01-01: 115 + - threshold: + 2025-01-01: 2_913 + amount: + 2025-01-01: 116 + - threshold: + 2025-01-01: 2_938 + amount: + 2025-01-01: 117 + - threshold: + 2025-01-01: 2_963 + amount: + 2025-01-01: 118 + - threshold: + 2025-01-01: 2_988 + amount: + 2025-01-01: 119 + - threshold: + 2025-01-01: 3_013 + amount: + 2025-01-01: 120 + - threshold: + 2025-01-01: 3_038 + amount: + 2025-01-01: 121 + - threshold: + 2025-01-01: 3_063 + amount: + 2025-01-01: 122 + - threshold: + 2025-01-01: 3_088 + amount: + 2025-01-01: 123 + - threshold: + 2025-01-01: 3_113 + amount: + 2025-01-01: 124 + - threshold: + 2025-01-01: 3_138 + amount: + 2025-01-01: 125 + - threshold: + 2025-01-01: 3_163 + amount: + 2025-01-01: 126 + - threshold: + 2025-01-01: 3_188 + amount: + 2025-01-01: 127 + - threshold: + 2025-01-01: 3_213 + amount: + 2025-01-01: 128 + - threshold: + 2025-01-01: 3_238 + amount: + 2025-01-01: 129 + - threshold: + 2025-01-01: 3_263 + amount: + 2025-01-01: 130 + - threshold: + 2025-01-01: 3_288 + amount: + 2025-01-01: 131 + - threshold: + 2025-01-01: 3_313 + amount: + 2025-01-01: 132 + - threshold: + 2025-01-01: 3_338 + amount: + 2025-01-01: 133 + - threshold: + 2025-01-01: 3_363 + amount: + 2025-01-01: 134 + - threshold: + 2025-01-01: 3_388 + amount: + 2025-01-01: 135 + - threshold: + 2025-01-01: 3_413 + amount: + 2025-01-01: 136 + - threshold: + 2025-01-01: 3_438 + amount: + 2025-01-01: 137 + - threshold: + 2025-01-01: 3_463 + amount: + 2025-01-01: 138 + - threshold: + 2025-01-01: 3_488 + amount: + 2025-01-01: 139 + - threshold: + 2025-01-01: 3_513 + amount: + 2025-01-01: 140 + - threshold: + 2025-01-01: 3_538 + amount: + 2025-01-01: 141 + - threshold: + 2025-01-01: 3_563 + amount: + 2025-01-01: 142 + - threshold: + 2025-01-01: 3_588 + amount: + 2025-01-01: 143 + - threshold: + 2025-01-01: 3_613 + amount: + 2025-01-01: 144 + - threshold: + 2025-01-01: 3_638 + amount: + 2025-01-01: 145 + - threshold: + 2025-01-01: 3_663 + amount: + 2025-01-01: 146 + - threshold: + 2025-01-01: 3_688 + amount: + 2025-01-01: 147 + - threshold: + 2025-01-01: 3_713 + amount: + 2025-01-01: 147 + - threshold: + 2025-01-01: 3_738 + amount: + 2025-01-01: 148 + - threshold: + 2025-01-01: 3_763 + amount: + 2025-01-01: 149 + - threshold: + 2025-01-01: 3_788 + amount: + 2025-01-01: 150 + - threshold: + 2025-01-01: 3_813 + amount: + 2025-01-01: 151 + - threshold: + 2025-01-01: 3_838 + amount: + 2025-01-01: 152 + - threshold: + 2025-01-01: 3_863 + amount: + 2025-01-01: 153 + - threshold: + 2025-01-01: 3_888 + amount: + 2025-01-01: 154 + - threshold: + 2025-01-01: 3_913 + amount: + 2025-01-01: 155 + - threshold: + 2025-01-01: 3_938 + amount: + 2025-01-01: 156 + - threshold: + 2025-01-01: 3_963 + amount: + 2025-01-01: 157 + - threshold: + 2025-01-01: 3_988 + amount: + 2025-01-01: 158 + - threshold: + 2025-01-01: 4_013 + amount: + 2025-01-01: 159 + - threshold: + 2025-01-01: 4_038 + amount: + 2025-01-01: 160 + - threshold: + 2025-01-01: 4_063 + amount: + 2025-01-01: 161 + - threshold: + 2025-01-01: 4_088 + amount: + 2025-01-01: 162 + - threshold: + 2025-01-01: 4_113 + amount: + 2025-01-01: 163 + - threshold: + 2025-01-01: 4_138 + amount: + 2025-01-01: 164 + - threshold: + 2025-01-01: 4_163 + amount: + 2025-01-01: 165 + - threshold: + 2025-01-01: 4_188 + amount: + 2025-01-01: 166 + - threshold: + 2025-01-01: 4_213 + amount: + 2025-01-01: 167 + - threshold: + 2025-01-01: 4_238 + amount: + 2025-01-01: 168 + - threshold: + 2025-01-01: 4_263 + amount: + 2025-01-01: 169 + - threshold: + 2025-01-01: 4_288 + amount: + 2025-01-01: 170 + - threshold: + 2025-01-01: 4_313 + amount: + 2025-01-01: 171 + - threshold: + 2025-01-01: 4_338 + amount: + 2025-01-01: 172 + - threshold: + 2025-01-01: 4_363 + amount: + 2025-01-01: 173 + - threshold: + 2025-01-01: 4_388 + amount: + 2025-01-01: 174 + - threshold: + 2025-01-01: 4_413 + amount: + 2025-01-01: 175 + - threshold: + 2025-01-01: 4_438 + amount: + 2025-01-01: 176 + - threshold: + 2025-01-01: 4_463 + amount: + 2025-01-01: 177 + - threshold: + 2025-01-01: 4_488 + amount: + 2025-01-01: 178 + - threshold: + 2025-01-01: 4_513 + amount: + 2025-01-01: 179 + - threshold: + 2025-01-01: 4_538 + amount: + 2025-01-01: 180 + - threshold: + 2025-01-01: 4_563 + amount: + 2025-01-01: 181 + - threshold: + 2025-01-01: 4_588 + amount: + 2025-01-01: 182 + - threshold: + 2025-01-01: 4_613 + amount: + 2025-01-01: 183 + - threshold: + 2025-01-01: 4_638 + amount: + 2025-01-01: 184 + - threshold: + 2025-01-01: 4_663 + amount: + 2025-01-01: 185 + - threshold: + 2025-01-01: 4_688 + amount: + 2025-01-01: 186 + - threshold: + 2025-01-01: 4_713 + amount: + 2025-01-01: 187 + - threshold: + 2025-01-01: 4_738 + amount: + 2025-01-01: 188 + - threshold: + 2025-01-01: 4_763 + amount: + 2025-01-01: 189 + - threshold: + 2025-01-01: 4_788 + amount: + 2025-01-01: 190 + - threshold: + 2025-01-01: 4_813 + amount: + 2025-01-01: 191 + - threshold: + 2025-01-01: 4_838 + amount: + 2025-01-01: 192 + - threshold: + 2025-01-01: 4_863 + amount: + 2025-01-01: 193 + - threshold: + 2025-01-01: 4_888 + amount: + 2025-01-01: 194 + - threshold: + 2025-01-01: 4_913 + amount: + 2025-01-01: 195 + - threshold: + 2025-01-01: 4_938 + amount: + 2025-01-01: 196 + - threshold: + 2025-01-01: 4_963 + amount: + 2025-01-01: 196 + - threshold: + 2025-01-01: 4_988 + amount: + 2025-01-01: 197 + - threshold: + 2025-01-01: 5_013 + amount: + 2025-01-01: 198 + - threshold: + 2025-01-01: 5_038 + amount: + 2025-01-01: 199 + - threshold: + 2025-01-01: 5_063 + amount: + 2025-01-01: 200 + - threshold: + 2025-01-01: 5_088 + amount: + 2025-01-01: 201 + - threshold: + 2025-01-01: 5_113 + amount: + 2025-01-01: 202 + - threshold: + 2025-01-01: 5_138 + amount: + 2025-01-01: 203 + - threshold: + 2025-01-01: 5_163 + amount: + 2025-01-01: 204 + - threshold: + 2025-01-01: 5_188 + amount: + 2025-01-01: 205 + - threshold: + 2025-01-01: 5_213 + amount: + 2025-01-01: 206 + - threshold: + 2025-01-01: 5_238 + amount: + 2025-01-01: 207 + - threshold: + 2025-01-01: 5_263 + amount: + 2025-01-01: 208 + - threshold: + 2025-01-01: 5_288 + amount: + 2025-01-01: 209 + - threshold: + 2025-01-01: 5_313 + amount: + 2025-01-01: 210 + - threshold: + 2025-01-01: 5_338 + amount: + 2025-01-01: 211 + - threshold: + 2025-01-01: 5_363 + amount: + 2025-01-01: 212 + - threshold: + 2025-01-01: 5_388 + amount: + 2025-01-01: 213 + - threshold: + 2025-01-01: 5_413 + amount: + 2025-01-01: 214 + - threshold: + 2025-01-01: 5_438 + amount: + 2025-01-01: 215 + - threshold: + 2025-01-01: 5_463 + amount: + 2025-01-01: 216 + - threshold: + 2025-01-01: 5_488 + amount: + 2025-01-01: 217 + - threshold: + 2025-01-01: 5_513 + amount: + 2025-01-01: 218 + - threshold: + 2025-01-01: 5_538 + amount: + 2025-01-01: 219 + - threshold: + 2025-01-01: 5_563 + amount: + 2025-01-01: 220 + - threshold: + 2025-01-01: 5_588 + amount: + 2025-01-01: 221 + - threshold: + 2025-01-01: 5_613 + amount: + 2025-01-01: 222 + - threshold: + 2025-01-01: 5_638 + amount: + 2025-01-01: 223 + - threshold: + 2025-01-01: 5_663 + amount: + 2025-01-01: 224 + - threshold: + 2025-01-01: 5_688 + amount: + 2025-01-01: 225 + - threshold: + 2025-01-01: 5_713 + amount: + 2025-01-01: 226 + - threshold: + 2025-01-01: 5_738 + amount: + 2025-01-01: 227 + - threshold: + 2025-01-01: 5_763 + amount: + 2025-01-01: 228 + - threshold: + 2025-01-01: 5_788 + amount: + 2025-01-01: 229 + - threshold: + 2025-01-01: 5_813 + amount: + 2025-01-01: 230 + - threshold: + 2025-01-01: 5_838 + amount: + 2025-01-01: 231 + - threshold: + 2025-01-01: 5_863 + amount: + 2025-01-01: 232 + - threshold: + 2025-01-01: 5_888 + amount: + 2025-01-01: 233 + - threshold: + 2025-01-01: 5_913 + amount: + 2025-01-01: 234 + - threshold: + 2025-01-01: 5_938 + amount: + 2025-01-01: 235 + - threshold: + 2025-01-01: 5_963 + amount: + 2025-01-01: 236 + - threshold: + 2025-01-01: 5_988 + amount: + 2025-01-01: 237 + - threshold: + 2025-01-01: 6_013 + amount: + 2025-01-01: 238 + - threshold: + 2025-01-01: 6_038 + amount: + 2025-01-01: 239 + - threshold: + 2025-01-01: 6_063 + amount: + 2025-01-01: 240 + - threshold: + 2025-01-01: 6_088 + amount: + 2025-01-01: 241 + - threshold: + 2025-01-01: 6_113 + amount: + 2025-01-01: 242 + - threshold: + 2025-01-01: 6_138 + amount: + 2025-01-01: 243 + - threshold: + 2025-01-01: 6_163 + amount: + 2025-01-01: 244 + - threshold: + 2025-01-01: 6_188 + amount: + 2025-01-01: 245 + - threshold: + 2025-01-01: 6_213 + amount: + 2025-01-01: 245 + - threshold: + 2025-01-01: 6_238 + amount: + 2025-01-01: 246 + - threshold: + 2025-01-01: 6_263 + amount: + 2025-01-01: 247 + - threshold: + 2025-01-01: 6_288 + amount: + 2025-01-01: 248 + - threshold: + 2025-01-01: 6_313 + amount: + 2025-01-01: 249 + - threshold: + 2025-01-01: 6_338 + amount: + 2025-01-01: 250 + - threshold: + 2025-01-01: 6_363 + amount: + 2025-01-01: 251 + - threshold: + 2025-01-01: 6_388 + amount: + 2025-01-01: 252 + - threshold: + 2025-01-01: 6_413 + amount: + 2025-01-01: 253 + - threshold: + 2025-01-01: 6_438 + amount: + 2025-01-01: 254 + - threshold: + 2025-01-01: 6_463 + amount: + 2025-01-01: 255 + - threshold: + 2025-01-01: 6_488 + amount: + 2025-01-01: 256 + - threshold: + 2025-01-01: 6_513 + amount: + 2025-01-01: 257 + - threshold: + 2025-01-01: 6_538 + amount: + 2025-01-01: 258 + - threshold: + 2025-01-01: 6_563 + amount: + 2025-01-01: 259 + - threshold: + 2025-01-01: 6_588 + amount: + 2025-01-01: 260 + - threshold: + 2025-01-01: 6_613 + amount: + 2025-01-01: 261 + - threshold: + 2025-01-01: 6_638 + amount: + 2025-01-01: 262 + - threshold: + 2025-01-01: 6_663 + amount: + 2025-01-01: 263 + - threshold: + 2025-01-01: 6_688 + amount: + 2025-01-01: 264 + - threshold: + 2025-01-01: 6_713 + amount: + 2025-01-01: 265 + - threshold: + 2025-01-01: 6_738 + amount: + 2025-01-01: 266 + - threshold: + 2025-01-01: 6_763 + amount: + 2025-01-01: 267 + - threshold: + 2025-01-01: 6_788 + amount: + 2025-01-01: 268 + - threshold: + 2025-01-01: 6_813 + amount: + 2025-01-01: 269 + - threshold: + 2025-01-01: 6_838 + amount: + 2025-01-01: 270 + - threshold: + 2025-01-01: 6_863 + amount: + 2025-01-01: 271 + - threshold: + 2025-01-01: 6_888 + amount: + 2025-01-01: 272 + - threshold: + 2025-01-01: 6_913 + amount: + 2025-01-01: 273 + - threshold: + 2025-01-01: 6_938 + amount: + 2025-01-01: 274 + - threshold: + 2025-01-01: 6_963 + amount: + 2025-01-01: 275 + - threshold: + 2025-01-01: 6_988 + amount: + 2025-01-01: 276 + - threshold: + 2025-01-01: 7_013 + amount: + 2025-01-01: 277 + - threshold: + 2025-01-01: 7_038 + amount: + 2025-01-01: 278 + - threshold: + 2025-01-01: 7_063 + amount: + 2025-01-01: 279 + - threshold: + 2025-01-01: 7_088 + amount: + 2025-01-01: 280 + - threshold: + 2025-01-01: 7_113 + amount: + 2025-01-01: 281 + - threshold: + 2025-01-01: 7_138 + amount: + 2025-01-01: 282 + - threshold: + 2025-01-01: 7_163 + amount: + 2025-01-01: 283 + - threshold: + 2025-01-01: 7_188 + amount: + 2025-01-01: 284 + - threshold: + 2025-01-01: 7_213 + amount: + 2025-01-01: 285 + - threshold: + 2025-01-01: 7_238 + amount: + 2025-01-01: 286 + - threshold: + 2025-01-01: 7_263 + amount: + 2025-01-01: 287 + - threshold: + 2025-01-01: 7_288 + amount: + 2025-01-01: 288 + - threshold: + 2025-01-01: 7_313 + amount: + 2025-01-01: 289 + - threshold: + 2025-01-01: 7_338 + amount: + 2025-01-01: 290 + - threshold: + 2025-01-01: 7_363 + amount: + 2025-01-01: 291 + - threshold: + 2025-01-01: 7_388 + amount: + 2025-01-01: 292 + - threshold: + 2025-01-01: 7_413 + amount: + 2025-01-01: 293 + - threshold: + 2025-01-01: 7_438 + amount: + 2025-01-01: 294 + - threshold: + 2025-01-01: 7_463 + amount: + 2025-01-01: 294 + - threshold: + 2025-01-01: 7_488 + amount: + 2025-01-01: 295 + - threshold: + 2025-01-01: 7_513 + amount: + 2025-01-01: 296 + - threshold: + 2025-01-01: 7_538 + amount: + 2025-01-01: 297 + - threshold: + 2025-01-01: 7_563 + amount: + 2025-01-01: 298 + - threshold: + 2025-01-01: 7_588 + amount: + 2025-01-01: 299 + - threshold: + 2025-01-01: 7_613 + amount: + 2025-01-01: 300 + - threshold: + 2025-01-01: 7_638 + amount: + 2025-01-01: 301 + - threshold: + 2025-01-01: 7_663 + amount: + 2025-01-01: 302 + - threshold: + 2025-01-01: 7_688 + amount: + 2025-01-01: 303 + - threshold: + 2025-01-01: 7_713 + amount: + 2025-01-01: 304 + - threshold: + 2025-01-01: 7_738 + amount: + 2025-01-01: 305 + - threshold: + 2025-01-01: 7_763 + amount: + 2025-01-01: 306 + - threshold: + 2025-01-01: 7_788 + amount: + 2025-01-01: 307 + - threshold: + 2025-01-01: 7_813 + amount: + 2025-01-01: 308 + - threshold: + 2025-01-01: 7_838 + amount: + 2025-01-01: 309 + - threshold: + 2025-01-01: 7_863 + amount: + 2025-01-01: 310 + - threshold: + 2025-01-01: 7_888 + amount: + 2025-01-01: 311 + - threshold: + 2025-01-01: 7_913 + amount: + 2025-01-01: 312 + - threshold: + 2025-01-01: 7_938 + amount: + 2025-01-01: 313 + - threshold: + 2025-01-01: 7_963 + amount: + 2025-01-01: 314 + - threshold: + 2025-01-01: 7_988 + amount: + 2025-01-01: 315 + - threshold: + 2025-01-01: 8_013 + amount: + 2025-01-01: 316 + - threshold: + 2025-01-01: 8_038 + amount: + 2025-01-01: 317 + - threshold: + 2025-01-01: 8_063 + amount: + 2025-01-01: 318 + - threshold: + 2025-01-01: 8_088 + amount: + 2025-01-01: 319 + - threshold: + 2025-01-01: 8_113 + amount: + 2025-01-01: 320 + - threshold: + 2025-01-01: 8_138 + amount: + 2025-01-01: 321 + - threshold: + 2025-01-01: 8_163 + amount: + 2025-01-01: 322 + - threshold: + 2025-01-01: 8_188 + amount: + 2025-01-01: 323 + - threshold: + 2025-01-01: 8_213 + amount: + 2025-01-01: 324 + - threshold: + 2025-01-01: 8_238 + amount: + 2025-01-01: 325 + - threshold: + 2025-01-01: 8_263 + amount: + 2025-01-01: 326 + - threshold: + 2025-01-01: 8_288 + amount: + 2025-01-01: 327 + - threshold: + 2025-01-01: 8_313 + amount: + 2025-01-01: 328 + - threshold: + 2025-01-01: 8_338 + amount: + 2025-01-01: 329 + - threshold: + 2025-01-01: 8_363 + amount: + 2025-01-01: 330 + - threshold: + 2025-01-01: 8_388 + amount: + 2025-01-01: 331 + - threshold: + 2025-01-01: 8_413 + amount: + 2025-01-01: 332 + - threshold: + 2025-01-01: 8_438 + amount: + 2025-01-01: 333 + - threshold: + 2025-01-01: 8_463 + amount: + 2025-01-01: 334 + - threshold: + 2025-01-01: 8_488 + amount: + 2025-01-01: 335 + - threshold: + 2025-01-01: 8_513 + amount: + 2025-01-01: 336 + - threshold: + 2025-01-01: 8_538 + amount: + 2025-01-01: 337 + - threshold: + 2025-01-01: 8_563 + amount: + 2025-01-01: 338 + - threshold: + 2025-01-01: 8_588 + amount: + 2025-01-01: 339 + - threshold: + 2025-01-01: 8_613 + amount: + 2025-01-01: 340 + - threshold: + 2025-01-01: 8_638 + amount: + 2025-01-01: 341 + - threshold: + 2025-01-01: 8_663 + amount: + 2025-01-01: 342 + - threshold: + 2025-01-01: 8_688 + amount: + 2025-01-01: 343 + - threshold: + 2025-01-01: 8_713 + amount: + 2025-01-01: 343 + - threshold: + 2025-01-01: 8_738 + amount: + 2025-01-01: 344 + - threshold: + 2025-01-01: 8_763 + amount: + 2025-01-01: 345 + - threshold: + 2025-01-01: 8_788 + amount: + 2025-01-01: 346 + - threshold: + 2025-01-01: 8_813 + amount: + 2025-01-01: 347 + - threshold: + 2025-01-01: 8_838 + amount: + 2025-01-01: 348 + - threshold: + 2025-01-01: 8_863 + amount: + 2025-01-01: 349 + - threshold: + 2025-01-01: 8_888 + amount: + 2025-01-01: 350 + - threshold: + 2025-01-01: 8_913 + amount: + 2025-01-01: 351 + - threshold: + 2025-01-01: 8_938 + amount: + 2025-01-01: 352 + - threshold: + 2025-01-01: 8_963 + amount: + 2025-01-01: 353 + - threshold: + 2025-01-01: 8_988 + amount: + 2025-01-01: 354 + - threshold: + 2025-01-01: 9_013 + amount: + 2025-01-01: 355 + - threshold: + 2025-01-01: 9_038 + amount: + 2025-01-01: 356 + - threshold: + 2025-01-01: 9_063 + amount: + 2025-01-01: 357 + - threshold: + 2025-01-01: 9_088 + amount: + 2025-01-01: 358 + - threshold: + 2025-01-01: 9_113 + amount: + 2025-01-01: 359 + - threshold: + 2025-01-01: 9_138 + amount: + 2025-01-01: 360 + - threshold: + 2025-01-01: 9_163 + amount: + 2025-01-01: 361 + - threshold: + 2025-01-01: 9_188 + amount: + 2025-01-01: 362 + - threshold: + 2025-01-01: 9_213 + amount: + 2025-01-01: 363 + - threshold: + 2025-01-01: 9_238 + amount: + 2025-01-01: 364 + - threshold: + 2025-01-01: 9_263 + amount: + 2025-01-01: 365 + - threshold: + 2025-01-01: 9_288 + amount: + 2025-01-01: 366 + - threshold: + 2025-01-01: 9_313 + amount: + 2025-01-01: 367 + - threshold: + 2025-01-01: 9_338 + amount: + 2025-01-01: 368 + - threshold: + 2025-01-01: 9_363 + amount: + 2025-01-01: 369 + - threshold: + 2025-01-01: 9_388 + amount: + 2025-01-01: 370 + - threshold: + 2025-01-01: 9_413 + amount: + 2025-01-01: 371 + - threshold: + 2025-01-01: 9_438 + amount: + 2025-01-01: 372 + - threshold: + 2025-01-01: 9_463 + amount: + 2025-01-01: 373 + - threshold: + 2025-01-01: 9_488 + amount: + 2025-01-01: 374 + - threshold: + 2025-01-01: 9_513 + amount: + 2025-01-01: 375 + - threshold: + 2025-01-01: 9_538 + amount: + 2025-01-01: 376 + - threshold: + 2025-01-01: 9_563 + amount: + 2025-01-01: 377 + - threshold: + 2025-01-01: 9_588 + amount: + 2025-01-01: 378 + - threshold: + 2025-01-01: 9_613 + amount: + 2025-01-01: 379 + - threshold: + 2025-01-01: 9_638 + amount: + 2025-01-01: 380 + - threshold: + 2025-01-01: 9_663 + amount: + 2025-01-01: 381 + - threshold: + 2025-01-01: 9_688 + amount: + 2025-01-01: 382 + - threshold: + 2025-01-01: 9_713 + amount: + 2025-01-01: 383 + - threshold: + 2025-01-01: 9_738 + amount: + 2025-01-01: 384 + - threshold: + 2025-01-01: 9_763 + amount: + 2025-01-01: 385 + - threshold: + 2025-01-01: 9_788 + amount: + 2025-01-01: 386 + - threshold: + 2025-01-01: 9_813 + amount: + 2025-01-01: 387 + - threshold: + 2025-01-01: 9_838 + amount: + 2025-01-01: 388 + - threshold: + 2025-01-01: 9_863 + amount: + 2025-01-01: 389 + - threshold: + 2025-01-01: 9_888 + amount: + 2025-01-01: 390 + - threshold: + 2025-01-01: 9_913 + amount: + 2025-01-01: 391 + - threshold: + 2025-01-01: 9_938 + amount: + 2025-01-01: 392 + - threshold: + 2025-01-01: 9_963 + amount: + 2025-01-01: 392 + - threshold: + 2025-01-01: 9_988 + amount: + 2025-01-01: 393 + - threshold: + 2025-01-01: 10_013 + amount: + 2025-01-01: 394 + - threshold: + 2025-01-01: 10_038 + amount: + 2025-01-01: 395 + - threshold: + 2025-01-01: 10_063 + amount: + 2025-01-01: 396 + - threshold: + 2025-01-01: 10_088 + amount: + 2025-01-01: 397 + - threshold: + 2025-01-01: 10_113 + amount: + 2025-01-01: 398 + - threshold: + 2025-01-01: 10_138 + amount: + 2025-01-01: 399 + - threshold: + 2025-01-01: 10_163 + amount: + 2025-01-01: 400 + - threshold: + 2025-01-01: 10_188 + amount: + 2025-01-01: 401 + - threshold: + 2025-01-01: 10_213 + amount: + 2025-01-01: 402 + - threshold: + 2025-01-01: 10_238 + amount: + 2025-01-01: 403 + - threshold: + 2025-01-01: 10_263 + amount: + 2025-01-01: 404 + - threshold: + 2025-01-01: 10_288 + amount: + 2025-01-01: 405 + - threshold: + 2025-01-01: 10_313 + amount: + 2025-01-01: 406 + - threshold: + 2025-01-01: 10_338 + amount: + 2025-01-01: 407 + - threshold: + 2025-01-01: 10_363 + amount: + 2025-01-01: 408 + - threshold: + 2025-01-01: 10_388 + amount: + 2025-01-01: 409 + - threshold: + 2025-01-01: 10_413 + amount: + 2025-01-01: 410 + - threshold: + 2025-01-01: 10_438 + amount: + 2025-01-01: 411 + - threshold: + 2025-01-01: 10_463 + amount: + 2025-01-01: 412 + - threshold: + 2025-01-01: 10_488 + amount: + 2025-01-01: 413 + - threshold: + 2025-01-01: 10_513 + amount: + 2025-01-01: 414 + - threshold: + 2025-01-01: 10_538 + amount: + 2025-01-01: 415 + - threshold: + 2025-01-01: 10_563 + amount: + 2025-01-01: 416 + - threshold: + 2025-01-01: 10_588 + amount: + 2025-01-01: 417 + - threshold: + 2025-01-01: 10_613 + amount: + 2025-01-01: 418 + - threshold: + 2025-01-01: 10_638 + amount: + 2025-01-01: 419 + - threshold: + 2025-01-01: 10_663 + amount: + 2025-01-01: 420 + - threshold: + 2025-01-01: 10_688 + amount: + 2025-01-01: 421 + - threshold: + 2025-01-01: 10_713 + amount: + 2025-01-01: 422 + - threshold: + 2025-01-01: 10_738 + amount: + 2025-01-01: 423 + - threshold: + 2025-01-01: 10_763 + amount: + 2025-01-01: 424 + - threshold: + 2025-01-01: 10_788 + amount: + 2025-01-01: 425 + - threshold: + 2025-01-01: 10_813 + amount: + 2025-01-01: 426 + - threshold: + 2025-01-01: 10_838 + amount: + 2025-01-01: 427 + - threshold: + 2025-01-01: 10_863 + amount: + 2025-01-01: 428 + - threshold: + 2025-01-01: 10_888 + amount: + 2025-01-01: 429 + - threshold: + 2025-01-01: 10_913 + amount: + 2025-01-01: 430 + - threshold: + 2025-01-01: 10_938 + amount: + 2025-01-01: 431 + - threshold: + 2025-01-01: 10_963 + amount: + 2025-01-01: 432 + - threshold: + 2025-01-01: 10_988 + amount: + 2025-01-01: 433 + - threshold: + 2025-01-01: 11_013 + amount: + 2025-01-01: 434 + - threshold: + 2025-01-01: 11_038 + amount: + 2025-01-01: 435 + - threshold: + 2025-01-01: 11_063 + amount: + 2025-01-01: 436 + - threshold: + 2025-01-01: 11_088 + amount: + 2025-01-01: 437 + - threshold: + 2025-01-01: 11_113 + amount: + 2025-01-01: 438 + - threshold: + 2025-01-01: 11_138 + amount: + 2025-01-01: 439 + - threshold: + 2025-01-01: 11_163 + amount: + 2025-01-01: 440 + - threshold: + 2025-01-01: 11_188 + amount: + 2025-01-01: 441 + - threshold: + 2025-01-01: 11_213 + amount: + 2025-01-01: 441 + - threshold: + 2025-01-01: 11_238 + amount: + 2025-01-01: 442 + - threshold: + 2025-01-01: 11_263 + amount: + 2025-01-01: 443 + - threshold: + 2025-01-01: 11_288 + amount: + 2025-01-01: 444 + - threshold: + 2025-01-01: 11_313 + amount: + 2025-01-01: 445 + - threshold: + 2025-01-01: 11_338 + amount: + 2025-01-01: 446 + - threshold: + 2025-01-01: 11_363 + amount: + 2025-01-01: 447 + - threshold: + 2025-01-01: 11_388 + amount: + 2025-01-01: 448 + - threshold: + 2025-01-01: 11_413 + amount: + 2025-01-01: 449 + - threshold: + 2025-01-01: 11_438 + amount: + 2025-01-01: 450 + - threshold: + 2025-01-01: 11_463 + amount: + 2025-01-01: 451 + - threshold: + 2025-01-01: 11_488 + amount: + 2025-01-01: 452 + - threshold: + 2025-01-01: 11_513 + amount: + 2025-01-01: 453 + - threshold: + 2025-01-01: 11_538 + amount: + 2025-01-01: 454 + - threshold: + 2025-01-01: 11_563 + amount: + 2025-01-01: 455 + - threshold: + 2025-01-01: 11_588 + amount: + 2025-01-01: 456 + - threshold: + 2025-01-01: 11_613 + amount: + 2025-01-01: 457 + - threshold: + 2025-01-01: 11_638 + amount: + 2025-01-01: 458 + - threshold: + 2025-01-01: 11_663 + amount: + 2025-01-01: 459 + - threshold: + 2025-01-01: 11_688 + amount: + 2025-01-01: 460 + - threshold: + 2025-01-01: 11_713 + amount: + 2025-01-01: 461 + - threshold: + 2025-01-01: 11_738 + amount: + 2025-01-01: 462 + - threshold: + 2025-01-01: 11_763 + amount: + 2025-01-01: 463 + - threshold: + 2025-01-01: 11_788 + amount: + 2025-01-01: 464 + - threshold: + 2025-01-01: 11_813 + amount: + 2025-01-01: 465 + - threshold: + 2025-01-01: 11_838 + amount: + 2025-01-01: 466 + - threshold: + 2025-01-01: 11_863 + amount: + 2025-01-01: 467 + - threshold: + 2025-01-01: 11_888 + amount: + 2025-01-01: 468 + - threshold: + 2025-01-01: 11_913 + amount: + 2025-01-01: 469 + - threshold: + 2025-01-01: 11_938 + amount: + 2025-01-01: 470 + - threshold: + 2025-01-01: 11_963 + amount: + 2025-01-01: 471 + - threshold: + 2025-01-01: 11_988 + amount: + 2025-01-01: 472 + - threshold: + 2025-01-01: 12_013 + amount: + 2025-01-01: 473 + - threshold: + 2025-01-01: 12_038 + amount: + 2025-01-01: 474 + - threshold: + 2025-01-01: 12_063 + amount: + 2025-01-01: 475 + - threshold: + 2025-01-01: 12_088 + amount: + 2025-01-01: 476 + - threshold: + 2025-01-01: 12_113 + amount: + 2025-01-01: 477 + - threshold: + 2025-01-01: 12_138 + amount: + 2025-01-01: 478 + - threshold: + 2025-01-01: 12_163 + amount: + 2025-01-01: 479 + - threshold: + 2025-01-01: 12_188 + amount: + 2025-01-01: 480 + - threshold: + 2025-01-01: 12_213 + amount: + 2025-01-01: 481 + - threshold: + 2025-01-01: 12_238 + amount: + 2025-01-01: 482 + - threshold: + 2025-01-01: 12_263 + amount: + 2025-01-01: 483 + - threshold: + 2025-01-01: 12_288 + amount: + 2025-01-01: 484 + - threshold: + 2025-01-01: 12_313 + amount: + 2025-01-01: 485 + - threshold: + 2025-01-01: 12_338 + amount: + 2025-01-01: 486 + - threshold: + 2025-01-01: 12_363 + amount: + 2025-01-01: 487 + - threshold: + 2025-01-01: 12_388 + amount: + 2025-01-01: 488 + - threshold: + 2025-01-01: 12_413 + amount: + 2025-01-01: 489 + - threshold: + 2025-01-01: 12_438 + amount: + 2025-01-01: 490 + - threshold: + 2025-01-01: 12_463 + amount: + 2025-01-01: 490 + - threshold: + 2025-01-01: 12_488 + amount: + 2025-01-01: 491 + - threshold: + 2025-01-01: 12_513 + amount: + 2025-01-01: 492 + - threshold: + 2025-01-01: 12_538 + amount: + 2025-01-01: 493 + - threshold: + 2025-01-01: 12_563 + amount: + 2025-01-01: 494 + - threshold: + 2025-01-01: 12_588 + amount: + 2025-01-01: 495 + - threshold: + 2025-01-01: 12_613 + amount: + 2025-01-01: 496 + - threshold: + 2025-01-01: 12_638 + amount: + 2025-01-01: 497 + - threshold: + 2025-01-01: 12_663 + amount: + 2025-01-01: 498 + - threshold: + 2025-01-01: 12_688 + amount: + 2025-01-01: 499 + - threshold: + 2025-01-01: 12_713 + amount: + 2025-01-01: 500 + - threshold: + 2025-01-01: 12_738 + amount: + 2025-01-01: 501 + - threshold: + 2025-01-01: 12_763 + amount: + 2025-01-01: 502 + - threshold: + 2025-01-01: 12_788 + amount: + 2025-01-01: 503 + - threshold: + 2025-01-01: 12_813 + amount: + 2025-01-01: 504 + - threshold: + 2025-01-01: 12_838 + amount: + 2025-01-01: 505 + - threshold: + 2025-01-01: 12_863 + amount: + 2025-01-01: 506 + - threshold: + 2025-01-01: 12_888 + amount: + 2025-01-01: 507 + - threshold: + 2025-01-01: 12_913 + amount: + 2025-01-01: 508 + - threshold: + 2025-01-01: 12_938 + amount: + 2025-01-01: 509 + - threshold: + 2025-01-01: 12_963 + amount: + 2025-01-01: 510 + - threshold: + 2025-01-01: 12_988 + amount: + 2025-01-01: 511 + - threshold: + 2025-01-01: 13_013 + amount: + 2025-01-01: 512 + - threshold: + 2025-01-01: 13_038 + amount: + 2025-01-01: 513 + - threshold: + 2025-01-01: 13_063 + amount: + 2025-01-01: 514 + - threshold: + 2025-01-01: 13_088 + amount: + 2025-01-01: 515 + - threshold: + 2025-01-01: 13_113 + amount: + 2025-01-01: 516 + - threshold: + 2025-01-01: 13_138 + amount: + 2025-01-01: 517 + - threshold: + 2025-01-01: 13_163 + amount: + 2025-01-01: 518 + - threshold: + 2025-01-01: 13_188 + amount: + 2025-01-01: 519 + - threshold: + 2025-01-01: 13_213 + amount: + 2025-01-01: 520 + - threshold: + 2025-01-01: 13_238 + amount: + 2025-01-01: 521 + - threshold: + 2025-01-01: 13_263 + amount: + 2025-01-01: 522 + - threshold: + 2025-01-01: 13_288 + amount: + 2025-01-01: 523 + - threshold: + 2025-01-01: 13_313 + amount: + 2025-01-01: 524 + - threshold: + 2025-01-01: 13_338 + amount: + 2025-01-01: 525 + - threshold: + 2025-01-01: 13_363 + amount: + 2025-01-01: 526 + - threshold: + 2025-01-01: 13_388 + amount: + 2025-01-01: 527 + - threshold: + 2025-01-01: 13_413 + amount: + 2025-01-01: 528 + - threshold: + 2025-01-01: 13_438 + amount: + 2025-01-01: 529 + - threshold: + 2025-01-01: 13_463 + amount: + 2025-01-01: 530 + - threshold: + 2025-01-01: 13_488 + amount: + 2025-01-01: 531 + - threshold: + 2025-01-01: 13_513 + amount: + 2025-01-01: 532 + - threshold: + 2025-01-01: 13_538 + amount: + 2025-01-01: 533 + - threshold: + 2025-01-01: 13_563 + amount: + 2025-01-01: 534 + - threshold: + 2025-01-01: 13_588 + amount: + 2025-01-01: 535 + - threshold: + 2025-01-01: 13_613 + amount: + 2025-01-01: 536 + - threshold: + 2025-01-01: 13_638 + amount: + 2025-01-01: 537 + - threshold: + 2025-01-01: 13_663 + amount: + 2025-01-01: 538 + - threshold: + 2025-01-01: 13_688 + amount: + 2025-01-01: 539 + - threshold: + 2025-01-01: 13_713 + amount: + 2025-01-01: 539 + - threshold: + 2025-01-01: 13_738 + amount: + 2025-01-01: 540 + - threshold: + 2025-01-01: 13_763 + amount: + 2025-01-01: 541 + - threshold: + 2025-01-01: 13_788 + amount: + 2025-01-01: 542 + - threshold: + 2025-01-01: 13_813 + amount: + 2025-01-01: 543 + - threshold: + 2025-01-01: 13_838 + amount: + 2025-01-01: 544 + - threshold: + 2025-01-01: 13_863 + amount: + 2025-01-01: 545 + - threshold: + 2025-01-01: 13_888 + amount: + 2025-01-01: 546 + - threshold: + 2025-01-01: 13_913 + amount: + 2025-01-01: 547 + - threshold: + 2025-01-01: 13_938 + amount: + 2025-01-01: 548 + - threshold: + 2025-01-01: 13_963 + amount: + 2025-01-01: 549 + - threshold: + 2025-01-01: 13_988 + amount: + 2025-01-01: 550 + - threshold: + 2025-01-01: 14_013 + amount: + 2025-01-01: 551 + - threshold: + 2025-01-01: 14_038 + amount: + 2025-01-01: 552 + - threshold: + 2025-01-01: 14_063 + amount: + 2025-01-01: 553 + - threshold: + 2025-01-01: 14_088 + amount: + 2025-01-01: 554 + - threshold: + 2025-01-01: 14_113 + amount: + 2025-01-01: 555 + - threshold: + 2025-01-01: 14_138 + amount: + 2025-01-01: 556 + - threshold: + 2025-01-01: 14_163 + amount: + 2025-01-01: 557 + - threshold: + 2025-01-01: 14_188 + amount: + 2025-01-01: 558 + - threshold: + 2025-01-01: 14_213 + amount: + 2025-01-01: 559 + - threshold: + 2025-01-01: 14_238 + amount: + 2025-01-01: 560 + - threshold: + 2025-01-01: 14_263 + amount: + 2025-01-01: 561 + - threshold: + 2025-01-01: 14_288 + amount: + 2025-01-01: 562 + - threshold: + 2025-01-01: 14_313 + amount: + 2025-01-01: 563 + - threshold: + 2025-01-01: 14_338 + amount: + 2025-01-01: 564 + - threshold: + 2025-01-01: 14_363 + amount: + 2025-01-01: 565 + - threshold: + 2025-01-01: 14_388 + amount: + 2025-01-01: 566 + - threshold: + 2025-01-01: 14_413 + amount: + 2025-01-01: 567 + - threshold: + 2025-01-01: 14_438 + amount: + 2025-01-01: 568 + - threshold: + 2025-01-01: 14_463 + amount: + 2025-01-01: 569 + - threshold: + 2025-01-01: 14_488 + amount: + 2025-01-01: 570 + - threshold: + 2025-01-01: 14_513 + amount: + 2025-01-01: 571 + - threshold: + 2025-01-01: 14_538 + amount: + 2025-01-01: 572 + - threshold: + 2025-01-01: 14_563 + amount: + 2025-01-01: 573 + - threshold: + 2025-01-01: 14_588 + amount: + 2025-01-01: 574 + - threshold: + 2025-01-01: 14_613 + amount: + 2025-01-01: 575 + - threshold: + 2025-01-01: 14_638 + amount: + 2025-01-01: 576 + - threshold: + 2025-01-01: 14_663 + amount: + 2025-01-01: 577 + - threshold: + 2025-01-01: 14_688 + amount: + 2025-01-01: 578 + - threshold: + 2025-01-01: 14_713 + amount: + 2025-01-01: 579 + - threshold: + 2025-01-01: 14_738 + amount: + 2025-01-01: 580 + - threshold: + 2025-01-01: 14_763 + amount: + 2025-01-01: 581 + - threshold: + 2025-01-01: 14_788 + amount: + 2025-01-01: 582 + - threshold: + 2025-01-01: 14_813 + amount: + 2025-01-01: 583 + - threshold: + 2025-01-01: 14_838 + amount: + 2025-01-01: 584 + - threshold: + 2025-01-01: 14_863 + amount: + 2025-01-01: 585 + - threshold: + 2025-01-01: 14_888 + amount: + 2025-01-01: 586 + - threshold: + 2025-01-01: 14_913 + amount: + 2025-01-01: 587 + - threshold: + 2025-01-01: 14_938 + amount: + 2025-01-01: 588 + - threshold: + 2025-01-01: 14_963 + amount: + 2025-01-01: 588 + - threshold: + 2025-01-01: 14_988 + amount: + 2025-01-01: 589 + - threshold: + 2025-01-01: 15_013 + amount: + 2025-01-01: 590 + - threshold: + 2025-01-01: 15_038 + amount: + 2025-01-01: 591 + - threshold: + 2025-01-01: 15_063 + amount: + 2025-01-01: 592 + - threshold: + 2025-01-01: 15_088 + amount: + 2025-01-01: 593 + - threshold: + 2025-01-01: 15_113 + amount: + 2025-01-01: 594 + - threshold: + 2025-01-01: 15_138 + amount: + 2025-01-01: 595 + - threshold: + 2025-01-01: 15_163 + amount: + 2025-01-01: 596 + - threshold: + 2025-01-01: 15_188 + amount: + 2025-01-01: 597 + - threshold: + 2025-01-01: 15_213 + amount: + 2025-01-01: 598 + - threshold: + 2025-01-01: 15_238 + amount: + 2025-01-01: 599 + - threshold: + 2025-01-01: 15_263 + amount: + 2025-01-01: 600 + - threshold: + 2025-01-01: 15_288 + amount: + 2025-01-01: 601 + - threshold: + 2025-01-01: 15_313 + amount: + 2025-01-01: 602 + - threshold: + 2025-01-01: 15_338 + amount: + 2025-01-01: 603 + - threshold: + 2025-01-01: 15_363 + amount: + 2025-01-01: 604 + - threshold: + 2025-01-01: 15_388 + amount: + 2025-01-01: 605 + +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + threshold_period: year + period: week + label: Pennsylvania UC weekly benefit rate table + reference: + - title: Pennsylvania Unemployment Compensation Law § 404(e)(1) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=136 + - title: 54 Pa.B. 8560, Doc. No. 24-1863 (December 28, 2024) — 2025 Table Specified by Law + href: https://www.pacodeandbulletin.gov/Display/pabull?file=/secure/pabulletin/data/vol54/54-52/1863.html + - title: 34 Pa. Code Ch. 65 App. A — Table Specified for the Determination of Rate and Amount of Benefits + href: https://www.pacodeandbulletin.gov/Display/pacode?file=/secure/pacode/data/034/chapter65/chap65toc.html&d= + - title: Pennsylvania UC Claimant Handbook (UCP-1) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/ucp-forms/ucp-1.pdf diff --git a/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/wages_outside_high_quarter_fraction.yaml b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/wages_outside_high_quarter_fraction.yaml new file mode 100644 index 00000000000..e86eb3d6ac0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/pa/dli/unemployment_compensation/wages_outside_high_quarter_fraction.yaml @@ -0,0 +1,12 @@ +description: Pennsylvania sets this share of total base-year wages that must be paid outside the highest quarter under the Unemployment Compensation program. + +values: + 2025-01-01: 0.37 + +metadata: + unit: /1 + period: year + label: Pennsylvania UC wages outside high quarter fraction + reference: + - title: Pennsylvania Unemployment Compensation Law § 401(a)(2) + href: https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=119 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 02ac9d29b6d..d4c6c82eebe 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1045,6 +1045,17 @@ programs: variable: tx_fpp_benefit parameter_prefix: gov.states.tx.fpp + - id: pa_uc + name: Pennsylvania Unemployment Compensation + full_name: Pennsylvania Unemployment Compensation + category: Benefits + agency: PA Department of Labor & Industry + status: complete + coverage: PA + variable: pa_uc + parameter_prefix: gov.states.pa.dli.unemployment_compensation + verified_years: "2025" + - id: tx_dart_benefit name: Texas DART full_name: Texas Dallas Area Rapid Transit Benefit diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/edge_cases.yaml new file mode 100644 index 00000000000..21fba13c573 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/edge_cases.yaml @@ -0,0 +1,594 @@ +# Edge case tests for Pennsylvania Unemployment Compensation (PA UC). +# Covers boundary conditions the per-variable tests may not exercise: +# - Rate-table bracket edges ($1,712/$1,713, $1,737/$1,738). +# - 37% wages-outside test at exactly the threshold. +# - Part C qualifying-wages test at exactly the threshold. +# - Credit-weeks boundary at 26 and above (duration cap). +# - Dependent-allowance age and composition edges. +# - Partial benefit credit (PBC) boundaries (WBR $68 -> $21; WBR $73 -> $22). +# - Weekly payable boundaries (gross = 0, gross = WBR + PBC, gross > WBR + PBC, +# negative earnings). +# - Main pa_uc variable edges (weeks_unemployed = 0, > max_weeks; ineligible; +# non-PA residency). +# Policy reference: 43 P.S. §§ 751-914; 54 Pa.B. 1863 (2025 Table Specified by Law). + +# --------------------------------------------------------------------------- +# Rate-table boundary (REQ-006) +# PolicyEngine single_amount brackets use inclusive thresholds (value >= threshold +# gets that bracket's amount). So HQ of $1,712 is still in the $68 bracket; +# $1,713 enters the next bracket ($69). +# --------------------------------------------------------------------------- + +- name: Case 1, HQ $1,712 last dollar of first bracket yields WBR $68. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_712 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $1,688 <= $1,712 < $1,713 -> still in the $68 bracket. + pa_uc_weekly_benefit_rate: 68 + +- name: Case 2, HQ $1,713 first dollar of second bracket yields WBR $69. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_713 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $1,713 is the threshold for the second bracket -> WBR $69. + pa_uc_weekly_benefit_rate: 69 + +- name: Case 3, HQ $1,737 last dollar of second bracket yields WBR $69. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_737 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $1,713 <= $1,737 < $1,738 -> still in the $69 bracket. + pa_uc_weekly_benefit_rate: 69 + +- name: Case 4, HQ $1,738 first dollar of third bracket yields WBR $70. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_738 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $1,738 is the threshold for the third bracket -> WBR $70. + pa_uc_weekly_benefit_rate: 70 + +# --------------------------------------------------------------------------- +# 37% wages-outside-high-quarter test at exact threshold (REQ-002) +# Outside = base - HQ. Requirement: outside >= 0.37 * base, i.e. +# HQ <= 0.63 * base. Pick base = 10_000 -> threshold HQ = 6_300. +# --------------------------------------------------------------------------- + +- name: Case 5, wages-outside exactly at 37% threshold passes REQ-002. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_base_year_wages: 10_000 + pa_uc_highest_quarter_wages: 6_300 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Outside = $10,000 - $6,300 = $3,700 == 0.37 * $10,000 -> passes (>=). + pa_uc_meets_wages_outside_high_quarter_test: true + +- name: Case 6, wages-outside one dollar below 37% threshold fails REQ-002. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_base_year_wages: 10_000 + pa_uc_highest_quarter_wages: 6_301 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Outside = $10,000 - $6,301 = $3,699 < 0.37 * $10,000 = $3,700 -> fails. + pa_uc_meets_wages_outside_high_quarter_test: false + +# --------------------------------------------------------------------------- +# Part C qualifying-wages test at exact threshold (REQ-004) +# Rate table: HQ $1,688 -> Part C = $2,718. +# --------------------------------------------------------------------------- + +- name: Case 7, base-year wages exactly at Part C threshold passes REQ-004. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_688 + pa_uc_base_year_wages: 2_718 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Part C for HQ $1,688 = $2,718; $2,718 >= $2,718 -> passes. + pa_uc_meets_qualifying_wages_test: true + +- name: Case 8, base-year wages one dollar below Part C fails REQ-004. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_688 + pa_uc_base_year_wages: 2_717 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $2,717 < $2,718 -> fails. + pa_uc_meets_qualifying_wages_test: false + +# --------------------------------------------------------------------------- +# Credit-weeks duration cap (REQ-010) +# Maximum weeks of benefits is min(credit_weeks, 26). Confirm that 27 credit +# weeks still caps at 26 (existing tests cover 40 and 52; 27 is the nearest +# boundary above the cap). +# --------------------------------------------------------------------------- + +- name: Case 9, 27 credit weeks caps maximum_weeks at 26. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_credit_weeks: 27 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # min(27, 26) = 26. + pa_uc_maximum_weeks: 26 + +# --------------------------------------------------------------------------- +# Dependent-allowance age and composition edges (REQ-007) +# Child under 18 is a dependent; child aged exactly 18 is NOT a dependent. +# --------------------------------------------------------------------------- + +- name: Case 10, single claimant with child aged exactly 18 gets $0 allowance. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 30_000 + is_tax_unit_dependent: false + person2: + age: 18 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: PA + output: + people: + person1: + # Age 18 is NOT under 18 -> not a dependent child -> allowance $0. + pa_uc_dependent_allowance: 0 + +- name: Case 11, single claimant with child aged 17 gets $5 first-child-no-spouse. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 30_000 + is_tax_unit_dependent: false + person2: + age: 17 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: PA + output: + people: + person1: + # Age 17 < 18 -> dependent child; no spouse -> first slot $5. + pa_uc_dependent_allowance: 5 + +# --------------------------------------------------------------------------- +# Partial benefit credit boundaries (REQ-008) +# PBC = ceil(max(0.30 * WBR, $6)). +# WBR $68 -> max($20.40, $6) = $20.40 -> ceil $21 (non-integer rounding up). +# WBR $73 -> max($21.90, $6) = $21.90 -> ceil $22 (intermediate non-integer). +# --------------------------------------------------------------------------- + +- name: Case 12, WBR $68 minimum - PBC is 30% of WBR rounded up to $21. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_688 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR $68 -> 30% = $20.40; max($20.40, $6) = $20.40; ceil -> $21. + pa_uc_weekly_benefit_rate: 68 + pa_uc_partial_benefit_credit: 21 + +- name: Case 13, WBR $73 intermediate - PBC is ceil of $21.90 = $22. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_813 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR $73 -> 30% = $21.90; max($21.90, $6) = $21.90; ceil -> $22. + pa_uc_weekly_benefit_rate: 73 + pa_uc_partial_benefit_credit: 22 + +# --------------------------------------------------------------------------- +# Weekly payable boundaries (REQ-009) +# Formula: max(0, WBR - max(earnings - PBC, 0)) + dep_allowance_if_unemployed +# where dep_allowance_if_unemployed is 0 when earnings >= WBR + PBC per § 4(u) +# (claimant is not "unemployed" that week and receives no benefits). +# Test at gross = WBR + PBC exactly, gross > WBR + PBC, and negative gross. +# All cases below use HQ $7,625 -> WBR $300; PBC = ceil(0.30 * $300) = $90. +# --------------------------------------------------------------------------- + +- name: Case 14, gross earnings exactly WBR + PBC = $390 - not unemployed, $0 paid. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + pa_uc_gross_weekly_earnings: 390 + employment_income: 20_280 + is_tax_unit_dependent: false + person2: + age: 33 + employment_income: 0 + is_tax_unit_dependent: false + person3: + age: 10 + is_tax_unit_dependent: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: PA + output: + people: + person1: + # earnings_reduction = max($390 - $90, 0) = $300. + # payable_wbr = max($300 - $300, 0) = $0. + # earnings ($390) >= WBR + PBC ($390) -> § 4(u): not "unemployed", + # no dependent allowance paid. payable = $0. + pa_uc_weekly_benefit_rate: 300 + pa_uc_partial_benefit_credit: 90 + pa_uc_dependent_allowance: 8 + pa_uc_weekly_payable: 0 + +- name: Case 15, gross earnings above WBR + PBC - not unemployed, $0 paid. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + pa_uc_gross_weekly_earnings: 500 + employment_income: 26_000 + is_tax_unit_dependent: false + person2: + age: 33 + employment_income: 0 + is_tax_unit_dependent: false + person3: + age: 10 + is_tax_unit_dependent: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: PA + output: + people: + person1: + # earnings_reduction = max($500 - $90, 0) = $410. + # payable_wbr = max($300 - $410, 0) = $0. + # earnings ($500) >= WBR + PBC ($390) -> § 4(u): not "unemployed", + # no dependent allowance paid. payable = $0. + pa_uc_weekly_benefit_rate: 300 + pa_uc_partial_benefit_credit: 90 + pa_uc_dependent_allowance: 8 + pa_uc_weekly_payable: 0 + +- name: Case 16, negative gross earnings treated as fully unemployed. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + pa_uc_gross_weekly_earnings: -100 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # earnings_reduction = max(-$100 - $90, 0) = $0 (floor at 0). + # base_benefit = max($300 - $0, 0) = $300. + # total = $300 + $0 = $300; cap = $300 -> $300. + # Confirms the formula is safe against negative earnings inputs. + pa_uc_weekly_benefit_rate: 300 + pa_uc_weekly_payable: 300 + +# --------------------------------------------------------------------------- +# Main variable pa_uc edges (REQ-012) +# weeks_unemployed = 0 -> annual benefit $0. +# Full-week claims beyond max_weeks still cap at the MBA. Partial-benefit +# claims can continue beyond max_weeks until the MBA is exhausted, while +# dependent allowances remain limited to weeks of entitlement. +# Ineligible -> $0. Non-PA residents -> $0 via defined_for filter (this extends +# integration Case 7 with a different non-PA state: NY). +# --------------------------------------------------------------------------- + +- name: Case 17, eligible claimant with weeks_unemployed = 0 receives $0. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 0 + pa_uc_gross_weekly_earnings: 0 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Monetarily eligible but unemployed 0 weeks -> $393 * 0 = $0. + pa_uc_monetarily_eligible: true + pa_uc_weekly_payable: 393 + pa_uc: 0 + +- name: Case 18, fully unemployed 30 weeks still caps at the maximum benefit amount. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 30 + pa_uc_gross_weekly_earnings: 0 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # MBA = $393 * 26 = $10,218, so additional weeks do not increase benefits. + pa_uc_maximum_weeks: 26 + pa_uc_maximum_benefit_amount: 10_218 + pa_uc_weekly_payable: 393 + pa_uc: 10_218 + +- name: Case 19, claimant failing all four tests receives $0 pa_uc. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_000 + pa_uc_base_year_wages: 1_500 + pa_uc_credit_weeks: 5 + weeks_unemployed: 20 + pa_uc_gross_weekly_earnings: 0 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # HQ $1,000 < $1,688 -> fails REQ-001. + # Credit weeks 5 < 18 -> fails REQ-003. + # Not monetarily eligible -> defined_for filters pa_uc to $0. + pa_uc_monetarily_eligible: false + pa_uc: 0 + +- name: Case 20, non-PA resident (NY) with eligible wages receives $0. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: NY + output: + people: + person1: + # Household is outside PA -> defined_for (StateCode.PA) filters pa_uc. + pa_uc: 0 + +- name: Case 21, partial-benefit claims can extend beyond 26 weeks until MBA is exhausted. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + weeks_unemployed: 30 + pa_uc_gross_weekly_earnings: 100 + employment_income: 5_200 + is_tax_unit_dependent: false + person2: + age: 33 + employment_income: 0 + is_tax_unit_dependent: false + person3: + age: 10 + is_tax_unit_dependent: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: PA + output: + people: + person1: + # WBR = $300, PBC = $90, weekly base payable = $290. + # MBA = $300 * 26 = $7,800, so base benefits can continue beyond + # 26 weeks until that balance is exhausted. + # Dependent allowance remains limited to 26 payable weeks: + # $7,800 + ($8 * 26) = $8,008 total. + pa_uc_weekly_benefit_rate: 300 + pa_uc_partial_benefit_credit: 90 + pa_uc_dependent_allowance: 8 + pa_uc_weekly_payable: 298 + pa_uc_maximum_benefit_amount: 7_800 + pa_uc: 8_008 diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/integration.yaml new file mode 100644 index 00000000000..bf6f9384e27 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/integration.yaml @@ -0,0 +1,265 @@ +# Integration tests for Pennsylvania Unemployment Compensation. +# End-to-end scenarios checking pa_uc together with intermediate variables. +# Rate table values sourced from 54 Pa.B. 1863 (2025 Table Specified by Law). + +- name: Case 1, single adult fully unemployed, mid-income earner. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # REQ-001: HQ $10,000 >= $1,688 -> pass. + pa_uc_meets_high_quarter_test: true + # REQ-002: Outside = $18,000 >= 0.37 * $28,000 = $10,360 -> pass. + pa_uc_meets_wages_outside_high_quarter_test: true + # REQ-003: 26 >= 18 credit weeks -> pass. + pa_uc_meets_credit_weeks_test: true + # REQ-004: Part C for $10,000 HQ = $15,893; $28,000 >= $15,893 -> pass. + pa_uc_meets_qualifying_wages_test: true + # Monetarily eligible (all four tests pass). + pa_uc_monetarily_eligible: true + # WBR from bracket $9,988-$10,012 -> $393. + pa_uc_weekly_benefit_rate: 393 + # No spouse, no children -> $0 dependent allowance. + pa_uc_dependent_allowance: 0 + # Maximum weeks = min(26, 26) = 26. + pa_uc_maximum_weeks: 26 + # Weekly payable = $393 + $0 = $393 (fully unemployed). + pa_uc_weekly_payable: 393 + # Annual PA UC = $393 * 26 weeks = $10,218. + pa_uc: 10_218 + +- name: Case 2, married claimant with two dependent children, fully unemployed. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 38 + pa_uc_highest_quarter_wages: 8_000 + pa_uc_base_year_wages: 24_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + employment_income: 0 + is_tax_unit_dependent: false + person2: + age: 36 + employment_income: 0 + is_tax_unit_dependent: false + person3: + age: 10 + is_tax_unit_dependent: true + person4: + age: 7 + is_tax_unit_dependent: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: PA + output: + people: + person1: + # REQ-001: HQ $8,000 >= $1,688 -> pass. + pa_uc_meets_high_quarter_test: true + # REQ-002: Outside = $16,000 >= 0.37 * $24,000 = $8,880 -> pass. + pa_uc_meets_wages_outside_high_quarter_test: true + # REQ-003: 26 >= 18 credit weeks -> pass. + pa_uc_meets_credit_weeks_test: true + # REQ-004: Part C for $8,000 HQ = $12,718; $24,000 >= $12,718 -> pass. + pa_uc_meets_qualifying_wages_test: true + pa_uc_monetarily_eligible: true + # WBR from bracket $7,988-$8,012 -> $315. + pa_uc_weekly_benefit_rate: 315 + # Spouse $5 + second dependent $3 = $8 (cap). + pa_uc_dependent_allowance: 8 + pa_uc_maximum_weeks: 26 + # Weekly payable = $315 + $8 = $323. + pa_uc_weekly_payable: 323 + # Annual PA UC = $323 * 26 = $8,398. + pa_uc: 8_398 + +- name: Case 3, partial employment (claimant works less than full-time). + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 32 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 100 + employment_income: 5_200 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Monetarily eligible. + pa_uc_monetarily_eligible: true + # WBR from bracket $7,613-$7,637 -> $300. + pa_uc_weekly_benefit_rate: 300 + # PBC = ceil(max(30% * $300, $6)) = ceil(max($90, $6)) = $90. + pa_uc_partial_benefit_credit: 90 + # Weekly payable = max(0, $300 + $90 - $100) = $290 (below $300 cap). + pa_uc_weekly_payable: 290 + # Annual PA UC = $290 * 26 = $7,540. + pa_uc: 7_540 + +- name: Case 4, ineligible - high-quarter wages below $1,688 minimum. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + pa_uc_highest_quarter_wages: 1_500 + pa_uc_base_year_wages: 2_000 + pa_uc_credit_weeks: 10 + weeks_unemployed: 10 + pa_uc_gross_weekly_earnings: 0 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # HQ $1,500 < $1,688 -> fails REQ-001. + pa_uc_meets_high_quarter_test: false + # Credit weeks 10 < 18 -> also fails REQ-003. + pa_uc_meets_credit_weeks_test: false + pa_uc_monetarily_eligible: false + # WBR = $0 (below minimum bracket). + pa_uc_weekly_benefit_rate: 0 + # Annual PA UC = $0. + pa_uc: 0 + +- name: Case 5, ineligible - fewer than 18 credit weeks despite ample wages. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 15 + weeks_unemployed: 15 + pa_uc_gross_weekly_earnings: 0 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Wages tests pass, but 15 < 18 credit weeks -> fails REQ-003. + pa_uc_meets_high_quarter_test: true + pa_uc_meets_wages_outside_high_quarter_test: true + pa_uc_meets_credit_weeks_test: false + pa_uc_monetarily_eligible: false + # Annual PA UC = $0 despite WBR $393 being computable. + pa_uc: 0 + +- name: Case 6, high earner capped at maximum weekly benefit. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + pa_uc_highest_quarter_wages: 25_000 + pa_uc_base_year_wages: 70_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + pa_uc_monetarily_eligible: true + # WBR capped at $605 (any HQ >= $15,388). + pa_uc_weekly_benefit_rate: 605 + pa_uc_dependent_allowance: 0 + pa_uc_maximum_weeks: 26 + pa_uc_weekly_payable: 605 + # Annual PA UC = $605 * 26 = $15,730. + pa_uc: 15_730 + +- name: Case 7, non-PA resident (California) receives no PA UC benefit. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + weeks_unemployed: 26 + pa_uc_gross_weekly_earnings: 0 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: CA + output: + people: + person1: + # Household is outside PA -> defined_for filters the benefit. + pa_uc: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_dependent_allowance.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_dependent_allowance.yaml new file mode 100644 index 00000000000..1bf7c606d6d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_dependent_allowance.yaml @@ -0,0 +1,242 @@ +# Tests for Pennsylvania UC weekly dependent allowance (REQ-007). +# Schedule (§ 404(e)(3)): +# - $5 for a dependent spouse OR first dependent child if no spouse +# - plus $3 for one other dependent child +# - capped at $8 per week +# "Dependent spouse" = legally married, living with the claimant, wholly or +# chiefly supported by the claimant (proxied by spouse employment_income == 0). +# "Dependent child" = child/stepchild of the claimant, wholly or chiefly +# supported, and under 18 (or 18+ if unable to work due to infirmity). +# Reference: § 404(e)(3), 43 P.S. § 804(e)(3). + +- name: Case 1, single adult with no dependents gets $0 allowance. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # No spouse, no children -> $0. + pa_uc_dependent_allowance: 0 + +- name: Case 2, married with unemployed spouse, no children, gets $5 for spouse. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 30_000 + is_tax_unit_dependent: false + person2: + age: 33 + employment_income: 0 + is_tax_unit_dependent: false + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: PA + output: + people: + person1: + # Dependent spouse (employment_income == 0) -> $5. + pa_uc_dependent_allowance: 5 + +- name: Case 3, unmarried with one dependent child gets $5 (first-slot no-spouse). + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 30_000 + is_tax_unit_dependent: false + person2: + age: 10 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: PA + output: + people: + person1: + # No spouse, 1 dependent child < 18 -> first-child-no-spouse $5. + pa_uc_dependent_allowance: 5 + +- name: Case 4, married with unemployed spouse and one dependent child gets $8. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 30_000 + is_tax_unit_dependent: false + person2: + age: 33 + employment_income: 0 + is_tax_unit_dependent: false + person3: + age: 10 + is_tax_unit_dependent: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: PA + output: + people: + person1: + # Spouse $5 + second dependent child $3 = $8. + pa_uc_dependent_allowance: 8 + +- name: Case 5, married with unemployed spouse and two dependent children caps at $8. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 30_000 + is_tax_unit_dependent: false + person2: + age: 38 + employment_income: 0 + is_tax_unit_dependent: false + person3: + age: 12 + is_tax_unit_dependent: true + person4: + age: 8 + is_tax_unit_dependent: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: PA + output: + people: + person1: + # Spouse $5 + one additional dep $3 = $8 (max cap). + pa_uc_dependent_allowance: 8 + +- name: Case 6, unmarried with two dependent children gets $8. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 30_000 + is_tax_unit_dependent: false + person2: + age: 12 + is_tax_unit_dependent: true + person3: + age: 8 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: PA + output: + people: + person1: + # First child (no spouse) $5 + second child $3 = $8. + pa_uc_dependent_allowance: 8 + +- name: Case 7, unmarried with three dependent children caps at $8. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 30_000 + is_tax_unit_dependent: false + person2: + age: 14 + is_tax_unit_dependent: true + person3: + age: 10 + is_tax_unit_dependent: true + person4: + age: 6 + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: PA + output: + people: + person1: + # First child $5 + second child $3 = $8 (max cap; third child ignored). + pa_uc_dependent_allowance: 8 + +- name: Case 8, married with employed spouse (not a dependent) and no children gets $0. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + employment_income: 30_000 + is_tax_unit_dependent: false + person2: + age: 33 + employment_income: 40_000 + is_tax_unit_dependent: false + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: PA + output: + people: + person1: + # Spouse has employment_income > 0 -> not "wholly or chiefly supported". + # No children -> $0. + pa_uc_dependent_allowance: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_benefit_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_benefit_amount.yaml new file mode 100644 index 00000000000..0d3a7fa713e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_benefit_amount.yaml @@ -0,0 +1,169 @@ +# Tests for Pennsylvania UC Maximum Benefit Amount (MBA) (REQ-011). +# Formula: MBA = WBR x min(credit_weeks, 26). +# The dependent allowance is paid in addition to the MBA, not as part of it +# (see § 404(e)(3)). +# Ineligible claimants (< 18 credit weeks) receive $0 MBA. +# Reference: § 404(c), 43 P.S. § 804(c). + +- name: Case 1, single no-dependents at mid-income, 26 credit weeks. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR = $300, credit weeks = 26. + # MBA = $300 * 26 = $7,800. + pa_uc_weekly_benefit_rate: 300 + pa_uc_dependent_allowance: 0 + pa_uc_maximum_weeks: 26 + pa_uc_maximum_benefit_amount: 7_800 + +- name: Case 2, married with one dependent child, 26 credit weeks. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + employment_income: 0 + is_tax_unit_dependent: false + person2: + age: 33 + employment_income: 0 + is_tax_unit_dependent: false + person3: + age: 10 + is_tax_unit_dependent: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: PA + output: + people: + person1: + # WBR = $300, credit weeks = 26. + # MBA = $300 * 26 = $7,800 (dep allowance paid in addition, + # not part of MBA per § 404(e)(3)). + pa_uc_weekly_benefit_rate: 300 + pa_uc_dependent_allowance: 8 + pa_uc_maximum_weeks: 26 + pa_uc_maximum_benefit_amount: 7_800 + +- name: Case 3, maxed-out WBR with dependents, 26 credit weeks. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + pa_uc_highest_quarter_wages: 50_000 + pa_uc_base_year_wages: 150_000 + pa_uc_credit_weeks: 26 + employment_income: 0 + is_tax_unit_dependent: false + person2: + age: 42 + employment_income: 0 + is_tax_unit_dependent: false + person3: + age: 12 + is_tax_unit_dependent: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: PA + output: + people: + person1: + # WBR = $605 (cap), credit weeks = 26. + # MBA = $605 * 26 = $15,730 (dep allowance paid in addition). + pa_uc_weekly_benefit_rate: 605 + pa_uc_dependent_allowance: 8 + pa_uc_maximum_weeks: 26 + pa_uc_maximum_benefit_amount: 15_730 + +- name: Case 4, ineligible (fewer than 18 credit weeks) yields MBA $0. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 10 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # 10 < 18 credit weeks -> monetarily ineligible. + # MBA = $0. + pa_uc_monetarily_eligible: false + pa_uc_maximum_benefit_amount: 0 + +- name: Case 5, partial-year credit weeks (20) above 18 floor. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 20 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR = $300, credit weeks = 20 (below 26 cap). + # MBA = $300 * 20 = $6,000. + pa_uc_weekly_benefit_rate: 300 + pa_uc_maximum_weeks: 20 + pa_uc_maximum_benefit_amount: 6_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_weeks.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_weeks.yaml new file mode 100644 index 00000000000..1854b2fcc44 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_weeks.yaml @@ -0,0 +1,88 @@ +# Tests for Pennsylvania UC maximum benefit weeks (REQ-010). +# Formula: min(credit_weeks, 26). +# Reference: § 404(c), 43 P.S. § 804(c). + +- name: Case 1, exactly 18 credit weeks - minimum eligible duration. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_credit_weeks: 18 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # min(18, 26) = 18. + pa_uc_maximum_weeks: 18 + +- name: Case 2, 25 credit weeks - below cap. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_credit_weeks: 25 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # min(25, 26) = 25. + pa_uc_maximum_weeks: 25 + +- name: Case 3, 26 credit weeks - at the cap. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_credit_weeks: 26 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # min(26, 26) = 26. + pa_uc_maximum_weeks: 26 + +- name: Case 4, 40 credit weeks (full year) - capped at 26. + period: 2025 + input: + people: + person1: + age: 35 + pa_uc_credit_weeks: 40 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # min(40, 26) = 26 (cap). + pa_uc_maximum_weeks: 26 + +- name: Case 5, 52 credit weeks (full year worked) - capped at 26. + period: 2025 + input: + people: + person1: + age: 45 + pa_uc_credit_weeks: 52 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # min(52, 26) = 26 (cap). + pa_uc_maximum_weeks: 26 diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_credit_weeks_test.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_credit_weeks_test.yaml new file mode 100644 index 00000000000..a381f7df98b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_credit_weeks_test.yaml @@ -0,0 +1,89 @@ +# Tests for Pennsylvania UC credit-weeks minimum test (REQ-003). +# Claimant must have at least 18 credit weeks in the base year. +# A "credit week" is a calendar week with >= $116 earnings (2025 = 16 x $7.25 PA minimum wage). +# Reference: § 404(c), 43 P.S. § 804(c); § 4(g.1) for credit week definition. + +- name: Case 1, 17 credit weeks (one below threshold) fail the test. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_credit_weeks: 17 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # 17 < 18 minimum -> fails. + pa_uc_meets_credit_weeks_test: false + +- name: Case 2, exactly 18 credit weeks pass the test. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_credit_weeks: 18 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # 18 >= 18 minimum -> passes. + pa_uc_meets_credit_weeks_test: true + +- name: Case 3, 40 credit weeks (full year) pass the test. + period: 2025 + input: + people: + person1: + age: 35 + pa_uc_credit_weeks: 40 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # 40 >> 18 minimum -> passes. + pa_uc_meets_credit_weeks_test: true + +- name: Case 4, zero credit weeks fail the test. + period: 2025 + input: + people: + person1: + age: 25 + pa_uc_credit_weeks: 0 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # 0 < 18 minimum -> fails. + pa_uc_meets_credit_weeks_test: false + +- name: Case 5, 26 credit weeks (half-year) pass the test. + period: 2025 + input: + people: + person1: + age: 32 + pa_uc_credit_weeks: 26 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # 26 >= 18 minimum -> passes. + pa_uc_meets_credit_weeks_test: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_high_quarter_test.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_high_quarter_test.yaml new file mode 100644 index 00000000000..f04d9791a25 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_high_quarter_test.yaml @@ -0,0 +1,88 @@ +# Tests for Pennsylvania UC high-quarter minimum test (REQ-001). +# Claimant's highest-quarterly base-year wages must be at least $1,688 (2025). +# Reference: § 404(e)(1) Table Specified by Law; 54 Pa.B. 1863. + +- name: Case 1, high-quarter wages $1,687 (one dollar below threshold) fail the test. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_687 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $1,687 < $1,688 minimum -> test fails. + pa_uc_meets_high_quarter_test: false + +- name: Case 2, high-quarter wages exactly at threshold $1,688 pass the test. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_688 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $1,688 >= $1,688 minimum -> test passes. + pa_uc_meets_high_quarter_test: true + +- name: Case 3, high-quarter wages $1,700 clear the threshold. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_700 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $1,700 > $1,688 minimum -> test passes. + pa_uc_meets_high_quarter_test: true + +- name: Case 4, zero high-quarter wages fail the test. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 0 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $0 < $1,688 minimum -> test fails. + pa_uc_meets_high_quarter_test: false + +- name: Case 5, high earner clears the threshold easily. + period: 2025 + input: + people: + person1: + age: 45 + pa_uc_highest_quarter_wages: 25_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $25,000 >> $1,688 minimum -> test passes. + pa_uc_meets_high_quarter_test: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_qualifying_wages_test.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_qualifying_wages_test.yaml new file mode 100644 index 00000000000..51ee66dbef7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_qualifying_wages_test.yaml @@ -0,0 +1,98 @@ +# Tests for Pennsylvania UC total base-year qualifying-wages test (REQ-004). +# Total base-year wages must be at least the Part C qualifying amount from the +# Table Specified by Law, indexed by high-quarter wages. +# Reference: § 401(a)(2) / § 404(e)(1) Part C; 54 Pa.B. 1863. + +- name: Case 1, $5,000 high-quarter with $7,000 base-year wages fail Part C. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 5_000 + pa_uc_base_year_wages: 7_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $5,000 in bracket $4,988-$5,012 -> Part C qualifying = $7,956. + # $7,000 < $7,956 -> fails. + pa_uc_meets_qualifying_wages_test: false + +- name: Case 2, $5,000 high-quarter with $8,000 base-year wages pass Part C. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 5_000 + pa_uc_base_year_wages: 8_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $5,000 in bracket $4,988-$5,012 -> Part C qualifying = $7,956. + # $8,000 >= $7,956 -> passes. + pa_uc_meets_qualifying_wages_test: true + +- name: Case 3, $2,000 high-quarter with $3,500 base-year wages pass Part C. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 2_000 + pa_uc_base_year_wages: 3_500 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $2,000 in bracket $1,988-$2,012 -> Part C qualifying = $3,194. + # $3,500 >= $3,194 -> passes. + pa_uc_meets_qualifying_wages_test: true + +- name: Case 4, $12,000 high-quarter with $19,067 base-year wages pass Part C exactly. + period: 2025 + input: + people: + person1: + age: 40 + pa_uc_highest_quarter_wages: 12_000 + pa_uc_base_year_wages: 19_067 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $12,000 in bracket $11,988-$12,012 -> Part C qualifying = $19,067. + # $19,067 >= $19,067 -> passes at exact threshold. + pa_uc_meets_qualifying_wages_test: true + +- name: Case 5, high earner with ample total base-year wages passes Part C. + period: 2025 + input: + people: + person1: + age: 45 + pa_uc_highest_quarter_wages: 15_388 + pa_uc_base_year_wages: 70_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Max high quarter; $70,000 far exceeds any Part C requirement. + pa_uc_meets_qualifying_wages_test: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_wages_outside_high_quarter_test.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_wages_outside_high_quarter_test.yaml new file mode 100644 index 00000000000..e6e0c7f81ad --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_wages_outside_high_quarter_test.yaml @@ -0,0 +1,104 @@ +# Tests for Pennsylvania UC 37% wages-outside-high-quarter test (REQ-002). +# At least 37% of total base-year wages must have been paid outside the highest quarter. +# Equivalently: (base_year_wages - high_quarter_wages) >= 0.37 * base_year_wages. +# Reference: § 401(a)(2), 43 P.S. § 801(a)(2). + +- name: Case 1, $10,000 base with $7,000 high-quarter fails the 37% test. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_base_year_wages: 10_000 + pa_uc_highest_quarter_wages: 7_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Wages outside high quarter = $10,000 - $7,000 = $3,000. + # Threshold = 0.37 * $10,000 = $3,700. + # $3,000 < $3,700 -> fails. + pa_uc_meets_wages_outside_high_quarter_test: false + +- name: Case 2, $10,000 base with $5,000 high-quarter passes the 37% test. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_base_year_wages: 10_000 + pa_uc_highest_quarter_wages: 5_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Wages outside high quarter = $10,000 - $5,000 = $5,000. + # Threshold = 0.37 * $10,000 = $3,700. + # $5,000 >= $3,700 -> passes. + pa_uc_meets_wages_outside_high_quarter_test: true + +- name: Case 3, $4,000 base with $3,500 high-quarter fails the 37% test. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_base_year_wages: 4_000 + pa_uc_highest_quarter_wages: 3_500 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Wages outside high quarter = $4,000 - $3,500 = $500. + # Threshold = 0.37 * $4,000 = $1,480. + # $500 < $1,480 -> fails. + pa_uc_meets_wages_outside_high_quarter_test: false + +- name: Case 4, uniform quarterly distribution passes the 37% test. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_base_year_wages: 20_000 + pa_uc_highest_quarter_wages: 5_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Wages outside high quarter = $20,000 - $5,000 = $15,000. + # Threshold = 0.37 * $20,000 = $7,400. + # $15,000 >= $7,400 -> passes. + pa_uc_meets_wages_outside_high_quarter_test: true + +- name: Case 5, all wages in one quarter fail the 37% test. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_base_year_wages: 8_000 + pa_uc_highest_quarter_wages: 8_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Wages outside high quarter = $8,000 - $8,000 = $0. + # Threshold = 0.37 * $8,000 = $2,960. + # $0 < $2,960 -> fails. + pa_uc_meets_wages_outside_high_quarter_test: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_monetarily_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_monetarily_eligible.yaml new file mode 100644 index 00000000000..6f36af409d3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_monetarily_eligible.yaml @@ -0,0 +1,129 @@ +# Tests for Pennsylvania UC monetary eligibility. +# A claimant is monetarily eligible only if ALL FOUR base-year tests pass: +# 1. High-quarter wages >= $1,688 (REQ-001). +# 2. >= 37% of base-year wages paid outside the high quarter (REQ-002). +# 3. >= 18 credit weeks in the base year (REQ-003). +# 4. Total base-year wages >= Part C qualifying wages (REQ-004). +# Reference: § 401(a)(2), § 404(c), § 404(e)(1). + +- name: Case 1, all four tests pass - fully eligible. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 26 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # High-quarter $10,000 >= $1,688. + # Outside = $18,000 >= 0.37 * $28,000 = $10,360. + # Credit weeks 26 >= 18. + # Base year $28,000 >= Part C for $10,000 high-quarter. + pa_uc_monetarily_eligible: true + +- name: Case 2, high-quarter below $1,688 fails REQ-001. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_500 + pa_uc_base_year_wages: 5_000 + pa_uc_credit_weeks: 26 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # High quarter $1,500 < $1,688 -> fails REQ-001. + pa_uc_monetarily_eligible: false + +- name: Case 3, fewer than 18 credit weeks fails REQ-003. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 10_000 + pa_uc_base_year_wages: 28_000 + pa_uc_credit_weeks: 15 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # 15 < 18 credit weeks -> fails REQ-003. + pa_uc_monetarily_eligible: false + +- name: Case 4, fails 37% test (REQ-002). + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 7_000 + pa_uc_base_year_wages: 10_000 + pa_uc_credit_weeks: 26 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Outside = $3,000 < 0.37 * $10,000 = $3,700 -> fails REQ-002. + pa_uc_monetarily_eligible: false + +- name: Case 5, fails Part C qualifying-wages test (REQ-004). + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 5_000 + pa_uc_base_year_wages: 7_500 + pa_uc_credit_weeks: 26 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Part C for $5,000 high-quarter = $7,956. + # $7,500 < $7,956 -> fails REQ-004. + # (Also passes 37% test: outside = $2,500 >= 0.37 * $7,500 = $2,775? No, 2,500 < 2,775 -> also fails REQ-002.) + pa_uc_monetarily_eligible: false + +- name: Case 6, exact boundary - just eligible. + period: 2025 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_688 + pa_uc_base_year_wages: 2_800 + pa_uc_credit_weeks: 18 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # HQ $1,688 >= $1,688 -> passes REQ-001. + # Outside = $1,112 >= 0.37 * $2,800 = $1,036 -> passes REQ-002. + # Credit weeks 18 >= 18 -> passes REQ-003. + # Part C for $1,688 HQ = $2,718; $2,800 >= $2,718 -> passes REQ-004. + pa_uc_monetarily_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_partial_benefit_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_partial_benefit_credit.yaml new file mode 100644 index 00000000000..57b9275f6bd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_partial_benefit_credit.yaml @@ -0,0 +1,123 @@ +# Tests for Pennsylvania UC Partial Benefit Credit (PBC) (REQ-008). +# PBC = max(30% * WBR, $6), rounded UP to the next higher multiple of $1. +# Reference: § 4(m.3), 43 P.S. § 753(m.3). + +- name: Case 1, WBR $68 - PBC is 30% of WBR rounded up. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_700 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR $68. + # 30% of $68 = $20.40; max($20.40, $6) = $20.40; ceil -> $21. + pa_uc_weekly_benefit_rate: 68 + pa_uc_partial_benefit_credit: 21 + +- name: Case 2, WBR $100 - PBC is exactly 30% when already an integer. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 2_520 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR = $100 (bracket $2,513-$2,537). + # 30% of $100 = $30; max($30, $6) = $30; already integer -> $30. + pa_uc_weekly_benefit_rate: 100 + pa_uc_partial_benefit_credit: 30 + +- name: Case 3, WBR $197 - PBC ceil of 30% of WBR. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 5_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR $197. + # 30% of $197 = $59.10; max($59.10, $6) = $59.10; ceil -> $60. + pa_uc_weekly_benefit_rate: 197 + pa_uc_partial_benefit_credit: 60 + +- name: Case 4, WBR $605 (cap) - PBC is $182. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + pa_uc_highest_quarter_wages: 50_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR $605 (cap). + # 30% of $605 = $181.50; max($181.50, $6) = $181.50; ceil -> $182. + pa_uc_weekly_benefit_rate: 605 + pa_uc_partial_benefit_credit: 182 + +- name: Case 5, WBR $315 - PBC ceil of 30%. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 8_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR $315. + # 30% of $315 = $94.50; max($94.50, $6) = $94.50; ceil -> $95. + pa_uc_weekly_benefit_rate: 315 + pa_uc_partial_benefit_credit: 95 + +- name: Case 6, WBR $472 - PBC ceil of 30%. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 38 + pa_uc_highest_quarter_wages: 12_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR $472. + # 30% of $472 = $141.60; max($141.60, $6) = $141.60; ceil -> $142. + pa_uc_weekly_benefit_rate: 472 + pa_uc_partial_benefit_credit: 142 diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_benefit_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_benefit_rate.yaml new file mode 100644 index 00000000000..6a14a648b24 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_benefit_rate.yaml @@ -0,0 +1,204 @@ +# Tests for Pennsylvania Unemployment Compensation Weekly Benefit Rate (WBR) +# WBR is looked up in the Table Specified by Law (54 Pa.B. 1863, 2025 table) +# based on the claimant's highest quarter wages in the base year. +# Below $1,688 high-quarter wages -> WBR $0 (REQ-001 fail). +# Minimum WBR $68, maximum WBR $605 (2025). +# Reference: § 404(e)(1); 54 Pa.B. 1863. + +- name: Case 1, high-quarter wages below minimum of $1,688 produce $0 WBR. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_500 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $1,500 is below the $1,688 minimum threshold of the Table; no WBR. + pa_uc_weekly_benefit_rate: 0 + +- name: Case 2, high-quarter wages $1,687 (one dollar below minimum) yield $0 WBR. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_687 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $1,687 < $1,688 (lowest bracket); no WBR. + pa_uc_weekly_benefit_rate: 0 + +- name: Case 3, high-quarter wages $1,700 land in the lowest bracket with WBR $68. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_700 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $1,688 <= $1,700 <= $1,712 -> WBR $68 (minimum). + pa_uc_weekly_benefit_rate: 68 + +- name: Case 4, high-quarter wages exactly at the minimum threshold $1,688 yield WBR $68. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 1_688 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # First bracket starts at $1,688 -> WBR $68. + pa_uc_weekly_benefit_rate: 68 + +- name: Case 5, high-quarter wages $5,000 yield WBR $197 (bracket $4,988 to $5,012). + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 5_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $4,988 <= $5,000 < $5,013 -> WBR $197. + pa_uc_weekly_benefit_rate: 197 + +- name: Case 6, high-quarter wages $8,000 yield WBR $315 (bracket $7,988 to $8,012). + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 8_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $7,988 <= $8,000 < $8,013 -> WBR $315. + pa_uc_weekly_benefit_rate: 315 + +- name: Case 7, high-quarter wages $10,000 yield WBR $393 (bracket $9,988 to $10,012). + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 10_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $9,988 <= $10,000 < $10,013 -> WBR $393. + pa_uc_weekly_benefit_rate: 393 + +- name: Case 8, high-quarter wages $12,000 yield WBR $472 (bracket $11,988 to $12,012). + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 12_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $11,988 <= $12,000 < $12,013 -> WBR $472. + pa_uc_weekly_benefit_rate: 472 + +- name: Case 9, high-quarter wages $15,387 yield WBR $604 (one dollar below cap). + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + pa_uc_highest_quarter_wages: 15_387 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $15,363 <= $15,387 < $15,388 -> WBR $604. + pa_uc_weekly_benefit_rate: 604 + +- name: Case 10, high-quarter wages $15,388 reach the cap of $605. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + pa_uc_highest_quarter_wages: 15_388 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # $15,388 is the last bracket (open-ended) -> WBR $605 (cap). + pa_uc_weekly_benefit_rate: 605 + +- name: Case 11, high-quarter wages $50,000 are capped at the maximum WBR of $605. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + pa_uc_highest_quarter_wages: 50_000 + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # Any value at or above $15,388 -> WBR $605 (cap). + pa_uc_weekly_benefit_rate: 605 diff --git a/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_payable.yaml b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_payable.yaml new file mode 100644 index 00000000000..b7bec94c3a3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_payable.yaml @@ -0,0 +1,207 @@ +# Tests for Pennsylvania UC weekly payable benefit (REQ-009). +# Formula: payable_wbr = max(0, WBR - max(earnings - PBC, 0)) +# payable = payable_wbr + (dependent_allowance if earnings < WBR + PBC else 0) +# Per § 4(u), a claimant is "unemployed" for a week only when earnings are +# less than WBR + PBC. When earnings reach or exceed that sum, no benefits +# (including the dependent allowance) are payable for that week. +# References: § 4(u) (43 P.S. § 753(u)), § 404(d)(1) (43 P.S. § 804(d)), +# § 404(e)(3) (43 P.S. § 804(e)(3)). +# +# UCP-1 Handbook / PA DLI example: WBR=$100, PBC=$30, weekly_gross=$31 +# -> payable = max(0, $100 + $30 - $31) = $99 (no dependent allowance). + +- name: Case 1, fully unemployed - full WBR paid (single claimant, no deps). + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + pa_uc_gross_weekly_earnings: 0 + employment_income: 0 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR = $300 (bracket $7,613-$7,637). + # dep allowance = $0 (single, no children). + # No earnings -> payable = $300 + $0 = $300. + pa_uc_weekly_benefit_rate: 300 + pa_uc_dependent_allowance: 0 + pa_uc_weekly_payable: 300 + +- name: Case 2, partial earnings $50 below PBC - payable capped at WBR. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + pa_uc_gross_weekly_earnings: 50 + employment_income: 2_600 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR = $300, PBC = $90 (30% of $300 = $90). + # earnings_reduction = max($50 - $90, 0) = $0. + # payable_wbr = max($300 - $0, 0) = $300. + # No dependents -> payable = $300. + pa_uc_weekly_benefit_rate: 300 + pa_uc_partial_benefit_credit: 90 + pa_uc_weekly_payable: 300 + +- name: Case 3, partial earnings $100 above PBC - payable reduced. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + pa_uc_gross_weekly_earnings: 100 + employment_income: 5_200 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR = $300, PBC = $90. + # earnings_reduction = max($100 - $90, 0) = $10. + # payable_wbr = max($300 - $10, 0) = $290. + # No dependents -> payable = $290. + pa_uc_weekly_benefit_rate: 300 + pa_uc_partial_benefit_credit: 90 + pa_uc_weekly_payable: 290 + +- name: Case 4, partial earnings $400 exceed WBR+PBC - payable is $0. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + pa_uc_gross_weekly_earnings: 400 + employment_income: 20_800 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR = $300, PBC = $90. + # Computed = max(0, $300 + $90 - $400) = max(0, -$10) = $0. + pa_uc_weekly_benefit_rate: 300 + pa_uc_partial_benefit_credit: 90 + pa_uc_weekly_payable: 0 + +- name: Case 5, partial earnings $50 with dependents - capped at WBR + dep. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + pa_uc_highest_quarter_wages: 7_625 + pa_uc_base_year_wages: 30_500 + pa_uc_credit_weeks: 26 + pa_uc_gross_weekly_earnings: 50 + employment_income: 2_600 + is_tax_unit_dependent: false + person2: + age: 33 + employment_income: 0 + is_tax_unit_dependent: false + person3: + age: 10 + is_tax_unit_dependent: true + marital_units: + marital_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: PA + output: + people: + person1: + # WBR = $300, PBC = $90, dep = $8 (spouse + 1 child). + # earnings_reduction = max($50 - $90, 0) = $0. + # payable_wbr = max($300 - $0, 0) = $300. + # earnings ($50) < WBR + PBC ($390) -> unemployed -> dep paid. + # payable = $300 + $8 = $308. + pa_uc_weekly_benefit_rate: 300 + pa_uc_partial_benefit_credit: 90 + pa_uc_dependent_allowance: 8 + pa_uc_weekly_payable: 308 + +- name: Case 6, UCP-1 handbook example (WBR $100, PBC $30, earnings $31 -> $99). + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pa_uc_highest_quarter_wages: 2_520 + pa_uc_base_year_wages: 10_100 + pa_uc_credit_weeks: 26 + pa_uc_gross_weekly_earnings: 31 + employment_income: 1_612 + is_tax_unit_dependent: false + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: PA + output: + people: + person1: + # WBR = $100 (bracket $2,513-$2,537); PBC = $30; dep = $0. + # earnings_reduction = max($31 - $30, 0) = $1. + # payable_wbr = max($100 - $1, 0) = $99. + # No dependents -> payable = $99. + # Matches PA DLI worked example: "$130 - $31 = $99". + pa_uc_weekly_benefit_rate: 100 + pa_uc_partial_benefit_credit: 30 + pa_uc_weekly_payable: 99 diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc.py new file mode 100644 index 00000000000..1f594cbea98 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc.py @@ -0,0 +1,57 @@ +from policyengine_us.model_api import * + + +class pa_uc(Variable): + """Annual Pennsylvania Unemployment Compensation benefit. Implements the + monetary eligibility tests, weekly benefit rate, dependent allowance, + partial-benefit calculation, and benefit duration from the PA UC Law + (43 P.S. §§ 751-919) and the 2025 rate table (54 Pa.B. 8560). + + Not modeled: § 401(b) work-search history; § 401(e) one-week waiting + period; § 401(f) purge / requalification; § 402 disqualifications + (voluntary quit, misconduct, refusal of suitable work); § 404(a)(1)(ii) + alternate 50%-of-HQW formula; § 404(a)(3) qualifying-wage redetermination + at the next-lower rate; § 404(d)(1)(ii)-(iii) vacation / severance pay + offsets; § 404(d)(2) pension offset; § 404(e)(2)(v) 2026+ HQW averaging; + § 404(e)(4) Act 144 5% reduction (already baked into the 2025 table). + """ + + value_type = float + entity = Person + label = "Pennsylvania unemployment compensation" + unit = USD + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=133", + ) + defined_for = "pa_uc_monetarily_eligible" + + def formula(person, period, parameters): + # § 404(c) caps only the base compensation balance (MBA = WBR * + # credit weeks up to 26), so partial-benefit claims can last beyond + # 26 weeks until that balance is exhausted. Dependent allowances are + # payable on valid claim weeks, including partial weeks, but only for + # the claimant's weeks of entitlement. + weekly_benefit_rate = person("pa_uc_weekly_benefit_rate", period) + partial_benefit_credit = person("pa_uc_partial_benefit_credit", period) + gross_weekly_earnings = person("pa_uc_gross_weekly_earnings", period) + dependent_allowance = person("pa_uc_dependent_allowance", period) + maximum_benefit_amount = person("pa_uc_maximum_benefit_amount", period) + maximum_weeks = person("pa_uc_maximum_weeks", period) + weeks_unemployed = person("weeks_unemployed", period) + + earnings_reduction = max_(gross_weekly_earnings - partial_benefit_credit, 0) + weekly_base_payable = max_(weekly_benefit_rate - earnings_reduction, 0) + base_benefits_paid = min_( + weekly_base_payable * weeks_unemployed, maximum_benefit_amount + ) + + payable_week = gross_weekly_earnings < ( + weekly_benefit_rate + partial_benefit_credit + ) + dependent_weeks = where( + payable_week, + min_(weeks_unemployed, maximum_weeks), + 0, + ) + return base_benefits_paid + dependent_allowance * dependent_weeks diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_base_year_wages.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_base_year_wages.py new file mode 100644 index 00000000000..b8b4bca28ed --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_base_year_wages.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class pa_uc_base_year_wages(Variable): + """Total wages paid to the claimant in the four-quarter "base year" used + for monetary determination per § 401(a)(2). PolicyEngine cannot derive + this from annual data without strong assumptions, so this is a direct + input rather than a computed value; populate via test fixtures or reform. + """ + + value_type = float + entity = Person + label = "Pennsylvania unemployment compensation base year wages" + unit = USD + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=119", + ) + defined_for = StateCode.PA diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_credit_weeks.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_credit_weeks.py new file mode 100644 index 00000000000..a737a04a194 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_credit_weeks.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class pa_uc_credit_weeks(Variable): + """A credit week per § 4(g.1) is a calendar week in which earnings meet + or exceed credit_week_minimum_earnings ($116 in 2025, equal to 16 times + the state minimum wage). PolicyEngine cannot simulate per-week earnings + from annual data, so this is a direct input rather than a derived value; + the credit_week_minimum_earnings parameter is documentary. + """ + + value_type = int + entity = Person + label = "Pennsylvania unemployment compensation credit weeks" + unit = "week" + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=16", + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=17", + ) + defined_for = StateCode.PA diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_dependent_allowance.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_dependent_allowance.py new file mode 100644 index 00000000000..b91c8dfd8f9 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_dependent_allowance.py @@ -0,0 +1,40 @@ +from policyengine_us.model_api import * + + +class pa_uc_dependent_allowance(Variable): + value_type = float + entity = Person + label = "Pennsylvania unemployment compensation weekly dependent allowance" + unit = USD + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=159", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + # § 404(e)(3): $5 for a dependent spouse OR a first dependent child + # when there is no dependent spouse; plus $3 for one other dependent + # child; capped at $8 total per week. + has_spouse = person("pa_uc_has_dependent_spouse", period) + num_children = person("pa_uc_dependent_children_count", period) + p = parameters( + period + ).gov.states.pa.dli.unemployment_compensation.dependent_allowance + + # First slot ($5): filled by spouse, or by first child if no spouse. + first_slot_filled = has_spouse | (num_children >= 1) + first_amount = where(first_slot_filled, p.spouse_or_first_child, 0) + + # Second slot ($3): filled by one other dependent child. + # If spouse present: requires at least one child. + # If no spouse: requires at least two children. + second_slot_filled = where( + has_spouse, + num_children >= 1, + num_children >= 2, + ) + second_amount = where(second_slot_filled, p.second_child, 0) + + total = first_amount + second_amount + return min_(total, p.maximum) diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_dependent_children_count.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_dependent_children_count.py new file mode 100644 index 00000000000..e6ba5a74c23 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_dependent_children_count.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class pa_uc_dependent_children_count(Variable): + value_type = int + entity = Person + label = "Pennsylvania unemployment compensation dependent children count" + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=159", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + # § 404(e)(3): a dependent child is any child or stepchild of the + # claimant "wholly or chiefly supported" by the claimant and under + # eighteen years of age (older if unable to work due to infirmity, + # which is not modeled here). Attribute the tax-unit count of + # qualifying children only to the claimant (head of the tax unit) + # to avoid double-counting if multiple adults file UC claims. + tax_unit = person.tax_unit + dep_age = tax_unit.members("age", period.this_year) + is_dep = tax_unit.members("is_tax_unit_dependent", period) + p = parameters(period).gov.states.pa.dli.unemployment_compensation + qualifies = is_dep & (dep_age < p.dependent_allowance.child_age_limit) + count_in_tax_unit = tax_unit.sum(qualifies) + is_head = person("is_tax_unit_head", period) + return where(is_head, count_in_tax_unit, 0) diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_gross_weekly_earnings.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_gross_weekly_earnings.py new file mode 100644 index 00000000000..841f9491a59 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_gross_weekly_earnings.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class pa_uc_gross_weekly_earnings(Variable): + """Gross earnings (cash + the cash value of in-kind compensation) for + services performed in a week, used in § 4(u) and § 404(d)(1) to determine + whether a claimant is "unemployed" for that week and to compute the + partial-week payable. PolicyEngine has no per-week earnings concept, so + this is a direct input; populate via test fixtures or reform. + """ + + value_type = float + entity = Person + label = "Pennsylvania unemployment compensation gross weekly earnings" + unit = USD + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=133", + ) + defined_for = StateCode.PA diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_has_dependent_spouse.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_has_dependent_spouse.py new file mode 100644 index 00000000000..1fcf784e3c7 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_has_dependent_spouse.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + + +class pa_uc_has_dependent_spouse(Variable): + value_type = bool + entity = Person + label = "Has a dependent spouse for Pennsylvania unemployment compensation" + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=159", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + # § 404(e)(3): a dependent spouse is a legally married spouse who was + # "living with and being wholly or chiefly supported by" the claimant. + # Proxy: the claimant is married and the spouse has no employment + # income (mirrors NJ's dependency allowance logic). A person flagged + # as a tax-unit dependent cannot be the dependent spouse. + # Attributed only to the claimant (head of tax unit) to avoid + # double-counting if multiple adults file UC claims. + tax_unit = person.tax_unit + tax_unit_married = tax_unit("tax_unit_married", period) + is_spouse = tax_unit.members("is_tax_unit_spouse", period) + is_dep = tax_unit.members("is_tax_unit_dependent", period) + # Spouse has no employment income and is not also flagged as dependent. + members_employment = tax_unit.members("employment_income", period) + spouse_employment = tax_unit.sum(members_employment * is_spouse) + spouse_is_dependent = tax_unit.sum(is_spouse & is_dep) > 0 + has_dependent_spouse = ( + tax_unit_married & (spouse_employment == 0) & ~spouse_is_dependent + ) + is_head = person("is_tax_unit_head", period) + return has_dependent_spouse & is_head diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_highest_quarter_wages.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_highest_quarter_wages.py new file mode 100644 index 00000000000..6bb7f10c981 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_highest_quarter_wages.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class pa_uc_highest_quarter_wages(Variable): + """Wages paid in the claimant's highest base-year quarter, used as the + rate-table x-axis per § 404(e)(1). PolicyEngine cannot derive this from + annual data, so this is a direct input rather than a computed value; + populate via test fixtures or reform. + """ + + value_type = float + entity = Person + label = "Pennsylvania unemployment compensation highest quarter wages" + unit = USD + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=136", + ) + defined_for = StateCode.PA diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_benefit_amount.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_benefit_amount.py new file mode 100644 index 00000000000..bb5c043d90b --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_benefit_amount.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class pa_uc_maximum_benefit_amount(Variable): + value_type = float + entity = Person + label = "Pennsylvania unemployment compensation maximum benefit amount" + unit = USD + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=133", + ) + defined_for = "pa_uc_monetarily_eligible" + + def formula(person, period, parameters): + # § 404(c): maximum benefit amount equals the weekly benefit rate + # multiplied by the number of credit weeks up to twenty-six. The + # dependent allowance is paid in addition to (not as part of) the + # MBA per § 404(e)(3). + wbr = person("pa_uc_weekly_benefit_rate", period) + max_weeks = person("pa_uc_maximum_weeks", period) + return wbr * max_weeks diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_weeks.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_weeks.py new file mode 100644 index 00000000000..113e47ee2b6 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_maximum_weeks.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class pa_uc_maximum_weeks(Variable): + value_type = int + entity = Person + label = "Pennsylvania unemployment compensation maximum benefit weeks" + unit = "week" + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=133", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + # § 404(c): maximum weeks of entitlement equals the number of credit + # weeks during the base year, up to a maximum of twenty-six. + credit_weeks = person("pa_uc_credit_weeks", period) + p = parameters(period).gov.states.pa.dli.unemployment_compensation + return min_(credit_weeks, p.maximum_weeks) diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_credit_weeks_test.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_credit_weeks_test.py new file mode 100644 index 00000000000..0c44faed44a --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_credit_weeks_test.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class pa_uc_meets_credit_weeks_test(Variable): + value_type = bool + entity = Person + label = "Meets Pennsylvania unemployment compensation credit weeks test" + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=133", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + credit_weeks = person("pa_uc_credit_weeks", period) + p = parameters(period).gov.states.pa.dli.unemployment_compensation + return credit_weeks >= p.minimum_credit_weeks diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_high_quarter_test.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_high_quarter_test.py new file mode 100644 index 00000000000..1aa58f53af8 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_high_quarter_test.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class pa_uc_meets_high_quarter_test(Variable): + value_type = bool + entity = Person + label = "Meets Pennsylvania unemployment compensation high quarter wages test" + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=136", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + highest_quarter_wages = person("pa_uc_highest_quarter_wages", period) + p = parameters(period).gov.states.pa.dli.unemployment_compensation + return highest_quarter_wages >= p.minimum_high_quarter_wages diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_qualifying_wages_test.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_qualifying_wages_test.py new file mode 100644 index 00000000000..1bf5d9173d5 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_qualifying_wages_test.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class pa_uc_meets_qualifying_wages_test(Variable): + value_type = bool + entity = Person + label = "Meets Pennsylvania unemployment compensation qualifying wages test" + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=133", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + base_year_wages = person("pa_uc_base_year_wages", period) + qualifying_wages = person("pa_uc_qualifying_wages", period) + return base_year_wages >= qualifying_wages diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_wages_outside_high_quarter_test.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_wages_outside_high_quarter_test.py new file mode 100644 index 00000000000..547383e439f --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_meets_wages_outside_high_quarter_test.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class pa_uc_meets_wages_outside_high_quarter_test(Variable): + value_type = bool + entity = Person + label = "Meets Pennsylvania unemployment compensation wages outside the high quarter test" + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=119", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + base_year_wages = person("pa_uc_base_year_wages", period) + wages_outside_high_quarter = person("pa_uc_wages_outside_high_quarter", period) + p = parameters(period).gov.states.pa.dli.unemployment_compensation + required = base_year_wages * p.wages_outside_high_quarter_fraction + return wages_outside_high_quarter >= required diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_monetarily_eligible.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_monetarily_eligible.py new file mode 100644 index 00000000000..44196011b16 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_monetarily_eligible.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class pa_uc_monetarily_eligible(Variable): + value_type = bool + entity = Person + label = "Monetarily eligible for Pennsylvania unemployment compensation" + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=119", + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=133", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + high_quarter = person("pa_uc_meets_high_quarter_test", period) + outside_high_quarter = person( + "pa_uc_meets_wages_outside_high_quarter_test", period + ) + qualifying = person("pa_uc_meets_qualifying_wages_test", period) + credit_weeks = person("pa_uc_meets_credit_weeks_test", period) + return high_quarter & outside_high_quarter & qualifying & credit_weeks diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_partial_benefit_credit.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_partial_benefit_credit.py new file mode 100644 index 00000000000..c5379b7b821 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_partial_benefit_credit.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class pa_uc_partial_benefit_credit(Variable): + value_type = float + entity = Person + label = "Pennsylvania unemployment compensation partial benefit credit" + unit = USD + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=34", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + # § 4(m.3): Partial Benefit Credit = the greater of 30% of the + # weekly benefit rate or $6, rounded up to the next higher dollar. + wbr = person("pa_uc_weekly_benefit_rate", period) + p = parameters( + period + ).gov.states.pa.dli.unemployment_compensation.partial_benefit_credit + # Round before ceil to avoid float32 precision issues (e.g. 100 * 0.3 + # stored as 30.0000001 would otherwise ceil to 31). + uncapped = max_(np.round(wbr * p.rate, 4), p.minimum) + return np.ceil(uncapped) diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_qualifying_wages.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_qualifying_wages.py new file mode 100644 index 00000000000..33f4517ec85 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_qualifying_wages.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class pa_uc_qualifying_wages(Variable): + value_type = float + entity = Person + label = "Pennsylvania unemployment compensation qualifying wages" + unit = USD + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=136", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + highest_quarter_wages = person("pa_uc_highest_quarter_wages", period) + p = parameters(period).gov.states.pa.dli.unemployment_compensation + return p.qualifying_wages.calc(highest_quarter_wages) diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_wages_outside_high_quarter.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_wages_outside_high_quarter.py new file mode 100644 index 00000000000..a86353cc82a --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_wages_outside_high_quarter.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class pa_uc_wages_outside_high_quarter(Variable): + value_type = float + entity = Person + label = "Pennsylvania unemployment compensation wages outside the high quarter" + unit = USD + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=119", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + base_year_wages = person("pa_uc_base_year_wages", period) + highest_quarter_wages = person("pa_uc_highest_quarter_wages", period) + return max_(base_year_wages - highest_quarter_wages, 0) diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_benefit_rate.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_benefit_rate.py new file mode 100644 index 00000000000..59d6d7e9285 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_benefit_rate.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class pa_uc_weekly_benefit_rate(Variable): + value_type = float + entity = Person + label = "Pennsylvania unemployment compensation weekly benefit rate" + unit = USD + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=136", + "https://www.pacodeandbulletin.gov/Display/pabull?file=/secure/pabulletin/data/vol54/54-52/1863.html", + ) + defined_for = StateCode.PA + + def formula(person, period, parameters): + highest_quarter_wages = person("pa_uc_highest_quarter_wages", period) + p = parameters(period).gov.states.pa.dli.unemployment_compensation + return p.rate_table.calc(highest_quarter_wages) diff --git a/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_payable.py b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_payable.py new file mode 100644 index 00000000000..459d9177ee7 --- /dev/null +++ b/policyengine_us/variables/gov/states/pa/dli/unemployment_compensation/pa_uc_weekly_payable.py @@ -0,0 +1,31 @@ +from policyengine_us.model_api import * + + +class pa_uc_weekly_payable(Variable): + value_type = float + entity = Person + label = "Pennsylvania unemployment compensation weekly payable amount" + unit = USD + definition_period = YEAR + reference = ( + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=36", + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=133", + "https://www.pa.gov/content/dam/copapwp-pagov/en/dli/documents/uc/uc_law.pdf#page=159", + ) + defined_for = "pa_uc_monetarily_eligible" + + def formula(person, period, parameters): + # § 4(u): a claimant is "unemployed" for a week only when earnings are + # less than WBR + PBC. § 404(e)(3) pays the dependent allowance only + # "for each week that he is entitled to benefits." When earnings reach + # or exceed WBR + PBC, the claimant is not unemployed and receives no + # benefits (base or dependent allowance). + wbr = person("pa_uc_weekly_benefit_rate", period) + pbc = person("pa_uc_partial_benefit_credit", period) + earnings = person("pa_uc_gross_weekly_earnings", period) + dependent_allowance = person("pa_uc_dependent_allowance", period) + earnings_reduction = max_(earnings - pbc, 0) + payable_wbr = max_(wbr - earnings_reduction, 0) + is_unemployed_this_week = earnings < (wbr + pbc) + dep = where(is_unemployed_this_week, dependent_allowance, 0) + return payable_wbr + dep