def mk_entry(number, messages): entry = { 'number': number, 'disp_number': disp_number(number), 'network': network_for_number(number), 'total_reimbursed': reimbursements.get(number, 0), 'most_recent': messages[-1].date.strftime('%Y-%m-%d %H:%M:%S'), } if not entry['network']: return None cost_per_sms = settings.REIMBURSEMENT_RATES[entry['network']] entry['total_spent'] = cost_per_sms * len(messages) owed = entry['total_spent'] - entry['total_reimbursed'] entry['earliest_unreimbursed'] = None if owed > 0: num_unreimbursed = int(math.ceil(owed / float(cost_per_sms))) entry['earliest_unreimbursed'] = messages[-num_unreimbursed].date.strftime('%Y-%m-%d %H:%M:%S') return entry
def reimbursement_detail(request, number): reimbursements = ReimbursementLog.objects.filter(phone=number).order_by('-reimbursed_on') num_messages = Message.objects.filter(connection__identity=number, direction='I').count() owed = settings.REIMBURSEMENT_RATES[network_for_number(number)] * num_messages - sum([r.amount for r in reimbursements]) from django import forms from django.contrib.admin.widgets import AdminDateWidget class ReimbursementForm(forms.Form): amount = forms.IntegerField() when = forms.DateField(widget=AdminDateWidget, required=False) def clean_amount(self): data = self.cleaned_data['amount'] if data <= 0: raise forms.ValidationError('can\'t be 0 or negative') return data if request.method == 'POST': form = ReimbursementForm(request.POST) if form.is_valid(): entry_date = form.cleaned_data['when'] entry = ReimbursementLog( phone=number, amount=form.cleaned_data['amount'], reimbursed_on=datetime.now() if (not entry_date or entry_date == date.today()) else entry_date, ) entry.save() network_name = network_for_number(number) network = NAME_NETWORK_MAP.get(network_name) try: subscriber = Subscriber.objects.get( number=number[-13:], network=network) except Subscriber.DoesNotExist: pass else: balance = subscriber.balance - form.cleaned_data['amount'] subscriber.balance = max(balance, 0) subscriber.save() #import pdb;pdb.set_trace() backend_name = get_backend_name(network_name) backend, _ = Backend.objects.get_or_create(name=backend_name) try: conn = Connection.objects.get(identity=number, backend=backend) except Exception: #log somewhere? pass else: notice = OutgoingMessage(connection=conn, template=settings.REIMBURSEMENT_NOTICE) router = Router() router.outgoing(notice) return HttpResponseRedirect('/dashboard/reimbursement/') else: form = ReimbursementForm() return render(request, 'dashboard/reimbursement_detail.html', { 'number': disp_number(number), 'network': network_for_number(number), 'owed': owed, 'over': owed < 0, 'over_amt': -owed, 'history': reimbursements, 'form': form, })