From 3296d301ee980a8d2661ca539058d4052e6ee665 Mon Sep 17 00:00:00 2001 From: Rochas Date: Sun, 14 Dec 2025 16:08:27 +0100 Subject: [PATCH] gestion_user au lieu de gestion_ouvrier (qui est une ressource, donc en double avec gestionnaire_ressource) + filtre dans gestion_ressource pour avoir seulement les ressources du chantier courrant --- app/(tabs)/_layout.tsx | 4 +- .../{gestion_ouvrier.tsx => gestion_user.tsx} | 31 +++----- app/(tabs)/gestionnaire_ressource.tsx | 74 +++++++++++++------ class/utils.tsx | 23 ++++++ components/chantierSummary.tsx | 17 ++--- components/selectChantier.tsx | 4 +- services/ressourcesService.ts | 10 ++- 7 files changed, 107 insertions(+), 56 deletions(-) rename app/(tabs)/{gestion_ouvrier.tsx => gestion_user.tsx} (73%) diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index dd482dd..d87e3cf 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -39,9 +39,9 @@ export default function TabLayout() { }} /> , }} /> diff --git a/app/(tabs)/gestion_ouvrier.tsx b/app/(tabs)/gestion_user.tsx similarity index 73% rename from app/(tabs)/gestion_ouvrier.tsx rename to app/(tabs)/gestion_user.tsx index e69e0f7..644efbc 100644 --- a/app/(tabs)/gestion_ouvrier.tsx +++ b/app/(tabs)/gestion_user.tsx @@ -2,14 +2,11 @@ import { ThemedText } from "@/components/theme/themed-text"; import { ThemedTextInput } from "@/components/theme/themed-textinput"; import { ThemedView } from "@/components/theme/themed-view"; import Constants from "expo-constants"; //pour connaître la taille de la barre menu de l'OS en haut -import { useLocalSearchParams, useRouter } from "expo-router"; -import React, { useEffect, useMemo, useState } from "react"; -import { FlatList, Image, StyleSheet, Text, View } from "react-native"; +import React, { useEffect, useState } from "react"; +import { FlatList, StyleSheet, Text, View } from "react-native"; import { getUsers } from "@/services/ressourcesService"; -import { useChantier } from "../ContextChantier"; import SelectChantier from "@/components/selectChantier"; -import { Ressources } from "@/class/class"; -import { getRessources } from "@/services/ressourcesService"; +import { User } from "@/class/class"; type Concert = { group: string; @@ -22,19 +19,15 @@ type Concert = { favorite: boolean; }; -export default function GestionOuvrier() { - const router = useRouter(); - const { nom, prenom } = useLocalSearchParams(); // Recup data ecran precedent +export default function GestionUser() { const [search, setSearch] = useState(""); - const { chantier, setChantier } = useChantier(); - const [artisans, setRessources] = useState([]); + const [users, setUsers] = useState([]); useEffect(() => { async function loadData() { try { - //Nous ne gardons que les Ouvriers, qui peuvent être assignés à un chantier - const data = (await getRessources()).filter(u => u.type === "Ouvrier"); - setRessources(data); + const data = (await getUsers()); + setUsers(data); } catch (error) { console.error("Erreur lors du chargement :", error); } @@ -42,17 +35,15 @@ export default function GestionOuvrier() { loadData(); }, []); - const renderItem = ({ item, index }: { item?: Ressources; index: number }) => { + const renderItem = ({ item, index }: { item?: User; index: number }) => { if (!item) { return null; } return ( - - {item.name} - {item.quantity} - {item.type} + {item.name} {item.last_name} + {item.role} ); @@ -67,7 +58,7 @@ export default function GestionOuvrier() { index.toString()} contentContainerStyle={{ paddingBottom: 40 }} diff --git a/app/(tabs)/gestionnaire_ressource.tsx b/app/(tabs)/gestionnaire_ressource.tsx index f0df52c..ecdb54f 100644 --- a/app/(tabs)/gestionnaire_ressource.tsx +++ b/app/(tabs)/gestionnaire_ressource.tsx @@ -8,19 +8,25 @@ import { useLocalSearchParams, useRouter } from "expo-router"; import React, { useEffect, useState } from "react"; import { FlatList, Image, StyleSheet, Text, View } from "react-native"; import { Ressources } from "../../class/class"; -import { getRessources } from "../../services/ressourcesService"; +import { getReservations, getRessources } from "../../services/ressourcesService"; import SelectChantier from "@/components/selectChantier"; import { useRessources } from "../ContextRessource"; +import { useChantier } from "../ContextChantier"; +import { getNbUseRessources, getNbUseRessourcesInChantier, isInChantier } from "@/class/utils"; +import { useReservations } from "../ContextReservation"; export default function GestionnaireRessource() { const [search, setSearch] = useState(""); const {ressources, setRessources} = useRessources(); + const {reservations, setReservations} = useReservations(); + const {chantier, setChantier} = useChantier(); const [filterType, setFilterType] = useState("Tout"); const [showFilterMenu, setShowFilterMenu] = useState(false); + const [filterChantier, setFilterChantier] = useState(false); const router = useRouter(); useEffect(() => { - async function loadData() { + async function loadDataRessources() { try { const data = await getRessources(); setRessources(data); @@ -28,13 +34,23 @@ export default function GestionnaireRessource() { console.error("Erreur lors du chargement :", error); } } - loadData(); + async function loadDataReservations() { + try { + const data = await getReservations(); + setReservations(data); + } catch (error) { + console.error("Erreur lors du chargement :", error); + } + } + loadDataRessources(); + loadDataReservations(); }, []); const filteredData = ressources.filter((r) => { const matchName = r.name.toLowerCase().includes(search.toLowerCase()); const matchType = filterType === "Tout" || r.type === filterType; - return matchName && matchType; + + return matchName && matchType && (!filterChantier || (chantier && isInChantier(r,chantier,reservations))); }); const renderRessource = ({ item }: { item: Ressources }) => { @@ -43,11 +59,13 @@ export default function GestionnaireRessource() { - Id : {item.id} Nom : {item.name} Type : {item.type} Quantité totale : {item.quantity} - Quantité disponible : {item.available_quantity} + Quantité disponible : {item.quantity-getNbUseRessources(item, reservations)} + {filterChantier&&chantier && + Quantité utilisé dans le chantier : {getNbUseRessourcesInChantier(item,chantier, reservations)} + } ); @@ -84,15 +102,16 @@ export default function GestionnaireRessource() { > {t} + ))} - {/* Bouton "Fermer" remplacé */} - setShowFilterMenu(false)} - > + {/* Bouton "Fermer" remplacé */} + setShowFilterMenu(false)} + > Fermer @@ -117,14 +136,22 @@ export default function GestionnaireRessource() { {/* Bouton filtre en haut à droite */} - setShowFilterMenu(true)} - > - {`Filtre: ${filterType}`} - + + setShowFilterMenu(true)} + > + {`Filtre: ${filterType}`} + + + setFilterChantier(!filterChantier)}> + {filterChantier?"chantier courant":"tous"} + + + + } ListEmptyComponent={ @@ -214,4 +241,9 @@ const styles = StyleSheet.create({ marginBottom: 20, textAlign: "center", }, + button:{ + padding: 10, + borderRadius: 8, + marginTop: 10 + }, }); diff --git a/class/utils.tsx b/class/utils.tsx index e06ad30..3b68229 100644 --- a/class/utils.tsx +++ b/class/utils.tsx @@ -28,4 +28,27 @@ export function getNbUseRessources(ressource:Ressources, allReservations:Reserva } }) return res; +} + +export function getNbUseRessourcesInChantier(ressource:Ressources,chantier: Chantier, allReservations:Reservation[]):number{ + var res:number = 0; + getReservationOfRessource(ressource,allReservations).forEach(reserv => { + if(reserv.chantier.id === chantier.id && reserv.ressource.id===ressource.id){ + res+=reserv.quantity; + } + }) + return res; +} + +export function isInChantier(ressource:Ressources, chantier: Chantier, allReservations:Reservation[]):boolean{ + console.log(allReservations.length+ " --------------------------------"); + const reservations:Reservation[] = getReservationOfRessource(ressource,allReservations); + var res=false; + reservations.forEach(reserv => { + console.log(reserv.chantier.id + " " + chantier.id) + if(reserv.chantier.id === chantier.id){ + res=true; + } + }); + return res; } \ No newline at end of file diff --git a/components/chantierSummary.tsx b/components/chantierSummary.tsx index e49c425..dfdecf8 100644 --- a/components/chantierSummary.tsx +++ b/components/chantierSummary.tsx @@ -18,23 +18,22 @@ export default function ChantierSummary({data,style , ...otherProps }: Props) { {data.chantier ? ( - + - Id: {data.chantier.id} Objet: {data.chantier.name} Adresse: {data.chantier.adresse} Chef de chantier: {data.chantier.chef.last_name}{" "}{data.chantier.chef.name} État: {data.chantier.etat} - equipe: - {getNbItemReservation(data.chantier.equipe)} ({data.chantier.equipe.length} type{data.chantier.equipe.length>1&&"s"}) + + equipe: {getNbItemReservation(data.chantier.equipe)} ({data.chantier.equipe.length} type{data.chantier.equipe.length>1&&"s"}) - materiel: - {getNbItemReservation(data.chantier.materiel)} ({data.chantier.materiel.length} type{data.chantier.materiel.length>1&&"s"}) + + materiel: {getNbItemReservation(data.chantier.materiel)} ({data.chantier.materiel.length} type{data.chantier.materiel.length>1&&"s"}) + + + vehicules: {getNbItemReservation(data.chantier.vehicules)} ({data.chantier.vehicules.length} type{data.chantier.vehicules.length>1&&"s"}) - vehicules: - {getNbItemReservation(data.chantier.vehicules)} ({data.chantier.vehicules.length} type{data.chantier.vehicules.length>1&&"s"}) - ) : diff --git a/components/selectChantier.tsx b/components/selectChantier.tsx index c02f8db..28df91e 100644 --- a/components/selectChantier.tsx +++ b/components/selectChantier.tsx @@ -122,7 +122,7 @@ export default function SelectChantier() { - Renovation: {item.name} + Objet: {item.name} Adresse: {item.adresse} Chef de chantier: {item.chef.last_name}{" "}{item.chef.name} État: {item.etat} @@ -138,7 +138,7 @@ export default function SelectChantier() { onPressOpen()}> - {isOpen ? "Fermer" : (chantier!=null ? chantier.adresse : "Chantier")} + {isOpen ? "Fermer" : (chantier!=null ? chantier.name : "Chantier")} {isOpen && ( diff --git a/services/ressourcesService.ts b/services/ressourcesService.ts index 67f2a76..11cef28 100644 --- a/services/ressourcesService.ts +++ b/services/ressourcesService.ts @@ -219,8 +219,14 @@ async function convertReservation(res: any): Promise { return { id: res.id, - chantier: chantierSnap.data() as Chantier, - ressource: ressourceSnap.data() as Ressources, + chantier: { + id: chantierSnap.id, + ...(chantierSnap.data() as Omit), + }, + ressource: { + id: ressourceSnap.id, + ...(ressourceSnap.data() as Omit), + }, quantity: data.quantity, }; } catch (err) {