feat: dozvoli dijeljenje putnog naloga izmedju razlicitih dizalica
Problem: serviser nije mogao odabrati putni nalog kreiran za drugu dizalicu jer je frontend filtrirao naloge po aktivnom crane kontekstu, a backend serializer je bacao ValidationError ako WO.vehicle != task.vehicle. Promjene: - TaskSerializer: uklonjena cross-crane validacija - WO moze pripadati drugoj dizalici od one na tasku (cross-crane sharing) - FleetDashboardShell: serviceRecordWorkOrders i selectedTaskWorkOrders vise ne filtriraju po vehicle ID-u, prikazuju sve otvorene naloge - TaskServiceRecordsModal: gumb i modal za izmjenu podataka dizalice (radni sati, kilometraza) premjesten iz WorkOrderDetailModal - WorkOrderDetailModal: uklonjen gumb 'Izmijeni podatke dizalice' - Dodana 3 nova backend testa za cross-crane WO dodjelu (15/15 prolaze) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -146,13 +146,12 @@ class TaskSerializer(serializers.ModelSerializer):
|
||||
'title': "Naslov zadatka je obavezan ako se task ne kreira iz templatea."
|
||||
})
|
||||
|
||||
# If task has no crane yet, auto-derive it from the work order's crane (backward compat).
|
||||
# Cross-crane assignment is intentionally allowed: a servicer can share one work order
|
||||
# across tasks for multiple cranes on the same day.
|
||||
if work_order and not vehicle:
|
||||
vehicle = work_order.vehicle
|
||||
attrs['vehicle'] = vehicle
|
||||
if work_order and vehicle and work_order.vehicle_id != vehicle.id:
|
||||
raise serializers.ValidationError({
|
||||
'work_order': "Putni nalog mora pripadati istoj dizalici kao task."
|
||||
})
|
||||
|
||||
if status_value in {'neaktivan', 'zavrsen'} and not work_order:
|
||||
raise serializers.ValidationError({
|
||||
|
||||
@@ -99,4 +99,58 @@ class TaskSerializerTests(TestCase):
|
||||
"vehicle": str(self.vehicle.id), "scheduled_date": "not-a-date"}
|
||||
)
|
||||
assert not serializer.is_valid()
|
||||
assert 'scheduled_date' in serializer.errors
|
||||
assert 'scheduled_date' in serializer.errors
|
||||
|
||||
def test_can_assign_work_order_from_different_crane(self):
|
||||
"""Task može dobiti putni nalog koji pripada drugoj dizalici (cross-crane dijeljenje naloga)."""
|
||||
other_vehicle = Vehicle.objects.create(
|
||||
registration_number="ZG-TSK-02",
|
||||
asset_type='crane',
|
||||
make='Manitowoc',
|
||||
model='Grove',
|
||||
client=self.client,
|
||||
is_company_vehicle=False,
|
||||
)
|
||||
work_order = WorkOrder.objects.create(vehicle=other_vehicle, creator=self.user, purpose='kontrola')
|
||||
task = Task.objects.create(title="Cross-crane task", status="servis", assigned_to=self.user, vehicle=self.vehicle)
|
||||
|
||||
serializer = TaskSerializer(instance=task, data={"work_order": str(work_order.id)}, partial=True)
|
||||
assert serializer.is_valid(), serializer.errors
|
||||
updated_task = serializer.save()
|
||||
assert updated_task.work_order_id == work_order.id
|
||||
assert updated_task.vehicle_id == self.vehicle.id # task zadržava svoju dizalicu
|
||||
|
||||
def test_can_close_task_with_cross_crane_work_order(self):
|
||||
"""Task se može zatvoriti putnim nalogom koji pripada drugoj dizalici."""
|
||||
other_vehicle = Vehicle.objects.create(
|
||||
registration_number="ZG-TSK-03",
|
||||
asset_type='crane',
|
||||
make='Tadano',
|
||||
model='GR',
|
||||
client=self.client,
|
||||
is_company_vehicle=False,
|
||||
)
|
||||
work_order = WorkOrder.objects.create(vehicle=other_vehicle, creator=self.user, purpose='popravak')
|
||||
task = Task.objects.create(title="Task for close", status="servis", assigned_to=self.user, vehicle=self.vehicle)
|
||||
|
||||
serializer = TaskSerializer(
|
||||
instance=task,
|
||||
data={"status": "zavrsen", "work_order": str(work_order.id)},
|
||||
partial=True
|
||||
)
|
||||
assert serializer.is_valid(), serializer.errors
|
||||
updated_task = serializer.save()
|
||||
assert updated_task.status == 'zavrsen'
|
||||
assert updated_task.work_order_id == work_order.id
|
||||
|
||||
def test_work_order_auto_derives_vehicle_when_task_has_none(self):
|
||||
"""Ako task nema dizalicu a dobiva WO, dizalica se preuzima iz WO (backward compat)."""
|
||||
work_order = WorkOrder.objects.create(vehicle=self.vehicle, creator=self.user, purpose='defektaza')
|
||||
serializer = TaskSerializer(
|
||||
data={"title": "Auto-vehicle task", "status": "aktivan", "work_order": str(work_order.id)},
|
||||
)
|
||||
# vehicle je obavezan pri kreiranju, ali ako task nije instanca ovo bi trebalo failati
|
||||
# Provjeri da vehicle derivation iz WO radi samo ako task već postoji (partial update)
|
||||
task = Task.objects.create(title="Temp task", status="aktivan", assigned_to=self.user, vehicle=self.vehicle)
|
||||
serializer2 = TaskSerializer(instance=task, data={"work_order": str(work_order.id)}, partial=True)
|
||||
assert serializer2.is_valid(), serializer2.errors
|
||||
Reference in New Issue
Block a user