import React, { useEffect, useState } from 'react';
import DateRangeFilter from '../../components/Filters/DateRangeFilter';
import SummaryCard from '../../components/SummaryCard';
import '../../components/Filters/Filters.css';
import './Rejected.css';
import Table from '../../components/Table/HotelTable';
import axios from 'axios';
import { Link } from 'react-router-dom';
import { useContext } from 'react';
import { langContext } from '../../context/LenguageContext';
//**////** */ */ APROBADOS Y RECHAZADOS
export default function Rejected() {
const { lang } = useContext(langContext);
const [rejectedExpenses, setRejectedExpenses] = useState([]);
const [filteredExpenses, setFilteredExpenses] = useState([]);
const [dateRange, setDateRange] = useState({ from: '', to: '' });
const [totalRejected, setTotalRejected] = useState(0);
const [mainSupplier, setMainSupplier] = useState('N/A');
const [descriptionFilter, setDescriptionFilter] = useState('');
const [areaFilter, setAreaFilter] = useState('');
//Obtener lista de gastos rechazados
useEffect(() => {
axios.get(import.meta.env.VITE_API_BASE_URL + '/expenses/rejectedexpenses')
.then((res) => {
const formatted = res.data.data.map((item, index) => ({
id: index + 1,
description: item.expense_description,
requestDate: new Date(item.request_date).toISOString().split('T')[0],
rejectedDate: new Date(item.reject_date).toISOString().split('T')[0],
area: item.area,
requestedBy: item.requested_by,
amount: parseFloat(item.amount),
supplier: 'N/A'
}));
setRejectedExpenses(formatted);
setFilteredExpenses(formatted);
})
.catch((err) => {
console.error('❌ Error fetching rejected expenses:', err.message);
});
}, []);
//Obtener Total Rejected usando método GET correcto
useEffect(() => {
axios.post(import.meta.env.VITE_API_BASE_URL + '/expenses/totalapproved', { option: 2 })
.then((res) => {
const total = parseFloat(res.data.data);
setTotalRejected(isNaN(total) ? 0 : total);
})
.catch((err) => {
if (err.response) {
console.error(`❌ Error ${err.response.status}: ${err.response.data.message}`);
} else {
console.error('❌ Error fetching total rejected amount:', err.message);
}
});
}, []);
//Obtener proveedor principal
useEffect(() => {
axios.get(import.meta.env.VITE_API_BASE_URL + '/expenses/mainsupplier')
.then((res) => {
if (res.data.data.length > 0) {
setMainSupplier(res.data.data[0].supplier);
}
})
.catch((err) => {
if (err.response) {
console.error(`❌ Error ${err.response.status}: ${err.response.data.message}`);
} else {
console.error('❌ Error fetching main supplier:', err.message);
}
});
}, []);
useEffect(() => {
let filtered = [...rejectedExpenses];
if (dateRange.from && dateRange.to) {
const from = new Date(dateRange.from);
const to = new Date(dateRange.to);
filtered = filtered.filter((item) => {
const itemDate = new Date(item.rejectedDate);
return itemDate >= from && itemDate <= to;
});
}
if (descriptionFilter) {
filtered = filtered.filter((item) =>
item.description?.toLowerCase().includes(descriptionFilter.toLowerCase())
);
}
if (areaFilter) {
filtered = filtered.filter((item) => item.area === areaFilter);
}
setFilteredExpenses(filtered);
}, [dateRange, rejectedExpenses, descriptionFilter, areaFilter]);
//Columnas de tabla
const columns = [
{
header: lang === "en" ? "EXPENSE DESCRIPTION" : "DESCRIPCIÓN DEL GASTO",
key: 'description',
render: (text, row) => (
{text}
),
},
{ header: lang === "en" ? "REQUEST DATE" : "FECHA DE SOLICITUD", key: 'requestDate' },
{ header: lang === "en" ? "REJECTED DATE" : "FECHA DE RECHAZO", key: 'rejectedDate' },
{ header: lang === "en" ? "AREA" : "ÁREA", key: 'area' },
{ header: lang === "en" ? "REQUESTED BY" : "SOLICITADO POR", key: 'requestedBy' },
{
header: lang === "en" ? "AMOUNT" : "IMPORTE",
key: 'amount',
render: (amount) => `$${amount.toLocaleString()}`
},
{
header: lang === "en" ? "STATUS" : "ESTADO",
key: 'id',
headerStyle: { textAlign: 'center' },
render: () => (
),
},
];
const uniqueAreas = [...new Set(rejectedExpenses.map(item => item.area).filter(Boolean))].sort();
const clearFilters = () => {
setDateRange({ from: '', to: '' });
setDescriptionFilter('');
setAreaFilter('');
};
return (
{lang === "en" ? "Rejected Expenses" : "Gastos Rechazados"}
setDescriptionFilter(e.target.value)}
className="filter-search"
/>
{lang === "en" ? "Main Supplier" : "Proveedor Principal"}
{mainSupplier}
);
}
// import React, { useEffect, useState } from 'react';
// import '../../components/Filters/Filters.css';
// import Table from '../../components/Table/HotelTable';
// import axios from 'axios';
// export default function Rejected() {
// const [rejectedExpenses, setRejectedExpenses] = useState([]);
// const [filteredExpenses, setFilteredExpenses] = useState([]);
// const [dateRange, setDateRange] = useState({ from: '', to: '' });
// const [totalRejected, setTotalRejected] = useState(0);
// const [mainSupplier, setMainSupplier] = useState('N/A');
// // ✅ Cargar lista de gastos rechazados
// useEffect(() => {
// axios.get(import.meta.env.VITE_API_BASE_URL + '/expenses/rejectedexpenses')
// .then((res) => {
// const formatted = res.data.data.map((item, index) => ({
// id: index + 1,
// description: item.expense_description,
// requestDate: new Date(item.request_date).toISOString().split('T')[0],
// rejectedDate: new Date(item.reject_date).toISOString().split('T')[0],
// area: item.area,
// requestedBy: item.requested_by,
// amount: parseFloat(item.amount),
// supplier: 'N/A'
// }));
// setRejectedExpenses(formatted);
// setFilteredExpenses(formatted);
// })
// .catch((err) => {
// console.error('Error fetching rejected expenses:', err);
// });
// }, []);
// // ✅ CORREGIDO: Método GET con parámetro en URL
// useEffect(() => {
// axios.get(import.meta.env.VITE_API_BASE_URL + '/expenses/totalapproved/2')
// .then((res) => {
// setTotalRejected(parseFloat(res.data.data));
// })
// .catch((err) => {
// console.error('Error fetching total rejected amount:', err);
// });
// }, []);
// // ✅ Obtener Main Supplier
// useEffect(() => {
// axios.get(import.meta.env.VITE_API_BASE_URL + '/expenses/mainsupplier')
// .then((res) => {
// if (res.data.data.length > 0) {
// setMainSupplier(res.data.data[0].supplier); // "Costco"
// }
// })
// .catch((err) => {
// console.error('Error fetching main supplier:', err);
// });
// }, []);
// // ✅ Filtrar por fechas
// useEffect(() => {
// if (dateRange.from && dateRange.to) {
// const from = new Date(dateRange.from);
// const to = new Date(dateRange.to);
// const filtered = rejectedExpenses.filter((item) => {
// const itemDate = new Date(item.rejectedDate);
// return itemDate >= from && itemDate <= to;
// });
// setFilteredExpenses(filtered);
// } else {
// setFilteredExpenses(rejectedExpenses);
// }
// }, [dateRange, rejectedExpenses]);
// const columns = [
// {
// header: 'EXPENSE DESCRIPTION',
// key: 'description',
// render: (text) => {text},
// },
// { header: 'REQUEST DATE', key: 'requestDate' },
// { header: 'REJECTED DATE', key: 'rejectedDate' },
// { header: 'AREA', key: 'area' },
// { header: 'REQUESTED BY', key: 'requestedBy' },
// {
// header: 'AMOUNT',
// key: 'amount',
// render: (amount) => `$${amount.toLocaleString()}`
// },
// {
// header: 'STATUS',
// key: 'id',
// render: () => (
//
// ),
// },
// ];
// return (
//
//
REJECTED
// {/* Filtros de fecha */}
//
// setDateRange({ ...dateRange, from: e.target.value })}
// />
// setDateRange({ ...dateRange, to: e.target.value })}
// />
//
// {/* Summary Cards */}
//
//
//
Total Rejected
//
${totalRejected.toLocaleString()}
//
//
//
Main Supplier
//
{mainSupplier}
//
//
// {/* Tabla */}
//
//
// );
// }
// import React, { useEffect, useState } from 'react';
// import '../../components/Filters/Filters.css';
// import Table from '../../components/Table/HotelTable';
// import axios from 'axios';
// export default function Rejected() {
// const [rejectedExpenses, setRejectedExpenses] = useState([]);
// const [filteredExpenses, setFilteredExpenses] = useState([]);
// const [dateRange, setDateRange] = useState({ from: '', to: '' });
// //Obtener datos reales desde el backend
// useEffect(() => {
// axios.get(import.meta.env.VITE_API_BASE_URL + '/expenses/rejectedexpenses')
// .then((res) => {
// const formatted = res.data.data.map((item, index) => ({
// id: index + 1, // temporal, ya que no viene `id_expense`
// description: item.expense_description,
// requestDate: new Date(item.request_date).toISOString().split('T')[0],
// rejectedDate: new Date(item.reject_date).toISOString().split('T')[0],
// area: item.area,
// requestedBy: item.requested_by,
// amount: parseFloat(item.amount),
// supplier: 'N/A' // ❗ backend no envía proveedor
// }));
// setRejectedExpenses(formatted);
// setFilteredExpenses(formatted);
// })
// .catch((err) => {
// console.error('Error fetching rejected expenses:', err);
// });
// }, []);
// //Filtrar por fechas
// useEffect(() => {
// if (dateRange.from && dateRange.to) {
// const from = new Date(dateRange.from);
// const to = new Date(dateRange.to);
// const filtered = rejectedExpenses.filter((item) => {
// const itemDate = new Date(item.rejectedDate);
// return itemDate >= from && itemDate <= to;
// });
// setFilteredExpenses(filtered);
// } else {
// setFilteredExpenses(rejectedExpenses);
// }
// }, [dateRange, rejectedExpenses]);
// //Columnas de la tabla
// const columns = [
// {
// header: 'EXPENSE DESCRIPTION',
// key: 'description',
// render: (text) => {text}, // ❌ sin enlace por falta de ID
// },
// { header: 'REQUEST DATE', key: 'requestDate' },
// { header: 'REJECTED DATE', key: 'rejectedDate' },
// { header: 'AREA', key: 'area' },
// { header: 'REQUESTED BY', key: 'requestedBy' },
// {
// header: 'AMOUNT',
// key: 'amount',
// render: (amount) => `$${amount.toLocaleString()}`
// },
// {
// header: 'STATUS',
// key: 'id',
// render: () => (
//
// ),
// },
// ];
// //Cálculo de total rechazado
// const totalAmount = filteredExpenses.reduce((sum, item) => sum + item.amount, 0);
// //Proveedor principal (no aplica)
// const mainSupplier = 'N/A';
// return (
//
//
REJECTED
// {/* Filtros de fecha */}
//
// setDateRange({ ...dateRange, from: e.target.value })}
// />
// setDateRange({ ...dateRange, to: e.target.value })}
// />
//
// {/* Summary Cards */}
//
//
//
Total Rejected
//
${totalAmount.toLocaleString()}
//
//
//
Main Supplier
//
{mainSupplier}
//
//
// {/* Tabla */}
//
//
// );
// }