def __str__(self): return 'Transaction {id}, {amount} {sender_name} > {prisoner_name}, {status}'.format( id=self.pk, amount=format_amount(self.amount, True), sender_name=self.sender_name, prisoner_name=self.prisoner_name, status=self.status)
def __str__(self): return 'Disbursement {id}, {amount} {prisoner} > {recipient}, {status}'.format( id=self.pk, amount=format_amount(self.amount, True), prisoner=self.prisoner_number, recipient=self.recipient_name, status=self.resolution)
def assertAmountInContent(self, amount, response): # noqa: N802 if amount: creditable_amount = format_amount(amount, trim_empty_pence=True) else: creditable_amount = '—' response_content = response.content.decode(response.charset) self.assertIn(creditable_amount, response_content)
def assertAmountInContent(self, amount, response): # noqa: N802 if amount: creditable_amount = format_amount(amount, trim_empty_pence=True) else: creditable_amount = '—' response_content = response.content.decode(response.charset) self.assertIn(creditable_amount, response_content)
def __str__(self): return 'Disbursement {id}, {amount} {prisoner} > {recipient}, {status}'.format( id=self.pk, amount=format_amount(self.amount, True), prisoner=self.prisoner_number, recipient=self.recipient_name, status=self.resolution )
def __str__(self): return 'Credit {id}, {amount} {sender_name} > {prisoner_name}, {status}'.format( id=self.pk, amount=format_amount(self.amount, True), sender_name=self.sender_name, prisoner_name=self.prisoner_name, status=self.status )
def credit_link(self, instance): link = reverse('admin:credit_credit_change', args=(instance.credit.pk,)) description = '%(amount)s %(status)s, %(date)s' % { 'amount': format_amount(instance.amount), 'status': instance.credit.resolution, 'date': format_date(timezone.localtime(instance.credit.created), 'd/m/Y'), } return format_html('<a href="{}">{}</a>', link, description)
def credit_link(self, instance): credit = instance.credit link = reverse('admin:credit_credit_change', args=(credit.pk, )) description = '%(amount)s %(status)s, %(date)s' % { 'amount': format_amount(credit.amount), 'status': credit.resolution, 'date': format_date(timezone.localtime(credit.created), 'd/m/Y'), } return format_html('<a href="{}">{}</a>', link, description)
def render_prisoner_pages(self, name, number, location, credits_list, disbursements_list): updates = [] if credits_list: updates.append( Update( '+', _('Money in'), _('You’ve been sent money online.') + ' ' + _('It’s gone into your private cash account.'), [{ 'label': format_amount(credit.amount, trim_empty_pence=False), 'message': _('from %(name)s') % { 'name': format_name(credit.sender_name, fallback=_('unknown sender')), } } for credit in credits_list])) if disbursements_list: updates.append( Update( '–', _('Money out'), _('These disbursement requests have been sent.') + ' ' + _('It takes about 7 working days.'), [{ 'label': format_amount(disbursement.amount, trim_empty_pence=False), 'message': _('to %(name)s by %(method)s') % { 'name': format_name('%s %s' % (disbursement.recipient_first_name, disbursement.recipient_last_name), fallback=_('unknown recipient')), 'method': format_disbursement_method(disbursement.method), } } for disbursement in disbursements_list])) while updates: self.render_base_template() self.render_header(name, number, location) self.render_prisoner_page(updates) self.canvas.showPage()
def settlement_link(self, instance): settlement = instance.settlement_transaction if settlement is None: return '–' link = reverse('admin:transaction_transaction_change', args=(settlement.pk,)) description = '%(amount)s, %(date)s' % { 'amount': format_amount(settlement.amount), 'date': format_date(timezone.localtime(settlement.received_at), 'd/m/Y'), } return format_html('<a href="{}">{}</a>', link, description)
def serialise(self, record: Disbursement): return { 'Exported at': self.exported_at_local_time, 'Internal ID': record.id, 'URL': f'{settings.NOMS_OPS_URL}/security/disbursements/{record.id}/', 'Date entered': record.created, 'Date confirmed': record.log_set.get_action_date(DISBURSEMENT_LOG_ACTIONS.CONFIRMED), 'Date sent': record.log_set.get_action_date(DISBURSEMENT_LOG_ACTIONS.SENT), 'Amount': format_amount(record.amount), 'Prisoner number': record.prisoner_number, 'Prisoner name': record.prisoner_name, 'Prison': record.prison.short_name, 'Recipient first name': record.recipient_first_name, 'Recipient last name': record.recipient_last_name, 'Payment method': DISBURSEMENT_METHOD.for_value(record.method).display, 'Bank transfer sort code': record.sort_code, 'Bank transfer account': record.account_number, 'Bank transfer roll number': record.roll_number, 'Recipient address line 1': record.address_line1, 'Recipient address line 2': record.address_line2, 'Recipient address city': record.city, 'Recipient address postcode': record.postcode, 'Recipient address country': record.country, 'Recipient email': record.recipient_email, 'Status': DISBURSEMENT_RESOLUTION.for_value(record.resolution).display, 'NOMIS transaction': record.nomis_transaction_id, 'SOP invoice number': record.invoice_number, }
def valid_disbursement_stats(since, until=None): queryset = Disbursement.objects.exclude(resolution=DISBURSEMENT_RESOLUTION.REJECTED) if until: queryset = queryset.filter(created__range=(since, until)) else: queryset = queryset.filter(created__gte=since) stat = queryset.aggregate(count=models.Count('*'), amount=models.Sum('amount')) stat['amount'] = stat['amount'] or 0 stat['number'] = format_number(stat['count'], truncate_after=1000000) return { 'title': ngettext('%(number)s disbursement created', '%(number)s disbursements created', stat['count']) % stat, 'value': format_amount(stat['amount'], trim_empty_pence=True, truncate_after=1000000), }
def settlement_link(self, instance): settlement = instance.settlement_transaction if settlement is None: return '–' link = reverse('admin:transaction_transaction_change', args=(settlement.pk, )) description = '%(amount)s, %(date)s' % { 'amount': format_amount(settlement.amount), 'date': format_date(timezone.localtime(settlement.received_at), 'd/m/Y'), } return format_html('<a href="{}">{}</a>', link, description)
def valid_disbursement_stats(since, until=None): queryset = Disbursement.objects.exclude(resolution=DISBURSEMENT_RESOLUTION.REJECTED) if until: queryset = queryset.filter(created__range=(since, until)) else: queryset = queryset.filter(created__gte=since) stat = queryset.aggregate(count=models.Count('*'), amount=models.Sum('amount')) stat['amount'] = stat['amount'] or 0 stat['number'] = format_number(stat['count'], truncate_after=1000000) return { 'title': ngettext('%(number)s disbursement created', '%(number)s disbursements created', stat['count']) % stat, 'value': format_amount(stat['amount'], trim_empty_pence=True, truncate_after=1000000), }
def valid_credit_stats(since, until=None): queryset = Credit.objects.filter(CREDITABLE_FILTERS) if until: queryset = queryset.filter(received_at__range=(since, until)) else: queryset = queryset.filter(received_at__gte=since) stat = queryset.aggregate(count=models.Count('*'), amount=models.Sum('amount')) stat['amount'] = stat['amount'] or 0 stat['number'] = format_number(stat['count'], truncate_after=1000000) return { 'title': ngettext('%(number)s credit received', '%(number)s credits received', stat['count']) % stat, 'value': format_amount(stat['amount'], trim_empty_pence=True, truncate_after=1000000), }
def valid_credit_stats(since, until=None): queryset = Credit.objects.filter(CREDITABLE_FILTERS) if until: queryset = queryset.filter(received_at__range=(since, until)) else: queryset = queryset.filter(received_at__gte=since) stat = queryset.aggregate(count=models.Count('*'), amount=models.Sum('amount')) stat['amount'] = stat['amount'] or 0 stat['number'] = format_number(stat['count'], truncate_after=1000000) return { 'title': ngettext('%(number)s credit received', '%(number)s credits received', stat['count']) % stat, 'value': format_amount(stat['amount'], trim_empty_pence=True, truncate_after=1000000), }
def serialise(self, record: Credit): status = record.status if status: status = CREDIT_STATUS.for_value(status).display else: status = 'Anonymous' if hasattr(record, 'security_check'): security_check_status = record.security_check.status if len(record.security_check.rules) > 0: security_check_rules = record.security_check.rules else: security_check_rules = None else: security_check_status = None security_check_rules = None row = { 'Exported at': self.exported_at_local_time, 'Internal ID': record.id, 'URL': f'{settings.NOMS_OPS_URL}/security/credits/{record.id}/', 'Date received': record.received_at, 'Date credited': record.log_set.get_action_date(CREDIT_LOG_ACTIONS.CREDITED), 'Amount': format_amount(record.amount), 'Prisoner number': record.prisoner_number or 'Unknown', 'Prisoner name': record.prisoner_name or 'Unknown', 'Prison': record.prison.short_name if record.prison else 'Unknown', 'Owner username': record.owner.username if record.owner else 'Unknown', 'Blocked': record.blocked, 'Status': status, 'NOMIS transaction': record.nomis_transaction_id, 'Security check status': security_check_status, 'Security check codes': security_check_rules, **self.serialise_sender(record) } return row
def serialise(self, worksheet, record: Credit, triggered: Triggered): row = super().serialise(worksheet, record, triggered) status = record.status if status: status = str(CREDIT_STATUS.for_value(status).display) else: status = 'Anonymous' row.update({ 'Date received': local_datetime_for_xlsx(record.received_at), 'Date credited': local_datetime_for_xlsx(record.log_set.get_action_date(CREDIT_LOG_ACTIONS.CREDITED)), 'Amount': format_amount(record.amount), 'Prisoner number': record.prisoner_number or 'Unknown', 'Prisoner name': record.prisoner_name or 'Unknown', 'Prison': record.prison.short_name if record.prison else 'Unknown', 'Status': status, 'NOMIS transaction': record.nomis_transaction_id, **self.serialise_sender(record) }) return row
def serialise(self, worksheet, record: Disbursement, triggered: Triggered): row = super().serialise(worksheet, record, triggered) row.update({ 'Date entered': local_datetime_for_xlsx(record.created), 'Date confirmed': local_datetime_for_xlsx( record.log_set.get_action_date(DISBURSEMENT_LOG_ACTIONS.CONFIRMED) ), 'Date sent': local_datetime_for_xlsx(record.log_set.get_action_date(DISBURSEMENT_LOG_ACTIONS.SENT)), 'Amount': format_amount(record.amount), 'Prisoner number': record.prisoner_number, 'Prisoner name': record.prisoner_name, 'Prison': record.prison.short_name, 'Recipient name': record.recipient_name, 'Payment method': str(DISBURSEMENT_METHOD.for_value(record.method).display), 'Bank transfer sort code': record.sort_code, 'Bank transfer account': record.account_number, 'Bank transfer roll number': record.roll_number, 'Recipient address': record.recipient_address, 'Recipient email': record.recipient_email, 'Status': str(DISBURSEMENT_RESOLUTION.for_value(record.resolution).display), 'NOMIS transaction': record.nomis_transaction_id, 'SOP invoice number': record.invoice_number, }) return row
def formatted_service_charge(self, instance): return format_amount(instance.service_charge)
def format_amount_filter(value, truncate_after=None): return format_amount(value, trim_empty_pence=True, truncate_after=truncate_after) or '—'
def __str__(self): return '%s %s' % (self.date.isoformat(), format_amount(self.closing_balance))
def format_amount_filter(value, truncate_after=None): return format_amount( value, trim_empty_pence=True, truncate_after=truncate_after) or '—'
def display_total_amount(self, request, queryset): total = queryset.aggregate(models.Sum('amount'))['amount__sum'] self.message_user(request, _('Total: %s') % format_amount(total, True))
def balance(cls, instance): return format_amount(instance.closing_balance)
def __init__(self, *args, limit, **kwargs): kwargs['limit'] = limit super().__init__(*args, **kwargs) self.description = self.description.format(display_limit=format_amount( limit, trim_empty_pence=True, pound_sign=True))
def formatted_amount(self, instance): return format_amount(instance.amount)
def formatted_credit_total(self, instance): return format_amount(instance.credit_total)
def get_simple_stats(): today = timezone.now().replace(hour=0, minute=0, second=0, microsecond=0) credited_stats = Credit.objects.credited() \ .aggregate(count=models.Count('*'), amount=models.Sum('amount')) credited_stats['amount'] = credited_stats['amount'] or 0 pending_credits = Credit.objects.credit_pending() \ .filter(received_at__lt=today) \ .count() digital_takeup = DigitalTakeup.objects.mean_digital_takeup() credit_stats = [ { 'title': _('Credited'), 'value': format_html( '{}<br>{}', ngettext('%(number)s credit', '%(number)s credits', credited_stats['count']) % { 'number': format_number(credited_stats['count'], truncate_after=1000000) }, format_amount(credited_stats['amount'], trim_empty_pence=True), ), }, { 'title': _('Pending'), 'value': ngettext( '%(number)s credit', '%(number)s credits', pending_credits) % { 'number': format_number(pending_credits, truncate_after=1000000) }, }, { 'title': _('Digital take-up'), 'value': '?' if digital_takeup is None else format_percentage(digital_takeup), }, ] sent_stats = Disbursement.objects.sent() \ .aggregate(count=models.Count('*'), amount=models.Sum('amount')) sent_stats['amount'] = sent_stats['amount'] or 0 pending_disbursements = Disbursement.objects \ .exclude(resolution=DISBURSEMENT_RESOLUTION.REJECTED) \ .exclude(resolution=DISBURSEMENT_RESOLUTION.SENT) \ .count() disbursement_stats = [ { 'title': _('Sent'), 'value': format_html( '{}<br>{}', ngettext('%(number)s disbursement', '%(number)s disbursements', sent_stats['count']) % { 'number': format_number(sent_stats['count'], truncate_after=1000000) }, format_amount(sent_stats['amount'], trim_empty_pence=True), ), }, { 'title': _('Pending'), 'value': ngettext('%(number)s disbursement', '%(number)s disbursements', pending_disbursements) % { 'number': format_number(pending_disbursements, truncate_after=1000000) }, }, ] try: earliest_credit = Credit.objects.earliest() except Credit.DoesNotExist: earliest_credit = None try: earliest_disbursement = Disbursement.objects.earliest() except Disbursement.DoesNotExist: earliest_disbursement = None return { 'credits': credit_stats, 'earliest_credit': earliest_credit, 'disbursements': disbursement_stats, 'earliest_disbursement': earliest_disbursement, }
def formatted_disbursement_total(self, instance): return format_amount(instance.disbursement_total)
def formatted_amount(self, instance): return format_amount(instance.amount)
def __str__(self): return '%s %s' % (self.date.isoformat(), format_amount(self.closing_balance))
def display_total_amount(self, request, queryset): total = queryset.aggregate(models.Sum('amount'))['amount__sum'] self.message_user(request, _('Total: %s') % format_amount(total, True))
def formatted_payment_amount(self, instance): return format_amount(instance.payment_amount)
def formatted_payment_amount(self, instance): return format_amount(instance.payment_amount)
def formatted_service_charge(self, instance): return format_amount(instance.service_charge)
def total_amount(self, instance): return format_amount(instance.total_amount)
def get_simple_stats(): today = timezone.now().replace(hour=0, minute=0, second=0, microsecond=0) credited_stats = Credit.objects.credited() \ .aggregate(count=models.Count('*'), amount=models.Sum('amount')) credited_stats['amount'] = credited_stats['amount'] or 0 pending_credits = Credit.objects.credit_pending() \ .filter(received_at__lt=today) \ .count() digital_takeup = DigitalTakeup.objects.mean_digital_takeup() credit_stats = [ { 'title': _('Credited'), 'value': format_html( '{}<br>{}', ngettext('%(number)s credit', '%(number)s credits', credited_stats['count']) % { 'number': format_number(credited_stats['count'], truncate_after=1000000) }, format_amount(credited_stats['amount'], trim_empty_pence=True), ), }, { 'title': _('Pending'), 'value': ngettext('%(number)s credit', '%(number)s credits', pending_credits) % { 'number': format_number(pending_credits, truncate_after=1000000) }, }, { 'title': _('Digital take-up'), 'value': '?' if digital_takeup is None else format_percentage(digital_takeup), }, ] sent_stats = Disbursement.objects.sent() \ .aggregate(count=models.Count('*'), amount=models.Sum('amount')) sent_stats['amount'] = sent_stats['amount'] or 0 pending_disbursements = Disbursement.objects \ .exclude(resolution=DISBURSEMENT_RESOLUTION.REJECTED) \ .exclude(resolution=DISBURSEMENT_RESOLUTION.SENT) \ .count() disbursement_stats = [ { 'title': _('Sent'), 'value': format_html( '{}<br>{}', ngettext('%(number)s disbursement', '%(number)s disbursements', sent_stats['count']) % { 'number': format_number(sent_stats['count'], truncate_after=1000000) }, format_amount(sent_stats['amount'], trim_empty_pence=True), ), }, { 'title': _('Pending'), 'value': ngettext('%(number)s disbursement', '%(number)s disbursements', pending_disbursements) % { 'number': format_number(pending_disbursements, truncate_after=1000000) }, }, ] try: earliest_credit = Credit.objects.earliest() except Credit.DoesNotExist: earliest_credit = None try: earliest_disbursement = Disbursement.objects.earliest() except Disbursement.DoesNotExist: earliest_disbursement = None return { 'credits': credit_stats, 'earliest_credit': earliest_credit, 'disbursements': disbursement_stats, 'earliest_disbursement': earliest_disbursement, }