finance logging

remotes/origin/yandex_rebiling
Andrey 8 years ago
parent 32e76a32a8
commit f027b109a5
  1. 2
      finance/models.py
  2. 1
      finance/urls.py
  3. 99
      finance/views.py

@ -50,7 +50,7 @@ class Invoice(models.Model):
('C', 'Отклонен'),
)
status = models.CharField(verbose_name='Статус', max_length=1, default='W', choices=BILL_STATUSES)
price = models.IntegerField(verbose_name='Сумма', editable=False, null=True, blank=True)
price = models.IntegerField(verbose_name='Сумма', editable=False, null=True, blank=True) #Todo На самом деле тут не далжно быть значений null
real_price = models.FloatField(verbose_name='Полученная сумма', null=True, blank=True,
help_text='Сумма, минус комиссия', editable=False)
method = models.CharField(verbose_name='Способ оплаты', max_length=2, default='Y', choices=BILL_METHOD)

@ -7,5 +7,6 @@ urlpatterns = [
url(r'bills/([0-9]{1,99})/$', views.BillDetailView.as_view()),
url(r'bills_find/$', views.FindBillView.as_view()),
url(r'yandex/fail/$', views.YandexFailView.as_view()),
url(r'invoice/([0-9]{1,99})/$', views.InvoiceDetailView.as_view()),
url(r'invoices/$', views.get_invoices),
]

@ -4,6 +4,7 @@ import logging
import requests
from django.contrib.auth import get_user_model
from django.core.mail import EmailMessage
from django.db import IntegrityError
from django.db.models import Q
from django.http import HttpResponse, HttpResponseForbidden
from django.shortcuts import redirect
@ -40,40 +41,38 @@ class BillListView(APIView):
def post(self, request):
if request.user.is_authenticated and (request.user.groups.filter(name__in=['managers','lead_managers']).exists()
or request.user.is_superuser):
bill = request.JSON.get('bill')
user = get_user_model().objects.get(email=request.JSON.get('user'))
opener = get_user_model().objects.get(email=request.JSON.get('opener'))
description = request.JSON.get('description', None)
comment = request.JSON.get('comment', None)
course_token = request.JSON.get('course_token', None)
if bill:
user = get_user_model().objects.get(email=bill['user'])
opener = get_user_model().objects.get(email=bill['opener'])
description = bill['description']
comment = bill['comment']
course_token = bill['course_token']
if course_token is None:
return Response("Идентификатор курса не передан", status=400)
try:
bill_obj = Bill.objects.get(user=user, course_token=course_token)
except Bill.DoesNotExist:
try:
bill_obj = Bill.objects.get(user=user, course_token=course_token)
except Bill.DoesNotExist:
bill_obj = Bill.objects.create(user=user, course_token=course_token)
except IntegrityError:
return Response("У пользователя уже есть счёт на этот курс", status=400)
bill_obj.opener = opener
bill_obj.description = description
bill_obj.comment = comment
bill_obj.save()
return Response(BillSerializer(bill_obj).data, status=200)
bill_obj.opener = bill_obj.opener if opener is None else opener
bill_obj.description = bill_obj.description if description is None else description
bill_obj.comment = bill_obj.comment if comment is None else comment
bill_obj.save()
return Response("Bill not set", status=400)
return Response(bill_obj.id, status=200)
return Response("Course detail access only for manager users", status=403)
return Response("Ошибка доступа, возможно вы разлогинились из другой вкладки браузера", status=403)
class InvoiceDetailView(APIView):
renderer_classes = (JSONRenderer,)
@staticmethod
def delete(request):
invoice_id = request.JSON.get('invoice_id', None)
if invoice_id is None:
return Response("invoice_id must be set", status=400)
def delete(request, invoice_id):
try:
i = Invoice.objects.get(id=invoice_id)
@ -84,48 +83,62 @@ class InvoiceDetailView(APIView):
return Response(status=204)
@transaction_decorator
def post(self, request):
@staticmethod
def post(request, invoice_id):
if request.user.is_authenticated and (request.user.groups.filter(name__in=['managers','lead_managers']).exists()
or request.user.is_superuser):
invoice_data = request.JSON.get('invoice', None)
if invoice_data is None:
return Response("Invoice mast be set", status=400)
bill_id = request.JSON.get('bill_id', None)
is_open = request.JSON.get('is_open', None)
method = request.JSON.get('method', None)
status = request.JSON.get('status', None)
price = request.JSON.get('price', None)
real_price = request.JSON.get('real_price', None)
if bill_id is None:
return Response("Не передан id счёта", status=400)
if is_open is None or method is None or status is None or price is None:
return Response("Не передан один из пораметров is_open, method, status, price", status=400)
try:
bill = Bill.objects.get(id=invoice_data.pop('bill'))
except (Bill.DoesNotExist, KeyError):
return Response('Bill id must be set', status=400)
bill = Bill.objects.get(id=bill_id)
except Bill.DoesNotExist:
return Response('Не найден счёт с id=%s' % bill_id, status=404)
invoice_data['method'] = get_real_name(elem=invoice_data['method'], array=Invoice.BILL_METHOD)
invoice_data['status'] = get_real_name(elem=invoice_data['status'], array=Invoice.BILL_METHOD)
method = get_real_name(elem=method, array=Invoice.BILL_METHOD)
status = get_real_name(elem=status, array=Invoice.BILL_METHOD)
if bill.check_validate() and invoice_data['is_open']:
if bill.check_validate() and is_open:
return Response("Уже есть платёж открывающий курс", status=400)
try:
invoice = Invoice.objects.get(id=invoice_data['id'])
except (Invoice.DoesNotExist, KeyError):
invoice = Invoice.objects.get(id=invoice_id)
except Invoice.DoesNotExist:
if bill.check_pay():
return Response(
"Нельзя добавить новый платёж, так как один из платежей по счёту уже оплачен", status=400)
invoice = Invoice.objects.create(**invoice_data)
invoice = Invoice.objects.create(
bill=bill,
method=method,
status=status,
is_open=is_open,
)
if invoice.status == "F":
return Response(InvoiceSerializer(invoice).data, status=200)
invoice.real_price = None
invoice.method = invoice_data['method']
invoice.status = invoice_data['status']
invoice.method = method
invoice.status = status
if invoice.status == "F":
invoice.real_price = invoice_data['real_price']
invoice.real_price = invoice.real_price if real_price is None else real_price
if bill.check_pay() and (invoice.price < invoice_data['price']):
if bill.check_pay() and (invoice.price < price):
return Response("""Нельзя менять стоимость по счёту в большую сторону,
когда один из платежей оплачен""", status=400)
invoice.price = invoice_data['price']
invoice.is_open = invoice_data['is_open']
invoice.price = price
invoice.is_open = is_open
if invoice.method == 'Y' and invoice.yandex_pay is None:
yandex_pay = Payment.objects.create(
@ -196,7 +209,9 @@ class FindBillView(APIView):
if key:
res = Bill.objects.filter(
Q(opener__email__contains=key.lower()) | Q(user__email__contains=key.lower())
Q(opener__email__contains=key.lower())
| Q(user__email__contains=key.lower())
| Q(id__contains=key)
)
else:

Loading…
Cancel
Save