"""Logic for historical_contract_advance.""" from owsresponse import response from abacus_contract.models.contract import Contract from abacus_contract.models.historical_contract_advance import ( HistoricalContractAdvance, ) from abacus_contract.schemas.historical_contract_advance import ( HistoricalContractAdvanceSchema, ) from abacus_contract.utils.format_response import ( prepare_dataload_with_data_as_list_response, ) def get_historical_contract_advances_by_contract_ids( contract_ids: list[int], ) -> response.Response: """Get historical contract advances by contract IDs. Args: contract_ids(list): list of contract identifiers Returns: Response containing list of historical contract advances grouped by contract_id. Format: [{'data': [advance1, advance2, ...]}, {'data': None}, ...] """ if not contract_ids: return response.Response(message=[], status=200) contracts = Contract.get_by_ids(contract_ids) contract_to_account_map = {} account_ids = [] for contract in contracts: if contract and hasattr(contract, 'account_contract'): account_id = contract.account_contract.account_id contract_to_account_map[contract.contract_id] = account_id if account_id not in account_ids: account_ids.append(account_id) historical_advances = HistoricalContractAdvance.get_by_account_ids(account_ids) advances_list = HistoricalContractAdvanceSchema(many=True).dump(historical_advances) account_advances_map = {} for advance in advances_list: account_id = advance.get('account_id') if account_id not in account_advances_map: account_advances_map[account_id] = [] account_advances_map[account_id].append(advance) advances_by_contract = [] for contract_id in contract_ids: account_id = contract_to_account_map.get(contract_id) if account_id and account_id in account_advances_map: for advance in account_advances_map[account_id]: advance_with_contract = advance.copy() advance_with_contract['contract_id'] = contract_id advances_by_contract.append(advance_with_contract) result = prepare_dataload_with_data_as_list_response( contract_ids, advances_by_contract, 'contract_id' ) return response.Response(message=result, status=200)