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

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# 

12 

13from __future__ import annotations 

14 

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 

19 

20__all__ = ["PledgeStatsModelFactory"] 

21 

22 

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 

35 

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 

39 

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 

51 

52 return pledge_min_cents_usd 

53 

54 @property 

55 def pledge_min_cents(self) -> int: 

56 return self._pledge_min_cents 

57 

58 @property 

59 def base_currency_code(self) -> StripeCurrencyCode: 

60 return self._base_currency_code 

61 

62 @property 

63 def data(self) -> DatabaseDict | None: 

64 return self._data 

65 

66 @property 

67 def pledge_min_cents_usd(self) -> int | None: 

68 return self._pledge_min_cents_usd 

69 

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 

75 

76 if pledge_min_cents_usd is None: 

77 pledge_min_cents_usd = self.get_min_cents_usd(base_currency_code, pledge_min_cents) 

78 

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 )