Example #1
0
    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
Example #2
0
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,
        })