feat: dodaj display_code polje za putne naloge (MT070626 format)
- 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:
@@ -1,6 +1,7 @@
|
||||
from rest_framework import serializers
|
||||
import re
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
from .models import (
|
||||
Crane,
|
||||
Vehicle,
|
||||
@@ -98,7 +99,7 @@ class WorkOrderSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = WorkOrder
|
||||
fields = [
|
||||
'id', 'vehicle', 'crane', 'crane_label', 'creator', 'date',
|
||||
'id', 'display_code', 'vehicle', 'crane', 'crane_label', 'creator', 'date',
|
||||
'start_mileage', 'end_mileage',
|
||||
'servicer_vehicle_registration', 'servicer_vehicle_make_model',
|
||||
'servicer_vehicle_start_mileage', 'servicer_vehicle_end_mileage',
|
||||
@@ -112,6 +113,7 @@ class WorkOrderSerializer(serializers.ModelSerializer):
|
||||
'creator': {'required': False},
|
||||
'start_mileage': {'required': False, 'allow_null': True},
|
||||
'end_mileage': {'required': False, 'allow_null': True},
|
||||
'display_code': {'required': False, 'allow_blank': False},
|
||||
'servicer_vehicle_registration': {'required': False, 'allow_blank': True},
|
||||
'servicer_vehicle_make_model': {'required': False, 'allow_blank': True},
|
||||
'servicer_vehicle_start_mileage': {'required': False, 'allow_null': True},
|
||||
@@ -146,6 +148,14 @@ class WorkOrderSerializer(serializers.ModelSerializer):
|
||||
|
||||
if user and 'creator' not in validated_data:
|
||||
validated_data['creator'] = user
|
||||
if not validated_data.get('display_code'):
|
||||
creator = validated_data.get('creator')
|
||||
generated_display_code = self._generate_display_code(creator, timezone.localdate())
|
||||
if not generated_display_code:
|
||||
raise serializers.ValidationError({
|
||||
'display_code': 'Serviser mora imati ime i prezime za automatsko generiranje oznake. Unesite oznaku ručno u formatu MT070626.'
|
||||
})
|
||||
validated_data['display_code'] = generated_display_code
|
||||
|
||||
return services.VehicleService.create_work_order(validated_data)
|
||||
|
||||
@@ -182,6 +192,22 @@ class WorkOrderSerializer(serializers.ModelSerializer):
|
||||
raise serializers.ValidationError({'servicer_vehicle_fuel_cost': 'Trošak goriva ne može biti negativan.'})
|
||||
return attrs
|
||||
|
||||
def validate_display_code(self, value):
|
||||
normalized = str(value or '').strip().upper()
|
||||
if not re.fullmatch(r"[A-Z]{2}[0-9]{6}", normalized):
|
||||
raise serializers.ValidationError('Prikaz putnog naloga mora biti u formatu MT070626 (2 slova + 6 znamenki).')
|
||||
return normalized
|
||||
|
||||
@staticmethod
|
||||
def _generate_display_code(user, target_date):
|
||||
if user is None:
|
||||
return None
|
||||
first_name = str(getattr(user, 'first_name', '') or '').strip()
|
||||
last_name = str(getattr(user, 'last_name', '') or '').strip()
|
||||
if not first_name or not last_name:
|
||||
return None
|
||||
return f"{first_name[0].upper()}{last_name[0].upper()}{target_date.strftime('%d%m%y')}"
|
||||
|
||||
|
||||
class WorkOrderInvoiceSerializer(serializers.ModelSerializer):
|
||||
image_url = serializers.SerializerMethodField()
|
||||
|
||||
Reference in New Issue
Block a user