feat(FE-137): integrate flock periods data fetching in RecordingForm for accurate recording validation

This commit is contained in:
rstubryan
2025-10-28 10:58:37 +07:00
parent c37950a230
commit c7b04c5bc6
@@ -30,6 +30,7 @@ import { LocationApi } from '@/services/api/master-data';
import { ProductWarehouseApi } from '@/services/api/inventory';
import { isResponseSuccess } from '@/lib/api-helper';
import { RECORDING_FLAG_OPTIONS } from '@/config/constant';
import { PeriodFlock } from '@/types/api/production/project-flock';
import { useModal } from '@/components/Modal';
import toast from 'react-hot-toast';
@@ -97,6 +98,20 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
RecordingApi.getAllFetcher
);
const flockPeriodsUrls = useMemo(() => {
if (!isResponseSuccess(projectFlocks)) return [];
return projectFlocks?.data.map(pf => `${ProjectFlockApi.basePath}/flocks/${pf.flock.id}/periods`) || [];
}, [projectFlocks]);
const { data: flockPeriodsData } = useSWR<BaseApiResponse<PeriodFlock>[]>(
flockPeriodsUrls.length > 0 ? flockPeriodsUrls : null,
(urls: string[]) => Promise.all(urls.map(url => fetch(url).then(res => res.json()))),
{
revalidateOnFocus: false,
dedupingInterval: 60000,
}
);
const recordedProjectFlockIds = useMemo(() => {
if (!isResponseSuccess(existingRecordings)) return new Set<number>();
@@ -105,13 +120,30 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
todayRecordings.forEach(recording => {
const recordingDate = recording.record_date?.split('T')[0];
if (recordingDate === today) {
const isRecordedToday = recordingDate === today;
let isCorrectPeriod = false;
if (isRecordedToday && flockPeriodsData && isResponseSuccess(projectFlocks)) {
const flockIndex = projectFlocks.data.findIndex(pf => pf.id === recording.project_flock_kandang_id);
if (flockIndex !== undefined && flockIndex >= 0 && flockPeriodsData[flockIndex]) {
const flockPeriod = flockPeriodsData[flockIndex];
const currentProjectFlock = projectFlocks.data[flockIndex];
if (currentProjectFlock && isResponseSuccess(flockPeriod) && flockPeriod.data?.next_period) {
const expectedDay = flockPeriod.data.next_period - 1;
isCorrectPeriod = recording.day === expectedDay;
}
}
}
if (isRecordedToday && (isCorrectPeriod || !flockPeriodsData)) {
recordedIds.add(recording.project_flock_kandang_id);
}
});
return recordedIds;
}, [existingRecordings, today]);
}, [existingRecordings, today, flockPeriodsData, projectFlocks]);
const { data: stockProducts, isLoading: isLoadingStockProducts } = useSWR(
stockProductsUrl,