Files
xvatayka/core/apps/management/views/common/create.py
NORBOYEVSAMARIDDIN 493cb58222 first commit
2026-02-07 11:18:38 +05:00

220 lines
6.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from core.apps.management.forms import DeviceForm, IncomeForm, WarehouseForm, UserCreateForm, ExpenseFormEmployee, \
ExpenseFormManager, ExpenseFormBusinessman
from django.db import transaction
from django.shortcuts import render, redirect
from core.apps.management.forms import ToyMovementForm, ToyMovementFormEmployee
from django.contrib.auth.decorators import login_required
from core.apps.management.decorators import role_required
from core.apps.management.forms import UserCreateFormManagerToEmployee, UserCreateFormBusinessman
from core.apps.management.models import ToyMovement
@login_required
@role_required(["manager", "businessman"])
def create_device(request):
form = DeviceForm(request.POST or None, user=request.user)
if form.is_valid():
form.save()
return redirect("dashboard")
return render(request, "common/create/device_create.html", {
"form": form,
"title": "Aparat Yaratish"
})
@login_required
def create_income(request):
if request.method == "POST":
form = IncomeForm(request.POST, user=request.user)
if form.is_valid():
income = form.save(commit=False)
if request.user.role == "employee":
income.amount = None
income.save()
return redirect("income_list")
else:
form = IncomeForm(user=request.user)
return render(request, "common/create/income_create.html", {"form": form})
@login_required
def create_expense(request):
user = request.user
# select form based on role
if user.role == "employee":
form_class = ExpenseFormEmployee
elif user.role == "manager":
form_class = ExpenseFormManager
else: # businessman or superuser
form_class = ExpenseFormBusinessman
if request.method == "POST":
form = form_class(request.POST)
if form.is_valid():
with transaction.atomic():
expense = form.save(commit=False)
expense.created_by = user
# AUTO CONFIRM for manager & businessman
if user.role in ["manager", "businessman"]:
expense.is_confirmed = True
expense.confirmed_by = user
expense.save()
return redirect("dashboard")
else:
form = form_class()
return render(request, "common/create/expense_create.html", {
"form": form,
"title": "Xarajat qoʻshish",
"user_role": user.role
})
@login_required
@role_required(["businessman"])
def create_warehouse(request):
form = WarehouseForm(request.POST or None)
if form.is_valid():
form.save()
return redirect("businessman_dashboard")
return render(request, "common/create/warehouse_create.html", {
"form": form,
"title": "Sklad Yaratish"
})
@login_required
@role_required(["manager", "businessman"])
def create_user(request):
if request.user.role == "businessman":
form_class = UserCreateFormBusinessman
form_kwargs = {}
redirect_to = "businessman_dashboard"
else: # manager
form_class = UserCreateFormManagerToEmployee
form_kwargs = {"manager": request.user}
redirect_to = "manager_dashboard"
form = form_class(request.POST or None, **form_kwargs)
if form.is_valid():
form.save()
return redirect(redirect_to)
return render(request, "common/create/user_create.html", {
"form": form,
"title": "Foydalanuvchi yaratish",
})
@login_required
def create_toy_movement(request):
user = request.user
# Choose form based on role
form_class = ToyMovementFormEmployee if user.role == "employee" else ToyMovementForm
if request.method == "POST":
form = form_class(request.POST, user=user)
if form.is_valid():
with transaction.atomic():
movement = form.save(commit=False)
# Stock validation
from_wh = movement.from_warehouse
if from_wh.toys_count < movement.quantity:
form.add_error("quantity", "Not enough toys in warehouse.")
return render(
request,
"common/create/toy_movement_create.html",
{"form": form, "user_role": user.role}
)
# Deduct from source warehouse
from_wh.toys_count -= movement.quantity
from_wh.save()
# Add to destination warehouse if moving between warehouses
if movement.movement_type == "between_warehouses" and movement.to_warehouse:
to_wh = movement.to_warehouse
to_wh.toys_count += movement.quantity
to_wh.save()
# Set creator
movement.created_by = user
movement.save()
return redirect("dashboard")
else:
form = form_class(user=user)
return render(
request,
"common/create/toy_movement_create.html",
{"form": form, "user_role": user.role}
)
@login_required
@role_required(["manager", "businessman"])
def create_toy_movement_auto(request):
user = request.user
# Only employees can use this auto-creation
if request.method == "POST":
# We force movement_type to "between_warehouses"
movement = ToyMovement(
movement_type="between_warehouses",
from_warehouse=user.warehouse,
to_warehouse_id=request.POST.get("to_warehouse"),
device=None, # not used for between_warehouses
quantity=int(request.POST.get("quantity", 0)),
created_by=user
)
# Stock validation
from_wh = movement.from_warehouse
if from_wh.toys_count < movement.quantity:
form = ToyMovementForm(user=user) # just render empty form with message
return render(
request,
"common/create/toy_movement_create.html",
{
"form": form,
"user_role": user.role,
"error": "Not enough toys in warehouse."
}
)
with transaction.atomic():
# Update warehouse stock
from_wh.toys_count -= movement.quantity
from_wh.save()
# Save movement
movement.save()
return redirect("dashboard")
# GET request → render the create form
form = ToyMovementForm(user=user)
# Pre-fill movement_type and from_warehouse
form.fields["movement_type"].initial = "between_warehouses"
form.fields["from_warehouse"].initial = user.warehouse
# Optionally, disable editing these fields
form.fields["movement_type"].widget.attrs["readonly"] = True
form.fields["from_warehouse"].widget.attrs["readonly"] = True
return render(
request,
"common/create/toy_movement_create.html",
{"form": form, "user_role": user.role}
)