"""Revenue analysis models shared functions.""" from sqlalchemy import func from sqlalchemy.engine import Row from moneyhub.constants.constants import CommissionOverride def apply_subaccount_revenue(subaccount_info: Row, with_entities: list, cls: object) -> None: """Apply subaccount revenue if subaccount_info is not none.""" if subaccount_info is not None: match subaccount_info.subaccount_split_type: case CommissionOverride.NET: if getattr(cls, 'net_revenue_payee_currency', False): with_entities.append( func.sum( cls.net_revenue_payee_currency * subaccount_info.commission_override ).label('subaccount_revenue')) else: with_entities.append( func.sum( cls.net_share_payee_currency * subaccount_info.commission_override ).label('subaccount_revenue')) case CommissionOverride.GROSS: with_entities.append( func.sum( cls.gross_revenue_payee_currency * subaccount_info.commission_override ).label('subaccount_revenue')) def _apply_single_value_filter(cls: object, filters: list, value, attribute_name: str) -> None: """Apply a single value filter if value exists and class has the attribute.""" if value and hasattr(cls, attribute_name): filters.append(getattr(cls, attribute_name) == value) def _apply_range_filter( cls: object, filters: list, start_value, end_value, attribute_name: str ) -> None: """Apply a range filter if both values exist and class has the attribute.""" if start_value and end_value and hasattr(cls, attribute_name): filters.append(getattr(cls, attribute_name).between(start_value, end_value)) def _apply_list_filter(cls: object, filters: list, values: list, attribute_name: str) -> None: """Apply a list filter if values exist and class has the attribute.""" if values and hasattr(cls, attribute_name): filters.append(getattr(cls, attribute_name).in_(values)) def apply_filters( cls: object, filters: list, activity_period_id_start: int | None = None, activity_period_id_end: int | None = None, artist_id: int | None = None, contract_id: int | None = None, country_codes: list[str] | None = None, imprint_ids: list[int] | None = None, product_id: int | None = None, project_id: int | None = None, statement_period_id_start: int | None = None, statement_period_id_end: int | None = None, store_ids: list[int] | None = None, subaccount_id: int | None = None, track_unique_id: int | None = None, transaction_type_ids: list[int] | None = None, ) -> None: """Apply revenue filters. Args: cls (object): Revenue analysis model. filters (list): List of Revenue analysis filters. activity_period_id_start (int): Activity period ID. activity_period_id_end (int): Activity period ID. artist_id (int): Artist ID. contract_id (int): Contract ID. country_codes (list[str]): Country codes. imprint_ids (list[int]): Imprint. product_id (int): Product ID. project_id (int): Project ID. statement_period_id_start (int): Statement period ID. statement_period_id_end (int): Statement period ID. store_ids (list[int]): Store IDs. subaccount_id (int): Subaccount ID. track_unique_id (int): Track unique ID. transaction_type_ids (list[int]): Transaction types. Returns: None """ # single value filters _apply_single_value_filter(cls, filters, artist_id, 'artist_id') _apply_single_value_filter(cls, filters, subaccount_id, 'subaccount_id') _apply_single_value_filter(cls, filters, contract_id, 'contract_id') _apply_single_value_filter(cls, filters, product_id, 'product_id') _apply_single_value_filter(cls, filters, project_id, 'project_id') _apply_single_value_filter(cls, filters, track_unique_id, 'track_unique_id') # range filters _apply_range_filter( cls, filters, statement_period_id_start, statement_period_id_end, 'statement_period_id') _apply_range_filter( cls, filters, activity_period_id_start, activity_period_id_end, 'activity_period_id') # list filters _apply_list_filter(cls, filters, country_codes, 'country_code') _apply_list_filter(cls, filters, imprint_ids, 'imprint_id') _apply_list_filter(cls, filters, transaction_type_ids, 'transaction_type_id') _apply_list_filter(cls, filters, store_ids, 'store_id')