def get(self, request): prisoner_details = self.valid_form_data[ DebitCardPrisonerDetailsView.url_name] amount_details = self.valid_form_data[DebitCardAmountView.url_name] amount_pence = int(amount_details['amount'] * 100) service_charge_pence = int( get_service_charge(amount_details['amount']) * 100) user_ip = request.META.get('HTTP_X_FORWARDED_FOR', '') user_ip = user_ip.split(',')[0].strip() or None payment_ref = None failure_context = {'short_payment_ref': _('Not known')} try: payment_client = PaymentClient() new_payment = { 'amount': amount_pence, 'service_charge': service_charge_pence, 'recipient_name': prisoner_details['prisoner_name'], 'prisoner_number': prisoner_details['prisoner_number'], 'prisoner_dob': prisoner_details['prisoner_dob'].isoformat(), 'ip_address': user_ip, } payment_ref = payment_client.create_payment(new_payment) failure_context['short_payment_ref'] = payment_ref[:8] new_govuk_payment = { 'delayed_capture': should_be_capture_delayed(), 'amount': amount_pence + service_charge_pence, 'reference': payment_ref, 'description': gettext('To this prisoner: %(prisoner_number)s' % prisoner_details), 'return_url': site_url( build_view_url(self.request, DebitCardConfirmationView.url_name)) + '?payment_ref=' + payment_ref, } if new_govuk_payment['delayed_capture']: logger.info('Starting delayed capture for %(payment_ref)s', {'payment_ref': payment_ref}) govuk_payment = payment_client.create_govuk_payment( payment_ref, new_govuk_payment) if govuk_payment: return redirect(get_link_by_rel(govuk_payment, 'next_url')) except OAuth2Error: logger.exception('Authentication error') except RequestException: logger.exception('Failed to create new payment (ref %s)', payment_ref) return render(request, 'send_money/debit-card-error.html', failure_context)
def get_govuk_capture_time(self, govuk_payment): response = requests.get( get_link_by_rel(govuk_payment, 'events'), headers=govuk_headers(), timeout=15 ) if response.status_code != 200: raise RequestException('Status code not 200', response=response) try: data = response.json() for event in data['events']: if event['state']['status'] == 'success': return parse_datetime(event['updated']) except (ValueError, KeyError): raise RequestException('Cannot parse response', response=response)
def get(self, request): prisoner_details = self.valid_form_data[DebitCardPrisonerDetailsView.url_name] amount_details = self.valid_form_data[DebitCardAmountView.url_name] amount_pence = int(amount_details['amount'] * 100) service_charge_pence = int(get_service_charge(amount_details['amount']) * 100) payment_ref = None failure_context = { 'short_payment_ref': _('Not known') } try: payment_client = PaymentClient() new_payment = { 'amount': amount_pence, 'service_charge': service_charge_pence, 'recipient_name': prisoner_details['prisoner_name'], 'prisoner_number': prisoner_details['prisoner_number'], 'prisoner_dob': prisoner_details['prisoner_dob'].isoformat(), } payment_ref = payment_client.create_payment(new_payment) failure_context['short_payment_ref'] = payment_ref[:8] new_govuk_payment = { 'amount': amount_pence + service_charge_pence, 'reference': payment_ref, 'description': gettext('To this prisoner: %(prisoner_number)s' % prisoner_details), 'return_url': site_url( self.build_view_url(DebitCardConfirmationView.url_name) + '?payment_ref=' + payment_ref ), } govuk_payment = payment_client.create_govuk_payment(payment_ref, new_govuk_payment) if govuk_payment: return redirect(get_link_by_rel(govuk_payment, 'next_url')) except OAuth2Error: logger.exception('Authentication error') except SlumberHttpBaseException: logger.exception('Failed to create new payment') except RequestsTimeout: logger.exception( 'GOV.UK Pay payment initiation timed out for %s' % payment_ref ) return render(request, 'send_money/debit-card-failure.html', failure_context)