Files
oee/accounts/views.py
2026-07-18 16:04:40 +00:00

224 lines
5.3 KiB
Python

from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.db.models import Count, Q
from .models import Plant, InvoiceValidation, Users, Lines, BreakdownLogs
from .utils import get_shift_date_range
import bcrypt
from django.contrib import messages
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
from django.db import connection
from django.utils import timezone
from datetime import datetime, time, timedelta
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
user = Users.objects.filter(name=username).first()
if user:
if bcrypt.checkpw(
password.encode(),
user.password.encode()
):
return redirect("dashboard")
else:
messages.error(request, "Invalid Password")
return redirect("login")
else:
messages.error(request, "Username not found")
return redirect("login")
return render(request, "login.html")
def get_lines(request, plant_id):
lines = Lines.objects.filter(
plant_id=plant_id,
deleted_at__isnull=True
).values("id", "name")
return JsonResponse({
"lines": list(lines)
})
@csrf_exempt
def save_breakdown(request):
try:
data = json.loads(request.body)
with connection.cursor() as cursor:
cursor.execute("""
INSERT INTO breakdown_logs
(
plant_id,
line_id,
machine_name,
reason,
breakdown_at,
breakdown_time,
down_time
)
VALUES (%s,%s,%s,%s,%s,%s,%s)
""", [
data["plant_id"],
data["line_id"],
data["machine_name"],
data["reason"],
data["breakdown_date"],
data["breakdown_time"],
data["down_time"]
])
return JsonResponse({"status": "success"})
except Exception as e:
print(e)
return JsonResponse({
"status": "error",
"message": str(e)
}, status=500)
def dashboard(request):
start_date, end_date = get_shift_date_range("daily")
plants = Plant.objects.all()
total_plants = plants.count()
invoice_report = []
for plant in plants:
# Serial Invoice
total_serial = (
InvoiceValidation.objects
.filter(
plant_id=plant.id,
quantity__isnull=True,
created_at__gte=start_date,
created_at__lt=end_date
)
.values('invoice_number')
.distinct()
.count()
)
scanned_serial = (
InvoiceValidation.objects
.filter(
plant_id=plant.id,
quantity__isnull=True,
scanned_status="Scanned",
created_at__gte=start_date,
created_at__lt=end_date
)
.values('invoice_number')
.distinct()
.count()
)
# Material Invoice
total_material = (
InvoiceValidation.objects
.filter(
plant_id=plant.id,
quantity=1,
created_at__gte=start_date,
created_at__lt=end_date
)
.values('invoice_number')
.distinct()
.count()
)
# Bundle Invoice
total_bundle = (
InvoiceValidation.objects
.filter(
plant_id=plant.id,
quantity__gt=1,
created_at__gte=start_date,
created_at__lt=end_date
)
.values('invoice_number')
.distinct()
.count()
)
invoice_report.append({
"plant": plant.name,
"serial_total": total_serial,
"serial_scanned": scanned_serial,
"material_total": total_material,
"bundle_total": total_bundle
})
plants = Plant.objects.filter(deleted_at__isnull=True).order_by("name")
now = timezone.localtime()
now1 = timezone.now()
start_time = timezone.make_aware(
datetime.combine(now.date(), time(8, 0, 0))
)
# If current time is before 8 AM, shift starts yesterday 8 AM
if now < start_time:
start_time = start_time - timedelta(days=1)
# Next day 08:00 AM
end_time = start_time + timedelta(days=1)
breakdowns = BreakdownLogs.objects.filter(
deleted_at__isnull=True,
created_at__gte=start_time,
created_at__lt=end_time
)
return render(
request,
"dashboard.html",
{
"total_plants": total_plants,
"plants": plants,
"breakdowns": breakdowns,
"total_serial": total_serial,
"scanned_serial": scanned_serial,
"invoice_report": invoice_report,
"start_date":start_date,
"end_date":end_date
}
)