import React, { useState, useEffect, useContext } from 'react'; import '../../components/Filters/Filters.css'; import './Outcomes.css'; import { langContext } from '../../context/LenguageContext'; import ConfirmationOutcome from '../../components/Modals/ConfirmationOutcome'; import axios from 'axios'; const IMAGE_BASE_URL = import.meta.env.VITE_API_BASE_URL + '/products'; export default function HousekeeperOutcomes() { const { lang } = useContext(langContext); const [products, setProducts] = useState([]); const [filteredProducts, setFilteredProducts] = useState([]); const [categories, setCategories] = useState([]); const [nameFilter, setNameFilter] = useState(''); const [categoryFilter, setCategoryFilter] = useState(''); const [stockFilter, setStockFilter] = useState(''); const [formHousekepeer, setFormHousekepeer] = useState(null) const [modalOpen, setModalOpen] = useState(false); const [selectedId, setSelectedId] = useState(null); const [selectedProdName, setSelectedProdName] = useState(null); const [selectedProductStock, setSelectedProductStock] = useState(null); const handleOpenModal = (id, product, productStock) => { setSelectedId(id); setSelectedProdName(product); setSelectedProductStock(productStock); //setSelectedStatus(statusType); //setSelectedStatusId(statusId); setModalOpen(true); }; const handleConfirm = (PCO, UCO, HCO) => { if (!PCO || !UCO || !HCO) return; const currentdate = new Date(); axios.post(`${import.meta.env.VITE_API_BASE_URL}/products/newconsumptionstock`, { "product_id": PCO, "quantity_consumption": UCO, "date_consumption": currentdate.getFullYear() + "-" + (currentdate.getMonth() + 1) + "-" + currentdate.getDate(), "rfc_emp": HCO }) .then((res) => { console.log(res || 'Outcome realizado correctamente'); // Cerrar el modal y limpiar selección setModalOpen(false); setSelectedId(null); setSelectedProdName(null); setSelectedProductStock(null); async function loadProducts() { try { const response = await fetch(import.meta.env.VITE_API_BASE_URL + '/products'); const data = await response.json(); const productsList = Array.isArray(data.data) ? data.data : []; const productsWithDetails = await Promise.all( productsList.map(async (prod) => { try { const detailResponse = await fetch( `${import.meta.env.VITE_API_BASE_URL}/products/product/${prod.id_product}`, { method: "PUT" } ); const detailData = await detailResponse.json(); if (detailData.data && detailData.data.length > 0) { const detail = detailData.data[0]; return { ...prod, category: detail.id_category_pro || null, }; } return { ...prod, category: null, }; } catch (err) { console.error(`Error fetching product ${prod.id_product}:`, err); return { ...prod, category: null, }; } }) ); setProducts(productsWithDetails); setFilteredProducts(productsWithDetails); } catch (err) { console.error('Error fetching products', err); setProducts([]); setFilteredProducts([]); } } loadProducts(); }) .catch((err) => { console.error(`Error al actualizar el outcome con el producto ${selectedId}:`, err); alert('❌ Error al actualizar el outcome.'); }); }; const handleCancel = () => { setModalOpen(false); }; useEffect(() => { async function loadProducts() { try { const response = await fetch(import.meta.env.VITE_API_BASE_URL + '/products'); const data = await response.json(); const productsList = Array.isArray(data.data) ? data.data : []; const productsWithDetails = await Promise.all( productsList.map(async (prod) => { try { const detailResponse = await fetch( `${import.meta.env.VITE_API_BASE_URL}/products/product/${prod.id_product}`, { method: "PUT" } ); const detailData = await detailResponse.json(); if (detailData.data && detailData.data.length > 0) { const detail = detailData.data[0]; return { ...prod, category: detail.id_category_pro || null, }; } return { ...prod, category: null, }; } catch (err) { console.error(`Error fetching product ${prod.id_product}:`, err); return { ...prod, category: null, }; } }) ); setProducts(productsWithDetails); setFilteredProducts(productsWithDetails); } catch (err) { console.error('Error fetching products', err); setProducts([]); setFilteredProducts([]); } } async function fetchSelectData() { try { const res = await fetch(import.meta.env.VITE_API_BASE_URL + '/products/gethousekeeper', { method: 'GET', headers: { 'Content-Type': 'application/json' } }); if (!res.ok) throw new Error(`Error fetching info: ${res.status}`); const data = await res.json(); setFormHousekepeer(data.houseKeeper || []); } catch (err) { console.error('Error cargando metadata (getinfo):', err); } } fetchSelectData(); loadProducts(); }, []); useEffect(() => { async function loadFilterOptions() { try { const categoriesRes = await fetch( import.meta.env.VITE_API_BASE_URL + "/products/productcategory" ); const categoriesData = await categoriesRes.json(); if (categoriesData.data) { setCategories( categoriesData.data .filter((d) => d.id_prod_category) .map((d) => ({ id: d.id_prod_category, name: d.name_prod_category, spanish_name: d.spanish_name || d.name_prod_category, })) ); } } catch (err) { console.error("Error loading filter options", err); } } loadFilterOptions(); }, []); useEffect(() => { let filtered = [...products]; if (nameFilter) { filtered = filtered.filter(prod => prod.name_product?.toLowerCase().includes(nameFilter.toLowerCase()) ); } if (categoryFilter) { filtered = filtered.filter( (prod) => prod.category && prod.category.toString() === categoryFilter ); } if (stockFilter) { switch (stockFilter) { case 'out': filtered = filtered.filter(prod => (parseInt(prod.units) || 0) === 0); break; case 'low': filtered = filtered.filter(prod => { const units = parseInt(prod.units) || 0; return units > 0 && units < 10; }); break; case 'in': filtered = filtered.filter(prod => (parseInt(prod.units) || 0) >= 10); break; default: break; } } setFilteredProducts(filtered); }, [nameFilter, categoryFilter, stockFilter, products]); return (