2 from datetime import datetime
 
   3 from io import StringIO
 
   4 from django.conf import settings
 
   5 from django.http import HttpResponse
 
   6 from django.utils.safestring import mark_safe
 
   9 def bank_export(modeladmin, request, queryset):
 
  10     response = HttpResponse(content_type='text/csv; charset=cp1250')
 
  11     response['Content-Disposition'] = 'attachment; filename=export.csv'
 
  12     writer = csv.writer(response)
 
  20             ' '.join([obj.postal_code, obj.town]).strip(),
 
  29 def parse_payment_feedback(f):
 
  30     lines = csv.reader(StringIO(f.read().decode('cp1250')))
 
  33         assert line[0] in ('1', '2')
 
  37         booking_date = line[3]
 
  38         booking_date = datetime.strptime(booking_date, '%Y%m%d')
 
  40         is_dd = line[16] == 'DD'
 
  41         realised = line[17] == '1'
 
  42         reject_code = line[18]
 
  43         yield payment_id, booking_date, is_dd, realised, reject_code
 
  48 def parse_export_feedback(f):
 
  50     lines = csv.reader(StringIO(f.read().decode('cp1250')))
 
  55         yield payment_id, status, comment
 
  60 def bank_order(date, sent_at, queryset):
 
  61     response = HttpResponse(content_type='application/octet-stream')
 
  62     response['Content-Disposition'] = 'attachment; filename=order.PLD'
 
  70         raise ValueError('Payment date not set yet.')
 
  72     for debit in queryset:
 
  73         if debit.bank_acceptance_date is None:
 
  74             no_dates.append(debit)
 
  75         if debit.amount is None:
 
  76             no_amounts.append(debit)
 
  77         if debit.cancelled_at and debit.cancelled_at.date() <= date and (sent_at is None or debit.cancelled_at < sent_at):
 
  78             cancelled.append(debit)
 
  80     if no_dates or no_amounts or cancelled:
 
  83             t += 'Bank acceptance not received for: '
 
  85                 '<a href="/admin/pz/directdebit/{}/change">{}</a>'.format(
 
  92             t += 'Amount not set for: '
 
  94                 '<a href="/admin/pz/directdebit/{}/change">{}</a>'.format(
 
  97                 for debit in no_amounts
 
 101             t += 'Debits have been cancelled: '
 
 103                 '<a href="/admin/pz/directdebit/{}/change">{}</a>'.format(
 
 106                 for debit in cancelled
 
 109         raise ValueError(mark_safe(t))
 
 111     for debit in queryset:
 
 113             '{order_code},{date},{amount},{dest_bank_id},0,"{dest_iban}","{user_iban}",'
 
 114             '"{dest_addr}","{user_addr}",0,{user_bank_id},'
 
 115             '"/NIP/{dest_nip}/IDP/{payment_id}|/TXT/{payment_desc}||",'
 
 118                 date=date.strftime('%Y%m%d'),
 
 120                 amount=debit.amount * 100,
 
 121                 dest_bank_id=settings.PZ_IBAN[2:10],
 
 122                 dest_iban=settings.PZ_IBAN,
 
 123                 user_iban=debit.iban,
 
 124                 dest_addr=settings.PZ_ADDRESS_STRING,
 
 125                 user_bank_id=debit.iban[2:10],
 
 126                 dest_nip=settings.PZ_NIP,
 
 127                 payment_id=debit.payment_id,
 
 128                 payment_desc=settings.PZ_PAYMENT_DESCRIPTION,
 
 129                 user_addr = '|'.join((
 
 132                     debit.street_address,
 
 133                     ' '.join((debit.postal_code, debit.town))
 
 137     response.write('\r\n'.join(rows).encode('cp1250'))