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