# Pub stock manager tool online

Pub Stock Calculator - Gestione Ordini Birra
    
    
    
        // Disabilita il preflight globale di Tailwind per evitare conflitti con WordPress
        tailwind.config = {
            corePlugins: { preflight: false },
            theme: {
                extend: {
                    colors: {
                        pub: {
                            dark: '#1e293b',
                            gold: '#f59e0b',
                            light: '#fef3c7'
                        }
                    }
                }
            }
        }
    
    
        /* Reset isolato solo per il tool */
        #pub-stock-app *, #pub-stock-app ::before, #pub-stock-app ::after {
            box-sizing: border-box;
            border-width: 0;
            border-style: solid;
            border-color: #e5e7eb;
        }
        #pub-stock-app h1, #pub-stock-app h2, #pub-stock-app h3, #pub-stock-app p, #pub-stock-app ul {
            margin: 0;
            padding: 0;
        }
        #pub-stock-app ul { list-style: none; }
        #pub-stock-app button { background-color: transparent; cursor: pointer; }
        #pub-stock-app input, #pub-stock-app select { margin: 0; font-family: inherit; }
        
        /* Stili Slider personalizzato */
        input[type=range] {
            -webkit-appearance: none;
            width: 100%;
            background: transparent;
        }
        input[type=range]::-webkit-slider-thumb {
            -webkit-appearance: none;
            height: 20px;
            width: 20px;
            border-radius: 50%;
            background: #f59e0b;
            cursor: pointer;
            margin-top: -8px;
            box-shadow: 0 1px 3px rgba(0,0,0,0.3);
        }
        input[type=range]::-webkit-slider-runnable-track {
            width: 100%;
            height: 6px;
            cursor: pointer;
            background: #cbd5e1;
            border-radius: 3px;
        }
        
        /* Animazione per i risultati */
        .pop-update {
            animation: pop 0.3s ease-out;
        }
        @keyframes pop {
            0% { transform: scale(0.95); opacity: 0.7; }
            50% { transform: scale(1.02); }
            100% { transform: scale(1); opacity: 1; }
        }

        /* Tooltip custom */
        .info-icon {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            width: 16px;
            height: 16px;
            border-radius: 50%;
            background-color: #e2e8f0;
            color: #64748b;
            font-size: 10px;
            font-weight: bold;
            margin-left: 6px;
            cursor: help;
            position: relative;
        }
        .info-icon:hover::after {
            content: attr(data-tooltip);
            position: absolute;
            bottom: 150%;
            left: 50%;
            transform: translateX(-50%);
            width: 200px;
            padding: 8px;
            background-color: #1e293b;
            color: white;
            border-radius: 6px;
            font-size: 12px;
            font-weight: normal;
            text-align: left;
            z-index: 10;
            box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1);
            pointer-events: none;
        }
    

    
    
    {
      "@context": "https://schema.org",
      "@type": "SoftwareApplication",
      "name": "Pub Stock Calculator - Gestione Inventario Birra",
      "url": "https://www.iltuosito.it/pub-stock-calculator",
      "description": "Strumento per pub e ristoranti per calcolare il fabbisogno di fusti e bottiglie di birra in base all'affluenza media, mix di vendita e frequenza ordini.",
      "applicationCategory": "BusinessApplication",
      "operatingSystem": "All",
      "browserRequirements": "Requires JavaScript",
      "offers": {
        "@type": "Offer",
        "price": "0",
        "priceCurrency": "EUR"
      },
      "featureList": [
        "Calcolo fusti necessari per periodo",
        "Calcolo casse bottiglie (33cl/50cl)",
        "Gestione mix vendita spina/bottiglia",
        "Integrazione scorta di sicurezza"
      ]
    }
    

    
    
    
        
            

            Pub Stock Manager
        
        

Calcola gli ordini perfetti per il tuo locale evitando rotture di stock o sprechi.
    

    
        
        
        
            
                📊 Parametri del Locale
            
            
            
                
                
                    
                        Clienti medi a settimana
                        ?
                    
                    
                

                
                
                    
                        Consumo medio (Litri/cliente)
                        ?
                    
                    
                        0.3 L - Basso (Locale misto/Food)
                        0.5 L - Medio (Una pinta a testa)
                        0.8 L - Alto (Pub specializzato)
                        1.2 L - Molto Alto (Birreria/Eventi)
                    
                
            

            
            
                
                    
                        Mix di Vendita
                        ?
                    
                    
                        70% Spina / 
                        30% Bottiglia
                    
                
                
            

            
            
                
                    Frequenza Ordini
                    
                        Settimanale (7 gg)
                        Bisettimanale (14 gg)
                        Mensile (30 gg)
                    
                

                
                    Scorta di Sicurezza
                    
                        0% (Nessun buffer)
                        +15% (Consigliato)
                        +30% (Alta Stagione/Eventi)
                    
                
            
            
            
            
                Formato medio fusti impianto
                
                    
                        
                        20 L
(Polykeg/Slim)
                    
                    
                        
                        24 L
(Monouso PET)
                    
                    
                        
                        30 L
(Fusto Acciaio)
                    
                
            
        

        
        
            
                
                
                
                    

                

                
                    🛒 Ordine Consigliato
                

                
                    
                    
                    
                        
                            
                                🛢️ Fusti (Spina)
                            
                            0 Litri
                        
                        
                            0
                            fusti da 24L
                        
                        

