Пример #1
0
 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)
Пример #2
0
 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)
Пример #3
0
 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)
Пример #8
0
 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)
Пример #11
0
 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),
    }
Пример #17
0
    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))
Пример #23
0
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)
Пример #28
0
 def formatted_credit_total(self, instance):
     return format_amount(instance.credit_total)
Пример #29
0
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,
    }
Пример #30
0
 def formatted_disbursement_total(self, instance):
     return format_amount(instance.disbursement_total)
Пример #31
0
 def formatted_amount(self, instance):
     return format_amount(instance.amount)
 def __str__(self):
     return '%s %s' % (self.date.isoformat(), format_amount(self.closing_balance))
Пример #33
0
 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,
    }