#!/usr/bin/env python3 from dataclasses import dataclass from typing import List import string_utils as su from type.money import Money import account import taxman @dataclass(repr=False) class SimulationResults(object): success: bool end_year: int max_networth: Money max_networth_year: int max_taxes: Money max_taxes_year: int max_rollover: Money max_rollover_year: int max_rmd: Money max_rmd_year: int total_rollover: Money total_social_security: Money final_account_state: List[account.Account] final_networth: Money final_taxes: taxman.TaxCollector @classmethod def create(cls) -> "SimulationResults": return SimulationResults( False, 0, Money(0), 0, Money(0), 0, Money(0), 0, Money(0), 0, Money(0), Money(0), [], Money(0), None ) def __repr__(self): total = Money(0) for a in self.final_account_state: total += a.get_balance() with su.SprintfStdout() as ret: print("SIMULATION RESULTS:") print('%-54s: %18s' % ('Successful?', self.success)) for x in self.final_account_state: x.dump_final_report() print(self.final_taxes) print('Simulation Maximums / Aggregates:') print(' %-50s: %18s (%s)' % ( 'Maximum net worth', f'{self.max_networth}', f'in {self.max_networth_year}' )) print(' %-50s: %18s (%s)' % ( 'Final net worth', f'{total}', f'in {self.end_year}' )) print(' %-50s: %18s (%s)' % ( 'Maximum annual RMDs', f'{self.max_rmd}', f'in {self.max_rmd_year}' )) print(' %-50s: %18s' % ( 'Total social security', f'{self.total_social_security}' )) print(' %-50s: %18s (%s)' % ( 'Maximum annual taxes due', f'{self.max_taxes}', f'in {self.max_taxes_year}' )) print(' %-50s: %18s' % ( 'Total Roth conversions', f'{self.total_rollover}' )) print(' %-50s: %18s (%s)' % ( 'Maximum Roth conversion', f'{self.max_rollover}', f'in {self.max_rollover_year}' )) return ret()