249 lines
7.8 KiB
Python
249 lines
7.8 KiB
Python
import os
|
|
import platform
|
|
|
|
from django import get_version as django_version
|
|
from django.shortcuts import render, redirect, get_object_or_404
|
|
from django.urls import reverse_lazy
|
|
from django.utils import timezone
|
|
from django.views.generic import CreateView, UpdateView, DeleteView
|
|
|
|
from .forms import SaleForm, ProductForm, CustomerForm, SellerForm
|
|
from .models import Product, Customer, Seller, Sale, SaleItem
|
|
|
|
|
|
def index(request):
|
|
"""Render the landing screen with loader and environment details."""
|
|
|
|
host_name = request.get_host().lower()
|
|
|
|
agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic"
|
|
|
|
now = timezone.now()
|
|
|
|
products = Product.objects.all()
|
|
|
|
context = {
|
|
"products": products,
|
|
"project_name": "New Style",
|
|
"agent_brand": agent_brand,
|
|
"django_version": django_version(),
|
|
"python_version": platform.python_version(),
|
|
"current_time": now,
|
|
"host_name": host_name,
|
|
"project_description": os.getenv("PROJECT_DESCRIPTION", ""),
|
|
"project_image_url": os.getenv("PROJECT_IMAGE_URL", ""),
|
|
}
|
|
|
|
return render(request, "core/index.html", context)
|
|
|
|
|
|
def customer_list(request):
|
|
customers = Customer.objects.all()
|
|
return render(request, 'core/customer_list.html', {'customers': customers})
|
|
|
|
|
|
class CustomerCreateView(CreateView):
|
|
model = Customer
|
|
form_class = CustomerForm
|
|
template_name = 'core/customer_form.html'
|
|
success_url = reverse_lazy('customer_list')
|
|
|
|
|
|
class CustomerUpdateView(UpdateView):
|
|
model = Customer
|
|
form_class = CustomerForm
|
|
template_name = 'core/customer_form.html'
|
|
success_url = reverse_lazy('customer_list')
|
|
|
|
|
|
class CustomerDeleteView(DeleteView):
|
|
model = Customer
|
|
template_name = 'core/customer_confirm_delete.html'
|
|
success_url = reverse_lazy('customer_list')
|
|
|
|
|
|
class SellerCreateView(CreateView):
|
|
model = Seller
|
|
form_class = SellerForm
|
|
template_name = 'core/seller_form.html'
|
|
success_url = reverse_lazy('seller-list')
|
|
|
|
|
|
class SellerUpdateView(UpdateView):
|
|
model = Seller
|
|
form_class = SellerForm
|
|
template_name = 'core/seller_form.html'
|
|
success_url = reverse_lazy('seller-list')
|
|
|
|
|
|
class SellerDeleteView(DeleteView):
|
|
model = Seller
|
|
template_name = 'core/seller_confirm_delete.html'
|
|
success_url = reverse_lazy('seller-list')
|
|
|
|
|
|
def seller_list(request):
|
|
"""Render the seller list page."""
|
|
|
|
sellers = Seller.objects.all()
|
|
|
|
context = {"sellers": sellers}
|
|
|
|
return render(request, "core/seller_list.html", context)
|
|
|
|
|
|
import logging
|
|
|
|
def sale_list(request):
|
|
"""Render the sale list page."""
|
|
|
|
logging.info("Sale list view called")
|
|
|
|
sales = Sale.objects.select_related('customer', 'seller').all()
|
|
logging.info(f"Sales: {sales}")
|
|
|
|
context = {"sales": sales}
|
|
|
|
return render(request, "core/sale_list.html", context)
|
|
|
|
|
|
from django.forms import inlineformset_factory
|
|
from django.db import transaction
|
|
from .forms import SaleForm, ProductForm, CustomerForm, SellerForm, SaleItemForm
|
|
def sale_create(request):
|
|
SaleItemFormSet = inlineformset_factory(
|
|
Sale, SaleItem, form=SaleItemForm, extra=1, can_delete=True
|
|
)
|
|
if request.method == 'POST':
|
|
form = SaleForm(request.POST)
|
|
formset = SaleItemFormSet(request.POST)
|
|
|
|
if form.is_valid() and formset.is_valid():
|
|
with transaction.atomic():
|
|
sale = form.save(commit=False)
|
|
# Initialize calculated fields
|
|
sale.total_amount = 0
|
|
sale.commission_amount = 0
|
|
sale.save() # Save sale to get an ID for the formset
|
|
|
|
formset.instance = sale
|
|
sale_items = formset.save(commit=False)
|
|
|
|
total_amount = 0
|
|
commission_amount = 0
|
|
|
|
for item in sale_items:
|
|
# Freeze price at the time of sale
|
|
item.price = item.product.price
|
|
|
|
# Determine commission rate: Use seller's rate if > 0, otherwise fallback to product's rate
|
|
if sale.seller and sale.seller.commission > 0:
|
|
item.commission_rate = sale.seller.commission
|
|
else:
|
|
item.commission_rate = item.product.commission_rate
|
|
item.save()
|
|
|
|
# Calculate totals
|
|
item_total = item.price * item.quantity
|
|
total_amount += item_total
|
|
commission_amount += item_total * (item.commission_rate / 100)
|
|
|
|
# Update the sale instance with calculated totals
|
|
sale.total_amount = total_amount
|
|
sale.commission_amount = commission_amount
|
|
sale.save()
|
|
|
|
return redirect('sale_list')
|
|
else:
|
|
form = SaleForm()
|
|
formset = SaleItemFormSet()
|
|
|
|
return render(request, 'core/sale_create.html', {'form': form, 'formset': formset})
|
|
|
|
def sale_update(request, pk):
|
|
sale = get_object_or_404(Sale, pk=pk)
|
|
SaleItemFormSet = inlineformset_factory(
|
|
Sale, SaleItem, form=SaleItemForm, extra=1, can_delete=True
|
|
)
|
|
|
|
if request.method == 'POST':
|
|
form = SaleForm(request.POST, instance=sale)
|
|
formset = SaleItemFormSet(request.POST, instance=sale)
|
|
|
|
if form.is_valid() and formset.is_valid():
|
|
with transaction.atomic():
|
|
sale = form.save()
|
|
|
|
# Handle deleted items first
|
|
for form in formset.deleted_forms:
|
|
if form.instance.pk:
|
|
form.instance.delete()
|
|
|
|
# Handle new and changed items
|
|
sale_items = formset.save(commit=False)
|
|
for item in sale_items:
|
|
if not item.pk: # If it's a new item
|
|
item.price = item.product.price
|
|
# Commission rate will be set in the recalculation step
|
|
item.save()
|
|
formset.save_m2m()
|
|
|
|
# Recalculate total amount and commission from all valid items
|
|
total_amount = 0
|
|
commission_amount = 0
|
|
for item in sale.items.all():
|
|
# Determine and save the correct commission rate for every item
|
|
if sale.seller and sale.seller.commission > 0:
|
|
item.commission_rate = sale.seller.commission
|
|
else:
|
|
item.commission_rate = item.product.commission_rate
|
|
item.save()
|
|
|
|
item_total = item.price * item.quantity
|
|
total_amount += item_total
|
|
commission_amount += item_total * (item.commission_rate / 100)
|
|
|
|
sale.total_amount = total_amount
|
|
sale.commission_amount = commission_amount
|
|
sale.save()
|
|
|
|
return redirect('sale_list')
|
|
else:
|
|
form = SaleForm(instance=sale)
|
|
formset = SaleItemFormSet(instance=sale)
|
|
|
|
return render(request, 'core/sale_form.html', {'form': form, 'formset': formset, 'sale': sale})
|
|
|
|
|
|
|
|
|
|
def product_list(request):
|
|
products = Product.objects.all()
|
|
return render(request, 'core/product_list.html', {'products': products})
|
|
|
|
|
|
class ProductCreateView(CreateView):
|
|
model = Product
|
|
form_class = ProductForm
|
|
template_name = 'core/product_form.html'
|
|
success_url = reverse_lazy('product_list')
|
|
|
|
|
|
class ProductUpdateView(UpdateView):
|
|
model = Product
|
|
form_class = ProductForm
|
|
template_name = 'core/product_form.html'
|
|
success_url = reverse_lazy('product_list')
|
|
|
|
|
|
class ProductDeleteView(DeleteView):
|
|
model = Product
|
|
template_name = 'core/product_confirm_delete.html'
|
|
success_url = reverse_lazy('product_list')
|
|
|
|
|
|
|
|
class SaleDeleteView(DeleteView):
|
|
model = Sale
|
|
template_name = 'core/sale_confirm_delete.html'
|
|
success_url = reverse_lazy('sale_list') |