+ {t('maintenance.no_history_description', 'Los registros de mantenimiento aparecerán aquí cuando se realicen operaciones')} +
+- El artículo {deletionResult.ingredient_name} ha sido eliminado permanentemente -
-{ingredient.name}
-- Categoría: {ingredient.category} • Stock actual: {ingredient.current_stock || 0} -
-⚠️ Esta acción eliminará permanentemente:
-- Esta acción NO se puede deshacer -
-ℹ️ Esta acción desactivará el artículo:
-{ingredient.name}
-- Categoría: {ingredient.category} • Stock actual: {ingredient.current_stock || 0} -
-- Elija el tipo de eliminación que desea realizar: -
- -- El artículo se marca como inactivo pero conserva todo su historial. - Ideal para artículos temporalmente fuera del catálogo. -
-- Elimina completamente el artículo y todos sus datos asociados. - Use solo para datos erróneos o pruebas. -
-Nota: La selección de etapas del proceso requiere un componente personalizado no implementado en esta versión simplificada.
-Las etapas actualmente se manejan mediante un campo de texto que debería ser reemplazado por un selector múltiple.
-- {selectedMode === 'hard' - ? t('recipes:delete.recipe_deleted', { name: recipe.name }) - : t('recipes:delete.recipe_archived', { name: recipe.name })} -
-{recipe.name}
-- {t('recipes:delete.recipe_code', 'Código')}: {recipe.recipe_code || 'N/A'} • {t('recipes:delete.recipe_category', 'Categoría')}: {recipe.category} -
-- {t('recipes:delete.checking_dependencies', 'Verificando dependencias...')} -
-- {t('recipes:delete.cannot_delete', '⚠️ No se puede eliminar esta receta')} -
-- {t('recipes:delete.hard_warning_title', '⚠️ Esta acción eliminará permanentemente:')} -
-- {t('recipes:delete.irreversible', 'Esta acción NO se puede deshacer')} -
-- {t('recipes:delete.soft_info_title', 'ℹ️ Esta acción archivará la receta:')} -
-{recipe.name}
-- {t('recipes:delete.recipe_code', 'Código')}: {recipe.recipe_code || 'N/A'} • {t('recipes:delete.recipe_category', 'Categoría')}: {recipe.category} -
-- {t('recipes:delete.choose_type', 'Elija el tipo de eliminación que desea realizar:')} -
- -- {t('recipes:delete.soft_explanation', 'La receta se marca como archivada pero conserva todo su historial. Ideal para recetas fuera de uso temporal.')} -
-- {t('recipes:delete.hard_explanation', 'Elimina completamente la receta y todos sus datos asociados. Use solo para datos erróneos o pruebas.')} -
-- {t('suppliers:delete.supplier_deleted', { name: deletionResult.supplier_name })} -
-{supplier.name}
-- {t('suppliers:delete.supplier_code', 'Código')}: {supplier.supplier_code || 'N/A'} • {t('suppliers:delete.supplier_type', 'Tipo')}: {supplier.supplier_type} -
-- {t('suppliers:delete.hard_warning_title', '⚠️ Esta acción eliminará permanentemente:')} -
-- {t('suppliers:delete.irreversible', 'Esta acción NO se puede deshacer')} -
-- {t('suppliers:delete.soft_info_title', 'ℹ️ Esta acción desactivará el proveedor:')} -
-{supplier.name}
-- {t('suppliers:delete.supplier_code', 'Código')}: {supplier.supplier_code || 'N/A'} • {t('suppliers:delete.supplier_type', 'Tipo')}: {supplier.supplier_type} -
-- {t('suppliers:delete.choose_type', 'Elija el tipo de eliminación que desea realizar:')} -
- -- {t('suppliers:delete.soft_explanation', 'El proveedor se marca como inactivo pero conserva todo su historial. Ideal para proveedores temporalmente fuera del catálogo.')} -
-- {t('suppliers:delete.hard_explanation', 'Elimina completamente el proveedor y todos sus datos asociados. Use solo para datos erróneos o pruebas.')} -
-+ Agregue precios para los productos que suministra este proveedor +
+ {onAddPrice && ( + + )} ++ {entityDisplay.primaryText} ha sido eliminado +
++ {getSuccessMessage?.(entity, selectedMode) || `${entityDisplay.primaryText} procesado correctamente`} +
+{entityDisplay.primaryText}
+ {entityDisplay.secondaryText && ( ++ {entityDisplay.secondaryText} +
+ )} ++ Verificando dependencias... +
++ ⚠️ No se puede eliminar este elemento +
+{warning.title}
++ {warning.footer} +
+ )} +{entityDisplay.primaryText}
+ {entityDisplay.secondaryText && ( ++ {entityDisplay.secondaryText} +
+ )} ++ Elija el tipo de eliminación que desea realizar: +
+ ++ {softDeleteOption.description} +
++ {hardDeleteOption.description} +
++ {t('sustainability:insufficient_data.description', + 'Start producing batches to see your sustainability metrics and SDG compliance status.' + )} +
+{t('sustainability:sections.waste_subtitle', 'Desglose de residuos por tipo')}
@@ -254,14 +318,9 @@ const SustainabilityPage: React.FC = () => {{t('sustainability:sections.environmental_subtitle', 'Métricas de huella ambiental')}
@@ -334,14 +393,9 @@ const SustainabilityPage: React.FC = () => {{t('sustainability:sections.sdg_subtitle', 'Progreso hacia objetivo ONU')}
@@ -413,14 +467,9 @@ const SustainabilityPage: React.FC = () => {{t('sustainability:sections.grant_subtitle', 'Programas de financiación elegibles')}
@@ -508,14 +557,9 @@ const SustainabilityPage: React.FC = () => {{t('sustainability:sections.financial_subtitle', 'Costes y ahorros de sostenibilidad')}
diff --git a/frontend/src/pages/app/operations/maquinaria/MaquinariaPage.tsx b/frontend/src/pages/app/operations/maquinaria/MaquinariaPage.tsx index 521e3dad..ac306f26 100644 --- a/frontend/src/pages/app/operations/maquinaria/MaquinariaPage.tsx +++ b/frontend/src/pages/app/operations/maquinaria/MaquinariaPage.tsx @@ -8,19 +8,26 @@ import { PageHeader } from '../../../../components/layout'; import { useCurrentTenant } from '../../../../stores/tenant.store'; import { Equipment } from '../../../../api/types/equipment'; import { EquipmentModal } from '../../../../components/domain/equipment/EquipmentModal'; -import { useEquipment, useCreateEquipment, useUpdateEquipment } from '../../../../api/hooks/equipment'; +import { DeleteEquipmentModal } from '../../../../components/domain/equipment/DeleteEquipmentModal'; +import { MaintenanceHistoryModal } from '../../../../components/domain/equipment/MaintenanceHistoryModal'; +import { ScheduleMaintenanceModal, type MaintenanceScheduleData } from '../../../../components/domain/equipment/ScheduleMaintenanceModal'; +import { useEquipment, useCreateEquipment, useUpdateEquipment, useDeleteEquipment, useHardDeleteEquipment } from '../../../../api/hooks/equipment'; const MaquinariaPage: React.FC = () => { const { t } = useTranslation(['equipment', 'common']); const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState(''); const [typeFilter, setTypeFilter] = useState(''); - const [selectedItem, setSelectedItem] = useState- {selectedItem.model} - {selectedItem.serialNumber} -
-{t('maintenance.last')}
-- {new Date(selectedItem.lastMaintenance).toLocaleDateString('es-ES')} -
-{t('maintenance.next')}
-- {new Date(selectedItem.nextMaintenance).toLocaleDateString('es-ES')} -
-{t('maintenance.interval')}
-- {selectedItem.maintenanceInterval} {t('common:units.days')} -
-- {new Date(history.date).toLocaleDateString('es-ES')} - {history.technician} -
-- Selecciona un tenant para ver los datos de procurement -
-- El sistema de IA genera automáticamente planes de compras basados en: -
-- Los planes aprobados se convierten automáticamente en órdenes de compra. -
-- Intenta ajustar la búsqueda o generar un nuevo plan de compra -
- -- {showArchived - ? 'No hay órdenes de compra que coincidan con los filtros' - : 'Crea una orden de compra manual o cambia al modo IA para generar planes automáticos'} -
- -- Plan {filteredPlans.find(p => p.id === selectedPlanForRequirements)?.plan_number || selectedPlanForRequirements} -
-- Este plan no tiene requerimientos críticos en este momento -
-- Configura los parámetros para generar un nuevo plan -
-- Fecha para la cual se generará el plan de compras -
-- Número de días a considerar en la planificación (1-365) -
-- Porcentaje adicional para stock de seguridad (0-100%) -
-- Si ya existe un plan para esta fecha, regenerarlo (esto eliminará el plan existente) -
-- {selectedRequirement.product_name} -
-{selectedRequirement.product_name}
-{selectedRequirement.product_sku || 'N/A'}
-{selectedRequirement.product_category || 'N/A'}
-{selectedRequirement.product_type}
-{selectedRequirement.required_quantity} {selectedRequirement.unit_of_measure}
-{selectedRequirement.safety_stock_quantity} {selectedRequirement.unit_of_measure}
-{selectedRequirement.current_stock_level} {selectedRequirement.unit_of_measure}
-{selectedRequirement.net_requirement} {selectedRequirement.unit_of_measure}
-€{selectedRequirement.estimated_unit_cost || 'N/A'}
-€{selectedRequirement.estimated_total_cost || 'N/A'}
-€{selectedRequirement.last_purchase_cost}
-{selectedRequirement.required_by_date}
-{selectedRequirement.suggested_order_date}
-{selectedRequirement.latest_order_date}
-{selectedRequirement.supplier_name}
-{selectedRequirement.supplier_lead_time_days} días
-- {selectedRequirement.special_requirements} -
-- {isAIMode ? - `Plan ${planForApproval?.plan_number}` : - `PO ${poForApproval?.po_number}`} -
-- {requirementForDelivery.product_name} -
-- Ordenado: {requirementForDelivery.ordered_quantity || requirementForDelivery.net_requirement} {requirementForDelivery.unit_of_measure} -
-- ¿Estás seguro de que quieres cambiar tu plan de suscripción? -
- {availablePlans.plans[selectedPlan] && usageSummary && ( -¿Estás seguro de que quieres cambiar tu plan de suscripción?
+ {availablePlans.plans[selectedPlan as keyof typeof availablePlans.plans] && usageSummary && ( +- ¿Estás seguro de que deseas cancelar tu suscripción? Esta acción no se puede deshacer. -
-- Perderás acceso a las funcionalidades premium al final del período de facturación actual. -
- -¿Estás seguro de que deseas cancelar tu suscripción? Esta acción no se puede deshacer.
+Perderás acceso a las funcionalidades premium al final del período de facturación actual.