feat: dodaj display_code polje za putne naloge (MT070626 format)
Some checks failed
ERP CI/CD Pipeline / test (push) Has been cancelled
ERP CI/CD Pipeline / Deploy (server git pull + compose) (push) Has been cancelled

- Dodano polje 'display_code' na WorkOrder model (format: 2 inicijala + ddmmyy)
- Migracije za kreiranje polja i backfill postojećih naloga
- Ažuriran WorkOrderSerializer za validaciju i serijalizaciju display_code
- Backend tasks za auto-generiranje display_code pri kreiranju
- Frontend komponente ažurirane za prikaz display_code umjesto UUID:
  * FleetDashboardShell tablica putnih naloga
  * WorkOrderDetailModal
  * TaskCreateModal
  * Sve PDF stranice
- displayIds.js utility za formatiranjeDisplay ID-eva
- Admin interface prikazuje display_code
This commit is contained in:
mariomitte
2026-07-17 23:53:47 +02:00
parent ef8718a4cf
commit bf8e25efe7
19 changed files with 377 additions and 54 deletions

View File

@@ -3,7 +3,9 @@ from django.test import TestCase
from django.contrib.auth import get_user_model
from modules.fleet.services import VehicleService
from modules.fleet.models import Vehicle, WorkOrder, VehicleServiceRecord
from modules.fleet.serializers import WorkOrderSerializer
from modules.task_management.models import Task
from rest_framework.test import APIRequestFactory
class FleetServiceTests(TestCase):
@@ -72,4 +74,58 @@ class FleetServiceTests(TestCase):
VehicleService.update_work_order(work_order, {"status": "closed"})
task.refresh_from_db()
self.assertEqual(task.status, "spreman_za_zavrsetak")
self.assertEqual(task.status, "spreman_za_zavrsetak")
def test_closing_work_order_moves_active_task_to_ready_for_completion(self):
work_order = WorkOrder.objects.create(
vehicle=self.vehicle,
creator=self.user,
purpose="kontrola",
status="open",
start_mileage=5000,
end_mileage=5200,
)
task = Task.objects.create(
title="Preventiva",
description="",
status="aktivan",
assigned_to=self.user,
vehicle=self.vehicle,
work_order=work_order,
)
VehicleService.update_work_order(work_order, {"status": "closed"})
task.refresh_from_db()
self.assertEqual(task.status, "spreman_za_zavrsetak")
def test_work_order_serializer_autogenerates_display_code(self):
self.user.first_name = "Mario"
self.user.last_name = "Tkalac"
self.user.save(update_fields=["first_name", "last_name"])
request = APIRequestFactory().post('/api/fleet/work-orders/', {})
request.user = self.user
serializer = WorkOrderSerializer(
data={
"vehicle": str(self.vehicle.id),
"purpose": "kontrola",
},
context={"request": request},
)
self.assertTrue(serializer.is_valid(), serializer.errors)
work_order = serializer.save()
self.assertRegex(work_order.display_code, r'^MT[0-9]{6}$')
def test_work_order_serializer_rejects_invalid_display_code(self):
request = APIRequestFactory().post('/api/fleet/work-orders/', {})
request.user = self.user
serializer = WorkOrderSerializer(
data={
"vehicle": str(self.vehicle.id),
"purpose": "kontrola",
"display_code": "BAD-CODE",
},
context={"request": request},
)
self.assertFalse(serializer.is_valid())
self.assertIn("display_code", serializer.errors)