Skip to content
Extraits de code Groupes Projets
Valider 080b68b6 rédigé par yasmineLafhim's avatar yasmineLafhim
Parcourir les fichiers

fix confirm sale order

parent 8dddc25a
Branches
1 requête de fusion!230fix confirm sale order
Pipeline #5433 réussi avec l'étape
in 7 minutes et 23 secondes
......@@ -4,6 +4,18 @@ import { GATEWAY_API_URL } from "@/config-global";
export const axiosInstance = axios.create({ baseURL: GATEWAY_API_URL });
export const getAllSuppliers = async () => {
try {
const response = await axiosInstance.get(endpoints.supplier.getAllSupplier);
if(response.status === 200) {
return response.data;
} else {
return null;
}
} catch (error) {
throw new Error('Failed to fetch suppliers');
}
}
export const getSaleOrderById = async (id: string ) => {
try {
......@@ -24,7 +36,6 @@ export const deleteSaleOrder = async (id: string ) => {
}
export const confirmSaleOrder = async (saleOrder: any) => {
console.log("confirmSaleOrder", saleOrder);
const existingSaleOrder = await getSaleOrderById(saleOrder.saleOrderId);
if (!existingSaleOrder) {
......
import { GATEWAY_API_URL } from "@/config-global";
import { endpoints } from "./server";
import axios from "axios";
const axiosInstance = axios.create({ baseURL: GATEWAY_API_URL });
export interface Driver {
id: number;
firstName: string;
lastName: string;
phoneNumber: string;
email: string;
street: string;
city: string;
country: string;
}
export async function getAllDrivers() {
try {
const response = await axiosInstance.get(endpoints.driver.getAllDrivers);
if (response.status === 200) {
return response.data;
} else {
return null;
}
} catch (error) {
return null;
}
}
export async function getDriverById(driverId: string) {
try {
const response = await axiosInstance.get(endpoints.driver.getDriverById(driverId));
if (response.status === 200) {
return response.data;
} else {
return null;
}
} catch (error) {
return null;
}
}
\ No newline at end of file
......@@ -322,6 +322,11 @@ export const endpoints = {
},
driver : {
getAllDrivers: "api/user/driver",
getDriverById: (id: string) => `api/user/driver/${id}`,
},
saleOrder:{
generate : (id: string) => `/api/stock/sale-orders/generate/${id}`,
delete : (id: string) => `/api/stock/sale-orders/${id}`,
......
import React, { useState } from 'react';
import React, { useEffect, useState } from 'react';
import { styled } from '@mui/system';
import { Button, IconButton, TableRow, TableCell, Collapse, Stack, Box, Paper, Divider, ListItemText, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, MenuItem, TextField, CircularProgress } from '@mui/material';
import Avatar from "@mui/material/Avatar";
......@@ -16,6 +16,7 @@ import { deleteSaleOrder, deleteSaleOrderItem, fetchAllSaleOrders } from '@/shar
import { enqueueSnackbar } from 'notistack';
import { get } from 'lodash';
import { confirmSaleOrder, getSaleOrderById } from '@/shared/api/confirm-sale-order';
import { getAllDrivers } from '@/shared/api/driver';
type Props = {
row: SaleOrder;
......@@ -25,6 +26,8 @@ type Props = {
onEditRow: VoidFunction;
onDeleteRow: VoidFunction;
getDetails: () => IInvoiceItem[];
drivers: any[];
suppliers: any[];
};
const StyledTextField = styled('input')({
......@@ -45,6 +48,8 @@ export default function InvoiceTableRow({
onEditRow,
onDeleteRow,
getDetails,
drivers,
suppliers
}: Props) {
const [showDetails, setShowDetails] = useState(false);
const [updatedItems, setUpdatedItems] = useState<SaleOrderItem[]>(row.saleOrderItems);
......@@ -63,7 +68,6 @@ export default function InvoiceTableRow({
const [reload, setReload] = useState(false); // Add this state definition
const [confirmLoading, setConfirmLoading] = useState(false);
const toggleDetails = () => setShowDetails(!showDetails);
const handleQuantityChange = (itemId: string, newQuantity: number) => {
......@@ -77,6 +81,15 @@ export default function InvoiceTableRow({
)
);
};
useEffect(() => {
if(suppliers.length > 0) {
setSelectedFournisseur(suppliers[0].id);
}
if(drivers.length > 0) {
setSelectedChauffeur(drivers[0].id);
}
}, [suppliers,drivers])
......@@ -170,7 +183,7 @@ export default function InvoiceTableRow({
enqueueSnackbar("La date de livraison doit être supérieure ou égale à la date de création", { variant: "error" });
return;
}
setConfirmLoading(true);
// confirmation de la commande
......@@ -178,8 +191,8 @@ export default function InvoiceTableRow({
{
saleOrderId: saleOrderId,
confirmedBy: 1,
supplierId: 142,
driverId: 2,
supplierId: selectedFournisseur,
driverId: selectedChauffeur,
deliveryDate: new Date(deliveryDate).toISOString().split('T')[0],
orderItems: updatedItems.map(item => ({
id: item.productId,
......@@ -361,8 +374,11 @@ export default function InvoiceTableRow({
value={selectedFournisseur}
onChange={(e) => setSelectedFournisseur(e.target.value)}
>
<MenuItem value="Fournisseur 1">Fournisseur 1</MenuItem>
<MenuItem value="Fournisseur 2">Fournisseur 2</MenuItem>
{suppliers.map((supplier) => (
<MenuItem key={supplier.id} value={supplier.id}>
{supplier.name}
</MenuItem>
))}
</TextField>
{/* Chauffeur Select */}
......@@ -372,8 +388,11 @@ export default function InvoiceTableRow({
value={selectedChauffeur}
onChange={(e) => setSelectedChauffeur(e.target.value)}
>
<MenuItem value="Chauffeur 1">Chauffeur 1</MenuItem>
<MenuItem value="Chauffeur 2">Chauffeur 2</MenuItem>
{drivers.map((driver) => (
<MenuItem key={driver.id} value={driver.id}>
{driver.name}
</MenuItem>
))}
</TextField>
{/* Date de Livraison */}
......
......@@ -23,6 +23,9 @@ import InvoiceTableRow from "../Order-table-row";
import { json2csv } from "json-2-csv";
import { useBoolean } from "@/hooks";
import { isSameDay } from "date-fns";
import { getAllDrivers } from "@/shared/api/driver";
import { useGetAllSuppliers } from "@/shared/api/supplier";
import { getAllSuppliers } from "@/shared/api/confirm-sale-order";
const TABLE_HEAD = [
{ id: "" },
{ id: "invoiceNumber", label: "" },
......@@ -48,12 +51,31 @@ export default function SalesOrderListView() {
const [loading, setLoading] = useState(false);
const [loadingSaleOrder, setLoadingSaleOrder] = useState(false); // Loading state
const [openConfirmDialog, setOpenConfirmDialog] = useState(false); // Confirmation dialog state
const [drivers, setDrivers] = useState([]);
const [suppliers, setSuppliers] = useState([]);
useEffect(() => {
const loadSaleOrders = async () => {
try {
setLoadingSaleOrder(true); // Show loading indicator
const saleOrders = await fetchAllSaleOrders();
const drivers = await getAllDrivers();
const suppliers = await getAllSuppliers();
setDrivers(
drivers.map((driver: any) => ({
id: driver.id,
name: driver.firstName + " " + driver.lastName,
}))
)
setSuppliers(
suppliers.map((supplier: any) => ({
id: supplier.id,
name: supplier.firstName + " " + supplier.lastName,
}))
)
setTableData(saleOrders);
} catch (error) {
enqueueSnackbar('Failed to fetch sale orders', { variant: 'error' });
......@@ -65,7 +87,6 @@ export default function SalesOrderListView() {
loadSaleOrders();
}, [enqueueSnackbar]);
const confirm = useBoolean();
const canReset =
!!filters.name ||
......@@ -73,7 +94,6 @@ export default function SalesOrderListView() {
filters.status !== "all";
const table = useTable({ defaultOrderBy: "createDate" });
const theme = useTheme();
const dateError = isAfter(filters.creationDate, null);
const dataFiltered = applyFilter({
......@@ -340,6 +360,8 @@ export default function SalesOrderListView() {
onEditRow={() => console.log(row.saleOrderId)}
onDeleteRow={() => handleDeleteSaleOrder(row.saleOrderId)}
getDetails={() => getDetails(row.saleOrderId)}
drivers={drivers}
suppliers={suppliers}
/>
))}
......
0% ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter