Add functionality to mark delivery controls as validated

Introduces a new API endpoint and UI elements to allow users to mark delivery controls as validated, including associated badges and mutation logic.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1e4433b5-47ab-464c-b663-fea2e53367dd
Replit-Commit-Checkpoint-Type: intermediate_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/1e4433b5-47ab-464c-b663-fea2e53367dd/Q8UjAXl
This commit is contained in:
michaelschal committed 2025-09-30 09:19:41 +00:00
1 parent 51e04fa9a1
commit b73f9f25d1
3 files changed
+74 -2

No files matched your search

+4
View File
@@ -47,6 +47,10 @@ externalPort = 6000
localPort = 44549
externalPort = 5173
[[ports]]
localPort = 44701
externalPort = 8000
[[ports]]
localPort = 44965
externalPort = 6800
+69 -2
View File
@@ -23,7 +23,9 @@ import {
Building,
User,
Check,
Package
Package,
AlertTriangle,
CheckCircle
} from "lucide-react";
import { safeFormat } from "@/lib/dateUtils";
import CreateDeliveryModal from "@/components/modals/CreateDeliveryModal";
@@ -111,6 +113,30 @@ export default function Deliveries() {
const groups = Array.isArray(groupsData) ? groupsData : [];
const markControlValidatedMutation = useMutation({
mutationFn: async (id: number) => {
await apiRequest(`/api/deliveries/${id}/control`, "PUT");
},
onSuccess: () => {
toast({
title: "Succès",
description: "Contrôle validé avec succès",
});
queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] });
queryClient.invalidateQueries({ queryKey: [deliveriesUrl] });
},
onError: (error: any) => {
if (isUnauthorizedError(error)) {
return;
}
toast({
title: "Erreur",
description: "Impossible de valider le contrôle",
variant: "destructive",
});
},
});
const deleteMutation = useMutation({
mutationFn: async (id: number) => {
await apiRequest(`/api/deliveries/${id}`, "DELETE");
@@ -180,6 +206,28 @@ export default function Deliveries() {
}
};
const getControlBadge = (delivery: DeliveryWithRelations) => {
if (!delivery.supplier?.requiresControl) {
return null;
}
if (delivery.controlValidated) {
return (
<Badge className="bg-green-50 text-green-700 border-green-200 flex items-center gap-1">
<CheckCircle className="w-3 h-3" />
Contrôle validé
</Badge>
);
}
return (
<Badge className="bg-orange-50 text-orange-700 border-orange-200 flex items-center gap-1">
<AlertTriangle className="w-3 h-3" />
Contrôle à faire
</Badge>
);
};
const formatQuantity = (quantity: number, unit: string) => {
return `${quantity} ${unit === 'palettes' ? 'P' : 'C'}`;
};
@@ -209,6 +257,10 @@ export default function Deliveries() {
setShowDeleteModal(true);
};
const handleMarkControlValidated = (deliveryId: number) => {
markControlValidatedMutation.mutate(deliveryId);
};
const confirmDeleteDelivery = () => {
if (deliveryToDelete) {
deleteMutation.mutate(deliveryToDelete.id);
@@ -375,7 +427,10 @@ export default function Deliveries() {
</Badge>
</td>
<td className="px-6 py-4 whitespace-nowrap">
{getStatusBadge(delivery.status)}
<div className="flex flex-col gap-1">
{getStatusBadge(delivery.status)}
{getControlBadge(delivery)}
</div>
</td>
<td className="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
{delivery.order ? (
@@ -422,6 +477,18 @@ export default function Deliveries() {
<Check className="w-4 h-4 border border-gray-300 rounded p-0.5" />
</Button>
)}
{delivery.supplier?.requiresControl && !delivery.controlValidated && delivery.status === 'delivered' && (
<Button
variant="ghost"
size="sm"
onClick={() => handleMarkControlValidated(delivery.id)}
className="text-orange-600 hover:text-orange-700"
data-testid={`button-validate-control-${delivery.id}`}
title="Marquer le contrôle comme effectué"
>
<CheckCircle className="w-4 h-4" />
</Button>
)}
{canDelete && (
<Button
variant="ghost"
+1
View File
@@ -124,6 +124,7 @@ export interface IStorage {
updateDelivery(id: number, delivery: Partial<InsertDelivery>): Promise<Delivery>;
deleteDelivery(id: number): Promise<void>;
validateDelivery(id: number, blData?: { blNumber: string; blAmount: number }): Promise<void>;
markDeliveryControlValidated(id: number, userId: string): Promise<void>;
// User-Group operations
getUserGroups(userId: string): Promise<UserGroup[]>;