def _get_provider_charges(cls, backend_message_id, backend_instance, direction, couch_id, backend_api_id): if backend_message_id: if backend_api_id == SQLTwilioBackend.get_api_id(): message = get_twilio_message(backend_instance, backend_message_id) status = message.status price = message.price elif backend_api_id == InfobipBackend.get_api_id(): message = get_infobip_message(backend_instance, backend_message_id) status = message['status']['name'] price = message['price']['pricePerMessage'] else: raise ProviderFeeNotSupportedException("backend_message_id=%s" % backend_message_id) if status is None or status.lower() in [ 'accepted', 'queued', 'sending', 'receiving', ] or price is None: raise RetryBillableTaskException("backend_message_id=%s" % backend_message_id) return _ProviderChargeInfo( abs(Decimal(price)), SmsGatewayFee.get_by_criteria( backend_api_id, direction, ) ) else: log_smsbillables_error( "Could not create gateway fee for message %s: no backend_message_id" % couch_id ) return _ProviderChargeInfo(None, None)
def post(self, request, api_key, *args, **kwargs): request_body = json.loads(request.body) media_urls = [] for message in request_body.get('results'): message_sid = message.get('messageId') from_ = message.get('from') message_content = message.get('message') if message_content.get('type') == 'TEXT': body = message_content.get('text', '') elif message_content.get('type') in ['IMAGE', 'AUDIO', 'VIDEO', 'DOCUMENT']: body = message_content.get('caption', '') media_url = message_content.get('url', None) if media_url: media_urls.append(media_url) incoming_sms( from_, body, InfobipBackend.get_api_id(), backend_message_id=message_sid, domain_scope=self.domain, backend_id=self.backend_couch_id, media_urls=media_urls ) return HttpResponse("")
def _available_gateway_fee_backends(): return [ backend for backend in get_sms_backend_classes().values() if backend.get_api_id() not in [SQLTwilioBackend.get_api_id(), InfobipBackend.get_api_id()] ]
def get_infobip_message(backend_instance, backend_message_id): from corehq.messaging.smsbackends.infobip.models import InfobipBackend try: infobip_backend = SQLMobileBackend.load( backend_instance, api_id=InfobipBackend.get_api_id(), is_couch_id=True, include_deleted=True, ) config = infobip_backend.config api_channel = '/sms/1' api_suffix = '/reports' if config.scenario_key: api_channel = '/omni/1' headers = { 'Authorization': f'App {config.auth_token}', 'Content-Type': 'application/json', 'Accept': 'application/json' } parameters = {'messageId': backend_message_id} messages = _get_infobip_message_details(api_channel, api_suffix, config, headers, parameters) if not messages: api_suffix = '/logs' messages = _get_infobip_message_details(api_channel, api_suffix, config, headers, parameters) return messages[0] except Exception as e: raise RetryBillableTaskException(str(e))
def add_infobip_gateway_fee(apps): default_currency, _ = apps.get_model( 'accounting', 'Currency' ).objects.get_or_create( code=settings.DEFAULT_CURRENCY ) for direction in [INCOMING, OUTGOING]: SmsGatewayFee.create_new( InfobipBackend.get_api_id(), direction, None, fee_class=apps.get_model('smsbillables', 'SmsGatewayFee'), criteria_class=apps.get_model('smsbillables', 'SmsGatewayFeeCriteria'), currency=default_currency, )
def _get_multipart_count(cls, backend_api_id, backend_instance, backend_message_id, multipart_count): if backend_api_id == SQLTwilioBackend.get_api_id(): twilio_message = get_twilio_message(backend_instance, backend_message_id) if twilio_message.num_segments is not None: return int(twilio_message.num_segments) else: raise RetryBillableTaskException("backend_message_id=%s" % backend_message_id) elif backend_api_id == InfobipBackend.get_api_id(): infobip_message = get_infobip_message(backend_instance, backend_message_id) segments = infobip_message['messageCount'] \ if 'messageCount' in infobip_message else infobip_message['smsCount'] if segments is not None: return int(segments) else: raise RetryBillableTaskException("backend_message_id=%s" % backend_message_id) else: return multipart_count
def _get_gateway_fee(cls, backend_api_id, backend_instance, phone_number, direction, couch_id, backend_message_id, domain): country_code, national_number = get_country_code_and_national_number(phone_number) is_gateway_billable = backend_instance is None or _sms_backend_is_global( backend_instance) or toggles.ENABLE_INCLUDE_SMS_GATEWAY_CHARGING.enabled(domain) if is_gateway_billable: if backend_api_id in [SQLTwilioBackend.get_api_id(), InfobipBackend.get_api_id()]: provider_charges = cls._get_provider_charges( backend_message_id, backend_instance, direction, couch_id, backend_api_id ) gateway_fee = provider_charges.gateway_fee direct_gateway_fee = provider_charges.provider_gateway_fee else: gateway_fee = SmsGatewayFee.get_by_criteria( backend_api_id, direction, backend_instance=backend_instance, country_code=country_code, national_number=national_number, ) direct_gateway_fee = None if gateway_fee: conversion_rate = gateway_fee.currency.rate_to_default if conversion_rate != 0: return _GatewayChargeInfo(gateway_fee, conversion_rate, direct_gateway_fee) else: log_smsbillables_error( "Gateway fee conversion rate for currency %s is 0" % gateway_fee.currency.code ) return _GatewayChargeInfo(gateway_fee, None, direct_gateway_fee) else: log_smsbillables_error( "No matching gateway fee criteria for SMS %s" % couch_id ) return _GatewayChargeInfo(None, None, None)