"""Contract Template logic.""" from abacus_common_logic.utils.dates import current_timestamp from owsresponse import response from abacus_contract import models from abacus_contract.constants.constants import \ CONTRACT_LIFECYCLE_SCHEDULE_RENEWAL_TYPES from abacus_contract.constants.error import ERROR_MISSING_FIELD from abacus_contract.logic import contract from abacus_contract.logic import contract_exclusion from abacus_contract.logic import contract_term from abacus_contract.utils.format_error import validation_error def create_contract_from_template_id(contract_template_id, params): """Create a contract from specified template id.""" contract_details = dict() contract_template = models.ContractTemplate.get_by_id_or_error(contract_template_id) account_id = params.get('account_id') new_contract = create_contract(params, contract_template) if new_contract.status != 201: return new_contract contract_details.update({ 'run_controller_id': contract_template.run_controller_id, 'account_id': account_id, **new_contract.message }) contract_exclusions = contract_exclusion.get_exclusions_by_contract( contract_details['contract_id']) if contract_exclusions: contract_details.update({ 'contract_exclusion': contract_exclusions.message }) new_contract_terms = \ create_contract_terms_and_conditions(contract_details, contract_template) if new_contract_terms.status != 201: return new_contract_terms contract_details.update(**new_contract_terms.message) return response.Response(message=contract_details, status=201) def create_contract(account_params, contract_template): """Create a contract.""" account_name = account_params.get('account_name', None) params = { 'contract': { 'account_id': account_params.get('account_id'), 'contract_name': account_name, 'contract_type': contract_template.contract_type, 'reference_signing_entity_id': contract_template.reference_signing_entity_id, 'contract_exclusions': contract_template.contract_exclusions }, 'contract_lifecycle': { 'lifecycle_term_start': current_timestamp().date() }, 'contract_lifecycle_schedules': [{ 'renewal_type': CONTRACT_LIFECYCLE_SCHEDULE_RENEWAL_TYPES.CONTINUOUSLY_ACTIVE, 'termination_notice_detail_interval': 30, 'termination_notice_detail_type': 'day' }] } return contract.create_contract_with_lifecycle_and_schedules(**params) def create_contract_terms_and_conditions(contract_details, contract_template): """Create contract terms and conditions.""" terms = contract_template.contract_terms contract_terms = list() for term in terms: try: term_conditions = term['conditions'] contract_term_conditions = list() for condition in term_conditions: contract_term_conditions.append({ 'conditions': { 'stores': condition['stores'], 'countries': condition['countries'], 'transaction_types': condition['transaction_types'] }, 'priority': condition['priority'], 'term_rate': float(condition['term_rate']), 'contract_term_condition_name': condition['name'] }) params = { 'attachments': [str(contract_details['account_id'])], 'contract_id': contract_details['contract_id'], 'is_base_term': True, # TODO (ACC-6849) - drop is_base_term 'term_type': term['term_type'], 'contract_term_conditions': contract_term_conditions } contract_terms.append(params) except Exception as e: contract_details.update({'Invalid_contract_terms': { 'data': term, 'error': ERROR_MISSING_FIELD.format(field=e) }}) return validation_error(contract_details) return contract_term.bulk_create_contract_terms_and_conditions(contract_terms)