Coverage for functions \ flipdare \ generated \ util \ pledge_stats_model_factory.py: 91%
44 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
1#!/usr/bin/env python
2# Copyright (c) 2026 Flipdare Pty Ltd. All rights reserved.
3#
4# This file is part of Flipdare's proprietary software and contains
5# confidential and copyrighted material. Unauthorised copying,
6# modification, distribution, or use of this file is strictly
7# prohibited without prior written permission from Flipdare Pty Ltd.
8#
9# This software includes third-party components licensed under MIT,
10# BSD, and Apache 2.0 licences. See THIRD_PARTY_NOTICES for details.
11#
13from __future__ import annotations
15from flipdare.app_log import LOG
16from flipdare.app_types import DatabaseDict
17from flipdare.generated.model.pledge_stats_model import PledgeStatsModel
18from flipdare.generated.shared.stripe.stripe_currency_code import StripeCurrencyCode
20__all__ = ["PledgeStatsModelFactory"]
23class PledgeStatsModelFactory:
24 def __init__(
25 self,
26 pledge_min_cents: int,
27 base_currency_code: StripeCurrencyCode,
28 data: DatabaseDict | None = None,
29 pledge_min_cents_usd: int | None = None,
30 ) -> None:
31 self._pledge_min_cents = pledge_min_cents
32 self._base_currency_code = base_currency_code
33 self._data = data
34 self._pledge_min_cents_usd = pledge_min_cents_usd
36 @staticmethod
37 def get_min_cents_usd(base_currency_code: StripeCurrencyCode, pledge_min_cents: int) -> int:
38 from flipdare.services import get_exchange_rate_handler
40 if base_currency_code == StripeCurrencyCode.USD:
41 return pledge_min_cents
42 else:
43 currency_service = get_exchange_rate_handler()
44 pledge_min_cents_usd = currency_service.convert_cents_to_usd_cents(
45 pledge_min_cents, base_currency_code
46 )
47 if pledge_min_cents_usd is None:
48 msg = f"Failed to convert {pledge_min_cents} {base_currency_code} to USD cents"
49 LOG().warning(msg)
50 return 0 # default to 0 if conversion fails
52 return pledge_min_cents_usd
54 @property
55 def pledge_min_cents(self) -> int:
56 return self._pledge_min_cents
58 @property
59 def base_currency_code(self) -> StripeCurrencyCode:
60 return self._base_currency_code
62 @property
63 def data(self) -> DatabaseDict | None:
64 return self._data
66 @property
67 def pledge_min_cents_usd(self) -> int | None:
68 return self._pledge_min_cents_usd
70 def create(self) -> PledgeStatsModel:
71 pledge_min_cents = self.pledge_min_cents
72 base_currency_code = self.base_currency_code
73 data = self.data
74 pledge_min_cents_usd = self.pledge_min_cents_usd
76 if pledge_min_cents_usd is None:
77 pledge_min_cents_usd = self.get_min_cents_usd(base_currency_code, pledge_min_cents)
79 return PledgeStatsModel(
80 pledge_min_cents=pledge_min_cents,
81 base_currency_code=base_currency_code,
82 pledge_min_cents_usd=pledge_min_cents_usd,
83 **(data or {}),
84 )