import { useState } from "react"; import { useParams, useNavigate, useLocation } from "react-router-dom"; import { useMutation } from "@tanstack/react-query"; import { Box, Card, CardContent, Typography, Button, ToggleButton, ToggleButtonGroup, Alert, CircularProgress, Chip, Divider, List, ListItem, ListItemIcon, ListItemText, Paper, } from "@mui/material"; import { CheckCircle as CheckIcon, ArrowBack as BackIcon, ShoppingCart as CartIcon, CalendarMonth as MonthlyIcon, CalendarToday as AnnualIcon, Warning as WarningIcon, } from "@mui/icons-material"; import { useModule, useModules } from "../contexts/ModuleContext"; import { SubscriptionType, formatPrice, getSubscriptionTypeName, } from "../types/module"; export default function ModulePurchasePage() { const { code } = useParams<{ code: string }>(); const navigate = useNavigate(); const location = useLocation(); const module = useModule(code || ""); const { enableModule, isModuleEnabled } = useModules(); const [subscriptionType, setSubscriptionType] = useState( SubscriptionType.Annual, ); const [autoRenew, setAutoRenew] = useState(true); // Mutation per attivare il modulo const enableMutation = useMutation({ mutationFn: async () => { if (!code) throw new Error("Codice modulo mancante"); return enableModule(code, { subscriptionType, autoRenew, }); }, onSuccess: () => { // Redirect alla pagina originale o alla home del modulo const from = (location.state as { from?: string })?.from; navigate(from || module?.routePath || "/"); }, }); // Se il modulo è già abilitato, redirect if (code && isModuleEnabled(code)) { navigate(module?.routePath || "/"); return null; } if (!module) { return ( Modulo non trovato Il modulo richiesto non esiste. ); } // Calcola il prezzo in base al tipo di subscription const price = subscriptionType === SubscriptionType.Monthly ? module.monthlyPrice : module.basePrice; const priceLabel = subscriptionType === SubscriptionType.Monthly ? "/mese" : "/anno"; // Calcola risparmio annuale const annualSavings = module.monthlyPrice * 12 - module.basePrice; const savingsPercent = Math.round( (annualSavings / (module.monthlyPrice * 12)) * 100, ); // Verifica dipendenze mancanti const missingDependencies = module.dependencies.filter( (dep) => !isModuleEnabled(dep), ); return ( {/* Header */} Attiva Modulo Scegli il piano di abbonamento per il modulo {module.name} {/* Alert dipendenze mancanti */} {missingDependencies.length > 0 && ( }> Questo modulo richiede i seguenti moduli che non sono attivi: {missingDependencies.map((dep) => ( navigate(`/modules/purchase/${dep}`)} /> ))} )} {/* Card principale */} {/* Info modulo */} {module.name} {module.description} {/* Selezione tipo abbonamento */} Tipo di abbonamento value && setSubscriptionType(value)} fullWidth sx={{ mb: 2 }} > Mensile {formatPrice(module.monthlyPrice)} /mese Annuale {formatPrice(module.basePrice)} /anno {savingsPercent > 0 && ( )} {/* Opzione auto-rinnovo */} setAutoRenew(!autoRenew)} size="small" > {autoRenew ? : null} Rinnovo automatico alla scadenza {/* Riepilogo */} Riepilogo ordine Modulo {module.name} {formatPrice(price)} Abbonamento{" "} {getSubscriptionTypeName(subscriptionType).toLowerCase()} {priceLabel} Totale {formatPrice(price)} {priceLabel} {/* Errore */} {enableMutation.isError && ( {(enableMutation.error as Error)?.message || "Errore durante l'attivazione del modulo"} )} {/* Pulsante attivazione */} {/* Note */} Potrai disattivare il modulo in qualsiasi momento dalle impostazioni. I dati inseriti rimarranno disponibili. {/* Funzionalità incluse */} Funzionalità incluse {getModuleFeatures(module.code).map((feature, index) => ( ))} ); } // Helper per ottenere le funzionalità di un modulo function getModuleFeatures(code: string): string[] { const features: Record = { warehouse: [ "Gestione anagrafica articoli", "Movimenti di magazzino (carico/scarico)", "Giacenze in tempo reale", "Valorizzazione scorte (FIFO, LIFO, medio ponderato)", "Inventario e rettifiche", "Report giacenze e movimenti", ], purchases: [ "Gestione ordini a fornitore", "DDT di entrata", "Fatture passive", "Scadenziario pagamenti", "Analisi acquisti per fornitore/articolo", "Storico prezzi di acquisto", ], sales: [ "Gestione ordini cliente", "DDT di uscita", "Fatturazione elettronica", "Scadenziario incassi", "Analisi vendite per cliente/articolo", "Listini prezzi", ], production: [ "Distinte base multilivello", "Cicli di lavoro", "Ordini di produzione", "Pianificazione MRP", "Avanzamento produzione", "Costi di produzione", ], quality: [ "Piani di controllo", "Registrazione controlli", "Gestione non conformità", "Azioni correttive/preventive", "Certificazioni e audit", "Statistiche qualità", ], }; return features[code] || ["Funzionalità complete del modulo"]; }