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")