131 lines
4.1 KiB
Python
131 lines
4.1 KiB
Python
from django.contrib.auth.mixins import LoginRequiredMixin
|
|
from django.urls import reverse_lazy
|
|
from django.views.generic import CreateView, DeleteView, DetailView, ListView, UpdateView
|
|
|
|
from apps.core.permissions import AdminRequiredMixin
|
|
from apps.finance.models import Expense, Invoice, Payment, TeamPayment
|
|
|
|
|
|
class InvoiceListView(LoginRequiredMixin, ListView):
|
|
model = Invoice
|
|
template_name = "pages/finance/invoice_list.html"
|
|
context_object_name = "invoices"
|
|
|
|
def get_queryset(self):
|
|
user = self.request.user
|
|
qs = Invoice.objects.select_related("project", "client")
|
|
if user.is_admin():
|
|
return qs.all()
|
|
return qs.filter(client=user)
|
|
|
|
|
|
class InvoiceDetailView(LoginRequiredMixin, DetailView):
|
|
model = Invoice
|
|
template_name = "pages/finance/invoice_detail.html"
|
|
context_object_name = "invoice"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context["payments"] = self.object.payments.all()
|
|
return context
|
|
|
|
|
|
class InvoiceCreateView(AdminRequiredMixin, CreateView):
|
|
model = Invoice
|
|
template_name = "pages/finance/invoice_form.html"
|
|
fields = ["project", "client", "amount", "due_date"]
|
|
success_url = reverse_lazy("invoice_list")
|
|
|
|
|
|
class InvoiceUpdateView(AdminRequiredMixin, UpdateView):
|
|
model = Invoice
|
|
template_name = "pages/finance/invoice_form.html"
|
|
fields = ["project", "client", "amount", "due_date", "status"]
|
|
|
|
def get_success_url(self):
|
|
return reverse_lazy("invoice_detail", kwargs={"pk": self.object.pk})
|
|
|
|
|
|
class InvoiceDeleteView(AdminRequiredMixin, DeleteView):
|
|
model = Invoice
|
|
template_name = "pages/finance/invoice_confirm_delete.html"
|
|
success_url = reverse_lazy("invoice_list")
|
|
|
|
|
|
class PaymentListView(AdminRequiredMixin, ListView):
|
|
model = Payment
|
|
template_name = "pages/finance/payment_list.html"
|
|
context_object_name = "payments"
|
|
ordering = ["-paid_at"]
|
|
|
|
|
|
class PaymentCreateView(AdminRequiredMixin, CreateView):
|
|
model = Payment
|
|
template_name = "pages/finance/payment_form.html"
|
|
fields = ["invoice", "paid_at", "method", "amount", "reference"]
|
|
success_url = reverse_lazy("payment_list")
|
|
|
|
|
|
class PaymentDeleteView(AdminRequiredMixin, DeleteView):
|
|
model = Payment
|
|
template_name = "pages/finance/payment_confirm_delete.html"
|
|
success_url = reverse_lazy("payment_list")
|
|
|
|
|
|
class ExpenseListView(LoginRequiredMixin, ListView):
|
|
model = Expense
|
|
template_name = "pages/finance/expense_list.html"
|
|
context_object_name = "expenses"
|
|
|
|
def get_queryset(self):
|
|
user = self.request.user
|
|
qs = Expense.objects.select_related("project", "raised_by")
|
|
if user.is_admin():
|
|
return qs.all()
|
|
return qs.filter(raised_by=user)
|
|
|
|
|
|
class ExpenseCreateView(LoginRequiredMixin, CreateView):
|
|
model = Expense
|
|
template_name = "pages/finance/expense_form.html"
|
|
fields = ["project", "amount", "category", "description"]
|
|
|
|
def form_valid(self, form):
|
|
form.instance.raised_by = self.request.user
|
|
return super().form_valid(form)
|
|
|
|
def get_success_url(self):
|
|
return reverse_lazy("expense_list")
|
|
|
|
|
|
class ExpenseDeleteView(AdminRequiredMixin, DeleteView):
|
|
model = Expense
|
|
template_name = "pages/finance/expense_confirm_delete.html"
|
|
success_url = reverse_lazy("expense_list")
|
|
|
|
|
|
class TeamPaymentListView(LoginRequiredMixin, ListView):
|
|
model = TeamPayment
|
|
template_name = "pages/finance/team_payment_list.html"
|
|
context_object_name = "payments"
|
|
|
|
def get_queryset(self):
|
|
user = self.request.user
|
|
qs = TeamPayment.objects.select_related("member")
|
|
if user.is_admin():
|
|
return qs.all()
|
|
return qs.filter(member=user)
|
|
|
|
|
|
class TeamPaymentCreateView(AdminRequiredMixin, CreateView):
|
|
model = TeamPayment
|
|
template_name = "pages/finance/team_payment_form.html"
|
|
fields = ["member", "period", "amount"]
|
|
success_url = reverse_lazy("team_payment_list")
|
|
|
|
|
|
class TeamPaymentDeleteView(AdminRequiredMixin, DeleteView):
|
|
model = TeamPayment
|
|
template_name = "pages/finance/team_payment_confirm_delete.html"
|
|
success_url = reverse_lazy("team_payment_list")
|