From dcde5929f56f52c7068ab4bc5bc1b7655c5998c5 Mon Sep 17 00:00:00 2001 From: jung32111 Date: Sat, 25 Jul 2026 09:18:48 +0900 Subject: [PATCH 1/7] =?UTF-8?q?=E2=9C=85=20Test:=205=EA=B0=9C=20=EC=97=94?= =?UTF-8?q?=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EA=B3=A8=EB=93=A0=20?= =?UTF-8?q?=EC=8A=A4=EB=83=85=EC=83=B7=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 이후 API 계약 정리 작업(단위 통일, 고갈 표현 통일 등)에서 의도치 않은 필드 값 변경을 즉시 감지하기 위한 baseline. TestClient 사용을 위해 httpx를 requirements에 추가. --- fastapi/requirements.txt | 1 + fastapi/tests/golden/_generate.py | 31 + .../tests/golden/diagnosis_insufficient.json | 340 +++++ fastapi/tests/golden/diagnosis_middle.json | 340 +++++ .../tests/golden/diagnosis_sufficient.json | 300 ++++ .../recommendations_saving_and_income.json | 343 +++++ .../golden/recommendations_saving_only.json | 343 +++++ .../golden/recommendations_sufficient.json | 303 ++++ fastapi/tests/golden/reduction_capped.json | 343 +++++ .../tests/golden/reduction_no_reduction.json | 343 +++++ fastapi/tests/golden/reduction_partial.json | 343 +++++ fastapi/tests/golden/scenarios_basic.json | 1353 +++++++++++++++++ .../scenarios_with_deduction_years.json | 1353 +++++++++++++++++ .../tests/golden/simulate_lump_sum_only.json | 13 + fastapi/tests/golden/simulate_normal.json | 13 + .../tests/golden/simulate_zero_months.json | 13 + fastapi/tests/test_golden_snapshots.py | 201 +++ 17 files changed, 5976 insertions(+) create mode 100644 fastapi/tests/golden/_generate.py create mode 100644 fastapi/tests/golden/diagnosis_insufficient.json create mode 100644 fastapi/tests/golden/diagnosis_middle.json create mode 100644 fastapi/tests/golden/diagnosis_sufficient.json create mode 100644 fastapi/tests/golden/recommendations_saving_and_income.json create mode 100644 fastapi/tests/golden/recommendations_saving_only.json create mode 100644 fastapi/tests/golden/recommendations_sufficient.json create mode 100644 fastapi/tests/golden/reduction_capped.json create mode 100644 fastapi/tests/golden/reduction_no_reduction.json create mode 100644 fastapi/tests/golden/reduction_partial.json create mode 100644 fastapi/tests/golden/scenarios_basic.json create mode 100644 fastapi/tests/golden/scenarios_with_deduction_years.json create mode 100644 fastapi/tests/golden/simulate_lump_sum_only.json create mode 100644 fastapi/tests/golden/simulate_normal.json create mode 100644 fastapi/tests/golden/simulate_zero_months.json create mode 100644 fastapi/tests/test_golden_snapshots.py diff --git a/fastapi/requirements.txt b/fastapi/requirements.txt index 604df70..c7b6740 100644 --- a/fastapi/requirements.txt +++ b/fastapi/requirements.txt @@ -3,3 +3,4 @@ pandas==3.0.2 pydantic==2.11.7 uvicorn==0.30.0 pytest==8.3.4 +httpx==0.28.1 diff --git a/fastapi/tests/golden/_generate.py b/fastapi/tests/golden/_generate.py new file mode 100644 index 0000000..3a161b1 --- /dev/null +++ b/fastapi/tests/golden/_generate.py @@ -0,0 +1,31 @@ +"""골든 스냅샷 픽스처를 (재)생성하는 일회성 스크립트. + +주의: 이 스크립트는 "현재 동작을 있는 그대로 고정"하기 위한 것이다. +의도적으로 응답 형식을 바꾼 뒤에는 변경이 올바른지 직접 확인하고 나서만 +이 스크립트로 픽스처를 다시 생성해야 한다. 절대 무비판적으로 재실행해 +테스트를 통과시키는 용도로 쓰지 말 것. +""" + +import json +from pathlib import Path + +from fastapi.testclient import TestClient + +from app.main import app +from tests.test_golden_snapshots import CASES + +client = TestClient(app) +OUT_DIR = Path(__file__).parent + +for case in CASES: + response = client.post(case["path"], json=case["body"]) + fixture = { + "status_code": response.status_code, + "body": response.json(), + } + out_path = OUT_DIR / f"{case['name']}.json" + out_path.write_text( + json.dumps(fixture, ensure_ascii=False, indent=2, sort_keys=True) + "\n", + encoding="utf-8", + ) + print(f"wrote {out_path}") diff --git a/fastapi/tests/golden/diagnosis_insufficient.json b/fastapi/tests/golden/diagnosis_insufficient.json new file mode 100644 index 0000000..e227945 --- /dev/null +++ b/fastapi/tests/golden/diagnosis_insufficient.json @@ -0,0 +1,340 @@ +{ + "body": { + "current_age": 60, + "depletion_age": 68, + "monthly_gap": 100.0, + "status": "INSUFFICIENT", + "target_age": 84, + "timeline": [ + { + "age": 60, + "asset": 10000.0, + "cumulative_gap": 1200.0, + "expense": 3000.0, + "gap": 1200.0, + "income": 1800.0 + }, + { + "age": 61, + "asset": 9064.0, + "cumulative_gap": 2460.0, + "expense": 3060.0, + "gap": 1260.0, + "income": 1800.0 + }, + { + "age": 62, + "asset": 8038.12, + "cumulative_gap": 3781.2000000000003, + "expense": 3121.2000000000003, + "gap": 1321.2000000000003, + "income": 1800.0 + }, + { + "age": 63, + "asset": 6918.4276, + "cumulative_gap": 5164.8240000000005, + "expense": 3183.6240000000003, + "gap": 1383.6240000000003, + "income": 1800.0 + }, + { + "age": 64, + "asset": 5700.847707999999, + "cumulative_gap": 6612.120480000001, + "expense": 3247.2964800000004, + "gap": 1447.2964800000004, + "income": 1800.0 + }, + { + "age": 65, + "asset": 4381.157764839999, + "cumulative_gap": 8124.362889600002, + "expense": 3312.2424096000004, + "gap": 1512.2424096000004, + "income": 1800.0 + }, + { + "age": 66, + "asset": 2954.9828158971986, + "cumulative_gap": 9702.850147392002, + "expense": 3378.4872577920005, + "gap": 1578.4872577920005, + "income": 1800.0 + }, + { + "age": 67, + "asset": 1417.7904248483542, + "cumulative_gap": 11348.907150339843, + "expense": 3446.0570029478404, + "gap": 1646.0570029478404, + "income": 1800.0 + }, + { + "age": 68, + "asset": -235.1145754424708, + "cumulative_gap": 13063.88529334664, + "expense": 3514.9781430067974, + "gap": 1714.9781430067974, + "income": 1800.0 + }, + { + "age": 69, + "asset": -2008.5955000027463, + "cumulative_gap": 14849.162999213575, + "expense": 3585.2777058669335, + "gap": 1785.2777058669335, + "income": 1800.0 + }, + { + "age": 70, + "asset": -3907.6894020457703, + "cumulative_gap": 16706.14625919785, + "expense": 3656.983259984272, + "gap": 1856.983259984272, + "income": 1800.0 + }, + { + "age": 71, + "asset": -5937.612841890944, + "cumulative_gap": 18636.269184381807, + "expense": 3730.1229251839577, + "gap": 1930.1229251839577, + "income": 1800.0 + }, + { + "age": 72, + "asset": -8103.767840087149, + "cumulative_gap": 20640.994568069444, + "expense": 3804.725383687637, + "gap": 2004.725383687637, + "income": 1800.0 + }, + { + "age": 73, + "asset": -10411.748020488028, + "cumulative_gap": 22721.814459430832, + "expense": 3880.81989136139, + "gap": 2080.81989136139, + "income": 1800.0 + }, + { + "age": 74, + "asset": -12867.344949204902, + "cumulative_gap": 24880.25074861945, + "expense": 3958.436289188618, + "gap": 2158.436289188618, + "income": 1800.0 + }, + { + "age": 75, + "asset": -15476.554675545325, + "cumulative_gap": 27117.85576359184, + "expense": 4037.6050149723906, + "gap": 2237.6050149723906, + "income": 1800.0 + }, + { + "age": 76, + "asset": -18245.584481233247, + "cumulative_gap": 29436.21287886368, + "expense": 4118.357115271839, + "gap": 2318.3571152718387, + "income": 1800.0 + }, + { + "age": 77, + "asset": -21180.85984440024, + "cumulative_gap": 31836.937136440956, + "expense": 4200.724257577275, + "gap": 2400.7242575772752, + "income": 1800.0 + }, + { + "age": 78, + "asset": -24289.03162503684, + "cumulative_gap": 34321.67587916978, + "expense": 4284.73874272882, + "gap": 2484.7387427288204, + "income": 1800.0 + }, + { + "age": 79, + "asset": -27576.983478798633, + "cumulative_gap": 36892.10939675318, + "expense": 4370.433517583397, + "gap": 2570.4335175833967, + "income": 1800.0 + }, + { + "age": 80, + "asset": -31051.839506273493, + "cumulative_gap": 39549.95158468824, + "expense": 4457.842187935064, + "gap": 2657.8421879350644, + "income": 1800.0 + }, + { + "age": 81, + "asset": -34720.972145034815, + "cumulative_gap": 42296.950616382004, + "expense": 4546.999031693766, + "gap": 2746.9990316937656, + "income": 1800.0 + }, + { + "age": 82, + "asset": -38592.010312030434, + "cumulative_gap": 45134.88962870964, + "expense": 4637.939012327641, + "gap": 2837.9390123276407, + "income": 1800.0 + }, + { + "age": 83, + "asset": -42672.847804088815, + "cumulative_gap": 48065.58742128384, + "expense": 4730.697792574194, + "gap": 2930.697792574194, + "income": 1800.0 + }, + { + "age": 84, + "asset": -46971.6519645629, + "cumulative_gap": 51090.89916970952, + "expense": 4825.311748425678, + "gap": 3025.311748425678, + "income": 1800.0 + }, + { + "age": 85, + "asset": -51496.87262437824, + "cumulative_gap": 54212.71715310371, + "expense": 4921.817983394192, + "gap": 3121.817983394192, + "income": 1800.0 + }, + { + "age": 86, + "asset": -56257.2513260056, + "cumulative_gap": 57432.97149616579, + "expense": 5020.254343062076, + "gap": 3220.2543430620763, + "income": 1800.0 + }, + { + "age": 87, + "asset": -61261.83083913971, + "cumulative_gap": 60753.63092608911, + "expense": 5120.6594299233175, + "gap": 3320.6594299233175, + "income": 1800.0 + }, + { + "age": 88, + "asset": -66519.96497713492, + "cumulative_gap": 64176.70354461089, + "expense": 5223.072618521784, + "gap": 3423.0726185217836, + "income": 1800.0 + }, + { + "age": 89, + "asset": -72041.3287235264, + "cumulative_gap": 67704.23761550311, + "expense": 5327.5340708922195, + "gap": 3527.5340708922195, + "income": 1800.0 + }, + { + "age": 90, + "asset": -77835.92867825118, + "cumulative_gap": 71338.32236781318, + "expense": 5434.084752310064, + "gap": 3634.084752310064, + "income": 1800.0 + }, + { + "age": 91, + "asset": -83914.11383347808, + "cumulative_gap": 75081.08881516944, + "expense": 5542.766447356265, + "gap": 3742.7664473562654, + "income": 1800.0 + }, + { + "age": 92, + "asset": -90286.58668925938, + "cumulative_gap": 78934.71059147283, + "expense": 5653.621776303391, + "gap": 3853.621776303391, + "income": 1800.0 + }, + { + "age": 93, + "asset": -96964.41471952965, + "cumulative_gap": 82901.40480330228, + "expense": 5766.694211829459, + "gap": 3966.694211829459, + "income": 1800.0 + }, + { + "age": 94, + "asset": -103959.04219929989, + "cumulative_gap": 86983.43289936833, + "expense": 5882.028096066048, + "gap": 4082.0280960660484, + "income": 1800.0 + }, + { + "age": 95, + "asset": -111282.30240422691, + "cumulative_gap": 91183.1015573557, + "expense": 5999.668657987369, + "gap": 4199.668657987369, + "income": 1800.0 + }, + { + "age": 96, + "asset": -118946.4301940807, + "cumulative_gap": 95502.76358850281, + "expense": 6119.662031147117, + "gap": 4319.662031147117, + "income": 1800.0 + }, + { + "age": 97, + "asset": -126964.07499198466, + "cumulative_gap": 99944.81886027288, + "expense": 6242.055271770059, + "gap": 4442.055271770059, + "income": 1800.0 + }, + { + "age": 98, + "asset": -135348.31417166736, + "cumulative_gap": 104511.71523747833, + "expense": 6366.89637720546, + "gap": 4566.89637720546, + "income": 1800.0 + }, + { + "age": 99, + "asset": -144112.666865339, + "cumulative_gap": 109205.9495422279, + "expense": 6494.23430474957, + "gap": 4694.23430474957, + "income": 1800.0 + }, + { + "age": 100, + "asset": -153271.10820519124, + "cumulative_gap": 114030.06853307247, + "expense": 6624.118990844561, + "gap": 4824.118990844561, + "income": 1800.0 + } + ] + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/diagnosis_middle.json b/fastapi/tests/golden/diagnosis_middle.json new file mode 100644 index 0000000..d1cb8f5 --- /dev/null +++ b/fastapi/tests/golden/diagnosis_middle.json @@ -0,0 +1,340 @@ +{ + "body": { + "current_age": 60, + "depletion_age": 96, + "monthly_gap": 50.0, + "status": "MIDDLE", + "target_age": 88, + "timeline": [ + { + "age": 60, + "asset": 32000.0, + "cumulative_gap": 600.0, + "expense": 2400.0, + "gap": 600.0, + "income": 1800.0 + }, + { + "age": 61, + "asset": 32342.0, + "cumulative_gap": 1248.0, + "expense": 2448.0, + "gap": 648.0, + "income": 1800.0 + }, + { + "age": 62, + "asset": 32644.82, + "cumulative_gap": 1944.96, + "expense": 2496.96, + "gap": 696.96, + "income": 1800.0 + }, + { + "age": 63, + "asset": 32906.2958, + "cumulative_gap": 2691.8592000000003, + "expense": 2546.8992000000003, + "gap": 746.8992000000003, + "income": 1800.0 + }, + { + "age": 64, + "asset": 33124.178498, + "cumulative_gap": 3489.6963840000008, + "expense": 2597.8371840000004, + "gap": 797.8371840000004, + "income": 1800.0 + }, + { + "age": 65, + "asset": 33296.131553420004, + "cumulative_gap": 4339.4903116800015, + "expense": 2649.7939276800007, + "gap": 849.7939276800007, + "income": 1800.0 + }, + { + "age": 66, + "asset": 33419.727754512205, + "cumulative_gap": 5242.280117913602, + "expense": 2702.7898062336008, + "gap": 902.7898062336008, + "income": 1800.0 + }, + { + "age": 67, + "asset": 33492.44608672696, + "cumulative_gap": 6199.125720271875, + "expense": 2756.845602358273, + "gap": 956.845602358273, + "income": 1800.0 + }, + { + "age": 68, + "asset": 33511.668498899744, + "cumulative_gap": 7211.108234677314, + "expense": 2811.9825144054385, + "gap": 1011.9825144054385, + "income": 1800.0 + }, + { + "age": 69, + "asset": 33474.676564029134, + "cumulative_gap": 8279.330399370861, + "expense": 2868.2221646935473, + "gap": 1068.2221646935473, + "income": 1800.0 + }, + { + "age": 70, + "asset": 33378.64803131566, + "cumulative_gap": 9404.917007358279, + "expense": 2925.586607987418, + "gap": 1125.5866079874181, + "income": 1800.0 + }, + { + "age": 71, + "asset": 33220.65326602809, + "cumulative_gap": 10589.015347505447, + "expense": 2984.0983401471667, + "gap": 1184.0983401471667, + "income": 1800.0 + }, + { + "age": 72, + "asset": 32997.65157365735, + "cumulative_gap": 11832.795654455556, + "expense": 3043.78030695011, + "gap": 1243.7803069501101, + "income": 1800.0 + }, + { + "age": 73, + "asset": 32706.487404708456, + "cumulative_gap": 13137.45156754467, + "expense": 3104.6559130891123, + "gap": 1304.6559130891123, + "income": 1800.0 + }, + { + "age": 74, + "asset": 32343.886436367928, + "cumulative_gap": 14504.200598895564, + "expense": 3166.7490313508947, + "gap": 1366.7490313508947, + "income": 1800.0 + }, + { + "age": 75, + "asset": 31906.451527167545, + "cumulative_gap": 15934.284610873478, + "expense": 3230.0840119779127, + "gap": 1430.0840119779127, + "income": 1800.0 + }, + { + "age": 76, + "asset": 31390.65854064532, + "cumulative_gap": 17428.970303090948, + "expense": 3294.685692217471, + "gap": 1494.6856922174711, + "income": 1800.0 + }, + { + "age": 77, + "asset": 30792.852033880685, + "cumulative_gap": 18989.54970915277, + "expense": 3360.5794060618205, + "gap": 1560.5794060618205, + "income": 1800.0 + }, + { + "age": 78, + "asset": 30109.24080665343, + "cumulative_gap": 20617.340703335827, + "expense": 3427.790994183057, + "gap": 1627.7909941830571, + "income": 1800.0 + }, + { + "age": 79, + "asset": 29335.893306844482, + "cumulative_gap": 22313.687517402544, + "expense": 3496.3468140667183, + "gap": 1696.3468140667183, + "income": 1800.0 + }, + { + "age": 80, + "asset": 28468.7328875611, + "cumulative_gap": 24079.961267750597, + "expense": 3566.2737503480525, + "gap": 1766.2737503480525, + "income": 1800.0 + }, + { + "age": 81, + "asset": 27503.532911329436, + "cumulative_gap": 25917.56049310561, + "expense": 3637.5992253550135, + "gap": 1837.5992253550135, + "income": 1800.0 + }, + { + "age": 82, + "asset": 26435.911696553656, + "cumulative_gap": 27827.911702967725, + "expense": 3710.3512098621136, + "gap": 1910.3512098621136, + "income": 1800.0 + }, + { + "age": 83, + "asset": 25261.327301292287, + "cumulative_gap": 29812.469937027083, + "expense": 3784.558234059356, + "gap": 1984.558234059356, + "income": 1800.0 + }, + { + "age": 84, + "asset": 23975.072139249918, + "cumulative_gap": 31872.719335767626, + "expense": 3860.2493987405433, + "gap": 2060.2493987405433, + "income": 1800.0 + }, + { + "age": 85, + "asset": 22572.267422724657, + "cumulative_gap": 34010.17372248298, + "expense": 3937.4543867153543, + "gap": 2137.4543867153543, + "income": 1800.0 + }, + { + "age": 86, + "asset": 21047.85742708958, + "cumulative_gap": 36226.37719693264, + "expense": 4016.2034744496614, + "gap": 2216.2034744496614, + "income": 1800.0 + }, + { + "age": 87, + "asset": 19396.60357121912, + "cumulative_gap": 38522.904740871294, + "expense": 4096.527543938655, + "gap": 2296.527543938655, + "income": 1800.0 + }, + { + "age": 88, + "asset": 17613.078308098877, + "cumulative_gap": 40901.36283568872, + "expense": 4178.458094817428, + "gap": 2378.458094817428, + "income": 1800.0 + }, + { + "age": 89, + "asset": 15691.658819679893, + "cumulative_gap": 43363.39009240249, + "expense": 4262.027256713776, + "gap": 2462.0272567137763, + "income": 1800.0 + }, + { + "age": 90, + "asset": 13626.520509855101, + "cumulative_gap": 45910.657894250544, + "expense": 4347.267801848052, + "gap": 2547.267801848052, + "income": 1800.0 + }, + { + "age": 91, + "asset": 11411.630289247261, + "cumulative_gap": 48544.87105213555, + "expense": 4434.213157885013, + "gap": 2634.213157885013, + "income": 1800.0 + }, + { + "age": 92, + "asset": 9040.739645303116, + "cumulative_gap": 51267.768473178265, + "expense": 4522.897421042713, + "gap": 2722.897421042713, + "income": 1800.0 + }, + { + "age": 93, + "asset": 6507.377490988215, + "cumulative_gap": 54081.123842641835, + "expense": 4613.3553694635675, + "gap": 2813.3553694635675, + "income": 1800.0 + }, + { + "age": 94, + "asset": 3804.842785170387, + "cumulative_gap": 56986.746319494676, + "expense": 4705.622476852839, + "gap": 2905.622476852839, + "income": 1800.0 + }, + { + "age": 95, + "asset": 926.1969175670741, + "cumulative_gap": 59986.48124588457, + "expense": 4799.734926389896, + "gap": 2999.734926389896, + "income": 1800.0 + }, + { + "age": 96, + "asset": -2135.7441490875062, + "cumulative_gap": 63082.210870802264, + "expense": 4895.729624917694, + "gap": 3095.7296249176943, + "income": 1800.0 + }, + { + "age": 97, + "asset": -5388.417987225357, + "cumulative_gap": 66275.85508821832, + "expense": 4993.644217416048, + "gap": 3193.6442174160484, + "income": 1800.0 + }, + { + "age": 98, + "asset": -8839.52407078065, + "cumulative_gap": 69569.37218998269, + "expense": 5093.51710176437, + "gap": 3293.5171017643697, + "income": 1800.0 + }, + { + "age": 99, + "asset": -12497.03240772137, + "cumulative_gap": 72964.75963378235, + "expense": 5195.387443799657, + "gap": 3395.3874437996574, + "income": 1800.0 + }, + { + "age": 100, + "asset": -16369.192447066658, + "cumulative_gap": 76464.054826458, + "expense": 5299.2951926756505, + "gap": 3499.2951926756505, + "income": 1800.0 + } + ] + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/diagnosis_sufficient.json b/fastapi/tests/golden/diagnosis_sufficient.json new file mode 100644 index 0000000..3d937c1 --- /dev/null +++ b/fastapi/tests/golden/diagnosis_sufficient.json @@ -0,0 +1,300 @@ +{ + "body": { + "current_age": 65, + "depletion_age": null, + "monthly_gap": -50.0, + "status": "SUFFICIENT", + "target_age": 84, + "timeline": [ + { + "age": 65, + "asset": 10000.0, + "cumulative_gap": -600.0, + "expense": 1800.0, + "gap": -600.0, + "income": 2400.0 + }, + { + "age": 66, + "asset": 10918.0, + "cumulative_gap": -1164.0, + "expense": 1836.0, + "gap": -564.0, + "income": 2400.0 + }, + { + "age": 67, + "asset": 11826.460000000001, + "cumulative_gap": -1691.28, + "expense": 1872.72, + "gap": -527.28, + "income": 2400.0 + }, + { + "age": 68, + "asset": 12724.352200000001, + "cumulative_gap": -2181.1056, + "expense": 1910.1744, + "gap": -489.8255999999999, + "income": 2400.0 + }, + { + "age": 69, + "asset": 13610.603134, + "cumulative_gap": -2632.727712, + "expense": 1948.3778880000002, + "gap": -451.6221119999998, + "income": 2400.0 + }, + { + "age": 70, + "asset": 14484.092003380001, + "cumulative_gap": -3045.38226624, + "expense": 1987.3454457600003, + "gap": -412.6545542399997, + "income": 2400.0 + }, + { + "age": 71, + "asset": 15343.648954348602, + "cumulative_gap": -3418.2899115647997, + "expense": 2027.0923546752003, + "gap": -372.90764532479966, + "income": 2400.0 + }, + { + "age": 72, + "asset": 16188.053297663604, + "cumulative_gap": -3750.6557097960954, + "expense": 2067.6342017687043, + "gap": -332.3657982312957, + "income": 2400.0 + }, + { + "age": 73, + "asset": 17016.031668771746, + "cumulative_gap": -4041.6688239920168, + "expense": 2108.9868858040786, + "gap": -291.0131141959214, + "income": 2400.0 + }, + { + "age": 74, + "asset": 17826.256126456698, + "cumulative_gap": -4290.502200471857, + "expense": 2151.16662352016, + "gap": -248.8333764798399, + "income": 2400.0 + }, + { + "age": 75, + "asset": 18617.342188024635, + "cumulative_gap": -4496.312244481293, + "expense": 2194.1899559905632, + "gap": -205.81004400943675, + "income": 2400.0 + }, + { + "age": 76, + "asset": 19387.846798995095, + "cumulative_gap": -4658.238489370919, + "expense": 2238.0737551103743, + "gap": -161.92624488962565, + "income": 2400.0 + }, + { + "age": 77, + "asset": 20136.266235201263, + "cumulative_gap": -4775.403259158336, + "expense": 2282.835230212582, + "gap": -117.16476978741821, + "income": 2400.0 + }, + { + "age": 78, + "asset": 20861.03393513834, + "cumulative_gap": -4846.911324341503, + "expense": 2328.4919348168337, + "gap": -71.50806518316631, + "income": 2400.0 + }, + { + "age": 79, + "asset": 21560.518260331155, + "cumulative_gap": -4871.849550828332, + "expense": 2375.0617735131705, + "gap": -24.938226486829535, + "income": 2400.0 + }, + { + "age": 80, + "asset": 22233.020181422526, + "cumulative_gap": -4849.286541844898, + "expense": 2422.563008983434, + "gap": 22.563008983433974, + "income": 2400.0 + }, + { + "age": 81, + "asset": 22876.770887612263, + "cumulative_gap": -4778.272272681796, + "expense": 2471.0142691631027, + "gap": 71.01426916310265, + "income": 2400.0 + }, + { + "age": 82, + "asset": 23489.929317002636, + "cumulative_gap": -4657.837718135431, + "expense": 2520.434554546365, + "gap": 120.43455454636478, + "income": 2400.0 + }, + { + "age": 83, + "asset": 24070.57960532996, + "cumulative_gap": -4486.994472498139, + "expense": 2570.843245637292, + "gap": 170.84324563729206, + "income": 2400.0 + }, + { + "age": 84, + "asset": 24616.728450483446, + "cumulative_gap": -4264.734361948101, + "expense": 2622.260110550038, + "gap": 222.260110550038, + "income": 2400.0 + }, + { + "age": 85, + "asset": 25126.30239013141, + "cumulative_gap": -3990.029049187062, + "expense": 2674.705312761039, + "gap": 274.70531276103884, + "income": 2400.0 + }, + { + "age": 86, + "asset": 25597.144989691486, + "cumulative_gap": -3661.8296301708024, + "expense": 2728.1994190162595, + "gap": 328.1994190162595, + "income": 2400.0 + }, + { + "age": 87, + "asset": 26027.013937795484, + "cumulative_gap": -3279.0662227742177, + "expense": 2782.7634073965846, + "gap": 382.7634073965846, + "income": 2400.0 + }, + { + "age": 88, + "asset": 26413.578046310868, + "cumulative_gap": -2840.6475472297016, + "expense": 2838.418675544516, + "gap": 438.4186755445162, + "income": 2400.0 + }, + { + "age": 89, + "asset": 26754.414151889345, + "cumulative_gap": -2345.460498174295, + "expense": 2895.1870490554065, + "gap": 495.18704905540653, + "income": 2400.0 + }, + { + "age": 90, + "asset": 27047.00391591896, + "cumulative_gap": -1792.3697081377804, + "expense": 2953.0907900365146, + "gap": 553.0907900365146, + "income": 2400.0 + }, + { + "age": 91, + "asset": 27288.730519658915, + "cumulative_gap": -1180.2171023005353, + "expense": 3012.152605837245, + "gap": 612.1526058372451, + "income": 2400.0 + }, + { + "age": 92, + "asset": 27476.87525123632, + "cumulative_gap": -507.8214443465454, + "expense": 3072.39565795399, + "gap": 672.3956579539899, + "income": 2400.0 + }, + { + "age": 93, + "asset": 27608.6139810808, + "cumulative_gap": 226.02212676652425, + "expense": 3133.8435711130696, + "gap": 733.8435711130696, + "income": 2400.0 + }, + { + "age": 94, + "asset": 27681.013522266763, + "cumulative_gap": 1022.5425693018551, + "expense": 3196.520442535331, + "gap": 796.5204425353309, + "income": 2400.0 + }, + { + "age": 95, + "asset": 27691.027872123377, + "cumulative_gap": 1882.9934206878925, + "expense": 3260.4508513860374, + "gap": 860.4508513860374, + "income": 2400.0 + }, + { + "age": 96, + "asset": 27635.49433135946, + "cumulative_gap": 2808.6532891016504, + "expense": 3325.659868413758, + "gap": 925.659868413758, + "income": 2400.0 + }, + { + "age": 97, + "asset": 27511.129496834074, + "cumulative_gap": 3800.8263548836835, + "expense": 3392.173065782033, + "gap": 992.1730657820331, + "income": 2400.0 + }, + { + "age": 98, + "asset": 27314.525123983603, + "cumulative_gap": 4860.842881981357, + "expense": 3460.0165270976736, + "gap": 1060.0165270976736, + "income": 2400.0 + }, + { + "age": 99, + "asset": 27042.14385479251, + "cumulative_gap": 5990.059739620984, + "expense": 3529.216857639627, + "gap": 1129.216857639627, + "income": 2400.0 + }, + { + "age": 100, + "asset": 26690.314807067472, + "cumulative_gap": 7189.860934413404, + "expense": 3599.8011947924197, + "gap": 1199.8011947924197, + "income": 2400.0 + } + ] + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/recommendations_saving_and_income.json b/fastapi/tests/golden/recommendations_saving_and_income.json new file mode 100644 index 0000000..3425d26 --- /dev/null +++ b/fastapi/tests/golden/recommendations_saving_and_income.json @@ -0,0 +1,343 @@ +{ + "body": { + "current_age": 60, + "depletion_age": null, + "recommendation_type": "SAVING_AND_INCOME", + "required_income": 277.01, + "required_saving": 120.0, + "status": "SUFFICIENT", + "target_age": 88, + "target_status": "SUFFICIENT", + "timeline": [ + { + "age": 60, + "asset": 5000.0, + "cumulative_gap": -1164.12, + "expense": 3360.0, + "gap": -1164.12, + "income": 4524.12 + }, + { + "age": 61, + "asset": 6349.0436, + "cumulative_gap": -2261.0399999999995, + "expense": 3427.2000000000003, + "gap": -1096.9199999999996, + "income": 4524.12 + }, + { + "age": 62, + "asset": 7669.342508, + "cumulative_gap": -3289.4159999999993, + "expense": 3495.744, + "gap": -1028.3759999999997, + "income": 4524.12 + }, + { + "age": 63, + "asset": 8958.65006324, + "cumulative_gap": -4247.877119999999, + "expense": 3565.6588800000004, + "gap": -958.4611199999995, + "income": 4524.12 + }, + { + "age": 64, + "asset": 10214.6245187372, + "cumulative_gap": -5135.025062399998, + "expense": 3636.9720576000004, + "gap": -887.1479423999995, + "income": 4524.12 + }, + { + "age": 65, + "asset": 11434.825634971316, + "cumulative_gap": -5949.433563647997, + "expense": 3709.7114987520004, + "gap": -814.4085012479995, + "income": 4524.12 + }, + { + "age": 66, + "asset": 12616.711160305895, + "cumulative_gap": -6689.647834920957, + "expense": 3783.9057287270402, + "gap": -740.2142712729596, + "income": 4524.12 + }, + { + "age": 67, + "asset": 13757.63319452622, + "cumulative_gap": -7354.183991619377, + "expense": 3859.583843301581, + "gap": -664.5361566984188, + "income": 4524.12 + }, + { + "age": 68, + "asset": 14854.83443176138, + "cumulative_gap": -7941.528471451764, + "expense": 3936.7755201676127, + "gap": -587.3444798323872, + "income": 4524.12 + }, + { + "age": 69, + "asset": 15905.444278941579, + "cumulative_gap": -8450.137440880799, + "expense": 4015.511030570965, + "gap": -508.6089694290349, + "income": 4524.12 + }, + { + "age": 70, + "asset": 16906.47484582173, + "cumulative_gap": -8878.436189698414, + "expense": 4095.8212511823845, + "gap": -428.29874881761543, + "income": 4524.12 + }, + { + "age": 71, + "asset": 17854.816802478526, + "cumulative_gap": -9224.81851349238, + "expense": 4177.737676206032, + "gap": -346.38232379396777, + "income": 4524.12 + }, + { + "age": 72, + "asset": 18747.23510006067, + "cumulative_gap": -9487.646083762229, + "expense": 4261.292429730152, + "gap": -262.82757026984746, + "income": 4524.12 + }, + { + "age": 73, + "asset": 19580.364550440434, + "cumulative_gap": -9665.247805437473, + "expense": 4346.518278324756, + "gap": -177.60172167524433, + "income": 4524.12 + }, + { + "age": 74, + "asset": 20350.70526027915, + "cumulative_gap": -9755.919161546222, + "expense": 4433.448643891251, + "gap": -90.67135610874902, + "income": 4524.12 + }, + { + "age": 75, + "asset": 21054.617914879535, + "cumulative_gap": -9757.921544777146, + "expense": 4522.1176167690755, + "gap": -2.0023832309243517, + "income": 4524.12 + }, + { + "age": 76, + "asset": 21688.318907053774, + "cumulative_gap": -9669.48157567269, + "expense": 4612.559969104457, + "gap": 88.4399691044573, + "income": 4524.12 + }, + { + "age": 77, + "asset": 22247.875306087797, + "cumulative_gap": -9488.790407186143, + "expense": 4704.811168486546, + "gap": 180.6911684865463, + "income": 4524.12 + }, + { + "age": 78, + "asset": 22729.19966172929, + "cumulative_gap": -9214.003015329865, + "expense": 4798.907391856277, + "gap": 274.7873918562773, + "income": 4524.12 + }, + { + "age": 79, + "asset": 23128.044637969204, + "cumulative_gap": -8843.237475636462, + "expense": 4894.885539693403, + "gap": 370.7655396934033, + "income": 4524.12 + }, + { + "age": 80, + "asset": 23439.997471224076, + "cumulative_gap": -8374.57422514919, + "expense": 4992.783250487271, + "gap": 468.6632504872714, + "income": 4524.12 + }, + { + "age": 81, + "asset": 23660.47424735891, + "cumulative_gap": -7806.0553096521735, + "expense": 5092.638915497017, + "gap": 568.5189154970167, + "income": 4524.12 + }, + { + "age": 82, + "asset": 23784.71399181775, + "cumulative_gap": -7135.683615845216, + "expense": 5194.491693806957, + "gap": 670.3716938069574, + "income": 4524.12 + }, + { + "age": 83, + "asset": 23807.772566951116, + "cumulative_gap": -6361.4220881621195, + "expense": 5298.3815276830965, + "gap": 774.2615276830966, + "income": 4524.12 + }, + { + "age": 84, + "asset": 23724.516370446065, + "cumulative_gap": -5481.192929925361, + "expense": 5404.349158236759, + "gap": 880.2291582367588, + "income": 4524.12 + }, + { + "age": 85, + "asset": 23529.61582857559, + "cumulative_gap": -4492.876788523867, + "expense": 5512.436141401494, + "gap": 988.316141401494, + "income": 4524.12 + }, + { + "age": 86, + "asset": 23217.538677789318, + "cumulative_gap": -3394.311924294343, + "expense": 5622.684864229524, + "gap": 1098.5648642295237, + "income": 4524.12 + }, + { + "age": 87, + "asset": 22782.54302796659, + "cumulative_gap": -2183.2933627802286, + "expense": 5735.138561514114, + "gap": 1211.0185615141145, + "income": 4524.12 + }, + { + "age": 88, + "asset": 22218.670200446046, + "cumulative_gap": -857.5720300358316, + "expense": 5849.841332744397, + "gap": 1325.721332744397, + "income": 4524.12 + }, + { + "age": 89, + "asset": 21519.737333732697, + "cumulative_gap": 585.1461293634529, + "expense": 5966.838159399284, + "gap": 1442.7181593992846, + "income": 4524.12 + }, + { + "age": 90, + "asset": 20679.329749563418, + "cumulative_gap": 2147.201051950723, + "expense": 6086.17492258727, + "gap": 1562.05492258727, + "income": 4524.12 + }, + { + "age": 91, + "asset": 19690.793071785432, + "cumulative_gap": 3830.9794729897385, + "expense": 6207.898421039015, + "gap": 1683.7784210390155, + "income": 4524.12 + }, + { + "age": 92, + "asset": 18547.22509026881, + "cumulative_gap": 5638.915862449534, + "expense": 6332.056389459795, + "gap": 1807.9363894597955, + "income": 4524.12 + }, + { + "age": 93, + "asset": 17241.467361833285, + "cumulative_gap": 7573.493379698525, + "expense": 6458.697517248991, + "gap": 1934.5775172489912, + "income": 4524.12 + }, + { + "age": 94, + "asset": 15766.096539921822, + "cumulative_gap": 9637.244847292495, + "expense": 6587.871467593971, + "gap": 2063.751467593971, + "income": 4524.12 + }, + { + "age": 95, + "asset": 14113.415424497687, + "cumulative_gap": 11832.753744238345, + "expense": 6719.62889694585, + "gap": 2195.50889694585, + "income": 4524.12 + }, + { + "age": 96, + "asset": 12275.443723378392, + "cumulative_gap": 14162.655219123113, + "expense": 6854.0214748847675, + "gap": 2329.9014748847676, + "income": 4524.12 + }, + { + "age": 97, + "asset": 10243.908515948433, + "cumulative_gap": 16629.637123505578, + "expense": 6991.101904382463, + "gap": 2466.9819043824627, + "income": 4524.12 + }, + { + "age": 98, + "asset": 8010.23440991295, + "cumulative_gap": 19236.44106597569, + "expense": 7130.923942470112, + "gap": 2606.803942470112, + "income": 4524.12 + }, + { + "age": 99, + "asset": 5565.533381466123, + "cumulative_gap": 21985.863487295203, + "expense": 7273.542421319514, + "gap": 2749.422421319514, + "income": 4524.12 + }, + { + "age": 100, + "asset": 2900.594288951007, + "cumulative_gap": 24880.756757041105, + "expense": 7419.013269745904, + "gap": 2894.893269745904, + "income": 4524.12 + } + ] + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/recommendations_saving_only.json b/fastapi/tests/golden/recommendations_saving_only.json new file mode 100644 index 0000000..d3fe975 --- /dev/null +++ b/fastapi/tests/golden/recommendations_saving_only.json @@ -0,0 +1,343 @@ +{ + "body": { + "current_age": 60, + "depletion_age": null, + "recommendation_type": "SAVING_ONLY", + "required_income": 0.0, + "required_saving": 71.17, + "status": "SUFFICIENT", + "target_age": 84, + "target_status": "SUFFICIENT", + "timeline": [ + { + "age": 60, + "asset": 15000.0, + "cumulative_gap": -254.03999999999996, + "expense": 2145.96, + "gap": -254.03999999999996, + "income": 2400.0 + }, + { + "age": 61, + "asset": 15711.6612, + "cumulative_gap": -465.1608000000001, + "expense": 2188.8792, + "gap": -211.12080000000014, + "income": 2400.0 + }, + { + "age": 62, + "asset": 16400.465460000003, + "cumulative_gap": -632.5040160000003, + "expense": 2232.656784, + "gap": -167.3432160000002, + "income": 2400.0 + }, + { + "age": 63, + "asset": 17064.842936280005, + "cumulative_gap": -755.1940963200004, + "expense": 2277.30991968, + "gap": -122.6900803200001, + "income": 2400.0 + }, + { + "age": 64, + "asset": 17703.159007098006, + "cumulative_gap": -832.3379782464003, + "expense": 2322.8561180736, + "gap": -77.1438819263999, + "income": 2400.0 + }, + { + "age": 65, + "asset": 18313.71197569514, + "cumulative_gap": -863.0247378113281, + "expense": 2369.313240435072, + "gap": -30.686759564927797, + "income": 2400.0 + }, + { + "age": 66, + "asset": 18894.73069731787, + "cumulative_gap": -846.3252325675544, + "expense": 2416.6995052437737, + "gap": 16.69950524377373, + "income": 2400.0 + }, + { + "age": 67, + "asset": 19444.37212783632, + "cumulative_gap": -781.2917372189049, + "expense": 2465.0334953486495, + "gap": 65.03349534864947, + "income": 2400.0 + }, + { + "age": 68, + "asset": 19960.7187914623, + "cumulative_gap": -666.9575719632826, + "expense": 2514.3341652556223, + "gap": 114.33416525562234, + "income": 2400.0 + }, + { + "age": 69, + "asset": 20441.776164992876, + "cumulative_gap": -502.3367234025477, + "expense": 2564.620848560735, + "gap": 164.62084856073488, + "income": 2400.0 + }, + { + "age": 70, + "asset": 20885.469975925105, + "cumulative_gap": -286.4234578705982, + "expense": 2615.9132655319495, + "gap": 215.9132655319495, + "income": 2400.0 + }, + { + "age": 71, + "asset": 21289.643411704954, + "cumulative_gap": -18.19192702800956, + "expense": 2668.2315308425887, + "gap": 268.23153084258865, + "income": 2400.0 + }, + { + "age": 72, + "asset": 21652.054237288237, + "cumulative_gap": 303.4042344314307, + "expense": 2721.5961614594403, + "gap": 321.5961614594403, + "income": 2400.0 + }, + { + "age": 73, + "asset": 21970.37181810366, + "cumulative_gap": 679.4323191200597, + "expense": 2776.028084688629, + "gap": 376.02808468862895, + "income": 2400.0 + }, + { + "age": 74, + "asset": 22242.17404541748, + "cumulative_gap": 1110.9809655024615, + "expense": 2831.548646382402, + "gap": 431.5486463824018, + "income": 2400.0 + }, + { + "age": 75, + "asset": 22464.94416100613, + "cumulative_gap": 1599.1605848125114, + "expense": 2888.17961931005, + "gap": 488.17961931004993, + "income": 2400.0 + }, + { + "age": 76, + "asset": 22636.067477946963, + "cumulative_gap": 2145.1037965087626, + "expense": 2945.943211696251, + "gap": 545.9432116962512, + "income": 2400.0 + }, + { + "age": 77, + "asset": 22752.827994238232, + "cumulative_gap": 2749.9658724389387, + "expense": 3004.862075930176, + "gap": 604.8620759301762, + "income": 2400.0 + }, + { + "age": 78, + "asset": 22812.404895857297, + "cumulative_gap": 3414.9251898877183, + "expense": 3064.9593174487795, + "gap": 664.9593174487795, + "income": 2400.0 + }, + { + "age": 79, + "asset": 22811.868945760776, + "cumulative_gap": 4141.183693685473, + "expense": 3126.258503797755, + "gap": 726.2585037977551, + "income": 2400.0 + }, + { + "age": 80, + "asset": 22748.178755221914, + "cumulative_gap": 4929.967367559184, + "expense": 3188.78367387371, + "gap": 788.7836738737101, + "income": 2400.0 + }, + { + "age": 81, + "asset": 22618.17693378865, + "cumulative_gap": 5782.526714910368, + "expense": 3252.5593473511844, + "gap": 852.5593473511844, + "income": 2400.0 + }, + { + "age": 82, + "asset": 22418.586114030593, + "cumulative_gap": 6700.137249208577, + "expense": 3317.610534298208, + "gap": 917.6105342982082, + "income": 2400.0 + }, + { + "age": 83, + "asset": 22146.004847124357, + "cumulative_gap": 7684.099994192749, + "expense": 3383.9627449841723, + "gap": 983.9627449841723, + "income": 2400.0 + }, + { + "age": 84, + "asset": 21796.90336520439, + "cumulative_gap": 8735.741994076605, + "expense": 3451.641999883856, + "gap": 1051.641999883856, + "income": 2400.0 + }, + { + "age": 85, + "asset": 21367.61920628015, + "cumulative_gap": 9856.416833958137, + "expense": 3520.674839881533, + "gap": 1120.674839881533, + "income": 2400.0 + }, + { + "age": 86, + "asset": 20854.352697390575, + "cumulative_gap": 11047.505170637301, + "expense": 3591.0883366791636, + "gap": 1191.0883366791636, + "income": 2400.0 + }, + { + "age": 87, + "asset": 20253.162291532753, + "cumulative_gap": 12310.415274050049, + "expense": 3662.910103412747, + "gap": 1262.910103412747, + "income": 2400.0 + }, + { + "age": 88, + "asset": 19559.959753763607, + "cumulative_gap": 13646.58357953105, + "expense": 3736.168305481002, + "gap": 1336.1683054810019, + "income": 2400.0 + }, + { + "age": 89, + "asset": 18770.505191731085, + "cumulative_gap": 15057.475251121672, + "expense": 3810.891671590622, + "gap": 1410.891671590622, + "income": 2400.0 + }, + { + "age": 90, + "asset": 17880.401925744674, + "cumulative_gap": 16544.584756144108, + "expense": 3887.1095050224344, + "gap": 1487.1095050224344, + "income": 2400.0 + }, + { + "age": 91, + "asset": 16885.091193343906, + "cumulative_gap": 18109.436451266993, + "expense": 3964.851695122883, + "gap": 1564.851695122883, + "income": 2400.0 + }, + { + "age": 92, + "asset": 15779.846683167654, + "cumulative_gap": 19753.585180292335, + "expense": 4044.148729025341, + "gap": 1644.1487290253408, + "income": 2400.0 + }, + { + "age": 93, + "asset": 14559.768892766584, + "cumulative_gap": 21478.616883898183, + "expense": 4125.031703605848, + "gap": 1725.0317036058477, + "income": 2400.0 + }, + { + "age": 94, + "asset": 13219.779304835558, + "cumulative_gap": 23286.149221576146, + "expense": 4207.532337677965, + "gap": 1807.5323376779652, + "income": 2400.0 + }, + { + "age": 95, + "asset": 11754.614376172321, + "cumulative_gap": 25177.83220600767, + "expense": 4291.682984431524, + "gap": 1891.6829844315243, + "income": 2400.0 + }, + { + "age": 96, + "asset": 10158.81933349302, + "cumulative_gap": 27155.348850127826, + "expense": 4377.5166441201545, + "gap": 1977.5166441201545, + "income": 2400.0 + }, + { + "age": 97, + "asset": 8426.741770054052, + "cumulative_gap": 29220.415827130382, + "expense": 4465.066977002558, + "gap": 2065.066977002558, + "income": 2400.0 + }, + { + "age": 98, + "asset": 6552.525036843039, + "cumulative_gap": 31374.78414367299, + "expense": 4554.368316542609, + "gap": 2154.368316542609, + "income": 2400.0 + }, + { + "age": 99, + "asset": 4530.101421909442, + "cumulative_gap": 33620.23982654645, + "expense": 4645.455682873461, + "gap": 2245.4556828734612, + "income": 2400.0 + }, + { + "age": 100, + "asset": 2353.1851112070603, + "cumulative_gap": 35958.60462307738, + "expense": 4738.36479653093, + "gap": 2338.36479653093, + "income": 2400.0 + } + ] + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/recommendations_sufficient.json b/fastapi/tests/golden/recommendations_sufficient.json new file mode 100644 index 0000000..6b69709 --- /dev/null +++ b/fastapi/tests/golden/recommendations_sufficient.json @@ -0,0 +1,303 @@ +{ + "body": { + "current_age": 65, + "depletion_age": null, + "recommendation_type": "SUFFICIENT", + "required_income": 0.0, + "required_saving": 0.0, + "status": "SUFFICIENT", + "target_age": 84, + "target_status": "SUFFICIENT", + "timeline": [ + { + "age": 65, + "asset": 10000.0, + "cumulative_gap": -600.0, + "expense": 1800.0, + "gap": -600.0, + "income": 2400.0 + }, + { + "age": 66, + "asset": 10918.0, + "cumulative_gap": -1164.0, + "expense": 1836.0, + "gap": -564.0, + "income": 2400.0 + }, + { + "age": 67, + "asset": 11826.460000000001, + "cumulative_gap": -1691.28, + "expense": 1872.72, + "gap": -527.28, + "income": 2400.0 + }, + { + "age": 68, + "asset": 12724.352200000001, + "cumulative_gap": -2181.1056, + "expense": 1910.1744, + "gap": -489.8255999999999, + "income": 2400.0 + }, + { + "age": 69, + "asset": 13610.603134, + "cumulative_gap": -2632.727712, + "expense": 1948.3778880000002, + "gap": -451.6221119999998, + "income": 2400.0 + }, + { + "age": 70, + "asset": 14484.092003380001, + "cumulative_gap": -3045.38226624, + "expense": 1987.3454457600003, + "gap": -412.6545542399997, + "income": 2400.0 + }, + { + "age": 71, + "asset": 15343.648954348602, + "cumulative_gap": -3418.2899115647997, + "expense": 2027.0923546752003, + "gap": -372.90764532479966, + "income": 2400.0 + }, + { + "age": 72, + "asset": 16188.053297663604, + "cumulative_gap": -3750.6557097960954, + "expense": 2067.6342017687043, + "gap": -332.3657982312957, + "income": 2400.0 + }, + { + "age": 73, + "asset": 17016.031668771746, + "cumulative_gap": -4041.6688239920168, + "expense": 2108.9868858040786, + "gap": -291.0131141959214, + "income": 2400.0 + }, + { + "age": 74, + "asset": 17826.256126456698, + "cumulative_gap": -4290.502200471857, + "expense": 2151.16662352016, + "gap": -248.8333764798399, + "income": 2400.0 + }, + { + "age": 75, + "asset": 18617.342188024635, + "cumulative_gap": -4496.312244481293, + "expense": 2194.1899559905632, + "gap": -205.81004400943675, + "income": 2400.0 + }, + { + "age": 76, + "asset": 19387.846798995095, + "cumulative_gap": -4658.238489370919, + "expense": 2238.0737551103743, + "gap": -161.92624488962565, + "income": 2400.0 + }, + { + "age": 77, + "asset": 20136.266235201263, + "cumulative_gap": -4775.403259158336, + "expense": 2282.835230212582, + "gap": -117.16476978741821, + "income": 2400.0 + }, + { + "age": 78, + "asset": 20861.03393513834, + "cumulative_gap": -4846.911324341503, + "expense": 2328.4919348168337, + "gap": -71.50806518316631, + "income": 2400.0 + }, + { + "age": 79, + "asset": 21560.518260331155, + "cumulative_gap": -4871.849550828332, + "expense": 2375.0617735131705, + "gap": -24.938226486829535, + "income": 2400.0 + }, + { + "age": 80, + "asset": 22233.020181422526, + "cumulative_gap": -4849.286541844898, + "expense": 2422.563008983434, + "gap": 22.563008983433974, + "income": 2400.0 + }, + { + "age": 81, + "asset": 22876.770887612263, + "cumulative_gap": -4778.272272681796, + "expense": 2471.0142691631027, + "gap": 71.01426916310265, + "income": 2400.0 + }, + { + "age": 82, + "asset": 23489.929317002636, + "cumulative_gap": -4657.837718135431, + "expense": 2520.434554546365, + "gap": 120.43455454636478, + "income": 2400.0 + }, + { + "age": 83, + "asset": 24070.57960532996, + "cumulative_gap": -4486.994472498139, + "expense": 2570.843245637292, + "gap": 170.84324563729206, + "income": 2400.0 + }, + { + "age": 84, + "asset": 24616.728450483446, + "cumulative_gap": -4264.734361948101, + "expense": 2622.260110550038, + "gap": 222.260110550038, + "income": 2400.0 + }, + { + "age": 85, + "asset": 25126.30239013141, + "cumulative_gap": -3990.029049187062, + "expense": 2674.705312761039, + "gap": 274.70531276103884, + "income": 2400.0 + }, + { + "age": 86, + "asset": 25597.144989691486, + "cumulative_gap": -3661.8296301708024, + "expense": 2728.1994190162595, + "gap": 328.1994190162595, + "income": 2400.0 + }, + { + "age": 87, + "asset": 26027.013937795484, + "cumulative_gap": -3279.0662227742177, + "expense": 2782.7634073965846, + "gap": 382.7634073965846, + "income": 2400.0 + }, + { + "age": 88, + "asset": 26413.578046310868, + "cumulative_gap": -2840.6475472297016, + "expense": 2838.418675544516, + "gap": 438.4186755445162, + "income": 2400.0 + }, + { + "age": 89, + "asset": 26754.414151889345, + "cumulative_gap": -2345.460498174295, + "expense": 2895.1870490554065, + "gap": 495.18704905540653, + "income": 2400.0 + }, + { + "age": 90, + "asset": 27047.00391591896, + "cumulative_gap": -1792.3697081377804, + "expense": 2953.0907900365146, + "gap": 553.0907900365146, + "income": 2400.0 + }, + { + "age": 91, + "asset": 27288.730519658915, + "cumulative_gap": -1180.2171023005353, + "expense": 3012.152605837245, + "gap": 612.1526058372451, + "income": 2400.0 + }, + { + "age": 92, + "asset": 27476.87525123632, + "cumulative_gap": -507.8214443465454, + "expense": 3072.39565795399, + "gap": 672.3956579539899, + "income": 2400.0 + }, + { + "age": 93, + "asset": 27608.6139810808, + "cumulative_gap": 226.02212676652425, + "expense": 3133.8435711130696, + "gap": 733.8435711130696, + "income": 2400.0 + }, + { + "age": 94, + "asset": 27681.013522266763, + "cumulative_gap": 1022.5425693018551, + "expense": 3196.520442535331, + "gap": 796.5204425353309, + "income": 2400.0 + }, + { + "age": 95, + "asset": 27691.027872123377, + "cumulative_gap": 1882.9934206878925, + "expense": 3260.4508513860374, + "gap": 860.4508513860374, + "income": 2400.0 + }, + { + "age": 96, + "asset": 27635.49433135946, + "cumulative_gap": 2808.6532891016504, + "expense": 3325.659868413758, + "gap": 925.659868413758, + "income": 2400.0 + }, + { + "age": 97, + "asset": 27511.129496834074, + "cumulative_gap": 3800.8263548836835, + "expense": 3392.173065782033, + "gap": 992.1730657820331, + "income": 2400.0 + }, + { + "age": 98, + "asset": 27314.525123983603, + "cumulative_gap": 4860.842881981357, + "expense": 3460.0165270976736, + "gap": 1060.0165270976736, + "income": 2400.0 + }, + { + "age": 99, + "asset": 27042.14385479251, + "cumulative_gap": 5990.059739620984, + "expense": 3529.216857639627, + "gap": 1129.216857639627, + "income": 2400.0 + }, + { + "age": 100, + "asset": 26690.314807067472, + "cumulative_gap": 7189.860934413404, + "expense": 3599.8011947924197, + "gap": 1199.8011947924197, + "income": 2400.0 + } + ] + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/reduction_capped.json b/fastapi/tests/golden/reduction_capped.json new file mode 100644 index 0000000..1b395d1 --- /dev/null +++ b/fastapi/tests/golden/reduction_capped.json @@ -0,0 +1,343 @@ +{ + "body": { + "current_age": 60, + "depletion_age": 67, + "full_payment_income_threshold": 309.7, + "monthly_reduction": 75.0, + "reduced_monthly_pension": 75.0, + "reemployment_income": 99999.0, + "status": "INSUFFICIENT", + "target_age": 84, + "timeline": [ + { + "age": 60, + "asset": 10000.0, + "cumulative_gap": 1500.0, + "expense": 2400.0, + "gap": 1500.0, + "income": 900.0 + }, + { + "age": 61, + "asset": 8755.0, + "cumulative_gap": 3048.0, + "expense": 2448.0, + "gap": 1548.0, + "income": 900.0 + }, + { + "age": 62, + "asset": 7423.21, + "cumulative_gap": 4644.96, + "expense": 2496.96, + "gap": 1596.96, + "income": 900.0 + }, + { + "age": 63, + "asset": 6001.0375, + "cumulative_gap": 6291.859200000001, + "expense": 2546.8992000000003, + "gap": 1646.8992000000003, + "income": 900.0 + }, + { + "age": 64, + "asset": 4484.762449000001, + "cumulative_gap": 7989.696384000001, + "expense": 2597.8371840000004, + "gap": 1697.8371840000004, + "income": 900.0 + }, + { + "age": 65, + "asset": 2870.5330229500005, + "cumulative_gap": 9739.490311680001, + "expense": 2649.7939276800007, + "gap": 1749.7939276800007, + "income": 900.0 + }, + { + "age": 66, + "asset": 1154.3612681280997, + "cumulative_gap": 11542.280117913602, + "expense": 2702.7898062336008, + "gap": 1802.7898062336008, + "income": 900.0 + }, + { + "age": 67, + "asset": -667.8813942486661, + "cumulative_gap": 13399.125720271875, + "expense": 2756.845602358273, + "gap": 1856.845602358273, + "income": 900.0 + }, + { + "age": 68, + "asset": -2600.4688065051473, + "cumulative_gap": 15311.108234677315, + "expense": 2811.9825144054385, + "gap": 1911.9825144054385, + "income": 900.0 + }, + { + "age": 69, + "asset": -4647.824860537904, + "cumulative_gap": 17279.33039937086, + "expense": 2868.2221646935473, + "gap": 1968.2221646935473, + "income": 900.0 + }, + { + "age": 70, + "asset": -6814.528435988395, + "cumulative_gap": 19304.91700735828, + "expense": 2925.586607987418, + "gap": 2025.5866079874181, + "income": 900.0 + }, + { + "age": 71, + "asset": -9105.318495295087, + "cumulative_gap": 21389.015347505447, + "expense": 2984.0983401471667, + "gap": 2084.0983401471667, + "income": 900.0 + }, + { + "age": 72, + "asset": -11525.099340505523, + "cumulative_gap": 23532.795654455556, + "expense": 3043.78030695011, + "gap": 2143.78030695011, + "income": 900.0 + }, + { + "age": 73, + "asset": -14078.946036879302, + "cumulative_gap": 25737.451567544667, + "expense": 3104.6559130891123, + "gap": 2204.6559130891123, + "income": 900.0 + }, + { + "age": 74, + "asset": -16772.11000846747, + "cumulative_gap": 28004.20059889556, + "expense": 3166.7490313508947, + "gap": 2266.7490313508947, + "income": 900.0 + }, + { + "age": 75, + "asset": -19610.024811012914, + "cumulative_gap": 30334.284610873474, + "expense": 3230.0840119779127, + "gap": 2330.0840119779127, + "income": 900.0 + }, + { + "age": 76, + "asset": -22598.31208768055, + "cumulative_gap": 32728.970303090944, + "expense": 3294.685692217471, + "gap": 2394.685692217471, + "income": 900.0 + }, + { + "age": 77, + "asset": -25742.78771329496, + "cumulative_gap": 35189.549709152765, + "expense": 3360.5794060618205, + "gap": 2460.5794060618205, + "income": 900.0 + }, + { + "age": 78, + "asset": -29049.468132937487, + "cumulative_gap": 37717.34070333582, + "expense": 3427.790994183057, + "gap": 2527.790994183057, + "income": 900.0 + }, + { + "age": 79, + "asset": -32524.576900934164, + "cumulative_gap": 40313.68751740254, + "expense": 3496.3468140667183, + "gap": 2596.3468140667183, + "income": 900.0 + }, + { + "age": 80, + "asset": -36174.55142645091, + "cumulative_gap": 42979.961267750594, + "expense": 3566.2737503480525, + "gap": 2666.2737503480525, + "income": 900.0 + }, + { + "age": 81, + "asset": -40006.049932102935, + "cumulative_gap": 45717.56049310561, + "expense": 3637.5992253550135, + "gap": 2737.5992253550135, + "income": 900.0 + }, + { + "age": 82, + "asset": -44025.95863218169, + "cumulative_gap": 48527.91170296772, + "expense": 3710.3512098621136, + "gap": 2810.3512098621136, + "income": 900.0 + }, + { + "age": 83, + "asset": -48241.39913730512, + "cumulative_gap": 51412.469937027076, + "expense": 3784.558234059356, + "gap": 2884.558234059356, + "income": 900.0 + }, + { + "age": 84, + "asset": -52659.73609250541, + "cumulative_gap": 54372.719335767615, + "expense": 3860.2493987405433, + "gap": 2960.2493987405433, + "income": 900.0 + }, + { + "age": 85, + "asset": -57288.585055983334, + "cumulative_gap": 57410.17372248297, + "expense": 3937.4543867153543, + "gap": 3037.4543867153543, + "income": 900.0 + }, + { + "age": 86, + "asset": -62135.82062597965, + "cumulative_gap": 60526.37719693263, + "expense": 4016.2034744496614, + "gap": 3116.2034744496614, + "income": 900.0 + }, + { + "age": 87, + "asset": -67209.5848234422, + "cumulative_gap": 63722.90474087129, + "expense": 4096.527543938655, + "gap": 3196.527543938655, + "income": 900.0 + }, + { + "age": 88, + "asset": -72518.29573840229, + "cumulative_gap": 67001.36283568872, + "expense": 4178.458094817428, + "gap": 3278.458094817428, + "income": 900.0 + }, + { + "age": 89, + "asset": -78070.65644821631, + "cumulative_gap": 70363.3900924025, + "expense": 4262.027256713776, + "gap": 3362.0272567137763, + "income": 900.0 + }, + { + "age": 90, + "asset": -83875.66421607799, + "cumulative_gap": 73810.65789425054, + "expense": 4347.267801848052, + "gap": 3447.267801848052, + "income": 900.0 + }, + { + "age": 91, + "asset": -89942.61997846382, + "cumulative_gap": 77344.87105213555, + "expense": 4434.213157885013, + "gap": 3534.213157885013, + "income": 900.0 + }, + { + "age": 92, + "asset": -96281.13813043929, + "cumulative_gap": 80967.76847317826, + "expense": 4522.897421042713, + "gap": 3622.897421042713, + "income": 900.0 + }, + { + "age": 93, + "asset": -102901.15661802646, + "cumulative_gap": 84681.12384264183, + "expense": 4613.3553694635675, + "gap": 3713.3553694635675, + "income": 900.0 + }, + { + "age": 94, + "asset": -109812.94734711474, + "cumulative_gap": 88486.74631949466, + "expense": 4705.622476852839, + "gap": 3805.622476852839, + "income": 900.0 + }, + { + "age": 95, + "asset": -117027.1269186866, + "cumulative_gap": 92386.48124588456, + "expense": 4799.734926389896, + "gap": 3899.734926389896, + "income": 900.0 + }, + { + "age": 96, + "asset": -124554.66770042879, + "cumulative_gap": 96382.21087080226, + "expense": 4895.729624917694, + "gap": 3995.7296249176943, + "income": 900.0 + }, + { + "age": 97, + "asset": -132406.9092451069, + "cumulative_gap": 100475.8550882183, + "expense": 4993.644217416048, + "gap": 4093.6442174160484, + "income": 900.0 + }, + { + "age": 98, + "asset": -140595.57006639865, + "cumulative_gap": 104669.37218998268, + "expense": 5093.51710176437, + "gap": 4193.51710176437, + "income": 900.0 + }, + { + "age": 99, + "asset": -149132.7597832079, + "cumulative_gap": 108964.75963378233, + "expense": 5195.387443799657, + "gap": 4295.387443799657, + "income": 900.0 + }, + { + "age": 100, + "asset": -158030.9916438178, + "cumulative_gap": 113364.05482645798, + "expense": 5299.2951926756505, + "gap": 4399.2951926756505, + "income": 900.0 + } + ] + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/reduction_no_reduction.json b/fastapi/tests/golden/reduction_no_reduction.json new file mode 100644 index 0000000..c9e03ba --- /dev/null +++ b/fastapi/tests/golden/reduction_no_reduction.json @@ -0,0 +1,343 @@ +{ + "body": { + "current_age": 60, + "depletion_age": 74, + "full_payment_income_threshold": 309.7, + "monthly_reduction": 0.0, + "reduced_monthly_pension": 150.0, + "reemployment_income": 0.0, + "status": "INSUFFICIENT", + "target_age": 84, + "timeline": [ + { + "age": 60, + "asset": 10000.0, + "cumulative_gap": 600.0, + "expense": 2400.0, + "gap": 600.0, + "income": 1800.0 + }, + { + "age": 61, + "asset": 9682.0, + "cumulative_gap": 1248.0, + "expense": 2448.0, + "gap": 648.0, + "income": 1800.0 + }, + { + "age": 62, + "asset": 9305.02, + "cumulative_gap": 1944.96, + "expense": 2496.96, + "gap": 696.96, + "income": 1800.0 + }, + { + "age": 63, + "asset": 8866.301800000001, + "cumulative_gap": 2691.8592000000003, + "expense": 2546.8992000000003, + "gap": 746.8992000000003, + "income": 1800.0 + }, + { + "age": 64, + "asset": 8362.984678, + "cumulative_gap": 3489.6963840000008, + "expense": 2597.8371840000004, + "gap": 797.8371840000004, + "income": 1800.0 + }, + { + "age": 65, + "asset": 7792.101918820001, + "cumulative_gap": 4339.4903116800015, + "expense": 2649.7939276800007, + "gap": 849.7939276800007, + "income": 1800.0 + }, + { + "age": 66, + "asset": 7150.5772308742, + "cumulative_gap": 5242.280117913602, + "expense": 2702.7898062336008, + "gap": 902.7898062336008, + "income": 1800.0 + }, + { + "age": 67, + "asset": 6435.221047379817, + "cumulative_gap": 6199.125720271875, + "expense": 2756.845602358273, + "gap": 956.845602358273, + "income": 1800.0 + }, + { + "age": 68, + "asset": 5642.72670837219, + "cumulative_gap": 7211.108234677314, + "expense": 2811.9825144054385, + "gap": 1011.9825144054385, + "income": 1800.0 + }, + { + "age": 69, + "asset": 4769.666519785754, + "cumulative_gap": 8279.330399370861, + "expense": 2868.2221646935473, + "gap": 1068.2221646935473, + "income": 1800.0 + }, + { + "age": 70, + "asset": 3812.4876857449726, + "cumulative_gap": 9404.917007358279, + "expense": 2925.586607987418, + "gap": 1125.5866079874181, + "income": 1800.0 + }, + { + "age": 71, + "asset": 2767.508110090281, + "cumulative_gap": 10589.015347505447, + "expense": 2984.0983401471667, + "gap": 1184.0983401471667, + "income": 1800.0 + }, + { + "age": 72, + "asset": 1630.912063041408, + "cumulative_gap": 11832.795654455556, + "expense": 3043.78030695011, + "gap": 1243.7803069501101, + "income": 1800.0 + }, + { + "age": 73, + "asset": 398.74570877403676, + "cumulative_gap": 13137.45156754467, + "expense": 3104.6559130891123, + "gap": 1304.6559130891123, + "income": 1800.0 + }, + { + "age": 74, + "asset": -933.0875104445279, + "cumulative_gap": 14504.200598895564, + "expense": 3166.7490313508947, + "gap": 1366.7490313508947, + "income": 1800.0 + }, + { + "age": 75, + "asset": -2368.8316380492856, + "cumulative_gap": 15934.284610873478, + "expense": 3230.0840119779127, + "gap": 1430.0840119779127, + "income": 1800.0 + }, + { + "age": 76, + "asset": -3912.8831195280145, + "cumulative_gap": 17428.970303090948, + "expense": 3294.685692217471, + "gap": 1494.6856922174711, + "income": 1800.0 + }, + { + "age": 77, + "asset": -5569.79587609785, + "cumulative_gap": 18989.54970915277, + "expense": 3360.5794060618205, + "gap": 1560.5794060618205, + "income": 1800.0 + }, + { + "age": 78, + "asset": -7344.28654062446, + "cumulative_gap": 20617.340703335827, + "expense": 3427.790994183057, + "gap": 1627.7909941830571, + "income": 1800.0 + }, + { + "age": 79, + "asset": -9241.239860851743, + "cumulative_gap": 22313.687517402544, + "expense": 3496.3468140667183, + "gap": 1696.3468140667183, + "income": 1800.0 + }, + { + "age": 80, + "asset": -11265.714275166014, + "cumulative_gap": 24079.961267750597, + "expense": 3566.2737503480525, + "gap": 1766.2737503480525, + "income": 1800.0 + }, + { + "age": 81, + "asset": -13422.94766627949, + "cumulative_gap": 25917.56049310561, + "expense": 3637.5992253550135, + "gap": 1837.5992253550135, + "income": 1800.0 + }, + { + "age": 82, + "asset": -15718.36329838354, + "cumulative_gap": 27827.911702967725, + "expense": 3710.3512098621136, + "gap": 1910.3512098621136, + "income": 1800.0 + }, + { + "age": 83, + "asset": -18157.575943493022, + "cumulative_gap": 29812.469937027083, + "expense": 3784.558234059356, + "gap": 1984.558234059356, + "income": 1800.0 + }, + { + "age": 84, + "asset": -20746.39820287895, + "cumulative_gap": 31872.719335767626, + "expense": 3860.2493987405433, + "gap": 2060.2493987405433, + "income": 1800.0 + }, + { + "age": 85, + "asset": -23490.84702966808, + "cumulative_gap": 34010.17372248298, + "expense": 3937.4543867153543, + "gap": 2137.4543867153543, + "income": 1800.0 + }, + { + "age": 86, + "asset": -26397.150458874938, + "cumulative_gap": 36226.37719693264, + "expense": 4016.2034744496614, + "gap": 2216.2034744496614, + "income": 1800.0 + }, + { + "age": 87, + "asset": -29471.75455132434, + "cumulative_gap": 38522.904740871294, + "expense": 4096.527543938655, + "gap": 2296.527543938655, + "income": 1800.0 + }, + { + "age": 88, + "asset": -32721.33055812088, + "cumulative_gap": 40901.36283568872, + "expense": 4178.458094817428, + "gap": 2378.458094817428, + "income": 1800.0 + }, + { + "age": 89, + "asset": -36152.78231252646, + "cumulative_gap": 43363.39009240249, + "expense": 4262.027256713776, + "gap": 2462.0272567137763, + "income": 1800.0 + }, + { + "age": 90, + "asset": -39773.25385631745, + "cumulative_gap": 45910.657894250544, + "expense": 4347.267801848052, + "gap": 2547.267801848052, + "income": 1800.0 + }, + { + "age": 91, + "asset": -43590.13730791047, + "cumulative_gap": 48544.87105213555, + "expense": 4434.213157885013, + "gap": 2634.213157885013, + "income": 1800.0 + }, + { + "age": 92, + "asset": -47611.080979769344, + "cumulative_gap": 51267.768473178265, + "expense": 4522.897421042713, + "gap": 2722.897421042713, + "income": 1800.0 + }, + { + "age": 93, + "asset": -51843.99775283642, + "cumulative_gap": 54081.123842641835, + "expense": 4613.3553694635675, + "gap": 2813.3553694635675, + "income": 1800.0 + }, + { + "age": 94, + "asset": -56297.07371596899, + "cumulative_gap": 56986.746319494676, + "expense": 4705.622476852839, + "gap": 2905.622476852839, + "income": 1800.0 + }, + { + "age": 95, + "asset": -60978.77707860649, + "cumulative_gap": 59986.48124588457, + "expense": 4799.734926389896, + "gap": 2999.734926389896, + "income": 1800.0 + }, + { + "age": 96, + "asset": -65897.86736514627, + "cumulative_gap": 63082.210870802264, + "expense": 4895.729624917694, + "gap": 3095.7296249176943, + "income": 1800.0 + }, + { + "age": 97, + "asset": -71063.40489976588, + "cumulative_gap": 66275.85508821832, + "expense": 4993.644217416048, + "gap": 3193.6442174160484, + "income": 1800.0 + }, + { + "age": 98, + "asset": -76484.76059069739, + "cumulative_gap": 69569.37218998269, + "expense": 5093.51710176437, + "gap": 3293.5171017643697, + "income": 1800.0 + }, + { + "age": 99, + "asset": -82171.62602323561, + "cumulative_gap": 72964.75963378235, + "expense": 5195.387443799657, + "gap": 3395.3874437996574, + "income": 1800.0 + }, + { + "age": 100, + "asset": -88134.02387104633, + "cumulative_gap": 76464.054826458, + "expense": 5299.2951926756505, + "gap": 3499.2951926756505, + "income": 1800.0 + } + ] + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/reduction_partial.json b/fastapi/tests/golden/reduction_partial.json new file mode 100644 index 0000000..6bb4c17 --- /dev/null +++ b/fastapi/tests/golden/reduction_partial.json @@ -0,0 +1,343 @@ +{ + "body": { + "current_age": 60, + "depletion_age": 72, + "full_payment_income_threshold": 309.7, + "monthly_reduction": 14.03, + "reduced_monthly_pension": 135.97, + "reemployment_income": 500.0, + "status": "INSUFFICIENT", + "target_age": 84, + "timeline": [ + { + "age": 60, + "asset": 10000.0, + "cumulative_gap": 768.3600000000001, + "expense": 2400.0, + "gap": 768.3600000000001, + "income": 1631.6399999999999 + }, + { + "age": 61, + "asset": 9508.5892, + "cumulative_gap": 1584.7200000000003, + "expense": 2448.0, + "gap": 816.3600000000001, + "income": 1631.6399999999999 + }, + { + "age": 62, + "asset": 8952.996076, + "cumulative_gap": 2450.0400000000004, + "expense": 2496.96, + "gap": 865.3200000000002, + "income": 1631.6399999999999 + }, + { + "age": 63, + "asset": 8330.30635828, + "cumulative_gap": 3365.299200000001, + "expense": 2546.8992000000003, + "gap": 915.2592000000004, + "income": 1631.6399999999999 + }, + { + "age": 64, + "asset": 7637.498573028401, + "cumulative_gap": 4331.496384000002, + "expense": 2597.8371840000004, + "gap": 966.1971840000006, + "income": 1631.6399999999999 + }, + { + "age": 65, + "asset": 6871.440430699252, + "cumulative_gap": 5349.650311680003, + "expense": 2649.7939276800007, + "gap": 1018.1539276800008, + "income": 1631.6399999999999 + }, + { + "age": 66, + "asset": 6028.885098109829, + "cumulative_gap": 6420.8001179136045, + "expense": 2702.7898062336008, + "gap": 1071.1498062336009, + "income": 1631.6399999999999 + }, + { + "age": 67, + "asset": 5106.467350632515, + "cumulative_gap": 7546.005720271878, + "expense": 2756.845602358273, + "gap": 1125.2056023582732, + "income": 1631.6399999999999 + }, + { + "age": 68, + "asset": 4100.69960072247, + "cumulative_gap": 8726.348234677316, + "expense": 2811.9825144054385, + "gap": 1180.3425144054386, + "income": 1631.6399999999999 + }, + { + "age": 69, + "asset": 3007.967798906542, + "cumulative_gap": 9962.930399370864, + "expense": 2868.2221646935473, + "gap": 1236.5821646935474, + "income": 1631.6399999999999 + }, + { + "age": 70, + "asset": 1824.5272032393846, + "cumulative_gap": 11256.877007358282, + "expense": 2925.586607987418, + "gap": 1293.9466079874182, + "income": 1631.6399999999999 + }, + { + "age": 71, + "asset": 546.4980131095253, + "cumulative_gap": 12609.335347505448, + "expense": 2984.0983401471667, + "gap": 1352.4583401471668, + "income": 1631.6399999999999 + }, + { + "age": 72, + "asset": -830.1391368487707, + "cumulative_gap": 14021.475654455558, + "expense": 3043.78030695011, + "gap": 1412.1403069501102, + "income": 1631.6399999999999 + }, + { + "age": 73, + "asset": -2309.5478271128472, + "cumulative_gap": 15494.491567544672, + "expense": 3104.6559130891123, + "gap": 1473.0159130891125, + "income": 1631.6399999999999 + }, + { + "age": 74, + "asset": -3896.0406524080186, + "cumulative_gap": 17029.600598895566, + "expense": 3166.7490313508947, + "gap": 1535.1090313508948, + "income": 1631.6399999999999 + }, + { + "age": 75, + "asset": -5594.08417427168, + "cumulative_gap": 18628.04461087348, + "expense": 3230.0840119779127, + "gap": 1598.4440119779129, + "income": 1631.6399999999999 + }, + { + "age": 76, + "asset": -7408.304031837081, + "cumulative_gap": 20291.09030309095, + "expense": 3294.685692217471, + "gap": 1663.0456922174712, + "income": 1631.6399999999999 + }, + { + "age": 77, + "asset": -9343.49021577619, + "cumulative_gap": 22020.029709152772, + "expense": 3360.5794060618205, + "gap": 1728.9394060618206, + "income": 1631.6399999999999 + }, + { + "age": 78, + "asset": -11404.602510493152, + "cumulative_gap": 23816.180703335827, + "expense": 3427.790994183057, + "gap": 1796.1509941830573, + "income": 1631.6399999999999 + }, + { + "age": 79, + "asset": -13596.776109816496, + "cumulative_gap": 25680.887517402545, + "expense": 3496.3468140667183, + "gap": 1864.7068140667184, + "income": 1631.6399999999999 + }, + { + "age": 80, + "asset": -15925.32741159971, + "cumulative_gap": 27615.5212677506, + "expense": 3566.2737503480525, + "gap": 1934.6337503480527, + "income": 1631.6399999999999 + }, + { + "age": 81, + "asset": -18395.759996806195, + "cumulative_gap": 29621.480493105613, + "expense": 3637.5992253550135, + "gap": 2005.9592253550136, + "income": 1631.6399999999999 + }, + { + "age": 82, + "asset": -21013.770798826044, + "cumulative_gap": 31700.191702967728, + "expense": 3710.3512098621136, + "gap": 2078.7112098621137, + "income": 1631.6399999999999 + }, + { + "age": 83, + "asset": -23785.256468948806, + "cumulative_gap": 33853.10993702708, + "expense": 3784.558234059356, + "gap": 2152.918234059356, + "income": 1631.6399999999999 + }, + { + "age": 84, + "asset": -26716.319944098406, + "cumulative_gap": 36081.71933576762, + "expense": 3860.2493987405433, + "gap": 2228.6093987405434, + "income": 1631.6399999999999 + }, + { + "age": 85, + "asset": -29813.277223124118, + "cumulative_gap": 38387.53372248298, + "expense": 3937.4543867153543, + "gap": 2305.8143867153544, + "income": 1631.6399999999999 + }, + { + "age": 86, + "asset": -33082.66435813466, + "cumulative_gap": 40772.09719693264, + "expense": 4016.2034744496614, + "gap": 2384.5634744496615, + "income": 1631.6399999999999 + }, + { + "age": 87, + "asset": -36531.244667561856, + "cumulative_gap": 43236.984740871296, + "expense": 4096.527543938655, + "gap": 2464.887543938655, + "income": 1631.6399999999999 + }, + { + "age": 88, + "asset": -40166.01617784553, + "cumulative_gap": 45783.80283568872, + "expense": 4178.458094817428, + "gap": 2546.818094817428, + "income": 1631.6399999999999 + }, + { + "age": 89, + "asset": -43994.219300842844, + "cumulative_gap": 48414.190092402496, + "expense": 4262.027256713776, + "gap": 2630.3872567137764, + "income": 1631.6399999999999 + }, + { + "age": 90, + "asset": -48023.34475428332, + "cumulative_gap": 51129.81789425055, + "expense": 4347.267801848052, + "gap": 2715.627801848052, + "income": 1631.6399999999999 + }, + { + "age": 91, + "asset": -52261.14173281531, + "cumulative_gap": 53932.39105213556, + "expense": 4434.213157885013, + "gap": 2802.573157885013, + "income": 1631.6399999999999 + }, + { + "age": 92, + "asset": -56715.62633742133, + "cumulative_gap": 56823.64847317827, + "expense": 4522.897421042713, + "gap": 2891.2574210427133, + "income": 1631.6399999999999 + }, + { + "age": 93, + "asset": -61395.09027121797, + "cumulative_gap": 59805.36384264184, + "expense": 4613.3553694635675, + "gap": 2981.7153694635676, + "income": 1631.6399999999999 + }, + { + "age": 94, + "asset": -66308.10980990199, + "cumulative_gap": 62879.34631949468, + "expense": 4705.622476852839, + "gap": 3073.982476852839, + "income": 1631.6399999999999 + }, + { + "age": 95, + "asset": -71463.55505535747, + "cumulative_gap": 66047.44124588458, + "expense": 4799.734926389896, + "gap": 3168.094926389896, + "income": 1631.6399999999999 + }, + { + "age": 96, + "asset": -76870.5994811998, + "cumulative_gap": 69311.53087080226, + "expense": 4895.729624917694, + "gap": 3264.0896249176944, + "income": 1631.6399999999999 + }, + { + "age": 97, + "asset": -82538.72977930101, + "cumulative_gap": 72673.53508821831, + "expense": 4993.644217416048, + "gap": 3362.0042174160485, + "income": 1631.6399999999999 + }, + { + "age": 98, + "asset": -88477.75601661857, + "cumulative_gap": 76135.41218998269, + "expense": 5093.51710176437, + "gap": 3461.87710176437, + "income": 1631.6399999999999 + }, + { + "age": 99, + "asset": -94697.82211193444, + "cumulative_gap": 79699.15963378234, + "expense": 5195.387443799657, + "gap": 3563.7474437996575, + "income": 1631.6399999999999 + }, + { + "age": 100, + "asset": -101209.41664240613, + "cumulative_gap": 83366.814826458, + "expense": 5299.2951926756505, + "gap": 3667.6551926756506, + "income": 1631.6399999999999 + } + ] + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/scenarios_basic.json b/fastapi/tests/golden/scenarios_basic.json new file mode 100644 index 0000000..e3cab68 --- /dev/null +++ b/fastapi/tests/golden/scenarios_basic.json @@ -0,0 +1,1353 @@ +{ + "body": { + "best_scenario": "NORMAL", + "current_age": 60, + "scenarios": [ + { + "break_even_age": null, + "depletion_age": 68, + "scenario_type": "NORMAL", + "timeline": [ + { + "age": 60, + "asset": 10000.0, + "cumulative_gap": 1200.0, + "expense": 3000.0, + "gap": 1200.0, + "income": 1800.0 + }, + { + "age": 61, + "asset": 9064.0, + "cumulative_gap": 2460.0, + "expense": 3060.0, + "gap": 1260.0, + "income": 1800.0 + }, + { + "age": 62, + "asset": 8038.12, + "cumulative_gap": 3781.2000000000003, + "expense": 3121.2000000000003, + "gap": 1321.2000000000003, + "income": 1800.0 + }, + { + "age": 63, + "asset": 6918.4276, + "cumulative_gap": 5164.8240000000005, + "expense": 3183.6240000000003, + "gap": 1383.6240000000003, + "income": 1800.0 + }, + { + "age": 64, + "asset": 5700.847707999999, + "cumulative_gap": 6612.120480000001, + "expense": 3247.2964800000004, + "gap": 1447.2964800000004, + "income": 1800.0 + }, + { + "age": 65, + "asset": 4381.157764839999, + "cumulative_gap": 8124.362889600002, + "expense": 3312.2424096000004, + "gap": 1512.2424096000004, + "income": 1800.0 + }, + { + "age": 66, + "asset": 2954.9828158971986, + "cumulative_gap": 9702.850147392002, + "expense": 3378.4872577920005, + "gap": 1578.4872577920005, + "income": 1800.0 + }, + { + "age": 67, + "asset": 1417.7904248483542, + "cumulative_gap": 11348.907150339843, + "expense": 3446.0570029478404, + "gap": 1646.0570029478404, + "income": 1800.0 + }, + { + "age": 68, + "asset": -235.1145754424708, + "cumulative_gap": 13063.88529334664, + "expense": 3514.9781430067974, + "gap": 1714.9781430067974, + "income": 1800.0 + }, + { + "age": 69, + "asset": -2008.5955000027463, + "cumulative_gap": 14849.162999213575, + "expense": 3585.2777058669335, + "gap": 1785.2777058669335, + "income": 1800.0 + }, + { + "age": 70, + "asset": -3907.6894020457703, + "cumulative_gap": 16706.14625919785, + "expense": 3656.983259984272, + "gap": 1856.983259984272, + "income": 1800.0 + }, + { + "age": 71, + "asset": -5937.612841890944, + "cumulative_gap": 18636.269184381807, + "expense": 3730.1229251839577, + "gap": 1930.1229251839577, + "income": 1800.0 + }, + { + "age": 72, + "asset": -8103.767840087149, + "cumulative_gap": 20640.994568069444, + "expense": 3804.725383687637, + "gap": 2004.725383687637, + "income": 1800.0 + }, + { + "age": 73, + "asset": -10411.748020488028, + "cumulative_gap": 22721.814459430832, + "expense": 3880.81989136139, + "gap": 2080.81989136139, + "income": 1800.0 + }, + { + "age": 74, + "asset": -12867.344949204902, + "cumulative_gap": 24880.25074861945, + "expense": 3958.436289188618, + "gap": 2158.436289188618, + "income": 1800.0 + }, + { + "age": 75, + "asset": -15476.554675545325, + "cumulative_gap": 27117.85576359184, + "expense": 4037.6050149723906, + "gap": 2237.6050149723906, + "income": 1800.0 + }, + { + "age": 76, + "asset": -18245.584481233247, + "cumulative_gap": 29436.21287886368, + "expense": 4118.357115271839, + "gap": 2318.3571152718387, + "income": 1800.0 + }, + { + "age": 77, + "asset": -21180.85984440024, + "cumulative_gap": 31836.937136440956, + "expense": 4200.724257577275, + "gap": 2400.7242575772752, + "income": 1800.0 + }, + { + "age": 78, + "asset": -24289.03162503684, + "cumulative_gap": 34321.67587916978, + "expense": 4284.73874272882, + "gap": 2484.7387427288204, + "income": 1800.0 + }, + { + "age": 79, + "asset": -27576.983478798633, + "cumulative_gap": 36892.10939675318, + "expense": 4370.433517583397, + "gap": 2570.4335175833967, + "income": 1800.0 + }, + { + "age": 80, + "asset": -31051.839506273493, + "cumulative_gap": 39549.95158468824, + "expense": 4457.842187935064, + "gap": 2657.8421879350644, + "income": 1800.0 + }, + { + "age": 81, + "asset": -34720.972145034815, + "cumulative_gap": 42296.950616382004, + "expense": 4546.999031693766, + "gap": 2746.9990316937656, + "income": 1800.0 + }, + { + "age": 82, + "asset": -38592.010312030434, + "cumulative_gap": 45134.88962870964, + "expense": 4637.939012327641, + "gap": 2837.9390123276407, + "income": 1800.0 + }, + { + "age": 83, + "asset": -42672.847804088815, + "cumulative_gap": 48065.58742128384, + "expense": 4730.697792574194, + "gap": 2930.697792574194, + "income": 1800.0 + }, + { + "age": 84, + "asset": -46971.6519645629, + "cumulative_gap": 51090.89916970952, + "expense": 4825.311748425678, + "gap": 3025.311748425678, + "income": 1800.0 + }, + { + "age": 85, + "asset": -51496.87262437824, + "cumulative_gap": 54212.71715310371, + "expense": 4921.817983394192, + "gap": 3121.817983394192, + "income": 1800.0 + }, + { + "age": 86, + "asset": -56257.2513260056, + "cumulative_gap": 57432.97149616579, + "expense": 5020.254343062076, + "gap": 3220.2543430620763, + "income": 1800.0 + }, + { + "age": 87, + "asset": -61261.83083913971, + "cumulative_gap": 60753.63092608911, + "expense": 5120.6594299233175, + "gap": 3320.6594299233175, + "income": 1800.0 + }, + { + "age": 88, + "asset": -66519.96497713492, + "cumulative_gap": 64176.70354461089, + "expense": 5223.072618521784, + "gap": 3423.0726185217836, + "income": 1800.0 + }, + { + "age": 89, + "asset": -72041.3287235264, + "cumulative_gap": 67704.23761550311, + "expense": 5327.5340708922195, + "gap": 3527.5340708922195, + "income": 1800.0 + }, + { + "age": 90, + "asset": -77835.92867825118, + "cumulative_gap": 71338.32236781318, + "expense": 5434.084752310064, + "gap": 3634.084752310064, + "income": 1800.0 + }, + { + "age": 91, + "asset": -83914.11383347808, + "cumulative_gap": 75081.08881516944, + "expense": 5542.766447356265, + "gap": 3742.7664473562654, + "income": 1800.0 + }, + { + "age": 92, + "asset": -90286.58668925938, + "cumulative_gap": 78934.71059147283, + "expense": 5653.621776303391, + "gap": 3853.621776303391, + "income": 1800.0 + }, + { + "age": 93, + "asset": -96964.41471952965, + "cumulative_gap": 82901.40480330228, + "expense": 5766.694211829459, + "gap": 3966.694211829459, + "income": 1800.0 + }, + { + "age": 94, + "asset": -103959.04219929989, + "cumulative_gap": 86983.43289936833, + "expense": 5882.028096066048, + "gap": 4082.0280960660484, + "income": 1800.0 + }, + { + "age": 95, + "asset": -111282.30240422691, + "cumulative_gap": 91183.1015573557, + "expense": 5999.668657987369, + "gap": 4199.668657987369, + "income": 1800.0 + }, + { + "age": 96, + "asset": -118946.4301940807, + "cumulative_gap": 95502.76358850281, + "expense": 6119.662031147117, + "gap": 4319.662031147117, + "income": 1800.0 + }, + { + "age": 97, + "asset": -126964.07499198466, + "cumulative_gap": 99944.81886027288, + "expense": 6242.055271770059, + "gap": 4442.055271770059, + "income": 1800.0 + }, + { + "age": 98, + "asset": -135348.31417166736, + "cumulative_gap": 104511.71523747833, + "expense": 6366.89637720546, + "gap": 4566.89637720546, + "income": 1800.0 + }, + { + "age": 99, + "asset": -144112.666865339, + "cumulative_gap": 109205.9495422279, + "expense": 6494.23430474957, + "gap": 4694.23430474957, + "income": 1800.0 + }, + { + "age": 100, + "asset": -153271.10820519124, + "cumulative_gap": 114030.06853307247, + "expense": 6624.118990844561, + "gap": 4824.118990844561, + "income": 1800.0 + } + ], + "total_received": 73800.0 + }, + { + "break_even_age": 60, + "depletion_age": 66, + "scenario_type": "EARLY", + "timeline": [ + { + "age": 60, + "asset": 10000.0, + "cumulative_gap": 1650.0, + "expense": 3000.0, + "gap": 1650.0, + "income": 1350.0 + }, + { + "age": 61, + "asset": 8600.5, + "cumulative_gap": 3360.0, + "expense": 3060.0, + "gap": 1710.0, + "income": 1350.0 + }, + { + "age": 62, + "asset": 7097.215, + "cumulative_gap": 5131.200000000001, + "expense": 3121.2000000000003, + "gap": 1771.2000000000003, + "income": 1350.0 + }, + { + "age": 63, + "asset": 5485.79545, + "cumulative_gap": 6964.8240000000005, + "expense": 3183.6240000000003, + "gap": 1833.6240000000003, + "income": 1350.0 + }, + { + "age": 64, + "asset": 3761.7365934999993, + "cumulative_gap": 8862.120480000001, + "expense": 3247.2964800000004, + "gap": 1897.2964800000004, + "income": 1350.0 + }, + { + "age": 65, + "asset": 1920.373316904999, + "cumulative_gap": 10824.362889600001, + "expense": 3312.2424096000004, + "gap": 1962.2424096000004, + "income": 1350.0 + }, + { + "age": 66, + "asset": -43.125165475851475, + "cumulative_gap": 12852.850147392, + "expense": 3378.4872577920005, + "gap": 2028.4872577920005, + "income": 1350.0 + }, + { + "age": 67, + "asset": -2133.7607959658876, + "cumulative_gap": 14948.90715033984, + "expense": 3446.0570029478404, + "gap": 2096.0570029478404, + "income": 1350.0 + }, + { + "age": 68, + "asset": -4356.712332881139, + "cumulative_gap": 17113.885293346637, + "expense": 3514.9781430067974, + "gap": 2164.9781430067974, + "income": 1350.0 + }, + { + "age": 69, + "asset": -6717.341190164576, + "cumulative_gap": 19349.16299921357, + "expense": 3585.2777058669335, + "gap": 2235.2777058669335, + "income": 1350.0 + }, + { + "age": 70, + "asset": -9221.197462912454, + "cumulative_gap": 21656.14625919784, + "expense": 3656.983259984272, + "gap": 2306.983259984272, + "income": 1350.0 + }, + { + "age": 71, + "asset": -11874.026144583628, + "cumulative_gap": 24036.2691843818, + "expense": 3730.1229251839577, + "gap": 2380.1229251839577, + "income": 1350.0 + }, + { + "age": 72, + "asset": -14681.773541860613, + "cumulative_gap": 26490.994568069436, + "expense": 3804.725383687637, + "gap": 2454.725383687637, + "income": 1350.0 + }, + { + "age": 73, + "asset": -17650.593893314697, + "cumulative_gap": 29021.814459430825, + "expense": 3880.81989136139, + "gap": 2530.81989136139, + "income": 1350.0 + }, + { + "age": 74, + "asset": -20786.85619821637, + "cumulative_gap": 31630.250748619444, + "expense": 3958.436289188618, + "gap": 2608.436289188618, + "income": 1350.0 + }, + { + "age": 75, + "asset": -24097.15126202714, + "cumulative_gap": 34317.85576359183, + "expense": 4037.6050149723906, + "gap": 2687.6050149723906, + "income": 1350.0 + }, + { + "age": 76, + "asset": -27588.298965309514, + "cumulative_gap": 37086.21287886367, + "expense": 4118.357115271839, + "gap": 2768.3571152718387, + "income": 1350.0 + }, + { + "age": 77, + "asset": -31267.355762998795, + "cumulative_gap": 39936.937136440945, + "expense": 4200.724257577275, + "gap": 2850.7242575772752, + "income": 1350.0 + }, + { + "age": 78, + "asset": -35141.62242119335, + "cumulative_gap": 42871.675879169765, + "expense": 4284.73874272882, + "gap": 2934.7387427288204, + "income": 1350.0 + }, + { + "age": 79, + "asset": -39218.651998839836, + "cumulative_gap": 45892.10939675316, + "expense": 4370.433517583397, + "gap": 3020.4335175833967, + "income": 1350.0 + }, + { + "age": 80, + "asset": -43506.258081915934, + "cumulative_gap": 48999.95158468823, + "expense": 4457.842187935064, + "gap": 3107.8421879350644, + "income": 1350.0 + }, + { + "age": 81, + "asset": -48012.52327794653, + "cumulative_gap": 52196.95061638199, + "expense": 4546.999031693766, + "gap": 3196.9990316937656, + "income": 1350.0 + }, + { + "age": 82, + "asset": -52745.8079789295, + "cumulative_gap": 55484.88962870963, + "expense": 4637.939012327641, + "gap": 3287.9390123276407, + "income": 1350.0 + }, + { + "age": 83, + "asset": -57714.75940099486, + "cumulative_gap": 58865.587421283824, + "expense": 4730.697792574194, + "gap": 3380.697792574194, + "income": 1350.0 + }, + { + "age": 84, + "asset": -62928.320909376125, + "cumulative_gap": 62340.899169709504, + "expense": 4825.311748425678, + "gap": 3475.311748425678, + "income": 1350.0 + }, + { + "age": 85, + "asset": -68395.74163753586, + "cumulative_gap": 65912.7171531037, + "expense": 4921.817983394192, + "gap": 3571.817983394192, + "income": 1350.0 + }, + { + "age": 86, + "asset": -74126.58640955796, + "cumulative_gap": 69582.97149616577, + "expense": 5020.254343062076, + "gap": 3670.2543430620763, + "income": 1350.0 + }, + { + "age": 87, + "asset": -80130.74597519863, + "cumulative_gap": 73353.63092608908, + "expense": 5120.6594299233175, + "gap": 3770.6594299233175, + "income": 1350.0 + }, + { + "age": 88, + "asset": -86418.44756727561, + "cumulative_gap": 77226.70354461086, + "expense": 5223.072618521784, + "gap": 3873.0726185217836, + "income": 1350.0 + }, + { + "age": 89, + "asset": -93000.26579137132, + "cumulative_gap": 81204.23761550308, + "expense": 5327.5340708922195, + "gap": 3977.5340708922195, + "income": 1350.0 + }, + { + "age": 90, + "asset": -99887.13385813145, + "cumulative_gap": 85288.32236781315, + "expense": 5434.084752310064, + "gap": 4084.084752310064, + "income": 1350.0 + }, + { + "age": 91, + "asset": -107090.35516875476, + "cumulative_gap": 89481.08881516941, + "expense": 5542.766447356265, + "gap": 4192.766447356265, + "income": 1350.0 + }, + { + "age": 92, + "asset": -114621.61526459435, + "cumulative_gap": 93784.7105914728, + "expense": 5653.621776303391, + "gap": 4303.621776303391, + "income": 1350.0 + }, + { + "age": 93, + "asset": -122492.99415212468, + "cumulative_gap": 98201.40480330226, + "expense": 5766.694211829459, + "gap": 4416.694211829459, + "income": 1350.0 + }, + { + "age": 94, + "asset": -130716.97901487276, + "cumulative_gap": 102733.4328993683, + "expense": 5882.028096066048, + "gap": 4532.028096066048, + "income": 1350.0 + }, + { + "age": 95, + "asset": -139306.47732426698, + "cumulative_gap": 107383.10155735567, + "expense": 5999.668657987369, + "gap": 4649.668657987369, + "income": 1350.0 + }, + { + "age": 96, + "asset": -148274.83036172198, + "cumulative_gap": 112152.76358850278, + "expense": 6119.662031147117, + "gap": 4769.662031147117, + "income": 1350.0 + }, + { + "age": 97, + "asset": -157635.82716465517, + "cumulative_gap": 117044.81886027285, + "expense": 6242.055271770059, + "gap": 4892.055271770059, + "income": 1350.0 + }, + { + "age": 98, + "asset": -167403.71890951798, + "cumulative_gap": 122061.7152374783, + "expense": 6366.89637720546, + "gap": 5016.89637720546, + "income": 1350.0 + }, + { + "age": 99, + "asset": -177593.23374532515, + "cumulative_gap": 127205.94954222787, + "expense": 6494.23430474957, + "gap": 5144.23430474957, + "income": 1350.0 + }, + { + "age": 100, + "asset": -188219.59209157698, + "cumulative_gap": 132480.06853307242, + "expense": 6624.118990844561, + "gap": 5274.118990844561, + "income": 1350.0 + } + ], + "total_received": 55350.0 + }, + { + "break_even_age": 64, + "depletion_age": 67, + "scenario_type": "LUMP_SUM", + "timeline": [ + { + "age": 60, + "asset": 18531.25, + "cumulative_gap": 3000.0, + "expense": 3000.0, + "gap": 3000.0, + "income": 0.0 + }, + { + "age": 61, + "asset": 15997.1875, + "cumulative_gap": 6060.0, + "expense": 3060.0, + "gap": 3060.0, + "income": 0.0 + }, + { + "age": 62, + "asset": 13325.303125, + "cumulative_gap": 9181.2, + "expense": 3121.2000000000003, + "gap": 3121.2000000000003, + "income": 0.0 + }, + { + "age": 63, + "asset": 10510.22621875, + "cumulative_gap": 12364.824, + "expense": 3183.6240000000003, + "gap": 3183.6240000000003, + "income": 0.0 + }, + { + "age": 64, + "asset": 7546.4002853125, + "cumulative_gap": 15612.120480000001, + "expense": 3247.2964800000004, + "gap": 3247.2964800000004, + "income": 0.0 + }, + { + "age": 65, + "asset": 4428.076919471874, + "cumulative_gap": 18924.3628896, + "expense": 3312.2424096000004, + "gap": 3312.2424096000004, + "income": 0.0 + }, + { + "age": 66, + "asset": 1149.30954516803, + "cumulative_gap": 22302.850147392, + "expense": 3378.4872577920005, + "gap": 3378.4872577920005, + "income": 0.0 + }, + { + "age": 67, + "asset": -2296.0530440026896, + "cumulative_gap": 25748.90715033984, + "expense": 3446.0570029478404, + "gap": 3446.0570029478404, + "income": 0.0 + }, + { + "age": 68, + "asset": -5914.373348359046, + "cumulative_gap": 29263.885293346637, + "expense": 3514.9781430067974, + "gap": 3514.9781430067974, + "income": 0.0 + }, + { + "age": 69, + "asset": -9712.23203610682, + "cumulative_gap": 32849.16299921357, + "expense": 3585.2777058669335, + "gap": 3585.2777058669335, + "income": 0.0 + }, + { + "age": 70, + "asset": -13696.435034232967, + "cumulative_gap": 36506.14625919784, + "expense": 3656.983259984272, + "gap": 3656.983259984272, + "income": 0.0 + }, + { + "age": 71, + "asset": -17874.02084304376, + "cumulative_gap": 40236.2691843818, + "expense": 3730.1229251839577, + "gap": 3730.1229251839577, + "income": 0.0 + }, + { + "age": 72, + "asset": -22252.26808127455, + "cumulative_gap": 44040.994568069436, + "expense": 3804.725383687637, + "gap": 3804.725383687637, + "income": 0.0 + }, + { + "age": 73, + "asset": -26838.703268911053, + "cumulative_gap": 47921.814459430825, + "expense": 3880.81989136139, + "gap": 3880.81989136139, + "income": 0.0 + }, + { + "age": 74, + "asset": -31641.108855080616, + "cumulative_gap": 51880.250748619444, + "expense": 3958.436289188618, + "gap": 3958.436289188618, + "income": 0.0 + }, + { + "age": 75, + "asset": -36667.53149859732, + "cumulative_gap": 55917.85576359183, + "expense": 4037.6050149723906, + "gap": 4037.6050149723906, + "income": 0.0 + }, + { + "age": 76, + "asset": -41926.2906089768, + "cumulative_gap": 60036.21287886367, + "expense": 4118.357115271839, + "gap": 4118.357115271839, + "income": 0.0 + }, + { + "age": 77, + "asset": -47425.987155976094, + "cumulative_gap": 64236.937136440945, + "expense": 4200.724257577275, + "gap": 4200.724257577275, + "income": 0.0 + }, + { + "age": 78, + "asset": -53175.51275595997, + "cumulative_gap": 68521.67587916976, + "expense": 4284.73874272882, + "gap": 4284.73874272882, + "income": 0.0 + }, + { + "age": 79, + "asset": -59184.05904364945, + "cumulative_gap": 72892.10939675316, + "expense": 4370.433517583397, + "gap": 4370.433517583397, + "income": 0.0 + }, + { + "age": 80, + "asset": -65461.12733806984, + "cumulative_gap": 77349.95158468823, + "expense": 4457.842187935064, + "gap": 4457.842187935064, + "income": 0.0 + }, + { + "age": 81, + "asset": -72016.53861178506, + "cumulative_gap": 81896.95061638199, + "expense": 4546.999031693766, + "gap": 4546.999031693766, + "income": 0.0 + }, + { + "age": 82, + "asset": -78860.44377278318, + "cumulative_gap": 86534.88962870963, + "expense": 4637.939012327641, + "gap": 4637.939012327641, + "income": 0.0 + }, + { + "age": 83, + "asset": -86003.33426866416, + "cumulative_gap": 91265.58742128382, + "expense": 4730.697792574194, + "gap": 4730.697792574194, + "income": 0.0 + }, + { + "age": 84, + "asset": -93456.05302307551, + "cumulative_gap": 96090.8991697095, + "expense": 4825.311748425678, + "gap": 4825.311748425678, + "income": 0.0 + }, + { + "age": 85, + "asset": -101229.80571464622, + "cumulative_gap": 101012.7171531037, + "expense": 4921.817983394192, + "gap": 4921.817983394192, + "income": 0.0 + }, + { + "age": 86, + "asset": -109336.17240898164, + "cumulative_gap": 106032.97149616577, + "expense": 5020.254343062076, + "gap": 5020.254343062076, + "income": 0.0 + }, + { + "age": 87, + "asset": -117787.11955460503, + "cumulative_gap": 111153.63092608908, + "expense": 5120.6594299233175, + "gap": 5120.6594299233175, + "income": 0.0 + }, + { + "age": 88, + "asset": -126595.0123540642, + "cumulative_gap": 116376.70354461086, + "expense": 5223.072618521784, + "gap": 5223.072618521784, + "income": 0.0 + }, + { + "age": 89, + "asset": -135772.62752176358, + "cumulative_gap": 121704.23761550308, + "expense": 5327.5340708922195, + "gap": 5327.5340708922195, + "income": 0.0 + }, + { + "age": 90, + "asset": -145333.16644043548, + "cumulative_gap": 127138.32236781315, + "expense": 5434.084752310064, + "gap": 5434.084752310064, + "income": 0.0 + }, + { + "age": 91, + "asset": -155290.2687285279, + "cumulative_gap": 132681.0888151694, + "expense": 5542.766447356265, + "gap": 5542.766447356265, + "income": 0.0 + }, + { + "age": 92, + "asset": -165658.0262311607, + "cumulative_gap": 138334.7105914728, + "expense": 5653.621776303391, + "gap": 5653.621776303391, + "income": 0.0 + }, + { + "age": 93, + "asset": -176450.99744768802, + "cumulative_gap": 144101.40480330226, + "expense": 5766.694211829459, + "gap": 5766.694211829459, + "income": 0.0 + }, + { + "age": 94, + "asset": -187684.222409303, + "cumulative_gap": 149983.43289936832, + "expense": 5882.028096066048, + "gap": 5882.028096066048, + "income": 0.0 + }, + { + "age": 95, + "asset": -199373.23802053015, + "cumulative_gap": 155983.1015573557, + "expense": 5999.668657987369, + "gap": 5999.668657987369, + "income": 0.0 + }, + { + "age": 96, + "asset": -211534.09387887304, + "cumulative_gap": 162102.7635885028, + "expense": 6119.662031147117, + "gap": 6119.662031147117, + "income": 0.0 + }, + { + "age": 97, + "asset": -224183.36858732076, + "cumulative_gap": 168344.81886027285, + "expense": 6242.055271770059, + "gap": 6242.055271770059, + "income": 0.0 + }, + { + "age": 98, + "asset": -237338.18657486353, + "cumulative_gap": 174711.71523747832, + "expense": 6366.89637720546, + "gap": 6366.89637720546, + "income": 0.0 + }, + { + "age": 99, + "asset": -251016.23544063108, + "cumulative_gap": 181205.9495422279, + "expense": 6494.23430474957, + "gap": 6494.23430474957, + "income": 0.0 + }, + { + "age": 100, + "asset": -265235.7838377421, + "cumulative_gap": 187830.06853307245, + "expense": 6624.118990844561, + "gap": 6624.118990844561, + "income": 0.0 + } + ], + "total_received": 8531.25 + }, + { + "break_even_age": 64, + "depletion_age": 67, + "scenario_type": "INSTALLMENT", + "timeline": [ + { + "age": 60, + "asset": 14826.25, + "cumulative_gap": 2388.0, + "expense": 3000.0, + "gap": 2388.0, + "income": 612.0000000000001 + }, + { + "age": 61, + "asset": 12811.397500000001, + "cumulative_gap": 4836.0, + "expense": 3060.0, + "gap": 2448.0, + "income": 612.0000000000001 + }, + { + "age": 62, + "asset": 10674.299425000001, + "cumulative_gap": 7345.200000000001, + "expense": 3121.2000000000003, + "gap": 2509.2000000000003, + "income": 612.0000000000001 + }, + { + "age": 63, + "asset": 8410.052407750001, + "cumulative_gap": 9916.824, + "expense": 3183.6240000000003, + "gap": 2571.6240000000003, + "income": 612.0000000000001 + }, + { + "age": 64, + "asset": 6013.581259982501, + "cumulative_gap": 12552.120480000001, + "expense": 3247.2964800000004, + "gap": 2635.2964800000004, + "income": 612.0000000000001 + }, + { + "age": 65, + "asset": 3479.633323381976, + "cumulative_gap": 15252.362889600001, + "expense": 3312.2424096000004, + "gap": 2700.2424096000004, + "income": 612.0000000000001 + }, + { + "age": 66, + "asset": 802.7726411954349, + "cumulative_gap": 18018.850147392, + "expense": 3378.4872577920005, + "gap": 2766.4872577920005, + "income": 612.0000000000001 + }, + { + "age": 67, + "asset": -2022.6260550944626, + "cumulative_gap": 20852.90715033984, + "expense": 3446.0570029478404, + "gap": 2834.0570029478404, + "income": 612.0000000000001 + }, + { + "age": 68, + "asset": -5002.383549783573, + "cumulative_gap": 23755.885293346637, + "expense": 3514.9781430067974, + "gap": 2902.9781430067974, + "income": 612.0000000000001 + }, + { + "age": 69, + "asset": -8142.52254357408, + "cumulative_gap": 26729.16299921357, + "expense": 3585.2777058669335, + "gap": 2973.2777058669335, + "income": 612.0000000000001 + }, + { + "age": 70, + "asset": -11449.274256924245, + "cumulative_gap": 29774.14625919784, + "expense": 3656.983259984272, + "gap": 3044.983259984272, + "income": 612.0000000000001 + }, + { + "age": 71, + "asset": -14929.085242415773, + "cumulative_gap": 32892.2691843818, + "expense": 3730.1229251839577, + "gap": 3118.1229251839577, + "income": 612.0000000000001 + }, + { + "age": 72, + "asset": -18588.624412627723, + "cumulative_gap": 36084.994568069436, + "expense": 3804.725383687637, + "gap": 3192.725383687637, + "income": 612.0000000000001 + }, + { + "age": 73, + "asset": -22434.790290204823, + "cumulative_gap": 39353.814459430825, + "expense": 3880.81989136139, + "gap": 3268.81989136139, + "income": 612.0000000000001 + }, + { + "age": 74, + "asset": -26474.718487013197, + "cumulative_gap": 42700.250748619444, + "expense": 3958.436289188618, + "gap": 3346.436289188618, + "income": 612.0000000000001 + }, + { + "age": 75, + "asset": -30715.78941948787, + "cumulative_gap": 46125.85576359183, + "expense": 4037.6050149723906, + "gap": 3425.6050149723906, + "income": 612.0000000000001 + }, + { + "age": 76, + "asset": -35165.636267494076, + "cumulative_gap": 49632.21287886367, + "expense": 4118.357115271839, + "gap": 3506.3571152718387, + "income": 612.0000000000001 + }, + { + "age": 77, + "asset": -39832.15318424889, + "cumulative_gap": 53220.937136440945, + "expense": 4200.724257577275, + "gap": 3588.7242575772752, + "income": 612.0000000000001 + }, + { + "age": 78, + "asset": -44723.50376508095, + "cumulative_gap": 56893.675879169765, + "expense": 4284.73874272882, + "gap": 3672.7387427288204, + "income": 612.0000000000001 + }, + { + "age": 79, + "asset": -49848.12978304407, + "cumulative_gap": 60652.10939675316, + "expense": 4370.433517583397, + "gap": 3758.4335175833967, + "income": 612.0000000000001 + }, + { + "age": 80, + "asset": -55214.76019964629, + "cumulative_gap": 64497.95158468823, + "expense": 4457.842187935064, + "gap": 3845.8421879350644, + "income": 612.0000000000001 + }, + { + "age": 81, + "asset": -60832.4204592088, + "cumulative_gap": 68432.95061638199, + "expense": 4546.999031693766, + "gap": 3934.9990316937656, + "income": 612.0000000000001 + }, + { + "age": 82, + "asset": -66710.44207562965, + "cumulative_gap": 72458.88962870963, + "expense": 4637.939012327641, + "gap": 4025.9390123276407, + "income": 612.0000000000001 + }, + { + "age": 83, + "asset": -72858.472520596, + "cumulative_gap": 76577.58742128382, + "expense": 4730.697792574194, + "gap": 4118.697792574194, + "income": 612.0000000000001 + }, + { + "age": 84, + "asset": -79286.4854225653, + "cumulative_gap": 80790.8991697095, + "expense": 4825.311748425678, + "gap": 4213.311748425678, + "income": 612.0000000000001 + }, + { + "age": 85, + "asset": -86004.7910861207, + "cumulative_gap": 85100.7171531037, + "expense": 4921.817983394192, + "gap": 4309.817983394192, + "income": 612.0000000000001 + }, + { + "age": 86, + "asset": -93024.04734160035, + "cumulative_gap": 89508.97149616577, + "expense": 5020.254343062076, + "gap": 4408.254343062076, + "income": 612.0000000000001 + }, + { + "age": 87, + "asset": -100355.2707352023, + "cumulative_gap": 94017.63092608908, + "expense": 5120.6594299233175, + "gap": 4508.6594299233175, + "income": 612.0000000000001 + }, + { + "age": 88, + "asset": -108009.84807007939, + "cumulative_gap": 98628.70354461086, + "expense": 5223.072618521784, + "gap": 4611.072618521784, + "income": 612.0000000000001 + }, + { + "age": 89, + "asset": -115999.5483092592, + "cumulative_gap": 103344.23761550308, + "expense": 5327.5340708922195, + "gap": 4715.5340708922195, + "income": 612.0000000000001 + }, + { + "age": 90, + "asset": -124336.53485155596, + "cumulative_gap": 108166.32236781315, + "expense": 5434.084752310064, + "gap": 4822.084752310064, + "income": 612.0000000000001 + }, + { + "age": 91, + "asset": -133033.37819198202, + "cumulative_gap": 113097.08881516941, + "expense": 5542.766447356265, + "gap": 4930.766447356265, + "income": 612.0000000000001 + }, + { + "age": 92, + "asset": -142103.06897851842, + "cumulative_gap": 118138.7105914728, + "expense": 5653.621776303391, + "gap": 5041.621776303391, + "income": 612.0000000000001 + }, + { + "age": 93, + "asset": -151559.0314774665, + "cumulative_gap": 123293.40480330226, + "expense": 5766.694211829459, + "gap": 5154.694211829459, + "income": 612.0000000000001 + }, + { + "age": 94, + "asset": -161415.13745997482, + "cumulative_gap": 128563.4328993683, + "expense": 5882.028096066048, + "gap": 5270.028096066048, + "income": 612.0000000000001 + }, + { + "age": 95, + "asset": -171685.7205227221, + "cumulative_gap": 133951.10155735567, + "expense": 5999.668657987369, + "gap": 5387.668657987369, + "income": 612.0000000000001 + }, + { + "age": 96, + "asset": -182385.5908561308, + "cumulative_gap": 139458.76358850277, + "expense": 6119.662031147117, + "gap": 5507.662031147117, + "income": 612.0000000000001 + }, + { + "age": 97, + "asset": -193530.05047389623, + "cumulative_gap": 145088.81886027282, + "expense": 6242.055271770059, + "gap": 5630.055271770059, + "income": 612.0000000000001 + }, + { + "age": 98, + "asset": -205134.90891803626, + "cumulative_gap": 150843.7152374783, + "expense": 6366.89637720546, + "gap": 5754.89637720546, + "income": 612.0000000000001 + }, + { + "age": 99, + "asset": -217216.499454099, + "cumulative_gap": 156725.94954222787, + "expense": 6494.23430474957, + "gap": 5882.23430474957, + "income": 612.0000000000001 + }, + { + "age": 100, + "asset": -229791.69577161403, + "cumulative_gap": 162738.06853307242, + "expense": 6624.118990844561, + "gap": 6012.118990844561, + "income": 612.0000000000001 + } + ], + "total_received": 29918.25 + } + ] + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/scenarios_with_deduction_years.json b/fastapi/tests/golden/scenarios_with_deduction_years.json new file mode 100644 index 0000000..e3cab68 --- /dev/null +++ b/fastapi/tests/golden/scenarios_with_deduction_years.json @@ -0,0 +1,1353 @@ +{ + "body": { + "best_scenario": "NORMAL", + "current_age": 60, + "scenarios": [ + { + "break_even_age": null, + "depletion_age": 68, + "scenario_type": "NORMAL", + "timeline": [ + { + "age": 60, + "asset": 10000.0, + "cumulative_gap": 1200.0, + "expense": 3000.0, + "gap": 1200.0, + "income": 1800.0 + }, + { + "age": 61, + "asset": 9064.0, + "cumulative_gap": 2460.0, + "expense": 3060.0, + "gap": 1260.0, + "income": 1800.0 + }, + { + "age": 62, + "asset": 8038.12, + "cumulative_gap": 3781.2000000000003, + "expense": 3121.2000000000003, + "gap": 1321.2000000000003, + "income": 1800.0 + }, + { + "age": 63, + "asset": 6918.4276, + "cumulative_gap": 5164.8240000000005, + "expense": 3183.6240000000003, + "gap": 1383.6240000000003, + "income": 1800.0 + }, + { + "age": 64, + "asset": 5700.847707999999, + "cumulative_gap": 6612.120480000001, + "expense": 3247.2964800000004, + "gap": 1447.2964800000004, + "income": 1800.0 + }, + { + "age": 65, + "asset": 4381.157764839999, + "cumulative_gap": 8124.362889600002, + "expense": 3312.2424096000004, + "gap": 1512.2424096000004, + "income": 1800.0 + }, + { + "age": 66, + "asset": 2954.9828158971986, + "cumulative_gap": 9702.850147392002, + "expense": 3378.4872577920005, + "gap": 1578.4872577920005, + "income": 1800.0 + }, + { + "age": 67, + "asset": 1417.7904248483542, + "cumulative_gap": 11348.907150339843, + "expense": 3446.0570029478404, + "gap": 1646.0570029478404, + "income": 1800.0 + }, + { + "age": 68, + "asset": -235.1145754424708, + "cumulative_gap": 13063.88529334664, + "expense": 3514.9781430067974, + "gap": 1714.9781430067974, + "income": 1800.0 + }, + { + "age": 69, + "asset": -2008.5955000027463, + "cumulative_gap": 14849.162999213575, + "expense": 3585.2777058669335, + "gap": 1785.2777058669335, + "income": 1800.0 + }, + { + "age": 70, + "asset": -3907.6894020457703, + "cumulative_gap": 16706.14625919785, + "expense": 3656.983259984272, + "gap": 1856.983259984272, + "income": 1800.0 + }, + { + "age": 71, + "asset": -5937.612841890944, + "cumulative_gap": 18636.269184381807, + "expense": 3730.1229251839577, + "gap": 1930.1229251839577, + "income": 1800.0 + }, + { + "age": 72, + "asset": -8103.767840087149, + "cumulative_gap": 20640.994568069444, + "expense": 3804.725383687637, + "gap": 2004.725383687637, + "income": 1800.0 + }, + { + "age": 73, + "asset": -10411.748020488028, + "cumulative_gap": 22721.814459430832, + "expense": 3880.81989136139, + "gap": 2080.81989136139, + "income": 1800.0 + }, + { + "age": 74, + "asset": -12867.344949204902, + "cumulative_gap": 24880.25074861945, + "expense": 3958.436289188618, + "gap": 2158.436289188618, + "income": 1800.0 + }, + { + "age": 75, + "asset": -15476.554675545325, + "cumulative_gap": 27117.85576359184, + "expense": 4037.6050149723906, + "gap": 2237.6050149723906, + "income": 1800.0 + }, + { + "age": 76, + "asset": -18245.584481233247, + "cumulative_gap": 29436.21287886368, + "expense": 4118.357115271839, + "gap": 2318.3571152718387, + "income": 1800.0 + }, + { + "age": 77, + "asset": -21180.85984440024, + "cumulative_gap": 31836.937136440956, + "expense": 4200.724257577275, + "gap": 2400.7242575772752, + "income": 1800.0 + }, + { + "age": 78, + "asset": -24289.03162503684, + "cumulative_gap": 34321.67587916978, + "expense": 4284.73874272882, + "gap": 2484.7387427288204, + "income": 1800.0 + }, + { + "age": 79, + "asset": -27576.983478798633, + "cumulative_gap": 36892.10939675318, + "expense": 4370.433517583397, + "gap": 2570.4335175833967, + "income": 1800.0 + }, + { + "age": 80, + "asset": -31051.839506273493, + "cumulative_gap": 39549.95158468824, + "expense": 4457.842187935064, + "gap": 2657.8421879350644, + "income": 1800.0 + }, + { + "age": 81, + "asset": -34720.972145034815, + "cumulative_gap": 42296.950616382004, + "expense": 4546.999031693766, + "gap": 2746.9990316937656, + "income": 1800.0 + }, + { + "age": 82, + "asset": -38592.010312030434, + "cumulative_gap": 45134.88962870964, + "expense": 4637.939012327641, + "gap": 2837.9390123276407, + "income": 1800.0 + }, + { + "age": 83, + "asset": -42672.847804088815, + "cumulative_gap": 48065.58742128384, + "expense": 4730.697792574194, + "gap": 2930.697792574194, + "income": 1800.0 + }, + { + "age": 84, + "asset": -46971.6519645629, + "cumulative_gap": 51090.89916970952, + "expense": 4825.311748425678, + "gap": 3025.311748425678, + "income": 1800.0 + }, + { + "age": 85, + "asset": -51496.87262437824, + "cumulative_gap": 54212.71715310371, + "expense": 4921.817983394192, + "gap": 3121.817983394192, + "income": 1800.0 + }, + { + "age": 86, + "asset": -56257.2513260056, + "cumulative_gap": 57432.97149616579, + "expense": 5020.254343062076, + "gap": 3220.2543430620763, + "income": 1800.0 + }, + { + "age": 87, + "asset": -61261.83083913971, + "cumulative_gap": 60753.63092608911, + "expense": 5120.6594299233175, + "gap": 3320.6594299233175, + "income": 1800.0 + }, + { + "age": 88, + "asset": -66519.96497713492, + "cumulative_gap": 64176.70354461089, + "expense": 5223.072618521784, + "gap": 3423.0726185217836, + "income": 1800.0 + }, + { + "age": 89, + "asset": -72041.3287235264, + "cumulative_gap": 67704.23761550311, + "expense": 5327.5340708922195, + "gap": 3527.5340708922195, + "income": 1800.0 + }, + { + "age": 90, + "asset": -77835.92867825118, + "cumulative_gap": 71338.32236781318, + "expense": 5434.084752310064, + "gap": 3634.084752310064, + "income": 1800.0 + }, + { + "age": 91, + "asset": -83914.11383347808, + "cumulative_gap": 75081.08881516944, + "expense": 5542.766447356265, + "gap": 3742.7664473562654, + "income": 1800.0 + }, + { + "age": 92, + "asset": -90286.58668925938, + "cumulative_gap": 78934.71059147283, + "expense": 5653.621776303391, + "gap": 3853.621776303391, + "income": 1800.0 + }, + { + "age": 93, + "asset": -96964.41471952965, + "cumulative_gap": 82901.40480330228, + "expense": 5766.694211829459, + "gap": 3966.694211829459, + "income": 1800.0 + }, + { + "age": 94, + "asset": -103959.04219929989, + "cumulative_gap": 86983.43289936833, + "expense": 5882.028096066048, + "gap": 4082.0280960660484, + "income": 1800.0 + }, + { + "age": 95, + "asset": -111282.30240422691, + "cumulative_gap": 91183.1015573557, + "expense": 5999.668657987369, + "gap": 4199.668657987369, + "income": 1800.0 + }, + { + "age": 96, + "asset": -118946.4301940807, + "cumulative_gap": 95502.76358850281, + "expense": 6119.662031147117, + "gap": 4319.662031147117, + "income": 1800.0 + }, + { + "age": 97, + "asset": -126964.07499198466, + "cumulative_gap": 99944.81886027288, + "expense": 6242.055271770059, + "gap": 4442.055271770059, + "income": 1800.0 + }, + { + "age": 98, + "asset": -135348.31417166736, + "cumulative_gap": 104511.71523747833, + "expense": 6366.89637720546, + "gap": 4566.89637720546, + "income": 1800.0 + }, + { + "age": 99, + "asset": -144112.666865339, + "cumulative_gap": 109205.9495422279, + "expense": 6494.23430474957, + "gap": 4694.23430474957, + "income": 1800.0 + }, + { + "age": 100, + "asset": -153271.10820519124, + "cumulative_gap": 114030.06853307247, + "expense": 6624.118990844561, + "gap": 4824.118990844561, + "income": 1800.0 + } + ], + "total_received": 73800.0 + }, + { + "break_even_age": 60, + "depletion_age": 66, + "scenario_type": "EARLY", + "timeline": [ + { + "age": 60, + "asset": 10000.0, + "cumulative_gap": 1650.0, + "expense": 3000.0, + "gap": 1650.0, + "income": 1350.0 + }, + { + "age": 61, + "asset": 8600.5, + "cumulative_gap": 3360.0, + "expense": 3060.0, + "gap": 1710.0, + "income": 1350.0 + }, + { + "age": 62, + "asset": 7097.215, + "cumulative_gap": 5131.200000000001, + "expense": 3121.2000000000003, + "gap": 1771.2000000000003, + "income": 1350.0 + }, + { + "age": 63, + "asset": 5485.79545, + "cumulative_gap": 6964.8240000000005, + "expense": 3183.6240000000003, + "gap": 1833.6240000000003, + "income": 1350.0 + }, + { + "age": 64, + "asset": 3761.7365934999993, + "cumulative_gap": 8862.120480000001, + "expense": 3247.2964800000004, + "gap": 1897.2964800000004, + "income": 1350.0 + }, + { + "age": 65, + "asset": 1920.373316904999, + "cumulative_gap": 10824.362889600001, + "expense": 3312.2424096000004, + "gap": 1962.2424096000004, + "income": 1350.0 + }, + { + "age": 66, + "asset": -43.125165475851475, + "cumulative_gap": 12852.850147392, + "expense": 3378.4872577920005, + "gap": 2028.4872577920005, + "income": 1350.0 + }, + { + "age": 67, + "asset": -2133.7607959658876, + "cumulative_gap": 14948.90715033984, + "expense": 3446.0570029478404, + "gap": 2096.0570029478404, + "income": 1350.0 + }, + { + "age": 68, + "asset": -4356.712332881139, + "cumulative_gap": 17113.885293346637, + "expense": 3514.9781430067974, + "gap": 2164.9781430067974, + "income": 1350.0 + }, + { + "age": 69, + "asset": -6717.341190164576, + "cumulative_gap": 19349.16299921357, + "expense": 3585.2777058669335, + "gap": 2235.2777058669335, + "income": 1350.0 + }, + { + "age": 70, + "asset": -9221.197462912454, + "cumulative_gap": 21656.14625919784, + "expense": 3656.983259984272, + "gap": 2306.983259984272, + "income": 1350.0 + }, + { + "age": 71, + "asset": -11874.026144583628, + "cumulative_gap": 24036.2691843818, + "expense": 3730.1229251839577, + "gap": 2380.1229251839577, + "income": 1350.0 + }, + { + "age": 72, + "asset": -14681.773541860613, + "cumulative_gap": 26490.994568069436, + "expense": 3804.725383687637, + "gap": 2454.725383687637, + "income": 1350.0 + }, + { + "age": 73, + "asset": -17650.593893314697, + "cumulative_gap": 29021.814459430825, + "expense": 3880.81989136139, + "gap": 2530.81989136139, + "income": 1350.0 + }, + { + "age": 74, + "asset": -20786.85619821637, + "cumulative_gap": 31630.250748619444, + "expense": 3958.436289188618, + "gap": 2608.436289188618, + "income": 1350.0 + }, + { + "age": 75, + "asset": -24097.15126202714, + "cumulative_gap": 34317.85576359183, + "expense": 4037.6050149723906, + "gap": 2687.6050149723906, + "income": 1350.0 + }, + { + "age": 76, + "asset": -27588.298965309514, + "cumulative_gap": 37086.21287886367, + "expense": 4118.357115271839, + "gap": 2768.3571152718387, + "income": 1350.0 + }, + { + "age": 77, + "asset": -31267.355762998795, + "cumulative_gap": 39936.937136440945, + "expense": 4200.724257577275, + "gap": 2850.7242575772752, + "income": 1350.0 + }, + { + "age": 78, + "asset": -35141.62242119335, + "cumulative_gap": 42871.675879169765, + "expense": 4284.73874272882, + "gap": 2934.7387427288204, + "income": 1350.0 + }, + { + "age": 79, + "asset": -39218.651998839836, + "cumulative_gap": 45892.10939675316, + "expense": 4370.433517583397, + "gap": 3020.4335175833967, + "income": 1350.0 + }, + { + "age": 80, + "asset": -43506.258081915934, + "cumulative_gap": 48999.95158468823, + "expense": 4457.842187935064, + "gap": 3107.8421879350644, + "income": 1350.0 + }, + { + "age": 81, + "asset": -48012.52327794653, + "cumulative_gap": 52196.95061638199, + "expense": 4546.999031693766, + "gap": 3196.9990316937656, + "income": 1350.0 + }, + { + "age": 82, + "asset": -52745.8079789295, + "cumulative_gap": 55484.88962870963, + "expense": 4637.939012327641, + "gap": 3287.9390123276407, + "income": 1350.0 + }, + { + "age": 83, + "asset": -57714.75940099486, + "cumulative_gap": 58865.587421283824, + "expense": 4730.697792574194, + "gap": 3380.697792574194, + "income": 1350.0 + }, + { + "age": 84, + "asset": -62928.320909376125, + "cumulative_gap": 62340.899169709504, + "expense": 4825.311748425678, + "gap": 3475.311748425678, + "income": 1350.0 + }, + { + "age": 85, + "asset": -68395.74163753586, + "cumulative_gap": 65912.7171531037, + "expense": 4921.817983394192, + "gap": 3571.817983394192, + "income": 1350.0 + }, + { + "age": 86, + "asset": -74126.58640955796, + "cumulative_gap": 69582.97149616577, + "expense": 5020.254343062076, + "gap": 3670.2543430620763, + "income": 1350.0 + }, + { + "age": 87, + "asset": -80130.74597519863, + "cumulative_gap": 73353.63092608908, + "expense": 5120.6594299233175, + "gap": 3770.6594299233175, + "income": 1350.0 + }, + { + "age": 88, + "asset": -86418.44756727561, + "cumulative_gap": 77226.70354461086, + "expense": 5223.072618521784, + "gap": 3873.0726185217836, + "income": 1350.0 + }, + { + "age": 89, + "asset": -93000.26579137132, + "cumulative_gap": 81204.23761550308, + "expense": 5327.5340708922195, + "gap": 3977.5340708922195, + "income": 1350.0 + }, + { + "age": 90, + "asset": -99887.13385813145, + "cumulative_gap": 85288.32236781315, + "expense": 5434.084752310064, + "gap": 4084.084752310064, + "income": 1350.0 + }, + { + "age": 91, + "asset": -107090.35516875476, + "cumulative_gap": 89481.08881516941, + "expense": 5542.766447356265, + "gap": 4192.766447356265, + "income": 1350.0 + }, + { + "age": 92, + "asset": -114621.61526459435, + "cumulative_gap": 93784.7105914728, + "expense": 5653.621776303391, + "gap": 4303.621776303391, + "income": 1350.0 + }, + { + "age": 93, + "asset": -122492.99415212468, + "cumulative_gap": 98201.40480330226, + "expense": 5766.694211829459, + "gap": 4416.694211829459, + "income": 1350.0 + }, + { + "age": 94, + "asset": -130716.97901487276, + "cumulative_gap": 102733.4328993683, + "expense": 5882.028096066048, + "gap": 4532.028096066048, + "income": 1350.0 + }, + { + "age": 95, + "asset": -139306.47732426698, + "cumulative_gap": 107383.10155735567, + "expense": 5999.668657987369, + "gap": 4649.668657987369, + "income": 1350.0 + }, + { + "age": 96, + "asset": -148274.83036172198, + "cumulative_gap": 112152.76358850278, + "expense": 6119.662031147117, + "gap": 4769.662031147117, + "income": 1350.0 + }, + { + "age": 97, + "asset": -157635.82716465517, + "cumulative_gap": 117044.81886027285, + "expense": 6242.055271770059, + "gap": 4892.055271770059, + "income": 1350.0 + }, + { + "age": 98, + "asset": -167403.71890951798, + "cumulative_gap": 122061.7152374783, + "expense": 6366.89637720546, + "gap": 5016.89637720546, + "income": 1350.0 + }, + { + "age": 99, + "asset": -177593.23374532515, + "cumulative_gap": 127205.94954222787, + "expense": 6494.23430474957, + "gap": 5144.23430474957, + "income": 1350.0 + }, + { + "age": 100, + "asset": -188219.59209157698, + "cumulative_gap": 132480.06853307242, + "expense": 6624.118990844561, + "gap": 5274.118990844561, + "income": 1350.0 + } + ], + "total_received": 55350.0 + }, + { + "break_even_age": 64, + "depletion_age": 67, + "scenario_type": "LUMP_SUM", + "timeline": [ + { + "age": 60, + "asset": 18531.25, + "cumulative_gap": 3000.0, + "expense": 3000.0, + "gap": 3000.0, + "income": 0.0 + }, + { + "age": 61, + "asset": 15997.1875, + "cumulative_gap": 6060.0, + "expense": 3060.0, + "gap": 3060.0, + "income": 0.0 + }, + { + "age": 62, + "asset": 13325.303125, + "cumulative_gap": 9181.2, + "expense": 3121.2000000000003, + "gap": 3121.2000000000003, + "income": 0.0 + }, + { + "age": 63, + "asset": 10510.22621875, + "cumulative_gap": 12364.824, + "expense": 3183.6240000000003, + "gap": 3183.6240000000003, + "income": 0.0 + }, + { + "age": 64, + "asset": 7546.4002853125, + "cumulative_gap": 15612.120480000001, + "expense": 3247.2964800000004, + "gap": 3247.2964800000004, + "income": 0.0 + }, + { + "age": 65, + "asset": 4428.076919471874, + "cumulative_gap": 18924.3628896, + "expense": 3312.2424096000004, + "gap": 3312.2424096000004, + "income": 0.0 + }, + { + "age": 66, + "asset": 1149.30954516803, + "cumulative_gap": 22302.850147392, + "expense": 3378.4872577920005, + "gap": 3378.4872577920005, + "income": 0.0 + }, + { + "age": 67, + "asset": -2296.0530440026896, + "cumulative_gap": 25748.90715033984, + "expense": 3446.0570029478404, + "gap": 3446.0570029478404, + "income": 0.0 + }, + { + "age": 68, + "asset": -5914.373348359046, + "cumulative_gap": 29263.885293346637, + "expense": 3514.9781430067974, + "gap": 3514.9781430067974, + "income": 0.0 + }, + { + "age": 69, + "asset": -9712.23203610682, + "cumulative_gap": 32849.16299921357, + "expense": 3585.2777058669335, + "gap": 3585.2777058669335, + "income": 0.0 + }, + { + "age": 70, + "asset": -13696.435034232967, + "cumulative_gap": 36506.14625919784, + "expense": 3656.983259984272, + "gap": 3656.983259984272, + "income": 0.0 + }, + { + "age": 71, + "asset": -17874.02084304376, + "cumulative_gap": 40236.2691843818, + "expense": 3730.1229251839577, + "gap": 3730.1229251839577, + "income": 0.0 + }, + { + "age": 72, + "asset": -22252.26808127455, + "cumulative_gap": 44040.994568069436, + "expense": 3804.725383687637, + "gap": 3804.725383687637, + "income": 0.0 + }, + { + "age": 73, + "asset": -26838.703268911053, + "cumulative_gap": 47921.814459430825, + "expense": 3880.81989136139, + "gap": 3880.81989136139, + "income": 0.0 + }, + { + "age": 74, + "asset": -31641.108855080616, + "cumulative_gap": 51880.250748619444, + "expense": 3958.436289188618, + "gap": 3958.436289188618, + "income": 0.0 + }, + { + "age": 75, + "asset": -36667.53149859732, + "cumulative_gap": 55917.85576359183, + "expense": 4037.6050149723906, + "gap": 4037.6050149723906, + "income": 0.0 + }, + { + "age": 76, + "asset": -41926.2906089768, + "cumulative_gap": 60036.21287886367, + "expense": 4118.357115271839, + "gap": 4118.357115271839, + "income": 0.0 + }, + { + "age": 77, + "asset": -47425.987155976094, + "cumulative_gap": 64236.937136440945, + "expense": 4200.724257577275, + "gap": 4200.724257577275, + "income": 0.0 + }, + { + "age": 78, + "asset": -53175.51275595997, + "cumulative_gap": 68521.67587916976, + "expense": 4284.73874272882, + "gap": 4284.73874272882, + "income": 0.0 + }, + { + "age": 79, + "asset": -59184.05904364945, + "cumulative_gap": 72892.10939675316, + "expense": 4370.433517583397, + "gap": 4370.433517583397, + "income": 0.0 + }, + { + "age": 80, + "asset": -65461.12733806984, + "cumulative_gap": 77349.95158468823, + "expense": 4457.842187935064, + "gap": 4457.842187935064, + "income": 0.0 + }, + { + "age": 81, + "asset": -72016.53861178506, + "cumulative_gap": 81896.95061638199, + "expense": 4546.999031693766, + "gap": 4546.999031693766, + "income": 0.0 + }, + { + "age": 82, + "asset": -78860.44377278318, + "cumulative_gap": 86534.88962870963, + "expense": 4637.939012327641, + "gap": 4637.939012327641, + "income": 0.0 + }, + { + "age": 83, + "asset": -86003.33426866416, + "cumulative_gap": 91265.58742128382, + "expense": 4730.697792574194, + "gap": 4730.697792574194, + "income": 0.0 + }, + { + "age": 84, + "asset": -93456.05302307551, + "cumulative_gap": 96090.8991697095, + "expense": 4825.311748425678, + "gap": 4825.311748425678, + "income": 0.0 + }, + { + "age": 85, + "asset": -101229.80571464622, + "cumulative_gap": 101012.7171531037, + "expense": 4921.817983394192, + "gap": 4921.817983394192, + "income": 0.0 + }, + { + "age": 86, + "asset": -109336.17240898164, + "cumulative_gap": 106032.97149616577, + "expense": 5020.254343062076, + "gap": 5020.254343062076, + "income": 0.0 + }, + { + "age": 87, + "asset": -117787.11955460503, + "cumulative_gap": 111153.63092608908, + "expense": 5120.6594299233175, + "gap": 5120.6594299233175, + "income": 0.0 + }, + { + "age": 88, + "asset": -126595.0123540642, + "cumulative_gap": 116376.70354461086, + "expense": 5223.072618521784, + "gap": 5223.072618521784, + "income": 0.0 + }, + { + "age": 89, + "asset": -135772.62752176358, + "cumulative_gap": 121704.23761550308, + "expense": 5327.5340708922195, + "gap": 5327.5340708922195, + "income": 0.0 + }, + { + "age": 90, + "asset": -145333.16644043548, + "cumulative_gap": 127138.32236781315, + "expense": 5434.084752310064, + "gap": 5434.084752310064, + "income": 0.0 + }, + { + "age": 91, + "asset": -155290.2687285279, + "cumulative_gap": 132681.0888151694, + "expense": 5542.766447356265, + "gap": 5542.766447356265, + "income": 0.0 + }, + { + "age": 92, + "asset": -165658.0262311607, + "cumulative_gap": 138334.7105914728, + "expense": 5653.621776303391, + "gap": 5653.621776303391, + "income": 0.0 + }, + { + "age": 93, + "asset": -176450.99744768802, + "cumulative_gap": 144101.40480330226, + "expense": 5766.694211829459, + "gap": 5766.694211829459, + "income": 0.0 + }, + { + "age": 94, + "asset": -187684.222409303, + "cumulative_gap": 149983.43289936832, + "expense": 5882.028096066048, + "gap": 5882.028096066048, + "income": 0.0 + }, + { + "age": 95, + "asset": -199373.23802053015, + "cumulative_gap": 155983.1015573557, + "expense": 5999.668657987369, + "gap": 5999.668657987369, + "income": 0.0 + }, + { + "age": 96, + "asset": -211534.09387887304, + "cumulative_gap": 162102.7635885028, + "expense": 6119.662031147117, + "gap": 6119.662031147117, + "income": 0.0 + }, + { + "age": 97, + "asset": -224183.36858732076, + "cumulative_gap": 168344.81886027285, + "expense": 6242.055271770059, + "gap": 6242.055271770059, + "income": 0.0 + }, + { + "age": 98, + "asset": -237338.18657486353, + "cumulative_gap": 174711.71523747832, + "expense": 6366.89637720546, + "gap": 6366.89637720546, + "income": 0.0 + }, + { + "age": 99, + "asset": -251016.23544063108, + "cumulative_gap": 181205.9495422279, + "expense": 6494.23430474957, + "gap": 6494.23430474957, + "income": 0.0 + }, + { + "age": 100, + "asset": -265235.7838377421, + "cumulative_gap": 187830.06853307245, + "expense": 6624.118990844561, + "gap": 6624.118990844561, + "income": 0.0 + } + ], + "total_received": 8531.25 + }, + { + "break_even_age": 64, + "depletion_age": 67, + "scenario_type": "INSTALLMENT", + "timeline": [ + { + "age": 60, + "asset": 14826.25, + "cumulative_gap": 2388.0, + "expense": 3000.0, + "gap": 2388.0, + "income": 612.0000000000001 + }, + { + "age": 61, + "asset": 12811.397500000001, + "cumulative_gap": 4836.0, + "expense": 3060.0, + "gap": 2448.0, + "income": 612.0000000000001 + }, + { + "age": 62, + "asset": 10674.299425000001, + "cumulative_gap": 7345.200000000001, + "expense": 3121.2000000000003, + "gap": 2509.2000000000003, + "income": 612.0000000000001 + }, + { + "age": 63, + "asset": 8410.052407750001, + "cumulative_gap": 9916.824, + "expense": 3183.6240000000003, + "gap": 2571.6240000000003, + "income": 612.0000000000001 + }, + { + "age": 64, + "asset": 6013.581259982501, + "cumulative_gap": 12552.120480000001, + "expense": 3247.2964800000004, + "gap": 2635.2964800000004, + "income": 612.0000000000001 + }, + { + "age": 65, + "asset": 3479.633323381976, + "cumulative_gap": 15252.362889600001, + "expense": 3312.2424096000004, + "gap": 2700.2424096000004, + "income": 612.0000000000001 + }, + { + "age": 66, + "asset": 802.7726411954349, + "cumulative_gap": 18018.850147392, + "expense": 3378.4872577920005, + "gap": 2766.4872577920005, + "income": 612.0000000000001 + }, + { + "age": 67, + "asset": -2022.6260550944626, + "cumulative_gap": 20852.90715033984, + "expense": 3446.0570029478404, + "gap": 2834.0570029478404, + "income": 612.0000000000001 + }, + { + "age": 68, + "asset": -5002.383549783573, + "cumulative_gap": 23755.885293346637, + "expense": 3514.9781430067974, + "gap": 2902.9781430067974, + "income": 612.0000000000001 + }, + { + "age": 69, + "asset": -8142.52254357408, + "cumulative_gap": 26729.16299921357, + "expense": 3585.2777058669335, + "gap": 2973.2777058669335, + "income": 612.0000000000001 + }, + { + "age": 70, + "asset": -11449.274256924245, + "cumulative_gap": 29774.14625919784, + "expense": 3656.983259984272, + "gap": 3044.983259984272, + "income": 612.0000000000001 + }, + { + "age": 71, + "asset": -14929.085242415773, + "cumulative_gap": 32892.2691843818, + "expense": 3730.1229251839577, + "gap": 3118.1229251839577, + "income": 612.0000000000001 + }, + { + "age": 72, + "asset": -18588.624412627723, + "cumulative_gap": 36084.994568069436, + "expense": 3804.725383687637, + "gap": 3192.725383687637, + "income": 612.0000000000001 + }, + { + "age": 73, + "asset": -22434.790290204823, + "cumulative_gap": 39353.814459430825, + "expense": 3880.81989136139, + "gap": 3268.81989136139, + "income": 612.0000000000001 + }, + { + "age": 74, + "asset": -26474.718487013197, + "cumulative_gap": 42700.250748619444, + "expense": 3958.436289188618, + "gap": 3346.436289188618, + "income": 612.0000000000001 + }, + { + "age": 75, + "asset": -30715.78941948787, + "cumulative_gap": 46125.85576359183, + "expense": 4037.6050149723906, + "gap": 3425.6050149723906, + "income": 612.0000000000001 + }, + { + "age": 76, + "asset": -35165.636267494076, + "cumulative_gap": 49632.21287886367, + "expense": 4118.357115271839, + "gap": 3506.3571152718387, + "income": 612.0000000000001 + }, + { + "age": 77, + "asset": -39832.15318424889, + "cumulative_gap": 53220.937136440945, + "expense": 4200.724257577275, + "gap": 3588.7242575772752, + "income": 612.0000000000001 + }, + { + "age": 78, + "asset": -44723.50376508095, + "cumulative_gap": 56893.675879169765, + "expense": 4284.73874272882, + "gap": 3672.7387427288204, + "income": 612.0000000000001 + }, + { + "age": 79, + "asset": -49848.12978304407, + "cumulative_gap": 60652.10939675316, + "expense": 4370.433517583397, + "gap": 3758.4335175833967, + "income": 612.0000000000001 + }, + { + "age": 80, + "asset": -55214.76019964629, + "cumulative_gap": 64497.95158468823, + "expense": 4457.842187935064, + "gap": 3845.8421879350644, + "income": 612.0000000000001 + }, + { + "age": 81, + "asset": -60832.4204592088, + "cumulative_gap": 68432.95061638199, + "expense": 4546.999031693766, + "gap": 3934.9990316937656, + "income": 612.0000000000001 + }, + { + "age": 82, + "asset": -66710.44207562965, + "cumulative_gap": 72458.88962870963, + "expense": 4637.939012327641, + "gap": 4025.9390123276407, + "income": 612.0000000000001 + }, + { + "age": 83, + "asset": -72858.472520596, + "cumulative_gap": 76577.58742128382, + "expense": 4730.697792574194, + "gap": 4118.697792574194, + "income": 612.0000000000001 + }, + { + "age": 84, + "asset": -79286.4854225653, + "cumulative_gap": 80790.8991697095, + "expense": 4825.311748425678, + "gap": 4213.311748425678, + "income": 612.0000000000001 + }, + { + "age": 85, + "asset": -86004.7910861207, + "cumulative_gap": 85100.7171531037, + "expense": 4921.817983394192, + "gap": 4309.817983394192, + "income": 612.0000000000001 + }, + { + "age": 86, + "asset": -93024.04734160035, + "cumulative_gap": 89508.97149616577, + "expense": 5020.254343062076, + "gap": 4408.254343062076, + "income": 612.0000000000001 + }, + { + "age": 87, + "asset": -100355.2707352023, + "cumulative_gap": 94017.63092608908, + "expense": 5120.6594299233175, + "gap": 4508.6594299233175, + "income": 612.0000000000001 + }, + { + "age": 88, + "asset": -108009.84807007939, + "cumulative_gap": 98628.70354461086, + "expense": 5223.072618521784, + "gap": 4611.072618521784, + "income": 612.0000000000001 + }, + { + "age": 89, + "asset": -115999.5483092592, + "cumulative_gap": 103344.23761550308, + "expense": 5327.5340708922195, + "gap": 4715.5340708922195, + "income": 612.0000000000001 + }, + { + "age": 90, + "asset": -124336.53485155596, + "cumulative_gap": 108166.32236781315, + "expense": 5434.084752310064, + "gap": 4822.084752310064, + "income": 612.0000000000001 + }, + { + "age": 91, + "asset": -133033.37819198202, + "cumulative_gap": 113097.08881516941, + "expense": 5542.766447356265, + "gap": 4930.766447356265, + "income": 612.0000000000001 + }, + { + "age": 92, + "asset": -142103.06897851842, + "cumulative_gap": 118138.7105914728, + "expense": 5653.621776303391, + "gap": 5041.621776303391, + "income": 612.0000000000001 + }, + { + "age": 93, + "asset": -151559.0314774665, + "cumulative_gap": 123293.40480330226, + "expense": 5766.694211829459, + "gap": 5154.694211829459, + "income": 612.0000000000001 + }, + { + "age": 94, + "asset": -161415.13745997482, + "cumulative_gap": 128563.4328993683, + "expense": 5882.028096066048, + "gap": 5270.028096066048, + "income": 612.0000000000001 + }, + { + "age": 95, + "asset": -171685.7205227221, + "cumulative_gap": 133951.10155735567, + "expense": 5999.668657987369, + "gap": 5387.668657987369, + "income": 612.0000000000001 + }, + { + "age": 96, + "asset": -182385.5908561308, + "cumulative_gap": 139458.76358850277, + "expense": 6119.662031147117, + "gap": 5507.662031147117, + "income": 612.0000000000001 + }, + { + "age": 97, + "asset": -193530.05047389623, + "cumulative_gap": 145088.81886027282, + "expense": 6242.055271770059, + "gap": 5630.055271770059, + "income": 612.0000000000001 + }, + { + "age": 98, + "asset": -205134.90891803626, + "cumulative_gap": 150843.7152374783, + "expense": 6366.89637720546, + "gap": 5754.89637720546, + "income": 612.0000000000001 + }, + { + "age": 99, + "asset": -217216.499454099, + "cumulative_gap": 156725.94954222787, + "expense": 6494.23430474957, + "gap": 5882.23430474957, + "income": 612.0000000000001 + }, + { + "age": 100, + "asset": -229791.69577161403, + "cumulative_gap": 162738.06853307242, + "expense": 6624.118990844561, + "gap": 6012.118990844561, + "income": 612.0000000000001 + } + ], + "total_received": 29918.25 + } + ] + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/simulate_lump_sum_only.json b/fastapi/tests/golden/simulate_lump_sum_only.json new file mode 100644 index 0000000..beb5b65 --- /dev/null +++ b/fastapi/tests/golden/simulate_lump_sum_only.json @@ -0,0 +1,13 @@ +{ + "body": { + "current_band": "0~59", + "estimated_avg_income": 6694931, + "income_factor": 1.269, + "lump_sum": 45692904, + "monthly_pension": 0, + "retire_band": "60~119", + "retire_months": 84, + "severance_pay": 7962500 + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/simulate_normal.json b/fastapi/tests/golden/simulate_normal.json new file mode 100644 index 0000000..db36118 --- /dev/null +++ b/fastapi/tests/golden/simulate_normal.json @@ -0,0 +1,13 @@ +{ + "body": { + "current_band": "240~299", + "estimated_avg_income": 5612286, + "income_factor": 0.696, + "lump_sum": 0, + "monthly_pension": 3053083, + "retire_band": "360+", + "retire_months": 384, + "severance_pay": 62400000 + }, + "status_code": 200 +} diff --git a/fastapi/tests/golden/simulate_zero_months.json b/fastapi/tests/golden/simulate_zero_months.json new file mode 100644 index 0000000..8269bc8 --- /dev/null +++ b/fastapi/tests/golden/simulate_zero_months.json @@ -0,0 +1,13 @@ +{ + "body": { + "current_band": "0~59", + "estimated_avg_income": 5000000, + "income_factor": 1.269, + "lump_sum": 0, + "monthly_pension": 0, + "retire_band": "0~59", + "retire_months": 0, + "severance_pay": 0 + }, + "status_code": 200 +} diff --git a/fastapi/tests/test_golden_snapshots.py b/fastapi/tests/test_golden_snapshots.py new file mode 100644 index 0000000..1911df4 --- /dev/null +++ b/fastapi/tests/test_golden_snapshots.py @@ -0,0 +1,201 @@ +"""5개 엔드포인트의 현재(수정 전) 응답을 고정하는 골든 스냅샷 테스트. + +이후 이슈 수정 작업에서 의도한 필드 외의 값이 조금이라도 바뀌면 이 테스트가 +즉시 실패해야 한다. 산식/응답 형식을 의도적으로 바꾼 뒤에는: + 1) 새 응답이 의도한 변경과 정확히 일치하는지 직접 확인하고 + 2) tests/golden/_generate.py로 해당 케이스의 픽스처만 다시 생성한다. +케이스를 통과시키기 위해 무비판적으로 재생성하지 말 것. +""" + +import json +from pathlib import Path + +import pytest +from fastapi.testclient import TestClient + +from app.main import app + +GOLDEN_DIR = Path(__file__).parent / "golden" + +CASES = [ + # --- /api/retirement/diagnosis --- + { + "name": "diagnosis_sufficient", + "path": "/api/retirement/diagnosis", + "body": { + "current_age": 65, + "monthly_expenses": 150, + "monthly_pension": 200, + "asset": 10000, + "gender": "male", + }, + }, + { + "name": "diagnosis_insufficient", + "path": "/api/retirement/diagnosis", + "body": { + "current_age": 60, + "monthly_expenses": 250, + "monthly_pension": 150, + "asset": 10000, + "gender": "male", + }, + }, + { + "name": "diagnosis_middle", + "path": "/api/retirement/diagnosis", + "body": { + "current_age": 60, + "monthly_expenses": 200, + "monthly_pension": 150, + "asset": 32000, + "gender": "female", + }, + }, + # --- /api/retirement/recommendations --- + { + "name": "recommendations_sufficient", + "path": "/api/retirement/recommendations", + "body": { + "current_age": 65, + "monthly_expenses": 150, + "monthly_pension": 200, + "asset": 10000, + "gender": "male", + }, + }, + { + "name": "recommendations_saving_only", + "path": "/api/retirement/recommendations", + "body": { + "current_age": 60, + "monthly_expenses": 250, + "monthly_pension": 200, + "asset": 15000, + "gender": "male", + }, + }, + { + "name": "recommendations_saving_and_income", + "path": "/api/retirement/recommendations", + "body": { + "current_age": 60, + "monthly_expenses": 400, + "monthly_pension": 100, + "asset": 5000, + "gender": "female", + }, + }, + # --- /api/retirement/reduction --- + { + "name": "reduction_no_reduction", + "path": "/api/retirement/reduction", + "body": { + "current_age": 60, + "monthly_expenses": 200, + "monthly_pension": 150, + "asset": 10000, + "gender": "male", + "reemployment_income": 0, + }, + }, + { + "name": "reduction_partial", + "path": "/api/retirement/reduction", + "body": { + "current_age": 60, + "monthly_expenses": 200, + "monthly_pension": 150, + "asset": 10000, + "gender": "male", + "reemployment_income": 500, + }, + }, + { + "name": "reduction_capped", + "path": "/api/retirement/reduction", + "body": { + "current_age": 60, + "monthly_expenses": 200, + "monthly_pension": 150, + "asset": 10000, + "gender": "male", + "reemployment_income": 99999, + }, + }, + # --- /api/retirement/scenarios --- + { + "name": "scenarios_basic", + "path": "/api/retirement/scenarios", + "body": { + "current_age": 60, + "monthly_expenses": 250, + "monthly_pension": 150, + "asset": 10000, + "gender": "male", + "base_monthly_income": 300, + "total_service_years": 25, + }, + }, + { + "name": "scenarios_with_deduction_years", + "path": "/api/retirement/scenarios", + "body": { + "current_age": 60, + "monthly_expenses": 250, + "monthly_pension": 150, + "asset": 10000, + "gender": "male", + "base_monthly_income": 300, + "total_service_years": 25, + "deduction_years": 15, + }, + }, + # --- /api/employees/simulate --- + { + "name": "simulate_normal", + "path": "/api/employees/simulate", + "body": { + "current_years": 20, + "current_income": 5000000, + "current_age": 50, + "retire_at_age": 62, + }, + }, + { + "name": "simulate_lump_sum_only", + "path": "/api/employees/simulate", + "body": { + "current_years": 2, + "current_income": 5000000, + "current_age": 30, + "retire_at_age": 35, + }, + }, + { + "name": "simulate_zero_months", + "path": "/api/employees/simulate", + "body": { + "current_years": 0, + "current_income": 5000000, + "current_age": 30, + "retire_at_age": 30, + }, + }, +] + + +@pytest.fixture(scope="module") +def client(): + return TestClient(app) + + +@pytest.mark.parametrize("case", CASES, ids=[c["name"] for c in CASES]) +def test_golden_snapshot(client, case): + fixture_path = GOLDEN_DIR / f"{case['name']}.json" + expected = json.loads(fixture_path.read_text(encoding="utf-8")) + + response = client.post(case["path"], json=case["body"]) + + assert response.status_code == expected["status_code"] + assert response.json() == expected["body"] From 9c8a9d1c84d6414af4246e6e8b8f84c149283c02 Mon Sep 17 00:00:00 2001 From: jung32111 Date: Sat, 25 Jul 2026 09:22:05 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=F0=9F=90=9B=20Fix:=20=EB=9F=B0=ED=83=80?= =?UTF-8?q?=EC=9E=84=20=ED=95=84=EC=88=98=20CSV=20=EB=88=84=EB=9D=BD=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B8=B0=EB=8F=99=20=EC=8B=9C=EC=A0=90=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EB=B6=80=EC=9E=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit data/active_income_stats.csv(집계 통계, 개인 단위 레코드 없음)가 .gitignore의 data/ 규칙에 걸려 레포에 없었다. fresh clone 시 /api/employees/simulate가 첫 요청에서 500을 반환하는 문제가 있어, 이 파일만 예외 처리해 커밋한다. 개인 단위 원본 데이터 3종은 계속 제외한다. 추가로 앱 기동(lifespan) 시점에 필수 데이터 파일 존재를 검증해, 파일이 없으면 요청 시점 500 대신 기동 자체가 명확한 에러 메시지와 함께 실패하도록 한다. --- .gitignore | 5 +++ fastapi/app/main.py | 11 +++++++ .../employees_income_repository.py | 13 ++++++++ fastapi/data/active_income_stats.csv | 8 +++++ fastapi/tests/test_data_startup.py | 33 +++++++++++++++++++ 5 files changed, 70 insertions(+) create mode 100644 fastapi/data/active_income_stats.csv create mode 100644 fastapi/tests/test_data_startup.py diff --git a/.gitignore b/.gitignore index 2d27cdd..40f6c98 100644 --- a/.gitignore +++ b/.gitignore @@ -63,6 +63,11 @@ htmlcov/ *.sqlite3 mysql_data/ data/ +# 런타임에 필요한 집계 통계 파일만 예외적으로 커밋한다(개인 단위 원본 데이터 아님). +# 디렉터리를 먼저 풀어준 뒤 그 안의 나머지 파일은 다시 전부 무시하고, 대상 파일 하나만 재포함한다. +!fastapi/data/ +fastapi/data/* +!fastapi/data/active_income_stats.csv # ========================= # Docker diff --git a/fastapi/app/main.py b/fastapi/app/main.py index b2275c1..78d4513 100644 --- a/fastapi/app/main.py +++ b/fastapi/app/main.py @@ -1,12 +1,23 @@ +from contextlib import asynccontextmanager + from fastapi import FastAPI +from app.repositories.employees_income_repository import ensure_data_available from app.routers import employees, retirement + +@asynccontextmanager +async def lifespan(app: FastAPI): + ensure_data_available() + yield + + app = FastAPI( title="ORBIT FastAPI Server", description="ORBIT FastAPI Server", version="0.1.0", root_path="/ai", + lifespan=lifespan, ) app.include_router(employees.router) diff --git a/fastapi/app/repositories/employees_income_repository.py b/fastapi/app/repositories/employees_income_repository.py index a198239..811d0e6 100644 --- a/fastapi/app/repositories/employees_income_repository.py +++ b/fastapi/app/repositories/employees_income_repository.py @@ -6,6 +6,19 @@ _stats: pd.DataFrame | None = None +def ensure_data_available() -> None: + """/api/employees/simulate에 필요한 소득 통계 CSV의 존재를 앱 기동 시점에 검증한다. + + 파일이 없으면 첫 요청에서 500이 나는 대신, 여기서 즉시 RuntimeError로 기동을 실패시킨다. + """ + if not _CSV_PATH.exists(): + raise RuntimeError( + f"필수 데이터 파일이 없습니다: {_CSV_PATH}\n" + "재직자 연금 시뮬레이션(/api/employees/simulate)에 필요한 소득 통계 파일(active_income_stats.csv)입니다. " + "scripts/preprocess.py로 생성하거나, 배포 환경에서 데이터 볼륨이 올바르게 마운트됐는지 확인하세요." + ) + + def _get_stats() -> pd.DataFrame: global _stats if _stats is None: diff --git a/fastapi/data/active_income_stats.csv b/fastapi/data/active_income_stats.csv new file mode 100644 index 0000000..69d3a16 --- /dev/null +++ b/fastapi/data/active_income_stats.csv @@ -0,0 +1,8 @@ +구간,평균,중위값,p25,p75,count +0~59,3939103.5441879225,3787000.0,2817000.0,4681000.0,312427 +60~119,5274405.338985913,5082000.0,4174000.0,6234000.0,236824 +120~179,5889488.274865372,5667000.0,4654000.0,7225000.0,116246 +180~239,6582351.038499201,6413000.0,5550000.0,8094000.0,97015 +240~299,7182378.279669712,7135000.0,6338000.0,8704000.0,81868 +300~359,7626538.364426988,7740000.0,6972000.0,8704000.0,71290 +360+,8061912.59251256,8279000.0,7695000.0,8704000.0,74044 diff --git a/fastapi/tests/test_data_startup.py b/fastapi/tests/test_data_startup.py new file mode 100644 index 0000000..9e02fa5 --- /dev/null +++ b/fastapi/tests/test_data_startup.py @@ -0,0 +1,33 @@ +import pytest + +from app.repositories import employees_income_repository + + +def test_ensure_data_available_passes_when_csv_exists(): + employees_income_repository.ensure_data_available() + + +def test_ensure_data_available_raises_clear_error_when_csv_missing(monkeypatch, tmp_path): + missing_path = tmp_path / "active_income_stats.csv" + monkeypatch.setattr(employees_income_repository, "_CSV_PATH", missing_path) + + with pytest.raises(RuntimeError) as exc_info: + employees_income_repository.ensure_data_available() + + message = str(exc_info.value) + assert str(missing_path) in message + assert "active_income_stats.csv" in message + + +def test_app_startup_fails_fast_when_required_csv_missing(monkeypatch, tmp_path): + """앱 기동 시점에 검증이 실행되어, 첫 요청이 아니라 startup에서 즉시 실패해야 한다.""" + from fastapi.testclient import TestClient + + from app.main import app + + missing_path = tmp_path / "active_income_stats.csv" + monkeypatch.setattr(employees_income_repository, "_CSV_PATH", missing_path) + + with pytest.raises(RuntimeError): + with TestClient(app): + pass From 1cc3b67cdc0868eca362586f9b6e221e7692196d Mon Sep 17 00:00:00 2001 From: jung32111 Date: Sat, 25 Jul 2026 09:33:04 +0900 Subject: [PATCH 3/7] =?UTF-8?q?=E2=9C=A8=20Feat:=20retirement=20API=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=ED=95=84=EB=93=9C=EB=A5=BC=20=EC=9B=90=20?= =?UTF-8?q?=EB=8B=A8=EC=9C=84=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /api/retirement/* 5개 요청·응답의 모든 금액 필드가 만원과 원을 혼용하고 있었다(예: employees/simulate는 원, retirement/*는 만원인데 필드명은 동일하게 monthly_pension). 프론트가 두 API를 이어 쓰면 10,000배 오차가 조용히 발생하는 문제였다. 내부 계산 로직(app/services/retirement_service.py)과 상수는 그대로 만원 단위를 쓰고, app/schemas/money.py의 WonAmountInput/WonAmountOutput 타입으로 Pydantic 스키마 경계에서만 원 <-> 만원 변환을 수행하도록 했다. 변환 지점을 한 곳에 모아 서비스 코드는 전혀 건드리지 않았다. reduction_rules.threshold처럼 고정 상수와 비교되는 필드는 변환 여부에 따라 결과가 실제로 달라지므로(회귀 테스트로 검증: threshold와 정확히 같은 재취업 소득을 원 단위로 넣으면 감액이 0이어야 함), 이를 tests/test_money_unit_consistency.py에 회귀 테스트로 먼저 추가한 뒤 고쳤다. 골든 스냅샷은 동일한 실제 시나리오(예: "월 생활비 250만원")를 유지한 채 입력 리터럴에 10,000을 곱해 새 계약에 맞게 갱신했다. --- fastapi/app/schemas/money.py | 30 + fastapi/app/schemas/retirement.py | 38 +- .../tests/golden/diagnosis_insufficient.json | 412 ++--- fastapi/tests/golden/diagnosis_middle.json | 412 ++--- .../tests/golden/diagnosis_sufficient.json | 362 ++-- .../recommendations_saving_and_income.json | 414 ++--- .../golden/recommendations_saving_only.json | 414 ++--- .../golden/recommendations_sufficient.json | 364 ++-- fastapi/tests/golden/reduction_capped.json | 418 ++--- .../tests/golden/reduction_no_reduction.json | 418 ++--- fastapi/tests/golden/reduction_partial.json | 418 ++--- fastapi/tests/golden/scenarios_basic.json | 1648 ++++++++--------- .../scenarios_with_deduction_years.json | 1648 ++++++++--------- fastapi/tests/test_golden_snapshots.py | 79 +- fastapi/tests/test_money_unit_consistency.py | 80 + 15 files changed, 3636 insertions(+), 3519 deletions(-) create mode 100644 fastapi/app/schemas/money.py create mode 100644 fastapi/tests/test_money_unit_consistency.py diff --git a/fastapi/app/schemas/money.py b/fastapi/app/schemas/money.py new file mode 100644 index 0000000..dfbe118 --- /dev/null +++ b/fastapi/app/schemas/money.py @@ -0,0 +1,30 @@ +"""API 경계의 금액 단위(원) <-> 내부 계산 단위(만원) 변환을 한 곳에 모은 모듈. + +app/services/* 의 계산 로직과 상수(INVESTMENT_RETURN, reduction_rules의 threshold 등)는 +전부 만원 단위를 그대로 사용한다(변경하지 않음). 이 모듈이 제공하는 타입 별칭을 +요청/응답 스키마의 금액 필드에 붙이면, Pydantic이 역직렬화/직렬화 시점에 자동으로 +원 <-> 만원 변환을 수행한다. 다른 곳에서 별도로 곱셈/나눗셈을 하지 않는다. +""" + +from typing import Annotated + +from pydantic import BeforeValidator, PlainSerializer + +WON_PER_MANWON = 10_000 + + +def won_to_manwon(value: float) -> float: + """API 요청으로 들어온 원 단위 금액을 내부 계산용 만원 단위로 변환한다.""" + return value / WON_PER_MANWON + + +def manwon_to_won(value: float) -> int: + """내부 계산 결과(만원)를 API 응답용 원 단위 정수로 변환한다.""" + return round(value * WON_PER_MANWON) + + +WonAmountInput = Annotated[float, BeforeValidator(won_to_manwon)] +"""요청 스키마의 금액 필드에 사용한다. API 입력은 원 단위, 필드에는 만원 단위로 저장된다.""" + +WonAmountOutput = Annotated[float, PlainSerializer(manwon_to_won, return_type=int)] +"""응답 스키마의 금액 필드에 사용한다. 내부(만원) 값을 API 출력 시 원 단위 정수로 직렬화한다.""" diff --git a/fastapi/app/schemas/retirement.py b/fastapi/app/schemas/retirement.py index 74dda83..ad7d261 100644 --- a/fastapi/app/schemas/retirement.py +++ b/fastapi/app/schemas/retirement.py @@ -2,6 +2,8 @@ from pydantic import BaseModel +from app.schemas.money import WonAmountInput, WonAmountOutput + class ReadinessStatus(str, Enum): """노후 준비 상태 판정 결과""" @@ -13,16 +15,16 @@ class ReadinessStatus(str, Enum): class TimelinePoint(BaseModel): age: int # 나이 - asset: float # 해당 나이 시점의 자산 - income: float # 해당 연도 소득(연금) - expense: float # 해당 연도 지출 - gap: float # 연간 Gap (지출 - 소득) - cumulative_gap: float # 누적 Gap + asset: WonAmountOutput # 해당 나이 시점의 자산 (원) + income: WonAmountOutput # 해당 연도 소득(연금) (원) + expense: WonAmountOutput # 해당 연도 지출 (원) + gap: WonAmountOutput # 연간 Gap (지출 - 소득) (원) + cumulative_gap: WonAmountOutput # 누적 Gap (원) class SimulationResult(BaseModel): current_age: int # 현재 나이 - monthly_gap: float # 현재 시점의 월 Gap (월 생활비 - 월 연금) + monthly_gap: WonAmountOutput # 현재 시점의 월 Gap (월 생활비 - 월 연금) (원) depletion_age: int | None # 자산 고갈 나이 (고갈되지 않으면 None) target_age: int # 목표연령 (성별 고정값) status: ReadinessStatus # 노후 준비 상태 @@ -31,9 +33,9 @@ class SimulationResult(BaseModel): class DiagnosisRequest(BaseModel): current_age: int # 현재 나이 - monthly_expenses: float # 월 생활비 - monthly_pension: float # 월 연금 수령액 - asset: float # 현재 보유 자산 + monthly_expenses: WonAmountInput # 월 생활비 (원) + monthly_pension: WonAmountInput # 월 연금 수령액 (원) + asset: WonAmountInput # 현재 보유 자산 (원) gender: str # 성별 ("male" 또는 "female") @@ -52,8 +54,8 @@ class RecommendationType(str, Enum): class RecommendationResult(BaseModel): current_age: int # 현재 나이 recommendation_type: RecommendationType # 추천 유형 - required_saving: float # 필요 월 절약액 (만원) - required_income: float # 필요 월 추가 소득액 (만원) + required_saving: WonAmountOutput # 필요 월 절약액 (원) + required_income: WonAmountOutput # 필요 월 추가 소득액 (원) target_status: ReadinessStatus # 추천 산정에 사용된 목표 기준 (항상 SUFFICIENT="고갈 없음") depletion_age: int | None # 개선 적용 후 자산 고갈 나이 target_age: int # 목표연령 @@ -64,16 +66,16 @@ class RecommendationResult(BaseModel): class ReductionRequest(DiagnosisRequest): """진단(diagnosis)과 동일한 입력 스키마를 재사용하고 재취업 관련 필드를 추가""" - reemployment_income: float # 재취업 예상 월소득 (만원) + reemployment_income: WonAmountInput # 재취업 예상 월소득 (원) year: int | None = None # 소득심사 기준 연도 (미지정 시 최신 규칙 적용) class ReductionResult(BaseModel): current_age: int # 현재 나이 - reemployment_income: float # 재취업 예상 월소득 (만원) - monthly_reduction: float # 월 감액액 (만원) - reduced_monthly_pension: float # 감액 후 월 실수령 연금액 (만원) - full_payment_income_threshold: float # 전액 수령 가능 소득 상한 (만원) + reemployment_income: WonAmountOutput # 재취업 예상 월소득 (원) + monthly_reduction: WonAmountOutput # 월 감액액 (원) + reduced_monthly_pension: WonAmountOutput # 감액 후 월 실수령 연금액 (원) + full_payment_income_threshold: WonAmountOutput # 전액 수령 가능 소득 상한 (원) depletion_age: int | None # 감액 반영 후 자산 고갈 나이 target_age: int # 목표연령 status: ReadinessStatus # 감액 반영 후 노후 준비 상태 @@ -84,7 +86,7 @@ class ScenariosRequest(DiagnosisRequest): """진단(diagnosis)과 동일한 입력 스키마를 재사용하고 수령방식 계산에 필요한 필드를 추가""" early_years: int = 5 # 조기수령 연수 (1~5년, 1년당 5% 감액) - base_monthly_income: float # 기준소득월액 (만원) - LUMP_SUM/SPLIT 공제일시금 산식에 사용 + base_monthly_income: WonAmountInput # 기준소득월액 (원) - LUMP_SUM/SPLIT 공제일시금 산식에 사용 total_service_years: int # 총 재직연수 - LUMP_SUM/SPLIT 공제일시금 산식에 사용 deduction_years: int | None = None # SPLIT(분할수령) 공제연수. 미지정 시 제약 내 최댓값으로 클램프 @@ -101,7 +103,7 @@ class ScenarioType(str, Enum): class ScenarioOutcome(BaseModel): scenario_type: ScenarioType # 수령방식 depletion_age: int # 자산 고갈 나이 (고갈되지 않으면 MAX_AGE) - total_received: float # 총 수령액 (만원, current_age~MAX_AGE 동일 기간 기준) + total_received: WonAmountOutput # 총 수령액 (원, current_age~MAX_AGE 동일 기간 기준) break_even_age: int | None # NORMAL 대비 손익분기 나이 (이 나이 이상 생존 시 NORMAL이 유리해짐). NORMAL 자신은 None timeline: list[TimelinePoint] # 연도별 자산 추이 diff --git a/fastapi/tests/golden/diagnosis_insufficient.json b/fastapi/tests/golden/diagnosis_insufficient.json index e227945..f6c6865 100644 --- a/fastapi/tests/golden/diagnosis_insufficient.json +++ b/fastapi/tests/golden/diagnosis_insufficient.json @@ -2,337 +2,337 @@ "body": { "current_age": 60, "depletion_age": 68, - "monthly_gap": 100.0, + "monthly_gap": 1000000, "status": "INSUFFICIENT", "target_age": 84, "timeline": [ { "age": 60, - "asset": 10000.0, - "cumulative_gap": 1200.0, - "expense": 3000.0, - "gap": 1200.0, - "income": 1800.0 + "asset": 100000000, + "cumulative_gap": 12000000, + "expense": 30000000, + "gap": 12000000, + "income": 18000000 }, { "age": 61, - "asset": 9064.0, - "cumulative_gap": 2460.0, - "expense": 3060.0, - "gap": 1260.0, - "income": 1800.0 + "asset": 90640000, + "cumulative_gap": 24600000, + "expense": 30600000, + "gap": 12600000, + "income": 18000000 }, { "age": 62, - "asset": 8038.12, - "cumulative_gap": 3781.2000000000003, - "expense": 3121.2000000000003, - "gap": 1321.2000000000003, - "income": 1800.0 + "asset": 80381200, + "cumulative_gap": 37812000, + "expense": 31212000, + "gap": 13212000, + "income": 18000000 }, { "age": 63, - "asset": 6918.4276, - "cumulative_gap": 5164.8240000000005, - "expense": 3183.6240000000003, - "gap": 1383.6240000000003, - "income": 1800.0 + "asset": 69184276, + "cumulative_gap": 51648240, + "expense": 31836240, + "gap": 13836240, + "income": 18000000 }, { "age": 64, - "asset": 5700.847707999999, - "cumulative_gap": 6612.120480000001, - "expense": 3247.2964800000004, - "gap": 1447.2964800000004, - "income": 1800.0 + "asset": 57008477, + "cumulative_gap": 66121205, + "expense": 32472965, + "gap": 14472965, + "income": 18000000 }, { "age": 65, - "asset": 4381.157764839999, - "cumulative_gap": 8124.362889600002, - "expense": 3312.2424096000004, - "gap": 1512.2424096000004, - "income": 1800.0 + "asset": 43811578, + "cumulative_gap": 81243629, + "expense": 33122424, + "gap": 15122424, + "income": 18000000 }, { "age": 66, - "asset": 2954.9828158971986, - "cumulative_gap": 9702.850147392002, - "expense": 3378.4872577920005, - "gap": 1578.4872577920005, - "income": 1800.0 + "asset": 29549828, + "cumulative_gap": 97028501, + "expense": 33784873, + "gap": 15784873, + "income": 18000000 }, { "age": 67, - "asset": 1417.7904248483542, - "cumulative_gap": 11348.907150339843, - "expense": 3446.0570029478404, - "gap": 1646.0570029478404, - "income": 1800.0 + "asset": 14177904, + "cumulative_gap": 113489072, + "expense": 34460570, + "gap": 16460570, + "income": 18000000 }, { "age": 68, - "asset": -235.1145754424708, - "cumulative_gap": 13063.88529334664, - "expense": 3514.9781430067974, - "gap": 1714.9781430067974, - "income": 1800.0 + "asset": -2351146, + "cumulative_gap": 130638853, + "expense": 35149781, + "gap": 17149781, + "income": 18000000 }, { "age": 69, - "asset": -2008.5955000027463, - "cumulative_gap": 14849.162999213575, - "expense": 3585.2777058669335, - "gap": 1785.2777058669335, - "income": 1800.0 + "asset": -20085955, + "cumulative_gap": 148491630, + "expense": 35852777, + "gap": 17852777, + "income": 18000000 }, { "age": 70, - "asset": -3907.6894020457703, - "cumulative_gap": 16706.14625919785, - "expense": 3656.983259984272, - "gap": 1856.983259984272, - "income": 1800.0 + "asset": -39076894, + "cumulative_gap": 167061463, + "expense": 36569833, + "gap": 18569833, + "income": 18000000 }, { "age": 71, - "asset": -5937.612841890944, - "cumulative_gap": 18636.269184381807, - "expense": 3730.1229251839577, - "gap": 1930.1229251839577, - "income": 1800.0 + "asset": -59376128, + "cumulative_gap": 186362692, + "expense": 37301229, + "gap": 19301229, + "income": 18000000 }, { "age": 72, - "asset": -8103.767840087149, - "cumulative_gap": 20640.994568069444, - "expense": 3804.725383687637, - "gap": 2004.725383687637, - "income": 1800.0 + "asset": -81037678, + "cumulative_gap": 206409946, + "expense": 38047254, + "gap": 20047254, + "income": 18000000 }, { "age": 73, - "asset": -10411.748020488028, - "cumulative_gap": 22721.814459430832, - "expense": 3880.81989136139, - "gap": 2080.81989136139, - "income": 1800.0 + "asset": -104117480, + "cumulative_gap": 227218145, + "expense": 38808199, + "gap": 20808199, + "income": 18000000 }, { "age": 74, - "asset": -12867.344949204902, - "cumulative_gap": 24880.25074861945, - "expense": 3958.436289188618, - "gap": 2158.436289188618, - "income": 1800.0 + "asset": -128673449, + "cumulative_gap": 248802507, + "expense": 39584363, + "gap": 21584363, + "income": 18000000 }, { "age": 75, - "asset": -15476.554675545325, - "cumulative_gap": 27117.85576359184, - "expense": 4037.6050149723906, - "gap": 2237.6050149723906, - "income": 1800.0 + "asset": -154765547, + "cumulative_gap": 271178558, + "expense": 40376050, + "gap": 22376050, + "income": 18000000 }, { "age": 76, - "asset": -18245.584481233247, - "cumulative_gap": 29436.21287886368, - "expense": 4118.357115271839, - "gap": 2318.3571152718387, - "income": 1800.0 + "asset": -182455845, + "cumulative_gap": 294362129, + "expense": 41183571, + "gap": 23183571, + "income": 18000000 }, { "age": 77, - "asset": -21180.85984440024, - "cumulative_gap": 31836.937136440956, - "expense": 4200.724257577275, - "gap": 2400.7242575772752, - "income": 1800.0 + "asset": -211808598, + "cumulative_gap": 318369371, + "expense": 42007243, + "gap": 24007243, + "income": 18000000 }, { "age": 78, - "asset": -24289.03162503684, - "cumulative_gap": 34321.67587916978, - "expense": 4284.73874272882, - "gap": 2484.7387427288204, - "income": 1800.0 + "asset": -242890316, + "cumulative_gap": 343216759, + "expense": 42847387, + "gap": 24847387, + "income": 18000000 }, { "age": 79, - "asset": -27576.983478798633, - "cumulative_gap": 36892.10939675318, - "expense": 4370.433517583397, - "gap": 2570.4335175833967, - "income": 1800.0 + "asset": -275769835, + "cumulative_gap": 368921094, + "expense": 43704335, + "gap": 25704335, + "income": 18000000 }, { "age": 80, - "asset": -31051.839506273493, - "cumulative_gap": 39549.95158468824, - "expense": 4457.842187935064, - "gap": 2657.8421879350644, - "income": 1800.0 + "asset": -310518395, + "cumulative_gap": 395499516, + "expense": 44578422, + "gap": 26578422, + "income": 18000000 }, { "age": 81, - "asset": -34720.972145034815, - "cumulative_gap": 42296.950616382004, - "expense": 4546.999031693766, - "gap": 2746.9990316937656, - "income": 1800.0 + "asset": -347209721, + "cumulative_gap": 422969506, + "expense": 45469990, + "gap": 27469990, + "income": 18000000 }, { "age": 82, - "asset": -38592.010312030434, - "cumulative_gap": 45134.88962870964, - "expense": 4637.939012327641, - "gap": 2837.9390123276407, - "income": 1800.0 + "asset": -385920103, + "cumulative_gap": 451348896, + "expense": 46379390, + "gap": 28379390, + "income": 18000000 }, { "age": 83, - "asset": -42672.847804088815, - "cumulative_gap": 48065.58742128384, - "expense": 4730.697792574194, - "gap": 2930.697792574194, - "income": 1800.0 + "asset": -426728478, + "cumulative_gap": 480655874, + "expense": 47306978, + "gap": 29306978, + "income": 18000000 }, { "age": 84, - "asset": -46971.6519645629, - "cumulative_gap": 51090.89916970952, - "expense": 4825.311748425678, - "gap": 3025.311748425678, - "income": 1800.0 + "asset": -469716520, + "cumulative_gap": 510908992, + "expense": 48253117, + "gap": 30253117, + "income": 18000000 }, { "age": 85, - "asset": -51496.87262437824, - "cumulative_gap": 54212.71715310371, - "expense": 4921.817983394192, - "gap": 3121.817983394192, - "income": 1800.0 + "asset": -514968726, + "cumulative_gap": 542127172, + "expense": 49218180, + "gap": 31218180, + "income": 18000000 }, { "age": 86, - "asset": -56257.2513260056, - "cumulative_gap": 57432.97149616579, - "expense": 5020.254343062076, - "gap": 3220.2543430620763, - "income": 1800.0 + "asset": -562572513, + "cumulative_gap": 574329715, + "expense": 50202543, + "gap": 32202543, + "income": 18000000 }, { "age": 87, - "asset": -61261.83083913971, - "cumulative_gap": 60753.63092608911, - "expense": 5120.6594299233175, - "gap": 3320.6594299233175, - "income": 1800.0 + "asset": -612618308, + "cumulative_gap": 607536309, + "expense": 51206594, + "gap": 33206594, + "income": 18000000 }, { "age": 88, - "asset": -66519.96497713492, - "cumulative_gap": 64176.70354461089, - "expense": 5223.072618521784, - "gap": 3423.0726185217836, - "income": 1800.0 + "asset": -665199650, + "cumulative_gap": 641767035, + "expense": 52230726, + "gap": 34230726, + "income": 18000000 }, { "age": 89, - "asset": -72041.3287235264, - "cumulative_gap": 67704.23761550311, - "expense": 5327.5340708922195, - "gap": 3527.5340708922195, - "income": 1800.0 + "asset": -720413287, + "cumulative_gap": 677042376, + "expense": 53275341, + "gap": 35275341, + "income": 18000000 }, { "age": 90, - "asset": -77835.92867825118, - "cumulative_gap": 71338.32236781318, - "expense": 5434.084752310064, - "gap": 3634.084752310064, - "income": 1800.0 + "asset": -778359287, + "cumulative_gap": 713383224, + "expense": 54340848, + "gap": 36340848, + "income": 18000000 }, { "age": 91, - "asset": -83914.11383347808, - "cumulative_gap": 75081.08881516944, - "expense": 5542.766447356265, - "gap": 3742.7664473562654, - "income": 1800.0 + "asset": -839141138, + "cumulative_gap": 750810888, + "expense": 55427664, + "gap": 37427664, + "income": 18000000 }, { "age": 92, - "asset": -90286.58668925938, - "cumulative_gap": 78934.71059147283, - "expense": 5653.621776303391, - "gap": 3853.621776303391, - "income": 1800.0 + "asset": -902865867, + "cumulative_gap": 789347106, + "expense": 56536218, + "gap": 38536218, + "income": 18000000 }, { "age": 93, - "asset": -96964.41471952965, - "cumulative_gap": 82901.40480330228, - "expense": 5766.694211829459, - "gap": 3966.694211829459, - "income": 1800.0 + "asset": -969644147, + "cumulative_gap": 829014048, + "expense": 57666942, + "gap": 39666942, + "income": 18000000 }, { "age": 94, - "asset": -103959.04219929989, - "cumulative_gap": 86983.43289936833, - "expense": 5882.028096066048, - "gap": 4082.0280960660484, - "income": 1800.0 + "asset": -1039590422, + "cumulative_gap": 869834329, + "expense": 58820281, + "gap": 40820281, + "income": 18000000 }, { "age": 95, - "asset": -111282.30240422691, - "cumulative_gap": 91183.1015573557, - "expense": 5999.668657987369, - "gap": 4199.668657987369, - "income": 1800.0 + "asset": -1112823024, + "cumulative_gap": 911831016, + "expense": 59996687, + "gap": 41996687, + "income": 18000000 }, { "age": 96, - "asset": -118946.4301940807, - "cumulative_gap": 95502.76358850281, - "expense": 6119.662031147117, - "gap": 4319.662031147117, - "income": 1800.0 + "asset": -1189464302, + "cumulative_gap": 955027636, + "expense": 61196620, + "gap": 43196620, + "income": 18000000 }, { "age": 97, - "asset": -126964.07499198466, - "cumulative_gap": 99944.81886027288, - "expense": 6242.055271770059, - "gap": 4442.055271770059, - "income": 1800.0 + "asset": -1269640750, + "cumulative_gap": 999448189, + "expense": 62420553, + "gap": 44420553, + "income": 18000000 }, { "age": 98, - "asset": -135348.31417166736, - "cumulative_gap": 104511.71523747833, - "expense": 6366.89637720546, - "gap": 4566.89637720546, - "income": 1800.0 + "asset": -1353483142, + "cumulative_gap": 1045117152, + "expense": 63668964, + "gap": 45668964, + "income": 18000000 }, { "age": 99, - "asset": -144112.666865339, - "cumulative_gap": 109205.9495422279, - "expense": 6494.23430474957, - "gap": 4694.23430474957, - "income": 1800.0 + "asset": -1441126669, + "cumulative_gap": 1092059495, + "expense": 64942343, + "gap": 46942343, + "income": 18000000 }, { "age": 100, - "asset": -153271.10820519124, - "cumulative_gap": 114030.06853307247, - "expense": 6624.118990844561, - "gap": 4824.118990844561, - "income": 1800.0 + "asset": -1532711082, + "cumulative_gap": 1140300685, + "expense": 66241190, + "gap": 48241190, + "income": 18000000 } ] }, diff --git a/fastapi/tests/golden/diagnosis_middle.json b/fastapi/tests/golden/diagnosis_middle.json index d1cb8f5..fee5197 100644 --- a/fastapi/tests/golden/diagnosis_middle.json +++ b/fastapi/tests/golden/diagnosis_middle.json @@ -2,337 +2,337 @@ "body": { "current_age": 60, "depletion_age": 96, - "monthly_gap": 50.0, + "monthly_gap": 500000, "status": "MIDDLE", "target_age": 88, "timeline": [ { "age": 60, - "asset": 32000.0, - "cumulative_gap": 600.0, - "expense": 2400.0, - "gap": 600.0, - "income": 1800.0 + "asset": 320000000, + "cumulative_gap": 6000000, + "expense": 24000000, + "gap": 6000000, + "income": 18000000 }, { "age": 61, - "asset": 32342.0, - "cumulative_gap": 1248.0, - "expense": 2448.0, - "gap": 648.0, - "income": 1800.0 + "asset": 323420000, + "cumulative_gap": 12480000, + "expense": 24480000, + "gap": 6480000, + "income": 18000000 }, { "age": 62, - "asset": 32644.82, - "cumulative_gap": 1944.96, - "expense": 2496.96, - "gap": 696.96, - "income": 1800.0 + "asset": 326448200, + "cumulative_gap": 19449600, + "expense": 24969600, + "gap": 6969600, + "income": 18000000 }, { "age": 63, - "asset": 32906.2958, - "cumulative_gap": 2691.8592000000003, - "expense": 2546.8992000000003, - "gap": 746.8992000000003, - "income": 1800.0 + "asset": 329062958, + "cumulative_gap": 26918592, + "expense": 25468992, + "gap": 7468992, + "income": 18000000 }, { "age": 64, - "asset": 33124.178498, - "cumulative_gap": 3489.6963840000008, - "expense": 2597.8371840000004, - "gap": 797.8371840000004, - "income": 1800.0 + "asset": 331241785, + "cumulative_gap": 34896964, + "expense": 25978372, + "gap": 7978372, + "income": 18000000 }, { "age": 65, - "asset": 33296.131553420004, - "cumulative_gap": 4339.4903116800015, - "expense": 2649.7939276800007, - "gap": 849.7939276800007, - "income": 1800.0 + "asset": 332961316, + "cumulative_gap": 43394903, + "expense": 26497939, + "gap": 8497939, + "income": 18000000 }, { "age": 66, - "asset": 33419.727754512205, - "cumulative_gap": 5242.280117913602, - "expense": 2702.7898062336008, - "gap": 902.7898062336008, - "income": 1800.0 + "asset": 334197278, + "cumulative_gap": 52422801, + "expense": 27027898, + "gap": 9027898, + "income": 18000000 }, { "age": 67, - "asset": 33492.44608672696, - "cumulative_gap": 6199.125720271875, - "expense": 2756.845602358273, - "gap": 956.845602358273, - "income": 1800.0 + "asset": 334924461, + "cumulative_gap": 61991257, + "expense": 27568456, + "gap": 9568456, + "income": 18000000 }, { "age": 68, - "asset": 33511.668498899744, - "cumulative_gap": 7211.108234677314, - "expense": 2811.9825144054385, - "gap": 1011.9825144054385, - "income": 1800.0 + "asset": 335116685, + "cumulative_gap": 72111082, + "expense": 28119825, + "gap": 10119825, + "income": 18000000 }, { "age": 69, - "asset": 33474.676564029134, - "cumulative_gap": 8279.330399370861, - "expense": 2868.2221646935473, - "gap": 1068.2221646935473, - "income": 1800.0 + "asset": 334746766, + "cumulative_gap": 82793304, + "expense": 28682222, + "gap": 10682222, + "income": 18000000 }, { "age": 70, - "asset": 33378.64803131566, - "cumulative_gap": 9404.917007358279, - "expense": 2925.586607987418, - "gap": 1125.5866079874181, - "income": 1800.0 + "asset": 333786480, + "cumulative_gap": 94049170, + "expense": 29255866, + "gap": 11255866, + "income": 18000000 }, { "age": 71, - "asset": 33220.65326602809, - "cumulative_gap": 10589.015347505447, - "expense": 2984.0983401471667, - "gap": 1184.0983401471667, - "income": 1800.0 + "asset": 332206533, + "cumulative_gap": 105890153, + "expense": 29840983, + "gap": 11840983, + "income": 18000000 }, { "age": 72, - "asset": 32997.65157365735, - "cumulative_gap": 11832.795654455556, - "expense": 3043.78030695011, - "gap": 1243.7803069501101, - "income": 1800.0 + "asset": 329976516, + "cumulative_gap": 118327957, + "expense": 30437803, + "gap": 12437803, + "income": 18000000 }, { "age": 73, - "asset": 32706.487404708456, - "cumulative_gap": 13137.45156754467, - "expense": 3104.6559130891123, - "gap": 1304.6559130891123, - "income": 1800.0 + "asset": 327064874, + "cumulative_gap": 131374516, + "expense": 31046559, + "gap": 13046559, + "income": 18000000 }, { "age": 74, - "asset": 32343.886436367928, - "cumulative_gap": 14504.200598895564, - "expense": 3166.7490313508947, - "gap": 1366.7490313508947, - "income": 1800.0 + "asset": 323438864, + "cumulative_gap": 145042006, + "expense": 31667490, + "gap": 13667490, + "income": 18000000 }, { "age": 75, - "asset": 31906.451527167545, - "cumulative_gap": 15934.284610873478, - "expense": 3230.0840119779127, - "gap": 1430.0840119779127, - "income": 1800.0 + "asset": 319064515, + "cumulative_gap": 159342846, + "expense": 32300840, + "gap": 14300840, + "income": 18000000 }, { "age": 76, - "asset": 31390.65854064532, - "cumulative_gap": 17428.970303090948, - "expense": 3294.685692217471, - "gap": 1494.6856922174711, - "income": 1800.0 + "asset": 313906585, + "cumulative_gap": 174289703, + "expense": 32946857, + "gap": 14946857, + "income": 18000000 }, { "age": 77, - "asset": 30792.852033880685, - "cumulative_gap": 18989.54970915277, - "expense": 3360.5794060618205, - "gap": 1560.5794060618205, - "income": 1800.0 + "asset": 307928520, + "cumulative_gap": 189895497, + "expense": 33605794, + "gap": 15605794, + "income": 18000000 }, { "age": 78, - "asset": 30109.24080665343, - "cumulative_gap": 20617.340703335827, - "expense": 3427.790994183057, - "gap": 1627.7909941830571, - "income": 1800.0 + "asset": 301092408, + "cumulative_gap": 206173407, + "expense": 34277910, + "gap": 16277910, + "income": 18000000 }, { "age": 79, - "asset": 29335.893306844482, - "cumulative_gap": 22313.687517402544, - "expense": 3496.3468140667183, - "gap": 1696.3468140667183, - "income": 1800.0 + "asset": 293358933, + "cumulative_gap": 223136875, + "expense": 34963468, + "gap": 16963468, + "income": 18000000 }, { "age": 80, - "asset": 28468.7328875611, - "cumulative_gap": 24079.961267750597, - "expense": 3566.2737503480525, - "gap": 1766.2737503480525, - "income": 1800.0 + "asset": 284687329, + "cumulative_gap": 240799613, + "expense": 35662738, + "gap": 17662738, + "income": 18000000 }, { "age": 81, - "asset": 27503.532911329436, - "cumulative_gap": 25917.56049310561, - "expense": 3637.5992253550135, - "gap": 1837.5992253550135, - "income": 1800.0 + "asset": 275035329, + "cumulative_gap": 259175605, + "expense": 36375992, + "gap": 18375992, + "income": 18000000 }, { "age": 82, - "asset": 26435.911696553656, - "cumulative_gap": 27827.911702967725, - "expense": 3710.3512098621136, - "gap": 1910.3512098621136, - "income": 1800.0 + "asset": 264359117, + "cumulative_gap": 278279117, + "expense": 37103512, + "gap": 19103512, + "income": 18000000 }, { "age": 83, - "asset": 25261.327301292287, - "cumulative_gap": 29812.469937027083, - "expense": 3784.558234059356, - "gap": 1984.558234059356, - "income": 1800.0 + "asset": 252613273, + "cumulative_gap": 298124699, + "expense": 37845582, + "gap": 19845582, + "income": 18000000 }, { "age": 84, - "asset": 23975.072139249918, - "cumulative_gap": 31872.719335767626, - "expense": 3860.2493987405433, - "gap": 2060.2493987405433, - "income": 1800.0 + "asset": 239750721, + "cumulative_gap": 318727193, + "expense": 38602494, + "gap": 20602494, + "income": 18000000 }, { "age": 85, - "asset": 22572.267422724657, - "cumulative_gap": 34010.17372248298, - "expense": 3937.4543867153543, - "gap": 2137.4543867153543, - "income": 1800.0 + "asset": 225722674, + "cumulative_gap": 340101737, + "expense": 39374544, + "gap": 21374544, + "income": 18000000 }, { "age": 86, - "asset": 21047.85742708958, - "cumulative_gap": 36226.37719693264, - "expense": 4016.2034744496614, - "gap": 2216.2034744496614, - "income": 1800.0 + "asset": 210478574, + "cumulative_gap": 362263772, + "expense": 40162035, + "gap": 22162035, + "income": 18000000 }, { "age": 87, - "asset": 19396.60357121912, - "cumulative_gap": 38522.904740871294, - "expense": 4096.527543938655, - "gap": 2296.527543938655, - "income": 1800.0 + "asset": 193966036, + "cumulative_gap": 385229047, + "expense": 40965275, + "gap": 22965275, + "income": 18000000 }, { "age": 88, - "asset": 17613.078308098877, - "cumulative_gap": 40901.36283568872, - "expense": 4178.458094817428, - "gap": 2378.458094817428, - "income": 1800.0 + "asset": 176130783, + "cumulative_gap": 409013628, + "expense": 41784581, + "gap": 23784581, + "income": 18000000 }, { "age": 89, - "asset": 15691.658819679893, - "cumulative_gap": 43363.39009240249, - "expense": 4262.027256713776, - "gap": 2462.0272567137763, - "income": 1800.0 + "asset": 156916588, + "cumulative_gap": 433633901, + "expense": 42620273, + "gap": 24620273, + "income": 18000000 }, { "age": 90, - "asset": 13626.520509855101, - "cumulative_gap": 45910.657894250544, - "expense": 4347.267801848052, - "gap": 2547.267801848052, - "income": 1800.0 + "asset": 136265205, + "cumulative_gap": 459106579, + "expense": 43472678, + "gap": 25472678, + "income": 18000000 }, { "age": 91, - "asset": 11411.630289247261, - "cumulative_gap": 48544.87105213555, - "expense": 4434.213157885013, - "gap": 2634.213157885013, - "income": 1800.0 + "asset": 114116303, + "cumulative_gap": 485448711, + "expense": 44342132, + "gap": 26342132, + "income": 18000000 }, { "age": 92, - "asset": 9040.739645303116, - "cumulative_gap": 51267.768473178265, - "expense": 4522.897421042713, - "gap": 2722.897421042713, - "income": 1800.0 + "asset": 90407396, + "cumulative_gap": 512677685, + "expense": 45228974, + "gap": 27228974, + "income": 18000000 }, { "age": 93, - "asset": 6507.377490988215, - "cumulative_gap": 54081.123842641835, - "expense": 4613.3553694635675, - "gap": 2813.3553694635675, - "income": 1800.0 + "asset": 65073775, + "cumulative_gap": 540811238, + "expense": 46133554, + "gap": 28133554, + "income": 18000000 }, { "age": 94, - "asset": 3804.842785170387, - "cumulative_gap": 56986.746319494676, - "expense": 4705.622476852839, - "gap": 2905.622476852839, - "income": 1800.0 + "asset": 38048428, + "cumulative_gap": 569867463, + "expense": 47056225, + "gap": 29056225, + "income": 18000000 }, { "age": 95, - "asset": 926.1969175670741, - "cumulative_gap": 59986.48124588457, - "expense": 4799.734926389896, - "gap": 2999.734926389896, - "income": 1800.0 + "asset": 9261969, + "cumulative_gap": 599864812, + "expense": 47997349, + "gap": 29997349, + "income": 18000000 }, { "age": 96, - "asset": -2135.7441490875062, - "cumulative_gap": 63082.210870802264, - "expense": 4895.729624917694, - "gap": 3095.7296249176943, - "income": 1800.0 + "asset": -21357441, + "cumulative_gap": 630822109, + "expense": 48957296, + "gap": 30957296, + "income": 18000000 }, { "age": 97, - "asset": -5388.417987225357, - "cumulative_gap": 66275.85508821832, - "expense": 4993.644217416048, - "gap": 3193.6442174160484, - "income": 1800.0 + "asset": -53884180, + "cumulative_gap": 662758551, + "expense": 49936442, + "gap": 31936442, + "income": 18000000 }, { "age": 98, - "asset": -8839.52407078065, - "cumulative_gap": 69569.37218998269, - "expense": 5093.51710176437, - "gap": 3293.5171017643697, - "income": 1800.0 + "asset": -88395241, + "cumulative_gap": 695693722, + "expense": 50935171, + "gap": 32935171, + "income": 18000000 }, { "age": 99, - "asset": -12497.03240772137, - "cumulative_gap": 72964.75963378235, - "expense": 5195.387443799657, - "gap": 3395.3874437996574, - "income": 1800.0 + "asset": -124970324, + "cumulative_gap": 729647596, + "expense": 51953874, + "gap": 33953874, + "income": 18000000 }, { "age": 100, - "asset": -16369.192447066658, - "cumulative_gap": 76464.054826458, - "expense": 5299.2951926756505, - "gap": 3499.2951926756505, - "income": 1800.0 + "asset": -163691924, + "cumulative_gap": 764640548, + "expense": 52992952, + "gap": 34992952, + "income": 18000000 } ] }, diff --git a/fastapi/tests/golden/diagnosis_sufficient.json b/fastapi/tests/golden/diagnosis_sufficient.json index 3d937c1..63f8dea 100644 --- a/fastapi/tests/golden/diagnosis_sufficient.json +++ b/fastapi/tests/golden/diagnosis_sufficient.json @@ -2,297 +2,297 @@ "body": { "current_age": 65, "depletion_age": null, - "monthly_gap": -50.0, + "monthly_gap": -500000, "status": "SUFFICIENT", "target_age": 84, "timeline": [ { "age": 65, - "asset": 10000.0, - "cumulative_gap": -600.0, - "expense": 1800.0, - "gap": -600.0, - "income": 2400.0 + "asset": 100000000, + "cumulative_gap": -6000000, + "expense": 18000000, + "gap": -6000000, + "income": 24000000 }, { "age": 66, - "asset": 10918.0, - "cumulative_gap": -1164.0, - "expense": 1836.0, - "gap": -564.0, - "income": 2400.0 + "asset": 109180000, + "cumulative_gap": -11640000, + "expense": 18360000, + "gap": -5640000, + "income": 24000000 }, { "age": 67, - "asset": 11826.460000000001, - "cumulative_gap": -1691.28, - "expense": 1872.72, - "gap": -527.28, - "income": 2400.0 + "asset": 118264600, + "cumulative_gap": -16912800, + "expense": 18727200, + "gap": -5272800, + "income": 24000000 }, { "age": 68, - "asset": 12724.352200000001, - "cumulative_gap": -2181.1056, - "expense": 1910.1744, - "gap": -489.8255999999999, - "income": 2400.0 + "asset": 127243522, + "cumulative_gap": -21811056, + "expense": 19101744, + "gap": -4898256, + "income": 24000000 }, { "age": 69, - "asset": 13610.603134, - "cumulative_gap": -2632.727712, - "expense": 1948.3778880000002, - "gap": -451.6221119999998, - "income": 2400.0 + "asset": 136106031, + "cumulative_gap": -26327277, + "expense": 19483779, + "gap": -4516221, + "income": 24000000 }, { "age": 70, - "asset": 14484.092003380001, - "cumulative_gap": -3045.38226624, - "expense": 1987.3454457600003, - "gap": -412.6545542399997, - "income": 2400.0 + "asset": 144840920, + "cumulative_gap": -30453823, + "expense": 19873454, + "gap": -4126546, + "income": 24000000 }, { "age": 71, - "asset": 15343.648954348602, - "cumulative_gap": -3418.2899115647997, - "expense": 2027.0923546752003, - "gap": -372.90764532479966, - "income": 2400.0 + "asset": 153436490, + "cumulative_gap": -34182899, + "expense": 20270924, + "gap": -3729076, + "income": 24000000 }, { "age": 72, - "asset": 16188.053297663604, - "cumulative_gap": -3750.6557097960954, - "expense": 2067.6342017687043, - "gap": -332.3657982312957, - "income": 2400.0 + "asset": 161880533, + "cumulative_gap": -37506557, + "expense": 20676342, + "gap": -3323658, + "income": 24000000 }, { "age": 73, - "asset": 17016.031668771746, - "cumulative_gap": -4041.6688239920168, - "expense": 2108.9868858040786, - "gap": -291.0131141959214, - "income": 2400.0 + "asset": 170160317, + "cumulative_gap": -40416688, + "expense": 21089869, + "gap": -2910131, + "income": 24000000 }, { "age": 74, - "asset": 17826.256126456698, - "cumulative_gap": -4290.502200471857, - "expense": 2151.16662352016, - "gap": -248.8333764798399, - "income": 2400.0 + "asset": 178262561, + "cumulative_gap": -42905022, + "expense": 21511666, + "gap": -2488334, + "income": 24000000 }, { "age": 75, - "asset": 18617.342188024635, - "cumulative_gap": -4496.312244481293, - "expense": 2194.1899559905632, - "gap": -205.81004400943675, - "income": 2400.0 + "asset": 186173422, + "cumulative_gap": -44963122, + "expense": 21941900, + "gap": -2058100, + "income": 24000000 }, { "age": 76, - "asset": 19387.846798995095, - "cumulative_gap": -4658.238489370919, - "expense": 2238.0737551103743, - "gap": -161.92624488962565, - "income": 2400.0 + "asset": 193878468, + "cumulative_gap": -46582385, + "expense": 22380738, + "gap": -1619262, + "income": 24000000 }, { "age": 77, - "asset": 20136.266235201263, - "cumulative_gap": -4775.403259158336, - "expense": 2282.835230212582, - "gap": -117.16476978741821, - "income": 2400.0 + "asset": 201362662, + "cumulative_gap": -47754033, + "expense": 22828352, + "gap": -1171648, + "income": 24000000 }, { "age": 78, - "asset": 20861.03393513834, - "cumulative_gap": -4846.911324341503, - "expense": 2328.4919348168337, - "gap": -71.50806518316631, - "income": 2400.0 + "asset": 208610339, + "cumulative_gap": -48469113, + "expense": 23284919, + "gap": -715081, + "income": 24000000 }, { "age": 79, - "asset": 21560.518260331155, - "cumulative_gap": -4871.849550828332, - "expense": 2375.0617735131705, - "gap": -24.938226486829535, - "income": 2400.0 + "asset": 215605183, + "cumulative_gap": -48718496, + "expense": 23750618, + "gap": -249382, + "income": 24000000 }, { "age": 80, - "asset": 22233.020181422526, - "cumulative_gap": -4849.286541844898, - "expense": 2422.563008983434, - "gap": 22.563008983433974, - "income": 2400.0 + "asset": 222330202, + "cumulative_gap": -48492865, + "expense": 24225630, + "gap": 225630, + "income": 24000000 }, { "age": 81, - "asset": 22876.770887612263, - "cumulative_gap": -4778.272272681796, - "expense": 2471.0142691631027, - "gap": 71.01426916310265, - "income": 2400.0 + "asset": 228767709, + "cumulative_gap": -47782723, + "expense": 24710143, + "gap": 710143, + "income": 24000000 }, { "age": 82, - "asset": 23489.929317002636, - "cumulative_gap": -4657.837718135431, - "expense": 2520.434554546365, - "gap": 120.43455454636478, - "income": 2400.0 + "asset": 234899293, + "cumulative_gap": -46578377, + "expense": 25204346, + "gap": 1204346, + "income": 24000000 }, { "age": 83, - "asset": 24070.57960532996, - "cumulative_gap": -4486.994472498139, - "expense": 2570.843245637292, - "gap": 170.84324563729206, - "income": 2400.0 + "asset": 240705796, + "cumulative_gap": -44869945, + "expense": 25708432, + "gap": 1708432, + "income": 24000000 }, { "age": 84, - "asset": 24616.728450483446, - "cumulative_gap": -4264.734361948101, - "expense": 2622.260110550038, - "gap": 222.260110550038, - "income": 2400.0 + "asset": 246167285, + "cumulative_gap": -42647344, + "expense": 26222601, + "gap": 2222601, + "income": 24000000 }, { "age": 85, - "asset": 25126.30239013141, - "cumulative_gap": -3990.029049187062, - "expense": 2674.705312761039, - "gap": 274.70531276103884, - "income": 2400.0 + "asset": 251263024, + "cumulative_gap": -39900290, + "expense": 26747053, + "gap": 2747053, + "income": 24000000 }, { "age": 86, - "asset": 25597.144989691486, - "cumulative_gap": -3661.8296301708024, - "expense": 2728.1994190162595, - "gap": 328.1994190162595, - "income": 2400.0 + "asset": 255971450, + "cumulative_gap": -36618296, + "expense": 27281994, + "gap": 3281994, + "income": 24000000 }, { "age": 87, - "asset": 26027.013937795484, - "cumulative_gap": -3279.0662227742177, - "expense": 2782.7634073965846, - "gap": 382.7634073965846, - "income": 2400.0 + "asset": 260270139, + "cumulative_gap": -32790662, + "expense": 27827634, + "gap": 3827634, + "income": 24000000 }, { "age": 88, - "asset": 26413.578046310868, - "cumulative_gap": -2840.6475472297016, - "expense": 2838.418675544516, - "gap": 438.4186755445162, - "income": 2400.0 + "asset": 264135780, + "cumulative_gap": -28406475, + "expense": 28384187, + "gap": 4384187, + "income": 24000000 }, { "age": 89, - "asset": 26754.414151889345, - "cumulative_gap": -2345.460498174295, - "expense": 2895.1870490554065, - "gap": 495.18704905540653, - "income": 2400.0 + "asset": 267544142, + "cumulative_gap": -23454605, + "expense": 28951870, + "gap": 4951870, + "income": 24000000 }, { "age": 90, - "asset": 27047.00391591896, - "cumulative_gap": -1792.3697081377804, - "expense": 2953.0907900365146, - "gap": 553.0907900365146, - "income": 2400.0 + "asset": 270470039, + "cumulative_gap": -17923697, + "expense": 29530908, + "gap": 5530908, + "income": 24000000 }, { "age": 91, - "asset": 27288.730519658915, - "cumulative_gap": -1180.2171023005353, - "expense": 3012.152605837245, - "gap": 612.1526058372451, - "income": 2400.0 + "asset": 272887305, + "cumulative_gap": -11802171, + "expense": 30121526, + "gap": 6121526, + "income": 24000000 }, { "age": 92, - "asset": 27476.87525123632, - "cumulative_gap": -507.8214443465454, - "expense": 3072.39565795399, - "gap": 672.3956579539899, - "income": 2400.0 + "asset": 274768753, + "cumulative_gap": -5078214, + "expense": 30723957, + "gap": 6723957, + "income": 24000000 }, { "age": 93, - "asset": 27608.6139810808, - "cumulative_gap": 226.02212676652425, - "expense": 3133.8435711130696, - "gap": 733.8435711130696, - "income": 2400.0 + "asset": 276086140, + "cumulative_gap": 2260221, + "expense": 31338436, + "gap": 7338436, + "income": 24000000 }, { "age": 94, - "asset": 27681.013522266763, - "cumulative_gap": 1022.5425693018551, - "expense": 3196.520442535331, - "gap": 796.5204425353309, - "income": 2400.0 + "asset": 276810135, + "cumulative_gap": 10225426, + "expense": 31965204, + "gap": 7965204, + "income": 24000000 }, { "age": 95, - "asset": 27691.027872123377, - "cumulative_gap": 1882.9934206878925, - "expense": 3260.4508513860374, - "gap": 860.4508513860374, - "income": 2400.0 + "asset": 276910279, + "cumulative_gap": 18829934, + "expense": 32604509, + "gap": 8604509, + "income": 24000000 }, { "age": 96, - "asset": 27635.49433135946, - "cumulative_gap": 2808.6532891016504, - "expense": 3325.659868413758, - "gap": 925.659868413758, - "income": 2400.0 + "asset": 276354943, + "cumulative_gap": 28086533, + "expense": 33256599, + "gap": 9256599, + "income": 24000000 }, { "age": 97, - "asset": 27511.129496834074, - "cumulative_gap": 3800.8263548836835, - "expense": 3392.173065782033, - "gap": 992.1730657820331, - "income": 2400.0 + "asset": 275111295, + "cumulative_gap": 38008264, + "expense": 33921731, + "gap": 9921731, + "income": 24000000 }, { "age": 98, - "asset": 27314.525123983603, - "cumulative_gap": 4860.842881981357, - "expense": 3460.0165270976736, - "gap": 1060.0165270976736, - "income": 2400.0 + "asset": 273145251, + "cumulative_gap": 48608429, + "expense": 34600165, + "gap": 10600165, + "income": 24000000 }, { "age": 99, - "asset": 27042.14385479251, - "cumulative_gap": 5990.059739620984, - "expense": 3529.216857639627, - "gap": 1129.216857639627, - "income": 2400.0 + "asset": 270421439, + "cumulative_gap": 59900597, + "expense": 35292169, + "gap": 11292169, + "income": 24000000 }, { "age": 100, - "asset": 26690.314807067472, - "cumulative_gap": 7189.860934413404, - "expense": 3599.8011947924197, - "gap": 1199.8011947924197, - "income": 2400.0 + "asset": 266903148, + "cumulative_gap": 71898609, + "expense": 35998012, + "gap": 11998012, + "income": 24000000 } ] }, diff --git a/fastapi/tests/golden/recommendations_saving_and_income.json b/fastapi/tests/golden/recommendations_saving_and_income.json index 3425d26..8aa5a74 100644 --- a/fastapi/tests/golden/recommendations_saving_and_income.json +++ b/fastapi/tests/golden/recommendations_saving_and_income.json @@ -3,339 +3,339 @@ "current_age": 60, "depletion_age": null, "recommendation_type": "SAVING_AND_INCOME", - "required_income": 277.01, - "required_saving": 120.0, + "required_income": 2770100, + "required_saving": 1200000, "status": "SUFFICIENT", "target_age": 88, "target_status": "SUFFICIENT", "timeline": [ { "age": 60, - "asset": 5000.0, - "cumulative_gap": -1164.12, - "expense": 3360.0, - "gap": -1164.12, - "income": 4524.12 + "asset": 50000000, + "cumulative_gap": -11641200, + "expense": 33600000, + "gap": -11641200, + "income": 45241200 }, { "age": 61, - "asset": 6349.0436, - "cumulative_gap": -2261.0399999999995, - "expense": 3427.2000000000003, - "gap": -1096.9199999999996, - "income": 4524.12 + "asset": 63490436, + "cumulative_gap": -22610400, + "expense": 34272000, + "gap": -10969200, + "income": 45241200 }, { "age": 62, - "asset": 7669.342508, - "cumulative_gap": -3289.4159999999993, - "expense": 3495.744, - "gap": -1028.3759999999997, - "income": 4524.12 + "asset": 76693425, + "cumulative_gap": -32894160, + "expense": 34957440, + "gap": -10283760, + "income": 45241200 }, { "age": 63, - "asset": 8958.65006324, - "cumulative_gap": -4247.877119999999, - "expense": 3565.6588800000004, - "gap": -958.4611199999995, - "income": 4524.12 + "asset": 89586501, + "cumulative_gap": -42478771, + "expense": 35656589, + "gap": -9584611, + "income": 45241200 }, { "age": 64, - "asset": 10214.6245187372, - "cumulative_gap": -5135.025062399998, - "expense": 3636.9720576000004, - "gap": -887.1479423999995, - "income": 4524.12 + "asset": 102146245, + "cumulative_gap": -51350251, + "expense": 36369721, + "gap": -8871479, + "income": 45241200 }, { "age": 65, - "asset": 11434.825634971316, - "cumulative_gap": -5949.433563647997, - "expense": 3709.7114987520004, - "gap": -814.4085012479995, - "income": 4524.12 + "asset": 114348256, + "cumulative_gap": -59494336, + "expense": 37097115, + "gap": -8144085, + "income": 45241200 }, { "age": 66, - "asset": 12616.711160305895, - "cumulative_gap": -6689.647834920957, - "expense": 3783.9057287270402, - "gap": -740.2142712729596, - "income": 4524.12 + "asset": 126167112, + "cumulative_gap": -66896478, + "expense": 37839057, + "gap": -7402143, + "income": 45241200 }, { "age": 67, - "asset": 13757.63319452622, - "cumulative_gap": -7354.183991619377, - "expense": 3859.583843301581, - "gap": -664.5361566984188, - "income": 4524.12 + "asset": 137576332, + "cumulative_gap": -73541840, + "expense": 38595838, + "gap": -6645362, + "income": 45241200 }, { "age": 68, - "asset": 14854.83443176138, - "cumulative_gap": -7941.528471451764, - "expense": 3936.7755201676127, - "gap": -587.3444798323872, - "income": 4524.12 + "asset": 148548344, + "cumulative_gap": -79415285, + "expense": 39367755, + "gap": -5873445, + "income": 45241200 }, { "age": 69, - "asset": 15905.444278941579, - "cumulative_gap": -8450.137440880799, - "expense": 4015.511030570965, - "gap": -508.6089694290349, - "income": 4524.12 + "asset": 159054443, + "cumulative_gap": -84501374, + "expense": 40155110, + "gap": -5086090, + "income": 45241200 }, { "age": 70, - "asset": 16906.47484582173, - "cumulative_gap": -8878.436189698414, - "expense": 4095.8212511823845, - "gap": -428.29874881761543, - "income": 4524.12 + "asset": 169064748, + "cumulative_gap": -88784362, + "expense": 40958213, + "gap": -4282987, + "income": 45241200 }, { "age": 71, - "asset": 17854.816802478526, - "cumulative_gap": -9224.81851349238, - "expense": 4177.737676206032, - "gap": -346.38232379396777, - "income": 4524.12 + "asset": 178548168, + "cumulative_gap": -92248185, + "expense": 41777377, + "gap": -3463823, + "income": 45241200 }, { "age": 72, - "asset": 18747.23510006067, - "cumulative_gap": -9487.646083762229, - "expense": 4261.292429730152, - "gap": -262.82757026984746, - "income": 4524.12 + "asset": 187472351, + "cumulative_gap": -94876461, + "expense": 42612924, + "gap": -2628276, + "income": 45241200 }, { "age": 73, - "asset": 19580.364550440434, - "cumulative_gap": -9665.247805437473, - "expense": 4346.518278324756, - "gap": -177.60172167524433, - "income": 4524.12 + "asset": 195803646, + "cumulative_gap": -96652478, + "expense": 43465183, + "gap": -1776017, + "income": 45241200 }, { "age": 74, - "asset": 20350.70526027915, - "cumulative_gap": -9755.919161546222, - "expense": 4433.448643891251, - "gap": -90.67135610874902, - "income": 4524.12 + "asset": 203507053, + "cumulative_gap": -97559192, + "expense": 44334486, + "gap": -906714, + "income": 45241200 }, { "age": 75, - "asset": 21054.617914879535, - "cumulative_gap": -9757.921544777146, - "expense": 4522.1176167690755, - "gap": -2.0023832309243517, - "income": 4524.12 + "asset": 210546179, + "cumulative_gap": -97579215, + "expense": 45221176, + "gap": -20024, + "income": 45241200 }, { "age": 76, - "asset": 21688.318907053774, - "cumulative_gap": -9669.48157567269, - "expense": 4612.559969104457, - "gap": 88.4399691044573, - "income": 4524.12 + "asset": 216883189, + "cumulative_gap": -96694816, + "expense": 46125600, + "gap": 884400, + "income": 45241200 }, { "age": 77, - "asset": 22247.875306087797, - "cumulative_gap": -9488.790407186143, - "expense": 4704.811168486546, - "gap": 180.6911684865463, - "income": 4524.12 + "asset": 222478753, + "cumulative_gap": -94887904, + "expense": 47048112, + "gap": 1806912, + "income": 45241200 }, { "age": 78, - "asset": 22729.19966172929, - "cumulative_gap": -9214.003015329865, - "expense": 4798.907391856277, - "gap": 274.7873918562773, - "income": 4524.12 + "asset": 227291997, + "cumulative_gap": -92140030, + "expense": 47989074, + "gap": 2747874, + "income": 45241200 }, { "age": 79, - "asset": 23128.044637969204, - "cumulative_gap": -8843.237475636462, - "expense": 4894.885539693403, - "gap": 370.7655396934033, - "income": 4524.12 + "asset": 231280446, + "cumulative_gap": -88432375, + "expense": 48948855, + "gap": 3707655, + "income": 45241200 }, { "age": 80, - "asset": 23439.997471224076, - "cumulative_gap": -8374.57422514919, - "expense": 4992.783250487271, - "gap": 468.6632504872714, - "income": 4524.12 + "asset": 234399975, + "cumulative_gap": -83745742, + "expense": 49927833, + "gap": 4686633, + "income": 45241200 }, { "age": 81, - "asset": 23660.47424735891, - "cumulative_gap": -7806.0553096521735, - "expense": 5092.638915497017, - "gap": 568.5189154970167, - "income": 4524.12 + "asset": 236604742, + "cumulative_gap": -78060553, + "expense": 50926389, + "gap": 5685189, + "income": 45241200 }, { "age": 82, - "asset": 23784.71399181775, - "cumulative_gap": -7135.683615845216, - "expense": 5194.491693806957, - "gap": 670.3716938069574, - "income": 4524.12 + "asset": 237847140, + "cumulative_gap": -71356836, + "expense": 51944917, + "gap": 6703717, + "income": 45241200 }, { "age": 83, - "asset": 23807.772566951116, - "cumulative_gap": -6361.4220881621195, - "expense": 5298.3815276830965, - "gap": 774.2615276830966, - "income": 4524.12 + "asset": 238077726, + "cumulative_gap": -63614221, + "expense": 52983815, + "gap": 7742615, + "income": 45241200 }, { "age": 84, - "asset": 23724.516370446065, - "cumulative_gap": -5481.192929925361, - "expense": 5404.349158236759, - "gap": 880.2291582367588, - "income": 4524.12 + "asset": 237245164, + "cumulative_gap": -54811929, + "expense": 54043492, + "gap": 8802292, + "income": 45241200 }, { "age": 85, - "asset": 23529.61582857559, - "cumulative_gap": -4492.876788523867, - "expense": 5512.436141401494, - "gap": 988.316141401494, - "income": 4524.12 + "asset": 235296158, + "cumulative_gap": -44928768, + "expense": 55124361, + "gap": 9883161, + "income": 45241200 }, { "age": 86, - "asset": 23217.538677789318, - "cumulative_gap": -3394.311924294343, - "expense": 5622.684864229524, - "gap": 1098.5648642295237, - "income": 4524.12 + "asset": 232175387, + "cumulative_gap": -33943119, + "expense": 56226849, + "gap": 10985649, + "income": 45241200 }, { "age": 87, - "asset": 22782.54302796659, - "cumulative_gap": -2183.2933627802286, - "expense": 5735.138561514114, - "gap": 1211.0185615141145, - "income": 4524.12 + "asset": 227825430, + "cumulative_gap": -21832934, + "expense": 57351386, + "gap": 12110186, + "income": 45241200 }, { "age": 88, - "asset": 22218.670200446046, - "cumulative_gap": -857.5720300358316, - "expense": 5849.841332744397, - "gap": 1325.721332744397, - "income": 4524.12 + "asset": 222186702, + "cumulative_gap": -8575720, + "expense": 58498413, + "gap": 13257213, + "income": 45241200 }, { "age": 89, - "asset": 21519.737333732697, - "cumulative_gap": 585.1461293634529, - "expense": 5966.838159399284, - "gap": 1442.7181593992846, - "income": 4524.12 + "asset": 215197373, + "cumulative_gap": 5851461, + "expense": 59668382, + "gap": 14427182, + "income": 45241200 }, { "age": 90, - "asset": 20679.329749563418, - "cumulative_gap": 2147.201051950723, - "expense": 6086.17492258727, - "gap": 1562.05492258727, - "income": 4524.12 + "asset": 206793297, + "cumulative_gap": 21472011, + "expense": 60861749, + "gap": 15620549, + "income": 45241200 }, { "age": 91, - "asset": 19690.793071785432, - "cumulative_gap": 3830.9794729897385, - "expense": 6207.898421039015, - "gap": 1683.7784210390155, - "income": 4524.12 + "asset": 196907931, + "cumulative_gap": 38309795, + "expense": 62078984, + "gap": 16837784, + "income": 45241200 }, { "age": 92, - "asset": 18547.22509026881, - "cumulative_gap": 5638.915862449534, - "expense": 6332.056389459795, - "gap": 1807.9363894597955, - "income": 4524.12 + "asset": 185472251, + "cumulative_gap": 56389159, + "expense": 63320564, + "gap": 18079364, + "income": 45241200 }, { "age": 93, - "asset": 17241.467361833285, - "cumulative_gap": 7573.493379698525, - "expense": 6458.697517248991, - "gap": 1934.5775172489912, - "income": 4524.12 + "asset": 172414674, + "cumulative_gap": 75734934, + "expense": 64586975, + "gap": 19345775, + "income": 45241200 }, { "age": 94, - "asset": 15766.096539921822, - "cumulative_gap": 9637.244847292495, - "expense": 6587.871467593971, - "gap": 2063.751467593971, - "income": 4524.12 + "asset": 157660965, + "cumulative_gap": 96372448, + "expense": 65878715, + "gap": 20637515, + "income": 45241200 }, { "age": 95, - "asset": 14113.415424497687, - "cumulative_gap": 11832.753744238345, - "expense": 6719.62889694585, - "gap": 2195.50889694585, - "income": 4524.12 + "asset": 141134154, + "cumulative_gap": 118327537, + "expense": 67196289, + "gap": 21955089, + "income": 45241200 }, { "age": 96, - "asset": 12275.443723378392, - "cumulative_gap": 14162.655219123113, - "expense": 6854.0214748847675, - "gap": 2329.9014748847676, - "income": 4524.12 + "asset": 122754437, + "cumulative_gap": 141626552, + "expense": 68540215, + "gap": 23299015, + "income": 45241200 }, { "age": 97, - "asset": 10243.908515948433, - "cumulative_gap": 16629.637123505578, - "expense": 6991.101904382463, - "gap": 2466.9819043824627, - "income": 4524.12 + "asset": 102439085, + "cumulative_gap": 166296371, + "expense": 69911019, + "gap": 24669819, + "income": 45241200 }, { "age": 98, - "asset": 8010.23440991295, - "cumulative_gap": 19236.44106597569, - "expense": 7130.923942470112, - "gap": 2606.803942470112, - "income": 4524.12 + "asset": 80102344, + "cumulative_gap": 192364411, + "expense": 71309239, + "gap": 26068039, + "income": 45241200 }, { "age": 99, - "asset": 5565.533381466123, - "cumulative_gap": 21985.863487295203, - "expense": 7273.542421319514, - "gap": 2749.422421319514, - "income": 4524.12 + "asset": 55655334, + "cumulative_gap": 219858635, + "expense": 72735424, + "gap": 27494224, + "income": 45241200 }, { "age": 100, - "asset": 2900.594288951007, - "cumulative_gap": 24880.756757041105, - "expense": 7419.013269745904, - "gap": 2894.893269745904, - "income": 4524.12 + "asset": 29005943, + "cumulative_gap": 248807568, + "expense": 74190133, + "gap": 28948933, + "income": 45241200 } ] }, diff --git a/fastapi/tests/golden/recommendations_saving_only.json b/fastapi/tests/golden/recommendations_saving_only.json index d3fe975..14013f6 100644 --- a/fastapi/tests/golden/recommendations_saving_only.json +++ b/fastapi/tests/golden/recommendations_saving_only.json @@ -3,339 +3,339 @@ "current_age": 60, "depletion_age": null, "recommendation_type": "SAVING_ONLY", - "required_income": 0.0, - "required_saving": 71.17, + "required_income": 0, + "required_saving": 711700, "status": "SUFFICIENT", "target_age": 84, "target_status": "SUFFICIENT", "timeline": [ { "age": 60, - "asset": 15000.0, - "cumulative_gap": -254.03999999999996, - "expense": 2145.96, - "gap": -254.03999999999996, - "income": 2400.0 + "asset": 150000000, + "cumulative_gap": -2540400, + "expense": 21459600, + "gap": -2540400, + "income": 24000000 }, { "age": 61, - "asset": 15711.6612, - "cumulative_gap": -465.1608000000001, - "expense": 2188.8792, - "gap": -211.12080000000014, - "income": 2400.0 + "asset": 157116612, + "cumulative_gap": -4651608, + "expense": 21888792, + "gap": -2111208, + "income": 24000000 }, { "age": 62, - "asset": 16400.465460000003, - "cumulative_gap": -632.5040160000003, - "expense": 2232.656784, - "gap": -167.3432160000002, - "income": 2400.0 + "asset": 164004655, + "cumulative_gap": -6325040, + "expense": 22326568, + "gap": -1673432, + "income": 24000000 }, { "age": 63, - "asset": 17064.842936280005, - "cumulative_gap": -755.1940963200004, - "expense": 2277.30991968, - "gap": -122.6900803200001, - "income": 2400.0 + "asset": 170648429, + "cumulative_gap": -7551941, + "expense": 22773099, + "gap": -1226901, + "income": 24000000 }, { "age": 64, - "asset": 17703.159007098006, - "cumulative_gap": -832.3379782464003, - "expense": 2322.8561180736, - "gap": -77.1438819263999, - "income": 2400.0 + "asset": 177031590, + "cumulative_gap": -8323380, + "expense": 23228561, + "gap": -771439, + "income": 24000000 }, { "age": 65, - "asset": 18313.71197569514, - "cumulative_gap": -863.0247378113281, - "expense": 2369.313240435072, - "gap": -30.686759564927797, - "income": 2400.0 + "asset": 183137120, + "cumulative_gap": -8630247, + "expense": 23693132, + "gap": -306868, + "income": 24000000 }, { "age": 66, - "asset": 18894.73069731787, - "cumulative_gap": -846.3252325675544, - "expense": 2416.6995052437737, - "gap": 16.69950524377373, - "income": 2400.0 + "asset": 188947307, + "cumulative_gap": -8463252, + "expense": 24166995, + "gap": 166995, + "income": 24000000 }, { "age": 67, - "asset": 19444.37212783632, - "cumulative_gap": -781.2917372189049, - "expense": 2465.0334953486495, - "gap": 65.03349534864947, - "income": 2400.0 + "asset": 194443721, + "cumulative_gap": -7812917, + "expense": 24650335, + "gap": 650335, + "income": 24000000 }, { "age": 68, - "asset": 19960.7187914623, - "cumulative_gap": -666.9575719632826, - "expense": 2514.3341652556223, - "gap": 114.33416525562234, - "income": 2400.0 + "asset": 199607188, + "cumulative_gap": -6669576, + "expense": 25143342, + "gap": 1143342, + "income": 24000000 }, { "age": 69, - "asset": 20441.776164992876, - "cumulative_gap": -502.3367234025477, - "expense": 2564.620848560735, - "gap": 164.62084856073488, - "income": 2400.0 + "asset": 204417762, + "cumulative_gap": -5023367, + "expense": 25646208, + "gap": 1646208, + "income": 24000000 }, { "age": 70, - "asset": 20885.469975925105, - "cumulative_gap": -286.4234578705982, - "expense": 2615.9132655319495, - "gap": 215.9132655319495, - "income": 2400.0 + "asset": 208854700, + "cumulative_gap": -2864235, + "expense": 26159133, + "gap": 2159133, + "income": 24000000 }, { "age": 71, - "asset": 21289.643411704954, - "cumulative_gap": -18.19192702800956, - "expense": 2668.2315308425887, - "gap": 268.23153084258865, - "income": 2400.0 + "asset": 212896434, + "cumulative_gap": -181919, + "expense": 26682315, + "gap": 2682315, + "income": 24000000 }, { "age": 72, - "asset": 21652.054237288237, - "cumulative_gap": 303.4042344314307, - "expense": 2721.5961614594403, - "gap": 321.5961614594403, - "income": 2400.0 + "asset": 216520542, + "cumulative_gap": 3034042, + "expense": 27215962, + "gap": 3215962, + "income": 24000000 }, { "age": 73, - "asset": 21970.37181810366, - "cumulative_gap": 679.4323191200597, - "expense": 2776.028084688629, - "gap": 376.02808468862895, - "income": 2400.0 + "asset": 219703718, + "cumulative_gap": 6794323, + "expense": 27760281, + "gap": 3760281, + "income": 24000000 }, { "age": 74, - "asset": 22242.17404541748, - "cumulative_gap": 1110.9809655024615, - "expense": 2831.548646382402, - "gap": 431.5486463824018, - "income": 2400.0 + "asset": 222421740, + "cumulative_gap": 11109810, + "expense": 28315486, + "gap": 4315486, + "income": 24000000 }, { "age": 75, - "asset": 22464.94416100613, - "cumulative_gap": 1599.1605848125114, - "expense": 2888.17961931005, - "gap": 488.17961931004993, - "income": 2400.0 + "asset": 224649442, + "cumulative_gap": 15991606, + "expense": 28881796, + "gap": 4881796, + "income": 24000000 }, { "age": 76, - "asset": 22636.067477946963, - "cumulative_gap": 2145.1037965087626, - "expense": 2945.943211696251, - "gap": 545.9432116962512, - "income": 2400.0 + "asset": 226360675, + "cumulative_gap": 21451038, + "expense": 29459432, + "gap": 5459432, + "income": 24000000 }, { "age": 77, - "asset": 22752.827994238232, - "cumulative_gap": 2749.9658724389387, - "expense": 3004.862075930176, - "gap": 604.8620759301762, - "income": 2400.0 + "asset": 227528280, + "cumulative_gap": 27499659, + "expense": 30048621, + "gap": 6048621, + "income": 24000000 }, { "age": 78, - "asset": 22812.404895857297, - "cumulative_gap": 3414.9251898877183, - "expense": 3064.9593174487795, - "gap": 664.9593174487795, - "income": 2400.0 + "asset": 228124049, + "cumulative_gap": 34149252, + "expense": 30649593, + "gap": 6649593, + "income": 24000000 }, { "age": 79, - "asset": 22811.868945760776, - "cumulative_gap": 4141.183693685473, - "expense": 3126.258503797755, - "gap": 726.2585037977551, - "income": 2400.0 + "asset": 228118689, + "cumulative_gap": 41411837, + "expense": 31262585, + "gap": 7262585, + "income": 24000000 }, { "age": 80, - "asset": 22748.178755221914, - "cumulative_gap": 4929.967367559184, - "expense": 3188.78367387371, - "gap": 788.7836738737101, - "income": 2400.0 + "asset": 227481788, + "cumulative_gap": 49299674, + "expense": 31887837, + "gap": 7887837, + "income": 24000000 }, { "age": 81, - "asset": 22618.17693378865, - "cumulative_gap": 5782.526714910368, - "expense": 3252.5593473511844, - "gap": 852.5593473511844, - "income": 2400.0 + "asset": 226181769, + "cumulative_gap": 57825267, + "expense": 32525593, + "gap": 8525593, + "income": 24000000 }, { "age": 82, - "asset": 22418.586114030593, - "cumulative_gap": 6700.137249208577, - "expense": 3317.610534298208, - "gap": 917.6105342982082, - "income": 2400.0 + "asset": 224185861, + "cumulative_gap": 67001372, + "expense": 33176105, + "gap": 9176105, + "income": 24000000 }, { "age": 83, - "asset": 22146.004847124357, - "cumulative_gap": 7684.099994192749, - "expense": 3383.9627449841723, - "gap": 983.9627449841723, - "income": 2400.0 + "asset": 221460048, + "cumulative_gap": 76841000, + "expense": 33839627, + "gap": 9839627, + "income": 24000000 }, { "age": 84, - "asset": 21796.90336520439, - "cumulative_gap": 8735.741994076605, - "expense": 3451.641999883856, - "gap": 1051.641999883856, - "income": 2400.0 + "asset": 217969034, + "cumulative_gap": 87357420, + "expense": 34516420, + "gap": 10516420, + "income": 24000000 }, { "age": 85, - "asset": 21367.61920628015, - "cumulative_gap": 9856.416833958137, - "expense": 3520.674839881533, - "gap": 1120.674839881533, - "income": 2400.0 + "asset": 213676192, + "cumulative_gap": 98564168, + "expense": 35206748, + "gap": 11206748, + "income": 24000000 }, { "age": 86, - "asset": 20854.352697390575, - "cumulative_gap": 11047.505170637301, - "expense": 3591.0883366791636, - "gap": 1191.0883366791636, - "income": 2400.0 + "asset": 208543527, + "cumulative_gap": 110475052, + "expense": 35910883, + "gap": 11910883, + "income": 24000000 }, { "age": 87, - "asset": 20253.162291532753, - "cumulative_gap": 12310.415274050049, - "expense": 3662.910103412747, - "gap": 1262.910103412747, - "income": 2400.0 + "asset": 202531623, + "cumulative_gap": 123104153, + "expense": 36629101, + "gap": 12629101, + "income": 24000000 }, { "age": 88, - "asset": 19559.959753763607, - "cumulative_gap": 13646.58357953105, - "expense": 3736.168305481002, - "gap": 1336.1683054810019, - "income": 2400.0 + "asset": 195599598, + "cumulative_gap": 136465836, + "expense": 37361683, + "gap": 13361683, + "income": 24000000 }, { "age": 89, - "asset": 18770.505191731085, - "cumulative_gap": 15057.475251121672, - "expense": 3810.891671590622, - "gap": 1410.891671590622, - "income": 2400.0 + "asset": 187705052, + "cumulative_gap": 150574753, + "expense": 38108917, + "gap": 14108917, + "income": 24000000 }, { "age": 90, - "asset": 17880.401925744674, - "cumulative_gap": 16544.584756144108, - "expense": 3887.1095050224344, - "gap": 1487.1095050224344, - "income": 2400.0 + "asset": 178804019, + "cumulative_gap": 165445848, + "expense": 38871095, + "gap": 14871095, + "income": 24000000 }, { "age": 91, - "asset": 16885.091193343906, - "cumulative_gap": 18109.436451266993, - "expense": 3964.851695122883, - "gap": 1564.851695122883, - "income": 2400.0 + "asset": 168850912, + "cumulative_gap": 181094365, + "expense": 39648517, + "gap": 15648517, + "income": 24000000 }, { "age": 92, - "asset": 15779.846683167654, - "cumulative_gap": 19753.585180292335, - "expense": 4044.148729025341, - "gap": 1644.1487290253408, - "income": 2400.0 + "asset": 157798467, + "cumulative_gap": 197535852, + "expense": 40441487, + "gap": 16441487, + "income": 24000000 }, { "age": 93, - "asset": 14559.768892766584, - "cumulative_gap": 21478.616883898183, - "expense": 4125.031703605848, - "gap": 1725.0317036058477, - "income": 2400.0 + "asset": 145597689, + "cumulative_gap": 214786169, + "expense": 41250317, + "gap": 17250317, + "income": 24000000 }, { "age": 94, - "asset": 13219.779304835558, - "cumulative_gap": 23286.149221576146, - "expense": 4207.532337677965, - "gap": 1807.5323376779652, - "income": 2400.0 + "asset": 132197793, + "cumulative_gap": 232861492, + "expense": 42075323, + "gap": 18075323, + "income": 24000000 }, { "age": 95, - "asset": 11754.614376172321, - "cumulative_gap": 25177.83220600767, - "expense": 4291.682984431524, - "gap": 1891.6829844315243, - "income": 2400.0 + "asset": 117546144, + "cumulative_gap": 251778322, + "expense": 42916830, + "gap": 18916830, + "income": 24000000 }, { "age": 96, - "asset": 10158.81933349302, - "cumulative_gap": 27155.348850127826, - "expense": 4377.5166441201545, - "gap": 1977.5166441201545, - "income": 2400.0 + "asset": 101588193, + "cumulative_gap": 271553489, + "expense": 43775166, + "gap": 19775166, + "income": 24000000 }, { "age": 97, - "asset": 8426.741770054052, - "cumulative_gap": 29220.415827130382, - "expense": 4465.066977002558, - "gap": 2065.066977002558, - "income": 2400.0 + "asset": 84267418, + "cumulative_gap": 292204158, + "expense": 44650670, + "gap": 20650670, + "income": 24000000 }, { "age": 98, - "asset": 6552.525036843039, - "cumulative_gap": 31374.78414367299, - "expense": 4554.368316542609, - "gap": 2154.368316542609, - "income": 2400.0 + "asset": 65525250, + "cumulative_gap": 313747841, + "expense": 45543683, + "gap": 21543683, + "income": 24000000 }, { "age": 99, - "asset": 4530.101421909442, - "cumulative_gap": 33620.23982654645, - "expense": 4645.455682873461, - "gap": 2245.4556828734612, - "income": 2400.0 + "asset": 45301014, + "cumulative_gap": 336202398, + "expense": 46454557, + "gap": 22454557, + "income": 24000000 }, { "age": 100, - "asset": 2353.1851112070603, - "cumulative_gap": 35958.60462307738, - "expense": 4738.36479653093, - "gap": 2338.36479653093, - "income": 2400.0 + "asset": 23531851, + "cumulative_gap": 359586046, + "expense": 47383648, + "gap": 23383648, + "income": 24000000 } ] }, diff --git a/fastapi/tests/golden/recommendations_sufficient.json b/fastapi/tests/golden/recommendations_sufficient.json index 6b69709..487b36d 100644 --- a/fastapi/tests/golden/recommendations_sufficient.json +++ b/fastapi/tests/golden/recommendations_sufficient.json @@ -3,299 +3,299 @@ "current_age": 65, "depletion_age": null, "recommendation_type": "SUFFICIENT", - "required_income": 0.0, - "required_saving": 0.0, + "required_income": 0, + "required_saving": 0, "status": "SUFFICIENT", "target_age": 84, "target_status": "SUFFICIENT", "timeline": [ { "age": 65, - "asset": 10000.0, - "cumulative_gap": -600.0, - "expense": 1800.0, - "gap": -600.0, - "income": 2400.0 + "asset": 100000000, + "cumulative_gap": -6000000, + "expense": 18000000, + "gap": -6000000, + "income": 24000000 }, { "age": 66, - "asset": 10918.0, - "cumulative_gap": -1164.0, - "expense": 1836.0, - "gap": -564.0, - "income": 2400.0 + "asset": 109180000, + "cumulative_gap": -11640000, + "expense": 18360000, + "gap": -5640000, + "income": 24000000 }, { "age": 67, - "asset": 11826.460000000001, - "cumulative_gap": -1691.28, - "expense": 1872.72, - "gap": -527.28, - "income": 2400.0 + "asset": 118264600, + "cumulative_gap": -16912800, + "expense": 18727200, + "gap": -5272800, + "income": 24000000 }, { "age": 68, - "asset": 12724.352200000001, - "cumulative_gap": -2181.1056, - "expense": 1910.1744, - "gap": -489.8255999999999, - "income": 2400.0 + "asset": 127243522, + "cumulative_gap": -21811056, + "expense": 19101744, + "gap": -4898256, + "income": 24000000 }, { "age": 69, - "asset": 13610.603134, - "cumulative_gap": -2632.727712, - "expense": 1948.3778880000002, - "gap": -451.6221119999998, - "income": 2400.0 + "asset": 136106031, + "cumulative_gap": -26327277, + "expense": 19483779, + "gap": -4516221, + "income": 24000000 }, { "age": 70, - "asset": 14484.092003380001, - "cumulative_gap": -3045.38226624, - "expense": 1987.3454457600003, - "gap": -412.6545542399997, - "income": 2400.0 + "asset": 144840920, + "cumulative_gap": -30453823, + "expense": 19873454, + "gap": -4126546, + "income": 24000000 }, { "age": 71, - "asset": 15343.648954348602, - "cumulative_gap": -3418.2899115647997, - "expense": 2027.0923546752003, - "gap": -372.90764532479966, - "income": 2400.0 + "asset": 153436490, + "cumulative_gap": -34182899, + "expense": 20270924, + "gap": -3729076, + "income": 24000000 }, { "age": 72, - "asset": 16188.053297663604, - "cumulative_gap": -3750.6557097960954, - "expense": 2067.6342017687043, - "gap": -332.3657982312957, - "income": 2400.0 + "asset": 161880533, + "cumulative_gap": -37506557, + "expense": 20676342, + "gap": -3323658, + "income": 24000000 }, { "age": 73, - "asset": 17016.031668771746, - "cumulative_gap": -4041.6688239920168, - "expense": 2108.9868858040786, - "gap": -291.0131141959214, - "income": 2400.0 + "asset": 170160317, + "cumulative_gap": -40416688, + "expense": 21089869, + "gap": -2910131, + "income": 24000000 }, { "age": 74, - "asset": 17826.256126456698, - "cumulative_gap": -4290.502200471857, - "expense": 2151.16662352016, - "gap": -248.8333764798399, - "income": 2400.0 + "asset": 178262561, + "cumulative_gap": -42905022, + "expense": 21511666, + "gap": -2488334, + "income": 24000000 }, { "age": 75, - "asset": 18617.342188024635, - "cumulative_gap": -4496.312244481293, - "expense": 2194.1899559905632, - "gap": -205.81004400943675, - "income": 2400.0 + "asset": 186173422, + "cumulative_gap": -44963122, + "expense": 21941900, + "gap": -2058100, + "income": 24000000 }, { "age": 76, - "asset": 19387.846798995095, - "cumulative_gap": -4658.238489370919, - "expense": 2238.0737551103743, - "gap": -161.92624488962565, - "income": 2400.0 + "asset": 193878468, + "cumulative_gap": -46582385, + "expense": 22380738, + "gap": -1619262, + "income": 24000000 }, { "age": 77, - "asset": 20136.266235201263, - "cumulative_gap": -4775.403259158336, - "expense": 2282.835230212582, - "gap": -117.16476978741821, - "income": 2400.0 + "asset": 201362662, + "cumulative_gap": -47754033, + "expense": 22828352, + "gap": -1171648, + "income": 24000000 }, { "age": 78, - "asset": 20861.03393513834, - "cumulative_gap": -4846.911324341503, - "expense": 2328.4919348168337, - "gap": -71.50806518316631, - "income": 2400.0 + "asset": 208610339, + "cumulative_gap": -48469113, + "expense": 23284919, + "gap": -715081, + "income": 24000000 }, { "age": 79, - "asset": 21560.518260331155, - "cumulative_gap": -4871.849550828332, - "expense": 2375.0617735131705, - "gap": -24.938226486829535, - "income": 2400.0 + "asset": 215605183, + "cumulative_gap": -48718496, + "expense": 23750618, + "gap": -249382, + "income": 24000000 }, { "age": 80, - "asset": 22233.020181422526, - "cumulative_gap": -4849.286541844898, - "expense": 2422.563008983434, - "gap": 22.563008983433974, - "income": 2400.0 + "asset": 222330202, + "cumulative_gap": -48492865, + "expense": 24225630, + "gap": 225630, + "income": 24000000 }, { "age": 81, - "asset": 22876.770887612263, - "cumulative_gap": -4778.272272681796, - "expense": 2471.0142691631027, - "gap": 71.01426916310265, - "income": 2400.0 + "asset": 228767709, + "cumulative_gap": -47782723, + "expense": 24710143, + "gap": 710143, + "income": 24000000 }, { "age": 82, - "asset": 23489.929317002636, - "cumulative_gap": -4657.837718135431, - "expense": 2520.434554546365, - "gap": 120.43455454636478, - "income": 2400.0 + "asset": 234899293, + "cumulative_gap": -46578377, + "expense": 25204346, + "gap": 1204346, + "income": 24000000 }, { "age": 83, - "asset": 24070.57960532996, - "cumulative_gap": -4486.994472498139, - "expense": 2570.843245637292, - "gap": 170.84324563729206, - "income": 2400.0 + "asset": 240705796, + "cumulative_gap": -44869945, + "expense": 25708432, + "gap": 1708432, + "income": 24000000 }, { "age": 84, - "asset": 24616.728450483446, - "cumulative_gap": -4264.734361948101, - "expense": 2622.260110550038, - "gap": 222.260110550038, - "income": 2400.0 + "asset": 246167285, + "cumulative_gap": -42647344, + "expense": 26222601, + "gap": 2222601, + "income": 24000000 }, { "age": 85, - "asset": 25126.30239013141, - "cumulative_gap": -3990.029049187062, - "expense": 2674.705312761039, - "gap": 274.70531276103884, - "income": 2400.0 + "asset": 251263024, + "cumulative_gap": -39900290, + "expense": 26747053, + "gap": 2747053, + "income": 24000000 }, { "age": 86, - "asset": 25597.144989691486, - "cumulative_gap": -3661.8296301708024, - "expense": 2728.1994190162595, - "gap": 328.1994190162595, - "income": 2400.0 + "asset": 255971450, + "cumulative_gap": -36618296, + "expense": 27281994, + "gap": 3281994, + "income": 24000000 }, { "age": 87, - "asset": 26027.013937795484, - "cumulative_gap": -3279.0662227742177, - "expense": 2782.7634073965846, - "gap": 382.7634073965846, - "income": 2400.0 + "asset": 260270139, + "cumulative_gap": -32790662, + "expense": 27827634, + "gap": 3827634, + "income": 24000000 }, { "age": 88, - "asset": 26413.578046310868, - "cumulative_gap": -2840.6475472297016, - "expense": 2838.418675544516, - "gap": 438.4186755445162, - "income": 2400.0 + "asset": 264135780, + "cumulative_gap": -28406475, + "expense": 28384187, + "gap": 4384187, + "income": 24000000 }, { "age": 89, - "asset": 26754.414151889345, - "cumulative_gap": -2345.460498174295, - "expense": 2895.1870490554065, - "gap": 495.18704905540653, - "income": 2400.0 + "asset": 267544142, + "cumulative_gap": -23454605, + "expense": 28951870, + "gap": 4951870, + "income": 24000000 }, { "age": 90, - "asset": 27047.00391591896, - "cumulative_gap": -1792.3697081377804, - "expense": 2953.0907900365146, - "gap": 553.0907900365146, - "income": 2400.0 + "asset": 270470039, + "cumulative_gap": -17923697, + "expense": 29530908, + "gap": 5530908, + "income": 24000000 }, { "age": 91, - "asset": 27288.730519658915, - "cumulative_gap": -1180.2171023005353, - "expense": 3012.152605837245, - "gap": 612.1526058372451, - "income": 2400.0 + "asset": 272887305, + "cumulative_gap": -11802171, + "expense": 30121526, + "gap": 6121526, + "income": 24000000 }, { "age": 92, - "asset": 27476.87525123632, - "cumulative_gap": -507.8214443465454, - "expense": 3072.39565795399, - "gap": 672.3956579539899, - "income": 2400.0 + "asset": 274768753, + "cumulative_gap": -5078214, + "expense": 30723957, + "gap": 6723957, + "income": 24000000 }, { "age": 93, - "asset": 27608.6139810808, - "cumulative_gap": 226.02212676652425, - "expense": 3133.8435711130696, - "gap": 733.8435711130696, - "income": 2400.0 + "asset": 276086140, + "cumulative_gap": 2260221, + "expense": 31338436, + "gap": 7338436, + "income": 24000000 }, { "age": 94, - "asset": 27681.013522266763, - "cumulative_gap": 1022.5425693018551, - "expense": 3196.520442535331, - "gap": 796.5204425353309, - "income": 2400.0 + "asset": 276810135, + "cumulative_gap": 10225426, + "expense": 31965204, + "gap": 7965204, + "income": 24000000 }, { "age": 95, - "asset": 27691.027872123377, - "cumulative_gap": 1882.9934206878925, - "expense": 3260.4508513860374, - "gap": 860.4508513860374, - "income": 2400.0 + "asset": 276910279, + "cumulative_gap": 18829934, + "expense": 32604509, + "gap": 8604509, + "income": 24000000 }, { "age": 96, - "asset": 27635.49433135946, - "cumulative_gap": 2808.6532891016504, - "expense": 3325.659868413758, - "gap": 925.659868413758, - "income": 2400.0 + "asset": 276354943, + "cumulative_gap": 28086533, + "expense": 33256599, + "gap": 9256599, + "income": 24000000 }, { "age": 97, - "asset": 27511.129496834074, - "cumulative_gap": 3800.8263548836835, - "expense": 3392.173065782033, - "gap": 992.1730657820331, - "income": 2400.0 + "asset": 275111295, + "cumulative_gap": 38008264, + "expense": 33921731, + "gap": 9921731, + "income": 24000000 }, { "age": 98, - "asset": 27314.525123983603, - "cumulative_gap": 4860.842881981357, - "expense": 3460.0165270976736, - "gap": 1060.0165270976736, - "income": 2400.0 + "asset": 273145251, + "cumulative_gap": 48608429, + "expense": 34600165, + "gap": 10600165, + "income": 24000000 }, { "age": 99, - "asset": 27042.14385479251, - "cumulative_gap": 5990.059739620984, - "expense": 3529.216857639627, - "gap": 1129.216857639627, - "income": 2400.0 + "asset": 270421439, + "cumulative_gap": 59900597, + "expense": 35292169, + "gap": 11292169, + "income": 24000000 }, { "age": 100, - "asset": 26690.314807067472, - "cumulative_gap": 7189.860934413404, - "expense": 3599.8011947924197, - "gap": 1199.8011947924197, - "income": 2400.0 + "asset": 266903148, + "cumulative_gap": 71898609, + "expense": 35998012, + "gap": 11998012, + "income": 24000000 } ] }, diff --git a/fastapi/tests/golden/reduction_capped.json b/fastapi/tests/golden/reduction_capped.json index 1b395d1..17ce492 100644 --- a/fastapi/tests/golden/reduction_capped.json +++ b/fastapi/tests/golden/reduction_capped.json @@ -2,340 +2,340 @@ "body": { "current_age": 60, "depletion_age": 67, - "full_payment_income_threshold": 309.7, - "monthly_reduction": 75.0, - "reduced_monthly_pension": 75.0, - "reemployment_income": 99999.0, + "full_payment_income_threshold": 3097000, + "monthly_reduction": 750000, + "reduced_monthly_pension": 750000, + "reemployment_income": 999990000, "status": "INSUFFICIENT", "target_age": 84, "timeline": [ { "age": 60, - "asset": 10000.0, - "cumulative_gap": 1500.0, - "expense": 2400.0, - "gap": 1500.0, - "income": 900.0 + "asset": 100000000, + "cumulative_gap": 15000000, + "expense": 24000000, + "gap": 15000000, + "income": 9000000 }, { "age": 61, - "asset": 8755.0, - "cumulative_gap": 3048.0, - "expense": 2448.0, - "gap": 1548.0, - "income": 900.0 + "asset": 87550000, + "cumulative_gap": 30480000, + "expense": 24480000, + "gap": 15480000, + "income": 9000000 }, { "age": 62, - "asset": 7423.21, - "cumulative_gap": 4644.96, - "expense": 2496.96, - "gap": 1596.96, - "income": 900.0 + "asset": 74232100, + "cumulative_gap": 46449600, + "expense": 24969600, + "gap": 15969600, + "income": 9000000 }, { "age": 63, - "asset": 6001.0375, - "cumulative_gap": 6291.859200000001, - "expense": 2546.8992000000003, - "gap": 1646.8992000000003, - "income": 900.0 + "asset": 60010375, + "cumulative_gap": 62918592, + "expense": 25468992, + "gap": 16468992, + "income": 9000000 }, { "age": 64, - "asset": 4484.762449000001, - "cumulative_gap": 7989.696384000001, - "expense": 2597.8371840000004, - "gap": 1697.8371840000004, - "income": 900.0 + "asset": 44847624, + "cumulative_gap": 79896964, + "expense": 25978372, + "gap": 16978372, + "income": 9000000 }, { "age": 65, - "asset": 2870.5330229500005, - "cumulative_gap": 9739.490311680001, - "expense": 2649.7939276800007, - "gap": 1749.7939276800007, - "income": 900.0 + "asset": 28705330, + "cumulative_gap": 97394903, + "expense": 26497939, + "gap": 17497939, + "income": 9000000 }, { "age": 66, - "asset": 1154.3612681280997, - "cumulative_gap": 11542.280117913602, - "expense": 2702.7898062336008, - "gap": 1802.7898062336008, - "income": 900.0 + "asset": 11543613, + "cumulative_gap": 115422801, + "expense": 27027898, + "gap": 18027898, + "income": 9000000 }, { "age": 67, - "asset": -667.8813942486661, - "cumulative_gap": 13399.125720271875, - "expense": 2756.845602358273, - "gap": 1856.845602358273, - "income": 900.0 + "asset": -6678814, + "cumulative_gap": 133991257, + "expense": 27568456, + "gap": 18568456, + "income": 9000000 }, { "age": 68, - "asset": -2600.4688065051473, - "cumulative_gap": 15311.108234677315, - "expense": 2811.9825144054385, - "gap": 1911.9825144054385, - "income": 900.0 + "asset": -26004688, + "cumulative_gap": 153111082, + "expense": 28119825, + "gap": 19119825, + "income": 9000000 }, { "age": 69, - "asset": -4647.824860537904, - "cumulative_gap": 17279.33039937086, - "expense": 2868.2221646935473, - "gap": 1968.2221646935473, - "income": 900.0 + "asset": -46478249, + "cumulative_gap": 172793304, + "expense": 28682222, + "gap": 19682222, + "income": 9000000 }, { "age": 70, - "asset": -6814.528435988395, - "cumulative_gap": 19304.91700735828, - "expense": 2925.586607987418, - "gap": 2025.5866079874181, - "income": 900.0 + "asset": -68145284, + "cumulative_gap": 193049170, + "expense": 29255866, + "gap": 20255866, + "income": 9000000 }, { "age": 71, - "asset": -9105.318495295087, - "cumulative_gap": 21389.015347505447, - "expense": 2984.0983401471667, - "gap": 2084.0983401471667, - "income": 900.0 + "asset": -91053185, + "cumulative_gap": 213890153, + "expense": 29840983, + "gap": 20840983, + "income": 9000000 }, { "age": 72, - "asset": -11525.099340505523, - "cumulative_gap": 23532.795654455556, - "expense": 3043.78030695011, - "gap": 2143.78030695011, - "income": 900.0 + "asset": -115250993, + "cumulative_gap": 235327957, + "expense": 30437803, + "gap": 21437803, + "income": 9000000 }, { "age": 73, - "asset": -14078.946036879302, - "cumulative_gap": 25737.451567544667, - "expense": 3104.6559130891123, - "gap": 2204.6559130891123, - "income": 900.0 + "asset": -140789460, + "cumulative_gap": 257374516, + "expense": 31046559, + "gap": 22046559, + "income": 9000000 }, { "age": 74, - "asset": -16772.11000846747, - "cumulative_gap": 28004.20059889556, - "expense": 3166.7490313508947, - "gap": 2266.7490313508947, - "income": 900.0 + "asset": -167721100, + "cumulative_gap": 280042006, + "expense": 31667490, + "gap": 22667490, + "income": 9000000 }, { "age": 75, - "asset": -19610.024811012914, - "cumulative_gap": 30334.284610873474, - "expense": 3230.0840119779127, - "gap": 2330.0840119779127, - "income": 900.0 + "asset": -196100248, + "cumulative_gap": 303342846, + "expense": 32300840, + "gap": 23300840, + "income": 9000000 }, { "age": 76, - "asset": -22598.31208768055, - "cumulative_gap": 32728.970303090944, - "expense": 3294.685692217471, - "gap": 2394.685692217471, - "income": 900.0 + "asset": -225983121, + "cumulative_gap": 327289703, + "expense": 32946857, + "gap": 23946857, + "income": 9000000 }, { "age": 77, - "asset": -25742.78771329496, - "cumulative_gap": 35189.549709152765, - "expense": 3360.5794060618205, - "gap": 2460.5794060618205, - "income": 900.0 + "asset": -257427877, + "cumulative_gap": 351895497, + "expense": 33605794, + "gap": 24605794, + "income": 9000000 }, { "age": 78, - "asset": -29049.468132937487, - "cumulative_gap": 37717.34070333582, - "expense": 3427.790994183057, - "gap": 2527.790994183057, - "income": 900.0 + "asset": -290494681, + "cumulative_gap": 377173407, + "expense": 34277910, + "gap": 25277910, + "income": 9000000 }, { "age": 79, - "asset": -32524.576900934164, - "cumulative_gap": 40313.68751740254, - "expense": 3496.3468140667183, - "gap": 2596.3468140667183, - "income": 900.0 + "asset": -325245769, + "cumulative_gap": 403136875, + "expense": 34963468, + "gap": 25963468, + "income": 9000000 }, { "age": 80, - "asset": -36174.55142645091, - "cumulative_gap": 42979.961267750594, - "expense": 3566.2737503480525, - "gap": 2666.2737503480525, - "income": 900.0 + "asset": -361745514, + "cumulative_gap": 429799613, + "expense": 35662738, + "gap": 26662738, + "income": 9000000 }, { "age": 81, - "asset": -40006.049932102935, - "cumulative_gap": 45717.56049310561, - "expense": 3637.5992253550135, - "gap": 2737.5992253550135, - "income": 900.0 + "asset": -400060499, + "cumulative_gap": 457175605, + "expense": 36375992, + "gap": 27375992, + "income": 9000000 }, { "age": 82, - "asset": -44025.95863218169, - "cumulative_gap": 48527.91170296772, - "expense": 3710.3512098621136, - "gap": 2810.3512098621136, - "income": 900.0 + "asset": -440259586, + "cumulative_gap": 485279117, + "expense": 37103512, + "gap": 28103512, + "income": 9000000 }, { "age": 83, - "asset": -48241.39913730512, - "cumulative_gap": 51412.469937027076, - "expense": 3784.558234059356, - "gap": 2884.558234059356, - "income": 900.0 + "asset": -482413991, + "cumulative_gap": 514124699, + "expense": 37845582, + "gap": 28845582, + "income": 9000000 }, { "age": 84, - "asset": -52659.73609250541, - "cumulative_gap": 54372.719335767615, - "expense": 3860.2493987405433, - "gap": 2960.2493987405433, - "income": 900.0 + "asset": -526597361, + "cumulative_gap": 543727193, + "expense": 38602494, + "gap": 29602494, + "income": 9000000 }, { "age": 85, - "asset": -57288.585055983334, - "cumulative_gap": 57410.17372248297, - "expense": 3937.4543867153543, - "gap": 3037.4543867153543, - "income": 900.0 + "asset": -572885851, + "cumulative_gap": 574101737, + "expense": 39374544, + "gap": 30374544, + "income": 9000000 }, { "age": 86, - "asset": -62135.82062597965, - "cumulative_gap": 60526.37719693263, - "expense": 4016.2034744496614, - "gap": 3116.2034744496614, - "income": 900.0 + "asset": -621358206, + "cumulative_gap": 605263772, + "expense": 40162035, + "gap": 31162035, + "income": 9000000 }, { "age": 87, - "asset": -67209.5848234422, - "cumulative_gap": 63722.90474087129, - "expense": 4096.527543938655, - "gap": 3196.527543938655, - "income": 900.0 + "asset": -672095848, + "cumulative_gap": 637229047, + "expense": 40965275, + "gap": 31965275, + "income": 9000000 }, { "age": 88, - "asset": -72518.29573840229, - "cumulative_gap": 67001.36283568872, - "expense": 4178.458094817428, - "gap": 3278.458094817428, - "income": 900.0 + "asset": -725182957, + "cumulative_gap": 670013628, + "expense": 41784581, + "gap": 32784581, + "income": 9000000 }, { "age": 89, - "asset": -78070.65644821631, - "cumulative_gap": 70363.3900924025, - "expense": 4262.027256713776, - "gap": 3362.0272567137763, - "income": 900.0 + "asset": -780706564, + "cumulative_gap": 703633901, + "expense": 42620273, + "gap": 33620273, + "income": 9000000 }, { "age": 90, - "asset": -83875.66421607799, - "cumulative_gap": 73810.65789425054, - "expense": 4347.267801848052, - "gap": 3447.267801848052, - "income": 900.0 + "asset": -838756642, + "cumulative_gap": 738106579, + "expense": 43472678, + "gap": 34472678, + "income": 9000000 }, { "age": 91, - "asset": -89942.61997846382, - "cumulative_gap": 77344.87105213555, - "expense": 4434.213157885013, - "gap": 3534.213157885013, - "income": 900.0 + "asset": -899426200, + "cumulative_gap": 773448711, + "expense": 44342132, + "gap": 35342132, + "income": 9000000 }, { "age": 92, - "asset": -96281.13813043929, - "cumulative_gap": 80967.76847317826, - "expense": 4522.897421042713, - "gap": 3622.897421042713, - "income": 900.0 + "asset": -962811381, + "cumulative_gap": 809677685, + "expense": 45228974, + "gap": 36228974, + "income": 9000000 }, { "age": 93, - "asset": -102901.15661802646, - "cumulative_gap": 84681.12384264183, - "expense": 4613.3553694635675, - "gap": 3713.3553694635675, - "income": 900.0 + "asset": -1029011566, + "cumulative_gap": 846811238, + "expense": 46133554, + "gap": 37133554, + "income": 9000000 }, { "age": 94, - "asset": -109812.94734711474, - "cumulative_gap": 88486.74631949466, - "expense": 4705.622476852839, - "gap": 3805.622476852839, - "income": 900.0 + "asset": -1098129473, + "cumulative_gap": 884867463, + "expense": 47056225, + "gap": 38056225, + "income": 9000000 }, { "age": 95, - "asset": -117027.1269186866, - "cumulative_gap": 92386.48124588456, - "expense": 4799.734926389896, - "gap": 3899.734926389896, - "income": 900.0 + "asset": -1170271269, + "cumulative_gap": 923864812, + "expense": 47997349, + "gap": 38997349, + "income": 9000000 }, { "age": 96, - "asset": -124554.66770042879, - "cumulative_gap": 96382.21087080226, - "expense": 4895.729624917694, - "gap": 3995.7296249176943, - "income": 900.0 + "asset": -1245546677, + "cumulative_gap": 963822109, + "expense": 48957296, + "gap": 39957296, + "income": 9000000 }, { "age": 97, - "asset": -132406.9092451069, - "cumulative_gap": 100475.8550882183, - "expense": 4993.644217416048, - "gap": 4093.6442174160484, - "income": 900.0 + "asset": -1324069092, + "cumulative_gap": 1004758551, + "expense": 49936442, + "gap": 40936442, + "income": 9000000 }, { "age": 98, - "asset": -140595.57006639865, - "cumulative_gap": 104669.37218998268, - "expense": 5093.51710176437, - "gap": 4193.51710176437, - "income": 900.0 + "asset": -1405955701, + "cumulative_gap": 1046693722, + "expense": 50935171, + "gap": 41935171, + "income": 9000000 }, { "age": 99, - "asset": -149132.7597832079, - "cumulative_gap": 108964.75963378233, - "expense": 5195.387443799657, - "gap": 4295.387443799657, - "income": 900.0 + "asset": -1491327598, + "cumulative_gap": 1089647596, + "expense": 51953874, + "gap": 42953874, + "income": 9000000 }, { "age": 100, - "asset": -158030.9916438178, - "cumulative_gap": 113364.05482645798, - "expense": 5299.2951926756505, - "gap": 4399.2951926756505, - "income": 900.0 + "asset": -1580309916, + "cumulative_gap": 1133640548, + "expense": 52992952, + "gap": 43992952, + "income": 9000000 } ] }, diff --git a/fastapi/tests/golden/reduction_no_reduction.json b/fastapi/tests/golden/reduction_no_reduction.json index c9e03ba..9e034e4 100644 --- a/fastapi/tests/golden/reduction_no_reduction.json +++ b/fastapi/tests/golden/reduction_no_reduction.json @@ -2,340 +2,340 @@ "body": { "current_age": 60, "depletion_age": 74, - "full_payment_income_threshold": 309.7, - "monthly_reduction": 0.0, - "reduced_monthly_pension": 150.0, - "reemployment_income": 0.0, + "full_payment_income_threshold": 3097000, + "monthly_reduction": 0, + "reduced_monthly_pension": 1500000, + "reemployment_income": 0, "status": "INSUFFICIENT", "target_age": 84, "timeline": [ { "age": 60, - "asset": 10000.0, - "cumulative_gap": 600.0, - "expense": 2400.0, - "gap": 600.0, - "income": 1800.0 + "asset": 100000000, + "cumulative_gap": 6000000, + "expense": 24000000, + "gap": 6000000, + "income": 18000000 }, { "age": 61, - "asset": 9682.0, - "cumulative_gap": 1248.0, - "expense": 2448.0, - "gap": 648.0, - "income": 1800.0 + "asset": 96820000, + "cumulative_gap": 12480000, + "expense": 24480000, + "gap": 6480000, + "income": 18000000 }, { "age": 62, - "asset": 9305.02, - "cumulative_gap": 1944.96, - "expense": 2496.96, - "gap": 696.96, - "income": 1800.0 + "asset": 93050200, + "cumulative_gap": 19449600, + "expense": 24969600, + "gap": 6969600, + "income": 18000000 }, { "age": 63, - "asset": 8866.301800000001, - "cumulative_gap": 2691.8592000000003, - "expense": 2546.8992000000003, - "gap": 746.8992000000003, - "income": 1800.0 + "asset": 88663018, + "cumulative_gap": 26918592, + "expense": 25468992, + "gap": 7468992, + "income": 18000000 }, { "age": 64, - "asset": 8362.984678, - "cumulative_gap": 3489.6963840000008, - "expense": 2597.8371840000004, - "gap": 797.8371840000004, - "income": 1800.0 + "asset": 83629847, + "cumulative_gap": 34896964, + "expense": 25978372, + "gap": 7978372, + "income": 18000000 }, { "age": 65, - "asset": 7792.101918820001, - "cumulative_gap": 4339.4903116800015, - "expense": 2649.7939276800007, - "gap": 849.7939276800007, - "income": 1800.0 + "asset": 77921019, + "cumulative_gap": 43394903, + "expense": 26497939, + "gap": 8497939, + "income": 18000000 }, { "age": 66, - "asset": 7150.5772308742, - "cumulative_gap": 5242.280117913602, - "expense": 2702.7898062336008, - "gap": 902.7898062336008, - "income": 1800.0 + "asset": 71505772, + "cumulative_gap": 52422801, + "expense": 27027898, + "gap": 9027898, + "income": 18000000 }, { "age": 67, - "asset": 6435.221047379817, - "cumulative_gap": 6199.125720271875, - "expense": 2756.845602358273, - "gap": 956.845602358273, - "income": 1800.0 + "asset": 64352210, + "cumulative_gap": 61991257, + "expense": 27568456, + "gap": 9568456, + "income": 18000000 }, { "age": 68, - "asset": 5642.72670837219, - "cumulative_gap": 7211.108234677314, - "expense": 2811.9825144054385, - "gap": 1011.9825144054385, - "income": 1800.0 + "asset": 56427267, + "cumulative_gap": 72111082, + "expense": 28119825, + "gap": 10119825, + "income": 18000000 }, { "age": 69, - "asset": 4769.666519785754, - "cumulative_gap": 8279.330399370861, - "expense": 2868.2221646935473, - "gap": 1068.2221646935473, - "income": 1800.0 + "asset": 47696665, + "cumulative_gap": 82793304, + "expense": 28682222, + "gap": 10682222, + "income": 18000000 }, { "age": 70, - "asset": 3812.4876857449726, - "cumulative_gap": 9404.917007358279, - "expense": 2925.586607987418, - "gap": 1125.5866079874181, - "income": 1800.0 + "asset": 38124877, + "cumulative_gap": 94049170, + "expense": 29255866, + "gap": 11255866, + "income": 18000000 }, { "age": 71, - "asset": 2767.508110090281, - "cumulative_gap": 10589.015347505447, - "expense": 2984.0983401471667, - "gap": 1184.0983401471667, - "income": 1800.0 + "asset": 27675081, + "cumulative_gap": 105890153, + "expense": 29840983, + "gap": 11840983, + "income": 18000000 }, { "age": 72, - "asset": 1630.912063041408, - "cumulative_gap": 11832.795654455556, - "expense": 3043.78030695011, - "gap": 1243.7803069501101, - "income": 1800.0 + "asset": 16309121, + "cumulative_gap": 118327957, + "expense": 30437803, + "gap": 12437803, + "income": 18000000 }, { "age": 73, - "asset": 398.74570877403676, - "cumulative_gap": 13137.45156754467, - "expense": 3104.6559130891123, - "gap": 1304.6559130891123, - "income": 1800.0 + "asset": 3987457, + "cumulative_gap": 131374516, + "expense": 31046559, + "gap": 13046559, + "income": 18000000 }, { "age": 74, - "asset": -933.0875104445279, - "cumulative_gap": 14504.200598895564, - "expense": 3166.7490313508947, - "gap": 1366.7490313508947, - "income": 1800.0 + "asset": -9330875, + "cumulative_gap": 145042006, + "expense": 31667490, + "gap": 13667490, + "income": 18000000 }, { "age": 75, - "asset": -2368.8316380492856, - "cumulative_gap": 15934.284610873478, - "expense": 3230.0840119779127, - "gap": 1430.0840119779127, - "income": 1800.0 + "asset": -23688316, + "cumulative_gap": 159342846, + "expense": 32300840, + "gap": 14300840, + "income": 18000000 }, { "age": 76, - "asset": -3912.8831195280145, - "cumulative_gap": 17428.970303090948, - "expense": 3294.685692217471, - "gap": 1494.6856922174711, - "income": 1800.0 + "asset": -39128831, + "cumulative_gap": 174289703, + "expense": 32946857, + "gap": 14946857, + "income": 18000000 }, { "age": 77, - "asset": -5569.79587609785, - "cumulative_gap": 18989.54970915277, - "expense": 3360.5794060618205, - "gap": 1560.5794060618205, - "income": 1800.0 + "asset": -55697959, + "cumulative_gap": 189895497, + "expense": 33605794, + "gap": 15605794, + "income": 18000000 }, { "age": 78, - "asset": -7344.28654062446, - "cumulative_gap": 20617.340703335827, - "expense": 3427.790994183057, - "gap": 1627.7909941830571, - "income": 1800.0 + "asset": -73442865, + "cumulative_gap": 206173407, + "expense": 34277910, + "gap": 16277910, + "income": 18000000 }, { "age": 79, - "asset": -9241.239860851743, - "cumulative_gap": 22313.687517402544, - "expense": 3496.3468140667183, - "gap": 1696.3468140667183, - "income": 1800.0 + "asset": -92412399, + "cumulative_gap": 223136875, + "expense": 34963468, + "gap": 16963468, + "income": 18000000 }, { "age": 80, - "asset": -11265.714275166014, - "cumulative_gap": 24079.961267750597, - "expense": 3566.2737503480525, - "gap": 1766.2737503480525, - "income": 1800.0 + "asset": -112657143, + "cumulative_gap": 240799613, + "expense": 35662738, + "gap": 17662738, + "income": 18000000 }, { "age": 81, - "asset": -13422.94766627949, - "cumulative_gap": 25917.56049310561, - "expense": 3637.5992253550135, - "gap": 1837.5992253550135, - "income": 1800.0 + "asset": -134229477, + "cumulative_gap": 259175605, + "expense": 36375992, + "gap": 18375992, + "income": 18000000 }, { "age": 82, - "asset": -15718.36329838354, - "cumulative_gap": 27827.911702967725, - "expense": 3710.3512098621136, - "gap": 1910.3512098621136, - "income": 1800.0 + "asset": -157183633, + "cumulative_gap": 278279117, + "expense": 37103512, + "gap": 19103512, + "income": 18000000 }, { "age": 83, - "asset": -18157.575943493022, - "cumulative_gap": 29812.469937027083, - "expense": 3784.558234059356, - "gap": 1984.558234059356, - "income": 1800.0 + "asset": -181575759, + "cumulative_gap": 298124699, + "expense": 37845582, + "gap": 19845582, + "income": 18000000 }, { "age": 84, - "asset": -20746.39820287895, - "cumulative_gap": 31872.719335767626, - "expense": 3860.2493987405433, - "gap": 2060.2493987405433, - "income": 1800.0 + "asset": -207463982, + "cumulative_gap": 318727193, + "expense": 38602494, + "gap": 20602494, + "income": 18000000 }, { "age": 85, - "asset": -23490.84702966808, - "cumulative_gap": 34010.17372248298, - "expense": 3937.4543867153543, - "gap": 2137.4543867153543, - "income": 1800.0 + "asset": -234908470, + "cumulative_gap": 340101737, + "expense": 39374544, + "gap": 21374544, + "income": 18000000 }, { "age": 86, - "asset": -26397.150458874938, - "cumulative_gap": 36226.37719693264, - "expense": 4016.2034744496614, - "gap": 2216.2034744496614, - "income": 1800.0 + "asset": -263971505, + "cumulative_gap": 362263772, + "expense": 40162035, + "gap": 22162035, + "income": 18000000 }, { "age": 87, - "asset": -29471.75455132434, - "cumulative_gap": 38522.904740871294, - "expense": 4096.527543938655, - "gap": 2296.527543938655, - "income": 1800.0 + "asset": -294717546, + "cumulative_gap": 385229047, + "expense": 40965275, + "gap": 22965275, + "income": 18000000 }, { "age": 88, - "asset": -32721.33055812088, - "cumulative_gap": 40901.36283568872, - "expense": 4178.458094817428, - "gap": 2378.458094817428, - "income": 1800.0 + "asset": -327213306, + "cumulative_gap": 409013628, + "expense": 41784581, + "gap": 23784581, + "income": 18000000 }, { "age": 89, - "asset": -36152.78231252646, - "cumulative_gap": 43363.39009240249, - "expense": 4262.027256713776, - "gap": 2462.0272567137763, - "income": 1800.0 + "asset": -361527823, + "cumulative_gap": 433633901, + "expense": 42620273, + "gap": 24620273, + "income": 18000000 }, { "age": 90, - "asset": -39773.25385631745, - "cumulative_gap": 45910.657894250544, - "expense": 4347.267801848052, - "gap": 2547.267801848052, - "income": 1800.0 + "asset": -397732539, + "cumulative_gap": 459106579, + "expense": 43472678, + "gap": 25472678, + "income": 18000000 }, { "age": 91, - "asset": -43590.13730791047, - "cumulative_gap": 48544.87105213555, - "expense": 4434.213157885013, - "gap": 2634.213157885013, - "income": 1800.0 + "asset": -435901373, + "cumulative_gap": 485448711, + "expense": 44342132, + "gap": 26342132, + "income": 18000000 }, { "age": 92, - "asset": -47611.080979769344, - "cumulative_gap": 51267.768473178265, - "expense": 4522.897421042713, - "gap": 2722.897421042713, - "income": 1800.0 + "asset": -476110810, + "cumulative_gap": 512677685, + "expense": 45228974, + "gap": 27228974, + "income": 18000000 }, { "age": 93, - "asset": -51843.99775283642, - "cumulative_gap": 54081.123842641835, - "expense": 4613.3553694635675, - "gap": 2813.3553694635675, - "income": 1800.0 + "asset": -518439978, + "cumulative_gap": 540811238, + "expense": 46133554, + "gap": 28133554, + "income": 18000000 }, { "age": 94, - "asset": -56297.07371596899, - "cumulative_gap": 56986.746319494676, - "expense": 4705.622476852839, - "gap": 2905.622476852839, - "income": 1800.0 + "asset": -562970737, + "cumulative_gap": 569867463, + "expense": 47056225, + "gap": 29056225, + "income": 18000000 }, { "age": 95, - "asset": -60978.77707860649, - "cumulative_gap": 59986.48124588457, - "expense": 4799.734926389896, - "gap": 2999.734926389896, - "income": 1800.0 + "asset": -609787771, + "cumulative_gap": 599864812, + "expense": 47997349, + "gap": 29997349, + "income": 18000000 }, { "age": 96, - "asset": -65897.86736514627, - "cumulative_gap": 63082.210870802264, - "expense": 4895.729624917694, - "gap": 3095.7296249176943, - "income": 1800.0 + "asset": -658978674, + "cumulative_gap": 630822109, + "expense": 48957296, + "gap": 30957296, + "income": 18000000 }, { "age": 97, - "asset": -71063.40489976588, - "cumulative_gap": 66275.85508821832, - "expense": 4993.644217416048, - "gap": 3193.6442174160484, - "income": 1800.0 + "asset": -710634049, + "cumulative_gap": 662758551, + "expense": 49936442, + "gap": 31936442, + "income": 18000000 }, { "age": 98, - "asset": -76484.76059069739, - "cumulative_gap": 69569.37218998269, - "expense": 5093.51710176437, - "gap": 3293.5171017643697, - "income": 1800.0 + "asset": -764847606, + "cumulative_gap": 695693722, + "expense": 50935171, + "gap": 32935171, + "income": 18000000 }, { "age": 99, - "asset": -82171.62602323561, - "cumulative_gap": 72964.75963378235, - "expense": 5195.387443799657, - "gap": 3395.3874437996574, - "income": 1800.0 + "asset": -821716260, + "cumulative_gap": 729647596, + "expense": 51953874, + "gap": 33953874, + "income": 18000000 }, { "age": 100, - "asset": -88134.02387104633, - "cumulative_gap": 76464.054826458, - "expense": 5299.2951926756505, - "gap": 3499.2951926756505, - "income": 1800.0 + "asset": -881340239, + "cumulative_gap": 764640548, + "expense": 52992952, + "gap": 34992952, + "income": 18000000 } ] }, diff --git a/fastapi/tests/golden/reduction_partial.json b/fastapi/tests/golden/reduction_partial.json index 6bb4c17..33b488d 100644 --- a/fastapi/tests/golden/reduction_partial.json +++ b/fastapi/tests/golden/reduction_partial.json @@ -2,340 +2,340 @@ "body": { "current_age": 60, "depletion_age": 72, - "full_payment_income_threshold": 309.7, - "monthly_reduction": 14.03, - "reduced_monthly_pension": 135.97, - "reemployment_income": 500.0, + "full_payment_income_threshold": 3097000, + "monthly_reduction": 140300, + "reduced_monthly_pension": 1359700, + "reemployment_income": 5000000, "status": "INSUFFICIENT", "target_age": 84, "timeline": [ { "age": 60, - "asset": 10000.0, - "cumulative_gap": 768.3600000000001, - "expense": 2400.0, - "gap": 768.3600000000001, - "income": 1631.6399999999999 + "asset": 100000000, + "cumulative_gap": 7683600, + "expense": 24000000, + "gap": 7683600, + "income": 16316400 }, { "age": 61, - "asset": 9508.5892, - "cumulative_gap": 1584.7200000000003, - "expense": 2448.0, - "gap": 816.3600000000001, - "income": 1631.6399999999999 + "asset": 95085892, + "cumulative_gap": 15847200, + "expense": 24480000, + "gap": 8163600, + "income": 16316400 }, { "age": 62, - "asset": 8952.996076, - "cumulative_gap": 2450.0400000000004, - "expense": 2496.96, - "gap": 865.3200000000002, - "income": 1631.6399999999999 + "asset": 89529961, + "cumulative_gap": 24500400, + "expense": 24969600, + "gap": 8653200, + "income": 16316400 }, { "age": 63, - "asset": 8330.30635828, - "cumulative_gap": 3365.299200000001, - "expense": 2546.8992000000003, - "gap": 915.2592000000004, - "income": 1631.6399999999999 + "asset": 83303064, + "cumulative_gap": 33652992, + "expense": 25468992, + "gap": 9152592, + "income": 16316400 }, { "age": 64, - "asset": 7637.498573028401, - "cumulative_gap": 4331.496384000002, - "expense": 2597.8371840000004, - "gap": 966.1971840000006, - "income": 1631.6399999999999 + "asset": 76374986, + "cumulative_gap": 43314964, + "expense": 25978372, + "gap": 9661972, + "income": 16316400 }, { "age": 65, - "asset": 6871.440430699252, - "cumulative_gap": 5349.650311680003, - "expense": 2649.7939276800007, - "gap": 1018.1539276800008, - "income": 1631.6399999999999 + "asset": 68714404, + "cumulative_gap": 53496503, + "expense": 26497939, + "gap": 10181539, + "income": 16316400 }, { "age": 66, - "asset": 6028.885098109829, - "cumulative_gap": 6420.8001179136045, - "expense": 2702.7898062336008, - "gap": 1071.1498062336009, - "income": 1631.6399999999999 + "asset": 60288851, + "cumulative_gap": 64208001, + "expense": 27027898, + "gap": 10711498, + "income": 16316400 }, { "age": 67, - "asset": 5106.467350632515, - "cumulative_gap": 7546.005720271878, - "expense": 2756.845602358273, - "gap": 1125.2056023582732, - "income": 1631.6399999999999 + "asset": 51064674, + "cumulative_gap": 75460057, + "expense": 27568456, + "gap": 11252056, + "income": 16316400 }, { "age": 68, - "asset": 4100.69960072247, - "cumulative_gap": 8726.348234677316, - "expense": 2811.9825144054385, - "gap": 1180.3425144054386, - "income": 1631.6399999999999 + "asset": 41006996, + "cumulative_gap": 87263482, + "expense": 28119825, + "gap": 11803425, + "income": 16316400 }, { "age": 69, - "asset": 3007.967798906542, - "cumulative_gap": 9962.930399370864, - "expense": 2868.2221646935473, - "gap": 1236.5821646935474, - "income": 1631.6399999999999 + "asset": 30079678, + "cumulative_gap": 99629304, + "expense": 28682222, + "gap": 12365822, + "income": 16316400 }, { "age": 70, - "asset": 1824.5272032393846, - "cumulative_gap": 11256.877007358282, - "expense": 2925.586607987418, - "gap": 1293.9466079874182, - "income": 1631.6399999999999 + "asset": 18245272, + "cumulative_gap": 112568770, + "expense": 29255866, + "gap": 12939466, + "income": 16316400 }, { "age": 71, - "asset": 546.4980131095253, - "cumulative_gap": 12609.335347505448, - "expense": 2984.0983401471667, - "gap": 1352.4583401471668, - "income": 1631.6399999999999 + "asset": 5464980, + "cumulative_gap": 126093353, + "expense": 29840983, + "gap": 13524583, + "income": 16316400 }, { "age": 72, - "asset": -830.1391368487707, - "cumulative_gap": 14021.475654455558, - "expense": 3043.78030695011, - "gap": 1412.1403069501102, - "income": 1631.6399999999999 + "asset": -8301391, + "cumulative_gap": 140214757, + "expense": 30437803, + "gap": 14121403, + "income": 16316400 }, { "age": 73, - "asset": -2309.5478271128472, - "cumulative_gap": 15494.491567544672, - "expense": 3104.6559130891123, - "gap": 1473.0159130891125, - "income": 1631.6399999999999 + "asset": -23095478, + "cumulative_gap": 154944916, + "expense": 31046559, + "gap": 14730159, + "income": 16316400 }, { "age": 74, - "asset": -3896.0406524080186, - "cumulative_gap": 17029.600598895566, - "expense": 3166.7490313508947, - "gap": 1535.1090313508948, - "income": 1631.6399999999999 + "asset": -38960407, + "cumulative_gap": 170296006, + "expense": 31667490, + "gap": 15351090, + "income": 16316400 }, { "age": 75, - "asset": -5594.08417427168, - "cumulative_gap": 18628.04461087348, - "expense": 3230.0840119779127, - "gap": 1598.4440119779129, - "income": 1631.6399999999999 + "asset": -55940842, + "cumulative_gap": 186280446, + "expense": 32300840, + "gap": 15984440, + "income": 16316400 }, { "age": 76, - "asset": -7408.304031837081, - "cumulative_gap": 20291.09030309095, - "expense": 3294.685692217471, - "gap": 1663.0456922174712, - "income": 1631.6399999999999 + "asset": -74083040, + "cumulative_gap": 202910903, + "expense": 32946857, + "gap": 16630457, + "income": 16316400 }, { "age": 77, - "asset": -9343.49021577619, - "cumulative_gap": 22020.029709152772, - "expense": 3360.5794060618205, - "gap": 1728.9394060618206, - "income": 1631.6399999999999 + "asset": -93434902, + "cumulative_gap": 220200297, + "expense": 33605794, + "gap": 17289394, + "income": 16316400 }, { "age": 78, - "asset": -11404.602510493152, - "cumulative_gap": 23816.180703335827, - "expense": 3427.790994183057, - "gap": 1796.1509941830573, - "income": 1631.6399999999999 + "asset": -114046025, + "cumulative_gap": 238161807, + "expense": 34277910, + "gap": 17961510, + "income": 16316400 }, { "age": 79, - "asset": -13596.776109816496, - "cumulative_gap": 25680.887517402545, - "expense": 3496.3468140667183, - "gap": 1864.7068140667184, - "income": 1631.6399999999999 + "asset": -135967761, + "cumulative_gap": 256808875, + "expense": 34963468, + "gap": 18647068, + "income": 16316400 }, { "age": 80, - "asset": -15925.32741159971, - "cumulative_gap": 27615.5212677506, - "expense": 3566.2737503480525, - "gap": 1934.6337503480527, - "income": 1631.6399999999999 + "asset": -159253274, + "cumulative_gap": 276155213, + "expense": 35662738, + "gap": 19346338, + "income": 16316400 }, { "age": 81, - "asset": -18395.759996806195, - "cumulative_gap": 29621.480493105613, - "expense": 3637.5992253550135, - "gap": 2005.9592253550136, - "income": 1631.6399999999999 + "asset": -183957600, + "cumulative_gap": 296214805, + "expense": 36375992, + "gap": 20059592, + "income": 16316400 }, { "age": 82, - "asset": -21013.770798826044, - "cumulative_gap": 31700.191702967728, - "expense": 3710.3512098621136, - "gap": 2078.7112098621137, - "income": 1631.6399999999999 + "asset": -210137708, + "cumulative_gap": 317001917, + "expense": 37103512, + "gap": 20787112, + "income": 16316400 }, { "age": 83, - "asset": -23785.256468948806, - "cumulative_gap": 33853.10993702708, - "expense": 3784.558234059356, - "gap": 2152.918234059356, - "income": 1631.6399999999999 + "asset": -237852565, + "cumulative_gap": 338531099, + "expense": 37845582, + "gap": 21529182, + "income": 16316400 }, { "age": 84, - "asset": -26716.319944098406, - "cumulative_gap": 36081.71933576762, - "expense": 3860.2493987405433, - "gap": 2228.6093987405434, - "income": 1631.6399999999999 + "asset": -267163199, + "cumulative_gap": 360817193, + "expense": 38602494, + "gap": 22286094, + "income": 16316400 }, { "age": 85, - "asset": -29813.277223124118, - "cumulative_gap": 38387.53372248298, - "expense": 3937.4543867153543, - "gap": 2305.8143867153544, - "income": 1631.6399999999999 + "asset": -298132772, + "cumulative_gap": 383875337, + "expense": 39374544, + "gap": 23058144, + "income": 16316400 }, { "age": 86, - "asset": -33082.66435813466, - "cumulative_gap": 40772.09719693264, - "expense": 4016.2034744496614, - "gap": 2384.5634744496615, - "income": 1631.6399999999999 + "asset": -330826644, + "cumulative_gap": 407720972, + "expense": 40162035, + "gap": 23845635, + "income": 16316400 }, { "age": 87, - "asset": -36531.244667561856, - "cumulative_gap": 43236.984740871296, - "expense": 4096.527543938655, - "gap": 2464.887543938655, - "income": 1631.6399999999999 + "asset": -365312447, + "cumulative_gap": 432369847, + "expense": 40965275, + "gap": 24648875, + "income": 16316400 }, { "age": 88, - "asset": -40166.01617784553, - "cumulative_gap": 45783.80283568872, - "expense": 4178.458094817428, - "gap": 2546.818094817428, - "income": 1631.6399999999999 + "asset": -401660162, + "cumulative_gap": 457838028, + "expense": 41784581, + "gap": 25468181, + "income": 16316400 }, { "age": 89, - "asset": -43994.219300842844, - "cumulative_gap": 48414.190092402496, - "expense": 4262.027256713776, - "gap": 2630.3872567137764, - "income": 1631.6399999999999 + "asset": -439942193, + "cumulative_gap": 484141901, + "expense": 42620273, + "gap": 26303873, + "income": 16316400 }, { "age": 90, - "asset": -48023.34475428332, - "cumulative_gap": 51129.81789425055, - "expense": 4347.267801848052, - "gap": 2715.627801848052, - "income": 1631.6399999999999 + "asset": -480233448, + "cumulative_gap": 511298179, + "expense": 43472678, + "gap": 27156278, + "income": 16316400 }, { "age": 91, - "asset": -52261.14173281531, - "cumulative_gap": 53932.39105213556, - "expense": 4434.213157885013, - "gap": 2802.573157885013, - "income": 1631.6399999999999 + "asset": -522611417, + "cumulative_gap": 539323911, + "expense": 44342132, + "gap": 28025732, + "income": 16316400 }, { "age": 92, - "asset": -56715.62633742133, - "cumulative_gap": 56823.64847317827, - "expense": 4522.897421042713, - "gap": 2891.2574210427133, - "income": 1631.6399999999999 + "asset": -567156263, + "cumulative_gap": 568236485, + "expense": 45228974, + "gap": 28912574, + "income": 16316400 }, { "age": 93, - "asset": -61395.09027121797, - "cumulative_gap": 59805.36384264184, - "expense": 4613.3553694635675, - "gap": 2981.7153694635676, - "income": 1631.6399999999999 + "asset": -613950903, + "cumulative_gap": 598053638, + "expense": 46133554, + "gap": 29817154, + "income": 16316400 }, { "age": 94, - "asset": -66308.10980990199, - "cumulative_gap": 62879.34631949468, - "expense": 4705.622476852839, - "gap": 3073.982476852839, - "income": 1631.6399999999999 + "asset": -663081098, + "cumulative_gap": 628793463, + "expense": 47056225, + "gap": 30739825, + "income": 16316400 }, { "age": 95, - "asset": -71463.55505535747, - "cumulative_gap": 66047.44124588458, - "expense": 4799.734926389896, - "gap": 3168.094926389896, - "income": 1631.6399999999999 + "asset": -714635551, + "cumulative_gap": 660474412, + "expense": 47997349, + "gap": 31680949, + "income": 16316400 }, { "age": 96, - "asset": -76870.5994811998, - "cumulative_gap": 69311.53087080226, - "expense": 4895.729624917694, - "gap": 3264.0896249176944, - "income": 1631.6399999999999 + "asset": -768705995, + "cumulative_gap": 693115309, + "expense": 48957296, + "gap": 32640896, + "income": 16316400 }, { "age": 97, - "asset": -82538.72977930101, - "cumulative_gap": 72673.53508821831, - "expense": 4993.644217416048, - "gap": 3362.0042174160485, - "income": 1631.6399999999999 + "asset": -825387298, + "cumulative_gap": 726735351, + "expense": 49936442, + "gap": 33620042, + "income": 16316400 }, { "age": 98, - "asset": -88477.75601661857, - "cumulative_gap": 76135.41218998269, - "expense": 5093.51710176437, - "gap": 3461.87710176437, - "income": 1631.6399999999999 + "asset": -884777560, + "cumulative_gap": 761354122, + "expense": 50935171, + "gap": 34618771, + "income": 16316400 }, { "age": 99, - "asset": -94697.82211193444, - "cumulative_gap": 79699.15963378234, - "expense": 5195.387443799657, - "gap": 3563.7474437996575, - "income": 1631.6399999999999 + "asset": -946978221, + "cumulative_gap": 796991596, + "expense": 51953874, + "gap": 35637474, + "income": 16316400 }, { "age": 100, - "asset": -101209.41664240613, - "cumulative_gap": 83366.814826458, - "expense": 5299.2951926756505, - "gap": 3667.6551926756506, - "income": 1631.6399999999999 + "asset": -1012094166, + "cumulative_gap": 833668148, + "expense": 52992952, + "gap": 36676552, + "income": 16316400 } ] }, diff --git a/fastapi/tests/golden/scenarios_basic.json b/fastapi/tests/golden/scenarios_basic.json index e3cab68..a6cab3a 100644 --- a/fastapi/tests/golden/scenarios_basic.json +++ b/fastapi/tests/golden/scenarios_basic.json @@ -10,334 +10,334 @@ "timeline": [ { "age": 60, - "asset": 10000.0, - "cumulative_gap": 1200.0, - "expense": 3000.0, - "gap": 1200.0, - "income": 1800.0 + "asset": 100000000, + "cumulative_gap": 12000000, + "expense": 30000000, + "gap": 12000000, + "income": 18000000 }, { "age": 61, - "asset": 9064.0, - "cumulative_gap": 2460.0, - "expense": 3060.0, - "gap": 1260.0, - "income": 1800.0 + "asset": 90640000, + "cumulative_gap": 24600000, + "expense": 30600000, + "gap": 12600000, + "income": 18000000 }, { "age": 62, - "asset": 8038.12, - "cumulative_gap": 3781.2000000000003, - "expense": 3121.2000000000003, - "gap": 1321.2000000000003, - "income": 1800.0 + "asset": 80381200, + "cumulative_gap": 37812000, + "expense": 31212000, + "gap": 13212000, + "income": 18000000 }, { "age": 63, - "asset": 6918.4276, - "cumulative_gap": 5164.8240000000005, - "expense": 3183.6240000000003, - "gap": 1383.6240000000003, - "income": 1800.0 + "asset": 69184276, + "cumulative_gap": 51648240, + "expense": 31836240, + "gap": 13836240, + "income": 18000000 }, { "age": 64, - "asset": 5700.847707999999, - "cumulative_gap": 6612.120480000001, - "expense": 3247.2964800000004, - "gap": 1447.2964800000004, - "income": 1800.0 + "asset": 57008477, + "cumulative_gap": 66121205, + "expense": 32472965, + "gap": 14472965, + "income": 18000000 }, { "age": 65, - "asset": 4381.157764839999, - "cumulative_gap": 8124.362889600002, - "expense": 3312.2424096000004, - "gap": 1512.2424096000004, - "income": 1800.0 + "asset": 43811578, + "cumulative_gap": 81243629, + "expense": 33122424, + "gap": 15122424, + "income": 18000000 }, { "age": 66, - "asset": 2954.9828158971986, - "cumulative_gap": 9702.850147392002, - "expense": 3378.4872577920005, - "gap": 1578.4872577920005, - "income": 1800.0 + "asset": 29549828, + "cumulative_gap": 97028501, + "expense": 33784873, + "gap": 15784873, + "income": 18000000 }, { "age": 67, - "asset": 1417.7904248483542, - "cumulative_gap": 11348.907150339843, - "expense": 3446.0570029478404, - "gap": 1646.0570029478404, - "income": 1800.0 + "asset": 14177904, + "cumulative_gap": 113489072, + "expense": 34460570, + "gap": 16460570, + "income": 18000000 }, { "age": 68, - "asset": -235.1145754424708, - "cumulative_gap": 13063.88529334664, - "expense": 3514.9781430067974, - "gap": 1714.9781430067974, - "income": 1800.0 + "asset": -2351146, + "cumulative_gap": 130638853, + "expense": 35149781, + "gap": 17149781, + "income": 18000000 }, { "age": 69, - "asset": -2008.5955000027463, - "cumulative_gap": 14849.162999213575, - "expense": 3585.2777058669335, - "gap": 1785.2777058669335, - "income": 1800.0 + "asset": -20085955, + "cumulative_gap": 148491630, + "expense": 35852777, + "gap": 17852777, + "income": 18000000 }, { "age": 70, - "asset": -3907.6894020457703, - "cumulative_gap": 16706.14625919785, - "expense": 3656.983259984272, - "gap": 1856.983259984272, - "income": 1800.0 + "asset": -39076894, + "cumulative_gap": 167061463, + "expense": 36569833, + "gap": 18569833, + "income": 18000000 }, { "age": 71, - "asset": -5937.612841890944, - "cumulative_gap": 18636.269184381807, - "expense": 3730.1229251839577, - "gap": 1930.1229251839577, - "income": 1800.0 + "asset": -59376128, + "cumulative_gap": 186362692, + "expense": 37301229, + "gap": 19301229, + "income": 18000000 }, { "age": 72, - "asset": -8103.767840087149, - "cumulative_gap": 20640.994568069444, - "expense": 3804.725383687637, - "gap": 2004.725383687637, - "income": 1800.0 + "asset": -81037678, + "cumulative_gap": 206409946, + "expense": 38047254, + "gap": 20047254, + "income": 18000000 }, { "age": 73, - "asset": -10411.748020488028, - "cumulative_gap": 22721.814459430832, - "expense": 3880.81989136139, - "gap": 2080.81989136139, - "income": 1800.0 + "asset": -104117480, + "cumulative_gap": 227218145, + "expense": 38808199, + "gap": 20808199, + "income": 18000000 }, { "age": 74, - "asset": -12867.344949204902, - "cumulative_gap": 24880.25074861945, - "expense": 3958.436289188618, - "gap": 2158.436289188618, - "income": 1800.0 + "asset": -128673449, + "cumulative_gap": 248802507, + "expense": 39584363, + "gap": 21584363, + "income": 18000000 }, { "age": 75, - "asset": -15476.554675545325, - "cumulative_gap": 27117.85576359184, - "expense": 4037.6050149723906, - "gap": 2237.6050149723906, - "income": 1800.0 + "asset": -154765547, + "cumulative_gap": 271178558, + "expense": 40376050, + "gap": 22376050, + "income": 18000000 }, { "age": 76, - "asset": -18245.584481233247, - "cumulative_gap": 29436.21287886368, - "expense": 4118.357115271839, - "gap": 2318.3571152718387, - "income": 1800.0 + "asset": -182455845, + "cumulative_gap": 294362129, + "expense": 41183571, + "gap": 23183571, + "income": 18000000 }, { "age": 77, - "asset": -21180.85984440024, - "cumulative_gap": 31836.937136440956, - "expense": 4200.724257577275, - "gap": 2400.7242575772752, - "income": 1800.0 + "asset": -211808598, + "cumulative_gap": 318369371, + "expense": 42007243, + "gap": 24007243, + "income": 18000000 }, { "age": 78, - "asset": -24289.03162503684, - "cumulative_gap": 34321.67587916978, - "expense": 4284.73874272882, - "gap": 2484.7387427288204, - "income": 1800.0 + "asset": -242890316, + "cumulative_gap": 343216759, + "expense": 42847387, + "gap": 24847387, + "income": 18000000 }, { "age": 79, - "asset": -27576.983478798633, - "cumulative_gap": 36892.10939675318, - "expense": 4370.433517583397, - "gap": 2570.4335175833967, - "income": 1800.0 + "asset": -275769835, + "cumulative_gap": 368921094, + "expense": 43704335, + "gap": 25704335, + "income": 18000000 }, { "age": 80, - "asset": -31051.839506273493, - "cumulative_gap": 39549.95158468824, - "expense": 4457.842187935064, - "gap": 2657.8421879350644, - "income": 1800.0 + "asset": -310518395, + "cumulative_gap": 395499516, + "expense": 44578422, + "gap": 26578422, + "income": 18000000 }, { "age": 81, - "asset": -34720.972145034815, - "cumulative_gap": 42296.950616382004, - "expense": 4546.999031693766, - "gap": 2746.9990316937656, - "income": 1800.0 + "asset": -347209721, + "cumulative_gap": 422969506, + "expense": 45469990, + "gap": 27469990, + "income": 18000000 }, { "age": 82, - "asset": -38592.010312030434, - "cumulative_gap": 45134.88962870964, - "expense": 4637.939012327641, - "gap": 2837.9390123276407, - "income": 1800.0 + "asset": -385920103, + "cumulative_gap": 451348896, + "expense": 46379390, + "gap": 28379390, + "income": 18000000 }, { "age": 83, - "asset": -42672.847804088815, - "cumulative_gap": 48065.58742128384, - "expense": 4730.697792574194, - "gap": 2930.697792574194, - "income": 1800.0 + "asset": -426728478, + "cumulative_gap": 480655874, + "expense": 47306978, + "gap": 29306978, + "income": 18000000 }, { "age": 84, - "asset": -46971.6519645629, - "cumulative_gap": 51090.89916970952, - "expense": 4825.311748425678, - "gap": 3025.311748425678, - "income": 1800.0 + "asset": -469716520, + "cumulative_gap": 510908992, + "expense": 48253117, + "gap": 30253117, + "income": 18000000 }, { "age": 85, - "asset": -51496.87262437824, - "cumulative_gap": 54212.71715310371, - "expense": 4921.817983394192, - "gap": 3121.817983394192, - "income": 1800.0 + "asset": -514968726, + "cumulative_gap": 542127172, + "expense": 49218180, + "gap": 31218180, + "income": 18000000 }, { "age": 86, - "asset": -56257.2513260056, - "cumulative_gap": 57432.97149616579, - "expense": 5020.254343062076, - "gap": 3220.2543430620763, - "income": 1800.0 + "asset": -562572513, + "cumulative_gap": 574329715, + "expense": 50202543, + "gap": 32202543, + "income": 18000000 }, { "age": 87, - "asset": -61261.83083913971, - "cumulative_gap": 60753.63092608911, - "expense": 5120.6594299233175, - "gap": 3320.6594299233175, - "income": 1800.0 + "asset": -612618308, + "cumulative_gap": 607536309, + "expense": 51206594, + "gap": 33206594, + "income": 18000000 }, { "age": 88, - "asset": -66519.96497713492, - "cumulative_gap": 64176.70354461089, - "expense": 5223.072618521784, - "gap": 3423.0726185217836, - "income": 1800.0 + "asset": -665199650, + "cumulative_gap": 641767035, + "expense": 52230726, + "gap": 34230726, + "income": 18000000 }, { "age": 89, - "asset": -72041.3287235264, - "cumulative_gap": 67704.23761550311, - "expense": 5327.5340708922195, - "gap": 3527.5340708922195, - "income": 1800.0 + "asset": -720413287, + "cumulative_gap": 677042376, + "expense": 53275341, + "gap": 35275341, + "income": 18000000 }, { "age": 90, - "asset": -77835.92867825118, - "cumulative_gap": 71338.32236781318, - "expense": 5434.084752310064, - "gap": 3634.084752310064, - "income": 1800.0 + "asset": -778359287, + "cumulative_gap": 713383224, + "expense": 54340848, + "gap": 36340848, + "income": 18000000 }, { "age": 91, - "asset": -83914.11383347808, - "cumulative_gap": 75081.08881516944, - "expense": 5542.766447356265, - "gap": 3742.7664473562654, - "income": 1800.0 + "asset": -839141138, + "cumulative_gap": 750810888, + "expense": 55427664, + "gap": 37427664, + "income": 18000000 }, { "age": 92, - "asset": -90286.58668925938, - "cumulative_gap": 78934.71059147283, - "expense": 5653.621776303391, - "gap": 3853.621776303391, - "income": 1800.0 + "asset": -902865867, + "cumulative_gap": 789347106, + "expense": 56536218, + "gap": 38536218, + "income": 18000000 }, { "age": 93, - "asset": -96964.41471952965, - "cumulative_gap": 82901.40480330228, - "expense": 5766.694211829459, - "gap": 3966.694211829459, - "income": 1800.0 + "asset": -969644147, + "cumulative_gap": 829014048, + "expense": 57666942, + "gap": 39666942, + "income": 18000000 }, { "age": 94, - "asset": -103959.04219929989, - "cumulative_gap": 86983.43289936833, - "expense": 5882.028096066048, - "gap": 4082.0280960660484, - "income": 1800.0 + "asset": -1039590422, + "cumulative_gap": 869834329, + "expense": 58820281, + "gap": 40820281, + "income": 18000000 }, { "age": 95, - "asset": -111282.30240422691, - "cumulative_gap": 91183.1015573557, - "expense": 5999.668657987369, - "gap": 4199.668657987369, - "income": 1800.0 + "asset": -1112823024, + "cumulative_gap": 911831016, + "expense": 59996687, + "gap": 41996687, + "income": 18000000 }, { "age": 96, - "asset": -118946.4301940807, - "cumulative_gap": 95502.76358850281, - "expense": 6119.662031147117, - "gap": 4319.662031147117, - "income": 1800.0 + "asset": -1189464302, + "cumulative_gap": 955027636, + "expense": 61196620, + "gap": 43196620, + "income": 18000000 }, { "age": 97, - "asset": -126964.07499198466, - "cumulative_gap": 99944.81886027288, - "expense": 6242.055271770059, - "gap": 4442.055271770059, - "income": 1800.0 + "asset": -1269640750, + "cumulative_gap": 999448189, + "expense": 62420553, + "gap": 44420553, + "income": 18000000 }, { "age": 98, - "asset": -135348.31417166736, - "cumulative_gap": 104511.71523747833, - "expense": 6366.89637720546, - "gap": 4566.89637720546, - "income": 1800.0 + "asset": -1353483142, + "cumulative_gap": 1045117152, + "expense": 63668964, + "gap": 45668964, + "income": 18000000 }, { "age": 99, - "asset": -144112.666865339, - "cumulative_gap": 109205.9495422279, - "expense": 6494.23430474957, - "gap": 4694.23430474957, - "income": 1800.0 + "asset": -1441126669, + "cumulative_gap": 1092059495, + "expense": 64942343, + "gap": 46942343, + "income": 18000000 }, { "age": 100, - "asset": -153271.10820519124, - "cumulative_gap": 114030.06853307247, - "expense": 6624.118990844561, - "gap": 4824.118990844561, - "income": 1800.0 + "asset": -1532711082, + "cumulative_gap": 1140300685, + "expense": 66241190, + "gap": 48241190, + "income": 18000000 } ], - "total_received": 73800.0 + "total_received": 738000000 }, { "break_even_age": 60, @@ -346,334 +346,334 @@ "timeline": [ { "age": 60, - "asset": 10000.0, - "cumulative_gap": 1650.0, - "expense": 3000.0, - "gap": 1650.0, - "income": 1350.0 + "asset": 100000000, + "cumulative_gap": 16500000, + "expense": 30000000, + "gap": 16500000, + "income": 13500000 }, { "age": 61, - "asset": 8600.5, - "cumulative_gap": 3360.0, - "expense": 3060.0, - "gap": 1710.0, - "income": 1350.0 + "asset": 86005000, + "cumulative_gap": 33600000, + "expense": 30600000, + "gap": 17100000, + "income": 13500000 }, { "age": 62, - "asset": 7097.215, - "cumulative_gap": 5131.200000000001, - "expense": 3121.2000000000003, - "gap": 1771.2000000000003, - "income": 1350.0 + "asset": 70972150, + "cumulative_gap": 51312000, + "expense": 31212000, + "gap": 17712000, + "income": 13500000 }, { "age": 63, - "asset": 5485.79545, - "cumulative_gap": 6964.8240000000005, - "expense": 3183.6240000000003, - "gap": 1833.6240000000003, - "income": 1350.0 + "asset": 54857954, + "cumulative_gap": 69648240, + "expense": 31836240, + "gap": 18336240, + "income": 13500000 }, { "age": 64, - "asset": 3761.7365934999993, - "cumulative_gap": 8862.120480000001, - "expense": 3247.2964800000004, - "gap": 1897.2964800000004, - "income": 1350.0 + "asset": 37617366, + "cumulative_gap": 88621205, + "expense": 32472965, + "gap": 18972965, + "income": 13500000 }, { "age": 65, - "asset": 1920.373316904999, - "cumulative_gap": 10824.362889600001, - "expense": 3312.2424096000004, - "gap": 1962.2424096000004, - "income": 1350.0 + "asset": 19203733, + "cumulative_gap": 108243629, + "expense": 33122424, + "gap": 19622424, + "income": 13500000 }, { "age": 66, - "asset": -43.125165475851475, - "cumulative_gap": 12852.850147392, - "expense": 3378.4872577920005, - "gap": 2028.4872577920005, - "income": 1350.0 + "asset": -431252, + "cumulative_gap": 128528501, + "expense": 33784873, + "gap": 20284873, + "income": 13500000 }, { "age": 67, - "asset": -2133.7607959658876, - "cumulative_gap": 14948.90715033984, - "expense": 3446.0570029478404, - "gap": 2096.0570029478404, - "income": 1350.0 + "asset": -21337608, + "cumulative_gap": 149489072, + "expense": 34460570, + "gap": 20960570, + "income": 13500000 }, { "age": 68, - "asset": -4356.712332881139, - "cumulative_gap": 17113.885293346637, - "expense": 3514.9781430067974, - "gap": 2164.9781430067974, - "income": 1350.0 + "asset": -43567123, + "cumulative_gap": 171138853, + "expense": 35149781, + "gap": 21649781, + "income": 13500000 }, { "age": 69, - "asset": -6717.341190164576, - "cumulative_gap": 19349.16299921357, - "expense": 3585.2777058669335, - "gap": 2235.2777058669335, - "income": 1350.0 + "asset": -67173412, + "cumulative_gap": 193491630, + "expense": 35852777, + "gap": 22352777, + "income": 13500000 }, { "age": 70, - "asset": -9221.197462912454, - "cumulative_gap": 21656.14625919784, - "expense": 3656.983259984272, - "gap": 2306.983259984272, - "income": 1350.0 + "asset": -92211975, + "cumulative_gap": 216561463, + "expense": 36569833, + "gap": 23069833, + "income": 13500000 }, { "age": 71, - "asset": -11874.026144583628, - "cumulative_gap": 24036.2691843818, - "expense": 3730.1229251839577, - "gap": 2380.1229251839577, - "income": 1350.0 + "asset": -118740261, + "cumulative_gap": 240362692, + "expense": 37301229, + "gap": 23801229, + "income": 13500000 }, { "age": 72, - "asset": -14681.773541860613, - "cumulative_gap": 26490.994568069436, - "expense": 3804.725383687637, - "gap": 2454.725383687637, - "income": 1350.0 + "asset": -146817735, + "cumulative_gap": 264909946, + "expense": 38047254, + "gap": 24547254, + "income": 13500000 }, { "age": 73, - "asset": -17650.593893314697, - "cumulative_gap": 29021.814459430825, - "expense": 3880.81989136139, - "gap": 2530.81989136139, - "income": 1350.0 + "asset": -176505939, + "cumulative_gap": 290218145, + "expense": 38808199, + "gap": 25308199, + "income": 13500000 }, { "age": 74, - "asset": -20786.85619821637, - "cumulative_gap": 31630.250748619444, - "expense": 3958.436289188618, - "gap": 2608.436289188618, - "income": 1350.0 + "asset": -207868562, + "cumulative_gap": 316302507, + "expense": 39584363, + "gap": 26084363, + "income": 13500000 }, { "age": 75, - "asset": -24097.15126202714, - "cumulative_gap": 34317.85576359183, - "expense": 4037.6050149723906, - "gap": 2687.6050149723906, - "income": 1350.0 + "asset": -240971513, + "cumulative_gap": 343178558, + "expense": 40376050, + "gap": 26876050, + "income": 13500000 }, { "age": 76, - "asset": -27588.298965309514, - "cumulative_gap": 37086.21287886367, - "expense": 4118.357115271839, - "gap": 2768.3571152718387, - "income": 1350.0 + "asset": -275882990, + "cumulative_gap": 370862129, + "expense": 41183571, + "gap": 27683571, + "income": 13500000 }, { "age": 77, - "asset": -31267.355762998795, - "cumulative_gap": 39936.937136440945, - "expense": 4200.724257577275, - "gap": 2850.7242575772752, - "income": 1350.0 + "asset": -312673558, + "cumulative_gap": 399369371, + "expense": 42007243, + "gap": 28507243, + "income": 13500000 }, { "age": 78, - "asset": -35141.62242119335, - "cumulative_gap": 42871.675879169765, - "expense": 4284.73874272882, - "gap": 2934.7387427288204, - "income": 1350.0 + "asset": -351416224, + "cumulative_gap": 428716759, + "expense": 42847387, + "gap": 29347387, + "income": 13500000 }, { "age": 79, - "asset": -39218.651998839836, - "cumulative_gap": 45892.10939675316, - "expense": 4370.433517583397, - "gap": 3020.4335175833967, - "income": 1350.0 + "asset": -392186520, + "cumulative_gap": 458921094, + "expense": 43704335, + "gap": 30204335, + "income": 13500000 }, { "age": 80, - "asset": -43506.258081915934, - "cumulative_gap": 48999.95158468823, - "expense": 4457.842187935064, - "gap": 3107.8421879350644, - "income": 1350.0 + "asset": -435062581, + "cumulative_gap": 489999516, + "expense": 44578422, + "gap": 31078422, + "income": 13500000 }, { "age": 81, - "asset": -48012.52327794653, - "cumulative_gap": 52196.95061638199, - "expense": 4546.999031693766, - "gap": 3196.9990316937656, - "income": 1350.0 + "asset": -480125233, + "cumulative_gap": 521969506, + "expense": 45469990, + "gap": 31969990, + "income": 13500000 }, { "age": 82, - "asset": -52745.8079789295, - "cumulative_gap": 55484.88962870963, - "expense": 4637.939012327641, - "gap": 3287.9390123276407, - "income": 1350.0 + "asset": -527458080, + "cumulative_gap": 554848896, + "expense": 46379390, + "gap": 32879390, + "income": 13500000 }, { "age": 83, - "asset": -57714.75940099486, - "cumulative_gap": 58865.587421283824, - "expense": 4730.697792574194, - "gap": 3380.697792574194, - "income": 1350.0 + "asset": -577147594, + "cumulative_gap": 588655874, + "expense": 47306978, + "gap": 33806978, + "income": 13500000 }, { "age": 84, - "asset": -62928.320909376125, - "cumulative_gap": 62340.899169709504, - "expense": 4825.311748425678, - "gap": 3475.311748425678, - "income": 1350.0 + "asset": -629283209, + "cumulative_gap": 623408992, + "expense": 48253117, + "gap": 34753117, + "income": 13500000 }, { "age": 85, - "asset": -68395.74163753586, - "cumulative_gap": 65912.7171531037, - "expense": 4921.817983394192, - "gap": 3571.817983394192, - "income": 1350.0 + "asset": -683957416, + "cumulative_gap": 659127172, + "expense": 49218180, + "gap": 35718180, + "income": 13500000 }, { "age": 86, - "asset": -74126.58640955796, - "cumulative_gap": 69582.97149616577, - "expense": 5020.254343062076, - "gap": 3670.2543430620763, - "income": 1350.0 + "asset": -741265864, + "cumulative_gap": 695829715, + "expense": 50202543, + "gap": 36702543, + "income": 13500000 }, { "age": 87, - "asset": -80130.74597519863, - "cumulative_gap": 73353.63092608908, - "expense": 5120.6594299233175, - "gap": 3770.6594299233175, - "income": 1350.0 + "asset": -801307460, + "cumulative_gap": 733536309, + "expense": 51206594, + "gap": 37706594, + "income": 13500000 }, { "age": 88, - "asset": -86418.44756727561, - "cumulative_gap": 77226.70354461086, - "expense": 5223.072618521784, - "gap": 3873.0726185217836, - "income": 1350.0 + "asset": -864184476, + "cumulative_gap": 772267035, + "expense": 52230726, + "gap": 38730726, + "income": 13500000 }, { "age": 89, - "asset": -93000.26579137132, - "cumulative_gap": 81204.23761550308, - "expense": 5327.5340708922195, - "gap": 3977.5340708922195, - "income": 1350.0 + "asset": -930002658, + "cumulative_gap": 812042376, + "expense": 53275341, + "gap": 39775341, + "income": 13500000 }, { "age": 90, - "asset": -99887.13385813145, - "cumulative_gap": 85288.32236781315, - "expense": 5434.084752310064, - "gap": 4084.084752310064, - "income": 1350.0 + "asset": -998871339, + "cumulative_gap": 852883224, + "expense": 54340848, + "gap": 40840848, + "income": 13500000 }, { "age": 91, - "asset": -107090.35516875476, - "cumulative_gap": 89481.08881516941, - "expense": 5542.766447356265, - "gap": 4192.766447356265, - "income": 1350.0 + "asset": -1070903552, + "cumulative_gap": 894810888, + "expense": 55427664, + "gap": 41927664, + "income": 13500000 }, { "age": 92, - "asset": -114621.61526459435, - "cumulative_gap": 93784.7105914728, - "expense": 5653.621776303391, - "gap": 4303.621776303391, - "income": 1350.0 + "asset": -1146216153, + "cumulative_gap": 937847106, + "expense": 56536218, + "gap": 43036218, + "income": 13500000 }, { "age": 93, - "asset": -122492.99415212468, - "cumulative_gap": 98201.40480330226, - "expense": 5766.694211829459, - "gap": 4416.694211829459, - "income": 1350.0 + "asset": -1224929942, + "cumulative_gap": 982014048, + "expense": 57666942, + "gap": 44166942, + "income": 13500000 }, { "age": 94, - "asset": -130716.97901487276, - "cumulative_gap": 102733.4328993683, - "expense": 5882.028096066048, - "gap": 4532.028096066048, - "income": 1350.0 + "asset": -1307169790, + "cumulative_gap": 1027334329, + "expense": 58820281, + "gap": 45320281, + "income": 13500000 }, { "age": 95, - "asset": -139306.47732426698, - "cumulative_gap": 107383.10155735567, - "expense": 5999.668657987369, - "gap": 4649.668657987369, - "income": 1350.0 + "asset": -1393064773, + "cumulative_gap": 1073831016, + "expense": 59996687, + "gap": 46496687, + "income": 13500000 }, { "age": 96, - "asset": -148274.83036172198, - "cumulative_gap": 112152.76358850278, - "expense": 6119.662031147117, - "gap": 4769.662031147117, - "income": 1350.0 + "asset": -1482748304, + "cumulative_gap": 1121527636, + "expense": 61196620, + "gap": 47696620, + "income": 13500000 }, { "age": 97, - "asset": -157635.82716465517, - "cumulative_gap": 117044.81886027285, - "expense": 6242.055271770059, - "gap": 4892.055271770059, - "income": 1350.0 + "asset": -1576358272, + "cumulative_gap": 1170448189, + "expense": 62420553, + "gap": 48920553, + "income": 13500000 }, { "age": 98, - "asset": -167403.71890951798, - "cumulative_gap": 122061.7152374783, - "expense": 6366.89637720546, - "gap": 5016.89637720546, - "income": 1350.0 + "asset": -1674037189, + "cumulative_gap": 1220617152, + "expense": 63668964, + "gap": 50168964, + "income": 13500000 }, { "age": 99, - "asset": -177593.23374532515, - "cumulative_gap": 127205.94954222787, - "expense": 6494.23430474957, - "gap": 5144.23430474957, - "income": 1350.0 + "asset": -1775932337, + "cumulative_gap": 1272059495, + "expense": 64942343, + "gap": 51442343, + "income": 13500000 }, { "age": 100, - "asset": -188219.59209157698, - "cumulative_gap": 132480.06853307242, - "expense": 6624.118990844561, - "gap": 5274.118990844561, - "income": 1350.0 + "asset": -1882195921, + "cumulative_gap": 1324800685, + "expense": 66241190, + "gap": 52741190, + "income": 13500000 } ], - "total_received": 55350.0 + "total_received": 553500000 }, { "break_even_age": 64, @@ -682,334 +682,334 @@ "timeline": [ { "age": 60, - "asset": 18531.25, - "cumulative_gap": 3000.0, - "expense": 3000.0, - "gap": 3000.0, - "income": 0.0 + "asset": 185312500, + "cumulative_gap": 30000000, + "expense": 30000000, + "gap": 30000000, + "income": 0 }, { "age": 61, - "asset": 15997.1875, - "cumulative_gap": 6060.0, - "expense": 3060.0, - "gap": 3060.0, - "income": 0.0 + "asset": 159971875, + "cumulative_gap": 60600000, + "expense": 30600000, + "gap": 30600000, + "income": 0 }, { "age": 62, - "asset": 13325.303125, - "cumulative_gap": 9181.2, - "expense": 3121.2000000000003, - "gap": 3121.2000000000003, - "income": 0.0 + "asset": 133253031, + "cumulative_gap": 91812000, + "expense": 31212000, + "gap": 31212000, + "income": 0 }, { "age": 63, - "asset": 10510.22621875, - "cumulative_gap": 12364.824, - "expense": 3183.6240000000003, - "gap": 3183.6240000000003, - "income": 0.0 + "asset": 105102262, + "cumulative_gap": 123648240, + "expense": 31836240, + "gap": 31836240, + "income": 0 }, { "age": 64, - "asset": 7546.4002853125, - "cumulative_gap": 15612.120480000001, - "expense": 3247.2964800000004, - "gap": 3247.2964800000004, - "income": 0.0 + "asset": 75464003, + "cumulative_gap": 156121205, + "expense": 32472965, + "gap": 32472965, + "income": 0 }, { "age": 65, - "asset": 4428.076919471874, - "cumulative_gap": 18924.3628896, - "expense": 3312.2424096000004, - "gap": 3312.2424096000004, - "income": 0.0 + "asset": 44280769, + "cumulative_gap": 189243629, + "expense": 33122424, + "gap": 33122424, + "income": 0 }, { "age": 66, - "asset": 1149.30954516803, - "cumulative_gap": 22302.850147392, - "expense": 3378.4872577920005, - "gap": 3378.4872577920005, - "income": 0.0 + "asset": 11493095, + "cumulative_gap": 223028501, + "expense": 33784873, + "gap": 33784873, + "income": 0 }, { "age": 67, - "asset": -2296.0530440026896, - "cumulative_gap": 25748.90715033984, - "expense": 3446.0570029478404, - "gap": 3446.0570029478404, - "income": 0.0 + "asset": -22960530, + "cumulative_gap": 257489072, + "expense": 34460570, + "gap": 34460570, + "income": 0 }, { "age": 68, - "asset": -5914.373348359046, - "cumulative_gap": 29263.885293346637, - "expense": 3514.9781430067974, - "gap": 3514.9781430067974, - "income": 0.0 + "asset": -59143733, + "cumulative_gap": 292638853, + "expense": 35149781, + "gap": 35149781, + "income": 0 }, { "age": 69, - "asset": -9712.23203610682, - "cumulative_gap": 32849.16299921357, - "expense": 3585.2777058669335, - "gap": 3585.2777058669335, - "income": 0.0 + "asset": -97122320, + "cumulative_gap": 328491630, + "expense": 35852777, + "gap": 35852777, + "income": 0 }, { "age": 70, - "asset": -13696.435034232967, - "cumulative_gap": 36506.14625919784, - "expense": 3656.983259984272, - "gap": 3656.983259984272, - "income": 0.0 + "asset": -136964350, + "cumulative_gap": 365061463, + "expense": 36569833, + "gap": 36569833, + "income": 0 }, { "age": 71, - "asset": -17874.02084304376, - "cumulative_gap": 40236.2691843818, - "expense": 3730.1229251839577, - "gap": 3730.1229251839577, - "income": 0.0 + "asset": -178740208, + "cumulative_gap": 402362692, + "expense": 37301229, + "gap": 37301229, + "income": 0 }, { "age": 72, - "asset": -22252.26808127455, - "cumulative_gap": 44040.994568069436, - "expense": 3804.725383687637, - "gap": 3804.725383687637, - "income": 0.0 + "asset": -222522681, + "cumulative_gap": 440409946, + "expense": 38047254, + "gap": 38047254, + "income": 0 }, { "age": 73, - "asset": -26838.703268911053, - "cumulative_gap": 47921.814459430825, - "expense": 3880.81989136139, - "gap": 3880.81989136139, - "income": 0.0 + "asset": -268387033, + "cumulative_gap": 479218145, + "expense": 38808199, + "gap": 38808199, + "income": 0 }, { "age": 74, - "asset": -31641.108855080616, - "cumulative_gap": 51880.250748619444, - "expense": 3958.436289188618, - "gap": 3958.436289188618, - "income": 0.0 + "asset": -316411089, + "cumulative_gap": 518802507, + "expense": 39584363, + "gap": 39584363, + "income": 0 }, { "age": 75, - "asset": -36667.53149859732, - "cumulative_gap": 55917.85576359183, - "expense": 4037.6050149723906, - "gap": 4037.6050149723906, - "income": 0.0 + "asset": -366675315, + "cumulative_gap": 559178558, + "expense": 40376050, + "gap": 40376050, + "income": 0 }, { "age": 76, - "asset": -41926.2906089768, - "cumulative_gap": 60036.21287886367, - "expense": 4118.357115271839, - "gap": 4118.357115271839, - "income": 0.0 + "asset": -419262906, + "cumulative_gap": 600362129, + "expense": 41183571, + "gap": 41183571, + "income": 0 }, { "age": 77, - "asset": -47425.987155976094, - "cumulative_gap": 64236.937136440945, - "expense": 4200.724257577275, - "gap": 4200.724257577275, - "income": 0.0 + "asset": -474259872, + "cumulative_gap": 642369371, + "expense": 42007243, + "gap": 42007243, + "income": 0 }, { "age": 78, - "asset": -53175.51275595997, - "cumulative_gap": 68521.67587916976, - "expense": 4284.73874272882, - "gap": 4284.73874272882, - "income": 0.0 + "asset": -531755128, + "cumulative_gap": 685216759, + "expense": 42847387, + "gap": 42847387, + "income": 0 }, { "age": 79, - "asset": -59184.05904364945, - "cumulative_gap": 72892.10939675316, - "expense": 4370.433517583397, - "gap": 4370.433517583397, - "income": 0.0 + "asset": -591840590, + "cumulative_gap": 728921094, + "expense": 43704335, + "gap": 43704335, + "income": 0 }, { "age": 80, - "asset": -65461.12733806984, - "cumulative_gap": 77349.95158468823, - "expense": 4457.842187935064, - "gap": 4457.842187935064, - "income": 0.0 + "asset": -654611273, + "cumulative_gap": 773499516, + "expense": 44578422, + "gap": 44578422, + "income": 0 }, { "age": 81, - "asset": -72016.53861178506, - "cumulative_gap": 81896.95061638199, - "expense": 4546.999031693766, - "gap": 4546.999031693766, - "income": 0.0 + "asset": -720165386, + "cumulative_gap": 818969506, + "expense": 45469990, + "gap": 45469990, + "income": 0 }, { "age": 82, - "asset": -78860.44377278318, - "cumulative_gap": 86534.88962870963, - "expense": 4637.939012327641, - "gap": 4637.939012327641, - "income": 0.0 + "asset": -788604438, + "cumulative_gap": 865348896, + "expense": 46379390, + "gap": 46379390, + "income": 0 }, { "age": 83, - "asset": -86003.33426866416, - "cumulative_gap": 91265.58742128382, - "expense": 4730.697792574194, - "gap": 4730.697792574194, - "income": 0.0 + "asset": -860033343, + "cumulative_gap": 912655874, + "expense": 47306978, + "gap": 47306978, + "income": 0 }, { "age": 84, - "asset": -93456.05302307551, - "cumulative_gap": 96090.8991697095, - "expense": 4825.311748425678, - "gap": 4825.311748425678, - "income": 0.0 + "asset": -934560530, + "cumulative_gap": 960908992, + "expense": 48253117, + "gap": 48253117, + "income": 0 }, { "age": 85, - "asset": -101229.80571464622, - "cumulative_gap": 101012.7171531037, - "expense": 4921.817983394192, - "gap": 4921.817983394192, - "income": 0.0 + "asset": -1012298057, + "cumulative_gap": 1010127172, + "expense": 49218180, + "gap": 49218180, + "income": 0 }, { "age": 86, - "asset": -109336.17240898164, - "cumulative_gap": 106032.97149616577, - "expense": 5020.254343062076, - "gap": 5020.254343062076, - "income": 0.0 + "asset": -1093361724, + "cumulative_gap": 1060329715, + "expense": 50202543, + "gap": 50202543, + "income": 0 }, { "age": 87, - "asset": -117787.11955460503, - "cumulative_gap": 111153.63092608908, - "expense": 5120.6594299233175, - "gap": 5120.6594299233175, - "income": 0.0 + "asset": -1177871196, + "cumulative_gap": 1111536309, + "expense": 51206594, + "gap": 51206594, + "income": 0 }, { "age": 88, - "asset": -126595.0123540642, - "cumulative_gap": 116376.70354461086, - "expense": 5223.072618521784, - "gap": 5223.072618521784, - "income": 0.0 + "asset": -1265950124, + "cumulative_gap": 1163767035, + "expense": 52230726, + "gap": 52230726, + "income": 0 }, { "age": 89, - "asset": -135772.62752176358, - "cumulative_gap": 121704.23761550308, - "expense": 5327.5340708922195, - "gap": 5327.5340708922195, - "income": 0.0 + "asset": -1357726275, + "cumulative_gap": 1217042376, + "expense": 53275341, + "gap": 53275341, + "income": 0 }, { "age": 90, - "asset": -145333.16644043548, - "cumulative_gap": 127138.32236781315, - "expense": 5434.084752310064, - "gap": 5434.084752310064, - "income": 0.0 + "asset": -1453331664, + "cumulative_gap": 1271383224, + "expense": 54340848, + "gap": 54340848, + "income": 0 }, { "age": 91, - "asset": -155290.2687285279, - "cumulative_gap": 132681.0888151694, - "expense": 5542.766447356265, - "gap": 5542.766447356265, - "income": 0.0 + "asset": -1552902687, + "cumulative_gap": 1326810888, + "expense": 55427664, + "gap": 55427664, + "income": 0 }, { "age": 92, - "asset": -165658.0262311607, - "cumulative_gap": 138334.7105914728, - "expense": 5653.621776303391, - "gap": 5653.621776303391, - "income": 0.0 + "asset": -1656580262, + "cumulative_gap": 1383347106, + "expense": 56536218, + "gap": 56536218, + "income": 0 }, { "age": 93, - "asset": -176450.99744768802, - "cumulative_gap": 144101.40480330226, - "expense": 5766.694211829459, - "gap": 5766.694211829459, - "income": 0.0 + "asset": -1764509974, + "cumulative_gap": 1441014048, + "expense": 57666942, + "gap": 57666942, + "income": 0 }, { "age": 94, - "asset": -187684.222409303, - "cumulative_gap": 149983.43289936832, - "expense": 5882.028096066048, - "gap": 5882.028096066048, - "income": 0.0 + "asset": -1876842224, + "cumulative_gap": 1499834329, + "expense": 58820281, + "gap": 58820281, + "income": 0 }, { "age": 95, - "asset": -199373.23802053015, - "cumulative_gap": 155983.1015573557, - "expense": 5999.668657987369, - "gap": 5999.668657987369, - "income": 0.0 + "asset": -1993732380, + "cumulative_gap": 1559831016, + "expense": 59996687, + "gap": 59996687, + "income": 0 }, { "age": 96, - "asset": -211534.09387887304, - "cumulative_gap": 162102.7635885028, - "expense": 6119.662031147117, - "gap": 6119.662031147117, - "income": 0.0 + "asset": -2115340939, + "cumulative_gap": 1621027636, + "expense": 61196620, + "gap": 61196620, + "income": 0 }, { "age": 97, - "asset": -224183.36858732076, - "cumulative_gap": 168344.81886027285, - "expense": 6242.055271770059, - "gap": 6242.055271770059, - "income": 0.0 + "asset": -2241833686, + "cumulative_gap": 1683448189, + "expense": 62420553, + "gap": 62420553, + "income": 0 }, { "age": 98, - "asset": -237338.18657486353, - "cumulative_gap": 174711.71523747832, - "expense": 6366.89637720546, - "gap": 6366.89637720546, - "income": 0.0 + "asset": -2373381866, + "cumulative_gap": 1747117152, + "expense": 63668964, + "gap": 63668964, + "income": 0 }, { "age": 99, - "asset": -251016.23544063108, - "cumulative_gap": 181205.9495422279, - "expense": 6494.23430474957, - "gap": 6494.23430474957, - "income": 0.0 + "asset": -2510162354, + "cumulative_gap": 1812059495, + "expense": 64942343, + "gap": 64942343, + "income": 0 }, { "age": 100, - "asset": -265235.7838377421, - "cumulative_gap": 187830.06853307245, - "expense": 6624.118990844561, - "gap": 6624.118990844561, - "income": 0.0 + "asset": -2652357838, + "cumulative_gap": 1878300685, + "expense": 66241190, + "gap": 66241190, + "income": 0 } ], - "total_received": 8531.25 + "total_received": 85312500 }, { "break_even_age": 64, @@ -1018,334 +1018,334 @@ "timeline": [ { "age": 60, - "asset": 14826.25, - "cumulative_gap": 2388.0, - "expense": 3000.0, - "gap": 2388.0, - "income": 612.0000000000001 + "asset": 148262500, + "cumulative_gap": 23880000, + "expense": 30000000, + "gap": 23880000, + "income": 6120000 }, { "age": 61, - "asset": 12811.397500000001, - "cumulative_gap": 4836.0, - "expense": 3060.0, - "gap": 2448.0, - "income": 612.0000000000001 + "asset": 128113975, + "cumulative_gap": 48360000, + "expense": 30600000, + "gap": 24480000, + "income": 6120000 }, { "age": 62, - "asset": 10674.299425000001, - "cumulative_gap": 7345.200000000001, - "expense": 3121.2000000000003, - "gap": 2509.2000000000003, - "income": 612.0000000000001 + "asset": 106742994, + "cumulative_gap": 73452000, + "expense": 31212000, + "gap": 25092000, + "income": 6120000 }, { "age": 63, - "asset": 8410.052407750001, - "cumulative_gap": 9916.824, - "expense": 3183.6240000000003, - "gap": 2571.6240000000003, - "income": 612.0000000000001 + "asset": 84100524, + "cumulative_gap": 99168240, + "expense": 31836240, + "gap": 25716240, + "income": 6120000 }, { "age": 64, - "asset": 6013.581259982501, - "cumulative_gap": 12552.120480000001, - "expense": 3247.2964800000004, - "gap": 2635.2964800000004, - "income": 612.0000000000001 + "asset": 60135813, + "cumulative_gap": 125521205, + "expense": 32472965, + "gap": 26352965, + "income": 6120000 }, { "age": 65, - "asset": 3479.633323381976, - "cumulative_gap": 15252.362889600001, - "expense": 3312.2424096000004, - "gap": 2700.2424096000004, - "income": 612.0000000000001 + "asset": 34796333, + "cumulative_gap": 152523629, + "expense": 33122424, + "gap": 27002424, + "income": 6120000 }, { "age": 66, - "asset": 802.7726411954349, - "cumulative_gap": 18018.850147392, - "expense": 3378.4872577920005, - "gap": 2766.4872577920005, - "income": 612.0000000000001 + "asset": 8027726, + "cumulative_gap": 180188501, + "expense": 33784873, + "gap": 27664873, + "income": 6120000 }, { "age": 67, - "asset": -2022.6260550944626, - "cumulative_gap": 20852.90715033984, - "expense": 3446.0570029478404, - "gap": 2834.0570029478404, - "income": 612.0000000000001 + "asset": -20226261, + "cumulative_gap": 208529072, + "expense": 34460570, + "gap": 28340570, + "income": 6120000 }, { "age": 68, - "asset": -5002.383549783573, - "cumulative_gap": 23755.885293346637, - "expense": 3514.9781430067974, - "gap": 2902.9781430067974, - "income": 612.0000000000001 + "asset": -50023835, + "cumulative_gap": 237558853, + "expense": 35149781, + "gap": 29029781, + "income": 6120000 }, { "age": 69, - "asset": -8142.52254357408, - "cumulative_gap": 26729.16299921357, - "expense": 3585.2777058669335, - "gap": 2973.2777058669335, - "income": 612.0000000000001 + "asset": -81425225, + "cumulative_gap": 267291630, + "expense": 35852777, + "gap": 29732777, + "income": 6120000 }, { "age": 70, - "asset": -11449.274256924245, - "cumulative_gap": 29774.14625919784, - "expense": 3656.983259984272, - "gap": 3044.983259984272, - "income": 612.0000000000001 + "asset": -114492743, + "cumulative_gap": 297741463, + "expense": 36569833, + "gap": 30449833, + "income": 6120000 }, { "age": 71, - "asset": -14929.085242415773, - "cumulative_gap": 32892.2691843818, - "expense": 3730.1229251839577, - "gap": 3118.1229251839577, - "income": 612.0000000000001 + "asset": -149290852, + "cumulative_gap": 328922692, + "expense": 37301229, + "gap": 31181229, + "income": 6120000 }, { "age": 72, - "asset": -18588.624412627723, - "cumulative_gap": 36084.994568069436, - "expense": 3804.725383687637, - "gap": 3192.725383687637, - "income": 612.0000000000001 + "asset": -185886244, + "cumulative_gap": 360849946, + "expense": 38047254, + "gap": 31927254, + "income": 6120000 }, { "age": 73, - "asset": -22434.790290204823, - "cumulative_gap": 39353.814459430825, - "expense": 3880.81989136139, - "gap": 3268.81989136139, - "income": 612.0000000000001 + "asset": -224347903, + "cumulative_gap": 393538145, + "expense": 38808199, + "gap": 32688199, + "income": 6120000 }, { "age": 74, - "asset": -26474.718487013197, - "cumulative_gap": 42700.250748619444, - "expense": 3958.436289188618, - "gap": 3346.436289188618, - "income": 612.0000000000001 + "asset": -264747185, + "cumulative_gap": 427002507, + "expense": 39584363, + "gap": 33464363, + "income": 6120000 }, { "age": 75, - "asset": -30715.78941948787, - "cumulative_gap": 46125.85576359183, - "expense": 4037.6050149723906, - "gap": 3425.6050149723906, - "income": 612.0000000000001 + "asset": -307157894, + "cumulative_gap": 461258558, + "expense": 40376050, + "gap": 34256050, + "income": 6120000 }, { "age": 76, - "asset": -35165.636267494076, - "cumulative_gap": 49632.21287886367, - "expense": 4118.357115271839, - "gap": 3506.3571152718387, - "income": 612.0000000000001 + "asset": -351656363, + "cumulative_gap": 496322129, + "expense": 41183571, + "gap": 35063571, + "income": 6120000 }, { "age": 77, - "asset": -39832.15318424889, - "cumulative_gap": 53220.937136440945, - "expense": 4200.724257577275, - "gap": 3588.7242575772752, - "income": 612.0000000000001 + "asset": -398321532, + "cumulative_gap": 532209371, + "expense": 42007243, + "gap": 35887243, + "income": 6120000 }, { "age": 78, - "asset": -44723.50376508095, - "cumulative_gap": 56893.675879169765, - "expense": 4284.73874272882, - "gap": 3672.7387427288204, - "income": 612.0000000000001 + "asset": -447235038, + "cumulative_gap": 568936759, + "expense": 42847387, + "gap": 36727387, + "income": 6120000 }, { "age": 79, - "asset": -49848.12978304407, - "cumulative_gap": 60652.10939675316, - "expense": 4370.433517583397, - "gap": 3758.4335175833967, - "income": 612.0000000000001 + "asset": -498481298, + "cumulative_gap": 606521094, + "expense": 43704335, + "gap": 37584335, + "income": 6120000 }, { "age": 80, - "asset": -55214.76019964629, - "cumulative_gap": 64497.95158468823, - "expense": 4457.842187935064, - "gap": 3845.8421879350644, - "income": 612.0000000000001 + "asset": -552147602, + "cumulative_gap": 644979516, + "expense": 44578422, + "gap": 38458422, + "income": 6120000 }, { "age": 81, - "asset": -60832.4204592088, - "cumulative_gap": 68432.95061638199, - "expense": 4546.999031693766, - "gap": 3934.9990316937656, - "income": 612.0000000000001 + "asset": -608324205, + "cumulative_gap": 684329506, + "expense": 45469990, + "gap": 39349990, + "income": 6120000 }, { "age": 82, - "asset": -66710.44207562965, - "cumulative_gap": 72458.88962870963, - "expense": 4637.939012327641, - "gap": 4025.9390123276407, - "income": 612.0000000000001 + "asset": -667104421, + "cumulative_gap": 724588896, + "expense": 46379390, + "gap": 40259390, + "income": 6120000 }, { "age": 83, - "asset": -72858.472520596, - "cumulative_gap": 76577.58742128382, - "expense": 4730.697792574194, - "gap": 4118.697792574194, - "income": 612.0000000000001 + "asset": -728584725, + "cumulative_gap": 765775874, + "expense": 47306978, + "gap": 41186978, + "income": 6120000 }, { "age": 84, - "asset": -79286.4854225653, - "cumulative_gap": 80790.8991697095, - "expense": 4825.311748425678, - "gap": 4213.311748425678, - "income": 612.0000000000001 + "asset": -792864854, + "cumulative_gap": 807908992, + "expense": 48253117, + "gap": 42133117, + "income": 6120000 }, { "age": 85, - "asset": -86004.7910861207, - "cumulative_gap": 85100.7171531037, - "expense": 4921.817983394192, - "gap": 4309.817983394192, - "income": 612.0000000000001 + "asset": -860047911, + "cumulative_gap": 851007172, + "expense": 49218180, + "gap": 43098180, + "income": 6120000 }, { "age": 86, - "asset": -93024.04734160035, - "cumulative_gap": 89508.97149616577, - "expense": 5020.254343062076, - "gap": 4408.254343062076, - "income": 612.0000000000001 + "asset": -930240473, + "cumulative_gap": 895089715, + "expense": 50202543, + "gap": 44082543, + "income": 6120000 }, { "age": 87, - "asset": -100355.2707352023, - "cumulative_gap": 94017.63092608908, - "expense": 5120.6594299233175, - "gap": 4508.6594299233175, - "income": 612.0000000000001 + "asset": -1003552707, + "cumulative_gap": 940176309, + "expense": 51206594, + "gap": 45086594, + "income": 6120000 }, { "age": 88, - "asset": -108009.84807007939, - "cumulative_gap": 98628.70354461086, - "expense": 5223.072618521784, - "gap": 4611.072618521784, - "income": 612.0000000000001 + "asset": -1080098481, + "cumulative_gap": 986287035, + "expense": 52230726, + "gap": 46110726, + "income": 6120000 }, { "age": 89, - "asset": -115999.5483092592, - "cumulative_gap": 103344.23761550308, - "expense": 5327.5340708922195, - "gap": 4715.5340708922195, - "income": 612.0000000000001 + "asset": -1159995483, + "cumulative_gap": 1033442376, + "expense": 53275341, + "gap": 47155341, + "income": 6120000 }, { "age": 90, - "asset": -124336.53485155596, - "cumulative_gap": 108166.32236781315, - "expense": 5434.084752310064, - "gap": 4822.084752310064, - "income": 612.0000000000001 + "asset": -1243365349, + "cumulative_gap": 1081663224, + "expense": 54340848, + "gap": 48220848, + "income": 6120000 }, { "age": 91, - "asset": -133033.37819198202, - "cumulative_gap": 113097.08881516941, - "expense": 5542.766447356265, - "gap": 4930.766447356265, - "income": 612.0000000000001 + "asset": -1330333782, + "cumulative_gap": 1130970888, + "expense": 55427664, + "gap": 49307664, + "income": 6120000 }, { "age": 92, - "asset": -142103.06897851842, - "cumulative_gap": 118138.7105914728, - "expense": 5653.621776303391, - "gap": 5041.621776303391, - "income": 612.0000000000001 + "asset": -1421030690, + "cumulative_gap": 1181387106, + "expense": 56536218, + "gap": 50416218, + "income": 6120000 }, { "age": 93, - "asset": -151559.0314774665, - "cumulative_gap": 123293.40480330226, - "expense": 5766.694211829459, - "gap": 5154.694211829459, - "income": 612.0000000000001 + "asset": -1515590315, + "cumulative_gap": 1232934048, + "expense": 57666942, + "gap": 51546942, + "income": 6120000 }, { "age": 94, - "asset": -161415.13745997482, - "cumulative_gap": 128563.4328993683, - "expense": 5882.028096066048, - "gap": 5270.028096066048, - "income": 612.0000000000001 + "asset": -1614151375, + "cumulative_gap": 1285634329, + "expense": 58820281, + "gap": 52700281, + "income": 6120000 }, { "age": 95, - "asset": -171685.7205227221, - "cumulative_gap": 133951.10155735567, - "expense": 5999.668657987369, - "gap": 5387.668657987369, - "income": 612.0000000000001 + "asset": -1716857205, + "cumulative_gap": 1339511016, + "expense": 59996687, + "gap": 53876687, + "income": 6120000 }, { "age": 96, - "asset": -182385.5908561308, - "cumulative_gap": 139458.76358850277, - "expense": 6119.662031147117, - "gap": 5507.662031147117, - "income": 612.0000000000001 + "asset": -1823855909, + "cumulative_gap": 1394587636, + "expense": 61196620, + "gap": 55076620, + "income": 6120000 }, { "age": 97, - "asset": -193530.05047389623, - "cumulative_gap": 145088.81886027282, - "expense": 6242.055271770059, - "gap": 5630.055271770059, - "income": 612.0000000000001 + "asset": -1935300505, + "cumulative_gap": 1450888189, + "expense": 62420553, + "gap": 56300553, + "income": 6120000 }, { "age": 98, - "asset": -205134.90891803626, - "cumulative_gap": 150843.7152374783, - "expense": 6366.89637720546, - "gap": 5754.89637720546, - "income": 612.0000000000001 + "asset": -2051349089, + "cumulative_gap": 1508437152, + "expense": 63668964, + "gap": 57548964, + "income": 6120000 }, { "age": 99, - "asset": -217216.499454099, - "cumulative_gap": 156725.94954222787, - "expense": 6494.23430474957, - "gap": 5882.23430474957, - "income": 612.0000000000001 + "asset": -2172164995, + "cumulative_gap": 1567259495, + "expense": 64942343, + "gap": 58822343, + "income": 6120000 }, { "age": 100, - "asset": -229791.69577161403, - "cumulative_gap": 162738.06853307242, - "expense": 6624.118990844561, - "gap": 6012.118990844561, - "income": 612.0000000000001 + "asset": -2297916958, + "cumulative_gap": 1627380685, + "expense": 66241190, + "gap": 60121190, + "income": 6120000 } ], - "total_received": 29918.25 + "total_received": 299182500 } ] }, diff --git a/fastapi/tests/golden/scenarios_with_deduction_years.json b/fastapi/tests/golden/scenarios_with_deduction_years.json index e3cab68..a6cab3a 100644 --- a/fastapi/tests/golden/scenarios_with_deduction_years.json +++ b/fastapi/tests/golden/scenarios_with_deduction_years.json @@ -10,334 +10,334 @@ "timeline": [ { "age": 60, - "asset": 10000.0, - "cumulative_gap": 1200.0, - "expense": 3000.0, - "gap": 1200.0, - "income": 1800.0 + "asset": 100000000, + "cumulative_gap": 12000000, + "expense": 30000000, + "gap": 12000000, + "income": 18000000 }, { "age": 61, - "asset": 9064.0, - "cumulative_gap": 2460.0, - "expense": 3060.0, - "gap": 1260.0, - "income": 1800.0 + "asset": 90640000, + "cumulative_gap": 24600000, + "expense": 30600000, + "gap": 12600000, + "income": 18000000 }, { "age": 62, - "asset": 8038.12, - "cumulative_gap": 3781.2000000000003, - "expense": 3121.2000000000003, - "gap": 1321.2000000000003, - "income": 1800.0 + "asset": 80381200, + "cumulative_gap": 37812000, + "expense": 31212000, + "gap": 13212000, + "income": 18000000 }, { "age": 63, - "asset": 6918.4276, - "cumulative_gap": 5164.8240000000005, - "expense": 3183.6240000000003, - "gap": 1383.6240000000003, - "income": 1800.0 + "asset": 69184276, + "cumulative_gap": 51648240, + "expense": 31836240, + "gap": 13836240, + "income": 18000000 }, { "age": 64, - "asset": 5700.847707999999, - "cumulative_gap": 6612.120480000001, - "expense": 3247.2964800000004, - "gap": 1447.2964800000004, - "income": 1800.0 + "asset": 57008477, + "cumulative_gap": 66121205, + "expense": 32472965, + "gap": 14472965, + "income": 18000000 }, { "age": 65, - "asset": 4381.157764839999, - "cumulative_gap": 8124.362889600002, - "expense": 3312.2424096000004, - "gap": 1512.2424096000004, - "income": 1800.0 + "asset": 43811578, + "cumulative_gap": 81243629, + "expense": 33122424, + "gap": 15122424, + "income": 18000000 }, { "age": 66, - "asset": 2954.9828158971986, - "cumulative_gap": 9702.850147392002, - "expense": 3378.4872577920005, - "gap": 1578.4872577920005, - "income": 1800.0 + "asset": 29549828, + "cumulative_gap": 97028501, + "expense": 33784873, + "gap": 15784873, + "income": 18000000 }, { "age": 67, - "asset": 1417.7904248483542, - "cumulative_gap": 11348.907150339843, - "expense": 3446.0570029478404, - "gap": 1646.0570029478404, - "income": 1800.0 + "asset": 14177904, + "cumulative_gap": 113489072, + "expense": 34460570, + "gap": 16460570, + "income": 18000000 }, { "age": 68, - "asset": -235.1145754424708, - "cumulative_gap": 13063.88529334664, - "expense": 3514.9781430067974, - "gap": 1714.9781430067974, - "income": 1800.0 + "asset": -2351146, + "cumulative_gap": 130638853, + "expense": 35149781, + "gap": 17149781, + "income": 18000000 }, { "age": 69, - "asset": -2008.5955000027463, - "cumulative_gap": 14849.162999213575, - "expense": 3585.2777058669335, - "gap": 1785.2777058669335, - "income": 1800.0 + "asset": -20085955, + "cumulative_gap": 148491630, + "expense": 35852777, + "gap": 17852777, + "income": 18000000 }, { "age": 70, - "asset": -3907.6894020457703, - "cumulative_gap": 16706.14625919785, - "expense": 3656.983259984272, - "gap": 1856.983259984272, - "income": 1800.0 + "asset": -39076894, + "cumulative_gap": 167061463, + "expense": 36569833, + "gap": 18569833, + "income": 18000000 }, { "age": 71, - "asset": -5937.612841890944, - "cumulative_gap": 18636.269184381807, - "expense": 3730.1229251839577, - "gap": 1930.1229251839577, - "income": 1800.0 + "asset": -59376128, + "cumulative_gap": 186362692, + "expense": 37301229, + "gap": 19301229, + "income": 18000000 }, { "age": 72, - "asset": -8103.767840087149, - "cumulative_gap": 20640.994568069444, - "expense": 3804.725383687637, - "gap": 2004.725383687637, - "income": 1800.0 + "asset": -81037678, + "cumulative_gap": 206409946, + "expense": 38047254, + "gap": 20047254, + "income": 18000000 }, { "age": 73, - "asset": -10411.748020488028, - "cumulative_gap": 22721.814459430832, - "expense": 3880.81989136139, - "gap": 2080.81989136139, - "income": 1800.0 + "asset": -104117480, + "cumulative_gap": 227218145, + "expense": 38808199, + "gap": 20808199, + "income": 18000000 }, { "age": 74, - "asset": -12867.344949204902, - "cumulative_gap": 24880.25074861945, - "expense": 3958.436289188618, - "gap": 2158.436289188618, - "income": 1800.0 + "asset": -128673449, + "cumulative_gap": 248802507, + "expense": 39584363, + "gap": 21584363, + "income": 18000000 }, { "age": 75, - "asset": -15476.554675545325, - "cumulative_gap": 27117.85576359184, - "expense": 4037.6050149723906, - "gap": 2237.6050149723906, - "income": 1800.0 + "asset": -154765547, + "cumulative_gap": 271178558, + "expense": 40376050, + "gap": 22376050, + "income": 18000000 }, { "age": 76, - "asset": -18245.584481233247, - "cumulative_gap": 29436.21287886368, - "expense": 4118.357115271839, - "gap": 2318.3571152718387, - "income": 1800.0 + "asset": -182455845, + "cumulative_gap": 294362129, + "expense": 41183571, + "gap": 23183571, + "income": 18000000 }, { "age": 77, - "asset": -21180.85984440024, - "cumulative_gap": 31836.937136440956, - "expense": 4200.724257577275, - "gap": 2400.7242575772752, - "income": 1800.0 + "asset": -211808598, + "cumulative_gap": 318369371, + "expense": 42007243, + "gap": 24007243, + "income": 18000000 }, { "age": 78, - "asset": -24289.03162503684, - "cumulative_gap": 34321.67587916978, - "expense": 4284.73874272882, - "gap": 2484.7387427288204, - "income": 1800.0 + "asset": -242890316, + "cumulative_gap": 343216759, + "expense": 42847387, + "gap": 24847387, + "income": 18000000 }, { "age": 79, - "asset": -27576.983478798633, - "cumulative_gap": 36892.10939675318, - "expense": 4370.433517583397, - "gap": 2570.4335175833967, - "income": 1800.0 + "asset": -275769835, + "cumulative_gap": 368921094, + "expense": 43704335, + "gap": 25704335, + "income": 18000000 }, { "age": 80, - "asset": -31051.839506273493, - "cumulative_gap": 39549.95158468824, - "expense": 4457.842187935064, - "gap": 2657.8421879350644, - "income": 1800.0 + "asset": -310518395, + "cumulative_gap": 395499516, + "expense": 44578422, + "gap": 26578422, + "income": 18000000 }, { "age": 81, - "asset": -34720.972145034815, - "cumulative_gap": 42296.950616382004, - "expense": 4546.999031693766, - "gap": 2746.9990316937656, - "income": 1800.0 + "asset": -347209721, + "cumulative_gap": 422969506, + "expense": 45469990, + "gap": 27469990, + "income": 18000000 }, { "age": 82, - "asset": -38592.010312030434, - "cumulative_gap": 45134.88962870964, - "expense": 4637.939012327641, - "gap": 2837.9390123276407, - "income": 1800.0 + "asset": -385920103, + "cumulative_gap": 451348896, + "expense": 46379390, + "gap": 28379390, + "income": 18000000 }, { "age": 83, - "asset": -42672.847804088815, - "cumulative_gap": 48065.58742128384, - "expense": 4730.697792574194, - "gap": 2930.697792574194, - "income": 1800.0 + "asset": -426728478, + "cumulative_gap": 480655874, + "expense": 47306978, + "gap": 29306978, + "income": 18000000 }, { "age": 84, - "asset": -46971.6519645629, - "cumulative_gap": 51090.89916970952, - "expense": 4825.311748425678, - "gap": 3025.311748425678, - "income": 1800.0 + "asset": -469716520, + "cumulative_gap": 510908992, + "expense": 48253117, + "gap": 30253117, + "income": 18000000 }, { "age": 85, - "asset": -51496.87262437824, - "cumulative_gap": 54212.71715310371, - "expense": 4921.817983394192, - "gap": 3121.817983394192, - "income": 1800.0 + "asset": -514968726, + "cumulative_gap": 542127172, + "expense": 49218180, + "gap": 31218180, + "income": 18000000 }, { "age": 86, - "asset": -56257.2513260056, - "cumulative_gap": 57432.97149616579, - "expense": 5020.254343062076, - "gap": 3220.2543430620763, - "income": 1800.0 + "asset": -562572513, + "cumulative_gap": 574329715, + "expense": 50202543, + "gap": 32202543, + "income": 18000000 }, { "age": 87, - "asset": -61261.83083913971, - "cumulative_gap": 60753.63092608911, - "expense": 5120.6594299233175, - "gap": 3320.6594299233175, - "income": 1800.0 + "asset": -612618308, + "cumulative_gap": 607536309, + "expense": 51206594, + "gap": 33206594, + "income": 18000000 }, { "age": 88, - "asset": -66519.96497713492, - "cumulative_gap": 64176.70354461089, - "expense": 5223.072618521784, - "gap": 3423.0726185217836, - "income": 1800.0 + "asset": -665199650, + "cumulative_gap": 641767035, + "expense": 52230726, + "gap": 34230726, + "income": 18000000 }, { "age": 89, - "asset": -72041.3287235264, - "cumulative_gap": 67704.23761550311, - "expense": 5327.5340708922195, - "gap": 3527.5340708922195, - "income": 1800.0 + "asset": -720413287, + "cumulative_gap": 677042376, + "expense": 53275341, + "gap": 35275341, + "income": 18000000 }, { "age": 90, - "asset": -77835.92867825118, - "cumulative_gap": 71338.32236781318, - "expense": 5434.084752310064, - "gap": 3634.084752310064, - "income": 1800.0 + "asset": -778359287, + "cumulative_gap": 713383224, + "expense": 54340848, + "gap": 36340848, + "income": 18000000 }, { "age": 91, - "asset": -83914.11383347808, - "cumulative_gap": 75081.08881516944, - "expense": 5542.766447356265, - "gap": 3742.7664473562654, - "income": 1800.0 + "asset": -839141138, + "cumulative_gap": 750810888, + "expense": 55427664, + "gap": 37427664, + "income": 18000000 }, { "age": 92, - "asset": -90286.58668925938, - "cumulative_gap": 78934.71059147283, - "expense": 5653.621776303391, - "gap": 3853.621776303391, - "income": 1800.0 + "asset": -902865867, + "cumulative_gap": 789347106, + "expense": 56536218, + "gap": 38536218, + "income": 18000000 }, { "age": 93, - "asset": -96964.41471952965, - "cumulative_gap": 82901.40480330228, - "expense": 5766.694211829459, - "gap": 3966.694211829459, - "income": 1800.0 + "asset": -969644147, + "cumulative_gap": 829014048, + "expense": 57666942, + "gap": 39666942, + "income": 18000000 }, { "age": 94, - "asset": -103959.04219929989, - "cumulative_gap": 86983.43289936833, - "expense": 5882.028096066048, - "gap": 4082.0280960660484, - "income": 1800.0 + "asset": -1039590422, + "cumulative_gap": 869834329, + "expense": 58820281, + "gap": 40820281, + "income": 18000000 }, { "age": 95, - "asset": -111282.30240422691, - "cumulative_gap": 91183.1015573557, - "expense": 5999.668657987369, - "gap": 4199.668657987369, - "income": 1800.0 + "asset": -1112823024, + "cumulative_gap": 911831016, + "expense": 59996687, + "gap": 41996687, + "income": 18000000 }, { "age": 96, - "asset": -118946.4301940807, - "cumulative_gap": 95502.76358850281, - "expense": 6119.662031147117, - "gap": 4319.662031147117, - "income": 1800.0 + "asset": -1189464302, + "cumulative_gap": 955027636, + "expense": 61196620, + "gap": 43196620, + "income": 18000000 }, { "age": 97, - "asset": -126964.07499198466, - "cumulative_gap": 99944.81886027288, - "expense": 6242.055271770059, - "gap": 4442.055271770059, - "income": 1800.0 + "asset": -1269640750, + "cumulative_gap": 999448189, + "expense": 62420553, + "gap": 44420553, + "income": 18000000 }, { "age": 98, - "asset": -135348.31417166736, - "cumulative_gap": 104511.71523747833, - "expense": 6366.89637720546, - "gap": 4566.89637720546, - "income": 1800.0 + "asset": -1353483142, + "cumulative_gap": 1045117152, + "expense": 63668964, + "gap": 45668964, + "income": 18000000 }, { "age": 99, - "asset": -144112.666865339, - "cumulative_gap": 109205.9495422279, - "expense": 6494.23430474957, - "gap": 4694.23430474957, - "income": 1800.0 + "asset": -1441126669, + "cumulative_gap": 1092059495, + "expense": 64942343, + "gap": 46942343, + "income": 18000000 }, { "age": 100, - "asset": -153271.10820519124, - "cumulative_gap": 114030.06853307247, - "expense": 6624.118990844561, - "gap": 4824.118990844561, - "income": 1800.0 + "asset": -1532711082, + "cumulative_gap": 1140300685, + "expense": 66241190, + "gap": 48241190, + "income": 18000000 } ], - "total_received": 73800.0 + "total_received": 738000000 }, { "break_even_age": 60, @@ -346,334 +346,334 @@ "timeline": [ { "age": 60, - "asset": 10000.0, - "cumulative_gap": 1650.0, - "expense": 3000.0, - "gap": 1650.0, - "income": 1350.0 + "asset": 100000000, + "cumulative_gap": 16500000, + "expense": 30000000, + "gap": 16500000, + "income": 13500000 }, { "age": 61, - "asset": 8600.5, - "cumulative_gap": 3360.0, - "expense": 3060.0, - "gap": 1710.0, - "income": 1350.0 + "asset": 86005000, + "cumulative_gap": 33600000, + "expense": 30600000, + "gap": 17100000, + "income": 13500000 }, { "age": 62, - "asset": 7097.215, - "cumulative_gap": 5131.200000000001, - "expense": 3121.2000000000003, - "gap": 1771.2000000000003, - "income": 1350.0 + "asset": 70972150, + "cumulative_gap": 51312000, + "expense": 31212000, + "gap": 17712000, + "income": 13500000 }, { "age": 63, - "asset": 5485.79545, - "cumulative_gap": 6964.8240000000005, - "expense": 3183.6240000000003, - "gap": 1833.6240000000003, - "income": 1350.0 + "asset": 54857954, + "cumulative_gap": 69648240, + "expense": 31836240, + "gap": 18336240, + "income": 13500000 }, { "age": 64, - "asset": 3761.7365934999993, - "cumulative_gap": 8862.120480000001, - "expense": 3247.2964800000004, - "gap": 1897.2964800000004, - "income": 1350.0 + "asset": 37617366, + "cumulative_gap": 88621205, + "expense": 32472965, + "gap": 18972965, + "income": 13500000 }, { "age": 65, - "asset": 1920.373316904999, - "cumulative_gap": 10824.362889600001, - "expense": 3312.2424096000004, - "gap": 1962.2424096000004, - "income": 1350.0 + "asset": 19203733, + "cumulative_gap": 108243629, + "expense": 33122424, + "gap": 19622424, + "income": 13500000 }, { "age": 66, - "asset": -43.125165475851475, - "cumulative_gap": 12852.850147392, - "expense": 3378.4872577920005, - "gap": 2028.4872577920005, - "income": 1350.0 + "asset": -431252, + "cumulative_gap": 128528501, + "expense": 33784873, + "gap": 20284873, + "income": 13500000 }, { "age": 67, - "asset": -2133.7607959658876, - "cumulative_gap": 14948.90715033984, - "expense": 3446.0570029478404, - "gap": 2096.0570029478404, - "income": 1350.0 + "asset": -21337608, + "cumulative_gap": 149489072, + "expense": 34460570, + "gap": 20960570, + "income": 13500000 }, { "age": 68, - "asset": -4356.712332881139, - "cumulative_gap": 17113.885293346637, - "expense": 3514.9781430067974, - "gap": 2164.9781430067974, - "income": 1350.0 + "asset": -43567123, + "cumulative_gap": 171138853, + "expense": 35149781, + "gap": 21649781, + "income": 13500000 }, { "age": 69, - "asset": -6717.341190164576, - "cumulative_gap": 19349.16299921357, - "expense": 3585.2777058669335, - "gap": 2235.2777058669335, - "income": 1350.0 + "asset": -67173412, + "cumulative_gap": 193491630, + "expense": 35852777, + "gap": 22352777, + "income": 13500000 }, { "age": 70, - "asset": -9221.197462912454, - "cumulative_gap": 21656.14625919784, - "expense": 3656.983259984272, - "gap": 2306.983259984272, - "income": 1350.0 + "asset": -92211975, + "cumulative_gap": 216561463, + "expense": 36569833, + "gap": 23069833, + "income": 13500000 }, { "age": 71, - "asset": -11874.026144583628, - "cumulative_gap": 24036.2691843818, - "expense": 3730.1229251839577, - "gap": 2380.1229251839577, - "income": 1350.0 + "asset": -118740261, + "cumulative_gap": 240362692, + "expense": 37301229, + "gap": 23801229, + "income": 13500000 }, { "age": 72, - "asset": -14681.773541860613, - "cumulative_gap": 26490.994568069436, - "expense": 3804.725383687637, - "gap": 2454.725383687637, - "income": 1350.0 + "asset": -146817735, + "cumulative_gap": 264909946, + "expense": 38047254, + "gap": 24547254, + "income": 13500000 }, { "age": 73, - "asset": -17650.593893314697, - "cumulative_gap": 29021.814459430825, - "expense": 3880.81989136139, - "gap": 2530.81989136139, - "income": 1350.0 + "asset": -176505939, + "cumulative_gap": 290218145, + "expense": 38808199, + "gap": 25308199, + "income": 13500000 }, { "age": 74, - "asset": -20786.85619821637, - "cumulative_gap": 31630.250748619444, - "expense": 3958.436289188618, - "gap": 2608.436289188618, - "income": 1350.0 + "asset": -207868562, + "cumulative_gap": 316302507, + "expense": 39584363, + "gap": 26084363, + "income": 13500000 }, { "age": 75, - "asset": -24097.15126202714, - "cumulative_gap": 34317.85576359183, - "expense": 4037.6050149723906, - "gap": 2687.6050149723906, - "income": 1350.0 + "asset": -240971513, + "cumulative_gap": 343178558, + "expense": 40376050, + "gap": 26876050, + "income": 13500000 }, { "age": 76, - "asset": -27588.298965309514, - "cumulative_gap": 37086.21287886367, - "expense": 4118.357115271839, - "gap": 2768.3571152718387, - "income": 1350.0 + "asset": -275882990, + "cumulative_gap": 370862129, + "expense": 41183571, + "gap": 27683571, + "income": 13500000 }, { "age": 77, - "asset": -31267.355762998795, - "cumulative_gap": 39936.937136440945, - "expense": 4200.724257577275, - "gap": 2850.7242575772752, - "income": 1350.0 + "asset": -312673558, + "cumulative_gap": 399369371, + "expense": 42007243, + "gap": 28507243, + "income": 13500000 }, { "age": 78, - "asset": -35141.62242119335, - "cumulative_gap": 42871.675879169765, - "expense": 4284.73874272882, - "gap": 2934.7387427288204, - "income": 1350.0 + "asset": -351416224, + "cumulative_gap": 428716759, + "expense": 42847387, + "gap": 29347387, + "income": 13500000 }, { "age": 79, - "asset": -39218.651998839836, - "cumulative_gap": 45892.10939675316, - "expense": 4370.433517583397, - "gap": 3020.4335175833967, - "income": 1350.0 + "asset": -392186520, + "cumulative_gap": 458921094, + "expense": 43704335, + "gap": 30204335, + "income": 13500000 }, { "age": 80, - "asset": -43506.258081915934, - "cumulative_gap": 48999.95158468823, - "expense": 4457.842187935064, - "gap": 3107.8421879350644, - "income": 1350.0 + "asset": -435062581, + "cumulative_gap": 489999516, + "expense": 44578422, + "gap": 31078422, + "income": 13500000 }, { "age": 81, - "asset": -48012.52327794653, - "cumulative_gap": 52196.95061638199, - "expense": 4546.999031693766, - "gap": 3196.9990316937656, - "income": 1350.0 + "asset": -480125233, + "cumulative_gap": 521969506, + "expense": 45469990, + "gap": 31969990, + "income": 13500000 }, { "age": 82, - "asset": -52745.8079789295, - "cumulative_gap": 55484.88962870963, - "expense": 4637.939012327641, - "gap": 3287.9390123276407, - "income": 1350.0 + "asset": -527458080, + "cumulative_gap": 554848896, + "expense": 46379390, + "gap": 32879390, + "income": 13500000 }, { "age": 83, - "asset": -57714.75940099486, - "cumulative_gap": 58865.587421283824, - "expense": 4730.697792574194, - "gap": 3380.697792574194, - "income": 1350.0 + "asset": -577147594, + "cumulative_gap": 588655874, + "expense": 47306978, + "gap": 33806978, + "income": 13500000 }, { "age": 84, - "asset": -62928.320909376125, - "cumulative_gap": 62340.899169709504, - "expense": 4825.311748425678, - "gap": 3475.311748425678, - "income": 1350.0 + "asset": -629283209, + "cumulative_gap": 623408992, + "expense": 48253117, + "gap": 34753117, + "income": 13500000 }, { "age": 85, - "asset": -68395.74163753586, - "cumulative_gap": 65912.7171531037, - "expense": 4921.817983394192, - "gap": 3571.817983394192, - "income": 1350.0 + "asset": -683957416, + "cumulative_gap": 659127172, + "expense": 49218180, + "gap": 35718180, + "income": 13500000 }, { "age": 86, - "asset": -74126.58640955796, - "cumulative_gap": 69582.97149616577, - "expense": 5020.254343062076, - "gap": 3670.2543430620763, - "income": 1350.0 + "asset": -741265864, + "cumulative_gap": 695829715, + "expense": 50202543, + "gap": 36702543, + "income": 13500000 }, { "age": 87, - "asset": -80130.74597519863, - "cumulative_gap": 73353.63092608908, - "expense": 5120.6594299233175, - "gap": 3770.6594299233175, - "income": 1350.0 + "asset": -801307460, + "cumulative_gap": 733536309, + "expense": 51206594, + "gap": 37706594, + "income": 13500000 }, { "age": 88, - "asset": -86418.44756727561, - "cumulative_gap": 77226.70354461086, - "expense": 5223.072618521784, - "gap": 3873.0726185217836, - "income": 1350.0 + "asset": -864184476, + "cumulative_gap": 772267035, + "expense": 52230726, + "gap": 38730726, + "income": 13500000 }, { "age": 89, - "asset": -93000.26579137132, - "cumulative_gap": 81204.23761550308, - "expense": 5327.5340708922195, - "gap": 3977.5340708922195, - "income": 1350.0 + "asset": -930002658, + "cumulative_gap": 812042376, + "expense": 53275341, + "gap": 39775341, + "income": 13500000 }, { "age": 90, - "asset": -99887.13385813145, - "cumulative_gap": 85288.32236781315, - "expense": 5434.084752310064, - "gap": 4084.084752310064, - "income": 1350.0 + "asset": -998871339, + "cumulative_gap": 852883224, + "expense": 54340848, + "gap": 40840848, + "income": 13500000 }, { "age": 91, - "asset": -107090.35516875476, - "cumulative_gap": 89481.08881516941, - "expense": 5542.766447356265, - "gap": 4192.766447356265, - "income": 1350.0 + "asset": -1070903552, + "cumulative_gap": 894810888, + "expense": 55427664, + "gap": 41927664, + "income": 13500000 }, { "age": 92, - "asset": -114621.61526459435, - "cumulative_gap": 93784.7105914728, - "expense": 5653.621776303391, - "gap": 4303.621776303391, - "income": 1350.0 + "asset": -1146216153, + "cumulative_gap": 937847106, + "expense": 56536218, + "gap": 43036218, + "income": 13500000 }, { "age": 93, - "asset": -122492.99415212468, - "cumulative_gap": 98201.40480330226, - "expense": 5766.694211829459, - "gap": 4416.694211829459, - "income": 1350.0 + "asset": -1224929942, + "cumulative_gap": 982014048, + "expense": 57666942, + "gap": 44166942, + "income": 13500000 }, { "age": 94, - "asset": -130716.97901487276, - "cumulative_gap": 102733.4328993683, - "expense": 5882.028096066048, - "gap": 4532.028096066048, - "income": 1350.0 + "asset": -1307169790, + "cumulative_gap": 1027334329, + "expense": 58820281, + "gap": 45320281, + "income": 13500000 }, { "age": 95, - "asset": -139306.47732426698, - "cumulative_gap": 107383.10155735567, - "expense": 5999.668657987369, - "gap": 4649.668657987369, - "income": 1350.0 + "asset": -1393064773, + "cumulative_gap": 1073831016, + "expense": 59996687, + "gap": 46496687, + "income": 13500000 }, { "age": 96, - "asset": -148274.83036172198, - "cumulative_gap": 112152.76358850278, - "expense": 6119.662031147117, - "gap": 4769.662031147117, - "income": 1350.0 + "asset": -1482748304, + "cumulative_gap": 1121527636, + "expense": 61196620, + "gap": 47696620, + "income": 13500000 }, { "age": 97, - "asset": -157635.82716465517, - "cumulative_gap": 117044.81886027285, - "expense": 6242.055271770059, - "gap": 4892.055271770059, - "income": 1350.0 + "asset": -1576358272, + "cumulative_gap": 1170448189, + "expense": 62420553, + "gap": 48920553, + "income": 13500000 }, { "age": 98, - "asset": -167403.71890951798, - "cumulative_gap": 122061.7152374783, - "expense": 6366.89637720546, - "gap": 5016.89637720546, - "income": 1350.0 + "asset": -1674037189, + "cumulative_gap": 1220617152, + "expense": 63668964, + "gap": 50168964, + "income": 13500000 }, { "age": 99, - "asset": -177593.23374532515, - "cumulative_gap": 127205.94954222787, - "expense": 6494.23430474957, - "gap": 5144.23430474957, - "income": 1350.0 + "asset": -1775932337, + "cumulative_gap": 1272059495, + "expense": 64942343, + "gap": 51442343, + "income": 13500000 }, { "age": 100, - "asset": -188219.59209157698, - "cumulative_gap": 132480.06853307242, - "expense": 6624.118990844561, - "gap": 5274.118990844561, - "income": 1350.0 + "asset": -1882195921, + "cumulative_gap": 1324800685, + "expense": 66241190, + "gap": 52741190, + "income": 13500000 } ], - "total_received": 55350.0 + "total_received": 553500000 }, { "break_even_age": 64, @@ -682,334 +682,334 @@ "timeline": [ { "age": 60, - "asset": 18531.25, - "cumulative_gap": 3000.0, - "expense": 3000.0, - "gap": 3000.0, - "income": 0.0 + "asset": 185312500, + "cumulative_gap": 30000000, + "expense": 30000000, + "gap": 30000000, + "income": 0 }, { "age": 61, - "asset": 15997.1875, - "cumulative_gap": 6060.0, - "expense": 3060.0, - "gap": 3060.0, - "income": 0.0 + "asset": 159971875, + "cumulative_gap": 60600000, + "expense": 30600000, + "gap": 30600000, + "income": 0 }, { "age": 62, - "asset": 13325.303125, - "cumulative_gap": 9181.2, - "expense": 3121.2000000000003, - "gap": 3121.2000000000003, - "income": 0.0 + "asset": 133253031, + "cumulative_gap": 91812000, + "expense": 31212000, + "gap": 31212000, + "income": 0 }, { "age": 63, - "asset": 10510.22621875, - "cumulative_gap": 12364.824, - "expense": 3183.6240000000003, - "gap": 3183.6240000000003, - "income": 0.0 + "asset": 105102262, + "cumulative_gap": 123648240, + "expense": 31836240, + "gap": 31836240, + "income": 0 }, { "age": 64, - "asset": 7546.4002853125, - "cumulative_gap": 15612.120480000001, - "expense": 3247.2964800000004, - "gap": 3247.2964800000004, - "income": 0.0 + "asset": 75464003, + "cumulative_gap": 156121205, + "expense": 32472965, + "gap": 32472965, + "income": 0 }, { "age": 65, - "asset": 4428.076919471874, - "cumulative_gap": 18924.3628896, - "expense": 3312.2424096000004, - "gap": 3312.2424096000004, - "income": 0.0 + "asset": 44280769, + "cumulative_gap": 189243629, + "expense": 33122424, + "gap": 33122424, + "income": 0 }, { "age": 66, - "asset": 1149.30954516803, - "cumulative_gap": 22302.850147392, - "expense": 3378.4872577920005, - "gap": 3378.4872577920005, - "income": 0.0 + "asset": 11493095, + "cumulative_gap": 223028501, + "expense": 33784873, + "gap": 33784873, + "income": 0 }, { "age": 67, - "asset": -2296.0530440026896, - "cumulative_gap": 25748.90715033984, - "expense": 3446.0570029478404, - "gap": 3446.0570029478404, - "income": 0.0 + "asset": -22960530, + "cumulative_gap": 257489072, + "expense": 34460570, + "gap": 34460570, + "income": 0 }, { "age": 68, - "asset": -5914.373348359046, - "cumulative_gap": 29263.885293346637, - "expense": 3514.9781430067974, - "gap": 3514.9781430067974, - "income": 0.0 + "asset": -59143733, + "cumulative_gap": 292638853, + "expense": 35149781, + "gap": 35149781, + "income": 0 }, { "age": 69, - "asset": -9712.23203610682, - "cumulative_gap": 32849.16299921357, - "expense": 3585.2777058669335, - "gap": 3585.2777058669335, - "income": 0.0 + "asset": -97122320, + "cumulative_gap": 328491630, + "expense": 35852777, + "gap": 35852777, + "income": 0 }, { "age": 70, - "asset": -13696.435034232967, - "cumulative_gap": 36506.14625919784, - "expense": 3656.983259984272, - "gap": 3656.983259984272, - "income": 0.0 + "asset": -136964350, + "cumulative_gap": 365061463, + "expense": 36569833, + "gap": 36569833, + "income": 0 }, { "age": 71, - "asset": -17874.02084304376, - "cumulative_gap": 40236.2691843818, - "expense": 3730.1229251839577, - "gap": 3730.1229251839577, - "income": 0.0 + "asset": -178740208, + "cumulative_gap": 402362692, + "expense": 37301229, + "gap": 37301229, + "income": 0 }, { "age": 72, - "asset": -22252.26808127455, - "cumulative_gap": 44040.994568069436, - "expense": 3804.725383687637, - "gap": 3804.725383687637, - "income": 0.0 + "asset": -222522681, + "cumulative_gap": 440409946, + "expense": 38047254, + "gap": 38047254, + "income": 0 }, { "age": 73, - "asset": -26838.703268911053, - "cumulative_gap": 47921.814459430825, - "expense": 3880.81989136139, - "gap": 3880.81989136139, - "income": 0.0 + "asset": -268387033, + "cumulative_gap": 479218145, + "expense": 38808199, + "gap": 38808199, + "income": 0 }, { "age": 74, - "asset": -31641.108855080616, - "cumulative_gap": 51880.250748619444, - "expense": 3958.436289188618, - "gap": 3958.436289188618, - "income": 0.0 + "asset": -316411089, + "cumulative_gap": 518802507, + "expense": 39584363, + "gap": 39584363, + "income": 0 }, { "age": 75, - "asset": -36667.53149859732, - "cumulative_gap": 55917.85576359183, - "expense": 4037.6050149723906, - "gap": 4037.6050149723906, - "income": 0.0 + "asset": -366675315, + "cumulative_gap": 559178558, + "expense": 40376050, + "gap": 40376050, + "income": 0 }, { "age": 76, - "asset": -41926.2906089768, - "cumulative_gap": 60036.21287886367, - "expense": 4118.357115271839, - "gap": 4118.357115271839, - "income": 0.0 + "asset": -419262906, + "cumulative_gap": 600362129, + "expense": 41183571, + "gap": 41183571, + "income": 0 }, { "age": 77, - "asset": -47425.987155976094, - "cumulative_gap": 64236.937136440945, - "expense": 4200.724257577275, - "gap": 4200.724257577275, - "income": 0.0 + "asset": -474259872, + "cumulative_gap": 642369371, + "expense": 42007243, + "gap": 42007243, + "income": 0 }, { "age": 78, - "asset": -53175.51275595997, - "cumulative_gap": 68521.67587916976, - "expense": 4284.73874272882, - "gap": 4284.73874272882, - "income": 0.0 + "asset": -531755128, + "cumulative_gap": 685216759, + "expense": 42847387, + "gap": 42847387, + "income": 0 }, { "age": 79, - "asset": -59184.05904364945, - "cumulative_gap": 72892.10939675316, - "expense": 4370.433517583397, - "gap": 4370.433517583397, - "income": 0.0 + "asset": -591840590, + "cumulative_gap": 728921094, + "expense": 43704335, + "gap": 43704335, + "income": 0 }, { "age": 80, - "asset": -65461.12733806984, - "cumulative_gap": 77349.95158468823, - "expense": 4457.842187935064, - "gap": 4457.842187935064, - "income": 0.0 + "asset": -654611273, + "cumulative_gap": 773499516, + "expense": 44578422, + "gap": 44578422, + "income": 0 }, { "age": 81, - "asset": -72016.53861178506, - "cumulative_gap": 81896.95061638199, - "expense": 4546.999031693766, - "gap": 4546.999031693766, - "income": 0.0 + "asset": -720165386, + "cumulative_gap": 818969506, + "expense": 45469990, + "gap": 45469990, + "income": 0 }, { "age": 82, - "asset": -78860.44377278318, - "cumulative_gap": 86534.88962870963, - "expense": 4637.939012327641, - "gap": 4637.939012327641, - "income": 0.0 + "asset": -788604438, + "cumulative_gap": 865348896, + "expense": 46379390, + "gap": 46379390, + "income": 0 }, { "age": 83, - "asset": -86003.33426866416, - "cumulative_gap": 91265.58742128382, - "expense": 4730.697792574194, - "gap": 4730.697792574194, - "income": 0.0 + "asset": -860033343, + "cumulative_gap": 912655874, + "expense": 47306978, + "gap": 47306978, + "income": 0 }, { "age": 84, - "asset": -93456.05302307551, - "cumulative_gap": 96090.8991697095, - "expense": 4825.311748425678, - "gap": 4825.311748425678, - "income": 0.0 + "asset": -934560530, + "cumulative_gap": 960908992, + "expense": 48253117, + "gap": 48253117, + "income": 0 }, { "age": 85, - "asset": -101229.80571464622, - "cumulative_gap": 101012.7171531037, - "expense": 4921.817983394192, - "gap": 4921.817983394192, - "income": 0.0 + "asset": -1012298057, + "cumulative_gap": 1010127172, + "expense": 49218180, + "gap": 49218180, + "income": 0 }, { "age": 86, - "asset": -109336.17240898164, - "cumulative_gap": 106032.97149616577, - "expense": 5020.254343062076, - "gap": 5020.254343062076, - "income": 0.0 + "asset": -1093361724, + "cumulative_gap": 1060329715, + "expense": 50202543, + "gap": 50202543, + "income": 0 }, { "age": 87, - "asset": -117787.11955460503, - "cumulative_gap": 111153.63092608908, - "expense": 5120.6594299233175, - "gap": 5120.6594299233175, - "income": 0.0 + "asset": -1177871196, + "cumulative_gap": 1111536309, + "expense": 51206594, + "gap": 51206594, + "income": 0 }, { "age": 88, - "asset": -126595.0123540642, - "cumulative_gap": 116376.70354461086, - "expense": 5223.072618521784, - "gap": 5223.072618521784, - "income": 0.0 + "asset": -1265950124, + "cumulative_gap": 1163767035, + "expense": 52230726, + "gap": 52230726, + "income": 0 }, { "age": 89, - "asset": -135772.62752176358, - "cumulative_gap": 121704.23761550308, - "expense": 5327.5340708922195, - "gap": 5327.5340708922195, - "income": 0.0 + "asset": -1357726275, + "cumulative_gap": 1217042376, + "expense": 53275341, + "gap": 53275341, + "income": 0 }, { "age": 90, - "asset": -145333.16644043548, - "cumulative_gap": 127138.32236781315, - "expense": 5434.084752310064, - "gap": 5434.084752310064, - "income": 0.0 + "asset": -1453331664, + "cumulative_gap": 1271383224, + "expense": 54340848, + "gap": 54340848, + "income": 0 }, { "age": 91, - "asset": -155290.2687285279, - "cumulative_gap": 132681.0888151694, - "expense": 5542.766447356265, - "gap": 5542.766447356265, - "income": 0.0 + "asset": -1552902687, + "cumulative_gap": 1326810888, + "expense": 55427664, + "gap": 55427664, + "income": 0 }, { "age": 92, - "asset": -165658.0262311607, - "cumulative_gap": 138334.7105914728, - "expense": 5653.621776303391, - "gap": 5653.621776303391, - "income": 0.0 + "asset": -1656580262, + "cumulative_gap": 1383347106, + "expense": 56536218, + "gap": 56536218, + "income": 0 }, { "age": 93, - "asset": -176450.99744768802, - "cumulative_gap": 144101.40480330226, - "expense": 5766.694211829459, - "gap": 5766.694211829459, - "income": 0.0 + "asset": -1764509974, + "cumulative_gap": 1441014048, + "expense": 57666942, + "gap": 57666942, + "income": 0 }, { "age": 94, - "asset": -187684.222409303, - "cumulative_gap": 149983.43289936832, - "expense": 5882.028096066048, - "gap": 5882.028096066048, - "income": 0.0 + "asset": -1876842224, + "cumulative_gap": 1499834329, + "expense": 58820281, + "gap": 58820281, + "income": 0 }, { "age": 95, - "asset": -199373.23802053015, - "cumulative_gap": 155983.1015573557, - "expense": 5999.668657987369, - "gap": 5999.668657987369, - "income": 0.0 + "asset": -1993732380, + "cumulative_gap": 1559831016, + "expense": 59996687, + "gap": 59996687, + "income": 0 }, { "age": 96, - "asset": -211534.09387887304, - "cumulative_gap": 162102.7635885028, - "expense": 6119.662031147117, - "gap": 6119.662031147117, - "income": 0.0 + "asset": -2115340939, + "cumulative_gap": 1621027636, + "expense": 61196620, + "gap": 61196620, + "income": 0 }, { "age": 97, - "asset": -224183.36858732076, - "cumulative_gap": 168344.81886027285, - "expense": 6242.055271770059, - "gap": 6242.055271770059, - "income": 0.0 + "asset": -2241833686, + "cumulative_gap": 1683448189, + "expense": 62420553, + "gap": 62420553, + "income": 0 }, { "age": 98, - "asset": -237338.18657486353, - "cumulative_gap": 174711.71523747832, - "expense": 6366.89637720546, - "gap": 6366.89637720546, - "income": 0.0 + "asset": -2373381866, + "cumulative_gap": 1747117152, + "expense": 63668964, + "gap": 63668964, + "income": 0 }, { "age": 99, - "asset": -251016.23544063108, - "cumulative_gap": 181205.9495422279, - "expense": 6494.23430474957, - "gap": 6494.23430474957, - "income": 0.0 + "asset": -2510162354, + "cumulative_gap": 1812059495, + "expense": 64942343, + "gap": 64942343, + "income": 0 }, { "age": 100, - "asset": -265235.7838377421, - "cumulative_gap": 187830.06853307245, - "expense": 6624.118990844561, - "gap": 6624.118990844561, - "income": 0.0 + "asset": -2652357838, + "cumulative_gap": 1878300685, + "expense": 66241190, + "gap": 66241190, + "income": 0 } ], - "total_received": 8531.25 + "total_received": 85312500 }, { "break_even_age": 64, @@ -1018,334 +1018,334 @@ "timeline": [ { "age": 60, - "asset": 14826.25, - "cumulative_gap": 2388.0, - "expense": 3000.0, - "gap": 2388.0, - "income": 612.0000000000001 + "asset": 148262500, + "cumulative_gap": 23880000, + "expense": 30000000, + "gap": 23880000, + "income": 6120000 }, { "age": 61, - "asset": 12811.397500000001, - "cumulative_gap": 4836.0, - "expense": 3060.0, - "gap": 2448.0, - "income": 612.0000000000001 + "asset": 128113975, + "cumulative_gap": 48360000, + "expense": 30600000, + "gap": 24480000, + "income": 6120000 }, { "age": 62, - "asset": 10674.299425000001, - "cumulative_gap": 7345.200000000001, - "expense": 3121.2000000000003, - "gap": 2509.2000000000003, - "income": 612.0000000000001 + "asset": 106742994, + "cumulative_gap": 73452000, + "expense": 31212000, + "gap": 25092000, + "income": 6120000 }, { "age": 63, - "asset": 8410.052407750001, - "cumulative_gap": 9916.824, - "expense": 3183.6240000000003, - "gap": 2571.6240000000003, - "income": 612.0000000000001 + "asset": 84100524, + "cumulative_gap": 99168240, + "expense": 31836240, + "gap": 25716240, + "income": 6120000 }, { "age": 64, - "asset": 6013.581259982501, - "cumulative_gap": 12552.120480000001, - "expense": 3247.2964800000004, - "gap": 2635.2964800000004, - "income": 612.0000000000001 + "asset": 60135813, + "cumulative_gap": 125521205, + "expense": 32472965, + "gap": 26352965, + "income": 6120000 }, { "age": 65, - "asset": 3479.633323381976, - "cumulative_gap": 15252.362889600001, - "expense": 3312.2424096000004, - "gap": 2700.2424096000004, - "income": 612.0000000000001 + "asset": 34796333, + "cumulative_gap": 152523629, + "expense": 33122424, + "gap": 27002424, + "income": 6120000 }, { "age": 66, - "asset": 802.7726411954349, - "cumulative_gap": 18018.850147392, - "expense": 3378.4872577920005, - "gap": 2766.4872577920005, - "income": 612.0000000000001 + "asset": 8027726, + "cumulative_gap": 180188501, + "expense": 33784873, + "gap": 27664873, + "income": 6120000 }, { "age": 67, - "asset": -2022.6260550944626, - "cumulative_gap": 20852.90715033984, - "expense": 3446.0570029478404, - "gap": 2834.0570029478404, - "income": 612.0000000000001 + "asset": -20226261, + "cumulative_gap": 208529072, + "expense": 34460570, + "gap": 28340570, + "income": 6120000 }, { "age": 68, - "asset": -5002.383549783573, - "cumulative_gap": 23755.885293346637, - "expense": 3514.9781430067974, - "gap": 2902.9781430067974, - "income": 612.0000000000001 + "asset": -50023835, + "cumulative_gap": 237558853, + "expense": 35149781, + "gap": 29029781, + "income": 6120000 }, { "age": 69, - "asset": -8142.52254357408, - "cumulative_gap": 26729.16299921357, - "expense": 3585.2777058669335, - "gap": 2973.2777058669335, - "income": 612.0000000000001 + "asset": -81425225, + "cumulative_gap": 267291630, + "expense": 35852777, + "gap": 29732777, + "income": 6120000 }, { "age": 70, - "asset": -11449.274256924245, - "cumulative_gap": 29774.14625919784, - "expense": 3656.983259984272, - "gap": 3044.983259984272, - "income": 612.0000000000001 + "asset": -114492743, + "cumulative_gap": 297741463, + "expense": 36569833, + "gap": 30449833, + "income": 6120000 }, { "age": 71, - "asset": -14929.085242415773, - "cumulative_gap": 32892.2691843818, - "expense": 3730.1229251839577, - "gap": 3118.1229251839577, - "income": 612.0000000000001 + "asset": -149290852, + "cumulative_gap": 328922692, + "expense": 37301229, + "gap": 31181229, + "income": 6120000 }, { "age": 72, - "asset": -18588.624412627723, - "cumulative_gap": 36084.994568069436, - "expense": 3804.725383687637, - "gap": 3192.725383687637, - "income": 612.0000000000001 + "asset": -185886244, + "cumulative_gap": 360849946, + "expense": 38047254, + "gap": 31927254, + "income": 6120000 }, { "age": 73, - "asset": -22434.790290204823, - "cumulative_gap": 39353.814459430825, - "expense": 3880.81989136139, - "gap": 3268.81989136139, - "income": 612.0000000000001 + "asset": -224347903, + "cumulative_gap": 393538145, + "expense": 38808199, + "gap": 32688199, + "income": 6120000 }, { "age": 74, - "asset": -26474.718487013197, - "cumulative_gap": 42700.250748619444, - "expense": 3958.436289188618, - "gap": 3346.436289188618, - "income": 612.0000000000001 + "asset": -264747185, + "cumulative_gap": 427002507, + "expense": 39584363, + "gap": 33464363, + "income": 6120000 }, { "age": 75, - "asset": -30715.78941948787, - "cumulative_gap": 46125.85576359183, - "expense": 4037.6050149723906, - "gap": 3425.6050149723906, - "income": 612.0000000000001 + "asset": -307157894, + "cumulative_gap": 461258558, + "expense": 40376050, + "gap": 34256050, + "income": 6120000 }, { "age": 76, - "asset": -35165.636267494076, - "cumulative_gap": 49632.21287886367, - "expense": 4118.357115271839, - "gap": 3506.3571152718387, - "income": 612.0000000000001 + "asset": -351656363, + "cumulative_gap": 496322129, + "expense": 41183571, + "gap": 35063571, + "income": 6120000 }, { "age": 77, - "asset": -39832.15318424889, - "cumulative_gap": 53220.937136440945, - "expense": 4200.724257577275, - "gap": 3588.7242575772752, - "income": 612.0000000000001 + "asset": -398321532, + "cumulative_gap": 532209371, + "expense": 42007243, + "gap": 35887243, + "income": 6120000 }, { "age": 78, - "asset": -44723.50376508095, - "cumulative_gap": 56893.675879169765, - "expense": 4284.73874272882, - "gap": 3672.7387427288204, - "income": 612.0000000000001 + "asset": -447235038, + "cumulative_gap": 568936759, + "expense": 42847387, + "gap": 36727387, + "income": 6120000 }, { "age": 79, - "asset": -49848.12978304407, - "cumulative_gap": 60652.10939675316, - "expense": 4370.433517583397, - "gap": 3758.4335175833967, - "income": 612.0000000000001 + "asset": -498481298, + "cumulative_gap": 606521094, + "expense": 43704335, + "gap": 37584335, + "income": 6120000 }, { "age": 80, - "asset": -55214.76019964629, - "cumulative_gap": 64497.95158468823, - "expense": 4457.842187935064, - "gap": 3845.8421879350644, - "income": 612.0000000000001 + "asset": -552147602, + "cumulative_gap": 644979516, + "expense": 44578422, + "gap": 38458422, + "income": 6120000 }, { "age": 81, - "asset": -60832.4204592088, - "cumulative_gap": 68432.95061638199, - "expense": 4546.999031693766, - "gap": 3934.9990316937656, - "income": 612.0000000000001 + "asset": -608324205, + "cumulative_gap": 684329506, + "expense": 45469990, + "gap": 39349990, + "income": 6120000 }, { "age": 82, - "asset": -66710.44207562965, - "cumulative_gap": 72458.88962870963, - "expense": 4637.939012327641, - "gap": 4025.9390123276407, - "income": 612.0000000000001 + "asset": -667104421, + "cumulative_gap": 724588896, + "expense": 46379390, + "gap": 40259390, + "income": 6120000 }, { "age": 83, - "asset": -72858.472520596, - "cumulative_gap": 76577.58742128382, - "expense": 4730.697792574194, - "gap": 4118.697792574194, - "income": 612.0000000000001 + "asset": -728584725, + "cumulative_gap": 765775874, + "expense": 47306978, + "gap": 41186978, + "income": 6120000 }, { "age": 84, - "asset": -79286.4854225653, - "cumulative_gap": 80790.8991697095, - "expense": 4825.311748425678, - "gap": 4213.311748425678, - "income": 612.0000000000001 + "asset": -792864854, + "cumulative_gap": 807908992, + "expense": 48253117, + "gap": 42133117, + "income": 6120000 }, { "age": 85, - "asset": -86004.7910861207, - "cumulative_gap": 85100.7171531037, - "expense": 4921.817983394192, - "gap": 4309.817983394192, - "income": 612.0000000000001 + "asset": -860047911, + "cumulative_gap": 851007172, + "expense": 49218180, + "gap": 43098180, + "income": 6120000 }, { "age": 86, - "asset": -93024.04734160035, - "cumulative_gap": 89508.97149616577, - "expense": 5020.254343062076, - "gap": 4408.254343062076, - "income": 612.0000000000001 + "asset": -930240473, + "cumulative_gap": 895089715, + "expense": 50202543, + "gap": 44082543, + "income": 6120000 }, { "age": 87, - "asset": -100355.2707352023, - "cumulative_gap": 94017.63092608908, - "expense": 5120.6594299233175, - "gap": 4508.6594299233175, - "income": 612.0000000000001 + "asset": -1003552707, + "cumulative_gap": 940176309, + "expense": 51206594, + "gap": 45086594, + "income": 6120000 }, { "age": 88, - "asset": -108009.84807007939, - "cumulative_gap": 98628.70354461086, - "expense": 5223.072618521784, - "gap": 4611.072618521784, - "income": 612.0000000000001 + "asset": -1080098481, + "cumulative_gap": 986287035, + "expense": 52230726, + "gap": 46110726, + "income": 6120000 }, { "age": 89, - "asset": -115999.5483092592, - "cumulative_gap": 103344.23761550308, - "expense": 5327.5340708922195, - "gap": 4715.5340708922195, - "income": 612.0000000000001 + "asset": -1159995483, + "cumulative_gap": 1033442376, + "expense": 53275341, + "gap": 47155341, + "income": 6120000 }, { "age": 90, - "asset": -124336.53485155596, - "cumulative_gap": 108166.32236781315, - "expense": 5434.084752310064, - "gap": 4822.084752310064, - "income": 612.0000000000001 + "asset": -1243365349, + "cumulative_gap": 1081663224, + "expense": 54340848, + "gap": 48220848, + "income": 6120000 }, { "age": 91, - "asset": -133033.37819198202, - "cumulative_gap": 113097.08881516941, - "expense": 5542.766447356265, - "gap": 4930.766447356265, - "income": 612.0000000000001 + "asset": -1330333782, + "cumulative_gap": 1130970888, + "expense": 55427664, + "gap": 49307664, + "income": 6120000 }, { "age": 92, - "asset": -142103.06897851842, - "cumulative_gap": 118138.7105914728, - "expense": 5653.621776303391, - "gap": 5041.621776303391, - "income": 612.0000000000001 + "asset": -1421030690, + "cumulative_gap": 1181387106, + "expense": 56536218, + "gap": 50416218, + "income": 6120000 }, { "age": 93, - "asset": -151559.0314774665, - "cumulative_gap": 123293.40480330226, - "expense": 5766.694211829459, - "gap": 5154.694211829459, - "income": 612.0000000000001 + "asset": -1515590315, + "cumulative_gap": 1232934048, + "expense": 57666942, + "gap": 51546942, + "income": 6120000 }, { "age": 94, - "asset": -161415.13745997482, - "cumulative_gap": 128563.4328993683, - "expense": 5882.028096066048, - "gap": 5270.028096066048, - "income": 612.0000000000001 + "asset": -1614151375, + "cumulative_gap": 1285634329, + "expense": 58820281, + "gap": 52700281, + "income": 6120000 }, { "age": 95, - "asset": -171685.7205227221, - "cumulative_gap": 133951.10155735567, - "expense": 5999.668657987369, - "gap": 5387.668657987369, - "income": 612.0000000000001 + "asset": -1716857205, + "cumulative_gap": 1339511016, + "expense": 59996687, + "gap": 53876687, + "income": 6120000 }, { "age": 96, - "asset": -182385.5908561308, - "cumulative_gap": 139458.76358850277, - "expense": 6119.662031147117, - "gap": 5507.662031147117, - "income": 612.0000000000001 + "asset": -1823855909, + "cumulative_gap": 1394587636, + "expense": 61196620, + "gap": 55076620, + "income": 6120000 }, { "age": 97, - "asset": -193530.05047389623, - "cumulative_gap": 145088.81886027282, - "expense": 6242.055271770059, - "gap": 5630.055271770059, - "income": 612.0000000000001 + "asset": -1935300505, + "cumulative_gap": 1450888189, + "expense": 62420553, + "gap": 56300553, + "income": 6120000 }, { "age": 98, - "asset": -205134.90891803626, - "cumulative_gap": 150843.7152374783, - "expense": 6366.89637720546, - "gap": 5754.89637720546, - "income": 612.0000000000001 + "asset": -2051349089, + "cumulative_gap": 1508437152, + "expense": 63668964, + "gap": 57548964, + "income": 6120000 }, { "age": 99, - "asset": -217216.499454099, - "cumulative_gap": 156725.94954222787, - "expense": 6494.23430474957, - "gap": 5882.23430474957, - "income": 612.0000000000001 + "asset": -2172164995, + "cumulative_gap": 1567259495, + "expense": 64942343, + "gap": 58822343, + "income": 6120000 }, { "age": 100, - "asset": -229791.69577161403, - "cumulative_gap": 162738.06853307242, - "expense": 6624.118990844561, - "gap": 6012.118990844561, - "income": 612.0000000000001 + "asset": -2297916958, + "cumulative_gap": 1627380685, + "expense": 66241190, + "gap": 60121190, + "income": 6120000 } ], - "total_received": 29918.25 + "total_received": 299182500 } ] }, diff --git a/fastapi/tests/test_golden_snapshots.py b/fastapi/tests/test_golden_snapshots.py index 1911df4..e1ace58 100644 --- a/fastapi/tests/test_golden_snapshots.py +++ b/fastapi/tests/test_golden_snapshots.py @@ -17,6 +17,11 @@ GOLDEN_DIR = Path(__file__).parent / "golden" +# retirement 계열 엔드포인트는 #1(금액 단위 통일)로 요청/응답이 만원 -> 원으로 바뀌었다. +# 케이스가 나타내는 실제 시나리오(예: "월 생활비 250만원")는 그대로 유지하기 위해 +# 만원 단위였던 리터럴에 WON_PER_MANWON을 곱해 원 단위로 표현한다. +WON_PER_MANWON = 10_000 + CASES = [ # --- /api/retirement/diagnosis --- { @@ -24,9 +29,9 @@ "path": "/api/retirement/diagnosis", "body": { "current_age": 65, - "monthly_expenses": 150, - "monthly_pension": 200, - "asset": 10000, + "monthly_expenses": 150 * WON_PER_MANWON, + "monthly_pension": 200 * WON_PER_MANWON, + "asset": 10000 * WON_PER_MANWON, "gender": "male", }, }, @@ -35,9 +40,9 @@ "path": "/api/retirement/diagnosis", "body": { "current_age": 60, - "monthly_expenses": 250, - "monthly_pension": 150, - "asset": 10000, + "monthly_expenses": 250 * WON_PER_MANWON, + "monthly_pension": 150 * WON_PER_MANWON, + "asset": 10000 * WON_PER_MANWON, "gender": "male", }, }, @@ -46,9 +51,9 @@ "path": "/api/retirement/diagnosis", "body": { "current_age": 60, - "monthly_expenses": 200, - "monthly_pension": 150, - "asset": 32000, + "monthly_expenses": 200 * WON_PER_MANWON, + "monthly_pension": 150 * WON_PER_MANWON, + "asset": 32000 * WON_PER_MANWON, "gender": "female", }, }, @@ -58,9 +63,9 @@ "path": "/api/retirement/recommendations", "body": { "current_age": 65, - "monthly_expenses": 150, - "monthly_pension": 200, - "asset": 10000, + "monthly_expenses": 150 * WON_PER_MANWON, + "monthly_pension": 200 * WON_PER_MANWON, + "asset": 10000 * WON_PER_MANWON, "gender": "male", }, }, @@ -69,9 +74,9 @@ "path": "/api/retirement/recommendations", "body": { "current_age": 60, - "monthly_expenses": 250, - "monthly_pension": 200, - "asset": 15000, + "monthly_expenses": 250 * WON_PER_MANWON, + "monthly_pension": 200 * WON_PER_MANWON, + "asset": 15000 * WON_PER_MANWON, "gender": "male", }, }, @@ -80,9 +85,9 @@ "path": "/api/retirement/recommendations", "body": { "current_age": 60, - "monthly_expenses": 400, - "monthly_pension": 100, - "asset": 5000, + "monthly_expenses": 400 * WON_PER_MANWON, + "monthly_pension": 100 * WON_PER_MANWON, + "asset": 5000 * WON_PER_MANWON, "gender": "female", }, }, @@ -92,9 +97,9 @@ "path": "/api/retirement/reduction", "body": { "current_age": 60, - "monthly_expenses": 200, - "monthly_pension": 150, - "asset": 10000, + "monthly_expenses": 200 * WON_PER_MANWON, + "monthly_pension": 150 * WON_PER_MANWON, + "asset": 10000 * WON_PER_MANWON, "gender": "male", "reemployment_income": 0, }, @@ -104,11 +109,11 @@ "path": "/api/retirement/reduction", "body": { "current_age": 60, - "monthly_expenses": 200, - "monthly_pension": 150, - "asset": 10000, + "monthly_expenses": 200 * WON_PER_MANWON, + "monthly_pension": 150 * WON_PER_MANWON, + "asset": 10000 * WON_PER_MANWON, "gender": "male", - "reemployment_income": 500, + "reemployment_income": 500 * WON_PER_MANWON, }, }, { @@ -116,11 +121,11 @@ "path": "/api/retirement/reduction", "body": { "current_age": 60, - "monthly_expenses": 200, - "monthly_pension": 150, - "asset": 10000, + "monthly_expenses": 200 * WON_PER_MANWON, + "monthly_pension": 150 * WON_PER_MANWON, + "asset": 10000 * WON_PER_MANWON, "gender": "male", - "reemployment_income": 99999, + "reemployment_income": 99999 * WON_PER_MANWON, }, }, # --- /api/retirement/scenarios --- @@ -129,11 +134,11 @@ "path": "/api/retirement/scenarios", "body": { "current_age": 60, - "monthly_expenses": 250, - "monthly_pension": 150, - "asset": 10000, + "monthly_expenses": 250 * WON_PER_MANWON, + "monthly_pension": 150 * WON_PER_MANWON, + "asset": 10000 * WON_PER_MANWON, "gender": "male", - "base_monthly_income": 300, + "base_monthly_income": 300 * WON_PER_MANWON, "total_service_years": 25, }, }, @@ -142,11 +147,11 @@ "path": "/api/retirement/scenarios", "body": { "current_age": 60, - "monthly_expenses": 250, - "monthly_pension": 150, - "asset": 10000, + "monthly_expenses": 250 * WON_PER_MANWON, + "monthly_pension": 150 * WON_PER_MANWON, + "asset": 10000 * WON_PER_MANWON, "gender": "male", - "base_monthly_income": 300, + "base_monthly_income": 300 * WON_PER_MANWON, "total_service_years": 25, "deduction_years": 15, }, diff --git a/fastapi/tests/test_money_unit_consistency.py b/fastapi/tests/test_money_unit_consistency.py new file mode 100644 index 0000000..f89a312 --- /dev/null +++ b/fastapi/tests/test_money_unit_consistency.py @@ -0,0 +1,80 @@ +"""API 경계의 금액 단위(원) 일관성 검증. + +simulate의 monthly_pension 출력을 diagnosis의 monthly_pension 입력에 그대로 +넣었을 때, 두 API가 같은 단위(원)를 쓰고 있다면 diagnosis의 monthly_gap이 +(입력한 monthly_expenses - monthly_pension)과 정확히 일치해야 한다. +단위가 어긋나 있으면(예: 한쪽 원, 한쪽 만원) 이 값이 10,000배 가까이 벌어진다. +""" + +import pytest +from fastapi.testclient import TestClient + +from app.main import app + + +@pytest.fixture(scope="module") +def client(): + return TestClient(app) + + +def test_simulate_monthly_pension_feeds_consistently_into_diagnosis(client): + simulate_response = client.post( + "/api/employees/simulate", + json={ + "current_years": 20, + "current_income": 5_000_000, + "current_age": 50, + "retire_at_age": 62, + }, + ) + assert simulate_response.status_code == 200 + monthly_pension_won = simulate_response.json()["monthly_pension"] + assert monthly_pension_won > 100_000 # 원 단위라면 이 정도 규모가 정상 + + monthly_expenses_won = monthly_pension_won + 500_000 + + diagnosis_response = client.post( + "/api/retirement/diagnosis", + json={ + "current_age": 62, + "monthly_expenses": monthly_expenses_won, + "monthly_pension": monthly_pension_won, + "asset": 100_000_000, + "gender": "male", + }, + ) + assert diagnosis_response.status_code == 200 + body = diagnosis_response.json() + + assert body["monthly_gap"] == pytest.approx( + monthly_expenses_won - monthly_pension_won, abs=2 + ) + + +def test_reduction_income_at_threshold_produces_zero_reduction(client): + """reduction_rules.threshold(309.7만원, 고정 상수)는 입력값 스케일과 무관하게 + 고정돼 있으므로, reemployment_income을 '원' 단위로 넣었을 때 내부 변환이 + 빠지면 이 값이 threshold를 훨씬 초과한 것처럼 오인되어 감액이 발생한다. + threshold와 정확히 같은 소득(원 단위)을 넣으면 감액이 0이어야 한다. + """ + from app.services.reduction_rules import get_reduction_rule + + threshold_manwon = get_reduction_rule(2025).threshold + reemployment_income_won = round(threshold_manwon * 10_000) + + response = client.post( + "/api/retirement/reduction", + json={ + "current_age": 60, + "monthly_expenses": 2_000_000, + "monthly_pension": 1_500_000, + "asset": 100_000_000, + "gender": "male", + "reemployment_income": reemployment_income_won, + "year": 2025, + }, + ) + + assert response.status_code == 200 + body = response.json() + assert body["monthly_reduction"] == 0 From 3855ebeed439bd74c1537ef6c393cb9b5adc4245 Mon Sep 17 00:00:00 2001 From: jung32111 Date: Sat, 25 Jul 2026 09:37:31 +0900 Subject: [PATCH 4/7] =?UTF-8?q?=E2=9C=A8=20Feat:=20=EA=B3=A0=EA=B0=88(depl?= =?UTF-8?q?etion)=20=ED=91=9C=ED=98=84=EC=9D=84=20=EC=A0=84=20=EC=97=94?= =?UTF-8?q?=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 두 가지 문제를 하나의 이슈로 묶어 처리: 1. timeline의 asset이 고갈 이후에도 매년 음수로 계속 하강했다(100세까지 최대 -15억원 수준). Recharts에 그대로 꽂으면 축 스케일이 깨져 프론트가 반드시 잘라내는 전처리를 해야 했다. 고갈 이후 asset을 0으로 클램프한다. 2. scenarios의 depletion_age가 무고갈일 때 MAX_AGE(100)를 sentinel로 써서, 실제로 100세에 고갈되는 경우와 구분이 불가능했다(diagnosis 등 다른 엔드포인트는 무고갈 시 null). ScenarioOutcome.depletion_age도 null로 통일하고, _select_best_scenario의 정렬 기준만 별도로 무고갈을 "가장 늦게 고갈"로 취급하도록 수정했다(API 응답 값 자체는 null 유지). 추가로 depletion_age is not None을 매번 계산하지 않아도 되도록 depleted: bool 필드를 모든 진단류 응답에 추가했다. timeline 각 시점에 고갈 여부 플래그를 추가하는 안은 검토했으나, depletion_age가 이미 응답에 있어 프론트가 point.age >= depletion_age로 바로 판단할 수 있으므로 중복 정보라 추가하지 않았다. 회귀 테스트(tests/test_depletion_representation.py)를 먼저 추가해 수정 전 실패를 확인한 뒤 구현했다. --- fastapi/app/schemas/retirement.py | 6 +- fastapi/app/services/retirement_service.py | 21 +- .../tests/golden/diagnosis_insufficient.json | 67 ++--- fastapi/tests/golden/diagnosis_middle.json | 11 +- .../tests/golden/diagnosis_sufficient.json | 1 + .../recommendations_saving_and_income.json | 1 + .../golden/recommendations_saving_only.json | 1 + .../golden/recommendations_sufficient.json | 1 + fastapi/tests/golden/reduction_capped.json | 69 ++--- .../tests/golden/reduction_no_reduction.json | 55 ++-- fastapi/tests/golden/reduction_partial.json | 59 ++-- fastapi/tests/golden/scenarios_basic.json | 276 +++++++++--------- .../scenarios_with_deduction_years.json | 276 +++++++++--------- .../tests/test_depletion_representation.py | 98 +++++++ fastapi/tests/test_retirement_service.py | 6 +- 15 files changed, 540 insertions(+), 408 deletions(-) create mode 100644 fastapi/tests/test_depletion_representation.py diff --git a/fastapi/app/schemas/retirement.py b/fastapi/app/schemas/retirement.py index ad7d261..3f7ea38 100644 --- a/fastapi/app/schemas/retirement.py +++ b/fastapi/app/schemas/retirement.py @@ -26,6 +26,7 @@ class SimulationResult(BaseModel): current_age: int # 현재 나이 monthly_gap: WonAmountOutput # 현재 시점의 월 Gap (월 생활비 - 월 연금) (원) depletion_age: int | None # 자산 고갈 나이 (고갈되지 않으면 None) + depleted: bool # 자산 고갈 여부 (depletion_age is not None과 항상 일치) target_age: int # 목표연령 (성별 고정값) status: ReadinessStatus # 노후 준비 상태 timeline: list[TimelinePoint] # 연도별 자산 추이 @@ -58,6 +59,7 @@ class RecommendationResult(BaseModel): required_income: WonAmountOutput # 필요 월 추가 소득액 (원) target_status: ReadinessStatus # 추천 산정에 사용된 목표 기준 (항상 SUFFICIENT="고갈 없음") depletion_age: int | None # 개선 적용 후 자산 고갈 나이 + depleted: bool # 개선 적용 후 자산 고갈 여부 (depletion_age is not None과 항상 일치) target_age: int # 목표연령 status: ReadinessStatus # 개선 적용 후 노후 준비 상태 timeline: list[TimelinePoint] # 개선 적용 후 연도별 자산 추이 @@ -77,6 +79,7 @@ class ReductionResult(BaseModel): reduced_monthly_pension: WonAmountOutput # 감액 후 월 실수령 연금액 (원) full_payment_income_threshold: WonAmountOutput # 전액 수령 가능 소득 상한 (원) depletion_age: int | None # 감액 반영 후 자산 고갈 나이 + depleted: bool # 감액 반영 후 자산 고갈 여부 (depletion_age is not None과 항상 일치) target_age: int # 목표연령 status: ReadinessStatus # 감액 반영 후 노후 준비 상태 timeline: list[TimelinePoint] # 감액 반영 후 연도별 자산 추이 @@ -102,7 +105,8 @@ class ScenarioType(str, Enum): class ScenarioOutcome(BaseModel): scenario_type: ScenarioType # 수령방식 - depletion_age: int # 자산 고갈 나이 (고갈되지 않으면 MAX_AGE) + depletion_age: int | None # 자산 고갈 나이 (고갈되지 않으면 None) + depleted: bool # 자산 고갈 여부 (depletion_age is not None과 항상 일치) total_received: WonAmountOutput # 총 수령액 (원, current_age~MAX_AGE 동일 기간 기준) break_even_age: int | None # NORMAL 대비 손익분기 나이 (이 나이 이상 생존 시 NORMAL이 유리해짐). NORMAL 자신은 None timeline: list[TimelinePoint] # 연도별 자산 추이 diff --git a/fastapi/app/services/retirement_service.py b/fastapi/app/services/retirement_service.py index 5db88d8..b5252e3 100644 --- a/fastapi/app/services/retirement_service.py +++ b/fastapi/app/services/retirement_service.py @@ -89,6 +89,9 @@ def simulate_retirement( if depletion_age is None and annual_gap > 0 and current_asset <= 0: depletion_age = age + 1 + if current_asset < 0: + current_asset = 0.0 + annual_expense *= 1 + INFLATION_RATE annual_income *= 1 + PENSION_GROWTH_RATE annual_gap = annual_expense - annual_income @@ -103,6 +106,7 @@ def simulate_retirement( current_age=current_age, monthly_gap=monthly_gap, depletion_age=depletion_age, + depleted=depletion_age is not None, target_age=target_age, status=status, timeline=timeline, @@ -177,6 +181,7 @@ def recommend_retirement( required_income=0.0, target_status=ReadinessStatus.SUFFICIENT, depletion_age=baseline.depletion_age, + depleted=baseline.depleted, target_age=baseline.target_age, status=baseline.status, timeline=baseline.timeline, @@ -221,6 +226,7 @@ def reaches_target(saving: float, extra_income: float) -> bool: required_income=required_income, target_status=ReadinessStatus.SUFFICIENT, depletion_age=improved.depletion_age, + depleted=improved.depleted, target_age=improved.target_age, status=improved.status, timeline=improved.timeline, @@ -265,6 +271,7 @@ def simulate_pension_reduction( reduced_monthly_pension=round(reduced_monthly_pension, 2), full_payment_income_threshold=rule.threshold, depletion_age=result.depletion_age, + depleted=result.depleted, target_age=result.target_age, status=result.status, timeline=result.timeline, @@ -402,7 +409,6 @@ def simulate_scenarios( outcomes: list[ScenarioOutcome] = [] for scenario_type, (result, _upfront, cumulative) in simulated.items(): - depletion_age = result.depletion_age if result.depletion_age is not None else MAX_AGE total_received = cumulative[-1] if cumulative else 0.0 break_even_age = ( None @@ -413,7 +419,8 @@ def simulate_scenarios( outcomes.append( ScenarioOutcome( scenario_type=scenario_type, - depletion_age=depletion_age, + depletion_age=result.depletion_age, + depleted=result.depleted, total_received=round(total_received, 2), break_even_age=break_even_age, timeline=result.timeline, @@ -428,6 +435,12 @@ def simulate_scenarios( def _select_best_scenario(outcomes: list[ScenarioOutcome]) -> ScenarioType: - """고갈 나이가 가장 큰 시나리오를 선택하고, 동률이면 총 수령액이 큰 시나리오를 선택한다.""" - best = max(outcomes, key=lambda outcome: (outcome.depletion_age, outcome.total_received)) + """고갈 나이가 가장 큰 시나리오를 선택하고, 동률이면 총 수령액이 큰 시나리오를 선택한다. + depletion_age가 None(무고갈)인 시나리오는 가장 늦게 고갈되는 것으로 간주해 최우선한다.""" + + def sort_key(outcome: ScenarioOutcome) -> tuple[float, float]: + depletion_for_sort = outcome.depletion_age if outcome.depletion_age is not None else math.inf + return (depletion_for_sort, outcome.total_received) + + best = max(outcomes, key=sort_key) return best.scenario_type diff --git a/fastapi/tests/golden/diagnosis_insufficient.json b/fastapi/tests/golden/diagnosis_insufficient.json index f6c6865..e87bf9a 100644 --- a/fastapi/tests/golden/diagnosis_insufficient.json +++ b/fastapi/tests/golden/diagnosis_insufficient.json @@ -1,6 +1,7 @@ { "body": { "current_age": 60, + "depleted": true, "depletion_age": 68, "monthly_gap": 1000000, "status": "INSUFFICIENT", @@ -72,7 +73,7 @@ }, { "age": 68, - "asset": -2351146, + "asset": 0, "cumulative_gap": 130638853, "expense": 35149781, "gap": 17149781, @@ -80,7 +81,7 @@ }, { "age": 69, - "asset": -20085955, + "asset": 0, "cumulative_gap": 148491630, "expense": 35852777, "gap": 17852777, @@ -88,7 +89,7 @@ }, { "age": 70, - "asset": -39076894, + "asset": 0, "cumulative_gap": 167061463, "expense": 36569833, "gap": 18569833, @@ -96,7 +97,7 @@ }, { "age": 71, - "asset": -59376128, + "asset": 0, "cumulative_gap": 186362692, "expense": 37301229, "gap": 19301229, @@ -104,7 +105,7 @@ }, { "age": 72, - "asset": -81037678, + "asset": 0, "cumulative_gap": 206409946, "expense": 38047254, "gap": 20047254, @@ -112,7 +113,7 @@ }, { "age": 73, - "asset": -104117480, + "asset": 0, "cumulative_gap": 227218145, "expense": 38808199, "gap": 20808199, @@ -120,7 +121,7 @@ }, { "age": 74, - "asset": -128673449, + "asset": 0, "cumulative_gap": 248802507, "expense": 39584363, "gap": 21584363, @@ -128,7 +129,7 @@ }, { "age": 75, - "asset": -154765547, + "asset": 0, "cumulative_gap": 271178558, "expense": 40376050, "gap": 22376050, @@ -136,7 +137,7 @@ }, { "age": 76, - "asset": -182455845, + "asset": 0, "cumulative_gap": 294362129, "expense": 41183571, "gap": 23183571, @@ -144,7 +145,7 @@ }, { "age": 77, - "asset": -211808598, + "asset": 0, "cumulative_gap": 318369371, "expense": 42007243, "gap": 24007243, @@ -152,7 +153,7 @@ }, { "age": 78, - "asset": -242890316, + "asset": 0, "cumulative_gap": 343216759, "expense": 42847387, "gap": 24847387, @@ -160,7 +161,7 @@ }, { "age": 79, - "asset": -275769835, + "asset": 0, "cumulative_gap": 368921094, "expense": 43704335, "gap": 25704335, @@ -168,7 +169,7 @@ }, { "age": 80, - "asset": -310518395, + "asset": 0, "cumulative_gap": 395499516, "expense": 44578422, "gap": 26578422, @@ -176,7 +177,7 @@ }, { "age": 81, - "asset": -347209721, + "asset": 0, "cumulative_gap": 422969506, "expense": 45469990, "gap": 27469990, @@ -184,7 +185,7 @@ }, { "age": 82, - "asset": -385920103, + "asset": 0, "cumulative_gap": 451348896, "expense": 46379390, "gap": 28379390, @@ -192,7 +193,7 @@ }, { "age": 83, - "asset": -426728478, + "asset": 0, "cumulative_gap": 480655874, "expense": 47306978, "gap": 29306978, @@ -200,7 +201,7 @@ }, { "age": 84, - "asset": -469716520, + "asset": 0, "cumulative_gap": 510908992, "expense": 48253117, "gap": 30253117, @@ -208,7 +209,7 @@ }, { "age": 85, - "asset": -514968726, + "asset": 0, "cumulative_gap": 542127172, "expense": 49218180, "gap": 31218180, @@ -216,7 +217,7 @@ }, { "age": 86, - "asset": -562572513, + "asset": 0, "cumulative_gap": 574329715, "expense": 50202543, "gap": 32202543, @@ -224,7 +225,7 @@ }, { "age": 87, - "asset": -612618308, + "asset": 0, "cumulative_gap": 607536309, "expense": 51206594, "gap": 33206594, @@ -232,7 +233,7 @@ }, { "age": 88, - "asset": -665199650, + "asset": 0, "cumulative_gap": 641767035, "expense": 52230726, "gap": 34230726, @@ -240,7 +241,7 @@ }, { "age": 89, - "asset": -720413287, + "asset": 0, "cumulative_gap": 677042376, "expense": 53275341, "gap": 35275341, @@ -248,7 +249,7 @@ }, { "age": 90, - "asset": -778359287, + "asset": 0, "cumulative_gap": 713383224, "expense": 54340848, "gap": 36340848, @@ -256,7 +257,7 @@ }, { "age": 91, - "asset": -839141138, + "asset": 0, "cumulative_gap": 750810888, "expense": 55427664, "gap": 37427664, @@ -264,7 +265,7 @@ }, { "age": 92, - "asset": -902865867, + "asset": 0, "cumulative_gap": 789347106, "expense": 56536218, "gap": 38536218, @@ -272,7 +273,7 @@ }, { "age": 93, - "asset": -969644147, + "asset": 0, "cumulative_gap": 829014048, "expense": 57666942, "gap": 39666942, @@ -280,7 +281,7 @@ }, { "age": 94, - "asset": -1039590422, + "asset": 0, "cumulative_gap": 869834329, "expense": 58820281, "gap": 40820281, @@ -288,7 +289,7 @@ }, { "age": 95, - "asset": -1112823024, + "asset": 0, "cumulative_gap": 911831016, "expense": 59996687, "gap": 41996687, @@ -296,7 +297,7 @@ }, { "age": 96, - "asset": -1189464302, + "asset": 0, "cumulative_gap": 955027636, "expense": 61196620, "gap": 43196620, @@ -304,7 +305,7 @@ }, { "age": 97, - "asset": -1269640750, + "asset": 0, "cumulative_gap": 999448189, "expense": 62420553, "gap": 44420553, @@ -312,7 +313,7 @@ }, { "age": 98, - "asset": -1353483142, + "asset": 0, "cumulative_gap": 1045117152, "expense": 63668964, "gap": 45668964, @@ -320,7 +321,7 @@ }, { "age": 99, - "asset": -1441126669, + "asset": 0, "cumulative_gap": 1092059495, "expense": 64942343, "gap": 46942343, @@ -328,7 +329,7 @@ }, { "age": 100, - "asset": -1532711082, + "asset": 0, "cumulative_gap": 1140300685, "expense": 66241190, "gap": 48241190, diff --git a/fastapi/tests/golden/diagnosis_middle.json b/fastapi/tests/golden/diagnosis_middle.json index fee5197..5a0668e 100644 --- a/fastapi/tests/golden/diagnosis_middle.json +++ b/fastapi/tests/golden/diagnosis_middle.json @@ -1,6 +1,7 @@ { "body": { "current_age": 60, + "depleted": true, "depletion_age": 96, "monthly_gap": 500000, "status": "MIDDLE", @@ -296,7 +297,7 @@ }, { "age": 96, - "asset": -21357441, + "asset": 0, "cumulative_gap": 630822109, "expense": 48957296, "gap": 30957296, @@ -304,7 +305,7 @@ }, { "age": 97, - "asset": -53884180, + "asset": 0, "cumulative_gap": 662758551, "expense": 49936442, "gap": 31936442, @@ -312,7 +313,7 @@ }, { "age": 98, - "asset": -88395241, + "asset": 0, "cumulative_gap": 695693722, "expense": 50935171, "gap": 32935171, @@ -320,7 +321,7 @@ }, { "age": 99, - "asset": -124970324, + "asset": 0, "cumulative_gap": 729647596, "expense": 51953874, "gap": 33953874, @@ -328,7 +329,7 @@ }, { "age": 100, - "asset": -163691924, + "asset": 0, "cumulative_gap": 764640548, "expense": 52992952, "gap": 34992952, diff --git a/fastapi/tests/golden/diagnosis_sufficient.json b/fastapi/tests/golden/diagnosis_sufficient.json index 63f8dea..b3a01ed 100644 --- a/fastapi/tests/golden/diagnosis_sufficient.json +++ b/fastapi/tests/golden/diagnosis_sufficient.json @@ -1,6 +1,7 @@ { "body": { "current_age": 65, + "depleted": false, "depletion_age": null, "monthly_gap": -500000, "status": "SUFFICIENT", diff --git a/fastapi/tests/golden/recommendations_saving_and_income.json b/fastapi/tests/golden/recommendations_saving_and_income.json index 8aa5a74..52be33c 100644 --- a/fastapi/tests/golden/recommendations_saving_and_income.json +++ b/fastapi/tests/golden/recommendations_saving_and_income.json @@ -1,6 +1,7 @@ { "body": { "current_age": 60, + "depleted": false, "depletion_age": null, "recommendation_type": "SAVING_AND_INCOME", "required_income": 2770100, diff --git a/fastapi/tests/golden/recommendations_saving_only.json b/fastapi/tests/golden/recommendations_saving_only.json index 14013f6..864d4cb 100644 --- a/fastapi/tests/golden/recommendations_saving_only.json +++ b/fastapi/tests/golden/recommendations_saving_only.json @@ -1,6 +1,7 @@ { "body": { "current_age": 60, + "depleted": false, "depletion_age": null, "recommendation_type": "SAVING_ONLY", "required_income": 0, diff --git a/fastapi/tests/golden/recommendations_sufficient.json b/fastapi/tests/golden/recommendations_sufficient.json index 487b36d..8175461 100644 --- a/fastapi/tests/golden/recommendations_sufficient.json +++ b/fastapi/tests/golden/recommendations_sufficient.json @@ -1,6 +1,7 @@ { "body": { "current_age": 65, + "depleted": false, "depletion_age": null, "recommendation_type": "SUFFICIENT", "required_income": 0, diff --git a/fastapi/tests/golden/reduction_capped.json b/fastapi/tests/golden/reduction_capped.json index 17ce492..33c5fdb 100644 --- a/fastapi/tests/golden/reduction_capped.json +++ b/fastapi/tests/golden/reduction_capped.json @@ -1,6 +1,7 @@ { "body": { "current_age": 60, + "depleted": true, "depletion_age": 67, "full_payment_income_threshold": 3097000, "monthly_reduction": 750000, @@ -67,7 +68,7 @@ }, { "age": 67, - "asset": -6678814, + "asset": 0, "cumulative_gap": 133991257, "expense": 27568456, "gap": 18568456, @@ -75,7 +76,7 @@ }, { "age": 68, - "asset": -26004688, + "asset": 0, "cumulative_gap": 153111082, "expense": 28119825, "gap": 19119825, @@ -83,7 +84,7 @@ }, { "age": 69, - "asset": -46478249, + "asset": 0, "cumulative_gap": 172793304, "expense": 28682222, "gap": 19682222, @@ -91,7 +92,7 @@ }, { "age": 70, - "asset": -68145284, + "asset": 0, "cumulative_gap": 193049170, "expense": 29255866, "gap": 20255866, @@ -99,7 +100,7 @@ }, { "age": 71, - "asset": -91053185, + "asset": 0, "cumulative_gap": 213890153, "expense": 29840983, "gap": 20840983, @@ -107,7 +108,7 @@ }, { "age": 72, - "asset": -115250993, + "asset": 0, "cumulative_gap": 235327957, "expense": 30437803, "gap": 21437803, @@ -115,7 +116,7 @@ }, { "age": 73, - "asset": -140789460, + "asset": 0, "cumulative_gap": 257374516, "expense": 31046559, "gap": 22046559, @@ -123,7 +124,7 @@ }, { "age": 74, - "asset": -167721100, + "asset": 0, "cumulative_gap": 280042006, "expense": 31667490, "gap": 22667490, @@ -131,7 +132,7 @@ }, { "age": 75, - "asset": -196100248, + "asset": 0, "cumulative_gap": 303342846, "expense": 32300840, "gap": 23300840, @@ -139,7 +140,7 @@ }, { "age": 76, - "asset": -225983121, + "asset": 0, "cumulative_gap": 327289703, "expense": 32946857, "gap": 23946857, @@ -147,7 +148,7 @@ }, { "age": 77, - "asset": -257427877, + "asset": 0, "cumulative_gap": 351895497, "expense": 33605794, "gap": 24605794, @@ -155,7 +156,7 @@ }, { "age": 78, - "asset": -290494681, + "asset": 0, "cumulative_gap": 377173407, "expense": 34277910, "gap": 25277910, @@ -163,7 +164,7 @@ }, { "age": 79, - "asset": -325245769, + "asset": 0, "cumulative_gap": 403136875, "expense": 34963468, "gap": 25963468, @@ -171,7 +172,7 @@ }, { "age": 80, - "asset": -361745514, + "asset": 0, "cumulative_gap": 429799613, "expense": 35662738, "gap": 26662738, @@ -179,7 +180,7 @@ }, { "age": 81, - "asset": -400060499, + "asset": 0, "cumulative_gap": 457175605, "expense": 36375992, "gap": 27375992, @@ -187,7 +188,7 @@ }, { "age": 82, - "asset": -440259586, + "asset": 0, "cumulative_gap": 485279117, "expense": 37103512, "gap": 28103512, @@ -195,7 +196,7 @@ }, { "age": 83, - "asset": -482413991, + "asset": 0, "cumulative_gap": 514124699, "expense": 37845582, "gap": 28845582, @@ -203,7 +204,7 @@ }, { "age": 84, - "asset": -526597361, + "asset": 0, "cumulative_gap": 543727193, "expense": 38602494, "gap": 29602494, @@ -211,7 +212,7 @@ }, { "age": 85, - "asset": -572885851, + "asset": 0, "cumulative_gap": 574101737, "expense": 39374544, "gap": 30374544, @@ -219,7 +220,7 @@ }, { "age": 86, - "asset": -621358206, + "asset": 0, "cumulative_gap": 605263772, "expense": 40162035, "gap": 31162035, @@ -227,7 +228,7 @@ }, { "age": 87, - "asset": -672095848, + "asset": 0, "cumulative_gap": 637229047, "expense": 40965275, "gap": 31965275, @@ -235,7 +236,7 @@ }, { "age": 88, - "asset": -725182957, + "asset": 0, "cumulative_gap": 670013628, "expense": 41784581, "gap": 32784581, @@ -243,7 +244,7 @@ }, { "age": 89, - "asset": -780706564, + "asset": 0, "cumulative_gap": 703633901, "expense": 42620273, "gap": 33620273, @@ -251,7 +252,7 @@ }, { "age": 90, - "asset": -838756642, + "asset": 0, "cumulative_gap": 738106579, "expense": 43472678, "gap": 34472678, @@ -259,7 +260,7 @@ }, { "age": 91, - "asset": -899426200, + "asset": 0, "cumulative_gap": 773448711, "expense": 44342132, "gap": 35342132, @@ -267,7 +268,7 @@ }, { "age": 92, - "asset": -962811381, + "asset": 0, "cumulative_gap": 809677685, "expense": 45228974, "gap": 36228974, @@ -275,7 +276,7 @@ }, { "age": 93, - "asset": -1029011566, + "asset": 0, "cumulative_gap": 846811238, "expense": 46133554, "gap": 37133554, @@ -283,7 +284,7 @@ }, { "age": 94, - "asset": -1098129473, + "asset": 0, "cumulative_gap": 884867463, "expense": 47056225, "gap": 38056225, @@ -291,7 +292,7 @@ }, { "age": 95, - "asset": -1170271269, + "asset": 0, "cumulative_gap": 923864812, "expense": 47997349, "gap": 38997349, @@ -299,7 +300,7 @@ }, { "age": 96, - "asset": -1245546677, + "asset": 0, "cumulative_gap": 963822109, "expense": 48957296, "gap": 39957296, @@ -307,7 +308,7 @@ }, { "age": 97, - "asset": -1324069092, + "asset": 0, "cumulative_gap": 1004758551, "expense": 49936442, "gap": 40936442, @@ -315,7 +316,7 @@ }, { "age": 98, - "asset": -1405955701, + "asset": 0, "cumulative_gap": 1046693722, "expense": 50935171, "gap": 41935171, @@ -323,7 +324,7 @@ }, { "age": 99, - "asset": -1491327598, + "asset": 0, "cumulative_gap": 1089647596, "expense": 51953874, "gap": 42953874, @@ -331,7 +332,7 @@ }, { "age": 100, - "asset": -1580309916, + "asset": 0, "cumulative_gap": 1133640548, "expense": 52992952, "gap": 43992952, diff --git a/fastapi/tests/golden/reduction_no_reduction.json b/fastapi/tests/golden/reduction_no_reduction.json index 9e034e4..d7bb05d 100644 --- a/fastapi/tests/golden/reduction_no_reduction.json +++ b/fastapi/tests/golden/reduction_no_reduction.json @@ -1,6 +1,7 @@ { "body": { "current_age": 60, + "depleted": true, "depletion_age": 74, "full_payment_income_threshold": 3097000, "monthly_reduction": 0, @@ -123,7 +124,7 @@ }, { "age": 74, - "asset": -9330875, + "asset": 0, "cumulative_gap": 145042006, "expense": 31667490, "gap": 13667490, @@ -131,7 +132,7 @@ }, { "age": 75, - "asset": -23688316, + "asset": 0, "cumulative_gap": 159342846, "expense": 32300840, "gap": 14300840, @@ -139,7 +140,7 @@ }, { "age": 76, - "asset": -39128831, + "asset": 0, "cumulative_gap": 174289703, "expense": 32946857, "gap": 14946857, @@ -147,7 +148,7 @@ }, { "age": 77, - "asset": -55697959, + "asset": 0, "cumulative_gap": 189895497, "expense": 33605794, "gap": 15605794, @@ -155,7 +156,7 @@ }, { "age": 78, - "asset": -73442865, + "asset": 0, "cumulative_gap": 206173407, "expense": 34277910, "gap": 16277910, @@ -163,7 +164,7 @@ }, { "age": 79, - "asset": -92412399, + "asset": 0, "cumulative_gap": 223136875, "expense": 34963468, "gap": 16963468, @@ -171,7 +172,7 @@ }, { "age": 80, - "asset": -112657143, + "asset": 0, "cumulative_gap": 240799613, "expense": 35662738, "gap": 17662738, @@ -179,7 +180,7 @@ }, { "age": 81, - "asset": -134229477, + "asset": 0, "cumulative_gap": 259175605, "expense": 36375992, "gap": 18375992, @@ -187,7 +188,7 @@ }, { "age": 82, - "asset": -157183633, + "asset": 0, "cumulative_gap": 278279117, "expense": 37103512, "gap": 19103512, @@ -195,7 +196,7 @@ }, { "age": 83, - "asset": -181575759, + "asset": 0, "cumulative_gap": 298124699, "expense": 37845582, "gap": 19845582, @@ -203,7 +204,7 @@ }, { "age": 84, - "asset": -207463982, + "asset": 0, "cumulative_gap": 318727193, "expense": 38602494, "gap": 20602494, @@ -211,7 +212,7 @@ }, { "age": 85, - "asset": -234908470, + "asset": 0, "cumulative_gap": 340101737, "expense": 39374544, "gap": 21374544, @@ -219,7 +220,7 @@ }, { "age": 86, - "asset": -263971505, + "asset": 0, "cumulative_gap": 362263772, "expense": 40162035, "gap": 22162035, @@ -227,7 +228,7 @@ }, { "age": 87, - "asset": -294717546, + "asset": 0, "cumulative_gap": 385229047, "expense": 40965275, "gap": 22965275, @@ -235,7 +236,7 @@ }, { "age": 88, - "asset": -327213306, + "asset": 0, "cumulative_gap": 409013628, "expense": 41784581, "gap": 23784581, @@ -243,7 +244,7 @@ }, { "age": 89, - "asset": -361527823, + "asset": 0, "cumulative_gap": 433633901, "expense": 42620273, "gap": 24620273, @@ -251,7 +252,7 @@ }, { "age": 90, - "asset": -397732539, + "asset": 0, "cumulative_gap": 459106579, "expense": 43472678, "gap": 25472678, @@ -259,7 +260,7 @@ }, { "age": 91, - "asset": -435901373, + "asset": 0, "cumulative_gap": 485448711, "expense": 44342132, "gap": 26342132, @@ -267,7 +268,7 @@ }, { "age": 92, - "asset": -476110810, + "asset": 0, "cumulative_gap": 512677685, "expense": 45228974, "gap": 27228974, @@ -275,7 +276,7 @@ }, { "age": 93, - "asset": -518439978, + "asset": 0, "cumulative_gap": 540811238, "expense": 46133554, "gap": 28133554, @@ -283,7 +284,7 @@ }, { "age": 94, - "asset": -562970737, + "asset": 0, "cumulative_gap": 569867463, "expense": 47056225, "gap": 29056225, @@ -291,7 +292,7 @@ }, { "age": 95, - "asset": -609787771, + "asset": 0, "cumulative_gap": 599864812, "expense": 47997349, "gap": 29997349, @@ -299,7 +300,7 @@ }, { "age": 96, - "asset": -658978674, + "asset": 0, "cumulative_gap": 630822109, "expense": 48957296, "gap": 30957296, @@ -307,7 +308,7 @@ }, { "age": 97, - "asset": -710634049, + "asset": 0, "cumulative_gap": 662758551, "expense": 49936442, "gap": 31936442, @@ -315,7 +316,7 @@ }, { "age": 98, - "asset": -764847606, + "asset": 0, "cumulative_gap": 695693722, "expense": 50935171, "gap": 32935171, @@ -323,7 +324,7 @@ }, { "age": 99, - "asset": -821716260, + "asset": 0, "cumulative_gap": 729647596, "expense": 51953874, "gap": 33953874, @@ -331,7 +332,7 @@ }, { "age": 100, - "asset": -881340239, + "asset": 0, "cumulative_gap": 764640548, "expense": 52992952, "gap": 34992952, diff --git a/fastapi/tests/golden/reduction_partial.json b/fastapi/tests/golden/reduction_partial.json index 33b488d..2b35fe1 100644 --- a/fastapi/tests/golden/reduction_partial.json +++ b/fastapi/tests/golden/reduction_partial.json @@ -1,6 +1,7 @@ { "body": { "current_age": 60, + "depleted": true, "depletion_age": 72, "full_payment_income_threshold": 3097000, "monthly_reduction": 140300, @@ -107,7 +108,7 @@ }, { "age": 72, - "asset": -8301391, + "asset": 0, "cumulative_gap": 140214757, "expense": 30437803, "gap": 14121403, @@ -115,7 +116,7 @@ }, { "age": 73, - "asset": -23095478, + "asset": 0, "cumulative_gap": 154944916, "expense": 31046559, "gap": 14730159, @@ -123,7 +124,7 @@ }, { "age": 74, - "asset": -38960407, + "asset": 0, "cumulative_gap": 170296006, "expense": 31667490, "gap": 15351090, @@ -131,7 +132,7 @@ }, { "age": 75, - "asset": -55940842, + "asset": 0, "cumulative_gap": 186280446, "expense": 32300840, "gap": 15984440, @@ -139,7 +140,7 @@ }, { "age": 76, - "asset": -74083040, + "asset": 0, "cumulative_gap": 202910903, "expense": 32946857, "gap": 16630457, @@ -147,7 +148,7 @@ }, { "age": 77, - "asset": -93434902, + "asset": 0, "cumulative_gap": 220200297, "expense": 33605794, "gap": 17289394, @@ -155,7 +156,7 @@ }, { "age": 78, - "asset": -114046025, + "asset": 0, "cumulative_gap": 238161807, "expense": 34277910, "gap": 17961510, @@ -163,7 +164,7 @@ }, { "age": 79, - "asset": -135967761, + "asset": 0, "cumulative_gap": 256808875, "expense": 34963468, "gap": 18647068, @@ -171,7 +172,7 @@ }, { "age": 80, - "asset": -159253274, + "asset": 0, "cumulative_gap": 276155213, "expense": 35662738, "gap": 19346338, @@ -179,7 +180,7 @@ }, { "age": 81, - "asset": -183957600, + "asset": 0, "cumulative_gap": 296214805, "expense": 36375992, "gap": 20059592, @@ -187,7 +188,7 @@ }, { "age": 82, - "asset": -210137708, + "asset": 0, "cumulative_gap": 317001917, "expense": 37103512, "gap": 20787112, @@ -195,7 +196,7 @@ }, { "age": 83, - "asset": -237852565, + "asset": 0, "cumulative_gap": 338531099, "expense": 37845582, "gap": 21529182, @@ -203,7 +204,7 @@ }, { "age": 84, - "asset": -267163199, + "asset": 0, "cumulative_gap": 360817193, "expense": 38602494, "gap": 22286094, @@ -211,7 +212,7 @@ }, { "age": 85, - "asset": -298132772, + "asset": 0, "cumulative_gap": 383875337, "expense": 39374544, "gap": 23058144, @@ -219,7 +220,7 @@ }, { "age": 86, - "asset": -330826644, + "asset": 0, "cumulative_gap": 407720972, "expense": 40162035, "gap": 23845635, @@ -227,7 +228,7 @@ }, { "age": 87, - "asset": -365312447, + "asset": 0, "cumulative_gap": 432369847, "expense": 40965275, "gap": 24648875, @@ -235,7 +236,7 @@ }, { "age": 88, - "asset": -401660162, + "asset": 0, "cumulative_gap": 457838028, "expense": 41784581, "gap": 25468181, @@ -243,7 +244,7 @@ }, { "age": 89, - "asset": -439942193, + "asset": 0, "cumulative_gap": 484141901, "expense": 42620273, "gap": 26303873, @@ -251,7 +252,7 @@ }, { "age": 90, - "asset": -480233448, + "asset": 0, "cumulative_gap": 511298179, "expense": 43472678, "gap": 27156278, @@ -259,7 +260,7 @@ }, { "age": 91, - "asset": -522611417, + "asset": 0, "cumulative_gap": 539323911, "expense": 44342132, "gap": 28025732, @@ -267,7 +268,7 @@ }, { "age": 92, - "asset": -567156263, + "asset": 0, "cumulative_gap": 568236485, "expense": 45228974, "gap": 28912574, @@ -275,7 +276,7 @@ }, { "age": 93, - "asset": -613950903, + "asset": 0, "cumulative_gap": 598053638, "expense": 46133554, "gap": 29817154, @@ -283,7 +284,7 @@ }, { "age": 94, - "asset": -663081098, + "asset": 0, "cumulative_gap": 628793463, "expense": 47056225, "gap": 30739825, @@ -291,7 +292,7 @@ }, { "age": 95, - "asset": -714635551, + "asset": 0, "cumulative_gap": 660474412, "expense": 47997349, "gap": 31680949, @@ -299,7 +300,7 @@ }, { "age": 96, - "asset": -768705995, + "asset": 0, "cumulative_gap": 693115309, "expense": 48957296, "gap": 32640896, @@ -307,7 +308,7 @@ }, { "age": 97, - "asset": -825387298, + "asset": 0, "cumulative_gap": 726735351, "expense": 49936442, "gap": 33620042, @@ -315,7 +316,7 @@ }, { "age": 98, - "asset": -884777560, + "asset": 0, "cumulative_gap": 761354122, "expense": 50935171, "gap": 34618771, @@ -323,7 +324,7 @@ }, { "age": 99, - "asset": -946978221, + "asset": 0, "cumulative_gap": 796991596, "expense": 51953874, "gap": 35637474, @@ -331,7 +332,7 @@ }, { "age": 100, - "asset": -1012094166, + "asset": 0, "cumulative_gap": 833668148, "expense": 52992952, "gap": 36676552, diff --git a/fastapi/tests/golden/scenarios_basic.json b/fastapi/tests/golden/scenarios_basic.json index a6cab3a..e701582 100644 --- a/fastapi/tests/golden/scenarios_basic.json +++ b/fastapi/tests/golden/scenarios_basic.json @@ -5,6 +5,7 @@ "scenarios": [ { "break_even_age": null, + "depleted": true, "depletion_age": 68, "scenario_type": "NORMAL", "timeline": [ @@ -74,7 +75,7 @@ }, { "age": 68, - "asset": -2351146, + "asset": 0, "cumulative_gap": 130638853, "expense": 35149781, "gap": 17149781, @@ -82,7 +83,7 @@ }, { "age": 69, - "asset": -20085955, + "asset": 0, "cumulative_gap": 148491630, "expense": 35852777, "gap": 17852777, @@ -90,7 +91,7 @@ }, { "age": 70, - "asset": -39076894, + "asset": 0, "cumulative_gap": 167061463, "expense": 36569833, "gap": 18569833, @@ -98,7 +99,7 @@ }, { "age": 71, - "asset": -59376128, + "asset": 0, "cumulative_gap": 186362692, "expense": 37301229, "gap": 19301229, @@ -106,7 +107,7 @@ }, { "age": 72, - "asset": -81037678, + "asset": 0, "cumulative_gap": 206409946, "expense": 38047254, "gap": 20047254, @@ -114,7 +115,7 @@ }, { "age": 73, - "asset": -104117480, + "asset": 0, "cumulative_gap": 227218145, "expense": 38808199, "gap": 20808199, @@ -122,7 +123,7 @@ }, { "age": 74, - "asset": -128673449, + "asset": 0, "cumulative_gap": 248802507, "expense": 39584363, "gap": 21584363, @@ -130,7 +131,7 @@ }, { "age": 75, - "asset": -154765547, + "asset": 0, "cumulative_gap": 271178558, "expense": 40376050, "gap": 22376050, @@ -138,7 +139,7 @@ }, { "age": 76, - "asset": -182455845, + "asset": 0, "cumulative_gap": 294362129, "expense": 41183571, "gap": 23183571, @@ -146,7 +147,7 @@ }, { "age": 77, - "asset": -211808598, + "asset": 0, "cumulative_gap": 318369371, "expense": 42007243, "gap": 24007243, @@ -154,7 +155,7 @@ }, { "age": 78, - "asset": -242890316, + "asset": 0, "cumulative_gap": 343216759, "expense": 42847387, "gap": 24847387, @@ -162,7 +163,7 @@ }, { "age": 79, - "asset": -275769835, + "asset": 0, "cumulative_gap": 368921094, "expense": 43704335, "gap": 25704335, @@ -170,7 +171,7 @@ }, { "age": 80, - "asset": -310518395, + "asset": 0, "cumulative_gap": 395499516, "expense": 44578422, "gap": 26578422, @@ -178,7 +179,7 @@ }, { "age": 81, - "asset": -347209721, + "asset": 0, "cumulative_gap": 422969506, "expense": 45469990, "gap": 27469990, @@ -186,7 +187,7 @@ }, { "age": 82, - "asset": -385920103, + "asset": 0, "cumulative_gap": 451348896, "expense": 46379390, "gap": 28379390, @@ -194,7 +195,7 @@ }, { "age": 83, - "asset": -426728478, + "asset": 0, "cumulative_gap": 480655874, "expense": 47306978, "gap": 29306978, @@ -202,7 +203,7 @@ }, { "age": 84, - "asset": -469716520, + "asset": 0, "cumulative_gap": 510908992, "expense": 48253117, "gap": 30253117, @@ -210,7 +211,7 @@ }, { "age": 85, - "asset": -514968726, + "asset": 0, "cumulative_gap": 542127172, "expense": 49218180, "gap": 31218180, @@ -218,7 +219,7 @@ }, { "age": 86, - "asset": -562572513, + "asset": 0, "cumulative_gap": 574329715, "expense": 50202543, "gap": 32202543, @@ -226,7 +227,7 @@ }, { "age": 87, - "asset": -612618308, + "asset": 0, "cumulative_gap": 607536309, "expense": 51206594, "gap": 33206594, @@ -234,7 +235,7 @@ }, { "age": 88, - "asset": -665199650, + "asset": 0, "cumulative_gap": 641767035, "expense": 52230726, "gap": 34230726, @@ -242,7 +243,7 @@ }, { "age": 89, - "asset": -720413287, + "asset": 0, "cumulative_gap": 677042376, "expense": 53275341, "gap": 35275341, @@ -250,7 +251,7 @@ }, { "age": 90, - "asset": -778359287, + "asset": 0, "cumulative_gap": 713383224, "expense": 54340848, "gap": 36340848, @@ -258,7 +259,7 @@ }, { "age": 91, - "asset": -839141138, + "asset": 0, "cumulative_gap": 750810888, "expense": 55427664, "gap": 37427664, @@ -266,7 +267,7 @@ }, { "age": 92, - "asset": -902865867, + "asset": 0, "cumulative_gap": 789347106, "expense": 56536218, "gap": 38536218, @@ -274,7 +275,7 @@ }, { "age": 93, - "asset": -969644147, + "asset": 0, "cumulative_gap": 829014048, "expense": 57666942, "gap": 39666942, @@ -282,7 +283,7 @@ }, { "age": 94, - "asset": -1039590422, + "asset": 0, "cumulative_gap": 869834329, "expense": 58820281, "gap": 40820281, @@ -290,7 +291,7 @@ }, { "age": 95, - "asset": -1112823024, + "asset": 0, "cumulative_gap": 911831016, "expense": 59996687, "gap": 41996687, @@ -298,7 +299,7 @@ }, { "age": 96, - "asset": -1189464302, + "asset": 0, "cumulative_gap": 955027636, "expense": 61196620, "gap": 43196620, @@ -306,7 +307,7 @@ }, { "age": 97, - "asset": -1269640750, + "asset": 0, "cumulative_gap": 999448189, "expense": 62420553, "gap": 44420553, @@ -314,7 +315,7 @@ }, { "age": 98, - "asset": -1353483142, + "asset": 0, "cumulative_gap": 1045117152, "expense": 63668964, "gap": 45668964, @@ -322,7 +323,7 @@ }, { "age": 99, - "asset": -1441126669, + "asset": 0, "cumulative_gap": 1092059495, "expense": 64942343, "gap": 46942343, @@ -330,7 +331,7 @@ }, { "age": 100, - "asset": -1532711082, + "asset": 0, "cumulative_gap": 1140300685, "expense": 66241190, "gap": 48241190, @@ -341,6 +342,7 @@ }, { "break_even_age": 60, + "depleted": true, "depletion_age": 66, "scenario_type": "EARLY", "timeline": [ @@ -394,7 +396,7 @@ }, { "age": 66, - "asset": -431252, + "asset": 0, "cumulative_gap": 128528501, "expense": 33784873, "gap": 20284873, @@ -402,7 +404,7 @@ }, { "age": 67, - "asset": -21337608, + "asset": 0, "cumulative_gap": 149489072, "expense": 34460570, "gap": 20960570, @@ -410,7 +412,7 @@ }, { "age": 68, - "asset": -43567123, + "asset": 0, "cumulative_gap": 171138853, "expense": 35149781, "gap": 21649781, @@ -418,7 +420,7 @@ }, { "age": 69, - "asset": -67173412, + "asset": 0, "cumulative_gap": 193491630, "expense": 35852777, "gap": 22352777, @@ -426,7 +428,7 @@ }, { "age": 70, - "asset": -92211975, + "asset": 0, "cumulative_gap": 216561463, "expense": 36569833, "gap": 23069833, @@ -434,7 +436,7 @@ }, { "age": 71, - "asset": -118740261, + "asset": 0, "cumulative_gap": 240362692, "expense": 37301229, "gap": 23801229, @@ -442,7 +444,7 @@ }, { "age": 72, - "asset": -146817735, + "asset": 0, "cumulative_gap": 264909946, "expense": 38047254, "gap": 24547254, @@ -450,7 +452,7 @@ }, { "age": 73, - "asset": -176505939, + "asset": 0, "cumulative_gap": 290218145, "expense": 38808199, "gap": 25308199, @@ -458,7 +460,7 @@ }, { "age": 74, - "asset": -207868562, + "asset": 0, "cumulative_gap": 316302507, "expense": 39584363, "gap": 26084363, @@ -466,7 +468,7 @@ }, { "age": 75, - "asset": -240971513, + "asset": 0, "cumulative_gap": 343178558, "expense": 40376050, "gap": 26876050, @@ -474,7 +476,7 @@ }, { "age": 76, - "asset": -275882990, + "asset": 0, "cumulative_gap": 370862129, "expense": 41183571, "gap": 27683571, @@ -482,7 +484,7 @@ }, { "age": 77, - "asset": -312673558, + "asset": 0, "cumulative_gap": 399369371, "expense": 42007243, "gap": 28507243, @@ -490,7 +492,7 @@ }, { "age": 78, - "asset": -351416224, + "asset": 0, "cumulative_gap": 428716759, "expense": 42847387, "gap": 29347387, @@ -498,7 +500,7 @@ }, { "age": 79, - "asset": -392186520, + "asset": 0, "cumulative_gap": 458921094, "expense": 43704335, "gap": 30204335, @@ -506,7 +508,7 @@ }, { "age": 80, - "asset": -435062581, + "asset": 0, "cumulative_gap": 489999516, "expense": 44578422, "gap": 31078422, @@ -514,7 +516,7 @@ }, { "age": 81, - "asset": -480125233, + "asset": 0, "cumulative_gap": 521969506, "expense": 45469990, "gap": 31969990, @@ -522,7 +524,7 @@ }, { "age": 82, - "asset": -527458080, + "asset": 0, "cumulative_gap": 554848896, "expense": 46379390, "gap": 32879390, @@ -530,7 +532,7 @@ }, { "age": 83, - "asset": -577147594, + "asset": 0, "cumulative_gap": 588655874, "expense": 47306978, "gap": 33806978, @@ -538,7 +540,7 @@ }, { "age": 84, - "asset": -629283209, + "asset": 0, "cumulative_gap": 623408992, "expense": 48253117, "gap": 34753117, @@ -546,7 +548,7 @@ }, { "age": 85, - "asset": -683957416, + "asset": 0, "cumulative_gap": 659127172, "expense": 49218180, "gap": 35718180, @@ -554,7 +556,7 @@ }, { "age": 86, - "asset": -741265864, + "asset": 0, "cumulative_gap": 695829715, "expense": 50202543, "gap": 36702543, @@ -562,7 +564,7 @@ }, { "age": 87, - "asset": -801307460, + "asset": 0, "cumulative_gap": 733536309, "expense": 51206594, "gap": 37706594, @@ -570,7 +572,7 @@ }, { "age": 88, - "asset": -864184476, + "asset": 0, "cumulative_gap": 772267035, "expense": 52230726, "gap": 38730726, @@ -578,7 +580,7 @@ }, { "age": 89, - "asset": -930002658, + "asset": 0, "cumulative_gap": 812042376, "expense": 53275341, "gap": 39775341, @@ -586,7 +588,7 @@ }, { "age": 90, - "asset": -998871339, + "asset": 0, "cumulative_gap": 852883224, "expense": 54340848, "gap": 40840848, @@ -594,7 +596,7 @@ }, { "age": 91, - "asset": -1070903552, + "asset": 0, "cumulative_gap": 894810888, "expense": 55427664, "gap": 41927664, @@ -602,7 +604,7 @@ }, { "age": 92, - "asset": -1146216153, + "asset": 0, "cumulative_gap": 937847106, "expense": 56536218, "gap": 43036218, @@ -610,7 +612,7 @@ }, { "age": 93, - "asset": -1224929942, + "asset": 0, "cumulative_gap": 982014048, "expense": 57666942, "gap": 44166942, @@ -618,7 +620,7 @@ }, { "age": 94, - "asset": -1307169790, + "asset": 0, "cumulative_gap": 1027334329, "expense": 58820281, "gap": 45320281, @@ -626,7 +628,7 @@ }, { "age": 95, - "asset": -1393064773, + "asset": 0, "cumulative_gap": 1073831016, "expense": 59996687, "gap": 46496687, @@ -634,7 +636,7 @@ }, { "age": 96, - "asset": -1482748304, + "asset": 0, "cumulative_gap": 1121527636, "expense": 61196620, "gap": 47696620, @@ -642,7 +644,7 @@ }, { "age": 97, - "asset": -1576358272, + "asset": 0, "cumulative_gap": 1170448189, "expense": 62420553, "gap": 48920553, @@ -650,7 +652,7 @@ }, { "age": 98, - "asset": -1674037189, + "asset": 0, "cumulative_gap": 1220617152, "expense": 63668964, "gap": 50168964, @@ -658,7 +660,7 @@ }, { "age": 99, - "asset": -1775932337, + "asset": 0, "cumulative_gap": 1272059495, "expense": 64942343, "gap": 51442343, @@ -666,7 +668,7 @@ }, { "age": 100, - "asset": -1882195921, + "asset": 0, "cumulative_gap": 1324800685, "expense": 66241190, "gap": 52741190, @@ -677,6 +679,7 @@ }, { "break_even_age": 64, + "depleted": true, "depletion_age": 67, "scenario_type": "LUMP_SUM", "timeline": [ @@ -738,7 +741,7 @@ }, { "age": 67, - "asset": -22960530, + "asset": 0, "cumulative_gap": 257489072, "expense": 34460570, "gap": 34460570, @@ -746,7 +749,7 @@ }, { "age": 68, - "asset": -59143733, + "asset": 0, "cumulative_gap": 292638853, "expense": 35149781, "gap": 35149781, @@ -754,7 +757,7 @@ }, { "age": 69, - "asset": -97122320, + "asset": 0, "cumulative_gap": 328491630, "expense": 35852777, "gap": 35852777, @@ -762,7 +765,7 @@ }, { "age": 70, - "asset": -136964350, + "asset": 0, "cumulative_gap": 365061463, "expense": 36569833, "gap": 36569833, @@ -770,7 +773,7 @@ }, { "age": 71, - "asset": -178740208, + "asset": 0, "cumulative_gap": 402362692, "expense": 37301229, "gap": 37301229, @@ -778,7 +781,7 @@ }, { "age": 72, - "asset": -222522681, + "asset": 0, "cumulative_gap": 440409946, "expense": 38047254, "gap": 38047254, @@ -786,7 +789,7 @@ }, { "age": 73, - "asset": -268387033, + "asset": 0, "cumulative_gap": 479218145, "expense": 38808199, "gap": 38808199, @@ -794,7 +797,7 @@ }, { "age": 74, - "asset": -316411089, + "asset": 0, "cumulative_gap": 518802507, "expense": 39584363, "gap": 39584363, @@ -802,7 +805,7 @@ }, { "age": 75, - "asset": -366675315, + "asset": 0, "cumulative_gap": 559178558, "expense": 40376050, "gap": 40376050, @@ -810,7 +813,7 @@ }, { "age": 76, - "asset": -419262906, + "asset": 0, "cumulative_gap": 600362129, "expense": 41183571, "gap": 41183571, @@ -818,7 +821,7 @@ }, { "age": 77, - "asset": -474259872, + "asset": 0, "cumulative_gap": 642369371, "expense": 42007243, "gap": 42007243, @@ -826,7 +829,7 @@ }, { "age": 78, - "asset": -531755128, + "asset": 0, "cumulative_gap": 685216759, "expense": 42847387, "gap": 42847387, @@ -834,7 +837,7 @@ }, { "age": 79, - "asset": -591840590, + "asset": 0, "cumulative_gap": 728921094, "expense": 43704335, "gap": 43704335, @@ -842,7 +845,7 @@ }, { "age": 80, - "asset": -654611273, + "asset": 0, "cumulative_gap": 773499516, "expense": 44578422, "gap": 44578422, @@ -850,7 +853,7 @@ }, { "age": 81, - "asset": -720165386, + "asset": 0, "cumulative_gap": 818969506, "expense": 45469990, "gap": 45469990, @@ -858,7 +861,7 @@ }, { "age": 82, - "asset": -788604438, + "asset": 0, "cumulative_gap": 865348896, "expense": 46379390, "gap": 46379390, @@ -866,7 +869,7 @@ }, { "age": 83, - "asset": -860033343, + "asset": 0, "cumulative_gap": 912655874, "expense": 47306978, "gap": 47306978, @@ -874,7 +877,7 @@ }, { "age": 84, - "asset": -934560530, + "asset": 0, "cumulative_gap": 960908992, "expense": 48253117, "gap": 48253117, @@ -882,7 +885,7 @@ }, { "age": 85, - "asset": -1012298057, + "asset": 0, "cumulative_gap": 1010127172, "expense": 49218180, "gap": 49218180, @@ -890,7 +893,7 @@ }, { "age": 86, - "asset": -1093361724, + "asset": 0, "cumulative_gap": 1060329715, "expense": 50202543, "gap": 50202543, @@ -898,7 +901,7 @@ }, { "age": 87, - "asset": -1177871196, + "asset": 0, "cumulative_gap": 1111536309, "expense": 51206594, "gap": 51206594, @@ -906,7 +909,7 @@ }, { "age": 88, - "asset": -1265950124, + "asset": 0, "cumulative_gap": 1163767035, "expense": 52230726, "gap": 52230726, @@ -914,7 +917,7 @@ }, { "age": 89, - "asset": -1357726275, + "asset": 0, "cumulative_gap": 1217042376, "expense": 53275341, "gap": 53275341, @@ -922,7 +925,7 @@ }, { "age": 90, - "asset": -1453331664, + "asset": 0, "cumulative_gap": 1271383224, "expense": 54340848, "gap": 54340848, @@ -930,7 +933,7 @@ }, { "age": 91, - "asset": -1552902687, + "asset": 0, "cumulative_gap": 1326810888, "expense": 55427664, "gap": 55427664, @@ -938,7 +941,7 @@ }, { "age": 92, - "asset": -1656580262, + "asset": 0, "cumulative_gap": 1383347106, "expense": 56536218, "gap": 56536218, @@ -946,7 +949,7 @@ }, { "age": 93, - "asset": -1764509974, + "asset": 0, "cumulative_gap": 1441014048, "expense": 57666942, "gap": 57666942, @@ -954,7 +957,7 @@ }, { "age": 94, - "asset": -1876842224, + "asset": 0, "cumulative_gap": 1499834329, "expense": 58820281, "gap": 58820281, @@ -962,7 +965,7 @@ }, { "age": 95, - "asset": -1993732380, + "asset": 0, "cumulative_gap": 1559831016, "expense": 59996687, "gap": 59996687, @@ -970,7 +973,7 @@ }, { "age": 96, - "asset": -2115340939, + "asset": 0, "cumulative_gap": 1621027636, "expense": 61196620, "gap": 61196620, @@ -978,7 +981,7 @@ }, { "age": 97, - "asset": -2241833686, + "asset": 0, "cumulative_gap": 1683448189, "expense": 62420553, "gap": 62420553, @@ -986,7 +989,7 @@ }, { "age": 98, - "asset": -2373381866, + "asset": 0, "cumulative_gap": 1747117152, "expense": 63668964, "gap": 63668964, @@ -994,7 +997,7 @@ }, { "age": 99, - "asset": -2510162354, + "asset": 0, "cumulative_gap": 1812059495, "expense": 64942343, "gap": 64942343, @@ -1002,7 +1005,7 @@ }, { "age": 100, - "asset": -2652357838, + "asset": 0, "cumulative_gap": 1878300685, "expense": 66241190, "gap": 66241190, @@ -1013,6 +1016,7 @@ }, { "break_even_age": 64, + "depleted": true, "depletion_age": 67, "scenario_type": "INSTALLMENT", "timeline": [ @@ -1074,7 +1078,7 @@ }, { "age": 67, - "asset": -20226261, + "asset": 0, "cumulative_gap": 208529072, "expense": 34460570, "gap": 28340570, @@ -1082,7 +1086,7 @@ }, { "age": 68, - "asset": -50023835, + "asset": 0, "cumulative_gap": 237558853, "expense": 35149781, "gap": 29029781, @@ -1090,7 +1094,7 @@ }, { "age": 69, - "asset": -81425225, + "asset": 0, "cumulative_gap": 267291630, "expense": 35852777, "gap": 29732777, @@ -1098,7 +1102,7 @@ }, { "age": 70, - "asset": -114492743, + "asset": 0, "cumulative_gap": 297741463, "expense": 36569833, "gap": 30449833, @@ -1106,7 +1110,7 @@ }, { "age": 71, - "asset": -149290852, + "asset": 0, "cumulative_gap": 328922692, "expense": 37301229, "gap": 31181229, @@ -1114,7 +1118,7 @@ }, { "age": 72, - "asset": -185886244, + "asset": 0, "cumulative_gap": 360849946, "expense": 38047254, "gap": 31927254, @@ -1122,7 +1126,7 @@ }, { "age": 73, - "asset": -224347903, + "asset": 0, "cumulative_gap": 393538145, "expense": 38808199, "gap": 32688199, @@ -1130,7 +1134,7 @@ }, { "age": 74, - "asset": -264747185, + "asset": 0, "cumulative_gap": 427002507, "expense": 39584363, "gap": 33464363, @@ -1138,7 +1142,7 @@ }, { "age": 75, - "asset": -307157894, + "asset": 0, "cumulative_gap": 461258558, "expense": 40376050, "gap": 34256050, @@ -1146,7 +1150,7 @@ }, { "age": 76, - "asset": -351656363, + "asset": 0, "cumulative_gap": 496322129, "expense": 41183571, "gap": 35063571, @@ -1154,7 +1158,7 @@ }, { "age": 77, - "asset": -398321532, + "asset": 0, "cumulative_gap": 532209371, "expense": 42007243, "gap": 35887243, @@ -1162,7 +1166,7 @@ }, { "age": 78, - "asset": -447235038, + "asset": 0, "cumulative_gap": 568936759, "expense": 42847387, "gap": 36727387, @@ -1170,7 +1174,7 @@ }, { "age": 79, - "asset": -498481298, + "asset": 0, "cumulative_gap": 606521094, "expense": 43704335, "gap": 37584335, @@ -1178,7 +1182,7 @@ }, { "age": 80, - "asset": -552147602, + "asset": 0, "cumulative_gap": 644979516, "expense": 44578422, "gap": 38458422, @@ -1186,7 +1190,7 @@ }, { "age": 81, - "asset": -608324205, + "asset": 0, "cumulative_gap": 684329506, "expense": 45469990, "gap": 39349990, @@ -1194,7 +1198,7 @@ }, { "age": 82, - "asset": -667104421, + "asset": 0, "cumulative_gap": 724588896, "expense": 46379390, "gap": 40259390, @@ -1202,7 +1206,7 @@ }, { "age": 83, - "asset": -728584725, + "asset": 0, "cumulative_gap": 765775874, "expense": 47306978, "gap": 41186978, @@ -1210,7 +1214,7 @@ }, { "age": 84, - "asset": -792864854, + "asset": 0, "cumulative_gap": 807908992, "expense": 48253117, "gap": 42133117, @@ -1218,7 +1222,7 @@ }, { "age": 85, - "asset": -860047911, + "asset": 0, "cumulative_gap": 851007172, "expense": 49218180, "gap": 43098180, @@ -1226,7 +1230,7 @@ }, { "age": 86, - "asset": -930240473, + "asset": 0, "cumulative_gap": 895089715, "expense": 50202543, "gap": 44082543, @@ -1234,7 +1238,7 @@ }, { "age": 87, - "asset": -1003552707, + "asset": 0, "cumulative_gap": 940176309, "expense": 51206594, "gap": 45086594, @@ -1242,7 +1246,7 @@ }, { "age": 88, - "asset": -1080098481, + "asset": 0, "cumulative_gap": 986287035, "expense": 52230726, "gap": 46110726, @@ -1250,7 +1254,7 @@ }, { "age": 89, - "asset": -1159995483, + "asset": 0, "cumulative_gap": 1033442376, "expense": 53275341, "gap": 47155341, @@ -1258,7 +1262,7 @@ }, { "age": 90, - "asset": -1243365349, + "asset": 0, "cumulative_gap": 1081663224, "expense": 54340848, "gap": 48220848, @@ -1266,7 +1270,7 @@ }, { "age": 91, - "asset": -1330333782, + "asset": 0, "cumulative_gap": 1130970888, "expense": 55427664, "gap": 49307664, @@ -1274,7 +1278,7 @@ }, { "age": 92, - "asset": -1421030690, + "asset": 0, "cumulative_gap": 1181387106, "expense": 56536218, "gap": 50416218, @@ -1282,7 +1286,7 @@ }, { "age": 93, - "asset": -1515590315, + "asset": 0, "cumulative_gap": 1232934048, "expense": 57666942, "gap": 51546942, @@ -1290,7 +1294,7 @@ }, { "age": 94, - "asset": -1614151375, + "asset": 0, "cumulative_gap": 1285634329, "expense": 58820281, "gap": 52700281, @@ -1298,7 +1302,7 @@ }, { "age": 95, - "asset": -1716857205, + "asset": 0, "cumulative_gap": 1339511016, "expense": 59996687, "gap": 53876687, @@ -1306,7 +1310,7 @@ }, { "age": 96, - "asset": -1823855909, + "asset": 0, "cumulative_gap": 1394587636, "expense": 61196620, "gap": 55076620, @@ -1314,7 +1318,7 @@ }, { "age": 97, - "asset": -1935300505, + "asset": 0, "cumulative_gap": 1450888189, "expense": 62420553, "gap": 56300553, @@ -1322,7 +1326,7 @@ }, { "age": 98, - "asset": -2051349089, + "asset": 0, "cumulative_gap": 1508437152, "expense": 63668964, "gap": 57548964, @@ -1330,7 +1334,7 @@ }, { "age": 99, - "asset": -2172164995, + "asset": 0, "cumulative_gap": 1567259495, "expense": 64942343, "gap": 58822343, @@ -1338,7 +1342,7 @@ }, { "age": 100, - "asset": -2297916958, + "asset": 0, "cumulative_gap": 1627380685, "expense": 66241190, "gap": 60121190, diff --git a/fastapi/tests/golden/scenarios_with_deduction_years.json b/fastapi/tests/golden/scenarios_with_deduction_years.json index a6cab3a..e701582 100644 --- a/fastapi/tests/golden/scenarios_with_deduction_years.json +++ b/fastapi/tests/golden/scenarios_with_deduction_years.json @@ -5,6 +5,7 @@ "scenarios": [ { "break_even_age": null, + "depleted": true, "depletion_age": 68, "scenario_type": "NORMAL", "timeline": [ @@ -74,7 +75,7 @@ }, { "age": 68, - "asset": -2351146, + "asset": 0, "cumulative_gap": 130638853, "expense": 35149781, "gap": 17149781, @@ -82,7 +83,7 @@ }, { "age": 69, - "asset": -20085955, + "asset": 0, "cumulative_gap": 148491630, "expense": 35852777, "gap": 17852777, @@ -90,7 +91,7 @@ }, { "age": 70, - "asset": -39076894, + "asset": 0, "cumulative_gap": 167061463, "expense": 36569833, "gap": 18569833, @@ -98,7 +99,7 @@ }, { "age": 71, - "asset": -59376128, + "asset": 0, "cumulative_gap": 186362692, "expense": 37301229, "gap": 19301229, @@ -106,7 +107,7 @@ }, { "age": 72, - "asset": -81037678, + "asset": 0, "cumulative_gap": 206409946, "expense": 38047254, "gap": 20047254, @@ -114,7 +115,7 @@ }, { "age": 73, - "asset": -104117480, + "asset": 0, "cumulative_gap": 227218145, "expense": 38808199, "gap": 20808199, @@ -122,7 +123,7 @@ }, { "age": 74, - "asset": -128673449, + "asset": 0, "cumulative_gap": 248802507, "expense": 39584363, "gap": 21584363, @@ -130,7 +131,7 @@ }, { "age": 75, - "asset": -154765547, + "asset": 0, "cumulative_gap": 271178558, "expense": 40376050, "gap": 22376050, @@ -138,7 +139,7 @@ }, { "age": 76, - "asset": -182455845, + "asset": 0, "cumulative_gap": 294362129, "expense": 41183571, "gap": 23183571, @@ -146,7 +147,7 @@ }, { "age": 77, - "asset": -211808598, + "asset": 0, "cumulative_gap": 318369371, "expense": 42007243, "gap": 24007243, @@ -154,7 +155,7 @@ }, { "age": 78, - "asset": -242890316, + "asset": 0, "cumulative_gap": 343216759, "expense": 42847387, "gap": 24847387, @@ -162,7 +163,7 @@ }, { "age": 79, - "asset": -275769835, + "asset": 0, "cumulative_gap": 368921094, "expense": 43704335, "gap": 25704335, @@ -170,7 +171,7 @@ }, { "age": 80, - "asset": -310518395, + "asset": 0, "cumulative_gap": 395499516, "expense": 44578422, "gap": 26578422, @@ -178,7 +179,7 @@ }, { "age": 81, - "asset": -347209721, + "asset": 0, "cumulative_gap": 422969506, "expense": 45469990, "gap": 27469990, @@ -186,7 +187,7 @@ }, { "age": 82, - "asset": -385920103, + "asset": 0, "cumulative_gap": 451348896, "expense": 46379390, "gap": 28379390, @@ -194,7 +195,7 @@ }, { "age": 83, - "asset": -426728478, + "asset": 0, "cumulative_gap": 480655874, "expense": 47306978, "gap": 29306978, @@ -202,7 +203,7 @@ }, { "age": 84, - "asset": -469716520, + "asset": 0, "cumulative_gap": 510908992, "expense": 48253117, "gap": 30253117, @@ -210,7 +211,7 @@ }, { "age": 85, - "asset": -514968726, + "asset": 0, "cumulative_gap": 542127172, "expense": 49218180, "gap": 31218180, @@ -218,7 +219,7 @@ }, { "age": 86, - "asset": -562572513, + "asset": 0, "cumulative_gap": 574329715, "expense": 50202543, "gap": 32202543, @@ -226,7 +227,7 @@ }, { "age": 87, - "asset": -612618308, + "asset": 0, "cumulative_gap": 607536309, "expense": 51206594, "gap": 33206594, @@ -234,7 +235,7 @@ }, { "age": 88, - "asset": -665199650, + "asset": 0, "cumulative_gap": 641767035, "expense": 52230726, "gap": 34230726, @@ -242,7 +243,7 @@ }, { "age": 89, - "asset": -720413287, + "asset": 0, "cumulative_gap": 677042376, "expense": 53275341, "gap": 35275341, @@ -250,7 +251,7 @@ }, { "age": 90, - "asset": -778359287, + "asset": 0, "cumulative_gap": 713383224, "expense": 54340848, "gap": 36340848, @@ -258,7 +259,7 @@ }, { "age": 91, - "asset": -839141138, + "asset": 0, "cumulative_gap": 750810888, "expense": 55427664, "gap": 37427664, @@ -266,7 +267,7 @@ }, { "age": 92, - "asset": -902865867, + "asset": 0, "cumulative_gap": 789347106, "expense": 56536218, "gap": 38536218, @@ -274,7 +275,7 @@ }, { "age": 93, - "asset": -969644147, + "asset": 0, "cumulative_gap": 829014048, "expense": 57666942, "gap": 39666942, @@ -282,7 +283,7 @@ }, { "age": 94, - "asset": -1039590422, + "asset": 0, "cumulative_gap": 869834329, "expense": 58820281, "gap": 40820281, @@ -290,7 +291,7 @@ }, { "age": 95, - "asset": -1112823024, + "asset": 0, "cumulative_gap": 911831016, "expense": 59996687, "gap": 41996687, @@ -298,7 +299,7 @@ }, { "age": 96, - "asset": -1189464302, + "asset": 0, "cumulative_gap": 955027636, "expense": 61196620, "gap": 43196620, @@ -306,7 +307,7 @@ }, { "age": 97, - "asset": -1269640750, + "asset": 0, "cumulative_gap": 999448189, "expense": 62420553, "gap": 44420553, @@ -314,7 +315,7 @@ }, { "age": 98, - "asset": -1353483142, + "asset": 0, "cumulative_gap": 1045117152, "expense": 63668964, "gap": 45668964, @@ -322,7 +323,7 @@ }, { "age": 99, - "asset": -1441126669, + "asset": 0, "cumulative_gap": 1092059495, "expense": 64942343, "gap": 46942343, @@ -330,7 +331,7 @@ }, { "age": 100, - "asset": -1532711082, + "asset": 0, "cumulative_gap": 1140300685, "expense": 66241190, "gap": 48241190, @@ -341,6 +342,7 @@ }, { "break_even_age": 60, + "depleted": true, "depletion_age": 66, "scenario_type": "EARLY", "timeline": [ @@ -394,7 +396,7 @@ }, { "age": 66, - "asset": -431252, + "asset": 0, "cumulative_gap": 128528501, "expense": 33784873, "gap": 20284873, @@ -402,7 +404,7 @@ }, { "age": 67, - "asset": -21337608, + "asset": 0, "cumulative_gap": 149489072, "expense": 34460570, "gap": 20960570, @@ -410,7 +412,7 @@ }, { "age": 68, - "asset": -43567123, + "asset": 0, "cumulative_gap": 171138853, "expense": 35149781, "gap": 21649781, @@ -418,7 +420,7 @@ }, { "age": 69, - "asset": -67173412, + "asset": 0, "cumulative_gap": 193491630, "expense": 35852777, "gap": 22352777, @@ -426,7 +428,7 @@ }, { "age": 70, - "asset": -92211975, + "asset": 0, "cumulative_gap": 216561463, "expense": 36569833, "gap": 23069833, @@ -434,7 +436,7 @@ }, { "age": 71, - "asset": -118740261, + "asset": 0, "cumulative_gap": 240362692, "expense": 37301229, "gap": 23801229, @@ -442,7 +444,7 @@ }, { "age": 72, - "asset": -146817735, + "asset": 0, "cumulative_gap": 264909946, "expense": 38047254, "gap": 24547254, @@ -450,7 +452,7 @@ }, { "age": 73, - "asset": -176505939, + "asset": 0, "cumulative_gap": 290218145, "expense": 38808199, "gap": 25308199, @@ -458,7 +460,7 @@ }, { "age": 74, - "asset": -207868562, + "asset": 0, "cumulative_gap": 316302507, "expense": 39584363, "gap": 26084363, @@ -466,7 +468,7 @@ }, { "age": 75, - "asset": -240971513, + "asset": 0, "cumulative_gap": 343178558, "expense": 40376050, "gap": 26876050, @@ -474,7 +476,7 @@ }, { "age": 76, - "asset": -275882990, + "asset": 0, "cumulative_gap": 370862129, "expense": 41183571, "gap": 27683571, @@ -482,7 +484,7 @@ }, { "age": 77, - "asset": -312673558, + "asset": 0, "cumulative_gap": 399369371, "expense": 42007243, "gap": 28507243, @@ -490,7 +492,7 @@ }, { "age": 78, - "asset": -351416224, + "asset": 0, "cumulative_gap": 428716759, "expense": 42847387, "gap": 29347387, @@ -498,7 +500,7 @@ }, { "age": 79, - "asset": -392186520, + "asset": 0, "cumulative_gap": 458921094, "expense": 43704335, "gap": 30204335, @@ -506,7 +508,7 @@ }, { "age": 80, - "asset": -435062581, + "asset": 0, "cumulative_gap": 489999516, "expense": 44578422, "gap": 31078422, @@ -514,7 +516,7 @@ }, { "age": 81, - "asset": -480125233, + "asset": 0, "cumulative_gap": 521969506, "expense": 45469990, "gap": 31969990, @@ -522,7 +524,7 @@ }, { "age": 82, - "asset": -527458080, + "asset": 0, "cumulative_gap": 554848896, "expense": 46379390, "gap": 32879390, @@ -530,7 +532,7 @@ }, { "age": 83, - "asset": -577147594, + "asset": 0, "cumulative_gap": 588655874, "expense": 47306978, "gap": 33806978, @@ -538,7 +540,7 @@ }, { "age": 84, - "asset": -629283209, + "asset": 0, "cumulative_gap": 623408992, "expense": 48253117, "gap": 34753117, @@ -546,7 +548,7 @@ }, { "age": 85, - "asset": -683957416, + "asset": 0, "cumulative_gap": 659127172, "expense": 49218180, "gap": 35718180, @@ -554,7 +556,7 @@ }, { "age": 86, - "asset": -741265864, + "asset": 0, "cumulative_gap": 695829715, "expense": 50202543, "gap": 36702543, @@ -562,7 +564,7 @@ }, { "age": 87, - "asset": -801307460, + "asset": 0, "cumulative_gap": 733536309, "expense": 51206594, "gap": 37706594, @@ -570,7 +572,7 @@ }, { "age": 88, - "asset": -864184476, + "asset": 0, "cumulative_gap": 772267035, "expense": 52230726, "gap": 38730726, @@ -578,7 +580,7 @@ }, { "age": 89, - "asset": -930002658, + "asset": 0, "cumulative_gap": 812042376, "expense": 53275341, "gap": 39775341, @@ -586,7 +588,7 @@ }, { "age": 90, - "asset": -998871339, + "asset": 0, "cumulative_gap": 852883224, "expense": 54340848, "gap": 40840848, @@ -594,7 +596,7 @@ }, { "age": 91, - "asset": -1070903552, + "asset": 0, "cumulative_gap": 894810888, "expense": 55427664, "gap": 41927664, @@ -602,7 +604,7 @@ }, { "age": 92, - "asset": -1146216153, + "asset": 0, "cumulative_gap": 937847106, "expense": 56536218, "gap": 43036218, @@ -610,7 +612,7 @@ }, { "age": 93, - "asset": -1224929942, + "asset": 0, "cumulative_gap": 982014048, "expense": 57666942, "gap": 44166942, @@ -618,7 +620,7 @@ }, { "age": 94, - "asset": -1307169790, + "asset": 0, "cumulative_gap": 1027334329, "expense": 58820281, "gap": 45320281, @@ -626,7 +628,7 @@ }, { "age": 95, - "asset": -1393064773, + "asset": 0, "cumulative_gap": 1073831016, "expense": 59996687, "gap": 46496687, @@ -634,7 +636,7 @@ }, { "age": 96, - "asset": -1482748304, + "asset": 0, "cumulative_gap": 1121527636, "expense": 61196620, "gap": 47696620, @@ -642,7 +644,7 @@ }, { "age": 97, - "asset": -1576358272, + "asset": 0, "cumulative_gap": 1170448189, "expense": 62420553, "gap": 48920553, @@ -650,7 +652,7 @@ }, { "age": 98, - "asset": -1674037189, + "asset": 0, "cumulative_gap": 1220617152, "expense": 63668964, "gap": 50168964, @@ -658,7 +660,7 @@ }, { "age": 99, - "asset": -1775932337, + "asset": 0, "cumulative_gap": 1272059495, "expense": 64942343, "gap": 51442343, @@ -666,7 +668,7 @@ }, { "age": 100, - "asset": -1882195921, + "asset": 0, "cumulative_gap": 1324800685, "expense": 66241190, "gap": 52741190, @@ -677,6 +679,7 @@ }, { "break_even_age": 64, + "depleted": true, "depletion_age": 67, "scenario_type": "LUMP_SUM", "timeline": [ @@ -738,7 +741,7 @@ }, { "age": 67, - "asset": -22960530, + "asset": 0, "cumulative_gap": 257489072, "expense": 34460570, "gap": 34460570, @@ -746,7 +749,7 @@ }, { "age": 68, - "asset": -59143733, + "asset": 0, "cumulative_gap": 292638853, "expense": 35149781, "gap": 35149781, @@ -754,7 +757,7 @@ }, { "age": 69, - "asset": -97122320, + "asset": 0, "cumulative_gap": 328491630, "expense": 35852777, "gap": 35852777, @@ -762,7 +765,7 @@ }, { "age": 70, - "asset": -136964350, + "asset": 0, "cumulative_gap": 365061463, "expense": 36569833, "gap": 36569833, @@ -770,7 +773,7 @@ }, { "age": 71, - "asset": -178740208, + "asset": 0, "cumulative_gap": 402362692, "expense": 37301229, "gap": 37301229, @@ -778,7 +781,7 @@ }, { "age": 72, - "asset": -222522681, + "asset": 0, "cumulative_gap": 440409946, "expense": 38047254, "gap": 38047254, @@ -786,7 +789,7 @@ }, { "age": 73, - "asset": -268387033, + "asset": 0, "cumulative_gap": 479218145, "expense": 38808199, "gap": 38808199, @@ -794,7 +797,7 @@ }, { "age": 74, - "asset": -316411089, + "asset": 0, "cumulative_gap": 518802507, "expense": 39584363, "gap": 39584363, @@ -802,7 +805,7 @@ }, { "age": 75, - "asset": -366675315, + "asset": 0, "cumulative_gap": 559178558, "expense": 40376050, "gap": 40376050, @@ -810,7 +813,7 @@ }, { "age": 76, - "asset": -419262906, + "asset": 0, "cumulative_gap": 600362129, "expense": 41183571, "gap": 41183571, @@ -818,7 +821,7 @@ }, { "age": 77, - "asset": -474259872, + "asset": 0, "cumulative_gap": 642369371, "expense": 42007243, "gap": 42007243, @@ -826,7 +829,7 @@ }, { "age": 78, - "asset": -531755128, + "asset": 0, "cumulative_gap": 685216759, "expense": 42847387, "gap": 42847387, @@ -834,7 +837,7 @@ }, { "age": 79, - "asset": -591840590, + "asset": 0, "cumulative_gap": 728921094, "expense": 43704335, "gap": 43704335, @@ -842,7 +845,7 @@ }, { "age": 80, - "asset": -654611273, + "asset": 0, "cumulative_gap": 773499516, "expense": 44578422, "gap": 44578422, @@ -850,7 +853,7 @@ }, { "age": 81, - "asset": -720165386, + "asset": 0, "cumulative_gap": 818969506, "expense": 45469990, "gap": 45469990, @@ -858,7 +861,7 @@ }, { "age": 82, - "asset": -788604438, + "asset": 0, "cumulative_gap": 865348896, "expense": 46379390, "gap": 46379390, @@ -866,7 +869,7 @@ }, { "age": 83, - "asset": -860033343, + "asset": 0, "cumulative_gap": 912655874, "expense": 47306978, "gap": 47306978, @@ -874,7 +877,7 @@ }, { "age": 84, - "asset": -934560530, + "asset": 0, "cumulative_gap": 960908992, "expense": 48253117, "gap": 48253117, @@ -882,7 +885,7 @@ }, { "age": 85, - "asset": -1012298057, + "asset": 0, "cumulative_gap": 1010127172, "expense": 49218180, "gap": 49218180, @@ -890,7 +893,7 @@ }, { "age": 86, - "asset": -1093361724, + "asset": 0, "cumulative_gap": 1060329715, "expense": 50202543, "gap": 50202543, @@ -898,7 +901,7 @@ }, { "age": 87, - "asset": -1177871196, + "asset": 0, "cumulative_gap": 1111536309, "expense": 51206594, "gap": 51206594, @@ -906,7 +909,7 @@ }, { "age": 88, - "asset": -1265950124, + "asset": 0, "cumulative_gap": 1163767035, "expense": 52230726, "gap": 52230726, @@ -914,7 +917,7 @@ }, { "age": 89, - "asset": -1357726275, + "asset": 0, "cumulative_gap": 1217042376, "expense": 53275341, "gap": 53275341, @@ -922,7 +925,7 @@ }, { "age": 90, - "asset": -1453331664, + "asset": 0, "cumulative_gap": 1271383224, "expense": 54340848, "gap": 54340848, @@ -930,7 +933,7 @@ }, { "age": 91, - "asset": -1552902687, + "asset": 0, "cumulative_gap": 1326810888, "expense": 55427664, "gap": 55427664, @@ -938,7 +941,7 @@ }, { "age": 92, - "asset": -1656580262, + "asset": 0, "cumulative_gap": 1383347106, "expense": 56536218, "gap": 56536218, @@ -946,7 +949,7 @@ }, { "age": 93, - "asset": -1764509974, + "asset": 0, "cumulative_gap": 1441014048, "expense": 57666942, "gap": 57666942, @@ -954,7 +957,7 @@ }, { "age": 94, - "asset": -1876842224, + "asset": 0, "cumulative_gap": 1499834329, "expense": 58820281, "gap": 58820281, @@ -962,7 +965,7 @@ }, { "age": 95, - "asset": -1993732380, + "asset": 0, "cumulative_gap": 1559831016, "expense": 59996687, "gap": 59996687, @@ -970,7 +973,7 @@ }, { "age": 96, - "asset": -2115340939, + "asset": 0, "cumulative_gap": 1621027636, "expense": 61196620, "gap": 61196620, @@ -978,7 +981,7 @@ }, { "age": 97, - "asset": -2241833686, + "asset": 0, "cumulative_gap": 1683448189, "expense": 62420553, "gap": 62420553, @@ -986,7 +989,7 @@ }, { "age": 98, - "asset": -2373381866, + "asset": 0, "cumulative_gap": 1747117152, "expense": 63668964, "gap": 63668964, @@ -994,7 +997,7 @@ }, { "age": 99, - "asset": -2510162354, + "asset": 0, "cumulative_gap": 1812059495, "expense": 64942343, "gap": 64942343, @@ -1002,7 +1005,7 @@ }, { "age": 100, - "asset": -2652357838, + "asset": 0, "cumulative_gap": 1878300685, "expense": 66241190, "gap": 66241190, @@ -1013,6 +1016,7 @@ }, { "break_even_age": 64, + "depleted": true, "depletion_age": 67, "scenario_type": "INSTALLMENT", "timeline": [ @@ -1074,7 +1078,7 @@ }, { "age": 67, - "asset": -20226261, + "asset": 0, "cumulative_gap": 208529072, "expense": 34460570, "gap": 28340570, @@ -1082,7 +1086,7 @@ }, { "age": 68, - "asset": -50023835, + "asset": 0, "cumulative_gap": 237558853, "expense": 35149781, "gap": 29029781, @@ -1090,7 +1094,7 @@ }, { "age": 69, - "asset": -81425225, + "asset": 0, "cumulative_gap": 267291630, "expense": 35852777, "gap": 29732777, @@ -1098,7 +1102,7 @@ }, { "age": 70, - "asset": -114492743, + "asset": 0, "cumulative_gap": 297741463, "expense": 36569833, "gap": 30449833, @@ -1106,7 +1110,7 @@ }, { "age": 71, - "asset": -149290852, + "asset": 0, "cumulative_gap": 328922692, "expense": 37301229, "gap": 31181229, @@ -1114,7 +1118,7 @@ }, { "age": 72, - "asset": -185886244, + "asset": 0, "cumulative_gap": 360849946, "expense": 38047254, "gap": 31927254, @@ -1122,7 +1126,7 @@ }, { "age": 73, - "asset": -224347903, + "asset": 0, "cumulative_gap": 393538145, "expense": 38808199, "gap": 32688199, @@ -1130,7 +1134,7 @@ }, { "age": 74, - "asset": -264747185, + "asset": 0, "cumulative_gap": 427002507, "expense": 39584363, "gap": 33464363, @@ -1138,7 +1142,7 @@ }, { "age": 75, - "asset": -307157894, + "asset": 0, "cumulative_gap": 461258558, "expense": 40376050, "gap": 34256050, @@ -1146,7 +1150,7 @@ }, { "age": 76, - "asset": -351656363, + "asset": 0, "cumulative_gap": 496322129, "expense": 41183571, "gap": 35063571, @@ -1154,7 +1158,7 @@ }, { "age": 77, - "asset": -398321532, + "asset": 0, "cumulative_gap": 532209371, "expense": 42007243, "gap": 35887243, @@ -1162,7 +1166,7 @@ }, { "age": 78, - "asset": -447235038, + "asset": 0, "cumulative_gap": 568936759, "expense": 42847387, "gap": 36727387, @@ -1170,7 +1174,7 @@ }, { "age": 79, - "asset": -498481298, + "asset": 0, "cumulative_gap": 606521094, "expense": 43704335, "gap": 37584335, @@ -1178,7 +1182,7 @@ }, { "age": 80, - "asset": -552147602, + "asset": 0, "cumulative_gap": 644979516, "expense": 44578422, "gap": 38458422, @@ -1186,7 +1190,7 @@ }, { "age": 81, - "asset": -608324205, + "asset": 0, "cumulative_gap": 684329506, "expense": 45469990, "gap": 39349990, @@ -1194,7 +1198,7 @@ }, { "age": 82, - "asset": -667104421, + "asset": 0, "cumulative_gap": 724588896, "expense": 46379390, "gap": 40259390, @@ -1202,7 +1206,7 @@ }, { "age": 83, - "asset": -728584725, + "asset": 0, "cumulative_gap": 765775874, "expense": 47306978, "gap": 41186978, @@ -1210,7 +1214,7 @@ }, { "age": 84, - "asset": -792864854, + "asset": 0, "cumulative_gap": 807908992, "expense": 48253117, "gap": 42133117, @@ -1218,7 +1222,7 @@ }, { "age": 85, - "asset": -860047911, + "asset": 0, "cumulative_gap": 851007172, "expense": 49218180, "gap": 43098180, @@ -1226,7 +1230,7 @@ }, { "age": 86, - "asset": -930240473, + "asset": 0, "cumulative_gap": 895089715, "expense": 50202543, "gap": 44082543, @@ -1234,7 +1238,7 @@ }, { "age": 87, - "asset": -1003552707, + "asset": 0, "cumulative_gap": 940176309, "expense": 51206594, "gap": 45086594, @@ -1242,7 +1246,7 @@ }, { "age": 88, - "asset": -1080098481, + "asset": 0, "cumulative_gap": 986287035, "expense": 52230726, "gap": 46110726, @@ -1250,7 +1254,7 @@ }, { "age": 89, - "asset": -1159995483, + "asset": 0, "cumulative_gap": 1033442376, "expense": 53275341, "gap": 47155341, @@ -1258,7 +1262,7 @@ }, { "age": 90, - "asset": -1243365349, + "asset": 0, "cumulative_gap": 1081663224, "expense": 54340848, "gap": 48220848, @@ -1266,7 +1270,7 @@ }, { "age": 91, - "asset": -1330333782, + "asset": 0, "cumulative_gap": 1130970888, "expense": 55427664, "gap": 49307664, @@ -1274,7 +1278,7 @@ }, { "age": 92, - "asset": -1421030690, + "asset": 0, "cumulative_gap": 1181387106, "expense": 56536218, "gap": 50416218, @@ -1282,7 +1286,7 @@ }, { "age": 93, - "asset": -1515590315, + "asset": 0, "cumulative_gap": 1232934048, "expense": 57666942, "gap": 51546942, @@ -1290,7 +1294,7 @@ }, { "age": 94, - "asset": -1614151375, + "asset": 0, "cumulative_gap": 1285634329, "expense": 58820281, "gap": 52700281, @@ -1298,7 +1302,7 @@ }, { "age": 95, - "asset": -1716857205, + "asset": 0, "cumulative_gap": 1339511016, "expense": 59996687, "gap": 53876687, @@ -1306,7 +1310,7 @@ }, { "age": 96, - "asset": -1823855909, + "asset": 0, "cumulative_gap": 1394587636, "expense": 61196620, "gap": 55076620, @@ -1314,7 +1318,7 @@ }, { "age": 97, - "asset": -1935300505, + "asset": 0, "cumulative_gap": 1450888189, "expense": 62420553, "gap": 56300553, @@ -1322,7 +1326,7 @@ }, { "age": 98, - "asset": -2051349089, + "asset": 0, "cumulative_gap": 1508437152, "expense": 63668964, "gap": 57548964, @@ -1330,7 +1334,7 @@ }, { "age": 99, - "asset": -2172164995, + "asset": 0, "cumulative_gap": 1567259495, "expense": 64942343, "gap": 58822343, @@ -1338,7 +1342,7 @@ }, { "age": 100, - "asset": -2297916958, + "asset": 0, "cumulative_gap": 1627380685, "expense": 66241190, "gap": 60121190, diff --git a/fastapi/tests/test_depletion_representation.py b/fastapi/tests/test_depletion_representation.py new file mode 100644 index 0000000..e415b26 --- /dev/null +++ b/fastapi/tests/test_depletion_representation.py @@ -0,0 +1,98 @@ +"""고갈(depletion) 표현 통일에 대한 회귀 테스트. + +- timeline의 asset은 고갈 이후 음수로 계속 내려가지 않고 0으로 클램프되어야 한다. +- ScenarioOutcome.depletion_age는 diagnosis 등 다른 응답과 마찬가지로 + 무고갈이면 None이어야 한다(더 이상 MAX_AGE(100)를 "무고갈" sentinel로 쓰지 않는다). +- depleted: bool 필드가 depletion_age is not None과 항상 일치해야 한다. +- _select_best_scenario가 depletion_age=None(무고갈) 시나리오를 다른 유한 시나리오보다 + 우선해야 한다(무고갈이 가장 좋은 결과라는 기존 의도는 유지). +""" + +import pytest + +from app.schemas.retirement import ScenarioOutcome, ScenarioType +from app.services import retirement_service +from app.services.retirement_service import MAX_AGE, simulate_retirement, simulate_scenarios + + +def test_timeline_asset_clamped_to_zero_after_depletion(): + result = simulate_retirement( + current_age=60, + monthly_expenses=250, + monthly_pension=150, + asset=10000, + gender="male", + ) + + assert result.depletion_age is not None + for point in result.timeline: + if point.age >= result.depletion_age: + assert point.asset == 0.0 + else: + assert point.asset > 0.0 + + +def test_simulation_result_depleted_flag_matches_depletion_age(): + depleting = simulate_retirement( + current_age=60, monthly_expenses=250, monthly_pension=150, asset=10000, gender="male" + ) + assert depleting.depletion_age is not None + assert depleting.depleted is True + + sufficient = simulate_retirement( + current_age=65, monthly_expenses=150, monthly_pension=200, asset=10000, gender="male" + ) + assert sufficient.depletion_age is None + assert sufficient.depleted is False + + +def test_scenario_outcome_depletion_age_is_none_when_never_depletes(): + result = simulate_scenarios( + current_age=60, + monthly_expenses=100, + monthly_pension=200, + asset=1_000_000, + gender="male", + base_monthly_income=300, + total_service_years=25, + ) + + for outcome in result.scenarios: + assert outcome.depletion_age is None, f"{outcome.scenario_type}는 무고갈이어야 하는데 {outcome.depletion_age}" + assert outcome.depleted is False + + +def test_scenario_outcome_depleted_true_when_depletes_before_max_age(): + result = simulate_scenarios( + current_age=60, + monthly_expenses=250, + monthly_pension=150, + asset=10000, + gender="male", + base_monthly_income=300, + total_service_years=25, + ) + + for outcome in result.scenarios: + assert outcome.depletion_age is not None + assert outcome.depletion_age < MAX_AGE + assert outcome.depleted is True + + +def test_select_best_scenario_prefers_never_depleting_scenario_over_finite_ones(): + outcomes = [ + ScenarioOutcome( + scenario_type=ScenarioType.NORMAL, depletion_age=80, depleted=True, + total_received=1000.0, break_even_age=None, timeline=[], + ), + ScenarioOutcome( + scenario_type=ScenarioType.EARLY, depletion_age=None, depleted=False, + total_received=500.0, break_even_age=60, timeline=[], + ), + ScenarioOutcome( + scenario_type=ScenarioType.LUMP_SUM, depletion_age=75, depleted=True, + total_received=9999.0, break_even_age=70, timeline=[], + ), + ] + + assert retirement_service._select_best_scenario(outcomes) == ScenarioType.EARLY diff --git a/fastapi/tests/test_retirement_service.py b/fastapi/tests/test_retirement_service.py index 0a72cb5..9f86de7 100644 --- a/fastapi/tests/test_retirement_service.py +++ b/fastapi/tests/test_retirement_service.py @@ -381,15 +381,15 @@ def test_simulate_scenarios_timeline_matches_diagnosis_core_format(): def test_select_best_scenario_breaks_tie_by_total_received(): outcomes = [ ScenarioOutcome( - scenario_type=ScenarioType.NORMAL, depletion_age=80, total_received=1000.0, + scenario_type=ScenarioType.NORMAL, depletion_age=80, depleted=True, total_received=1000.0, break_even_age=None, timeline=[], ), ScenarioOutcome( - scenario_type=ScenarioType.EARLY, depletion_age=80, total_received=1500.0, + scenario_type=ScenarioType.EARLY, depletion_age=80, depleted=True, total_received=1500.0, break_even_age=None, timeline=[], ), ScenarioOutcome( - scenario_type=ScenarioType.LUMP_SUM, depletion_age=75, total_received=9999.0, + scenario_type=ScenarioType.LUMP_SUM, depletion_age=75, depleted=True, total_received=9999.0, break_even_age=70, timeline=[], ), ] From 881548623d43b6652dc3aea15c63496f6003efe6 Mon Sep 17 00:00:00 2001 From: jung32111 Date: Sat, 25 Jul 2026 09:39:55 +0900 Subject: [PATCH 5/7] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor:=20timeline?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=EB=AA=85=EC=97=90=20=EC=97=B0=20=EB=8B=A8?= =?UTF-8?q?=EC=9C=84=EC=9E=84=EC=9D=84=20=EB=AA=85=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TimelinePoint.income/expense/gap/cumulative_gap이 SimulationResult.monthly_gap 등 월 단위 필드와 이름이 겹쳐(둘 다 "gap"), 프론트가 연/월 어느 쪽인지 필드명만으로 구분할 수 없었다. annual_income/annual_expense/annual_gap/ cumulative_annual_gap으로 이름을 바꿔 연 단위임을 명시했다. 값 자체는 변경하지 않았다(골든 스냅샷으로 rename 전후 값이 동일함을 확인). --- fastapi/app/schemas/retirement.py | 8 +- fastapi/app/services/retirement_service.py | 10 +- .../tests/golden/diagnosis_insufficient.json | 328 ++--- fastapi/tests/golden/diagnosis_middle.json | 328 ++--- .../tests/golden/diagnosis_sufficient.json | 288 ++-- .../recommendations_saving_and_income.json | 328 ++--- .../golden/recommendations_saving_only.json | 328 ++--- .../golden/recommendations_sufficient.json | 288 ++-- fastapi/tests/golden/reduction_capped.json | 328 ++--- .../tests/golden/reduction_no_reduction.json | 328 ++--- fastapi/tests/golden/reduction_partial.json | 328 ++--- fastapi/tests/golden/scenarios_basic.json | 1312 ++++++++--------- .../scenarios_with_deduction_years.json | 1312 ++++++++--------- fastapi/tests/test_retirement_service.py | 12 +- 14 files changed, 2763 insertions(+), 2763 deletions(-) diff --git a/fastapi/app/schemas/retirement.py b/fastapi/app/schemas/retirement.py index 3f7ea38..aa705b5 100644 --- a/fastapi/app/schemas/retirement.py +++ b/fastapi/app/schemas/retirement.py @@ -16,10 +16,10 @@ class ReadinessStatus(str, Enum): class TimelinePoint(BaseModel): age: int # 나이 asset: WonAmountOutput # 해당 나이 시점의 자산 (원) - income: WonAmountOutput # 해당 연도 소득(연금) (원) - expense: WonAmountOutput # 해당 연도 지출 (원) - gap: WonAmountOutput # 연간 Gap (지출 - 소득) (원) - cumulative_gap: WonAmountOutput # 누적 Gap (원) + annual_income: WonAmountOutput # 해당 연도 소득(연금) (원, 연 단위) + annual_expense: WonAmountOutput # 해당 연도 지출 (원, 연 단위) + annual_gap: WonAmountOutput # 연간 Gap (지출 - 소득) (원, 연 단위) + cumulative_annual_gap: WonAmountOutput # 누적 Gap (원, annual_gap의 누적합) class SimulationResult(BaseModel): diff --git a/fastapi/app/services/retirement_service.py b/fastapi/app/services/retirement_service.py index b5252e3..d0f1d7b 100644 --- a/fastapi/app/services/retirement_service.py +++ b/fastapi/app/services/retirement_service.py @@ -77,10 +77,10 @@ def simulate_retirement( TimelinePoint( age=age, asset=current_asset, - income=annual_income, - expense=annual_expense, - gap=annual_gap, - cumulative_gap=cumulative_gap, + annual_income=annual_income, + annual_expense=annual_expense, + annual_gap=annual_gap, + cumulative_annual_gap=cumulative_gap, ) ) @@ -331,7 +331,7 @@ def _cumulative_received(timeline: list[TimelinePoint], upfront: float) -> list[ cumulative: list[float] = [] running = upfront for point in timeline: - running += point.income + running += point.annual_income cumulative.append(running) return cumulative diff --git a/fastapi/tests/golden/diagnosis_insufficient.json b/fastapi/tests/golden/diagnosis_insufficient.json index e87bf9a..6bce3f0 100644 --- a/fastapi/tests/golden/diagnosis_insufficient.json +++ b/fastapi/tests/golden/diagnosis_insufficient.json @@ -9,331 +9,331 @@ "timeline": [ { "age": 60, + "annual_expense": 30000000, + "annual_gap": 12000000, + "annual_income": 18000000, "asset": 100000000, - "cumulative_gap": 12000000, - "expense": 30000000, - "gap": 12000000, - "income": 18000000 + "cumulative_annual_gap": 12000000 }, { "age": 61, + "annual_expense": 30600000, + "annual_gap": 12600000, + "annual_income": 18000000, "asset": 90640000, - "cumulative_gap": 24600000, - "expense": 30600000, - "gap": 12600000, - "income": 18000000 + "cumulative_annual_gap": 24600000 }, { "age": 62, + "annual_expense": 31212000, + "annual_gap": 13212000, + "annual_income": 18000000, "asset": 80381200, - "cumulative_gap": 37812000, - "expense": 31212000, - "gap": 13212000, - "income": 18000000 + "cumulative_annual_gap": 37812000 }, { "age": 63, + "annual_expense": 31836240, + "annual_gap": 13836240, + "annual_income": 18000000, "asset": 69184276, - "cumulative_gap": 51648240, - "expense": 31836240, - "gap": 13836240, - "income": 18000000 + "cumulative_annual_gap": 51648240 }, { "age": 64, + "annual_expense": 32472965, + "annual_gap": 14472965, + "annual_income": 18000000, "asset": 57008477, - "cumulative_gap": 66121205, - "expense": 32472965, - "gap": 14472965, - "income": 18000000 + "cumulative_annual_gap": 66121205 }, { "age": 65, + "annual_expense": 33122424, + "annual_gap": 15122424, + "annual_income": 18000000, "asset": 43811578, - "cumulative_gap": 81243629, - "expense": 33122424, - "gap": 15122424, - "income": 18000000 + "cumulative_annual_gap": 81243629 }, { "age": 66, + "annual_expense": 33784873, + "annual_gap": 15784873, + "annual_income": 18000000, "asset": 29549828, - "cumulative_gap": 97028501, - "expense": 33784873, - "gap": 15784873, - "income": 18000000 + "cumulative_annual_gap": 97028501 }, { "age": 67, + "annual_expense": 34460570, + "annual_gap": 16460570, + "annual_income": 18000000, "asset": 14177904, - "cumulative_gap": 113489072, - "expense": 34460570, - "gap": 16460570, - "income": 18000000 + "cumulative_annual_gap": 113489072 }, { "age": 68, + "annual_expense": 35149781, + "annual_gap": 17149781, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 130638853, - "expense": 35149781, - "gap": 17149781, - "income": 18000000 + "cumulative_annual_gap": 130638853 }, { "age": 69, + "annual_expense": 35852777, + "annual_gap": 17852777, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 148491630, - "expense": 35852777, - "gap": 17852777, - "income": 18000000 + "cumulative_annual_gap": 148491630 }, { "age": 70, + "annual_expense": 36569833, + "annual_gap": 18569833, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 167061463, - "expense": 36569833, - "gap": 18569833, - "income": 18000000 + "cumulative_annual_gap": 167061463 }, { "age": 71, + "annual_expense": 37301229, + "annual_gap": 19301229, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 186362692, - "expense": 37301229, - "gap": 19301229, - "income": 18000000 + "cumulative_annual_gap": 186362692 }, { "age": 72, + "annual_expense": 38047254, + "annual_gap": 20047254, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 206409946, - "expense": 38047254, - "gap": 20047254, - "income": 18000000 + "cumulative_annual_gap": 206409946 }, { "age": 73, + "annual_expense": 38808199, + "annual_gap": 20808199, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 227218145, - "expense": 38808199, - "gap": 20808199, - "income": 18000000 + "cumulative_annual_gap": 227218145 }, { "age": 74, + "annual_expense": 39584363, + "annual_gap": 21584363, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 248802507, - "expense": 39584363, - "gap": 21584363, - "income": 18000000 + "cumulative_annual_gap": 248802507 }, { "age": 75, + "annual_expense": 40376050, + "annual_gap": 22376050, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 271178558, - "expense": 40376050, - "gap": 22376050, - "income": 18000000 + "cumulative_annual_gap": 271178558 }, { "age": 76, + "annual_expense": 41183571, + "annual_gap": 23183571, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 294362129, - "expense": 41183571, - "gap": 23183571, - "income": 18000000 + "cumulative_annual_gap": 294362129 }, { "age": 77, + "annual_expense": 42007243, + "annual_gap": 24007243, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 318369371, - "expense": 42007243, - "gap": 24007243, - "income": 18000000 + "cumulative_annual_gap": 318369371 }, { "age": 78, + "annual_expense": 42847387, + "annual_gap": 24847387, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 343216759, - "expense": 42847387, - "gap": 24847387, - "income": 18000000 + "cumulative_annual_gap": 343216759 }, { "age": 79, + "annual_expense": 43704335, + "annual_gap": 25704335, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 368921094, - "expense": 43704335, - "gap": 25704335, - "income": 18000000 + "cumulative_annual_gap": 368921094 }, { "age": 80, + "annual_expense": 44578422, + "annual_gap": 26578422, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 395499516, - "expense": 44578422, - "gap": 26578422, - "income": 18000000 + "cumulative_annual_gap": 395499516 }, { "age": 81, + "annual_expense": 45469990, + "annual_gap": 27469990, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 422969506, - "expense": 45469990, - "gap": 27469990, - "income": 18000000 + "cumulative_annual_gap": 422969506 }, { "age": 82, + "annual_expense": 46379390, + "annual_gap": 28379390, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 451348896, - "expense": 46379390, - "gap": 28379390, - "income": 18000000 + "cumulative_annual_gap": 451348896 }, { "age": 83, + "annual_expense": 47306978, + "annual_gap": 29306978, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 480655874, - "expense": 47306978, - "gap": 29306978, - "income": 18000000 + "cumulative_annual_gap": 480655874 }, { "age": 84, + "annual_expense": 48253117, + "annual_gap": 30253117, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 510908992, - "expense": 48253117, - "gap": 30253117, - "income": 18000000 + "cumulative_annual_gap": 510908992 }, { "age": 85, + "annual_expense": 49218180, + "annual_gap": 31218180, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 542127172, - "expense": 49218180, - "gap": 31218180, - "income": 18000000 + "cumulative_annual_gap": 542127172 }, { "age": 86, + "annual_expense": 50202543, + "annual_gap": 32202543, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 574329715, - "expense": 50202543, - "gap": 32202543, - "income": 18000000 + "cumulative_annual_gap": 574329715 }, { "age": 87, + "annual_expense": 51206594, + "annual_gap": 33206594, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 607536309, - "expense": 51206594, - "gap": 33206594, - "income": 18000000 + "cumulative_annual_gap": 607536309 }, { "age": 88, + "annual_expense": 52230726, + "annual_gap": 34230726, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 641767035, - "expense": 52230726, - "gap": 34230726, - "income": 18000000 + "cumulative_annual_gap": 641767035 }, { "age": 89, + "annual_expense": 53275341, + "annual_gap": 35275341, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 677042376, - "expense": 53275341, - "gap": 35275341, - "income": 18000000 + "cumulative_annual_gap": 677042376 }, { "age": 90, + "annual_expense": 54340848, + "annual_gap": 36340848, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 713383224, - "expense": 54340848, - "gap": 36340848, - "income": 18000000 + "cumulative_annual_gap": 713383224 }, { "age": 91, + "annual_expense": 55427664, + "annual_gap": 37427664, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 750810888, - "expense": 55427664, - "gap": 37427664, - "income": 18000000 + "cumulative_annual_gap": 750810888 }, { "age": 92, + "annual_expense": 56536218, + "annual_gap": 38536218, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 789347106, - "expense": 56536218, - "gap": 38536218, - "income": 18000000 + "cumulative_annual_gap": 789347106 }, { "age": 93, + "annual_expense": 57666942, + "annual_gap": 39666942, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 829014048, - "expense": 57666942, - "gap": 39666942, - "income": 18000000 + "cumulative_annual_gap": 829014048 }, { "age": 94, + "annual_expense": 58820281, + "annual_gap": 40820281, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 869834329, - "expense": 58820281, - "gap": 40820281, - "income": 18000000 + "cumulative_annual_gap": 869834329 }, { "age": 95, + "annual_expense": 59996687, + "annual_gap": 41996687, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 911831016, - "expense": 59996687, - "gap": 41996687, - "income": 18000000 + "cumulative_annual_gap": 911831016 }, { "age": 96, + "annual_expense": 61196620, + "annual_gap": 43196620, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 955027636, - "expense": 61196620, - "gap": 43196620, - "income": 18000000 + "cumulative_annual_gap": 955027636 }, { "age": 97, + "annual_expense": 62420553, + "annual_gap": 44420553, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 999448189, - "expense": 62420553, - "gap": 44420553, - "income": 18000000 + "cumulative_annual_gap": 999448189 }, { "age": 98, + "annual_expense": 63668964, + "annual_gap": 45668964, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 1045117152, - "expense": 63668964, - "gap": 45668964, - "income": 18000000 + "cumulative_annual_gap": 1045117152 }, { "age": 99, + "annual_expense": 64942343, + "annual_gap": 46942343, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 1092059495, - "expense": 64942343, - "gap": 46942343, - "income": 18000000 + "cumulative_annual_gap": 1092059495 }, { "age": 100, + "annual_expense": 66241190, + "annual_gap": 48241190, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 1140300685, - "expense": 66241190, - "gap": 48241190, - "income": 18000000 + "cumulative_annual_gap": 1140300685 } ] }, diff --git a/fastapi/tests/golden/diagnosis_middle.json b/fastapi/tests/golden/diagnosis_middle.json index 5a0668e..dc6b2d2 100644 --- a/fastapi/tests/golden/diagnosis_middle.json +++ b/fastapi/tests/golden/diagnosis_middle.json @@ -9,331 +9,331 @@ "timeline": [ { "age": 60, + "annual_expense": 24000000, + "annual_gap": 6000000, + "annual_income": 18000000, "asset": 320000000, - "cumulative_gap": 6000000, - "expense": 24000000, - "gap": 6000000, - "income": 18000000 + "cumulative_annual_gap": 6000000 }, { "age": 61, + "annual_expense": 24480000, + "annual_gap": 6480000, + "annual_income": 18000000, "asset": 323420000, - "cumulative_gap": 12480000, - "expense": 24480000, - "gap": 6480000, - "income": 18000000 + "cumulative_annual_gap": 12480000 }, { "age": 62, + "annual_expense": 24969600, + "annual_gap": 6969600, + "annual_income": 18000000, "asset": 326448200, - "cumulative_gap": 19449600, - "expense": 24969600, - "gap": 6969600, - "income": 18000000 + "cumulative_annual_gap": 19449600 }, { "age": 63, + "annual_expense": 25468992, + "annual_gap": 7468992, + "annual_income": 18000000, "asset": 329062958, - "cumulative_gap": 26918592, - "expense": 25468992, - "gap": 7468992, - "income": 18000000 + "cumulative_annual_gap": 26918592 }, { "age": 64, + "annual_expense": 25978372, + "annual_gap": 7978372, + "annual_income": 18000000, "asset": 331241785, - "cumulative_gap": 34896964, - "expense": 25978372, - "gap": 7978372, - "income": 18000000 + "cumulative_annual_gap": 34896964 }, { "age": 65, + "annual_expense": 26497939, + "annual_gap": 8497939, + "annual_income": 18000000, "asset": 332961316, - "cumulative_gap": 43394903, - "expense": 26497939, - "gap": 8497939, - "income": 18000000 + "cumulative_annual_gap": 43394903 }, { "age": 66, + "annual_expense": 27027898, + "annual_gap": 9027898, + "annual_income": 18000000, "asset": 334197278, - "cumulative_gap": 52422801, - "expense": 27027898, - "gap": 9027898, - "income": 18000000 + "cumulative_annual_gap": 52422801 }, { "age": 67, + "annual_expense": 27568456, + "annual_gap": 9568456, + "annual_income": 18000000, "asset": 334924461, - "cumulative_gap": 61991257, - "expense": 27568456, - "gap": 9568456, - "income": 18000000 + "cumulative_annual_gap": 61991257 }, { "age": 68, + "annual_expense": 28119825, + "annual_gap": 10119825, + "annual_income": 18000000, "asset": 335116685, - "cumulative_gap": 72111082, - "expense": 28119825, - "gap": 10119825, - "income": 18000000 + "cumulative_annual_gap": 72111082 }, { "age": 69, + "annual_expense": 28682222, + "annual_gap": 10682222, + "annual_income": 18000000, "asset": 334746766, - "cumulative_gap": 82793304, - "expense": 28682222, - "gap": 10682222, - "income": 18000000 + "cumulative_annual_gap": 82793304 }, { "age": 70, + "annual_expense": 29255866, + "annual_gap": 11255866, + "annual_income": 18000000, "asset": 333786480, - "cumulative_gap": 94049170, - "expense": 29255866, - "gap": 11255866, - "income": 18000000 + "cumulative_annual_gap": 94049170 }, { "age": 71, + "annual_expense": 29840983, + "annual_gap": 11840983, + "annual_income": 18000000, "asset": 332206533, - "cumulative_gap": 105890153, - "expense": 29840983, - "gap": 11840983, - "income": 18000000 + "cumulative_annual_gap": 105890153 }, { "age": 72, + "annual_expense": 30437803, + "annual_gap": 12437803, + "annual_income": 18000000, "asset": 329976516, - "cumulative_gap": 118327957, - "expense": 30437803, - "gap": 12437803, - "income": 18000000 + "cumulative_annual_gap": 118327957 }, { "age": 73, + "annual_expense": 31046559, + "annual_gap": 13046559, + "annual_income": 18000000, "asset": 327064874, - "cumulative_gap": 131374516, - "expense": 31046559, - "gap": 13046559, - "income": 18000000 + "cumulative_annual_gap": 131374516 }, { "age": 74, + "annual_expense": 31667490, + "annual_gap": 13667490, + "annual_income": 18000000, "asset": 323438864, - "cumulative_gap": 145042006, - "expense": 31667490, - "gap": 13667490, - "income": 18000000 + "cumulative_annual_gap": 145042006 }, { "age": 75, + "annual_expense": 32300840, + "annual_gap": 14300840, + "annual_income": 18000000, "asset": 319064515, - "cumulative_gap": 159342846, - "expense": 32300840, - "gap": 14300840, - "income": 18000000 + "cumulative_annual_gap": 159342846 }, { "age": 76, + "annual_expense": 32946857, + "annual_gap": 14946857, + "annual_income": 18000000, "asset": 313906585, - "cumulative_gap": 174289703, - "expense": 32946857, - "gap": 14946857, - "income": 18000000 + "cumulative_annual_gap": 174289703 }, { "age": 77, + "annual_expense": 33605794, + "annual_gap": 15605794, + "annual_income": 18000000, "asset": 307928520, - "cumulative_gap": 189895497, - "expense": 33605794, - "gap": 15605794, - "income": 18000000 + "cumulative_annual_gap": 189895497 }, { "age": 78, + "annual_expense": 34277910, + "annual_gap": 16277910, + "annual_income": 18000000, "asset": 301092408, - "cumulative_gap": 206173407, - "expense": 34277910, - "gap": 16277910, - "income": 18000000 + "cumulative_annual_gap": 206173407 }, { "age": 79, + "annual_expense": 34963468, + "annual_gap": 16963468, + "annual_income": 18000000, "asset": 293358933, - "cumulative_gap": 223136875, - "expense": 34963468, - "gap": 16963468, - "income": 18000000 + "cumulative_annual_gap": 223136875 }, { "age": 80, + "annual_expense": 35662738, + "annual_gap": 17662738, + "annual_income": 18000000, "asset": 284687329, - "cumulative_gap": 240799613, - "expense": 35662738, - "gap": 17662738, - "income": 18000000 + "cumulative_annual_gap": 240799613 }, { "age": 81, + "annual_expense": 36375992, + "annual_gap": 18375992, + "annual_income": 18000000, "asset": 275035329, - "cumulative_gap": 259175605, - "expense": 36375992, - "gap": 18375992, - "income": 18000000 + "cumulative_annual_gap": 259175605 }, { "age": 82, + "annual_expense": 37103512, + "annual_gap": 19103512, + "annual_income": 18000000, "asset": 264359117, - "cumulative_gap": 278279117, - "expense": 37103512, - "gap": 19103512, - "income": 18000000 + "cumulative_annual_gap": 278279117 }, { "age": 83, + "annual_expense": 37845582, + "annual_gap": 19845582, + "annual_income": 18000000, "asset": 252613273, - "cumulative_gap": 298124699, - "expense": 37845582, - "gap": 19845582, - "income": 18000000 + "cumulative_annual_gap": 298124699 }, { "age": 84, + "annual_expense": 38602494, + "annual_gap": 20602494, + "annual_income": 18000000, "asset": 239750721, - "cumulative_gap": 318727193, - "expense": 38602494, - "gap": 20602494, - "income": 18000000 + "cumulative_annual_gap": 318727193 }, { "age": 85, + "annual_expense": 39374544, + "annual_gap": 21374544, + "annual_income": 18000000, "asset": 225722674, - "cumulative_gap": 340101737, - "expense": 39374544, - "gap": 21374544, - "income": 18000000 + "cumulative_annual_gap": 340101737 }, { "age": 86, + "annual_expense": 40162035, + "annual_gap": 22162035, + "annual_income": 18000000, "asset": 210478574, - "cumulative_gap": 362263772, - "expense": 40162035, - "gap": 22162035, - "income": 18000000 + "cumulative_annual_gap": 362263772 }, { "age": 87, + "annual_expense": 40965275, + "annual_gap": 22965275, + "annual_income": 18000000, "asset": 193966036, - "cumulative_gap": 385229047, - "expense": 40965275, - "gap": 22965275, - "income": 18000000 + "cumulative_annual_gap": 385229047 }, { "age": 88, + "annual_expense": 41784581, + "annual_gap": 23784581, + "annual_income": 18000000, "asset": 176130783, - "cumulative_gap": 409013628, - "expense": 41784581, - "gap": 23784581, - "income": 18000000 + "cumulative_annual_gap": 409013628 }, { "age": 89, + "annual_expense": 42620273, + "annual_gap": 24620273, + "annual_income": 18000000, "asset": 156916588, - "cumulative_gap": 433633901, - "expense": 42620273, - "gap": 24620273, - "income": 18000000 + "cumulative_annual_gap": 433633901 }, { "age": 90, + "annual_expense": 43472678, + "annual_gap": 25472678, + "annual_income": 18000000, "asset": 136265205, - "cumulative_gap": 459106579, - "expense": 43472678, - "gap": 25472678, - "income": 18000000 + "cumulative_annual_gap": 459106579 }, { "age": 91, + "annual_expense": 44342132, + "annual_gap": 26342132, + "annual_income": 18000000, "asset": 114116303, - "cumulative_gap": 485448711, - "expense": 44342132, - "gap": 26342132, - "income": 18000000 + "cumulative_annual_gap": 485448711 }, { "age": 92, + "annual_expense": 45228974, + "annual_gap": 27228974, + "annual_income": 18000000, "asset": 90407396, - "cumulative_gap": 512677685, - "expense": 45228974, - "gap": 27228974, - "income": 18000000 + "cumulative_annual_gap": 512677685 }, { "age": 93, + "annual_expense": 46133554, + "annual_gap": 28133554, + "annual_income": 18000000, "asset": 65073775, - "cumulative_gap": 540811238, - "expense": 46133554, - "gap": 28133554, - "income": 18000000 + "cumulative_annual_gap": 540811238 }, { "age": 94, + "annual_expense": 47056225, + "annual_gap": 29056225, + "annual_income": 18000000, "asset": 38048428, - "cumulative_gap": 569867463, - "expense": 47056225, - "gap": 29056225, - "income": 18000000 + "cumulative_annual_gap": 569867463 }, { "age": 95, + "annual_expense": 47997349, + "annual_gap": 29997349, + "annual_income": 18000000, "asset": 9261969, - "cumulative_gap": 599864812, - "expense": 47997349, - "gap": 29997349, - "income": 18000000 + "cumulative_annual_gap": 599864812 }, { "age": 96, + "annual_expense": 48957296, + "annual_gap": 30957296, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 630822109, - "expense": 48957296, - "gap": 30957296, - "income": 18000000 + "cumulative_annual_gap": 630822109 }, { "age": 97, + "annual_expense": 49936442, + "annual_gap": 31936442, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 662758551, - "expense": 49936442, - "gap": 31936442, - "income": 18000000 + "cumulative_annual_gap": 662758551 }, { "age": 98, + "annual_expense": 50935171, + "annual_gap": 32935171, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 695693722, - "expense": 50935171, - "gap": 32935171, - "income": 18000000 + "cumulative_annual_gap": 695693722 }, { "age": 99, + "annual_expense": 51953874, + "annual_gap": 33953874, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 729647596, - "expense": 51953874, - "gap": 33953874, - "income": 18000000 + "cumulative_annual_gap": 729647596 }, { "age": 100, + "annual_expense": 52992952, + "annual_gap": 34992952, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 764640548, - "expense": 52992952, - "gap": 34992952, - "income": 18000000 + "cumulative_annual_gap": 764640548 } ] }, diff --git a/fastapi/tests/golden/diagnosis_sufficient.json b/fastapi/tests/golden/diagnosis_sufficient.json index b3a01ed..943937e 100644 --- a/fastapi/tests/golden/diagnosis_sufficient.json +++ b/fastapi/tests/golden/diagnosis_sufficient.json @@ -9,291 +9,291 @@ "timeline": [ { "age": 65, + "annual_expense": 18000000, + "annual_gap": -6000000, + "annual_income": 24000000, "asset": 100000000, - "cumulative_gap": -6000000, - "expense": 18000000, - "gap": -6000000, - "income": 24000000 + "cumulative_annual_gap": -6000000 }, { "age": 66, + "annual_expense": 18360000, + "annual_gap": -5640000, + "annual_income": 24000000, "asset": 109180000, - "cumulative_gap": -11640000, - "expense": 18360000, - "gap": -5640000, - "income": 24000000 + "cumulative_annual_gap": -11640000 }, { "age": 67, + "annual_expense": 18727200, + "annual_gap": -5272800, + "annual_income": 24000000, "asset": 118264600, - "cumulative_gap": -16912800, - "expense": 18727200, - "gap": -5272800, - "income": 24000000 + "cumulative_annual_gap": -16912800 }, { "age": 68, + "annual_expense": 19101744, + "annual_gap": -4898256, + "annual_income": 24000000, "asset": 127243522, - "cumulative_gap": -21811056, - "expense": 19101744, - "gap": -4898256, - "income": 24000000 + "cumulative_annual_gap": -21811056 }, { "age": 69, + "annual_expense": 19483779, + "annual_gap": -4516221, + "annual_income": 24000000, "asset": 136106031, - "cumulative_gap": -26327277, - "expense": 19483779, - "gap": -4516221, - "income": 24000000 + "cumulative_annual_gap": -26327277 }, { "age": 70, + "annual_expense": 19873454, + "annual_gap": -4126546, + "annual_income": 24000000, "asset": 144840920, - "cumulative_gap": -30453823, - "expense": 19873454, - "gap": -4126546, - "income": 24000000 + "cumulative_annual_gap": -30453823 }, { "age": 71, + "annual_expense": 20270924, + "annual_gap": -3729076, + "annual_income": 24000000, "asset": 153436490, - "cumulative_gap": -34182899, - "expense": 20270924, - "gap": -3729076, - "income": 24000000 + "cumulative_annual_gap": -34182899 }, { "age": 72, + "annual_expense": 20676342, + "annual_gap": -3323658, + "annual_income": 24000000, "asset": 161880533, - "cumulative_gap": -37506557, - "expense": 20676342, - "gap": -3323658, - "income": 24000000 + "cumulative_annual_gap": -37506557 }, { "age": 73, + "annual_expense": 21089869, + "annual_gap": -2910131, + "annual_income": 24000000, "asset": 170160317, - "cumulative_gap": -40416688, - "expense": 21089869, - "gap": -2910131, - "income": 24000000 + "cumulative_annual_gap": -40416688 }, { "age": 74, + "annual_expense": 21511666, + "annual_gap": -2488334, + "annual_income": 24000000, "asset": 178262561, - "cumulative_gap": -42905022, - "expense": 21511666, - "gap": -2488334, - "income": 24000000 + "cumulative_annual_gap": -42905022 }, { "age": 75, + "annual_expense": 21941900, + "annual_gap": -2058100, + "annual_income": 24000000, "asset": 186173422, - "cumulative_gap": -44963122, - "expense": 21941900, - "gap": -2058100, - "income": 24000000 + "cumulative_annual_gap": -44963122 }, { "age": 76, + "annual_expense": 22380738, + "annual_gap": -1619262, + "annual_income": 24000000, "asset": 193878468, - "cumulative_gap": -46582385, - "expense": 22380738, - "gap": -1619262, - "income": 24000000 + "cumulative_annual_gap": -46582385 }, { "age": 77, + "annual_expense": 22828352, + "annual_gap": -1171648, + "annual_income": 24000000, "asset": 201362662, - "cumulative_gap": -47754033, - "expense": 22828352, - "gap": -1171648, - "income": 24000000 + "cumulative_annual_gap": -47754033 }, { "age": 78, + "annual_expense": 23284919, + "annual_gap": -715081, + "annual_income": 24000000, "asset": 208610339, - "cumulative_gap": -48469113, - "expense": 23284919, - "gap": -715081, - "income": 24000000 + "cumulative_annual_gap": -48469113 }, { "age": 79, + "annual_expense": 23750618, + "annual_gap": -249382, + "annual_income": 24000000, "asset": 215605183, - "cumulative_gap": -48718496, - "expense": 23750618, - "gap": -249382, - "income": 24000000 + "cumulative_annual_gap": -48718496 }, { "age": 80, + "annual_expense": 24225630, + "annual_gap": 225630, + "annual_income": 24000000, "asset": 222330202, - "cumulative_gap": -48492865, - "expense": 24225630, - "gap": 225630, - "income": 24000000 + "cumulative_annual_gap": -48492865 }, { "age": 81, + "annual_expense": 24710143, + "annual_gap": 710143, + "annual_income": 24000000, "asset": 228767709, - "cumulative_gap": -47782723, - "expense": 24710143, - "gap": 710143, - "income": 24000000 + "cumulative_annual_gap": -47782723 }, { "age": 82, + "annual_expense": 25204346, + "annual_gap": 1204346, + "annual_income": 24000000, "asset": 234899293, - "cumulative_gap": -46578377, - "expense": 25204346, - "gap": 1204346, - "income": 24000000 + "cumulative_annual_gap": -46578377 }, { "age": 83, + "annual_expense": 25708432, + "annual_gap": 1708432, + "annual_income": 24000000, "asset": 240705796, - "cumulative_gap": -44869945, - "expense": 25708432, - "gap": 1708432, - "income": 24000000 + "cumulative_annual_gap": -44869945 }, { "age": 84, + "annual_expense": 26222601, + "annual_gap": 2222601, + "annual_income": 24000000, "asset": 246167285, - "cumulative_gap": -42647344, - "expense": 26222601, - "gap": 2222601, - "income": 24000000 + "cumulative_annual_gap": -42647344 }, { "age": 85, + "annual_expense": 26747053, + "annual_gap": 2747053, + "annual_income": 24000000, "asset": 251263024, - "cumulative_gap": -39900290, - "expense": 26747053, - "gap": 2747053, - "income": 24000000 + "cumulative_annual_gap": -39900290 }, { "age": 86, + "annual_expense": 27281994, + "annual_gap": 3281994, + "annual_income": 24000000, "asset": 255971450, - "cumulative_gap": -36618296, - "expense": 27281994, - "gap": 3281994, - "income": 24000000 + "cumulative_annual_gap": -36618296 }, { "age": 87, + "annual_expense": 27827634, + "annual_gap": 3827634, + "annual_income": 24000000, "asset": 260270139, - "cumulative_gap": -32790662, - "expense": 27827634, - "gap": 3827634, - "income": 24000000 + "cumulative_annual_gap": -32790662 }, { "age": 88, + "annual_expense": 28384187, + "annual_gap": 4384187, + "annual_income": 24000000, "asset": 264135780, - "cumulative_gap": -28406475, - "expense": 28384187, - "gap": 4384187, - "income": 24000000 + "cumulative_annual_gap": -28406475 }, { "age": 89, + "annual_expense": 28951870, + "annual_gap": 4951870, + "annual_income": 24000000, "asset": 267544142, - "cumulative_gap": -23454605, - "expense": 28951870, - "gap": 4951870, - "income": 24000000 + "cumulative_annual_gap": -23454605 }, { "age": 90, + "annual_expense": 29530908, + "annual_gap": 5530908, + "annual_income": 24000000, "asset": 270470039, - "cumulative_gap": -17923697, - "expense": 29530908, - "gap": 5530908, - "income": 24000000 + "cumulative_annual_gap": -17923697 }, { "age": 91, + "annual_expense": 30121526, + "annual_gap": 6121526, + "annual_income": 24000000, "asset": 272887305, - "cumulative_gap": -11802171, - "expense": 30121526, - "gap": 6121526, - "income": 24000000 + "cumulative_annual_gap": -11802171 }, { "age": 92, + "annual_expense": 30723957, + "annual_gap": 6723957, + "annual_income": 24000000, "asset": 274768753, - "cumulative_gap": -5078214, - "expense": 30723957, - "gap": 6723957, - "income": 24000000 + "cumulative_annual_gap": -5078214 }, { "age": 93, + "annual_expense": 31338436, + "annual_gap": 7338436, + "annual_income": 24000000, "asset": 276086140, - "cumulative_gap": 2260221, - "expense": 31338436, - "gap": 7338436, - "income": 24000000 + "cumulative_annual_gap": 2260221 }, { "age": 94, + "annual_expense": 31965204, + "annual_gap": 7965204, + "annual_income": 24000000, "asset": 276810135, - "cumulative_gap": 10225426, - "expense": 31965204, - "gap": 7965204, - "income": 24000000 + "cumulative_annual_gap": 10225426 }, { "age": 95, + "annual_expense": 32604509, + "annual_gap": 8604509, + "annual_income": 24000000, "asset": 276910279, - "cumulative_gap": 18829934, - "expense": 32604509, - "gap": 8604509, - "income": 24000000 + "cumulative_annual_gap": 18829934 }, { "age": 96, + "annual_expense": 33256599, + "annual_gap": 9256599, + "annual_income": 24000000, "asset": 276354943, - "cumulative_gap": 28086533, - "expense": 33256599, - "gap": 9256599, - "income": 24000000 + "cumulative_annual_gap": 28086533 }, { "age": 97, + "annual_expense": 33921731, + "annual_gap": 9921731, + "annual_income": 24000000, "asset": 275111295, - "cumulative_gap": 38008264, - "expense": 33921731, - "gap": 9921731, - "income": 24000000 + "cumulative_annual_gap": 38008264 }, { "age": 98, + "annual_expense": 34600165, + "annual_gap": 10600165, + "annual_income": 24000000, "asset": 273145251, - "cumulative_gap": 48608429, - "expense": 34600165, - "gap": 10600165, - "income": 24000000 + "cumulative_annual_gap": 48608429 }, { "age": 99, + "annual_expense": 35292169, + "annual_gap": 11292169, + "annual_income": 24000000, "asset": 270421439, - "cumulative_gap": 59900597, - "expense": 35292169, - "gap": 11292169, - "income": 24000000 + "cumulative_annual_gap": 59900597 }, { "age": 100, + "annual_expense": 35998012, + "annual_gap": 11998012, + "annual_income": 24000000, "asset": 266903148, - "cumulative_gap": 71898609, - "expense": 35998012, - "gap": 11998012, - "income": 24000000 + "cumulative_annual_gap": 71898609 } ] }, diff --git a/fastapi/tests/golden/recommendations_saving_and_income.json b/fastapi/tests/golden/recommendations_saving_and_income.json index 52be33c..9e7dd9a 100644 --- a/fastapi/tests/golden/recommendations_saving_and_income.json +++ b/fastapi/tests/golden/recommendations_saving_and_income.json @@ -12,331 +12,331 @@ "timeline": [ { "age": 60, + "annual_expense": 33600000, + "annual_gap": -11641200, + "annual_income": 45241200, "asset": 50000000, - "cumulative_gap": -11641200, - "expense": 33600000, - "gap": -11641200, - "income": 45241200 + "cumulative_annual_gap": -11641200 }, { "age": 61, + "annual_expense": 34272000, + "annual_gap": -10969200, + "annual_income": 45241200, "asset": 63490436, - "cumulative_gap": -22610400, - "expense": 34272000, - "gap": -10969200, - "income": 45241200 + "cumulative_annual_gap": -22610400 }, { "age": 62, + "annual_expense": 34957440, + "annual_gap": -10283760, + "annual_income": 45241200, "asset": 76693425, - "cumulative_gap": -32894160, - "expense": 34957440, - "gap": -10283760, - "income": 45241200 + "cumulative_annual_gap": -32894160 }, { "age": 63, + "annual_expense": 35656589, + "annual_gap": -9584611, + "annual_income": 45241200, "asset": 89586501, - "cumulative_gap": -42478771, - "expense": 35656589, - "gap": -9584611, - "income": 45241200 + "cumulative_annual_gap": -42478771 }, { "age": 64, + "annual_expense": 36369721, + "annual_gap": -8871479, + "annual_income": 45241200, "asset": 102146245, - "cumulative_gap": -51350251, - "expense": 36369721, - "gap": -8871479, - "income": 45241200 + "cumulative_annual_gap": -51350251 }, { "age": 65, + "annual_expense": 37097115, + "annual_gap": -8144085, + "annual_income": 45241200, "asset": 114348256, - "cumulative_gap": -59494336, - "expense": 37097115, - "gap": -8144085, - "income": 45241200 + "cumulative_annual_gap": -59494336 }, { "age": 66, + "annual_expense": 37839057, + "annual_gap": -7402143, + "annual_income": 45241200, "asset": 126167112, - "cumulative_gap": -66896478, - "expense": 37839057, - "gap": -7402143, - "income": 45241200 + "cumulative_annual_gap": -66896478 }, { "age": 67, + "annual_expense": 38595838, + "annual_gap": -6645362, + "annual_income": 45241200, "asset": 137576332, - "cumulative_gap": -73541840, - "expense": 38595838, - "gap": -6645362, - "income": 45241200 + "cumulative_annual_gap": -73541840 }, { "age": 68, + "annual_expense": 39367755, + "annual_gap": -5873445, + "annual_income": 45241200, "asset": 148548344, - "cumulative_gap": -79415285, - "expense": 39367755, - "gap": -5873445, - "income": 45241200 + "cumulative_annual_gap": -79415285 }, { "age": 69, + "annual_expense": 40155110, + "annual_gap": -5086090, + "annual_income": 45241200, "asset": 159054443, - "cumulative_gap": -84501374, - "expense": 40155110, - "gap": -5086090, - "income": 45241200 + "cumulative_annual_gap": -84501374 }, { "age": 70, + "annual_expense": 40958213, + "annual_gap": -4282987, + "annual_income": 45241200, "asset": 169064748, - "cumulative_gap": -88784362, - "expense": 40958213, - "gap": -4282987, - "income": 45241200 + "cumulative_annual_gap": -88784362 }, { "age": 71, + "annual_expense": 41777377, + "annual_gap": -3463823, + "annual_income": 45241200, "asset": 178548168, - "cumulative_gap": -92248185, - "expense": 41777377, - "gap": -3463823, - "income": 45241200 + "cumulative_annual_gap": -92248185 }, { "age": 72, + "annual_expense": 42612924, + "annual_gap": -2628276, + "annual_income": 45241200, "asset": 187472351, - "cumulative_gap": -94876461, - "expense": 42612924, - "gap": -2628276, - "income": 45241200 + "cumulative_annual_gap": -94876461 }, { "age": 73, + "annual_expense": 43465183, + "annual_gap": -1776017, + "annual_income": 45241200, "asset": 195803646, - "cumulative_gap": -96652478, - "expense": 43465183, - "gap": -1776017, - "income": 45241200 + "cumulative_annual_gap": -96652478 }, { "age": 74, + "annual_expense": 44334486, + "annual_gap": -906714, + "annual_income": 45241200, "asset": 203507053, - "cumulative_gap": -97559192, - "expense": 44334486, - "gap": -906714, - "income": 45241200 + "cumulative_annual_gap": -97559192 }, { "age": 75, + "annual_expense": 45221176, + "annual_gap": -20024, + "annual_income": 45241200, "asset": 210546179, - "cumulative_gap": -97579215, - "expense": 45221176, - "gap": -20024, - "income": 45241200 + "cumulative_annual_gap": -97579215 }, { "age": 76, + "annual_expense": 46125600, + "annual_gap": 884400, + "annual_income": 45241200, "asset": 216883189, - "cumulative_gap": -96694816, - "expense": 46125600, - "gap": 884400, - "income": 45241200 + "cumulative_annual_gap": -96694816 }, { "age": 77, + "annual_expense": 47048112, + "annual_gap": 1806912, + "annual_income": 45241200, "asset": 222478753, - "cumulative_gap": -94887904, - "expense": 47048112, - "gap": 1806912, - "income": 45241200 + "cumulative_annual_gap": -94887904 }, { "age": 78, + "annual_expense": 47989074, + "annual_gap": 2747874, + "annual_income": 45241200, "asset": 227291997, - "cumulative_gap": -92140030, - "expense": 47989074, - "gap": 2747874, - "income": 45241200 + "cumulative_annual_gap": -92140030 }, { "age": 79, + "annual_expense": 48948855, + "annual_gap": 3707655, + "annual_income": 45241200, "asset": 231280446, - "cumulative_gap": -88432375, - "expense": 48948855, - "gap": 3707655, - "income": 45241200 + "cumulative_annual_gap": -88432375 }, { "age": 80, + "annual_expense": 49927833, + "annual_gap": 4686633, + "annual_income": 45241200, "asset": 234399975, - "cumulative_gap": -83745742, - "expense": 49927833, - "gap": 4686633, - "income": 45241200 + "cumulative_annual_gap": -83745742 }, { "age": 81, + "annual_expense": 50926389, + "annual_gap": 5685189, + "annual_income": 45241200, "asset": 236604742, - "cumulative_gap": -78060553, - "expense": 50926389, - "gap": 5685189, - "income": 45241200 + "cumulative_annual_gap": -78060553 }, { "age": 82, + "annual_expense": 51944917, + "annual_gap": 6703717, + "annual_income": 45241200, "asset": 237847140, - "cumulative_gap": -71356836, - "expense": 51944917, - "gap": 6703717, - "income": 45241200 + "cumulative_annual_gap": -71356836 }, { "age": 83, + "annual_expense": 52983815, + "annual_gap": 7742615, + "annual_income": 45241200, "asset": 238077726, - "cumulative_gap": -63614221, - "expense": 52983815, - "gap": 7742615, - "income": 45241200 + "cumulative_annual_gap": -63614221 }, { "age": 84, + "annual_expense": 54043492, + "annual_gap": 8802292, + "annual_income": 45241200, "asset": 237245164, - "cumulative_gap": -54811929, - "expense": 54043492, - "gap": 8802292, - "income": 45241200 + "cumulative_annual_gap": -54811929 }, { "age": 85, + "annual_expense": 55124361, + "annual_gap": 9883161, + "annual_income": 45241200, "asset": 235296158, - "cumulative_gap": -44928768, - "expense": 55124361, - "gap": 9883161, - "income": 45241200 + "cumulative_annual_gap": -44928768 }, { "age": 86, + "annual_expense": 56226849, + "annual_gap": 10985649, + "annual_income": 45241200, "asset": 232175387, - "cumulative_gap": -33943119, - "expense": 56226849, - "gap": 10985649, - "income": 45241200 + "cumulative_annual_gap": -33943119 }, { "age": 87, + "annual_expense": 57351386, + "annual_gap": 12110186, + "annual_income": 45241200, "asset": 227825430, - "cumulative_gap": -21832934, - "expense": 57351386, - "gap": 12110186, - "income": 45241200 + "cumulative_annual_gap": -21832934 }, { "age": 88, + "annual_expense": 58498413, + "annual_gap": 13257213, + "annual_income": 45241200, "asset": 222186702, - "cumulative_gap": -8575720, - "expense": 58498413, - "gap": 13257213, - "income": 45241200 + "cumulative_annual_gap": -8575720 }, { "age": 89, + "annual_expense": 59668382, + "annual_gap": 14427182, + "annual_income": 45241200, "asset": 215197373, - "cumulative_gap": 5851461, - "expense": 59668382, - "gap": 14427182, - "income": 45241200 + "cumulative_annual_gap": 5851461 }, { "age": 90, + "annual_expense": 60861749, + "annual_gap": 15620549, + "annual_income": 45241200, "asset": 206793297, - "cumulative_gap": 21472011, - "expense": 60861749, - "gap": 15620549, - "income": 45241200 + "cumulative_annual_gap": 21472011 }, { "age": 91, + "annual_expense": 62078984, + "annual_gap": 16837784, + "annual_income": 45241200, "asset": 196907931, - "cumulative_gap": 38309795, - "expense": 62078984, - "gap": 16837784, - "income": 45241200 + "cumulative_annual_gap": 38309795 }, { "age": 92, + "annual_expense": 63320564, + "annual_gap": 18079364, + "annual_income": 45241200, "asset": 185472251, - "cumulative_gap": 56389159, - "expense": 63320564, - "gap": 18079364, - "income": 45241200 + "cumulative_annual_gap": 56389159 }, { "age": 93, + "annual_expense": 64586975, + "annual_gap": 19345775, + "annual_income": 45241200, "asset": 172414674, - "cumulative_gap": 75734934, - "expense": 64586975, - "gap": 19345775, - "income": 45241200 + "cumulative_annual_gap": 75734934 }, { "age": 94, + "annual_expense": 65878715, + "annual_gap": 20637515, + "annual_income": 45241200, "asset": 157660965, - "cumulative_gap": 96372448, - "expense": 65878715, - "gap": 20637515, - "income": 45241200 + "cumulative_annual_gap": 96372448 }, { "age": 95, + "annual_expense": 67196289, + "annual_gap": 21955089, + "annual_income": 45241200, "asset": 141134154, - "cumulative_gap": 118327537, - "expense": 67196289, - "gap": 21955089, - "income": 45241200 + "cumulative_annual_gap": 118327537 }, { "age": 96, + "annual_expense": 68540215, + "annual_gap": 23299015, + "annual_income": 45241200, "asset": 122754437, - "cumulative_gap": 141626552, - "expense": 68540215, - "gap": 23299015, - "income": 45241200 + "cumulative_annual_gap": 141626552 }, { "age": 97, + "annual_expense": 69911019, + "annual_gap": 24669819, + "annual_income": 45241200, "asset": 102439085, - "cumulative_gap": 166296371, - "expense": 69911019, - "gap": 24669819, - "income": 45241200 + "cumulative_annual_gap": 166296371 }, { "age": 98, + "annual_expense": 71309239, + "annual_gap": 26068039, + "annual_income": 45241200, "asset": 80102344, - "cumulative_gap": 192364411, - "expense": 71309239, - "gap": 26068039, - "income": 45241200 + "cumulative_annual_gap": 192364411 }, { "age": 99, + "annual_expense": 72735424, + "annual_gap": 27494224, + "annual_income": 45241200, "asset": 55655334, - "cumulative_gap": 219858635, - "expense": 72735424, - "gap": 27494224, - "income": 45241200 + "cumulative_annual_gap": 219858635 }, { "age": 100, + "annual_expense": 74190133, + "annual_gap": 28948933, + "annual_income": 45241200, "asset": 29005943, - "cumulative_gap": 248807568, - "expense": 74190133, - "gap": 28948933, - "income": 45241200 + "cumulative_annual_gap": 248807568 } ] }, diff --git a/fastapi/tests/golden/recommendations_saving_only.json b/fastapi/tests/golden/recommendations_saving_only.json index 864d4cb..c8fe487 100644 --- a/fastapi/tests/golden/recommendations_saving_only.json +++ b/fastapi/tests/golden/recommendations_saving_only.json @@ -12,331 +12,331 @@ "timeline": [ { "age": 60, + "annual_expense": 21459600, + "annual_gap": -2540400, + "annual_income": 24000000, "asset": 150000000, - "cumulative_gap": -2540400, - "expense": 21459600, - "gap": -2540400, - "income": 24000000 + "cumulative_annual_gap": -2540400 }, { "age": 61, + "annual_expense": 21888792, + "annual_gap": -2111208, + "annual_income": 24000000, "asset": 157116612, - "cumulative_gap": -4651608, - "expense": 21888792, - "gap": -2111208, - "income": 24000000 + "cumulative_annual_gap": -4651608 }, { "age": 62, + "annual_expense": 22326568, + "annual_gap": -1673432, + "annual_income": 24000000, "asset": 164004655, - "cumulative_gap": -6325040, - "expense": 22326568, - "gap": -1673432, - "income": 24000000 + "cumulative_annual_gap": -6325040 }, { "age": 63, + "annual_expense": 22773099, + "annual_gap": -1226901, + "annual_income": 24000000, "asset": 170648429, - "cumulative_gap": -7551941, - "expense": 22773099, - "gap": -1226901, - "income": 24000000 + "cumulative_annual_gap": -7551941 }, { "age": 64, + "annual_expense": 23228561, + "annual_gap": -771439, + "annual_income": 24000000, "asset": 177031590, - "cumulative_gap": -8323380, - "expense": 23228561, - "gap": -771439, - "income": 24000000 + "cumulative_annual_gap": -8323380 }, { "age": 65, + "annual_expense": 23693132, + "annual_gap": -306868, + "annual_income": 24000000, "asset": 183137120, - "cumulative_gap": -8630247, - "expense": 23693132, - "gap": -306868, - "income": 24000000 + "cumulative_annual_gap": -8630247 }, { "age": 66, + "annual_expense": 24166995, + "annual_gap": 166995, + "annual_income": 24000000, "asset": 188947307, - "cumulative_gap": -8463252, - "expense": 24166995, - "gap": 166995, - "income": 24000000 + "cumulative_annual_gap": -8463252 }, { "age": 67, + "annual_expense": 24650335, + "annual_gap": 650335, + "annual_income": 24000000, "asset": 194443721, - "cumulative_gap": -7812917, - "expense": 24650335, - "gap": 650335, - "income": 24000000 + "cumulative_annual_gap": -7812917 }, { "age": 68, + "annual_expense": 25143342, + "annual_gap": 1143342, + "annual_income": 24000000, "asset": 199607188, - "cumulative_gap": -6669576, - "expense": 25143342, - "gap": 1143342, - "income": 24000000 + "cumulative_annual_gap": -6669576 }, { "age": 69, + "annual_expense": 25646208, + "annual_gap": 1646208, + "annual_income": 24000000, "asset": 204417762, - "cumulative_gap": -5023367, - "expense": 25646208, - "gap": 1646208, - "income": 24000000 + "cumulative_annual_gap": -5023367 }, { "age": 70, + "annual_expense": 26159133, + "annual_gap": 2159133, + "annual_income": 24000000, "asset": 208854700, - "cumulative_gap": -2864235, - "expense": 26159133, - "gap": 2159133, - "income": 24000000 + "cumulative_annual_gap": -2864235 }, { "age": 71, + "annual_expense": 26682315, + "annual_gap": 2682315, + "annual_income": 24000000, "asset": 212896434, - "cumulative_gap": -181919, - "expense": 26682315, - "gap": 2682315, - "income": 24000000 + "cumulative_annual_gap": -181919 }, { "age": 72, + "annual_expense": 27215962, + "annual_gap": 3215962, + "annual_income": 24000000, "asset": 216520542, - "cumulative_gap": 3034042, - "expense": 27215962, - "gap": 3215962, - "income": 24000000 + "cumulative_annual_gap": 3034042 }, { "age": 73, + "annual_expense": 27760281, + "annual_gap": 3760281, + "annual_income": 24000000, "asset": 219703718, - "cumulative_gap": 6794323, - "expense": 27760281, - "gap": 3760281, - "income": 24000000 + "cumulative_annual_gap": 6794323 }, { "age": 74, + "annual_expense": 28315486, + "annual_gap": 4315486, + "annual_income": 24000000, "asset": 222421740, - "cumulative_gap": 11109810, - "expense": 28315486, - "gap": 4315486, - "income": 24000000 + "cumulative_annual_gap": 11109810 }, { "age": 75, + "annual_expense": 28881796, + "annual_gap": 4881796, + "annual_income": 24000000, "asset": 224649442, - "cumulative_gap": 15991606, - "expense": 28881796, - "gap": 4881796, - "income": 24000000 + "cumulative_annual_gap": 15991606 }, { "age": 76, + "annual_expense": 29459432, + "annual_gap": 5459432, + "annual_income": 24000000, "asset": 226360675, - "cumulative_gap": 21451038, - "expense": 29459432, - "gap": 5459432, - "income": 24000000 + "cumulative_annual_gap": 21451038 }, { "age": 77, + "annual_expense": 30048621, + "annual_gap": 6048621, + "annual_income": 24000000, "asset": 227528280, - "cumulative_gap": 27499659, - "expense": 30048621, - "gap": 6048621, - "income": 24000000 + "cumulative_annual_gap": 27499659 }, { "age": 78, + "annual_expense": 30649593, + "annual_gap": 6649593, + "annual_income": 24000000, "asset": 228124049, - "cumulative_gap": 34149252, - "expense": 30649593, - "gap": 6649593, - "income": 24000000 + "cumulative_annual_gap": 34149252 }, { "age": 79, + "annual_expense": 31262585, + "annual_gap": 7262585, + "annual_income": 24000000, "asset": 228118689, - "cumulative_gap": 41411837, - "expense": 31262585, - "gap": 7262585, - "income": 24000000 + "cumulative_annual_gap": 41411837 }, { "age": 80, + "annual_expense": 31887837, + "annual_gap": 7887837, + "annual_income": 24000000, "asset": 227481788, - "cumulative_gap": 49299674, - "expense": 31887837, - "gap": 7887837, - "income": 24000000 + "cumulative_annual_gap": 49299674 }, { "age": 81, + "annual_expense": 32525593, + "annual_gap": 8525593, + "annual_income": 24000000, "asset": 226181769, - "cumulative_gap": 57825267, - "expense": 32525593, - "gap": 8525593, - "income": 24000000 + "cumulative_annual_gap": 57825267 }, { "age": 82, + "annual_expense": 33176105, + "annual_gap": 9176105, + "annual_income": 24000000, "asset": 224185861, - "cumulative_gap": 67001372, - "expense": 33176105, - "gap": 9176105, - "income": 24000000 + "cumulative_annual_gap": 67001372 }, { "age": 83, + "annual_expense": 33839627, + "annual_gap": 9839627, + "annual_income": 24000000, "asset": 221460048, - "cumulative_gap": 76841000, - "expense": 33839627, - "gap": 9839627, - "income": 24000000 + "cumulative_annual_gap": 76841000 }, { "age": 84, + "annual_expense": 34516420, + "annual_gap": 10516420, + "annual_income": 24000000, "asset": 217969034, - "cumulative_gap": 87357420, - "expense": 34516420, - "gap": 10516420, - "income": 24000000 + "cumulative_annual_gap": 87357420 }, { "age": 85, + "annual_expense": 35206748, + "annual_gap": 11206748, + "annual_income": 24000000, "asset": 213676192, - "cumulative_gap": 98564168, - "expense": 35206748, - "gap": 11206748, - "income": 24000000 + "cumulative_annual_gap": 98564168 }, { "age": 86, + "annual_expense": 35910883, + "annual_gap": 11910883, + "annual_income": 24000000, "asset": 208543527, - "cumulative_gap": 110475052, - "expense": 35910883, - "gap": 11910883, - "income": 24000000 + "cumulative_annual_gap": 110475052 }, { "age": 87, + "annual_expense": 36629101, + "annual_gap": 12629101, + "annual_income": 24000000, "asset": 202531623, - "cumulative_gap": 123104153, - "expense": 36629101, - "gap": 12629101, - "income": 24000000 + "cumulative_annual_gap": 123104153 }, { "age": 88, + "annual_expense": 37361683, + "annual_gap": 13361683, + "annual_income": 24000000, "asset": 195599598, - "cumulative_gap": 136465836, - "expense": 37361683, - "gap": 13361683, - "income": 24000000 + "cumulative_annual_gap": 136465836 }, { "age": 89, + "annual_expense": 38108917, + "annual_gap": 14108917, + "annual_income": 24000000, "asset": 187705052, - "cumulative_gap": 150574753, - "expense": 38108917, - "gap": 14108917, - "income": 24000000 + "cumulative_annual_gap": 150574753 }, { "age": 90, + "annual_expense": 38871095, + "annual_gap": 14871095, + "annual_income": 24000000, "asset": 178804019, - "cumulative_gap": 165445848, - "expense": 38871095, - "gap": 14871095, - "income": 24000000 + "cumulative_annual_gap": 165445848 }, { "age": 91, + "annual_expense": 39648517, + "annual_gap": 15648517, + "annual_income": 24000000, "asset": 168850912, - "cumulative_gap": 181094365, - "expense": 39648517, - "gap": 15648517, - "income": 24000000 + "cumulative_annual_gap": 181094365 }, { "age": 92, + "annual_expense": 40441487, + "annual_gap": 16441487, + "annual_income": 24000000, "asset": 157798467, - "cumulative_gap": 197535852, - "expense": 40441487, - "gap": 16441487, - "income": 24000000 + "cumulative_annual_gap": 197535852 }, { "age": 93, + "annual_expense": 41250317, + "annual_gap": 17250317, + "annual_income": 24000000, "asset": 145597689, - "cumulative_gap": 214786169, - "expense": 41250317, - "gap": 17250317, - "income": 24000000 + "cumulative_annual_gap": 214786169 }, { "age": 94, + "annual_expense": 42075323, + "annual_gap": 18075323, + "annual_income": 24000000, "asset": 132197793, - "cumulative_gap": 232861492, - "expense": 42075323, - "gap": 18075323, - "income": 24000000 + "cumulative_annual_gap": 232861492 }, { "age": 95, + "annual_expense": 42916830, + "annual_gap": 18916830, + "annual_income": 24000000, "asset": 117546144, - "cumulative_gap": 251778322, - "expense": 42916830, - "gap": 18916830, - "income": 24000000 + "cumulative_annual_gap": 251778322 }, { "age": 96, + "annual_expense": 43775166, + "annual_gap": 19775166, + "annual_income": 24000000, "asset": 101588193, - "cumulative_gap": 271553489, - "expense": 43775166, - "gap": 19775166, - "income": 24000000 + "cumulative_annual_gap": 271553489 }, { "age": 97, + "annual_expense": 44650670, + "annual_gap": 20650670, + "annual_income": 24000000, "asset": 84267418, - "cumulative_gap": 292204158, - "expense": 44650670, - "gap": 20650670, - "income": 24000000 + "cumulative_annual_gap": 292204158 }, { "age": 98, + "annual_expense": 45543683, + "annual_gap": 21543683, + "annual_income": 24000000, "asset": 65525250, - "cumulative_gap": 313747841, - "expense": 45543683, - "gap": 21543683, - "income": 24000000 + "cumulative_annual_gap": 313747841 }, { "age": 99, + "annual_expense": 46454557, + "annual_gap": 22454557, + "annual_income": 24000000, "asset": 45301014, - "cumulative_gap": 336202398, - "expense": 46454557, - "gap": 22454557, - "income": 24000000 + "cumulative_annual_gap": 336202398 }, { "age": 100, + "annual_expense": 47383648, + "annual_gap": 23383648, + "annual_income": 24000000, "asset": 23531851, - "cumulative_gap": 359586046, - "expense": 47383648, - "gap": 23383648, - "income": 24000000 + "cumulative_annual_gap": 359586046 } ] }, diff --git a/fastapi/tests/golden/recommendations_sufficient.json b/fastapi/tests/golden/recommendations_sufficient.json index 8175461..1459e68 100644 --- a/fastapi/tests/golden/recommendations_sufficient.json +++ b/fastapi/tests/golden/recommendations_sufficient.json @@ -12,291 +12,291 @@ "timeline": [ { "age": 65, + "annual_expense": 18000000, + "annual_gap": -6000000, + "annual_income": 24000000, "asset": 100000000, - "cumulative_gap": -6000000, - "expense": 18000000, - "gap": -6000000, - "income": 24000000 + "cumulative_annual_gap": -6000000 }, { "age": 66, + "annual_expense": 18360000, + "annual_gap": -5640000, + "annual_income": 24000000, "asset": 109180000, - "cumulative_gap": -11640000, - "expense": 18360000, - "gap": -5640000, - "income": 24000000 + "cumulative_annual_gap": -11640000 }, { "age": 67, + "annual_expense": 18727200, + "annual_gap": -5272800, + "annual_income": 24000000, "asset": 118264600, - "cumulative_gap": -16912800, - "expense": 18727200, - "gap": -5272800, - "income": 24000000 + "cumulative_annual_gap": -16912800 }, { "age": 68, + "annual_expense": 19101744, + "annual_gap": -4898256, + "annual_income": 24000000, "asset": 127243522, - "cumulative_gap": -21811056, - "expense": 19101744, - "gap": -4898256, - "income": 24000000 + "cumulative_annual_gap": -21811056 }, { "age": 69, + "annual_expense": 19483779, + "annual_gap": -4516221, + "annual_income": 24000000, "asset": 136106031, - "cumulative_gap": -26327277, - "expense": 19483779, - "gap": -4516221, - "income": 24000000 + "cumulative_annual_gap": -26327277 }, { "age": 70, + "annual_expense": 19873454, + "annual_gap": -4126546, + "annual_income": 24000000, "asset": 144840920, - "cumulative_gap": -30453823, - "expense": 19873454, - "gap": -4126546, - "income": 24000000 + "cumulative_annual_gap": -30453823 }, { "age": 71, + "annual_expense": 20270924, + "annual_gap": -3729076, + "annual_income": 24000000, "asset": 153436490, - "cumulative_gap": -34182899, - "expense": 20270924, - "gap": -3729076, - "income": 24000000 + "cumulative_annual_gap": -34182899 }, { "age": 72, + "annual_expense": 20676342, + "annual_gap": -3323658, + "annual_income": 24000000, "asset": 161880533, - "cumulative_gap": -37506557, - "expense": 20676342, - "gap": -3323658, - "income": 24000000 + "cumulative_annual_gap": -37506557 }, { "age": 73, + "annual_expense": 21089869, + "annual_gap": -2910131, + "annual_income": 24000000, "asset": 170160317, - "cumulative_gap": -40416688, - "expense": 21089869, - "gap": -2910131, - "income": 24000000 + "cumulative_annual_gap": -40416688 }, { "age": 74, + "annual_expense": 21511666, + "annual_gap": -2488334, + "annual_income": 24000000, "asset": 178262561, - "cumulative_gap": -42905022, - "expense": 21511666, - "gap": -2488334, - "income": 24000000 + "cumulative_annual_gap": -42905022 }, { "age": 75, + "annual_expense": 21941900, + "annual_gap": -2058100, + "annual_income": 24000000, "asset": 186173422, - "cumulative_gap": -44963122, - "expense": 21941900, - "gap": -2058100, - "income": 24000000 + "cumulative_annual_gap": -44963122 }, { "age": 76, + "annual_expense": 22380738, + "annual_gap": -1619262, + "annual_income": 24000000, "asset": 193878468, - "cumulative_gap": -46582385, - "expense": 22380738, - "gap": -1619262, - "income": 24000000 + "cumulative_annual_gap": -46582385 }, { "age": 77, + "annual_expense": 22828352, + "annual_gap": -1171648, + "annual_income": 24000000, "asset": 201362662, - "cumulative_gap": -47754033, - "expense": 22828352, - "gap": -1171648, - "income": 24000000 + "cumulative_annual_gap": -47754033 }, { "age": 78, + "annual_expense": 23284919, + "annual_gap": -715081, + "annual_income": 24000000, "asset": 208610339, - "cumulative_gap": -48469113, - "expense": 23284919, - "gap": -715081, - "income": 24000000 + "cumulative_annual_gap": -48469113 }, { "age": 79, + "annual_expense": 23750618, + "annual_gap": -249382, + "annual_income": 24000000, "asset": 215605183, - "cumulative_gap": -48718496, - "expense": 23750618, - "gap": -249382, - "income": 24000000 + "cumulative_annual_gap": -48718496 }, { "age": 80, + "annual_expense": 24225630, + "annual_gap": 225630, + "annual_income": 24000000, "asset": 222330202, - "cumulative_gap": -48492865, - "expense": 24225630, - "gap": 225630, - "income": 24000000 + "cumulative_annual_gap": -48492865 }, { "age": 81, + "annual_expense": 24710143, + "annual_gap": 710143, + "annual_income": 24000000, "asset": 228767709, - "cumulative_gap": -47782723, - "expense": 24710143, - "gap": 710143, - "income": 24000000 + "cumulative_annual_gap": -47782723 }, { "age": 82, + "annual_expense": 25204346, + "annual_gap": 1204346, + "annual_income": 24000000, "asset": 234899293, - "cumulative_gap": -46578377, - "expense": 25204346, - "gap": 1204346, - "income": 24000000 + "cumulative_annual_gap": -46578377 }, { "age": 83, + "annual_expense": 25708432, + "annual_gap": 1708432, + "annual_income": 24000000, "asset": 240705796, - "cumulative_gap": -44869945, - "expense": 25708432, - "gap": 1708432, - "income": 24000000 + "cumulative_annual_gap": -44869945 }, { "age": 84, + "annual_expense": 26222601, + "annual_gap": 2222601, + "annual_income": 24000000, "asset": 246167285, - "cumulative_gap": -42647344, - "expense": 26222601, - "gap": 2222601, - "income": 24000000 + "cumulative_annual_gap": -42647344 }, { "age": 85, + "annual_expense": 26747053, + "annual_gap": 2747053, + "annual_income": 24000000, "asset": 251263024, - "cumulative_gap": -39900290, - "expense": 26747053, - "gap": 2747053, - "income": 24000000 + "cumulative_annual_gap": -39900290 }, { "age": 86, + "annual_expense": 27281994, + "annual_gap": 3281994, + "annual_income": 24000000, "asset": 255971450, - "cumulative_gap": -36618296, - "expense": 27281994, - "gap": 3281994, - "income": 24000000 + "cumulative_annual_gap": -36618296 }, { "age": 87, + "annual_expense": 27827634, + "annual_gap": 3827634, + "annual_income": 24000000, "asset": 260270139, - "cumulative_gap": -32790662, - "expense": 27827634, - "gap": 3827634, - "income": 24000000 + "cumulative_annual_gap": -32790662 }, { "age": 88, + "annual_expense": 28384187, + "annual_gap": 4384187, + "annual_income": 24000000, "asset": 264135780, - "cumulative_gap": -28406475, - "expense": 28384187, - "gap": 4384187, - "income": 24000000 + "cumulative_annual_gap": -28406475 }, { "age": 89, + "annual_expense": 28951870, + "annual_gap": 4951870, + "annual_income": 24000000, "asset": 267544142, - "cumulative_gap": -23454605, - "expense": 28951870, - "gap": 4951870, - "income": 24000000 + "cumulative_annual_gap": -23454605 }, { "age": 90, + "annual_expense": 29530908, + "annual_gap": 5530908, + "annual_income": 24000000, "asset": 270470039, - "cumulative_gap": -17923697, - "expense": 29530908, - "gap": 5530908, - "income": 24000000 + "cumulative_annual_gap": -17923697 }, { "age": 91, + "annual_expense": 30121526, + "annual_gap": 6121526, + "annual_income": 24000000, "asset": 272887305, - "cumulative_gap": -11802171, - "expense": 30121526, - "gap": 6121526, - "income": 24000000 + "cumulative_annual_gap": -11802171 }, { "age": 92, + "annual_expense": 30723957, + "annual_gap": 6723957, + "annual_income": 24000000, "asset": 274768753, - "cumulative_gap": -5078214, - "expense": 30723957, - "gap": 6723957, - "income": 24000000 + "cumulative_annual_gap": -5078214 }, { "age": 93, + "annual_expense": 31338436, + "annual_gap": 7338436, + "annual_income": 24000000, "asset": 276086140, - "cumulative_gap": 2260221, - "expense": 31338436, - "gap": 7338436, - "income": 24000000 + "cumulative_annual_gap": 2260221 }, { "age": 94, + "annual_expense": 31965204, + "annual_gap": 7965204, + "annual_income": 24000000, "asset": 276810135, - "cumulative_gap": 10225426, - "expense": 31965204, - "gap": 7965204, - "income": 24000000 + "cumulative_annual_gap": 10225426 }, { "age": 95, + "annual_expense": 32604509, + "annual_gap": 8604509, + "annual_income": 24000000, "asset": 276910279, - "cumulative_gap": 18829934, - "expense": 32604509, - "gap": 8604509, - "income": 24000000 + "cumulative_annual_gap": 18829934 }, { "age": 96, + "annual_expense": 33256599, + "annual_gap": 9256599, + "annual_income": 24000000, "asset": 276354943, - "cumulative_gap": 28086533, - "expense": 33256599, - "gap": 9256599, - "income": 24000000 + "cumulative_annual_gap": 28086533 }, { "age": 97, + "annual_expense": 33921731, + "annual_gap": 9921731, + "annual_income": 24000000, "asset": 275111295, - "cumulative_gap": 38008264, - "expense": 33921731, - "gap": 9921731, - "income": 24000000 + "cumulative_annual_gap": 38008264 }, { "age": 98, + "annual_expense": 34600165, + "annual_gap": 10600165, + "annual_income": 24000000, "asset": 273145251, - "cumulative_gap": 48608429, - "expense": 34600165, - "gap": 10600165, - "income": 24000000 + "cumulative_annual_gap": 48608429 }, { "age": 99, + "annual_expense": 35292169, + "annual_gap": 11292169, + "annual_income": 24000000, "asset": 270421439, - "cumulative_gap": 59900597, - "expense": 35292169, - "gap": 11292169, - "income": 24000000 + "cumulative_annual_gap": 59900597 }, { "age": 100, + "annual_expense": 35998012, + "annual_gap": 11998012, + "annual_income": 24000000, "asset": 266903148, - "cumulative_gap": 71898609, - "expense": 35998012, - "gap": 11998012, - "income": 24000000 + "cumulative_annual_gap": 71898609 } ] }, diff --git a/fastapi/tests/golden/reduction_capped.json b/fastapi/tests/golden/reduction_capped.json index 33c5fdb..8bc5f61 100644 --- a/fastapi/tests/golden/reduction_capped.json +++ b/fastapi/tests/golden/reduction_capped.json @@ -12,331 +12,331 @@ "timeline": [ { "age": 60, + "annual_expense": 24000000, + "annual_gap": 15000000, + "annual_income": 9000000, "asset": 100000000, - "cumulative_gap": 15000000, - "expense": 24000000, - "gap": 15000000, - "income": 9000000 + "cumulative_annual_gap": 15000000 }, { "age": 61, + "annual_expense": 24480000, + "annual_gap": 15480000, + "annual_income": 9000000, "asset": 87550000, - "cumulative_gap": 30480000, - "expense": 24480000, - "gap": 15480000, - "income": 9000000 + "cumulative_annual_gap": 30480000 }, { "age": 62, + "annual_expense": 24969600, + "annual_gap": 15969600, + "annual_income": 9000000, "asset": 74232100, - "cumulative_gap": 46449600, - "expense": 24969600, - "gap": 15969600, - "income": 9000000 + "cumulative_annual_gap": 46449600 }, { "age": 63, + "annual_expense": 25468992, + "annual_gap": 16468992, + "annual_income": 9000000, "asset": 60010375, - "cumulative_gap": 62918592, - "expense": 25468992, - "gap": 16468992, - "income": 9000000 + "cumulative_annual_gap": 62918592 }, { "age": 64, + "annual_expense": 25978372, + "annual_gap": 16978372, + "annual_income": 9000000, "asset": 44847624, - "cumulative_gap": 79896964, - "expense": 25978372, - "gap": 16978372, - "income": 9000000 + "cumulative_annual_gap": 79896964 }, { "age": 65, + "annual_expense": 26497939, + "annual_gap": 17497939, + "annual_income": 9000000, "asset": 28705330, - "cumulative_gap": 97394903, - "expense": 26497939, - "gap": 17497939, - "income": 9000000 + "cumulative_annual_gap": 97394903 }, { "age": 66, + "annual_expense": 27027898, + "annual_gap": 18027898, + "annual_income": 9000000, "asset": 11543613, - "cumulative_gap": 115422801, - "expense": 27027898, - "gap": 18027898, - "income": 9000000 + "cumulative_annual_gap": 115422801 }, { "age": 67, + "annual_expense": 27568456, + "annual_gap": 18568456, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 133991257, - "expense": 27568456, - "gap": 18568456, - "income": 9000000 + "cumulative_annual_gap": 133991257 }, { "age": 68, + "annual_expense": 28119825, + "annual_gap": 19119825, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 153111082, - "expense": 28119825, - "gap": 19119825, - "income": 9000000 + "cumulative_annual_gap": 153111082 }, { "age": 69, + "annual_expense": 28682222, + "annual_gap": 19682222, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 172793304, - "expense": 28682222, - "gap": 19682222, - "income": 9000000 + "cumulative_annual_gap": 172793304 }, { "age": 70, + "annual_expense": 29255866, + "annual_gap": 20255866, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 193049170, - "expense": 29255866, - "gap": 20255866, - "income": 9000000 + "cumulative_annual_gap": 193049170 }, { "age": 71, + "annual_expense": 29840983, + "annual_gap": 20840983, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 213890153, - "expense": 29840983, - "gap": 20840983, - "income": 9000000 + "cumulative_annual_gap": 213890153 }, { "age": 72, + "annual_expense": 30437803, + "annual_gap": 21437803, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 235327957, - "expense": 30437803, - "gap": 21437803, - "income": 9000000 + "cumulative_annual_gap": 235327957 }, { "age": 73, + "annual_expense": 31046559, + "annual_gap": 22046559, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 257374516, - "expense": 31046559, - "gap": 22046559, - "income": 9000000 + "cumulative_annual_gap": 257374516 }, { "age": 74, + "annual_expense": 31667490, + "annual_gap": 22667490, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 280042006, - "expense": 31667490, - "gap": 22667490, - "income": 9000000 + "cumulative_annual_gap": 280042006 }, { "age": 75, + "annual_expense": 32300840, + "annual_gap": 23300840, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 303342846, - "expense": 32300840, - "gap": 23300840, - "income": 9000000 + "cumulative_annual_gap": 303342846 }, { "age": 76, + "annual_expense": 32946857, + "annual_gap": 23946857, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 327289703, - "expense": 32946857, - "gap": 23946857, - "income": 9000000 + "cumulative_annual_gap": 327289703 }, { "age": 77, + "annual_expense": 33605794, + "annual_gap": 24605794, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 351895497, - "expense": 33605794, - "gap": 24605794, - "income": 9000000 + "cumulative_annual_gap": 351895497 }, { "age": 78, + "annual_expense": 34277910, + "annual_gap": 25277910, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 377173407, - "expense": 34277910, - "gap": 25277910, - "income": 9000000 + "cumulative_annual_gap": 377173407 }, { "age": 79, + "annual_expense": 34963468, + "annual_gap": 25963468, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 403136875, - "expense": 34963468, - "gap": 25963468, - "income": 9000000 + "cumulative_annual_gap": 403136875 }, { "age": 80, + "annual_expense": 35662738, + "annual_gap": 26662738, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 429799613, - "expense": 35662738, - "gap": 26662738, - "income": 9000000 + "cumulative_annual_gap": 429799613 }, { "age": 81, + "annual_expense": 36375992, + "annual_gap": 27375992, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 457175605, - "expense": 36375992, - "gap": 27375992, - "income": 9000000 + "cumulative_annual_gap": 457175605 }, { "age": 82, + "annual_expense": 37103512, + "annual_gap": 28103512, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 485279117, - "expense": 37103512, - "gap": 28103512, - "income": 9000000 + "cumulative_annual_gap": 485279117 }, { "age": 83, + "annual_expense": 37845582, + "annual_gap": 28845582, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 514124699, - "expense": 37845582, - "gap": 28845582, - "income": 9000000 + "cumulative_annual_gap": 514124699 }, { "age": 84, + "annual_expense": 38602494, + "annual_gap": 29602494, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 543727193, - "expense": 38602494, - "gap": 29602494, - "income": 9000000 + "cumulative_annual_gap": 543727193 }, { "age": 85, + "annual_expense": 39374544, + "annual_gap": 30374544, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 574101737, - "expense": 39374544, - "gap": 30374544, - "income": 9000000 + "cumulative_annual_gap": 574101737 }, { "age": 86, + "annual_expense": 40162035, + "annual_gap": 31162035, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 605263772, - "expense": 40162035, - "gap": 31162035, - "income": 9000000 + "cumulative_annual_gap": 605263772 }, { "age": 87, + "annual_expense": 40965275, + "annual_gap": 31965275, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 637229047, - "expense": 40965275, - "gap": 31965275, - "income": 9000000 + "cumulative_annual_gap": 637229047 }, { "age": 88, + "annual_expense": 41784581, + "annual_gap": 32784581, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 670013628, - "expense": 41784581, - "gap": 32784581, - "income": 9000000 + "cumulative_annual_gap": 670013628 }, { "age": 89, + "annual_expense": 42620273, + "annual_gap": 33620273, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 703633901, - "expense": 42620273, - "gap": 33620273, - "income": 9000000 + "cumulative_annual_gap": 703633901 }, { "age": 90, + "annual_expense": 43472678, + "annual_gap": 34472678, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 738106579, - "expense": 43472678, - "gap": 34472678, - "income": 9000000 + "cumulative_annual_gap": 738106579 }, { "age": 91, + "annual_expense": 44342132, + "annual_gap": 35342132, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 773448711, - "expense": 44342132, - "gap": 35342132, - "income": 9000000 + "cumulative_annual_gap": 773448711 }, { "age": 92, + "annual_expense": 45228974, + "annual_gap": 36228974, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 809677685, - "expense": 45228974, - "gap": 36228974, - "income": 9000000 + "cumulative_annual_gap": 809677685 }, { "age": 93, + "annual_expense": 46133554, + "annual_gap": 37133554, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 846811238, - "expense": 46133554, - "gap": 37133554, - "income": 9000000 + "cumulative_annual_gap": 846811238 }, { "age": 94, + "annual_expense": 47056225, + "annual_gap": 38056225, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 884867463, - "expense": 47056225, - "gap": 38056225, - "income": 9000000 + "cumulative_annual_gap": 884867463 }, { "age": 95, + "annual_expense": 47997349, + "annual_gap": 38997349, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 923864812, - "expense": 47997349, - "gap": 38997349, - "income": 9000000 + "cumulative_annual_gap": 923864812 }, { "age": 96, + "annual_expense": 48957296, + "annual_gap": 39957296, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 963822109, - "expense": 48957296, - "gap": 39957296, - "income": 9000000 + "cumulative_annual_gap": 963822109 }, { "age": 97, + "annual_expense": 49936442, + "annual_gap": 40936442, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 1004758551, - "expense": 49936442, - "gap": 40936442, - "income": 9000000 + "cumulative_annual_gap": 1004758551 }, { "age": 98, + "annual_expense": 50935171, + "annual_gap": 41935171, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 1046693722, - "expense": 50935171, - "gap": 41935171, - "income": 9000000 + "cumulative_annual_gap": 1046693722 }, { "age": 99, + "annual_expense": 51953874, + "annual_gap": 42953874, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 1089647596, - "expense": 51953874, - "gap": 42953874, - "income": 9000000 + "cumulative_annual_gap": 1089647596 }, { "age": 100, + "annual_expense": 52992952, + "annual_gap": 43992952, + "annual_income": 9000000, "asset": 0, - "cumulative_gap": 1133640548, - "expense": 52992952, - "gap": 43992952, - "income": 9000000 + "cumulative_annual_gap": 1133640548 } ] }, diff --git a/fastapi/tests/golden/reduction_no_reduction.json b/fastapi/tests/golden/reduction_no_reduction.json index d7bb05d..c4be98e 100644 --- a/fastapi/tests/golden/reduction_no_reduction.json +++ b/fastapi/tests/golden/reduction_no_reduction.json @@ -12,331 +12,331 @@ "timeline": [ { "age": 60, + "annual_expense": 24000000, + "annual_gap": 6000000, + "annual_income": 18000000, "asset": 100000000, - "cumulative_gap": 6000000, - "expense": 24000000, - "gap": 6000000, - "income": 18000000 + "cumulative_annual_gap": 6000000 }, { "age": 61, + "annual_expense": 24480000, + "annual_gap": 6480000, + "annual_income": 18000000, "asset": 96820000, - "cumulative_gap": 12480000, - "expense": 24480000, - "gap": 6480000, - "income": 18000000 + "cumulative_annual_gap": 12480000 }, { "age": 62, + "annual_expense": 24969600, + "annual_gap": 6969600, + "annual_income": 18000000, "asset": 93050200, - "cumulative_gap": 19449600, - "expense": 24969600, - "gap": 6969600, - "income": 18000000 + "cumulative_annual_gap": 19449600 }, { "age": 63, + "annual_expense": 25468992, + "annual_gap": 7468992, + "annual_income": 18000000, "asset": 88663018, - "cumulative_gap": 26918592, - "expense": 25468992, - "gap": 7468992, - "income": 18000000 + "cumulative_annual_gap": 26918592 }, { "age": 64, + "annual_expense": 25978372, + "annual_gap": 7978372, + "annual_income": 18000000, "asset": 83629847, - "cumulative_gap": 34896964, - "expense": 25978372, - "gap": 7978372, - "income": 18000000 + "cumulative_annual_gap": 34896964 }, { "age": 65, + "annual_expense": 26497939, + "annual_gap": 8497939, + "annual_income": 18000000, "asset": 77921019, - "cumulative_gap": 43394903, - "expense": 26497939, - "gap": 8497939, - "income": 18000000 + "cumulative_annual_gap": 43394903 }, { "age": 66, + "annual_expense": 27027898, + "annual_gap": 9027898, + "annual_income": 18000000, "asset": 71505772, - "cumulative_gap": 52422801, - "expense": 27027898, - "gap": 9027898, - "income": 18000000 + "cumulative_annual_gap": 52422801 }, { "age": 67, + "annual_expense": 27568456, + "annual_gap": 9568456, + "annual_income": 18000000, "asset": 64352210, - "cumulative_gap": 61991257, - "expense": 27568456, - "gap": 9568456, - "income": 18000000 + "cumulative_annual_gap": 61991257 }, { "age": 68, + "annual_expense": 28119825, + "annual_gap": 10119825, + "annual_income": 18000000, "asset": 56427267, - "cumulative_gap": 72111082, - "expense": 28119825, - "gap": 10119825, - "income": 18000000 + "cumulative_annual_gap": 72111082 }, { "age": 69, + "annual_expense": 28682222, + "annual_gap": 10682222, + "annual_income": 18000000, "asset": 47696665, - "cumulative_gap": 82793304, - "expense": 28682222, - "gap": 10682222, - "income": 18000000 + "cumulative_annual_gap": 82793304 }, { "age": 70, + "annual_expense": 29255866, + "annual_gap": 11255866, + "annual_income": 18000000, "asset": 38124877, - "cumulative_gap": 94049170, - "expense": 29255866, - "gap": 11255866, - "income": 18000000 + "cumulative_annual_gap": 94049170 }, { "age": 71, + "annual_expense": 29840983, + "annual_gap": 11840983, + "annual_income": 18000000, "asset": 27675081, - "cumulative_gap": 105890153, - "expense": 29840983, - "gap": 11840983, - "income": 18000000 + "cumulative_annual_gap": 105890153 }, { "age": 72, + "annual_expense": 30437803, + "annual_gap": 12437803, + "annual_income": 18000000, "asset": 16309121, - "cumulative_gap": 118327957, - "expense": 30437803, - "gap": 12437803, - "income": 18000000 + "cumulative_annual_gap": 118327957 }, { "age": 73, + "annual_expense": 31046559, + "annual_gap": 13046559, + "annual_income": 18000000, "asset": 3987457, - "cumulative_gap": 131374516, - "expense": 31046559, - "gap": 13046559, - "income": 18000000 + "cumulative_annual_gap": 131374516 }, { "age": 74, + "annual_expense": 31667490, + "annual_gap": 13667490, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 145042006, - "expense": 31667490, - "gap": 13667490, - "income": 18000000 + "cumulative_annual_gap": 145042006 }, { "age": 75, + "annual_expense": 32300840, + "annual_gap": 14300840, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 159342846, - "expense": 32300840, - "gap": 14300840, - "income": 18000000 + "cumulative_annual_gap": 159342846 }, { "age": 76, + "annual_expense": 32946857, + "annual_gap": 14946857, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 174289703, - "expense": 32946857, - "gap": 14946857, - "income": 18000000 + "cumulative_annual_gap": 174289703 }, { "age": 77, + "annual_expense": 33605794, + "annual_gap": 15605794, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 189895497, - "expense": 33605794, - "gap": 15605794, - "income": 18000000 + "cumulative_annual_gap": 189895497 }, { "age": 78, + "annual_expense": 34277910, + "annual_gap": 16277910, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 206173407, - "expense": 34277910, - "gap": 16277910, - "income": 18000000 + "cumulative_annual_gap": 206173407 }, { "age": 79, + "annual_expense": 34963468, + "annual_gap": 16963468, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 223136875, - "expense": 34963468, - "gap": 16963468, - "income": 18000000 + "cumulative_annual_gap": 223136875 }, { "age": 80, + "annual_expense": 35662738, + "annual_gap": 17662738, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 240799613, - "expense": 35662738, - "gap": 17662738, - "income": 18000000 + "cumulative_annual_gap": 240799613 }, { "age": 81, + "annual_expense": 36375992, + "annual_gap": 18375992, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 259175605, - "expense": 36375992, - "gap": 18375992, - "income": 18000000 + "cumulative_annual_gap": 259175605 }, { "age": 82, + "annual_expense": 37103512, + "annual_gap": 19103512, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 278279117, - "expense": 37103512, - "gap": 19103512, - "income": 18000000 + "cumulative_annual_gap": 278279117 }, { "age": 83, + "annual_expense": 37845582, + "annual_gap": 19845582, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 298124699, - "expense": 37845582, - "gap": 19845582, - "income": 18000000 + "cumulative_annual_gap": 298124699 }, { "age": 84, + "annual_expense": 38602494, + "annual_gap": 20602494, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 318727193, - "expense": 38602494, - "gap": 20602494, - "income": 18000000 + "cumulative_annual_gap": 318727193 }, { "age": 85, + "annual_expense": 39374544, + "annual_gap": 21374544, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 340101737, - "expense": 39374544, - "gap": 21374544, - "income": 18000000 + "cumulative_annual_gap": 340101737 }, { "age": 86, + "annual_expense": 40162035, + "annual_gap": 22162035, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 362263772, - "expense": 40162035, - "gap": 22162035, - "income": 18000000 + "cumulative_annual_gap": 362263772 }, { "age": 87, + "annual_expense": 40965275, + "annual_gap": 22965275, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 385229047, - "expense": 40965275, - "gap": 22965275, - "income": 18000000 + "cumulative_annual_gap": 385229047 }, { "age": 88, + "annual_expense": 41784581, + "annual_gap": 23784581, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 409013628, - "expense": 41784581, - "gap": 23784581, - "income": 18000000 + "cumulative_annual_gap": 409013628 }, { "age": 89, + "annual_expense": 42620273, + "annual_gap": 24620273, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 433633901, - "expense": 42620273, - "gap": 24620273, - "income": 18000000 + "cumulative_annual_gap": 433633901 }, { "age": 90, + "annual_expense": 43472678, + "annual_gap": 25472678, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 459106579, - "expense": 43472678, - "gap": 25472678, - "income": 18000000 + "cumulative_annual_gap": 459106579 }, { "age": 91, + "annual_expense": 44342132, + "annual_gap": 26342132, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 485448711, - "expense": 44342132, - "gap": 26342132, - "income": 18000000 + "cumulative_annual_gap": 485448711 }, { "age": 92, + "annual_expense": 45228974, + "annual_gap": 27228974, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 512677685, - "expense": 45228974, - "gap": 27228974, - "income": 18000000 + "cumulative_annual_gap": 512677685 }, { "age": 93, + "annual_expense": 46133554, + "annual_gap": 28133554, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 540811238, - "expense": 46133554, - "gap": 28133554, - "income": 18000000 + "cumulative_annual_gap": 540811238 }, { "age": 94, + "annual_expense": 47056225, + "annual_gap": 29056225, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 569867463, - "expense": 47056225, - "gap": 29056225, - "income": 18000000 + "cumulative_annual_gap": 569867463 }, { "age": 95, + "annual_expense": 47997349, + "annual_gap": 29997349, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 599864812, - "expense": 47997349, - "gap": 29997349, - "income": 18000000 + "cumulative_annual_gap": 599864812 }, { "age": 96, + "annual_expense": 48957296, + "annual_gap": 30957296, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 630822109, - "expense": 48957296, - "gap": 30957296, - "income": 18000000 + "cumulative_annual_gap": 630822109 }, { "age": 97, + "annual_expense": 49936442, + "annual_gap": 31936442, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 662758551, - "expense": 49936442, - "gap": 31936442, - "income": 18000000 + "cumulative_annual_gap": 662758551 }, { "age": 98, + "annual_expense": 50935171, + "annual_gap": 32935171, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 695693722, - "expense": 50935171, - "gap": 32935171, - "income": 18000000 + "cumulative_annual_gap": 695693722 }, { "age": 99, + "annual_expense": 51953874, + "annual_gap": 33953874, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 729647596, - "expense": 51953874, - "gap": 33953874, - "income": 18000000 + "cumulative_annual_gap": 729647596 }, { "age": 100, + "annual_expense": 52992952, + "annual_gap": 34992952, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 764640548, - "expense": 52992952, - "gap": 34992952, - "income": 18000000 + "cumulative_annual_gap": 764640548 } ] }, diff --git a/fastapi/tests/golden/reduction_partial.json b/fastapi/tests/golden/reduction_partial.json index 2b35fe1..da26083 100644 --- a/fastapi/tests/golden/reduction_partial.json +++ b/fastapi/tests/golden/reduction_partial.json @@ -12,331 +12,331 @@ "timeline": [ { "age": 60, + "annual_expense": 24000000, + "annual_gap": 7683600, + "annual_income": 16316400, "asset": 100000000, - "cumulative_gap": 7683600, - "expense": 24000000, - "gap": 7683600, - "income": 16316400 + "cumulative_annual_gap": 7683600 }, { "age": 61, + "annual_expense": 24480000, + "annual_gap": 8163600, + "annual_income": 16316400, "asset": 95085892, - "cumulative_gap": 15847200, - "expense": 24480000, - "gap": 8163600, - "income": 16316400 + "cumulative_annual_gap": 15847200 }, { "age": 62, + "annual_expense": 24969600, + "annual_gap": 8653200, + "annual_income": 16316400, "asset": 89529961, - "cumulative_gap": 24500400, - "expense": 24969600, - "gap": 8653200, - "income": 16316400 + "cumulative_annual_gap": 24500400 }, { "age": 63, + "annual_expense": 25468992, + "annual_gap": 9152592, + "annual_income": 16316400, "asset": 83303064, - "cumulative_gap": 33652992, - "expense": 25468992, - "gap": 9152592, - "income": 16316400 + "cumulative_annual_gap": 33652992 }, { "age": 64, + "annual_expense": 25978372, + "annual_gap": 9661972, + "annual_income": 16316400, "asset": 76374986, - "cumulative_gap": 43314964, - "expense": 25978372, - "gap": 9661972, - "income": 16316400 + "cumulative_annual_gap": 43314964 }, { "age": 65, + "annual_expense": 26497939, + "annual_gap": 10181539, + "annual_income": 16316400, "asset": 68714404, - "cumulative_gap": 53496503, - "expense": 26497939, - "gap": 10181539, - "income": 16316400 + "cumulative_annual_gap": 53496503 }, { "age": 66, + "annual_expense": 27027898, + "annual_gap": 10711498, + "annual_income": 16316400, "asset": 60288851, - "cumulative_gap": 64208001, - "expense": 27027898, - "gap": 10711498, - "income": 16316400 + "cumulative_annual_gap": 64208001 }, { "age": 67, + "annual_expense": 27568456, + "annual_gap": 11252056, + "annual_income": 16316400, "asset": 51064674, - "cumulative_gap": 75460057, - "expense": 27568456, - "gap": 11252056, - "income": 16316400 + "cumulative_annual_gap": 75460057 }, { "age": 68, + "annual_expense": 28119825, + "annual_gap": 11803425, + "annual_income": 16316400, "asset": 41006996, - "cumulative_gap": 87263482, - "expense": 28119825, - "gap": 11803425, - "income": 16316400 + "cumulative_annual_gap": 87263482 }, { "age": 69, + "annual_expense": 28682222, + "annual_gap": 12365822, + "annual_income": 16316400, "asset": 30079678, - "cumulative_gap": 99629304, - "expense": 28682222, - "gap": 12365822, - "income": 16316400 + "cumulative_annual_gap": 99629304 }, { "age": 70, + "annual_expense": 29255866, + "annual_gap": 12939466, + "annual_income": 16316400, "asset": 18245272, - "cumulative_gap": 112568770, - "expense": 29255866, - "gap": 12939466, - "income": 16316400 + "cumulative_annual_gap": 112568770 }, { "age": 71, + "annual_expense": 29840983, + "annual_gap": 13524583, + "annual_income": 16316400, "asset": 5464980, - "cumulative_gap": 126093353, - "expense": 29840983, - "gap": 13524583, - "income": 16316400 + "cumulative_annual_gap": 126093353 }, { "age": 72, + "annual_expense": 30437803, + "annual_gap": 14121403, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 140214757, - "expense": 30437803, - "gap": 14121403, - "income": 16316400 + "cumulative_annual_gap": 140214757 }, { "age": 73, + "annual_expense": 31046559, + "annual_gap": 14730159, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 154944916, - "expense": 31046559, - "gap": 14730159, - "income": 16316400 + "cumulative_annual_gap": 154944916 }, { "age": 74, + "annual_expense": 31667490, + "annual_gap": 15351090, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 170296006, - "expense": 31667490, - "gap": 15351090, - "income": 16316400 + "cumulative_annual_gap": 170296006 }, { "age": 75, + "annual_expense": 32300840, + "annual_gap": 15984440, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 186280446, - "expense": 32300840, - "gap": 15984440, - "income": 16316400 + "cumulative_annual_gap": 186280446 }, { "age": 76, + "annual_expense": 32946857, + "annual_gap": 16630457, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 202910903, - "expense": 32946857, - "gap": 16630457, - "income": 16316400 + "cumulative_annual_gap": 202910903 }, { "age": 77, + "annual_expense": 33605794, + "annual_gap": 17289394, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 220200297, - "expense": 33605794, - "gap": 17289394, - "income": 16316400 + "cumulative_annual_gap": 220200297 }, { "age": 78, + "annual_expense": 34277910, + "annual_gap": 17961510, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 238161807, - "expense": 34277910, - "gap": 17961510, - "income": 16316400 + "cumulative_annual_gap": 238161807 }, { "age": 79, + "annual_expense": 34963468, + "annual_gap": 18647068, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 256808875, - "expense": 34963468, - "gap": 18647068, - "income": 16316400 + "cumulative_annual_gap": 256808875 }, { "age": 80, + "annual_expense": 35662738, + "annual_gap": 19346338, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 276155213, - "expense": 35662738, - "gap": 19346338, - "income": 16316400 + "cumulative_annual_gap": 276155213 }, { "age": 81, + "annual_expense": 36375992, + "annual_gap": 20059592, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 296214805, - "expense": 36375992, - "gap": 20059592, - "income": 16316400 + "cumulative_annual_gap": 296214805 }, { "age": 82, + "annual_expense": 37103512, + "annual_gap": 20787112, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 317001917, - "expense": 37103512, - "gap": 20787112, - "income": 16316400 + "cumulative_annual_gap": 317001917 }, { "age": 83, + "annual_expense": 37845582, + "annual_gap": 21529182, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 338531099, - "expense": 37845582, - "gap": 21529182, - "income": 16316400 + "cumulative_annual_gap": 338531099 }, { "age": 84, + "annual_expense": 38602494, + "annual_gap": 22286094, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 360817193, - "expense": 38602494, - "gap": 22286094, - "income": 16316400 + "cumulative_annual_gap": 360817193 }, { "age": 85, + "annual_expense": 39374544, + "annual_gap": 23058144, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 383875337, - "expense": 39374544, - "gap": 23058144, - "income": 16316400 + "cumulative_annual_gap": 383875337 }, { "age": 86, + "annual_expense": 40162035, + "annual_gap": 23845635, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 407720972, - "expense": 40162035, - "gap": 23845635, - "income": 16316400 + "cumulative_annual_gap": 407720972 }, { "age": 87, + "annual_expense": 40965275, + "annual_gap": 24648875, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 432369847, - "expense": 40965275, - "gap": 24648875, - "income": 16316400 + "cumulative_annual_gap": 432369847 }, { "age": 88, + "annual_expense": 41784581, + "annual_gap": 25468181, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 457838028, - "expense": 41784581, - "gap": 25468181, - "income": 16316400 + "cumulative_annual_gap": 457838028 }, { "age": 89, + "annual_expense": 42620273, + "annual_gap": 26303873, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 484141901, - "expense": 42620273, - "gap": 26303873, - "income": 16316400 + "cumulative_annual_gap": 484141901 }, { "age": 90, + "annual_expense": 43472678, + "annual_gap": 27156278, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 511298179, - "expense": 43472678, - "gap": 27156278, - "income": 16316400 + "cumulative_annual_gap": 511298179 }, { "age": 91, + "annual_expense": 44342132, + "annual_gap": 28025732, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 539323911, - "expense": 44342132, - "gap": 28025732, - "income": 16316400 + "cumulative_annual_gap": 539323911 }, { "age": 92, + "annual_expense": 45228974, + "annual_gap": 28912574, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 568236485, - "expense": 45228974, - "gap": 28912574, - "income": 16316400 + "cumulative_annual_gap": 568236485 }, { "age": 93, + "annual_expense": 46133554, + "annual_gap": 29817154, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 598053638, - "expense": 46133554, - "gap": 29817154, - "income": 16316400 + "cumulative_annual_gap": 598053638 }, { "age": 94, + "annual_expense": 47056225, + "annual_gap": 30739825, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 628793463, - "expense": 47056225, - "gap": 30739825, - "income": 16316400 + "cumulative_annual_gap": 628793463 }, { "age": 95, + "annual_expense": 47997349, + "annual_gap": 31680949, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 660474412, - "expense": 47997349, - "gap": 31680949, - "income": 16316400 + "cumulative_annual_gap": 660474412 }, { "age": 96, + "annual_expense": 48957296, + "annual_gap": 32640896, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 693115309, - "expense": 48957296, - "gap": 32640896, - "income": 16316400 + "cumulative_annual_gap": 693115309 }, { "age": 97, + "annual_expense": 49936442, + "annual_gap": 33620042, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 726735351, - "expense": 49936442, - "gap": 33620042, - "income": 16316400 + "cumulative_annual_gap": 726735351 }, { "age": 98, + "annual_expense": 50935171, + "annual_gap": 34618771, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 761354122, - "expense": 50935171, - "gap": 34618771, - "income": 16316400 + "cumulative_annual_gap": 761354122 }, { "age": 99, + "annual_expense": 51953874, + "annual_gap": 35637474, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 796991596, - "expense": 51953874, - "gap": 35637474, - "income": 16316400 + "cumulative_annual_gap": 796991596 }, { "age": 100, + "annual_expense": 52992952, + "annual_gap": 36676552, + "annual_income": 16316400, "asset": 0, - "cumulative_gap": 833668148, - "expense": 52992952, - "gap": 36676552, - "income": 16316400 + "cumulative_annual_gap": 833668148 } ] }, diff --git a/fastapi/tests/golden/scenarios_basic.json b/fastapi/tests/golden/scenarios_basic.json index e701582..373ea06 100644 --- a/fastapi/tests/golden/scenarios_basic.json +++ b/fastapi/tests/golden/scenarios_basic.json @@ -11,331 +11,331 @@ "timeline": [ { "age": 60, + "annual_expense": 30000000, + "annual_gap": 12000000, + "annual_income": 18000000, "asset": 100000000, - "cumulative_gap": 12000000, - "expense": 30000000, - "gap": 12000000, - "income": 18000000 + "cumulative_annual_gap": 12000000 }, { "age": 61, + "annual_expense": 30600000, + "annual_gap": 12600000, + "annual_income": 18000000, "asset": 90640000, - "cumulative_gap": 24600000, - "expense": 30600000, - "gap": 12600000, - "income": 18000000 + "cumulative_annual_gap": 24600000 }, { "age": 62, + "annual_expense": 31212000, + "annual_gap": 13212000, + "annual_income": 18000000, "asset": 80381200, - "cumulative_gap": 37812000, - "expense": 31212000, - "gap": 13212000, - "income": 18000000 + "cumulative_annual_gap": 37812000 }, { "age": 63, + "annual_expense": 31836240, + "annual_gap": 13836240, + "annual_income": 18000000, "asset": 69184276, - "cumulative_gap": 51648240, - "expense": 31836240, - "gap": 13836240, - "income": 18000000 + "cumulative_annual_gap": 51648240 }, { "age": 64, + "annual_expense": 32472965, + "annual_gap": 14472965, + "annual_income": 18000000, "asset": 57008477, - "cumulative_gap": 66121205, - "expense": 32472965, - "gap": 14472965, - "income": 18000000 + "cumulative_annual_gap": 66121205 }, { "age": 65, + "annual_expense": 33122424, + "annual_gap": 15122424, + "annual_income": 18000000, "asset": 43811578, - "cumulative_gap": 81243629, - "expense": 33122424, - "gap": 15122424, - "income": 18000000 + "cumulative_annual_gap": 81243629 }, { "age": 66, + "annual_expense": 33784873, + "annual_gap": 15784873, + "annual_income": 18000000, "asset": 29549828, - "cumulative_gap": 97028501, - "expense": 33784873, - "gap": 15784873, - "income": 18000000 + "cumulative_annual_gap": 97028501 }, { "age": 67, + "annual_expense": 34460570, + "annual_gap": 16460570, + "annual_income": 18000000, "asset": 14177904, - "cumulative_gap": 113489072, - "expense": 34460570, - "gap": 16460570, - "income": 18000000 + "cumulative_annual_gap": 113489072 }, { "age": 68, + "annual_expense": 35149781, + "annual_gap": 17149781, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 130638853, - "expense": 35149781, - "gap": 17149781, - "income": 18000000 + "cumulative_annual_gap": 130638853 }, { "age": 69, + "annual_expense": 35852777, + "annual_gap": 17852777, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 148491630, - "expense": 35852777, - "gap": 17852777, - "income": 18000000 + "cumulative_annual_gap": 148491630 }, { "age": 70, + "annual_expense": 36569833, + "annual_gap": 18569833, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 167061463, - "expense": 36569833, - "gap": 18569833, - "income": 18000000 + "cumulative_annual_gap": 167061463 }, { "age": 71, + "annual_expense": 37301229, + "annual_gap": 19301229, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 186362692, - "expense": 37301229, - "gap": 19301229, - "income": 18000000 + "cumulative_annual_gap": 186362692 }, { "age": 72, + "annual_expense": 38047254, + "annual_gap": 20047254, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 206409946, - "expense": 38047254, - "gap": 20047254, - "income": 18000000 + "cumulative_annual_gap": 206409946 }, { "age": 73, + "annual_expense": 38808199, + "annual_gap": 20808199, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 227218145, - "expense": 38808199, - "gap": 20808199, - "income": 18000000 + "cumulative_annual_gap": 227218145 }, { "age": 74, + "annual_expense": 39584363, + "annual_gap": 21584363, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 248802507, - "expense": 39584363, - "gap": 21584363, - "income": 18000000 + "cumulative_annual_gap": 248802507 }, { "age": 75, + "annual_expense": 40376050, + "annual_gap": 22376050, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 271178558, - "expense": 40376050, - "gap": 22376050, - "income": 18000000 + "cumulative_annual_gap": 271178558 }, { "age": 76, + "annual_expense": 41183571, + "annual_gap": 23183571, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 294362129, - "expense": 41183571, - "gap": 23183571, - "income": 18000000 + "cumulative_annual_gap": 294362129 }, { "age": 77, + "annual_expense": 42007243, + "annual_gap": 24007243, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 318369371, - "expense": 42007243, - "gap": 24007243, - "income": 18000000 + "cumulative_annual_gap": 318369371 }, { "age": 78, + "annual_expense": 42847387, + "annual_gap": 24847387, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 343216759, - "expense": 42847387, - "gap": 24847387, - "income": 18000000 + "cumulative_annual_gap": 343216759 }, { "age": 79, + "annual_expense": 43704335, + "annual_gap": 25704335, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 368921094, - "expense": 43704335, - "gap": 25704335, - "income": 18000000 + "cumulative_annual_gap": 368921094 }, { "age": 80, + "annual_expense": 44578422, + "annual_gap": 26578422, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 395499516, - "expense": 44578422, - "gap": 26578422, - "income": 18000000 + "cumulative_annual_gap": 395499516 }, { "age": 81, + "annual_expense": 45469990, + "annual_gap": 27469990, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 422969506, - "expense": 45469990, - "gap": 27469990, - "income": 18000000 + "cumulative_annual_gap": 422969506 }, { "age": 82, + "annual_expense": 46379390, + "annual_gap": 28379390, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 451348896, - "expense": 46379390, - "gap": 28379390, - "income": 18000000 + "cumulative_annual_gap": 451348896 }, { "age": 83, + "annual_expense": 47306978, + "annual_gap": 29306978, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 480655874, - "expense": 47306978, - "gap": 29306978, - "income": 18000000 + "cumulative_annual_gap": 480655874 }, { "age": 84, + "annual_expense": 48253117, + "annual_gap": 30253117, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 510908992, - "expense": 48253117, - "gap": 30253117, - "income": 18000000 + "cumulative_annual_gap": 510908992 }, { "age": 85, + "annual_expense": 49218180, + "annual_gap": 31218180, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 542127172, - "expense": 49218180, - "gap": 31218180, - "income": 18000000 + "cumulative_annual_gap": 542127172 }, { "age": 86, + "annual_expense": 50202543, + "annual_gap": 32202543, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 574329715, - "expense": 50202543, - "gap": 32202543, - "income": 18000000 + "cumulative_annual_gap": 574329715 }, { "age": 87, + "annual_expense": 51206594, + "annual_gap": 33206594, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 607536309, - "expense": 51206594, - "gap": 33206594, - "income": 18000000 + "cumulative_annual_gap": 607536309 }, { "age": 88, + "annual_expense": 52230726, + "annual_gap": 34230726, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 641767035, - "expense": 52230726, - "gap": 34230726, - "income": 18000000 + "cumulative_annual_gap": 641767035 }, { "age": 89, + "annual_expense": 53275341, + "annual_gap": 35275341, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 677042376, - "expense": 53275341, - "gap": 35275341, - "income": 18000000 + "cumulative_annual_gap": 677042376 }, { "age": 90, + "annual_expense": 54340848, + "annual_gap": 36340848, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 713383224, - "expense": 54340848, - "gap": 36340848, - "income": 18000000 + "cumulative_annual_gap": 713383224 }, { "age": 91, + "annual_expense": 55427664, + "annual_gap": 37427664, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 750810888, - "expense": 55427664, - "gap": 37427664, - "income": 18000000 + "cumulative_annual_gap": 750810888 }, { "age": 92, + "annual_expense": 56536218, + "annual_gap": 38536218, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 789347106, - "expense": 56536218, - "gap": 38536218, - "income": 18000000 + "cumulative_annual_gap": 789347106 }, { "age": 93, + "annual_expense": 57666942, + "annual_gap": 39666942, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 829014048, - "expense": 57666942, - "gap": 39666942, - "income": 18000000 + "cumulative_annual_gap": 829014048 }, { "age": 94, + "annual_expense": 58820281, + "annual_gap": 40820281, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 869834329, - "expense": 58820281, - "gap": 40820281, - "income": 18000000 + "cumulative_annual_gap": 869834329 }, { "age": 95, + "annual_expense": 59996687, + "annual_gap": 41996687, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 911831016, - "expense": 59996687, - "gap": 41996687, - "income": 18000000 + "cumulative_annual_gap": 911831016 }, { "age": 96, + "annual_expense": 61196620, + "annual_gap": 43196620, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 955027636, - "expense": 61196620, - "gap": 43196620, - "income": 18000000 + "cumulative_annual_gap": 955027636 }, { "age": 97, + "annual_expense": 62420553, + "annual_gap": 44420553, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 999448189, - "expense": 62420553, - "gap": 44420553, - "income": 18000000 + "cumulative_annual_gap": 999448189 }, { "age": 98, + "annual_expense": 63668964, + "annual_gap": 45668964, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 1045117152, - "expense": 63668964, - "gap": 45668964, - "income": 18000000 + "cumulative_annual_gap": 1045117152 }, { "age": 99, + "annual_expense": 64942343, + "annual_gap": 46942343, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 1092059495, - "expense": 64942343, - "gap": 46942343, - "income": 18000000 + "cumulative_annual_gap": 1092059495 }, { "age": 100, + "annual_expense": 66241190, + "annual_gap": 48241190, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 1140300685, - "expense": 66241190, - "gap": 48241190, - "income": 18000000 + "cumulative_annual_gap": 1140300685 } ], "total_received": 738000000 @@ -348,331 +348,331 @@ "timeline": [ { "age": 60, + "annual_expense": 30000000, + "annual_gap": 16500000, + "annual_income": 13500000, "asset": 100000000, - "cumulative_gap": 16500000, - "expense": 30000000, - "gap": 16500000, - "income": 13500000 + "cumulative_annual_gap": 16500000 }, { "age": 61, + "annual_expense": 30600000, + "annual_gap": 17100000, + "annual_income": 13500000, "asset": 86005000, - "cumulative_gap": 33600000, - "expense": 30600000, - "gap": 17100000, - "income": 13500000 + "cumulative_annual_gap": 33600000 }, { "age": 62, + "annual_expense": 31212000, + "annual_gap": 17712000, + "annual_income": 13500000, "asset": 70972150, - "cumulative_gap": 51312000, - "expense": 31212000, - "gap": 17712000, - "income": 13500000 + "cumulative_annual_gap": 51312000 }, { "age": 63, + "annual_expense": 31836240, + "annual_gap": 18336240, + "annual_income": 13500000, "asset": 54857954, - "cumulative_gap": 69648240, - "expense": 31836240, - "gap": 18336240, - "income": 13500000 + "cumulative_annual_gap": 69648240 }, { "age": 64, + "annual_expense": 32472965, + "annual_gap": 18972965, + "annual_income": 13500000, "asset": 37617366, - "cumulative_gap": 88621205, - "expense": 32472965, - "gap": 18972965, - "income": 13500000 + "cumulative_annual_gap": 88621205 }, { "age": 65, + "annual_expense": 33122424, + "annual_gap": 19622424, + "annual_income": 13500000, "asset": 19203733, - "cumulative_gap": 108243629, - "expense": 33122424, - "gap": 19622424, - "income": 13500000 + "cumulative_annual_gap": 108243629 }, { "age": 66, + "annual_expense": 33784873, + "annual_gap": 20284873, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 128528501, - "expense": 33784873, - "gap": 20284873, - "income": 13500000 + "cumulative_annual_gap": 128528501 }, { "age": 67, + "annual_expense": 34460570, + "annual_gap": 20960570, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 149489072, - "expense": 34460570, - "gap": 20960570, - "income": 13500000 + "cumulative_annual_gap": 149489072 }, { "age": 68, + "annual_expense": 35149781, + "annual_gap": 21649781, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 171138853, - "expense": 35149781, - "gap": 21649781, - "income": 13500000 + "cumulative_annual_gap": 171138853 }, { "age": 69, + "annual_expense": 35852777, + "annual_gap": 22352777, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 193491630, - "expense": 35852777, - "gap": 22352777, - "income": 13500000 + "cumulative_annual_gap": 193491630 }, { "age": 70, + "annual_expense": 36569833, + "annual_gap": 23069833, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 216561463, - "expense": 36569833, - "gap": 23069833, - "income": 13500000 + "cumulative_annual_gap": 216561463 }, { "age": 71, + "annual_expense": 37301229, + "annual_gap": 23801229, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 240362692, - "expense": 37301229, - "gap": 23801229, - "income": 13500000 + "cumulative_annual_gap": 240362692 }, { "age": 72, + "annual_expense": 38047254, + "annual_gap": 24547254, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 264909946, - "expense": 38047254, - "gap": 24547254, - "income": 13500000 + "cumulative_annual_gap": 264909946 }, { "age": 73, + "annual_expense": 38808199, + "annual_gap": 25308199, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 290218145, - "expense": 38808199, - "gap": 25308199, - "income": 13500000 + "cumulative_annual_gap": 290218145 }, { "age": 74, + "annual_expense": 39584363, + "annual_gap": 26084363, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 316302507, - "expense": 39584363, - "gap": 26084363, - "income": 13500000 + "cumulative_annual_gap": 316302507 }, { "age": 75, + "annual_expense": 40376050, + "annual_gap": 26876050, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 343178558, - "expense": 40376050, - "gap": 26876050, - "income": 13500000 + "cumulative_annual_gap": 343178558 }, { "age": 76, + "annual_expense": 41183571, + "annual_gap": 27683571, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 370862129, - "expense": 41183571, - "gap": 27683571, - "income": 13500000 + "cumulative_annual_gap": 370862129 }, { "age": 77, + "annual_expense": 42007243, + "annual_gap": 28507243, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 399369371, - "expense": 42007243, - "gap": 28507243, - "income": 13500000 + "cumulative_annual_gap": 399369371 }, { "age": 78, + "annual_expense": 42847387, + "annual_gap": 29347387, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 428716759, - "expense": 42847387, - "gap": 29347387, - "income": 13500000 + "cumulative_annual_gap": 428716759 }, { "age": 79, + "annual_expense": 43704335, + "annual_gap": 30204335, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 458921094, - "expense": 43704335, - "gap": 30204335, - "income": 13500000 + "cumulative_annual_gap": 458921094 }, { "age": 80, + "annual_expense": 44578422, + "annual_gap": 31078422, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 489999516, - "expense": 44578422, - "gap": 31078422, - "income": 13500000 + "cumulative_annual_gap": 489999516 }, { "age": 81, + "annual_expense": 45469990, + "annual_gap": 31969990, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 521969506, - "expense": 45469990, - "gap": 31969990, - "income": 13500000 + "cumulative_annual_gap": 521969506 }, { "age": 82, + "annual_expense": 46379390, + "annual_gap": 32879390, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 554848896, - "expense": 46379390, - "gap": 32879390, - "income": 13500000 + "cumulative_annual_gap": 554848896 }, { "age": 83, + "annual_expense": 47306978, + "annual_gap": 33806978, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 588655874, - "expense": 47306978, - "gap": 33806978, - "income": 13500000 + "cumulative_annual_gap": 588655874 }, { "age": 84, + "annual_expense": 48253117, + "annual_gap": 34753117, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 623408992, - "expense": 48253117, - "gap": 34753117, - "income": 13500000 + "cumulative_annual_gap": 623408992 }, { "age": 85, + "annual_expense": 49218180, + "annual_gap": 35718180, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 659127172, - "expense": 49218180, - "gap": 35718180, - "income": 13500000 + "cumulative_annual_gap": 659127172 }, { "age": 86, + "annual_expense": 50202543, + "annual_gap": 36702543, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 695829715, - "expense": 50202543, - "gap": 36702543, - "income": 13500000 + "cumulative_annual_gap": 695829715 }, { "age": 87, + "annual_expense": 51206594, + "annual_gap": 37706594, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 733536309, - "expense": 51206594, - "gap": 37706594, - "income": 13500000 + "cumulative_annual_gap": 733536309 }, { "age": 88, + "annual_expense": 52230726, + "annual_gap": 38730726, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 772267035, - "expense": 52230726, - "gap": 38730726, - "income": 13500000 + "cumulative_annual_gap": 772267035 }, { "age": 89, + "annual_expense": 53275341, + "annual_gap": 39775341, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 812042376, - "expense": 53275341, - "gap": 39775341, - "income": 13500000 + "cumulative_annual_gap": 812042376 }, { "age": 90, + "annual_expense": 54340848, + "annual_gap": 40840848, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 852883224, - "expense": 54340848, - "gap": 40840848, - "income": 13500000 + "cumulative_annual_gap": 852883224 }, { "age": 91, + "annual_expense": 55427664, + "annual_gap": 41927664, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 894810888, - "expense": 55427664, - "gap": 41927664, - "income": 13500000 + "cumulative_annual_gap": 894810888 }, { "age": 92, + "annual_expense": 56536218, + "annual_gap": 43036218, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 937847106, - "expense": 56536218, - "gap": 43036218, - "income": 13500000 + "cumulative_annual_gap": 937847106 }, { "age": 93, + "annual_expense": 57666942, + "annual_gap": 44166942, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 982014048, - "expense": 57666942, - "gap": 44166942, - "income": 13500000 + "cumulative_annual_gap": 982014048 }, { "age": 94, + "annual_expense": 58820281, + "annual_gap": 45320281, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1027334329, - "expense": 58820281, - "gap": 45320281, - "income": 13500000 + "cumulative_annual_gap": 1027334329 }, { "age": 95, + "annual_expense": 59996687, + "annual_gap": 46496687, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1073831016, - "expense": 59996687, - "gap": 46496687, - "income": 13500000 + "cumulative_annual_gap": 1073831016 }, { "age": 96, + "annual_expense": 61196620, + "annual_gap": 47696620, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1121527636, - "expense": 61196620, - "gap": 47696620, - "income": 13500000 + "cumulative_annual_gap": 1121527636 }, { "age": 97, + "annual_expense": 62420553, + "annual_gap": 48920553, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1170448189, - "expense": 62420553, - "gap": 48920553, - "income": 13500000 + "cumulative_annual_gap": 1170448189 }, { "age": 98, + "annual_expense": 63668964, + "annual_gap": 50168964, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1220617152, - "expense": 63668964, - "gap": 50168964, - "income": 13500000 + "cumulative_annual_gap": 1220617152 }, { "age": 99, + "annual_expense": 64942343, + "annual_gap": 51442343, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1272059495, - "expense": 64942343, - "gap": 51442343, - "income": 13500000 + "cumulative_annual_gap": 1272059495 }, { "age": 100, + "annual_expense": 66241190, + "annual_gap": 52741190, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1324800685, - "expense": 66241190, - "gap": 52741190, - "income": 13500000 + "cumulative_annual_gap": 1324800685 } ], "total_received": 553500000 @@ -685,331 +685,331 @@ "timeline": [ { "age": 60, + "annual_expense": 30000000, + "annual_gap": 30000000, + "annual_income": 0, "asset": 185312500, - "cumulative_gap": 30000000, - "expense": 30000000, - "gap": 30000000, - "income": 0 + "cumulative_annual_gap": 30000000 }, { "age": 61, + "annual_expense": 30600000, + "annual_gap": 30600000, + "annual_income": 0, "asset": 159971875, - "cumulative_gap": 60600000, - "expense": 30600000, - "gap": 30600000, - "income": 0 + "cumulative_annual_gap": 60600000 }, { "age": 62, + "annual_expense": 31212000, + "annual_gap": 31212000, + "annual_income": 0, "asset": 133253031, - "cumulative_gap": 91812000, - "expense": 31212000, - "gap": 31212000, - "income": 0 + "cumulative_annual_gap": 91812000 }, { "age": 63, + "annual_expense": 31836240, + "annual_gap": 31836240, + "annual_income": 0, "asset": 105102262, - "cumulative_gap": 123648240, - "expense": 31836240, - "gap": 31836240, - "income": 0 + "cumulative_annual_gap": 123648240 }, { "age": 64, + "annual_expense": 32472965, + "annual_gap": 32472965, + "annual_income": 0, "asset": 75464003, - "cumulative_gap": 156121205, - "expense": 32472965, - "gap": 32472965, - "income": 0 + "cumulative_annual_gap": 156121205 }, { "age": 65, + "annual_expense": 33122424, + "annual_gap": 33122424, + "annual_income": 0, "asset": 44280769, - "cumulative_gap": 189243629, - "expense": 33122424, - "gap": 33122424, - "income": 0 + "cumulative_annual_gap": 189243629 }, { "age": 66, + "annual_expense": 33784873, + "annual_gap": 33784873, + "annual_income": 0, "asset": 11493095, - "cumulative_gap": 223028501, - "expense": 33784873, - "gap": 33784873, - "income": 0 + "cumulative_annual_gap": 223028501 }, { "age": 67, + "annual_expense": 34460570, + "annual_gap": 34460570, + "annual_income": 0, "asset": 0, - "cumulative_gap": 257489072, - "expense": 34460570, - "gap": 34460570, - "income": 0 + "cumulative_annual_gap": 257489072 }, { "age": 68, + "annual_expense": 35149781, + "annual_gap": 35149781, + "annual_income": 0, "asset": 0, - "cumulative_gap": 292638853, - "expense": 35149781, - "gap": 35149781, - "income": 0 + "cumulative_annual_gap": 292638853 }, { "age": 69, + "annual_expense": 35852777, + "annual_gap": 35852777, + "annual_income": 0, "asset": 0, - "cumulative_gap": 328491630, - "expense": 35852777, - "gap": 35852777, - "income": 0 + "cumulative_annual_gap": 328491630 }, { "age": 70, + "annual_expense": 36569833, + "annual_gap": 36569833, + "annual_income": 0, "asset": 0, - "cumulative_gap": 365061463, - "expense": 36569833, - "gap": 36569833, - "income": 0 + "cumulative_annual_gap": 365061463 }, { "age": 71, + "annual_expense": 37301229, + "annual_gap": 37301229, + "annual_income": 0, "asset": 0, - "cumulative_gap": 402362692, - "expense": 37301229, - "gap": 37301229, - "income": 0 + "cumulative_annual_gap": 402362692 }, { "age": 72, + "annual_expense": 38047254, + "annual_gap": 38047254, + "annual_income": 0, "asset": 0, - "cumulative_gap": 440409946, - "expense": 38047254, - "gap": 38047254, - "income": 0 + "cumulative_annual_gap": 440409946 }, { "age": 73, + "annual_expense": 38808199, + "annual_gap": 38808199, + "annual_income": 0, "asset": 0, - "cumulative_gap": 479218145, - "expense": 38808199, - "gap": 38808199, - "income": 0 + "cumulative_annual_gap": 479218145 }, { "age": 74, + "annual_expense": 39584363, + "annual_gap": 39584363, + "annual_income": 0, "asset": 0, - "cumulative_gap": 518802507, - "expense": 39584363, - "gap": 39584363, - "income": 0 + "cumulative_annual_gap": 518802507 }, { "age": 75, + "annual_expense": 40376050, + "annual_gap": 40376050, + "annual_income": 0, "asset": 0, - "cumulative_gap": 559178558, - "expense": 40376050, - "gap": 40376050, - "income": 0 + "cumulative_annual_gap": 559178558 }, { "age": 76, + "annual_expense": 41183571, + "annual_gap": 41183571, + "annual_income": 0, "asset": 0, - "cumulative_gap": 600362129, - "expense": 41183571, - "gap": 41183571, - "income": 0 + "cumulative_annual_gap": 600362129 }, { "age": 77, + "annual_expense": 42007243, + "annual_gap": 42007243, + "annual_income": 0, "asset": 0, - "cumulative_gap": 642369371, - "expense": 42007243, - "gap": 42007243, - "income": 0 + "cumulative_annual_gap": 642369371 }, { "age": 78, + "annual_expense": 42847387, + "annual_gap": 42847387, + "annual_income": 0, "asset": 0, - "cumulative_gap": 685216759, - "expense": 42847387, - "gap": 42847387, - "income": 0 + "cumulative_annual_gap": 685216759 }, { "age": 79, + "annual_expense": 43704335, + "annual_gap": 43704335, + "annual_income": 0, "asset": 0, - "cumulative_gap": 728921094, - "expense": 43704335, - "gap": 43704335, - "income": 0 + "cumulative_annual_gap": 728921094 }, { "age": 80, + "annual_expense": 44578422, + "annual_gap": 44578422, + "annual_income": 0, "asset": 0, - "cumulative_gap": 773499516, - "expense": 44578422, - "gap": 44578422, - "income": 0 + "cumulative_annual_gap": 773499516 }, { "age": 81, + "annual_expense": 45469990, + "annual_gap": 45469990, + "annual_income": 0, "asset": 0, - "cumulative_gap": 818969506, - "expense": 45469990, - "gap": 45469990, - "income": 0 + "cumulative_annual_gap": 818969506 }, { "age": 82, + "annual_expense": 46379390, + "annual_gap": 46379390, + "annual_income": 0, "asset": 0, - "cumulative_gap": 865348896, - "expense": 46379390, - "gap": 46379390, - "income": 0 + "cumulative_annual_gap": 865348896 }, { "age": 83, + "annual_expense": 47306978, + "annual_gap": 47306978, + "annual_income": 0, "asset": 0, - "cumulative_gap": 912655874, - "expense": 47306978, - "gap": 47306978, - "income": 0 + "cumulative_annual_gap": 912655874 }, { "age": 84, + "annual_expense": 48253117, + "annual_gap": 48253117, + "annual_income": 0, "asset": 0, - "cumulative_gap": 960908992, - "expense": 48253117, - "gap": 48253117, - "income": 0 + "cumulative_annual_gap": 960908992 }, { "age": 85, + "annual_expense": 49218180, + "annual_gap": 49218180, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1010127172, - "expense": 49218180, - "gap": 49218180, - "income": 0 + "cumulative_annual_gap": 1010127172 }, { "age": 86, + "annual_expense": 50202543, + "annual_gap": 50202543, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1060329715, - "expense": 50202543, - "gap": 50202543, - "income": 0 + "cumulative_annual_gap": 1060329715 }, { "age": 87, + "annual_expense": 51206594, + "annual_gap": 51206594, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1111536309, - "expense": 51206594, - "gap": 51206594, - "income": 0 + "cumulative_annual_gap": 1111536309 }, { "age": 88, + "annual_expense": 52230726, + "annual_gap": 52230726, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1163767035, - "expense": 52230726, - "gap": 52230726, - "income": 0 + "cumulative_annual_gap": 1163767035 }, { "age": 89, + "annual_expense": 53275341, + "annual_gap": 53275341, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1217042376, - "expense": 53275341, - "gap": 53275341, - "income": 0 + "cumulative_annual_gap": 1217042376 }, { "age": 90, + "annual_expense": 54340848, + "annual_gap": 54340848, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1271383224, - "expense": 54340848, - "gap": 54340848, - "income": 0 + "cumulative_annual_gap": 1271383224 }, { "age": 91, + "annual_expense": 55427664, + "annual_gap": 55427664, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1326810888, - "expense": 55427664, - "gap": 55427664, - "income": 0 + "cumulative_annual_gap": 1326810888 }, { "age": 92, + "annual_expense": 56536218, + "annual_gap": 56536218, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1383347106, - "expense": 56536218, - "gap": 56536218, - "income": 0 + "cumulative_annual_gap": 1383347106 }, { "age": 93, + "annual_expense": 57666942, + "annual_gap": 57666942, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1441014048, - "expense": 57666942, - "gap": 57666942, - "income": 0 + "cumulative_annual_gap": 1441014048 }, { "age": 94, + "annual_expense": 58820281, + "annual_gap": 58820281, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1499834329, - "expense": 58820281, - "gap": 58820281, - "income": 0 + "cumulative_annual_gap": 1499834329 }, { "age": 95, + "annual_expense": 59996687, + "annual_gap": 59996687, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1559831016, - "expense": 59996687, - "gap": 59996687, - "income": 0 + "cumulative_annual_gap": 1559831016 }, { "age": 96, + "annual_expense": 61196620, + "annual_gap": 61196620, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1621027636, - "expense": 61196620, - "gap": 61196620, - "income": 0 + "cumulative_annual_gap": 1621027636 }, { "age": 97, + "annual_expense": 62420553, + "annual_gap": 62420553, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1683448189, - "expense": 62420553, - "gap": 62420553, - "income": 0 + "cumulative_annual_gap": 1683448189 }, { "age": 98, + "annual_expense": 63668964, + "annual_gap": 63668964, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1747117152, - "expense": 63668964, - "gap": 63668964, - "income": 0 + "cumulative_annual_gap": 1747117152 }, { "age": 99, + "annual_expense": 64942343, + "annual_gap": 64942343, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1812059495, - "expense": 64942343, - "gap": 64942343, - "income": 0 + "cumulative_annual_gap": 1812059495 }, { "age": 100, + "annual_expense": 66241190, + "annual_gap": 66241190, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1878300685, - "expense": 66241190, - "gap": 66241190, - "income": 0 + "cumulative_annual_gap": 1878300685 } ], "total_received": 85312500 @@ -1022,331 +1022,331 @@ "timeline": [ { "age": 60, + "annual_expense": 30000000, + "annual_gap": 23880000, + "annual_income": 6120000, "asset": 148262500, - "cumulative_gap": 23880000, - "expense": 30000000, - "gap": 23880000, - "income": 6120000 + "cumulative_annual_gap": 23880000 }, { "age": 61, + "annual_expense": 30600000, + "annual_gap": 24480000, + "annual_income": 6120000, "asset": 128113975, - "cumulative_gap": 48360000, - "expense": 30600000, - "gap": 24480000, - "income": 6120000 + "cumulative_annual_gap": 48360000 }, { "age": 62, + "annual_expense": 31212000, + "annual_gap": 25092000, + "annual_income": 6120000, "asset": 106742994, - "cumulative_gap": 73452000, - "expense": 31212000, - "gap": 25092000, - "income": 6120000 + "cumulative_annual_gap": 73452000 }, { "age": 63, + "annual_expense": 31836240, + "annual_gap": 25716240, + "annual_income": 6120000, "asset": 84100524, - "cumulative_gap": 99168240, - "expense": 31836240, - "gap": 25716240, - "income": 6120000 + "cumulative_annual_gap": 99168240 }, { "age": 64, + "annual_expense": 32472965, + "annual_gap": 26352965, + "annual_income": 6120000, "asset": 60135813, - "cumulative_gap": 125521205, - "expense": 32472965, - "gap": 26352965, - "income": 6120000 + "cumulative_annual_gap": 125521205 }, { "age": 65, + "annual_expense": 33122424, + "annual_gap": 27002424, + "annual_income": 6120000, "asset": 34796333, - "cumulative_gap": 152523629, - "expense": 33122424, - "gap": 27002424, - "income": 6120000 + "cumulative_annual_gap": 152523629 }, { "age": 66, + "annual_expense": 33784873, + "annual_gap": 27664873, + "annual_income": 6120000, "asset": 8027726, - "cumulative_gap": 180188501, - "expense": 33784873, - "gap": 27664873, - "income": 6120000 + "cumulative_annual_gap": 180188501 }, { "age": 67, + "annual_expense": 34460570, + "annual_gap": 28340570, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 208529072, - "expense": 34460570, - "gap": 28340570, - "income": 6120000 + "cumulative_annual_gap": 208529072 }, { "age": 68, + "annual_expense": 35149781, + "annual_gap": 29029781, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 237558853, - "expense": 35149781, - "gap": 29029781, - "income": 6120000 + "cumulative_annual_gap": 237558853 }, { "age": 69, + "annual_expense": 35852777, + "annual_gap": 29732777, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 267291630, - "expense": 35852777, - "gap": 29732777, - "income": 6120000 + "cumulative_annual_gap": 267291630 }, { "age": 70, + "annual_expense": 36569833, + "annual_gap": 30449833, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 297741463, - "expense": 36569833, - "gap": 30449833, - "income": 6120000 + "cumulative_annual_gap": 297741463 }, { "age": 71, + "annual_expense": 37301229, + "annual_gap": 31181229, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 328922692, - "expense": 37301229, - "gap": 31181229, - "income": 6120000 + "cumulative_annual_gap": 328922692 }, { "age": 72, + "annual_expense": 38047254, + "annual_gap": 31927254, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 360849946, - "expense": 38047254, - "gap": 31927254, - "income": 6120000 + "cumulative_annual_gap": 360849946 }, { "age": 73, + "annual_expense": 38808199, + "annual_gap": 32688199, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 393538145, - "expense": 38808199, - "gap": 32688199, - "income": 6120000 + "cumulative_annual_gap": 393538145 }, { "age": 74, + "annual_expense": 39584363, + "annual_gap": 33464363, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 427002507, - "expense": 39584363, - "gap": 33464363, - "income": 6120000 + "cumulative_annual_gap": 427002507 }, { "age": 75, + "annual_expense": 40376050, + "annual_gap": 34256050, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 461258558, - "expense": 40376050, - "gap": 34256050, - "income": 6120000 + "cumulative_annual_gap": 461258558 }, { "age": 76, + "annual_expense": 41183571, + "annual_gap": 35063571, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 496322129, - "expense": 41183571, - "gap": 35063571, - "income": 6120000 + "cumulative_annual_gap": 496322129 }, { "age": 77, + "annual_expense": 42007243, + "annual_gap": 35887243, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 532209371, - "expense": 42007243, - "gap": 35887243, - "income": 6120000 + "cumulative_annual_gap": 532209371 }, { "age": 78, + "annual_expense": 42847387, + "annual_gap": 36727387, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 568936759, - "expense": 42847387, - "gap": 36727387, - "income": 6120000 + "cumulative_annual_gap": 568936759 }, { "age": 79, + "annual_expense": 43704335, + "annual_gap": 37584335, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 606521094, - "expense": 43704335, - "gap": 37584335, - "income": 6120000 + "cumulative_annual_gap": 606521094 }, { "age": 80, + "annual_expense": 44578422, + "annual_gap": 38458422, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 644979516, - "expense": 44578422, - "gap": 38458422, - "income": 6120000 + "cumulative_annual_gap": 644979516 }, { "age": 81, + "annual_expense": 45469990, + "annual_gap": 39349990, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 684329506, - "expense": 45469990, - "gap": 39349990, - "income": 6120000 + "cumulative_annual_gap": 684329506 }, { "age": 82, + "annual_expense": 46379390, + "annual_gap": 40259390, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 724588896, - "expense": 46379390, - "gap": 40259390, - "income": 6120000 + "cumulative_annual_gap": 724588896 }, { "age": 83, + "annual_expense": 47306978, + "annual_gap": 41186978, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 765775874, - "expense": 47306978, - "gap": 41186978, - "income": 6120000 + "cumulative_annual_gap": 765775874 }, { "age": 84, + "annual_expense": 48253117, + "annual_gap": 42133117, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 807908992, - "expense": 48253117, - "gap": 42133117, - "income": 6120000 + "cumulative_annual_gap": 807908992 }, { "age": 85, + "annual_expense": 49218180, + "annual_gap": 43098180, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 851007172, - "expense": 49218180, - "gap": 43098180, - "income": 6120000 + "cumulative_annual_gap": 851007172 }, { "age": 86, + "annual_expense": 50202543, + "annual_gap": 44082543, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 895089715, - "expense": 50202543, - "gap": 44082543, - "income": 6120000 + "cumulative_annual_gap": 895089715 }, { "age": 87, + "annual_expense": 51206594, + "annual_gap": 45086594, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 940176309, - "expense": 51206594, - "gap": 45086594, - "income": 6120000 + "cumulative_annual_gap": 940176309 }, { "age": 88, + "annual_expense": 52230726, + "annual_gap": 46110726, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 986287035, - "expense": 52230726, - "gap": 46110726, - "income": 6120000 + "cumulative_annual_gap": 986287035 }, { "age": 89, + "annual_expense": 53275341, + "annual_gap": 47155341, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1033442376, - "expense": 53275341, - "gap": 47155341, - "income": 6120000 + "cumulative_annual_gap": 1033442376 }, { "age": 90, + "annual_expense": 54340848, + "annual_gap": 48220848, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1081663224, - "expense": 54340848, - "gap": 48220848, - "income": 6120000 + "cumulative_annual_gap": 1081663224 }, { "age": 91, + "annual_expense": 55427664, + "annual_gap": 49307664, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1130970888, - "expense": 55427664, - "gap": 49307664, - "income": 6120000 + "cumulative_annual_gap": 1130970888 }, { "age": 92, + "annual_expense": 56536218, + "annual_gap": 50416218, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1181387106, - "expense": 56536218, - "gap": 50416218, - "income": 6120000 + "cumulative_annual_gap": 1181387106 }, { "age": 93, + "annual_expense": 57666942, + "annual_gap": 51546942, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1232934048, - "expense": 57666942, - "gap": 51546942, - "income": 6120000 + "cumulative_annual_gap": 1232934048 }, { "age": 94, + "annual_expense": 58820281, + "annual_gap": 52700281, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1285634329, - "expense": 58820281, - "gap": 52700281, - "income": 6120000 + "cumulative_annual_gap": 1285634329 }, { "age": 95, + "annual_expense": 59996687, + "annual_gap": 53876687, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1339511016, - "expense": 59996687, - "gap": 53876687, - "income": 6120000 + "cumulative_annual_gap": 1339511016 }, { "age": 96, + "annual_expense": 61196620, + "annual_gap": 55076620, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1394587636, - "expense": 61196620, - "gap": 55076620, - "income": 6120000 + "cumulative_annual_gap": 1394587636 }, { "age": 97, + "annual_expense": 62420553, + "annual_gap": 56300553, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1450888189, - "expense": 62420553, - "gap": 56300553, - "income": 6120000 + "cumulative_annual_gap": 1450888189 }, { "age": 98, + "annual_expense": 63668964, + "annual_gap": 57548964, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1508437152, - "expense": 63668964, - "gap": 57548964, - "income": 6120000 + "cumulative_annual_gap": 1508437152 }, { "age": 99, + "annual_expense": 64942343, + "annual_gap": 58822343, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1567259495, - "expense": 64942343, - "gap": 58822343, - "income": 6120000 + "cumulative_annual_gap": 1567259495 }, { "age": 100, + "annual_expense": 66241190, + "annual_gap": 60121190, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1627380685, - "expense": 66241190, - "gap": 60121190, - "income": 6120000 + "cumulative_annual_gap": 1627380685 } ], "total_received": 299182500 diff --git a/fastapi/tests/golden/scenarios_with_deduction_years.json b/fastapi/tests/golden/scenarios_with_deduction_years.json index e701582..373ea06 100644 --- a/fastapi/tests/golden/scenarios_with_deduction_years.json +++ b/fastapi/tests/golden/scenarios_with_deduction_years.json @@ -11,331 +11,331 @@ "timeline": [ { "age": 60, + "annual_expense": 30000000, + "annual_gap": 12000000, + "annual_income": 18000000, "asset": 100000000, - "cumulative_gap": 12000000, - "expense": 30000000, - "gap": 12000000, - "income": 18000000 + "cumulative_annual_gap": 12000000 }, { "age": 61, + "annual_expense": 30600000, + "annual_gap": 12600000, + "annual_income": 18000000, "asset": 90640000, - "cumulative_gap": 24600000, - "expense": 30600000, - "gap": 12600000, - "income": 18000000 + "cumulative_annual_gap": 24600000 }, { "age": 62, + "annual_expense": 31212000, + "annual_gap": 13212000, + "annual_income": 18000000, "asset": 80381200, - "cumulative_gap": 37812000, - "expense": 31212000, - "gap": 13212000, - "income": 18000000 + "cumulative_annual_gap": 37812000 }, { "age": 63, + "annual_expense": 31836240, + "annual_gap": 13836240, + "annual_income": 18000000, "asset": 69184276, - "cumulative_gap": 51648240, - "expense": 31836240, - "gap": 13836240, - "income": 18000000 + "cumulative_annual_gap": 51648240 }, { "age": 64, + "annual_expense": 32472965, + "annual_gap": 14472965, + "annual_income": 18000000, "asset": 57008477, - "cumulative_gap": 66121205, - "expense": 32472965, - "gap": 14472965, - "income": 18000000 + "cumulative_annual_gap": 66121205 }, { "age": 65, + "annual_expense": 33122424, + "annual_gap": 15122424, + "annual_income": 18000000, "asset": 43811578, - "cumulative_gap": 81243629, - "expense": 33122424, - "gap": 15122424, - "income": 18000000 + "cumulative_annual_gap": 81243629 }, { "age": 66, + "annual_expense": 33784873, + "annual_gap": 15784873, + "annual_income": 18000000, "asset": 29549828, - "cumulative_gap": 97028501, - "expense": 33784873, - "gap": 15784873, - "income": 18000000 + "cumulative_annual_gap": 97028501 }, { "age": 67, + "annual_expense": 34460570, + "annual_gap": 16460570, + "annual_income": 18000000, "asset": 14177904, - "cumulative_gap": 113489072, - "expense": 34460570, - "gap": 16460570, - "income": 18000000 + "cumulative_annual_gap": 113489072 }, { "age": 68, + "annual_expense": 35149781, + "annual_gap": 17149781, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 130638853, - "expense": 35149781, - "gap": 17149781, - "income": 18000000 + "cumulative_annual_gap": 130638853 }, { "age": 69, + "annual_expense": 35852777, + "annual_gap": 17852777, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 148491630, - "expense": 35852777, - "gap": 17852777, - "income": 18000000 + "cumulative_annual_gap": 148491630 }, { "age": 70, + "annual_expense": 36569833, + "annual_gap": 18569833, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 167061463, - "expense": 36569833, - "gap": 18569833, - "income": 18000000 + "cumulative_annual_gap": 167061463 }, { "age": 71, + "annual_expense": 37301229, + "annual_gap": 19301229, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 186362692, - "expense": 37301229, - "gap": 19301229, - "income": 18000000 + "cumulative_annual_gap": 186362692 }, { "age": 72, + "annual_expense": 38047254, + "annual_gap": 20047254, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 206409946, - "expense": 38047254, - "gap": 20047254, - "income": 18000000 + "cumulative_annual_gap": 206409946 }, { "age": 73, + "annual_expense": 38808199, + "annual_gap": 20808199, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 227218145, - "expense": 38808199, - "gap": 20808199, - "income": 18000000 + "cumulative_annual_gap": 227218145 }, { "age": 74, + "annual_expense": 39584363, + "annual_gap": 21584363, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 248802507, - "expense": 39584363, - "gap": 21584363, - "income": 18000000 + "cumulative_annual_gap": 248802507 }, { "age": 75, + "annual_expense": 40376050, + "annual_gap": 22376050, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 271178558, - "expense": 40376050, - "gap": 22376050, - "income": 18000000 + "cumulative_annual_gap": 271178558 }, { "age": 76, + "annual_expense": 41183571, + "annual_gap": 23183571, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 294362129, - "expense": 41183571, - "gap": 23183571, - "income": 18000000 + "cumulative_annual_gap": 294362129 }, { "age": 77, + "annual_expense": 42007243, + "annual_gap": 24007243, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 318369371, - "expense": 42007243, - "gap": 24007243, - "income": 18000000 + "cumulative_annual_gap": 318369371 }, { "age": 78, + "annual_expense": 42847387, + "annual_gap": 24847387, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 343216759, - "expense": 42847387, - "gap": 24847387, - "income": 18000000 + "cumulative_annual_gap": 343216759 }, { "age": 79, + "annual_expense": 43704335, + "annual_gap": 25704335, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 368921094, - "expense": 43704335, - "gap": 25704335, - "income": 18000000 + "cumulative_annual_gap": 368921094 }, { "age": 80, + "annual_expense": 44578422, + "annual_gap": 26578422, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 395499516, - "expense": 44578422, - "gap": 26578422, - "income": 18000000 + "cumulative_annual_gap": 395499516 }, { "age": 81, + "annual_expense": 45469990, + "annual_gap": 27469990, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 422969506, - "expense": 45469990, - "gap": 27469990, - "income": 18000000 + "cumulative_annual_gap": 422969506 }, { "age": 82, + "annual_expense": 46379390, + "annual_gap": 28379390, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 451348896, - "expense": 46379390, - "gap": 28379390, - "income": 18000000 + "cumulative_annual_gap": 451348896 }, { "age": 83, + "annual_expense": 47306978, + "annual_gap": 29306978, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 480655874, - "expense": 47306978, - "gap": 29306978, - "income": 18000000 + "cumulative_annual_gap": 480655874 }, { "age": 84, + "annual_expense": 48253117, + "annual_gap": 30253117, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 510908992, - "expense": 48253117, - "gap": 30253117, - "income": 18000000 + "cumulative_annual_gap": 510908992 }, { "age": 85, + "annual_expense": 49218180, + "annual_gap": 31218180, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 542127172, - "expense": 49218180, - "gap": 31218180, - "income": 18000000 + "cumulative_annual_gap": 542127172 }, { "age": 86, + "annual_expense": 50202543, + "annual_gap": 32202543, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 574329715, - "expense": 50202543, - "gap": 32202543, - "income": 18000000 + "cumulative_annual_gap": 574329715 }, { "age": 87, + "annual_expense": 51206594, + "annual_gap": 33206594, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 607536309, - "expense": 51206594, - "gap": 33206594, - "income": 18000000 + "cumulative_annual_gap": 607536309 }, { "age": 88, + "annual_expense": 52230726, + "annual_gap": 34230726, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 641767035, - "expense": 52230726, - "gap": 34230726, - "income": 18000000 + "cumulative_annual_gap": 641767035 }, { "age": 89, + "annual_expense": 53275341, + "annual_gap": 35275341, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 677042376, - "expense": 53275341, - "gap": 35275341, - "income": 18000000 + "cumulative_annual_gap": 677042376 }, { "age": 90, + "annual_expense": 54340848, + "annual_gap": 36340848, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 713383224, - "expense": 54340848, - "gap": 36340848, - "income": 18000000 + "cumulative_annual_gap": 713383224 }, { "age": 91, + "annual_expense": 55427664, + "annual_gap": 37427664, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 750810888, - "expense": 55427664, - "gap": 37427664, - "income": 18000000 + "cumulative_annual_gap": 750810888 }, { "age": 92, + "annual_expense": 56536218, + "annual_gap": 38536218, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 789347106, - "expense": 56536218, - "gap": 38536218, - "income": 18000000 + "cumulative_annual_gap": 789347106 }, { "age": 93, + "annual_expense": 57666942, + "annual_gap": 39666942, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 829014048, - "expense": 57666942, - "gap": 39666942, - "income": 18000000 + "cumulative_annual_gap": 829014048 }, { "age": 94, + "annual_expense": 58820281, + "annual_gap": 40820281, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 869834329, - "expense": 58820281, - "gap": 40820281, - "income": 18000000 + "cumulative_annual_gap": 869834329 }, { "age": 95, + "annual_expense": 59996687, + "annual_gap": 41996687, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 911831016, - "expense": 59996687, - "gap": 41996687, - "income": 18000000 + "cumulative_annual_gap": 911831016 }, { "age": 96, + "annual_expense": 61196620, + "annual_gap": 43196620, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 955027636, - "expense": 61196620, - "gap": 43196620, - "income": 18000000 + "cumulative_annual_gap": 955027636 }, { "age": 97, + "annual_expense": 62420553, + "annual_gap": 44420553, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 999448189, - "expense": 62420553, - "gap": 44420553, - "income": 18000000 + "cumulative_annual_gap": 999448189 }, { "age": 98, + "annual_expense": 63668964, + "annual_gap": 45668964, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 1045117152, - "expense": 63668964, - "gap": 45668964, - "income": 18000000 + "cumulative_annual_gap": 1045117152 }, { "age": 99, + "annual_expense": 64942343, + "annual_gap": 46942343, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 1092059495, - "expense": 64942343, - "gap": 46942343, - "income": 18000000 + "cumulative_annual_gap": 1092059495 }, { "age": 100, + "annual_expense": 66241190, + "annual_gap": 48241190, + "annual_income": 18000000, "asset": 0, - "cumulative_gap": 1140300685, - "expense": 66241190, - "gap": 48241190, - "income": 18000000 + "cumulative_annual_gap": 1140300685 } ], "total_received": 738000000 @@ -348,331 +348,331 @@ "timeline": [ { "age": 60, + "annual_expense": 30000000, + "annual_gap": 16500000, + "annual_income": 13500000, "asset": 100000000, - "cumulative_gap": 16500000, - "expense": 30000000, - "gap": 16500000, - "income": 13500000 + "cumulative_annual_gap": 16500000 }, { "age": 61, + "annual_expense": 30600000, + "annual_gap": 17100000, + "annual_income": 13500000, "asset": 86005000, - "cumulative_gap": 33600000, - "expense": 30600000, - "gap": 17100000, - "income": 13500000 + "cumulative_annual_gap": 33600000 }, { "age": 62, + "annual_expense": 31212000, + "annual_gap": 17712000, + "annual_income": 13500000, "asset": 70972150, - "cumulative_gap": 51312000, - "expense": 31212000, - "gap": 17712000, - "income": 13500000 + "cumulative_annual_gap": 51312000 }, { "age": 63, + "annual_expense": 31836240, + "annual_gap": 18336240, + "annual_income": 13500000, "asset": 54857954, - "cumulative_gap": 69648240, - "expense": 31836240, - "gap": 18336240, - "income": 13500000 + "cumulative_annual_gap": 69648240 }, { "age": 64, + "annual_expense": 32472965, + "annual_gap": 18972965, + "annual_income": 13500000, "asset": 37617366, - "cumulative_gap": 88621205, - "expense": 32472965, - "gap": 18972965, - "income": 13500000 + "cumulative_annual_gap": 88621205 }, { "age": 65, + "annual_expense": 33122424, + "annual_gap": 19622424, + "annual_income": 13500000, "asset": 19203733, - "cumulative_gap": 108243629, - "expense": 33122424, - "gap": 19622424, - "income": 13500000 + "cumulative_annual_gap": 108243629 }, { "age": 66, + "annual_expense": 33784873, + "annual_gap": 20284873, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 128528501, - "expense": 33784873, - "gap": 20284873, - "income": 13500000 + "cumulative_annual_gap": 128528501 }, { "age": 67, + "annual_expense": 34460570, + "annual_gap": 20960570, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 149489072, - "expense": 34460570, - "gap": 20960570, - "income": 13500000 + "cumulative_annual_gap": 149489072 }, { "age": 68, + "annual_expense": 35149781, + "annual_gap": 21649781, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 171138853, - "expense": 35149781, - "gap": 21649781, - "income": 13500000 + "cumulative_annual_gap": 171138853 }, { "age": 69, + "annual_expense": 35852777, + "annual_gap": 22352777, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 193491630, - "expense": 35852777, - "gap": 22352777, - "income": 13500000 + "cumulative_annual_gap": 193491630 }, { "age": 70, + "annual_expense": 36569833, + "annual_gap": 23069833, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 216561463, - "expense": 36569833, - "gap": 23069833, - "income": 13500000 + "cumulative_annual_gap": 216561463 }, { "age": 71, + "annual_expense": 37301229, + "annual_gap": 23801229, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 240362692, - "expense": 37301229, - "gap": 23801229, - "income": 13500000 + "cumulative_annual_gap": 240362692 }, { "age": 72, + "annual_expense": 38047254, + "annual_gap": 24547254, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 264909946, - "expense": 38047254, - "gap": 24547254, - "income": 13500000 + "cumulative_annual_gap": 264909946 }, { "age": 73, + "annual_expense": 38808199, + "annual_gap": 25308199, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 290218145, - "expense": 38808199, - "gap": 25308199, - "income": 13500000 + "cumulative_annual_gap": 290218145 }, { "age": 74, + "annual_expense": 39584363, + "annual_gap": 26084363, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 316302507, - "expense": 39584363, - "gap": 26084363, - "income": 13500000 + "cumulative_annual_gap": 316302507 }, { "age": 75, + "annual_expense": 40376050, + "annual_gap": 26876050, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 343178558, - "expense": 40376050, - "gap": 26876050, - "income": 13500000 + "cumulative_annual_gap": 343178558 }, { "age": 76, + "annual_expense": 41183571, + "annual_gap": 27683571, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 370862129, - "expense": 41183571, - "gap": 27683571, - "income": 13500000 + "cumulative_annual_gap": 370862129 }, { "age": 77, + "annual_expense": 42007243, + "annual_gap": 28507243, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 399369371, - "expense": 42007243, - "gap": 28507243, - "income": 13500000 + "cumulative_annual_gap": 399369371 }, { "age": 78, + "annual_expense": 42847387, + "annual_gap": 29347387, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 428716759, - "expense": 42847387, - "gap": 29347387, - "income": 13500000 + "cumulative_annual_gap": 428716759 }, { "age": 79, + "annual_expense": 43704335, + "annual_gap": 30204335, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 458921094, - "expense": 43704335, - "gap": 30204335, - "income": 13500000 + "cumulative_annual_gap": 458921094 }, { "age": 80, + "annual_expense": 44578422, + "annual_gap": 31078422, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 489999516, - "expense": 44578422, - "gap": 31078422, - "income": 13500000 + "cumulative_annual_gap": 489999516 }, { "age": 81, + "annual_expense": 45469990, + "annual_gap": 31969990, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 521969506, - "expense": 45469990, - "gap": 31969990, - "income": 13500000 + "cumulative_annual_gap": 521969506 }, { "age": 82, + "annual_expense": 46379390, + "annual_gap": 32879390, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 554848896, - "expense": 46379390, - "gap": 32879390, - "income": 13500000 + "cumulative_annual_gap": 554848896 }, { "age": 83, + "annual_expense": 47306978, + "annual_gap": 33806978, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 588655874, - "expense": 47306978, - "gap": 33806978, - "income": 13500000 + "cumulative_annual_gap": 588655874 }, { "age": 84, + "annual_expense": 48253117, + "annual_gap": 34753117, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 623408992, - "expense": 48253117, - "gap": 34753117, - "income": 13500000 + "cumulative_annual_gap": 623408992 }, { "age": 85, + "annual_expense": 49218180, + "annual_gap": 35718180, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 659127172, - "expense": 49218180, - "gap": 35718180, - "income": 13500000 + "cumulative_annual_gap": 659127172 }, { "age": 86, + "annual_expense": 50202543, + "annual_gap": 36702543, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 695829715, - "expense": 50202543, - "gap": 36702543, - "income": 13500000 + "cumulative_annual_gap": 695829715 }, { "age": 87, + "annual_expense": 51206594, + "annual_gap": 37706594, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 733536309, - "expense": 51206594, - "gap": 37706594, - "income": 13500000 + "cumulative_annual_gap": 733536309 }, { "age": 88, + "annual_expense": 52230726, + "annual_gap": 38730726, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 772267035, - "expense": 52230726, - "gap": 38730726, - "income": 13500000 + "cumulative_annual_gap": 772267035 }, { "age": 89, + "annual_expense": 53275341, + "annual_gap": 39775341, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 812042376, - "expense": 53275341, - "gap": 39775341, - "income": 13500000 + "cumulative_annual_gap": 812042376 }, { "age": 90, + "annual_expense": 54340848, + "annual_gap": 40840848, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 852883224, - "expense": 54340848, - "gap": 40840848, - "income": 13500000 + "cumulative_annual_gap": 852883224 }, { "age": 91, + "annual_expense": 55427664, + "annual_gap": 41927664, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 894810888, - "expense": 55427664, - "gap": 41927664, - "income": 13500000 + "cumulative_annual_gap": 894810888 }, { "age": 92, + "annual_expense": 56536218, + "annual_gap": 43036218, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 937847106, - "expense": 56536218, - "gap": 43036218, - "income": 13500000 + "cumulative_annual_gap": 937847106 }, { "age": 93, + "annual_expense": 57666942, + "annual_gap": 44166942, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 982014048, - "expense": 57666942, - "gap": 44166942, - "income": 13500000 + "cumulative_annual_gap": 982014048 }, { "age": 94, + "annual_expense": 58820281, + "annual_gap": 45320281, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1027334329, - "expense": 58820281, - "gap": 45320281, - "income": 13500000 + "cumulative_annual_gap": 1027334329 }, { "age": 95, + "annual_expense": 59996687, + "annual_gap": 46496687, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1073831016, - "expense": 59996687, - "gap": 46496687, - "income": 13500000 + "cumulative_annual_gap": 1073831016 }, { "age": 96, + "annual_expense": 61196620, + "annual_gap": 47696620, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1121527636, - "expense": 61196620, - "gap": 47696620, - "income": 13500000 + "cumulative_annual_gap": 1121527636 }, { "age": 97, + "annual_expense": 62420553, + "annual_gap": 48920553, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1170448189, - "expense": 62420553, - "gap": 48920553, - "income": 13500000 + "cumulative_annual_gap": 1170448189 }, { "age": 98, + "annual_expense": 63668964, + "annual_gap": 50168964, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1220617152, - "expense": 63668964, - "gap": 50168964, - "income": 13500000 + "cumulative_annual_gap": 1220617152 }, { "age": 99, + "annual_expense": 64942343, + "annual_gap": 51442343, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1272059495, - "expense": 64942343, - "gap": 51442343, - "income": 13500000 + "cumulative_annual_gap": 1272059495 }, { "age": 100, + "annual_expense": 66241190, + "annual_gap": 52741190, + "annual_income": 13500000, "asset": 0, - "cumulative_gap": 1324800685, - "expense": 66241190, - "gap": 52741190, - "income": 13500000 + "cumulative_annual_gap": 1324800685 } ], "total_received": 553500000 @@ -685,331 +685,331 @@ "timeline": [ { "age": 60, + "annual_expense": 30000000, + "annual_gap": 30000000, + "annual_income": 0, "asset": 185312500, - "cumulative_gap": 30000000, - "expense": 30000000, - "gap": 30000000, - "income": 0 + "cumulative_annual_gap": 30000000 }, { "age": 61, + "annual_expense": 30600000, + "annual_gap": 30600000, + "annual_income": 0, "asset": 159971875, - "cumulative_gap": 60600000, - "expense": 30600000, - "gap": 30600000, - "income": 0 + "cumulative_annual_gap": 60600000 }, { "age": 62, + "annual_expense": 31212000, + "annual_gap": 31212000, + "annual_income": 0, "asset": 133253031, - "cumulative_gap": 91812000, - "expense": 31212000, - "gap": 31212000, - "income": 0 + "cumulative_annual_gap": 91812000 }, { "age": 63, + "annual_expense": 31836240, + "annual_gap": 31836240, + "annual_income": 0, "asset": 105102262, - "cumulative_gap": 123648240, - "expense": 31836240, - "gap": 31836240, - "income": 0 + "cumulative_annual_gap": 123648240 }, { "age": 64, + "annual_expense": 32472965, + "annual_gap": 32472965, + "annual_income": 0, "asset": 75464003, - "cumulative_gap": 156121205, - "expense": 32472965, - "gap": 32472965, - "income": 0 + "cumulative_annual_gap": 156121205 }, { "age": 65, + "annual_expense": 33122424, + "annual_gap": 33122424, + "annual_income": 0, "asset": 44280769, - "cumulative_gap": 189243629, - "expense": 33122424, - "gap": 33122424, - "income": 0 + "cumulative_annual_gap": 189243629 }, { "age": 66, + "annual_expense": 33784873, + "annual_gap": 33784873, + "annual_income": 0, "asset": 11493095, - "cumulative_gap": 223028501, - "expense": 33784873, - "gap": 33784873, - "income": 0 + "cumulative_annual_gap": 223028501 }, { "age": 67, + "annual_expense": 34460570, + "annual_gap": 34460570, + "annual_income": 0, "asset": 0, - "cumulative_gap": 257489072, - "expense": 34460570, - "gap": 34460570, - "income": 0 + "cumulative_annual_gap": 257489072 }, { "age": 68, + "annual_expense": 35149781, + "annual_gap": 35149781, + "annual_income": 0, "asset": 0, - "cumulative_gap": 292638853, - "expense": 35149781, - "gap": 35149781, - "income": 0 + "cumulative_annual_gap": 292638853 }, { "age": 69, + "annual_expense": 35852777, + "annual_gap": 35852777, + "annual_income": 0, "asset": 0, - "cumulative_gap": 328491630, - "expense": 35852777, - "gap": 35852777, - "income": 0 + "cumulative_annual_gap": 328491630 }, { "age": 70, + "annual_expense": 36569833, + "annual_gap": 36569833, + "annual_income": 0, "asset": 0, - "cumulative_gap": 365061463, - "expense": 36569833, - "gap": 36569833, - "income": 0 + "cumulative_annual_gap": 365061463 }, { "age": 71, + "annual_expense": 37301229, + "annual_gap": 37301229, + "annual_income": 0, "asset": 0, - "cumulative_gap": 402362692, - "expense": 37301229, - "gap": 37301229, - "income": 0 + "cumulative_annual_gap": 402362692 }, { "age": 72, + "annual_expense": 38047254, + "annual_gap": 38047254, + "annual_income": 0, "asset": 0, - "cumulative_gap": 440409946, - "expense": 38047254, - "gap": 38047254, - "income": 0 + "cumulative_annual_gap": 440409946 }, { "age": 73, + "annual_expense": 38808199, + "annual_gap": 38808199, + "annual_income": 0, "asset": 0, - "cumulative_gap": 479218145, - "expense": 38808199, - "gap": 38808199, - "income": 0 + "cumulative_annual_gap": 479218145 }, { "age": 74, + "annual_expense": 39584363, + "annual_gap": 39584363, + "annual_income": 0, "asset": 0, - "cumulative_gap": 518802507, - "expense": 39584363, - "gap": 39584363, - "income": 0 + "cumulative_annual_gap": 518802507 }, { "age": 75, + "annual_expense": 40376050, + "annual_gap": 40376050, + "annual_income": 0, "asset": 0, - "cumulative_gap": 559178558, - "expense": 40376050, - "gap": 40376050, - "income": 0 + "cumulative_annual_gap": 559178558 }, { "age": 76, + "annual_expense": 41183571, + "annual_gap": 41183571, + "annual_income": 0, "asset": 0, - "cumulative_gap": 600362129, - "expense": 41183571, - "gap": 41183571, - "income": 0 + "cumulative_annual_gap": 600362129 }, { "age": 77, + "annual_expense": 42007243, + "annual_gap": 42007243, + "annual_income": 0, "asset": 0, - "cumulative_gap": 642369371, - "expense": 42007243, - "gap": 42007243, - "income": 0 + "cumulative_annual_gap": 642369371 }, { "age": 78, + "annual_expense": 42847387, + "annual_gap": 42847387, + "annual_income": 0, "asset": 0, - "cumulative_gap": 685216759, - "expense": 42847387, - "gap": 42847387, - "income": 0 + "cumulative_annual_gap": 685216759 }, { "age": 79, + "annual_expense": 43704335, + "annual_gap": 43704335, + "annual_income": 0, "asset": 0, - "cumulative_gap": 728921094, - "expense": 43704335, - "gap": 43704335, - "income": 0 + "cumulative_annual_gap": 728921094 }, { "age": 80, + "annual_expense": 44578422, + "annual_gap": 44578422, + "annual_income": 0, "asset": 0, - "cumulative_gap": 773499516, - "expense": 44578422, - "gap": 44578422, - "income": 0 + "cumulative_annual_gap": 773499516 }, { "age": 81, + "annual_expense": 45469990, + "annual_gap": 45469990, + "annual_income": 0, "asset": 0, - "cumulative_gap": 818969506, - "expense": 45469990, - "gap": 45469990, - "income": 0 + "cumulative_annual_gap": 818969506 }, { "age": 82, + "annual_expense": 46379390, + "annual_gap": 46379390, + "annual_income": 0, "asset": 0, - "cumulative_gap": 865348896, - "expense": 46379390, - "gap": 46379390, - "income": 0 + "cumulative_annual_gap": 865348896 }, { "age": 83, + "annual_expense": 47306978, + "annual_gap": 47306978, + "annual_income": 0, "asset": 0, - "cumulative_gap": 912655874, - "expense": 47306978, - "gap": 47306978, - "income": 0 + "cumulative_annual_gap": 912655874 }, { "age": 84, + "annual_expense": 48253117, + "annual_gap": 48253117, + "annual_income": 0, "asset": 0, - "cumulative_gap": 960908992, - "expense": 48253117, - "gap": 48253117, - "income": 0 + "cumulative_annual_gap": 960908992 }, { "age": 85, + "annual_expense": 49218180, + "annual_gap": 49218180, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1010127172, - "expense": 49218180, - "gap": 49218180, - "income": 0 + "cumulative_annual_gap": 1010127172 }, { "age": 86, + "annual_expense": 50202543, + "annual_gap": 50202543, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1060329715, - "expense": 50202543, - "gap": 50202543, - "income": 0 + "cumulative_annual_gap": 1060329715 }, { "age": 87, + "annual_expense": 51206594, + "annual_gap": 51206594, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1111536309, - "expense": 51206594, - "gap": 51206594, - "income": 0 + "cumulative_annual_gap": 1111536309 }, { "age": 88, + "annual_expense": 52230726, + "annual_gap": 52230726, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1163767035, - "expense": 52230726, - "gap": 52230726, - "income": 0 + "cumulative_annual_gap": 1163767035 }, { "age": 89, + "annual_expense": 53275341, + "annual_gap": 53275341, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1217042376, - "expense": 53275341, - "gap": 53275341, - "income": 0 + "cumulative_annual_gap": 1217042376 }, { "age": 90, + "annual_expense": 54340848, + "annual_gap": 54340848, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1271383224, - "expense": 54340848, - "gap": 54340848, - "income": 0 + "cumulative_annual_gap": 1271383224 }, { "age": 91, + "annual_expense": 55427664, + "annual_gap": 55427664, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1326810888, - "expense": 55427664, - "gap": 55427664, - "income": 0 + "cumulative_annual_gap": 1326810888 }, { "age": 92, + "annual_expense": 56536218, + "annual_gap": 56536218, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1383347106, - "expense": 56536218, - "gap": 56536218, - "income": 0 + "cumulative_annual_gap": 1383347106 }, { "age": 93, + "annual_expense": 57666942, + "annual_gap": 57666942, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1441014048, - "expense": 57666942, - "gap": 57666942, - "income": 0 + "cumulative_annual_gap": 1441014048 }, { "age": 94, + "annual_expense": 58820281, + "annual_gap": 58820281, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1499834329, - "expense": 58820281, - "gap": 58820281, - "income": 0 + "cumulative_annual_gap": 1499834329 }, { "age": 95, + "annual_expense": 59996687, + "annual_gap": 59996687, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1559831016, - "expense": 59996687, - "gap": 59996687, - "income": 0 + "cumulative_annual_gap": 1559831016 }, { "age": 96, + "annual_expense": 61196620, + "annual_gap": 61196620, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1621027636, - "expense": 61196620, - "gap": 61196620, - "income": 0 + "cumulative_annual_gap": 1621027636 }, { "age": 97, + "annual_expense": 62420553, + "annual_gap": 62420553, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1683448189, - "expense": 62420553, - "gap": 62420553, - "income": 0 + "cumulative_annual_gap": 1683448189 }, { "age": 98, + "annual_expense": 63668964, + "annual_gap": 63668964, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1747117152, - "expense": 63668964, - "gap": 63668964, - "income": 0 + "cumulative_annual_gap": 1747117152 }, { "age": 99, + "annual_expense": 64942343, + "annual_gap": 64942343, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1812059495, - "expense": 64942343, - "gap": 64942343, - "income": 0 + "cumulative_annual_gap": 1812059495 }, { "age": 100, + "annual_expense": 66241190, + "annual_gap": 66241190, + "annual_income": 0, "asset": 0, - "cumulative_gap": 1878300685, - "expense": 66241190, - "gap": 66241190, - "income": 0 + "cumulative_annual_gap": 1878300685 } ], "total_received": 85312500 @@ -1022,331 +1022,331 @@ "timeline": [ { "age": 60, + "annual_expense": 30000000, + "annual_gap": 23880000, + "annual_income": 6120000, "asset": 148262500, - "cumulative_gap": 23880000, - "expense": 30000000, - "gap": 23880000, - "income": 6120000 + "cumulative_annual_gap": 23880000 }, { "age": 61, + "annual_expense": 30600000, + "annual_gap": 24480000, + "annual_income": 6120000, "asset": 128113975, - "cumulative_gap": 48360000, - "expense": 30600000, - "gap": 24480000, - "income": 6120000 + "cumulative_annual_gap": 48360000 }, { "age": 62, + "annual_expense": 31212000, + "annual_gap": 25092000, + "annual_income": 6120000, "asset": 106742994, - "cumulative_gap": 73452000, - "expense": 31212000, - "gap": 25092000, - "income": 6120000 + "cumulative_annual_gap": 73452000 }, { "age": 63, + "annual_expense": 31836240, + "annual_gap": 25716240, + "annual_income": 6120000, "asset": 84100524, - "cumulative_gap": 99168240, - "expense": 31836240, - "gap": 25716240, - "income": 6120000 + "cumulative_annual_gap": 99168240 }, { "age": 64, + "annual_expense": 32472965, + "annual_gap": 26352965, + "annual_income": 6120000, "asset": 60135813, - "cumulative_gap": 125521205, - "expense": 32472965, - "gap": 26352965, - "income": 6120000 + "cumulative_annual_gap": 125521205 }, { "age": 65, + "annual_expense": 33122424, + "annual_gap": 27002424, + "annual_income": 6120000, "asset": 34796333, - "cumulative_gap": 152523629, - "expense": 33122424, - "gap": 27002424, - "income": 6120000 + "cumulative_annual_gap": 152523629 }, { "age": 66, + "annual_expense": 33784873, + "annual_gap": 27664873, + "annual_income": 6120000, "asset": 8027726, - "cumulative_gap": 180188501, - "expense": 33784873, - "gap": 27664873, - "income": 6120000 + "cumulative_annual_gap": 180188501 }, { "age": 67, + "annual_expense": 34460570, + "annual_gap": 28340570, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 208529072, - "expense": 34460570, - "gap": 28340570, - "income": 6120000 + "cumulative_annual_gap": 208529072 }, { "age": 68, + "annual_expense": 35149781, + "annual_gap": 29029781, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 237558853, - "expense": 35149781, - "gap": 29029781, - "income": 6120000 + "cumulative_annual_gap": 237558853 }, { "age": 69, + "annual_expense": 35852777, + "annual_gap": 29732777, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 267291630, - "expense": 35852777, - "gap": 29732777, - "income": 6120000 + "cumulative_annual_gap": 267291630 }, { "age": 70, + "annual_expense": 36569833, + "annual_gap": 30449833, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 297741463, - "expense": 36569833, - "gap": 30449833, - "income": 6120000 + "cumulative_annual_gap": 297741463 }, { "age": 71, + "annual_expense": 37301229, + "annual_gap": 31181229, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 328922692, - "expense": 37301229, - "gap": 31181229, - "income": 6120000 + "cumulative_annual_gap": 328922692 }, { "age": 72, + "annual_expense": 38047254, + "annual_gap": 31927254, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 360849946, - "expense": 38047254, - "gap": 31927254, - "income": 6120000 + "cumulative_annual_gap": 360849946 }, { "age": 73, + "annual_expense": 38808199, + "annual_gap": 32688199, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 393538145, - "expense": 38808199, - "gap": 32688199, - "income": 6120000 + "cumulative_annual_gap": 393538145 }, { "age": 74, + "annual_expense": 39584363, + "annual_gap": 33464363, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 427002507, - "expense": 39584363, - "gap": 33464363, - "income": 6120000 + "cumulative_annual_gap": 427002507 }, { "age": 75, + "annual_expense": 40376050, + "annual_gap": 34256050, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 461258558, - "expense": 40376050, - "gap": 34256050, - "income": 6120000 + "cumulative_annual_gap": 461258558 }, { "age": 76, + "annual_expense": 41183571, + "annual_gap": 35063571, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 496322129, - "expense": 41183571, - "gap": 35063571, - "income": 6120000 + "cumulative_annual_gap": 496322129 }, { "age": 77, + "annual_expense": 42007243, + "annual_gap": 35887243, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 532209371, - "expense": 42007243, - "gap": 35887243, - "income": 6120000 + "cumulative_annual_gap": 532209371 }, { "age": 78, + "annual_expense": 42847387, + "annual_gap": 36727387, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 568936759, - "expense": 42847387, - "gap": 36727387, - "income": 6120000 + "cumulative_annual_gap": 568936759 }, { "age": 79, + "annual_expense": 43704335, + "annual_gap": 37584335, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 606521094, - "expense": 43704335, - "gap": 37584335, - "income": 6120000 + "cumulative_annual_gap": 606521094 }, { "age": 80, + "annual_expense": 44578422, + "annual_gap": 38458422, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 644979516, - "expense": 44578422, - "gap": 38458422, - "income": 6120000 + "cumulative_annual_gap": 644979516 }, { "age": 81, + "annual_expense": 45469990, + "annual_gap": 39349990, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 684329506, - "expense": 45469990, - "gap": 39349990, - "income": 6120000 + "cumulative_annual_gap": 684329506 }, { "age": 82, + "annual_expense": 46379390, + "annual_gap": 40259390, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 724588896, - "expense": 46379390, - "gap": 40259390, - "income": 6120000 + "cumulative_annual_gap": 724588896 }, { "age": 83, + "annual_expense": 47306978, + "annual_gap": 41186978, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 765775874, - "expense": 47306978, - "gap": 41186978, - "income": 6120000 + "cumulative_annual_gap": 765775874 }, { "age": 84, + "annual_expense": 48253117, + "annual_gap": 42133117, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 807908992, - "expense": 48253117, - "gap": 42133117, - "income": 6120000 + "cumulative_annual_gap": 807908992 }, { "age": 85, + "annual_expense": 49218180, + "annual_gap": 43098180, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 851007172, - "expense": 49218180, - "gap": 43098180, - "income": 6120000 + "cumulative_annual_gap": 851007172 }, { "age": 86, + "annual_expense": 50202543, + "annual_gap": 44082543, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 895089715, - "expense": 50202543, - "gap": 44082543, - "income": 6120000 + "cumulative_annual_gap": 895089715 }, { "age": 87, + "annual_expense": 51206594, + "annual_gap": 45086594, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 940176309, - "expense": 51206594, - "gap": 45086594, - "income": 6120000 + "cumulative_annual_gap": 940176309 }, { "age": 88, + "annual_expense": 52230726, + "annual_gap": 46110726, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 986287035, - "expense": 52230726, - "gap": 46110726, - "income": 6120000 + "cumulative_annual_gap": 986287035 }, { "age": 89, + "annual_expense": 53275341, + "annual_gap": 47155341, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1033442376, - "expense": 53275341, - "gap": 47155341, - "income": 6120000 + "cumulative_annual_gap": 1033442376 }, { "age": 90, + "annual_expense": 54340848, + "annual_gap": 48220848, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1081663224, - "expense": 54340848, - "gap": 48220848, - "income": 6120000 + "cumulative_annual_gap": 1081663224 }, { "age": 91, + "annual_expense": 55427664, + "annual_gap": 49307664, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1130970888, - "expense": 55427664, - "gap": 49307664, - "income": 6120000 + "cumulative_annual_gap": 1130970888 }, { "age": 92, + "annual_expense": 56536218, + "annual_gap": 50416218, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1181387106, - "expense": 56536218, - "gap": 50416218, - "income": 6120000 + "cumulative_annual_gap": 1181387106 }, { "age": 93, + "annual_expense": 57666942, + "annual_gap": 51546942, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1232934048, - "expense": 57666942, - "gap": 51546942, - "income": 6120000 + "cumulative_annual_gap": 1232934048 }, { "age": 94, + "annual_expense": 58820281, + "annual_gap": 52700281, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1285634329, - "expense": 58820281, - "gap": 52700281, - "income": 6120000 + "cumulative_annual_gap": 1285634329 }, { "age": 95, + "annual_expense": 59996687, + "annual_gap": 53876687, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1339511016, - "expense": 59996687, - "gap": 53876687, - "income": 6120000 + "cumulative_annual_gap": 1339511016 }, { "age": 96, + "annual_expense": 61196620, + "annual_gap": 55076620, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1394587636, - "expense": 61196620, - "gap": 55076620, - "income": 6120000 + "cumulative_annual_gap": 1394587636 }, { "age": 97, + "annual_expense": 62420553, + "annual_gap": 56300553, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1450888189, - "expense": 62420553, - "gap": 56300553, - "income": 6120000 + "cumulative_annual_gap": 1450888189 }, { "age": 98, + "annual_expense": 63668964, + "annual_gap": 57548964, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1508437152, - "expense": 63668964, - "gap": 57548964, - "income": 6120000 + "cumulative_annual_gap": 1508437152 }, { "age": 99, + "annual_expense": 64942343, + "annual_gap": 58822343, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1567259495, - "expense": 64942343, - "gap": 58822343, - "income": 6120000 + "cumulative_annual_gap": 1567259495 }, { "age": 100, + "annual_expense": 66241190, + "annual_gap": 60121190, + "annual_income": 6120000, "asset": 0, - "cumulative_gap": 1627380685, - "expense": 66241190, - "gap": 60121190, - "income": 6120000 + "cumulative_annual_gap": 1627380685 } ], "total_received": 299182500 diff --git a/fastapi/tests/test_retirement_service.py b/fastapi/tests/test_retirement_service.py index 9f86de7..5a75c20 100644 --- a/fastapi/tests/test_retirement_service.py +++ b/fastapi/tests/test_retirement_service.py @@ -97,7 +97,7 @@ def test_simulate_retirement_gap_matches_expense_minus_income_when_pension_grows ) for point in result.timeline: - assert point.gap == pytest.approx(point.expense - point.income) + assert point.annual_gap == pytest.approx(point.annual_expense - point.annual_income) def test_simulate_retirement_depletion_age_capped_at_max_age(): @@ -436,8 +436,8 @@ def test_simulate_scenarios_lump_sum_break_even_age_is_consistent_with_cumulativ normal_running = 0.0 lump_running = upfront for n_point, l_point in zip(normal_outcome.timeline, lump_sum_outcome.timeline): - normal_running += n_point.income - lump_running += l_point.income + normal_running += n_point.annual_income + lump_running += l_point.annual_income if n_point.age < lump_sum_outcome.break_even_age: assert normal_running < lump_running elif n_point.age == lump_sum_outcome.break_even_age: @@ -486,7 +486,7 @@ def test_simulate_scenarios_early_reduction_matches_per_year_rate(): early_outcome = next(o for o in result.scenarios if o.scenario_type == ScenarioType.EARLY) expected_monthly_income = monthly_pension * (1 - EARLY_REDUCTION_RATE_PER_YEAR * 2) * 12 - assert early_outcome.timeline[0].income == pytest.approx(expected_monthly_income) + assert early_outcome.timeline[0].annual_income == pytest.approx(expected_monthly_income) def test_calculate_lump_sum_and_pension_matches_manual_example(): @@ -598,8 +598,8 @@ def test_simulate_scenarios_lump_sum_and_installment_use_unified_formula(): upfront_lump = lump_sum_outcome.timeline[0].asset - 10_000 assert upfront_lump == pytest.approx(expected_full_lump_sum) - assert lump_sum_outcome.timeline[0].income == pytest.approx(expected_full_pension * 12) + assert lump_sum_outcome.timeline[0].annual_income == pytest.approx(expected_full_pension * 12) upfront_installment = installment_outcome.timeline[0].asset - 10_000 assert upfront_installment == pytest.approx(expected_split_lump_sum) - assert installment_outcome.timeline[0].income == pytest.approx(expected_split_pension * 12) + assert installment_outcome.timeline[0].annual_income == pytest.approx(expected_split_pension * 12) From 8533b18911a0196f032e529a835a9432cda7a87c Mon Sep 17 00:00:00 2001 From: jung32111 Date: Sat, 25 Jul 2026 09:42:05 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=F0=9F=90=9B=20Fix:=20gender=EB=A5=BC=20Enu?= =?UTF-8?q?m=EC=9C=BC=EB=A1=9C=20=EA=B0=95=EC=A0=9C=ED=95=B4=20=EC=98=A4?= =?UTF-8?q?=ED=83=80/=EC=9E=98=EB=AA=BB=EB=90=9C=20=EA=B0=92=EC=9D=84=2042?= =?UTF-8?q?2=EB=A1=9C=20=EA=B1=B0=EB=B6=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gender: str에 제약이 없어 "MALE"(대문자 오타) 같은 값이 get_target_age()의 if gender == "male": ... else: FEMALE 분기를 조용히 타고 여성 목표연령(88세)으로 처리됐다(HTTP 200, 프론트는 오류를 알 방법이 없음). Gender(str, Enum)로 "male"/"female" 외 값을 422로 거부하도록 했다. 전수 조사 결과 이 "검증 없는 문자열 + 매칭 실패 시 조용한 기본값" 패턴은 gender 하나뿐이었다(employees.py의 current_band/retire_band는 서버가 계산해 내보내는 출력 필드라 사용자 입력 검증 대상이 아님). 회귀 테스트(tests/test_gender_validation.py)를 먼저 추가해 대문자/오타/빈 문자열 입력이 현재 200으로 통과함을 확인한 뒤 고쳤다. --- fastapi/app/schemas/retirement.py | 9 ++++- fastapi/app/services/retirement_service.py | 13 ++++--- fastapi/tests/test_gender_validation.py | 45 ++++++++++++++++++++++ 3 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 fastapi/tests/test_gender_validation.py diff --git a/fastapi/app/schemas/retirement.py b/fastapi/app/schemas/retirement.py index aa705b5..1a86ea8 100644 --- a/fastapi/app/schemas/retirement.py +++ b/fastapi/app/schemas/retirement.py @@ -5,6 +5,13 @@ from app.schemas.money import WonAmountInput, WonAmountOutput +class Gender(str, Enum): + """성별. target_age(목표연령) 산정에 사용된다.""" + + MALE = "male" + FEMALE = "female" + + class ReadinessStatus(str, Enum): """노후 준비 상태 판정 결과""" @@ -37,7 +44,7 @@ class DiagnosisRequest(BaseModel): monthly_expenses: WonAmountInput # 월 생활비 (원) monthly_pension: WonAmountInput # 월 연금 수령액 (원) asset: WonAmountInput # 현재 보유 자산 (원) - gender: str # 성별 ("male" 또는 "female") + gender: Gender # 성별 class RecommendationRequest(DiagnosisRequest): diff --git a/fastapi/app/services/retirement_service.py b/fastapi/app/services/retirement_service.py index d0f1d7b..6308a78 100644 --- a/fastapi/app/services/retirement_service.py +++ b/fastapi/app/services/retirement_service.py @@ -1,6 +1,7 @@ import math from app.schemas.retirement import ( + Gender, ReadinessStatus, RecommendationResult, RecommendationType, @@ -31,9 +32,9 @@ MAX_DEDUCTION_YEARS = 26 # 공제일시금 선택 최대 연수 -def get_target_age(gender: str) -> int: +def get_target_age(gender: Gender) -> int: """성별에 따른 목표연령 반환""" - if gender == "male": + if gender == Gender.MALE: return TARGET_AGE_MALE return TARGET_AGE_FEMALE @@ -52,7 +53,7 @@ def simulate_retirement( monthly_expenses: float, monthly_pension: float, asset: float, - gender: str, + gender: Gender, ) -> SimulationResult: """현재 나이부터 MAX_AGE까지 매년 자산 변화를 시뮬레이션하는 공용 계산 코어. diagnosis/recommendations API는 모두 이 함수(별칭 diagnose_core)를 통해서만 시뮬레이션을 수행한다. @@ -156,7 +157,7 @@ def recommend_retirement( monthly_expenses: float, monthly_pension: float, asset: float, - gender: str, + gender: Gender, ) -> RecommendationResult: """MIDDLE/INSUFFICIENT 진단 시 목표연령 도달에 필요한 최소 절약액/추가소득액을 계산. @@ -238,7 +239,7 @@ def simulate_pension_reduction( monthly_expenses: float, monthly_pension: float, asset: float, - gender: str, + gender: Gender, reemployment_income: float, year: int | None = None, ) -> ReductionResult: @@ -354,7 +355,7 @@ def simulate_scenarios( monthly_expenses: float, monthly_pension: float, asset: float, - gender: str, + gender: Gender, base_monthly_income: float, total_service_years: int, early_years: int = EARLY_YEARS_MAX, diff --git a/fastapi/tests/test_gender_validation.py b/fastapi/tests/test_gender_validation.py new file mode 100644 index 0000000..dbeed1c --- /dev/null +++ b/fastapi/tests/test_gender_validation.py @@ -0,0 +1,45 @@ +"""gender 필드 검증에 대한 회귀 테스트. + +기존에는 gender: str에 아무 제약이 없어, "MALE"(대문자 오타) 같은 값이 +get_target_age()의 `if gender == "male": ... else: FEMALE` 분기를 타고 +조용히 여성 목표연령(88세)으로 처리됐다(HTTP 200). 이제는 "male"/"female" +외의 값은 422로 거부되어야 한다. +""" + +import pytest +from fastapi.testclient import TestClient + +from app.main import app + + +@pytest.fixture(scope="module") +def client(): + return TestClient(app) + + +def _diagnosis_body(gender) -> dict: + return { + "current_age": 60, + "monthly_expenses": 2_000_000, + "monthly_pension": 1_500_000, + "asset": 100_000_000, + "gender": gender, + } + + +def test_diagnosis_accepts_male(client): + response = client.post("/api/retirement/diagnosis", json=_diagnosis_body("male")) + assert response.status_code == 200 + assert response.json()["target_age"] == 84 + + +def test_diagnosis_accepts_female(client): + response = client.post("/api/retirement/diagnosis", json=_diagnosis_body("female")) + assert response.status_code == 200 + assert response.json()["target_age"] == 88 + + +@pytest.mark.parametrize("invalid_gender", ["MALE", "Male", "m", "남성", "unknown", ""]) +def test_diagnosis_rejects_invalid_gender_with_422(client, invalid_gender): + response = client.post("/api/retirement/diagnosis", json=_diagnosis_body(invalid_gender)) + assert response.status_code == 422 From 6bdf7ed6c4478301dd11463475666c658a6cac29 Mon Sep 17 00:00:00 2001 From: jung32111 Date: Sat, 25 Jul 2026 09:44:29 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=E2=9C=A8=20Feat:=20=EC=A0=84=20=EC=97=94?= =?UTF-8?q?=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=ED=8F=AC=EB=A7=B7=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 에러가 상황마다 세 가지 다른 모양으로 나가고 있었다: Pydantic 422는 {"detail": [...]} 배열(영문 메시지), 라우터의 HTTPException(400)은 {"detail": "문자열"}, model_validator의 ValueError는 422이지만 메시지 앞에 "Value error, "가 붙었다. 프론트가 error.detail을 그대로 쓸 수 없었다. app/schemas/errors.py에 {code, message, details} 단일 스키마를 두고, app/error_handlers.py의 RequestValidationError/HTTPException 핸들러가 모든 에러를 이 형태로 변환하도록 했다. code는 프론트 분기용 (VALIDATION_ERROR/INVALID_INPUT/INTERNAL_ERROR 등), details는 필드별 원인(Pydantic 에러 타입을 한국어로 번역), message는 그대로 사용자에게 보여줄 수 있는 한국어 문장이다. 라우터 코드는 건드리지 않았다(기존처럼 ValueError -> HTTPException(400)만 던지면 핸들러가 알아서 감싼다). 회귀 테스트(tests/test_error_format.py)를 먼저 추가해 세 가지 에러 경로(타입 에러/비즈니스 룰/model_validator) 전부와 5개 엔드포인트에서 현재 포맷이 제각각임을 확인한 뒤 고쳤다. --- fastapi/app/error_handlers.py | 78 +++++++++++++++++++ fastapi/app/main.py | 3 + fastapi/app/schemas/errors.py | 20 +++++ fastapi/tests/test_error_format.py | 119 +++++++++++++++++++++++++++++ 4 files changed, 220 insertions(+) create mode 100644 fastapi/app/error_handlers.py create mode 100644 fastapi/app/schemas/errors.py create mode 100644 fastapi/tests/test_error_format.py diff --git a/fastapi/app/error_handlers.py b/fastapi/app/error_handlers.py new file mode 100644 index 0000000..5533ce5 --- /dev/null +++ b/fastapi/app/error_handlers.py @@ -0,0 +1,78 @@ +"""전 엔드포인트의 에러 응답을 app/schemas/errors.py의 단일 포맷으로 통일하는 핸들러. + +- RequestValidationError(Pydantic 422): 필드별 원인을 한국어로 번역해 details에 담는다. +- HTTPException(라우터가 ValueError를 잡아 400/500으로 던진 것): 동일 포맷으로 감싼다. +""" + +from fastapi import FastAPI, Request +from fastapi.exceptions import RequestValidationError +from fastapi.responses import JSONResponse +from starlette.exceptions import HTTPException as StarletteHTTPException + +from app.schemas.errors import ErrorDetail, ErrorResponse + +_PYDANTIC_ERROR_MESSAGES: dict[str, str] = { + "missing": "필수 항목입니다.", + "int_parsing": "정수여야 합니다.", + "int_type": "정수여야 합니다.", + "float_parsing": "숫자여야 합니다.", + "float_type": "숫자여야 합니다.", + "string_type": "문자열이어야 합니다.", + "enum": "허용되지 않는 값입니다.", + "bool_parsing": "true/false 값이어야 합니다.", + "bool_type": "true/false 값이어야 합니다.", +} + + +def _translate_pydantic_error(error: dict) -> str: + """Pydantic 에러 하나를 한국어 문구로 번역한다. 매핑에 없는 타입은 원문 메시지를 그대로 쓴다.""" + error_type = error.get("type", "") + if error_type == "value_error": + # model_validator가 던진 ValueError는 이미 한국어지만, Pydantic이 "Value error, " 접두사를 붙인다. + return error.get("msg", "").removeprefix("Value error, ") + return _PYDANTIC_ERROR_MESSAGES.get(error_type, error.get("msg", "입력값이 올바르지 않습니다.")) + + +def _field_name(loc: tuple) -> str | None: + """Pydantic의 loc(예: ("body", "current_age"))를 "current_age" 같은 점 표기 필드명으로 변환한다. + 특정 필드에 속하지 않는 에러(예: 모델 전체에 대한 검증)면 None을 반환한다.""" + path = [str(part) for part in loc if part != "body"] + return ".".join(path) if path else None + + +def _validation_error_message(details: list[ErrorDetail]) -> str: + if len(details) == 1: + return details[0].reason + return f"입력값을 확인해주세요. ({len(details)}개 항목에 문제가 있습니다.)" + + +_STATUS_CODE_TO_ERROR_CODE: dict[int, str] = { + 400: "INVALID_INPUT", + 404: "NOT_FOUND", + 500: "INTERNAL_ERROR", +} + + +def _error_code_for_status(status_code: int) -> str: + return _STATUS_CODE_TO_ERROR_CODE.get(status_code, "ERROR") + + +def register_error_handlers(app: FastAPI) -> None: + @app.exception_handler(RequestValidationError) + async def _handle_validation_error(request: Request, exc: RequestValidationError) -> JSONResponse: + details = [ + ErrorDetail(field=_field_name(error["loc"]), reason=_translate_pydantic_error(error)) + for error in exc.errors() + ] + body = ErrorResponse( + code="VALIDATION_ERROR", + message=_validation_error_message(details), + details=details, + ) + return JSONResponse(status_code=422, content=body.model_dump()) + + @app.exception_handler(StarletteHTTPException) + async def _handle_http_exception(request: Request, exc: StarletteHTTPException) -> JSONResponse: + message = exc.detail if isinstance(exc.detail, str) else "요청을 처리할 수 없습니다." + body = ErrorResponse(code=_error_code_for_status(exc.status_code), message=message, details=[]) + return JSONResponse(status_code=exc.status_code, content=body.model_dump()) diff --git a/fastapi/app/main.py b/fastapi/app/main.py index 78d4513..252e0f9 100644 --- a/fastapi/app/main.py +++ b/fastapi/app/main.py @@ -2,6 +2,7 @@ from fastapi import FastAPI +from app.error_handlers import register_error_handlers from app.repositories.employees_income_repository import ensure_data_available from app.routers import employees, retirement @@ -20,6 +21,8 @@ async def lifespan(app: FastAPI): lifespan=lifespan, ) +register_error_handlers(app) + app.include_router(employees.router) app.include_router(retirement.router) diff --git a/fastapi/app/schemas/errors.py b/fastapi/app/schemas/errors.py new file mode 100644 index 0000000..27c4911 --- /dev/null +++ b/fastapi/app/schemas/errors.py @@ -0,0 +1,20 @@ +"""전 엔드포인트가 공유하는 단일 에러 응답 스키마. + +Pydantic 422(RequestValidationError)와 라우터의 HTTPException(400/500 등)을 +app/main.py의 예외 핸들러가 전부 이 형태로 변환해서 내보낸다. 프론트는 항상 +code로 분기하고, message를 사용자에게 그대로 보여주고, details로 어떤 필드가 +문제인지 알 수 있다. +""" + +from pydantic import BaseModel + + +class ErrorDetail(BaseModel): + field: str | None # 문제가 된 필드명(점 표기, 예: "current_age"). 특정 필드에 속하지 않으면 None + reason: str # 해당 필드가 왜 문제인지에 대한 한국어 설명 + + +class ErrorResponse(BaseModel): + code: str # 프론트 분기용 에러 코드 (예: VALIDATION_ERROR, INVALID_INPUT, INTERNAL_ERROR) + message: str # 사용자에게 그대로 보여줄 수 있는 한국어 메시지 + details: list[ErrorDetail] = [] # 필드별 상세 (없으면 빈 리스트) diff --git a/fastapi/tests/test_error_format.py b/fastapi/tests/test_error_format.py new file mode 100644 index 0000000..a455e4c --- /dev/null +++ b/fastapi/tests/test_error_format.py @@ -0,0 +1,119 @@ +"""전 엔드포인트 에러 응답 포맷 통일에 대한 회귀 테스트. + +기존에는 에러가 세 가지 다른 모양으로 나갔다: + - Pydantic 422: {"detail": [{"type":..., "loc":..., "msg": 영문, ...}, ...]} + - 라우터의 HTTPException(400): {"detail": "한국어 문자열"} + - model_validator가 던진 ValueError도 422로 나가되 msg 앞에 "Value error, "가 붙음 +프론트가 error.detail을 그대로 쓸 수 없었다(문자열/배열이 상황마다 달랐음). + +이제는 모든 에러가 {"code": str, "message": str(한국어), "details": [{"field", "reason"}, ...]} +단일 포맷으로 나가야 한다. +""" + +import pytest +from fastapi.testclient import TestClient + +from app.main import app + + +@pytest.fixture(scope="module") +def client(): + return TestClient(app) + + +def _assert_unified_error_shape(body: dict) -> None: + assert set(body.keys()) == {"code", "message", "details"} + assert isinstance(body["code"], str) and body["code"] + assert isinstance(body["message"], str) and body["message"] + assert isinstance(body["details"], list) + for detail in body["details"]: + assert set(detail.keys()) == {"field", "reason"} + assert isinstance(detail["reason"], str) and detail["reason"] + + +def test_pydantic_type_error_returns_unified_shape(client): + response = client.post( + "/api/retirement/diagnosis", + json={ + "current_age": "abc", + "monthly_expenses": 2_000_000, + "monthly_pension": 1_500_000, + "asset": 100_000_000, + "gender": "male", + }, + ) + assert response.status_code == 422 + body = response.json() + _assert_unified_error_shape(body) + assert body["code"] == "VALIDATION_ERROR" + fields = {d["field"] for d in body["details"]} + assert "current_age" in fields + + +def test_business_rule_error_returns_unified_shape_with_korean_message(client): + response = client.post( + "/api/retirement/diagnosis", + json={ + "current_age": 60, + "monthly_expenses": 0, + "monthly_pension": 1_500_000, + "asset": 100_000_000, + "gender": "male", + }, + ) + assert response.status_code == 400 + body = response.json() + _assert_unified_error_shape(body) + assert body["code"] == "INVALID_INPUT" + assert "0보다 커야" in body["message"] + + +def test_model_validator_error_strips_english_value_error_prefix(client): + response = client.post( + "/api/employees/simulate", + json={ + "current_years": 20, + "current_income": 5_000_000, + "current_age": 60, + "retire_at_age": 50, + }, + ) + assert response.status_code == 422 + body = response.json() + _assert_unified_error_shape(body) + assert "Value error" not in body["message"] + assert not any("Value error" in d["reason"] for d in body["details"]) + + +def test_invalid_gender_enum_returns_unified_shape(client): + response = client.post( + "/api/retirement/diagnosis", + json={ + "current_age": 60, + "monthly_expenses": 2_000_000, + "monthly_pension": 1_500_000, + "asset": 100_000_000, + "gender": "MALE", + }, + ) + assert response.status_code == 422 + body = response.json() + _assert_unified_error_shape(body) + fields = {d["field"] for d in body["details"]} + assert "gender" in fields + + +@pytest.mark.parametrize( + "path,body", + [ + ("/api/retirement/diagnosis", {"current_age": "abc"}), + ("/api/retirement/recommendations", {"current_age": "abc"}), + ("/api/retirement/reduction", {"current_age": "abc"}), + ("/api/retirement/scenarios", {"current_age": "abc"}), + ("/api/employees/simulate", {"current_age": "abc"}), + ], +) +def test_all_endpoints_share_same_error_envelope(client, path, body): + response = client.post(path, json=body) + assert response.status_code == 422 + _assert_unified_error_shape(response.json())