first commit

This commit is contained in:
NORBOYEVSAMARIDDIN
2026-02-07 11:18:38 +05:00
commit 493cb58222
228 changed files with 10859 additions and 0 deletions

View File

@@ -0,0 +1,220 @@
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}
)