From adf50f8bbdbd277a378fed49f332a36a082bbdd9 Mon Sep 17 00:00:00 2001 From: Jonas Hagberg Date: Sat, 28 Dec 2024 16:32:07 +0100 Subject: [PATCH] feat(select-herd-step): implement breeding filtering logic for report year Added a new function to filter breedings based on birth and breed dates for a specified report year. This enhancement improves the accuracy of breeding data displayed to users by ensuring only relevant entries are shown. Additionally, refactored the existing data fetching logic to utilize the new filtering function, streamlining the process and enhancing code clarity. Console logging has been included for debugging purposes during the filtering process. --- frontend/src/SelectHerdStep.tsx | 126 +++++++++++++++++++++++--------- 1 file changed, 93 insertions(+), 33 deletions(-) diff --git a/frontend/src/SelectHerdStep.tsx b/frontend/src/SelectHerdStep.tsx index 4eecc385..22dfbf93 100644 --- a/frontend/src/SelectHerdStep.tsx +++ b/frontend/src/SelectHerdStep.tsx @@ -79,10 +79,69 @@ export const SelectHerdStep: React.FC = ({ onUpdateStatus?.("completed"); }; - // Fetch breedings for the selected herdId + const filterBreedingsForYear = (breedings: any[], year: number) => { + console.log( + "Filtering breedings:", + breedings.map((b) => ({ + id: b.id, + birth_date: b.birth_date, + breed_date: b.breed_date, + })) + ); + + const filtered = breedings.filter((breeding) => { + console.log("Checking breeding:", breeding.id, { + birth_date: breeding.birth_date, + breed_date: breeding.breed_date, + }); + + // If we have a birth_date in the report year, include it + if (breeding.birth_date) { + const birthYear = new Date(breeding.birth_date).getFullYear(); + if (birthYear === year) { + console.log("Including due to birth_date:", breeding.id); + return true; + } + } + + // Check breed_date regardless of whether we have a birth_date + if (breeding.breed_date) { + const breedDate = new Date(breeding.breed_date); + const breedYear = breedDate.getFullYear(); + + if (breedYear === year) { + // Exclude if it's in the last 30 days of the year + const yearEnd = new Date(year, 11, 31); // December 31st + const daysBefore = Math.floor( + (yearEnd.getTime() - breedDate.getTime()) / (1000 * 60 * 60 * 24) + ); + const include = daysBefore >= 30; + console.log("Checking breed_date:", breeding.id, { + breedYear, + daysBefore, + include, + }); + return include; + } + } + + return false; + }); + + console.log( + "Filtered breedings:", + filtered.map((b) => ({ + id: b.id, + birth_date: b.birth_date, + breed_date: b.breed_date, + })) + ); + + return filtered; + }; + useEffect(() => { if (herdId) { - // Fetch breedings for the selected herd get(`/api/breeding/${herdId}`).then( (data: { breedings: any[] }) => { if (data && data.breedings) { @@ -106,16 +165,14 @@ export const SelectHerdStep: React.FC = ({ individuals: breeding.individuals || [], }) ); + let filteredBreedings = numberedBreedings; if (reportYear) { - filteredBreedings = numberedBreedings.filter((breeding) => { - if (!breeding.birth_date) { - return false; - } - const birthYear = new Date(breeding.birth_date).getFullYear(); - return birthYear === reportYear; - }); - // Renumber the filtered breedings starting from 1 + filteredBreedings = filterBreedingsForYear( + numberedBreedings, + reportYear + ); + // Renumber the filtered breedings filteredBreedings = filteredBreedings.map((breeding, index) => ({ ...breeding, number: index + 1, @@ -130,32 +187,15 @@ export const SelectHerdStep: React.FC = ({ } ); } else { - console.log("No herdId, clearing breedings"); setSelectedHerdBreedings([]); } }, [herdId, reportYear, userMessage]); - const handleBreedingClick = (breeding: any) => { - setSelectedBreeding(breeding); - setIsBreedingDialogOpen(true); - }; - - const handleNewBreedingClick = () => { - setSelectedBreeding("new"); - setIsBreedingDialogOpen(true); - }; - - const handleBreedingDialogClose = () => { - setSelectedBreeding(null); - setIsBreedingDialogOpen(false); - }; - const handleBreedingsChanged = () => { // Refresh the breedings data if (herdId) { get(`/api/breeding/${herdId}`).then((data: { breedings: any[] }) => { if (data && data.breedings) { - // Reuse existing sorting and filtering logic const sortedBreedings = data.breedings.sort((a, b) => { const dateA = new Date(a.birth_date || "9999-12-31"); const dateB = new Date(b.birth_date || "9999-12-31"); @@ -170,13 +210,13 @@ export const SelectHerdStep: React.FC = ({ father_name: breeding.father_name || breeding.father || "", individuals: breeding.individuals || [], })); + let filteredBreedings = numberedBreedings; if (reportYear) { - filteredBreedings = numberedBreedings.filter((breeding) => { - if (!breeding.birth_date) return false; - const birthYear = new Date(breeding.birth_date).getFullYear(); - return birthYear === reportYear; - }); + filteredBreedings = filterBreedingsForYear( + numberedBreedings, + reportYear + ); filteredBreedings = filteredBreedings.map((breeding, index) => ({ ...breeding, number: index + 1, @@ -188,11 +228,31 @@ export const SelectHerdStep: React.FC = ({ } }; + const handleBreedingClick = (breeding: any) => { + setSelectedBreeding(breeding); + setIsBreedingDialogOpen(true); + }; + + const handleNewBreedingClick = () => { + setSelectedBreeding("new"); + setIsBreedingDialogOpen(true); + }; + + const handleBreedingDialogClose = () => { + setSelectedBreeding(null); + setIsBreedingDialogOpen(false); + }; + // Helper function to determine if a row should be highlighted const getRowStyle = (breeding: any) => { - if (!breeding.litter_size6w && breeding.birth_date) { + // Red background for missing birth date or missing litter size at 6 weeks + if (!breeding.birth_date || breeding.litter_size6w === undefined) { return { backgroundColor: "#ffebee" }; // Light red background } + // Yellow background when litter size at 6 weeks is 0 (for verification) + if (breeding.litter_size6w === 0) { + return { backgroundColor: "#fff3e0" }; // Light yellow background + } return {}; };