Distribuiscili sulle tue **linee spina** attive.
                    

                    
                    
                        
                            
                                🍾 Bottiglie/Lattine
                            
                            0 Litri
                        
                        
                            0
                            casse
                        
                        

Circa **0** unità (formato 33cl).
                    

                    
                    
                        
                            
                                

Volume Totale Ordine
                                

0 L
                            
                            
                                

Copertura
                                

7 Giorni
                            
                        
                    

                
            
        
    

    document.addEventListener("DOMContentLoaded", () => {
        // Seleziona elementi DOM
        const inputs = {
            customers: document.getElementById('inp-customers'),
            consumption: document.getElementById('inp-consumption'),
            draftRatio: document.getElementById('inp-draft-ratio'),
            delivery: document.getElementById('inp-delivery'),
            safety: document.getElementById('inp-safety'),
            kegSizes: document.querySelectorAll('input[name="keg-size"]')
        };

        const labels = {
            draft: document.getElementById('lbl-draft'),
            bottle: document.getElementById('lbl-bottle')
        };

        const outputs = {
            kegs: document.getElementById('out-kegs'),
            kegSizeLbl: document.getElementById('out-keg-size-lbl'),
            draftLiters: document.getElementById('out-draft-liters'),
            cases: document.getElementById('out-cases'),
            bottles: document.getElementById('out-bottles'),
            bottleLiters: document.getElementById('out-bottle-liters'),
            totalLiters: document.getElementById('out-total-liters'),
            coverage: document.getElementById('out-coverage'),
            
            // Container per l'animazione
            cardKegs: document.getElementById('card-kegs'),
            cardBottles: document.getElementById('card-bottles')
        };

        // Funzione per animare le card ai cambiamenti
        function triggerAnimation(element) {
            element.classList.remove('pop-update');
            void element.offsetWidth; // Trigger reflow per riavviare l'animazione CSS
            element.classList.add('pop-update');
        }

        // Algoritmo di calcolo
        function calculateStock() {
            // 1. Leggi i valori
            const customersPerWeek = parseFloat(inputs.customers.value) || 0;
            const litersPerCustomer = parseFloat(inputs.consumption.value);
            const draftPct = parseFloat(inputs.draftRatio.value);
            const bottlePct = 100 - draftPct;
            const deliveryDays = parseInt(inputs.delivery.value);
            const safetyMultiplier = parseFloat(inputs.safety.value);
            
            let kegSize = 24; // Default
            inputs.kegSizes.forEach(radio => { if(radio.checked) kegSize = parseInt(radio.value); });

            // 2. Aggiorna label slider
            labels.draft.textContent = `${draftPct}% Spina`;
            labels.bottle.textContent = `${bottlePct}% Bottiglia`;

            // 3. Calcoli Matematici
            // Litri necessari per il periodo base (senza scorta)
            const customersPerPeriod = (customersPerWeek / 7) * deliveryDays;
            const totalBaseLiters = customersPerPeriod * litersPerCustomer;
            
            // Suddivisione volumi base
            const baseDraftLiters = totalBaseLiters * (draftPct / 100);
            const baseBottleLiters = totalBaseLiters * (bottlePct / 100);

            // Applicazione Scorta di Sicurezza (buffer)
            const finalDraftLiters = baseDraftLiters * safetyMultiplier;
            const finalBottleLiters = baseBottleLiters * safetyMultiplier;
            const finalTotalLiters = finalDraftLiters + finalBottleLiters;

            // Conversioni in unità logisitiche (approssimate per eccesso)
            const numKegs = Math.ceil(finalDraftLiters / kegSize);
            
            // Per le bottiglie consideriamo casse da 24 unità di 33cl (0.33L)
            // Totale bottiglie necessarie
            const numBottles = Math.ceil(finalBottleLiters / 0.33);
            const numCases = Math.ceil(numBottles / 24);

            // 4. Stampa a schermo
            outputs.kegs.textContent = numKegs;
            outputs.kegSizeLbl.textContent = kegSize;
            outputs.draftLiters.textContent = `${Math.round(finalDraftLiters)} L`;
            
            outputs.cases.textContent = numCases;
            outputs.bottles.textContent = (numCases * 24); // Bottiglie totali basate sulle casse
            outputs.bottleLiters.textContent = `${Math.round(finalBottleLiters)} L`;
            
            outputs.totalLiters.textContent = `${Math.round(finalTotalLiters)} L`;
            outputs.coverage.textContent = `${deliveryDays} Giorni`;

            // Avvia animazione visiva (opzionale, per feeling interattivo)
            triggerAnimation(outputs.cardKegs);
            triggerAnimation(outputs.cardBottles);
        }

        // 5. Assegna Event Listeners a tutti gli input per un aggiornamento in "tempo reale"
        const allInputs = [inputs.customers, inputs.consumption, inputs.draftRatio, inputs.delivery, inputs.safety];
        allInputs.forEach(el => el.addEventListener('input', calculateStock));
        inputs.kegSizes.forEach(el => el.addEventListener('change', calculateStock));

        // Esegui il primo calcolo all'avvio
        calculateStock();
    });