- card_layout.py: Port PlayResult, PLAY_RESULTS, EXACT_CHANCES, get_chances(),
CardResult, CardColumn, FullCard, FullBattingCard, FullPitchingCard from
database/app/card_creation.py. card_output() uses col_* key names.
get_chances() always returns Decimal to avoid float/Decimal type errors.
- batters/card_builder.py: Port get_batter_card_data() algorithm as
build_batter_full_cards(ratings_vl, ratings_vr, offense_col, player_id, hand).
assign_bchances() returns float tuples for compatibility with float-based
BattingCardRatingsModel fields.
- pitchers/card_builder.py: Port get_pitcher_card_data() algorithm as
build_pitcher_full_cards(). assign_pchances() returns float tuples.
Includes card.add_fatigue() at end of each card iteration.
- batters/calcs_batter.py: Integrate card builder in get_batter_ratings().
After computing raw ratings, call build_batter_full_cards() and merge
9 col_* rendered column fields into each ratings dict. Lazy import to
avoid circular dependency.
- pitchers/calcs_pitcher.py: Same integration for get_pitcher_ratings().
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>