added net weight, user, date etc. generates new document number with year as a prefix, restarts numbering every year
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
# Generated by Django 4.2.8 on 2026-02-22 10:11
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("api", "0002_add_report_model"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="DocumentCounter",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
("year", models.IntegerField(unique=True)),
|
||||
("last_number", models.IntegerField(default=0)),
|
||||
],
|
||||
),
|
||||
]
|
||||
+16
-1
@@ -1,4 +1,4 @@
|
||||
from django.db import models
|
||||
from django.db import models, transaction
|
||||
from django.contrib.auth.models import AbstractUser
|
||||
from django.utils import timezone
|
||||
|
||||
@@ -57,3 +57,18 @@ class Report(models.Model):
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class DocumentCounter(models.Model):
|
||||
year = models.IntegerField(unique=True)
|
||||
last_number = models.IntegerField(default=0)
|
||||
|
||||
|
||||
def generate_doc_number(year):
|
||||
with transaction.atomic():
|
||||
counter, _ = DocumentCounter.objects.select_for_update().get_or_create(
|
||||
year=year, defaults={'last_number': 0}
|
||||
)
|
||||
counter.last_number += 1
|
||||
counter.save()
|
||||
return f"{year}-{counter.last_number:06d}"
|
||||
|
||||
@@ -125,14 +125,19 @@ class VehicleSerializer(serializers.ModelSerializer):
|
||||
extra = VehicleExtraSerializer(required=False, allow_null=True)
|
||||
tare_user_name = serializers.CharField(source='tare_user.username', read_only=True, default=None)
|
||||
gross_user_name = serializers.CharField(source='gross_user.username', read_only=True, default=None)
|
||||
net_user_name = serializers.CharField(source='net_user.username', read_only=True, default=None)
|
||||
|
||||
class Meta:
|
||||
model = Vehicle
|
||||
fields = ['id', 'vehicle_number', 'trailer1_number', 'trailer2_number', 'driver_pid',
|
||||
'tare', 'tare_date', 'tare_user', 'tare_user_name',
|
||||
'gross', 'gross_date', 'gross_user', 'gross_user_name', 'extra']
|
||||
'gross', 'gross_date', 'gross_user', 'gross_user_name',
|
||||
'net', 'net_date', 'net_user', 'net_user_name',
|
||||
'doc_number', 'extra']
|
||||
read_only_fields = ['id', 'tare_date', 'tare_user', 'tare_user_name',
|
||||
'gross_date', 'gross_user', 'gross_user_name']
|
||||
'gross_date', 'gross_user', 'gross_user_name',
|
||||
'net', 'net_date', 'net_user', 'net_user_name',
|
||||
'doc_number']
|
||||
|
||||
def create(self, validated_data):
|
||||
extra_data = validated_data.pop('extra', None)
|
||||
|
||||
+13
-1
@@ -2,7 +2,7 @@ from rest_framework import viewsets, status
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.permissions import IsAuthenticated, AllowAny
|
||||
from .models import ComPortReading, User, Report
|
||||
from .models import ComPortReading, User, Report, generate_doc_number
|
||||
from .serializers import (
|
||||
ComPortReadingSerializer, UserSerializer, UserDetailSerializer,
|
||||
ChangePasswordSerializer, VehicleSerializer, NomenclatureSerializer,
|
||||
@@ -111,6 +111,16 @@ class ComPortReadingViewSet(viewsets.ModelViewSet):
|
||||
serializer.save(source_ip=self.get_client_ip(self.request))
|
||||
|
||||
|
||||
def _maybe_finalize(vehicle, user):
|
||||
"""If both tare and gross are set and net hasn't been calculated yet, compute net and assign doc_number."""
|
||||
if vehicle.tare is not None and vehicle.gross is not None and vehicle.net is None:
|
||||
vehicle.net = vehicle.gross - vehicle.tare
|
||||
vehicle.net_date = timezone.now()
|
||||
vehicle.net_user = user
|
||||
vehicle.doc_number = generate_doc_number(timezone.now().year)
|
||||
vehicle.save()
|
||||
|
||||
|
||||
class VehicleViewSet(viewsets.ModelViewSet):
|
||||
"""
|
||||
API endpoint for vehicle management.
|
||||
@@ -183,6 +193,7 @@ class VehicleViewSet(viewsets.ModelViewSet):
|
||||
vehicle.tare_date = timezone.now()
|
||||
vehicle.tare_user = request.user
|
||||
vehicle.save()
|
||||
_maybe_finalize(vehicle, request.user)
|
||||
|
||||
serializer = self.get_serializer(vehicle)
|
||||
sse_broadcast_update('vehicle', 'updated', serializer.data)
|
||||
@@ -204,6 +215,7 @@ class VehicleViewSet(viewsets.ModelViewSet):
|
||||
vehicle.gross_date = timezone.now()
|
||||
vehicle.gross_user = request.user
|
||||
vehicle.save()
|
||||
_maybe_finalize(vehicle, request.user)
|
||||
|
||||
serializer = self.get_serializer(vehicle)
|
||||
sse_broadcast_update('vehicle', 'updated', serializer.data)
|
||||
|
||||
Reference in New Issue
Block a user