/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package puntocassa;

import java.awt.*;
import java.awt.event.*;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import java.sql.*;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import jssc.SerialPort;
import jssc.SerialPortException;
import org.apache.log4j.LogManager;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import puntocassa.utils.Utils;


//******************************************************************************
// *
// * @author Master
// *
//******************************************************************************
public class PuntoCassa extends JFrame implements ActionListener {

    // ==========================================================================
    // *** Variabili globali relative alle connessioni
    // ==========================================================================
    public static String versione = "2.4";
    public static String dbStringa = "";
    private String dbTipo = "";
    private String dbDriver = "";
    public static String dbUsername = "";
    public static String dbPassword = "";
    private String utenteLoggato = "";
    private String imgPath = "";// "L:\\Lavoro\\Goffredo\\risorse\\";
    private int displayWidth = 1024;
    private int displayHeight = 768;
    private Long progressivo = 0L;
    private Long progressivoTurno = 0L;
    private Long progressivoGiorno = 0L;
    private Double progressivoScalare = 0.0;
    private Double progressivoContanti = 0.0;
    private Double progressivoTicket = 0.0;
    private Double progressivoDifferito = 0.0;
    private Double saldoMinimoStop = 0.0;
    private Long idTurno = 0L;
    private String nomeTurno = "";
    private Long idTurnoAttuale = 0L;
    private String nomeTurnoAttuale = "";

    private int colImporto = 1;
    private int colPunti = 2;
    private int colIDProdotto = 3;
    private int colImporto2 = 4;
    private int colCategoria = 5;
    public Long idPuntoCassa = 0L;
    private Boolean consentiCredito = false;
    private Long idProfiloTariffario = 0L;
    private Long idProfiloTariffarioDefault = 0L;
    public static Long idModoPagamento = 0L;
    public static String modoPagamentoDefault = "A scalare";
    public static Integer flagBonus = 0;
    private Long idTessera = 0L;
    private Long idPrenotazione = 0L;
    private Boolean isCassaAperta = false;
    private Long idAccount = 0L;
    Timer timerCard;
    private int numeroCategorie = 0;
    private Boolean statoCardLettore = false;
    StringBuilder testoSwipCard = new StringBuilder();
    StringBuilder testoRFIDCard = new StringBuilder();
    StringBuilder logTestoTessera = new StringBuilder();
    String logNumeroTessera = "", logIDTessera = "", logTesseraErrore = "";
    private Boolean flagImpostaTipoPagamento = false;
    private Boolean menuGiornoPresente = false, messaggioSaldoUnaVolta = false;
    private Boolean flagMostraDataDiNascita = true;
    private Boolean stoCalcolando = false;
    private Boolean flagEsegueStorni = true;

    enum StatiCarta {
        ASSENTE, INSERITA, RIMOSSA
    }

    public StatiCarta statoCarta;
    public Boolean cartaLetta = false;
    public static KeyEventDispatcher keyDispatcher;
    public int hFont = 15;
    private int altControlli = 100;
    private int largControlli = 100;
    public FrmProgress myProgressForm;
    public FrmMeteo myMeteoForm;
    private int gratuitaResidue = 0;
    private int bonusResidui = 0;
    private StringBuilder modiPagamento = new StringBuilder("");
    private static Boolean keyDespatcherAttivo = false;
    public Boolean passaggioTessera = false;
    private Boolean passaggiEsauritiNoComposizione = false;
    private static Boolean visualizzaMessaggiDisplay = true;
    private static String messageDisplay = "";
    public static Boolean flagExtra = false;
    public static Boolean flagRicevuta = false;
    Timer timerDisplay = new Timer();
    private static Integer delaySwipCard = 100;
    private static Boolean bottoneImposta = true;
    private static Boolean asporto = false;
    private static Boolean flagPrecaricaLista = false;
    
    
    // ==========================================================================
    // *** Constructor della classe PuntoCassa
    // ==========================================================================
    public PuntoCassa() {

        // -----------------------------------------------------------------------
        // *** Esegue le impostazioni di base
        // -----------------------------------------------------------------------
        initComponents();

        // -----------------------------------------------------------------------
        // *** Legge la configurazione dal file XML 
        // -----------------------------------------------------------------------
        try {
            DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = documentFactory.newDocumentBuilder();
            String startDir = System.getProperty("user.dir");
            Document document = builder.parse(new File(startDir + "/risorse/puntocassa.xml"));

            File iconaApp = new File(startDir + "/risorse/logo.png");
            if (iconaApp.exists()) {

                ImageIcon icon = new ImageIcon(startDir + "/risorse/logo.png");
                this.setIconImage(icon.getImage());
            }
            // --------------------------------------------------------------------
            // ** Accesso al database
            // --------------------------------------------------------------------
            NodeList database = document.getElementsByTagName("database");
            for (int i = 0; i < database.getLength(); i++) {
                Node nodo = database.item(i);

                if (nodo.getNodeType() == Node.ELEMENT_NODE) {
                    Element db = (Element) nodo;
                    String attivo = db.getElementsByTagName("attivo").item(0).getFirstChild().getNodeValue();
                    String tipo = db.getElementsByTagName("tipo").item(0).getFirstChild().getNodeValue();
                    String driver = db.getElementsByTagName("driver").item(0).getFirstChild().getNodeValue();
                    String server = db.getElementsByTagName("server").item(0).getFirstChild().getNodeValue();
                    String porta = db.getElementsByTagName("porta").item(0).getFirstChild().getNodeValue();
                    String istanza = db.getElementsByTagName("istanza").item(0).getFirstChild().getNodeValue();
                    String username = db.getElementsByTagName("username").item(0).getFirstChild().getNodeValue();
                    String password = db.getElementsByTagName("password").item(0).getFirstChild().getNodeValue();

                    if (attivo.equals("SI")) {
                        //Encoding en = new Encoding();
                        dbUsername = username;
                        dbPassword = Encoding.decodeString(password);
                        dbTipo = tipo;
                        dbDriver = driver;
                        if (tipo.equals("MySQL")) {
                            dbStringa = "jdbc:mysql://" + server + ":" + porta + "/" + istanza;
                        } else if (tipo.equals("Oracle")) {
                            dbStringa = "jdbc:oracle:thin:@" + server + ":" + porta + ":" + istanza;
                        }
                    }
                }
            }

            // --------------------------------------------------------------------
            // ** Path
            // --------------------------------------------------------------------
            NodeList paths = document.getElementsByTagName("path");
            for (int i = 0; i < paths.getLength(); i++) {
                Node path = paths.item(i);
                if (path.getNodeType() == Node.ELEMENT_NODE) {
                    Element p = (Element) path;
                    imgPath = p.getElementsByTagName("img_path").item(0).getFirstChild().getNodeValue();
                    if (imgPath.equalsIgnoreCase("..\\risorse\\")) {
                        imgPath = startDir + "/risorse/";
                    }
                }
            }

            // --------------------------------------------------------------------
            // ** Etichette
            // --------------------------------------------------------------------
            NodeList etichette = document.getElementsByTagName("etichette");
            //String titolo = "";
            MyApplication myApp = new MyApplication();
            for (int i = 0; i < paths.getLength(); i++) {
                Node etichetta = etichette.item(i);
                if (etichetta.getNodeType() == Node.ELEMENT_NODE) {
                    Element p = (Element) etichetta;
                    String titolo = p.getElementsByTagName("titolo").item(0).getFirstChild().getNodeValue();
                    //idPuntoCassa = Long.valueOf(myApp.mySelect(this, "SELECT valore FROM parametri WHERE chiave = 'IdPuntoCassa'", "valore"));
                    idPuntoCassa = Long.valueOf(Utils.mySelect("SELECT valore FROM parametri WHERE chiave = 'IdPuntoCassa'", 
                            "valore",
                            this));

                    //String credito = myApp.mySelect(this, "SELECT valore FROM parametri WHERE chiave = 'FlagIgnoraSaldoStop'", "valore");
                    String credito = Utils.mySelect("SELECT valore FROM parametri WHERE chiave = 'FlagIgnoraSaldoStop'", 
                            "valore",
                            this);
                    if (credito.equalsIgnoreCase("SI")) {
                        consentiCredito = true;
                    }

                    titolo = titolo + " " + idPuntoCassa;
                    this.setTitle(titolo);
                    //Aggiornamento 14-01-2019                    
                    //String stringDatiPagamento = myApp.mySelect(this, "select tp.id || '|' || tp.nome || '|' || pd.flag_bonus  || '|' || "
                    String stringDatiPagamento = Utils.mySelect("select tp.id || '|' || tp.nome || '|' || pd.flag_bonus  || '|' || "
                            + "pd.flag_extra as valore from punti_cassa pc "
                            + "inner join punti_distribuzione pd on pc.id_punto_distribuzione = pd.id "
                            + "inner join tipi_pagamenti tp on pd.id_tipo_paga_default = tp.id "
                            + "where pc.id=" + idPuntoCassa, 
                            "valore",
                            this);

                    String[] arrayDatiPagamento = stringDatiPagamento.split("\\|", -1);
                    if (arrayDatiPagamento.length >= 2) {
                        idModoPagamento = Long.valueOf(arrayDatiPagamento[0]);
                        modoPagamentoDefault = arrayDatiPagamento[1];
                        lblTipoPagamento.setText(arrayDatiPagamento[1]);
                        //Aggiornamento 14-01-2019
                        flagBonus = Integer.valueOf(arrayDatiPagamento[2]);
                        flagExtra = false;
                        if (arrayDatiPagamento[3].equalsIgnoreCase("1")) {
                            flagExtra = true;
                        }
                        pulsantiModoPagamento();
                    }
                }
            }

            // --------------------------------------------------------------------
            // ** display
            // --------------------------------------------------------------------
            NodeList disp = document.getElementsByTagName("display");
            for (int i = 0; i < disp.getLength(); i++) {
                Node display = disp.item(i);
                if (display.getNodeType() == Node.ELEMENT_NODE) {
                    Element p = (Element) display;
                    displayWidth = Integer.parseInt(p.getElementsByTagName("larghezza").item(0).getFirstChild().getNodeValue());
                    displayHeight = Integer.parseInt(p.getElementsByTagName("altezza").item(0).getFirstChild().getNodeValue());
                    hFont = Integer.parseInt(p.getElementsByTagName("fontSize").item(0).getFirstChild().getNodeValue());
                    altControlli = Integer.parseInt(p.getElementsByTagName("altezzaControlli").item(0).getFirstChild().getNodeValue());
                    largControlli = Integer.parseInt(p.getElementsByTagName("larghezzaControlli").item(0).getFirstChild().getNodeValue());
                    String tastiera = p.getElementsByTagName("TastieraVideo").item(0).getFirstChild().getNodeValue();
                    myApp.tastieraVideo = !tastiera.equals("NO");

                }
            }

            //adatto panel login
            Font f = new Font("Tahoma", 0, hFont);
            UIManager.put("OptionPane.messageFont",
                    new FontUIResource(new Font("Tahoma", Font.BOLD, hFont))
            );
            UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("Tahoma", Font.BOLD, 25)));
            btnLogin.setFont(f);
            pnlLogin.setSize(calcolaLarghezzaAltezza(pnlLogin.getWidth(), largControlli), calcolaLarghezzaAltezza(pnlLogin.getHeight(), altControlli));
            lblPassword.setFont(f);
            lblUsername.setFont(f);
            txtUsername.setFont(f);
            txtPassword.setFont(f);
            jTxtTessera.setFont(f);
            jChLogin.setFont(f);
            jBtnReadCard.setVisible(false);
            // --------------------------------------------------------------------
            // ** ID_PUNTO_CASSA
            // --------------------------------------------------------------------
            jcmbSC.setVisible(false);

            String VMD = document.getElementsByTagName("Visualizza_Messaggi_Display").item(0).getFirstChild().getNodeValue();
            visualizzaMessaggiDisplay = VMD.equalsIgnoreCase("SI");
            messageDisplay = document.getElementsByTagName("Messaggio_Display").item(0).getFirstChild().getNodeValue();

            updateReaderCombo();

            //String ultimiMovimenti = myApp.mySelect(this, "SELECT valore FROM parametri WHERE chiave = 'FlagVisualizzaUltimiPassaggi'", "valore");
            String ultimiMovimenti = Utils.mySelect("SELECT valore FROM parametri WHERE chiave = 'FlagVisualizzaUltimiPassaggi'", 
                    "valore",
                    this);
            if (ultimiMovimenti.equalsIgnoreCase("NO")) {
                jBtnMovimenti.setEnabled(false);
            }

            timerCard = new java.util.Timer();
            timerCard.schedule(new CardTask(this), 0, 1 * 1000);

            statoAttivoNonLoggato();

            String flagRicevutaValue = Utils.mySelect("Select Valore from Parametri where Chiave='FlagRicevuta'", "Valore",this);
            PuntoCassa.flagRicevuta = !flagRicevutaValue.equalsIgnoreCase("NO");

            String flagDataNascita = Utils.mySelect("Select Valore from Parametri where Chiave='FlagMostraDataDiNascita'", "Valore", this);
            flagMostraDataDiNascita = !flagDataNascita.equalsIgnoreCase("NO");

            String flagEsegueStorniValue = Utils.mySelect("Select Valore from Parametri where Chiave='FlagEsegueStorni'", "Valore", this);
            this.flagEsegueStorni = !flagEsegueStorniValue.equalsIgnoreCase("NO");

            String timeoutSwipCard = Utils.mySelect("Select Valore from Parametri where Chiave='TimeoutSwipCard'", "Valore",this);
            //if (myApp.isNumeric(timeoutSwipCard)) {
            if (Utils.isNumeric(timeoutSwipCard)) {
                delaySwipCard = Integer.valueOf(timeoutSwipCard);
            }

            Utils.myInsert("UPDATE PARAMETRI set valore='NO' where chiave='FlagDownloadInCorso'", this);

            String flagDefaultAsporto = Utils.mySelect("Select Valore from Parametri where Chiave='FlagDefaultAsporto'", "Valore", this);
            if (flagDefaultAsporto.equalsIgnoreCase("SI")) {
                asporto = true;
            }

            String flagPrecarica = Utils.mySelect("Select Valore from Parametri where Chiave='FlagPrecaricaLista'", "Valore",  this);
            flagPrecaricaLista = !flagPrecarica.equalsIgnoreCase("NO");

            keyDispatcher = creaKeyEventDispatcher();

            KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(keyDispatcher);
            keyDespatcherAttivo = true;

            verificaDB();

        } catch (Exception e) {
            e.printStackTrace();

        }

        // -----------------------------------------------------------------------
        // *** Aggiunge un timer con relativa schedulazione a 5 secondi
        // -----------------------------------------------------------------------
        timerDBConn mt = new timerDBConn(this);
        java.util.Timer timer = new java.util.Timer();
        timer.schedule(mt, 0, 5000);

        verificaAggiornamentiJAR();

    }
    
    public KeyEventDispatcher creaKeyEventDispatcher(){
        return new KeyEventDispatcher() {
                Boolean swip = false;
                Boolean spiaAltreCarte = false;
                Boolean timerUnaVolta = false;
                MyApplication myApp = new MyApplication();

                public boolean dispatchKeyEvent(KeyEvent e) {
                    int id = e.getID();

                    if (jbtnChiudi.isEnabled() && pnlLogin.isVisible() == false && jTxtTessera.getText().length() > 0) {
                        e.consume();
                        if (myApp.unaVolta == false) {
                            myApp.unaVolta = true;
                        }
                        return false;
                    }
                    myApp.unaVolta = false;
                    int keyCode = e.getKeyCode();
                    if (id == KeyEvent.KEY_RELEASED) {
                        String tasto = "" + e.getKeyChar();
                        System.out.println(keyCode + " - " + tasto);

                        logTestoTessera.append(e.getKeyChar());

                        if (tasto.equalsIgnoreCase("ò")) { //144
                            swip = true;
                        }
                        //05-12-2017
                        if (keyCode == 16 || keyCode == 45 || tasto.equalsIgnoreCase("ò")) {
                            spiaAltreCarte = true;
                        }

                        if (tasto.equalsIgnoreCase("ò") == false && keyCode != 16 && keyCode != 45 && swip) { //keyCode != 144 && keyCode != 17

                            testoSwipCard.append(tasto);
                            System.out.println(testoSwipCard.toString());

                        }
                        if (keyCode == 45 && swip) { //keyCode != 144 
                            swip = false;
                            System.out.println(testoSwipCard.toString());

                            warn();
                        }

                        //30-11-2017 modifica per rfid
                        if (keyCode != 16) {
                            testoRFIDCard.append(tasto);
                        }
                        if (keyCode == 10 && swip == false && spiaAltreCarte == false) { //keyCode != 144 

                            System.out.println(testoRFIDCard.toString());
                            testoSwipCard = testoRFIDCard;
                            testoRFIDCard = new StringBuilder();
                            warn();
                        }

                        //29-10-18------------------------------------------------------
                        if (timerUnaVolta == false) {
                            timerUnaVolta = true;
                            final Timer timer = new Timer();
                            final TimerTask task = new TimerTask() {
                                @Override
                                public void run() {

                                    if (testoRFIDCard.toString().length() > 2) {
                                        System.out.println("Timer: " + testoRFIDCard.toString());
                                        testoSwipCard = testoRFIDCard;
                                        testoRFIDCard = new StringBuilder();
                                        warn();
                                    }

                                    timer.cancel();
                                    timer.purge();
                                    timerUnaVolta = false;
                                }
                            };

                            timer.schedule(task, 5000);
                        }
                        //fine 29-10-18------------------------------------------------------

                    }

                    return true;
                }

                public void warn() {
                    if (statoCardLettore) {
                        return;
                    }

                    //29-10-2018
                    testoRFIDCard = new StringBuilder();
                    //fine 29-10-2018

                    if (testoSwipCard.toString().length() > 0) {
                        statoCardLettore = true;

                        final Timer timer = new Timer();

                        final TimerTask task = new TimerTask() {
                            @Override
                            public void run() {
                                String tessera = "";
                                //per tessere tipo 8 e 9
                                if (testoSwipCard.toString().contains("ì")) {
                                    String[] txt = testoSwipCard.toString().split("ì");

                                    // per tessera MASTERCARD CARDHOLDER
                                    if (testoSwipCard.toString().length() > 30) {

                                        tessera = txt[0].trim().replace("_", "");
                                    } else {
                                        tessera = txt[1].trim().replace("_", "");
                                    }
                                } else if (testoSwipCard.toString().contains("&")) {
                                    // per tessera MASTERCARD CARDHOLDER
                                    String[] txt = testoSwipCard.toString().split("&");

                                    tessera = txt[0].trim().replace("%B", "");

                                } else {
                                    tessera = testoSwipCard.toString().trim().replace("_", "");
                                }

                                //per tessera tipo 3
                                if (tessera.length() >= 17 && tessera.length() <= 19) {
                                    tessera = tessera.substring(0, 7);
                                }

                                //per tessere tipo 6 e 7
                                if (tessera.length() == 21) {
                                    tessera = tessera.substring(0, 10);
                                    int posI = 0;
                                    for (int i = 0; i <= tessera.length(); i++) {
                                        if (tessera.substring(i, i + 1).equalsIgnoreCase("0") == false) {
                                            posI = i;
                                            break;
                                        }
                                    }

                                    tessera = tessera.substring(posI);
                                }

                                spiaAltreCarte = false;
                                swip = false;
                                if (pnlLogin.isVisible()) {
                                    controllaLogInCarta(tessera);
                                } else {
                                    //05/11/2018 le nuove tessere con CF a volte leggono solo la matricola
                                    jTxtTessera.setText(tessera);
                                    passaggioTessera = true;
                                    logNumeroTessera = tessera;
                                    cercaTessera();
                                }

                                testoSwipCard = new StringBuilder();

                                timer.cancel();
                                timer.purge();
                                statoCardLettore = false;

                            }
                        };

                        timer.schedule(task, delaySwipCard);

                    }
                }

            };
    }
    
    
    
    /***
     * FlagProponiAggiornamentoDB ha 3 possibili valori:
     * AUTO vuol dire che, se il db locale è da aggiornare (DB_locale_aggiornato = 0), lo deve fare e basta senza chiedere conferma
     * SI vuol dire che, se il db locale è da aggiornare (DB_locale_aggiornato = 0), lo deve fare chiedendo conferma
     * NO vuol dire che non lo deve fare nemmeno se è da aggiornare 
     */
    private void verificaAggiornamentoDB() {
        Long dbAggiornato = Utils.mySelectInteger("Select DB_locale_aggiornato as Agg from dual", "Agg", 
                this);
        String flagProponiAggiornamentoDB = Utils.mySelect("Select Valore from Parametri where chiave='FlagProponiAggiornamentoDB' ", "Valore",
                this);
        if(dbAggiornato == 0){            
            if (flagProponiAggiornamentoDB.equals("SI")) {
                aggiornaDB(true);
            }
            else if(flagProponiAggiornamentoDB.equals("AUTO")){
                aggiornaDB(false);
            }            
        }
    }

    private void verificaModoPagamento() {        
        flagImpostaTipoPagamento = Utils.mySelect("Select Valore from Parametri where chiave='FlagImpostaTipoPagamento' ", "Valore",
                this).equals("NO");
    }

    private void logTessera() {
        try {
            if (!logIDTessera.isEmpty()
                    || !logNumeroTessera.isEmpty()
                    || logTestoTessera.length() > 0) {
                Utils.myInsert("Insert into LETTURE_TESSERE (STRINGA_LETTA,NUMERO_TESSERA,ID_TESSERA,ERRORE) values "
                        + "('" + logTestoTessera.toString().replace("'", "''") 
                        + "','" + logNumeroTessera 
                        + "','" + logIDTessera 
                        + "','" + logTesseraErrore.replace("'", "''") 
                        + "')", this);
                logIDTessera = "";
                logNumeroTessera = "";
                logTestoTessera = new StringBuilder();
            }
        } catch (Exception ex) {
            LogManager.getLogger(PuntoCassa.class).error(ex);
        }
    }    

    private void verificaAggiornamentiJAR() {
        try {
            String pathURLAggiornamento = Utils.mySelect("Select Valore from Parametri where chiave='UrlJAR' ", "Valore", 
                    this);

            if (pathURLAggiornamento.length() > 0) {
                String startDir = System.getProperty("user.dir");
                URL url = new URL(pathURLAggiornamento);
                HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();

                Date d = new Date(httpCon.getLastModified());
                System.out.println(' ' + d.toString());

                File fileAttuale = new File(startDir + "/Cassa.jar");
                Date dataUltimaModificaJarCorrente = new Date(fileAttuale.lastModified());
                if (d.after(dataUltimaModificaJarCorrente)) {
                    if (JOptionPane.showConfirmDialog(null, "Aggiornamento disponibile. Aggiornare?", "Aggiornamento",
                            JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                        System.out.print("Aggiorna.............");

                        Runtime.getRuntime().exec("java -jar " + startDir + "/Aggiornamento.jar " + startDir + " " + pathURLAggiornamento);
                        System.exit(0);
                    }
                }
            }
        } catch (IOException ex) {
            LogManager.getLogger(PuntoCassa.class.getName()).error(ex);
        }
    }

    private void updateReaderCombo() {
        try {
            MyApplication myApp = new MyApplication();
            jcmbSC.setModel(new DefaultComboBoxModel(myApp.smartCard.listReaders()));

        } catch (Exception ex) {
            LogManager.getLogger(PuntoCassa.class.getName()).error(ex);            
        }
    }
   

    private Integer calcolaLarghezzaAltezza(Integer larControllo, Integer percentuale) {
        Integer d = percentuale - 100;
        if (d == 0) {
            return larControllo;
        } else {
            Integer n = larControllo + ((larControllo * d) / 100);
            return n;
        }

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        pnlErrore = new javax.swing.JPanel();
        lblMessaggioErrore = new javax.swing.JLabel();
        pnlTop = new javax.swing.JPanel();
        pnlCliente = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        lblCodice1 = new javax.swing.JLabel();
        lblSaldo = new javax.swing.JLabel();
        lblCodice2 = new javax.swing.JLabel();
        lblPunti = new javax.swing.JLabel();
        jTxtTessera = new javax.swing.JTextField();
        btnImpostaCliente = new javax.swing.JButton();
        jBtnReadCard = new javax.swing.JButton();
        jcmbSC = new javax.swing.JComboBox();
        lblCodice3 = new javax.swing.JLabel();
        lblTipoPagamento = new javax.swing.JLabel();
        lblCodice4 = new javax.swing.JLabel();
        lblResiduo = new javax.swing.JLabel();
        lblCodice5 = new javax.swing.JLabel();
        lblGratuita = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        lblCodice = new javax.swing.JLabel();
        lblCategoria = new javax.swing.JLabel();
        lblDenominazione = new javax.swing.JLabel();
        lblCognome = new javax.swing.JLabel();
        lblOrganizzazione = new javax.swing.JLabel();
        lblNome = new javax.swing.JLabel();
        lblOrganizzazione1 = new javax.swing.JLabel();
        lblNascita = new javax.swing.JLabel();
        lblOrganizzazione2 = new javax.swing.JLabel();
        lblScadTessera = new javax.swing.JLabel();
        lblOrganizzazione3 = new javax.swing.JLabel();
        lblAzienda = new javax.swing.JLabel();
        lblOrganizzazione4 = new javax.swing.JLabel();
        lblConvenzione = new javax.swing.JLabel();
        lblOrganizzazione5 = new javax.swing.JLabel();
        lblFascia = new javax.swing.JLabel();
        pnlCategorie = new javax.swing.JPanel();
        pnlConto = new javax.swing.JPanel();
        jbtnDuplica = new javax.swing.JButton();
        jbtnElimina = new javax.swing.JButton();
        jbtnAnnulla = new javax.swing.JButton();
        jbtnSu = new javax.swing.JButton();
        jbtnGiu = new javax.swing.JButton();
        txtTotaleCassa = new javax.swing.JTextField();
        jbtnChiudi = new javax.swing.JButton();
        jbtnStampa = new javax.swing.JButton();
        txtTotalePunti = new javax.swing.JTextField();
        pnlAzioni = new javax.swing.JPanel();
        jBtnStorno = new javax.swing.JButton();
        jBtnAsporto = new javax.swing.JToggleButton();
        jBtnprodotti = new javax.swing.JButton();
        jBtnMovimenti = new javax.swing.JButton();
        jBtnBuoni = new javax.swing.JButton();
        jTBP0 = new javax.swing.JToggleButton();
        jTBP1 = new javax.swing.JToggleButton();
        jTBP2 = new javax.swing.JToggleButton();
        jTBP3 = new javax.swing.JToggleButton();
        jbtnEsci = new javax.swing.JButton();
        pnlLista = new javax.swing.JPanel();
        scpLista = new javax.swing.JScrollPane();
        tblLista = new javax.swing.JTable();
        pnlProdotti = new javax.swing.JPanel();
        pnlLista1 = new javax.swing.JPanel();
        scpLista1 = new javax.swing.JScrollPane();
        tblLista1 = new javax.swing.JTable();
        pnlLogin = new javax.swing.JPanel();
        btnLogin = new javax.swing.JButton();
        txtUsername = new javax.swing.JTextField();
        lblUsername = new javax.swing.JLabel();
        lblPassword = new javax.swing.JLabel();
        txtPassword = new javax.swing.JPasswordField();
        btnTermina = new javax.swing.JButton();
        jChLogin = new javax.swing.JCheckBox();
        jBtnDB1 = new javax.swing.JButton();
        lblUtenteLoggato = new javax.swing.JLabel();
        lblStatoConnessione = new javax.swing.JLabel();
        lblInfo = new javax.swing.JLabel();
        lblInfo2 = new javax.swing.JLabel();
        lblDB = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setTitle("Prova di titolo");
        setName("frmPrincipale"); // NOI18N
        setResizable(false);
        addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentResized(java.awt.event.ComponentEvent evt) {
                resizeRules(evt);
            }
        });
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
            public void windowDeiconified(java.awt.event.WindowEvent evt) {
                formWindowDeiconified(evt);
            }
        });
        getContentPane().setLayout(null);

        pnlErrore.setBackground(new java.awt.Color(255, 255, 153));
        pnlErrore.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        pnlErrore.setLayout(null);

        lblMessaggioErrore.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lblMessaggioErrore.setText("lblMessaggioErrore");
        lblMessaggioErrore.setToolTipText("");
        lblMessaggioErrore.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        lblMessaggioErrore.setName("lblMessaggioErrore"); // NOI18N
        pnlErrore.add(lblMessaggioErrore);
        lblMessaggioErrore.setBounds(96, 24, 600, 240);

        getContentPane().add(pnlErrore);
        pnlErrore.setBounds(0, 0, 0, 0);

        pnlTop.setName("pnlTop"); // NOI18N
        pnlTop.setLayout(null);

        pnlCliente.setToolTipText("");

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Tessera"));

        lblCodice1.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblCodice1.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblCodice1.setText("Saldo:");

        lblSaldo.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblSaldo.setText("[...]");

        lblCodice2.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblCodice2.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblCodice2.setText("Punti:");

        lblPunti.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblPunti.setText("[...]");

        jTxtTessera.setToolTipText("");
        jTxtTessera.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jTxtTesseraFocusGained(evt);
            }
        });

        btnImpostaCliente.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        btnImpostaCliente.setText("Imposta");
        btnImpostaCliente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnImpostaClienteActionPerformed(evt);
            }
        });

        jBtnReadCard.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        jBtnReadCard.setText("Leggi Tessera");
        jBtnReadCard.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBtnReadCardActionPerformed(evt);
            }
        });

        jcmbSC.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

        lblCodice3.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblCodice3.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblCodice3.setText("Tipo Pagamento:");

        lblTipoPagamento.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblTipoPagamento.setText("[...]");

        lblCodice4.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblCodice4.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblCodice4.setText("Residuo:");

        lblResiduo.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblResiduo.setText("[...]");

        lblCodice5.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblCodice5.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblCodice5.setText("Gratuità Residue:");

        lblGratuita.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblGratuita.setText("[...]");
        lblGratuita.setName(""); // NOI18N

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(lblCodice2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(lblCodice1, javax.swing.GroupLayout.DEFAULT_SIZE, 104, Short.MAX_VALUE))
                                .addGap(8, 8, 8)
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(lblPunti, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(lblSaldo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(lblCodice3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(lblCodice4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(lblCodice5, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(lblResiduo, javax.swing.GroupLayout.DEFAULT_SIZE, 140, Short.MAX_VALUE)
                                    .addComponent(lblTipoPagamento, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(lblGratuita, javax.swing.GroupLayout.DEFAULT_SIZE, 140, Short.MAX_VALUE)))
                            .addComponent(btnImpostaCliente, javax.swing.GroupLayout.DEFAULT_SIZE, 252, Short.MAX_VALUE)
                            .addComponent(jTxtTessera)))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(48, 48, 48)
                        .addComponent(jBtnReadCard, javax.swing.GroupLayout.PREFERRED_SIZE, 154, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jcmbSC, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jcmbSC, javax.swing.GroupLayout.PREFERRED_SIZE, 3, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jBtnReadCard, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTxtTessera, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnImpostaCliente, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblSaldo)
                    .addComponent(lblCodice1, javax.swing.GroupLayout.Alignment.TRAILING))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblPunti)
                    .addComponent(lblCodice2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblTipoPagamento)
                    .addComponent(lblCodice3))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblResiduo)
                    .addComponent(lblCodice4, javax.swing.GroupLayout.Alignment.TRAILING))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblCodice5)
                    .addComponent(lblGratuita)))
        );

        lblCodice5.getAccessibleContext().setAccessibleName("Gtratuità Residue:");

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Cliente"));

        lblCodice.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblCodice.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblCodice.setText("Categoria:");

        lblCategoria.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblCategoria.setText("[...]");

        lblDenominazione.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblDenominazione.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblDenominazione.setText("Cognome:");

        lblCognome.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblCognome.setText("[...]");

        lblOrganizzazione.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblOrganizzazione.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblOrganizzazione.setText("Nome:");

        lblNome.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblNome.setText("[...]");

        lblOrganizzazione1.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblOrganizzazione1.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblOrganizzazione1.setText("Data Nascita:");

        lblNascita.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblNascita.setText("[...]");

        lblOrganizzazione2.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblOrganizzazione2.setForeground(new java.awt.Color(255, 0, 0));
        lblOrganizzazione2.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblOrganizzazione2.setText("Bonus Residui:");

        lblScadTessera.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblScadTessera.setForeground(new java.awt.Color(255, 0, 0));
        lblScadTessera.setText("[...]");

        lblOrganizzazione3.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblOrganizzazione3.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblOrganizzazione3.setText("Azienda:");

        lblAzienda.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblAzienda.setText("[...]");

        lblOrganizzazione4.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblOrganizzazione4.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblOrganizzazione4.setText("Convenzione:");

        lblConvenzione.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        lblConvenzione.setText("[...]");

        lblOrganizzazione5.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblOrganizzazione5.setForeground(new java.awt.Color(255, 0, 0));
        lblOrganizzazione5.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblOrganizzazione5.setText("Fascia:");

        lblFascia.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        lblFascia.setForeground(new java.awt.Color(255, 0, 0));
        lblFascia.setText("[...]");

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(lblOrganizzazione5, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblOrganizzazione4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblOrganizzazione3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblOrganizzazione2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblCodice, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblDenominazione, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblOrganizzazione, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblOrganizzazione1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(lblConvenzione, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 262, Short.MAX_VALUE)
                    .addComponent(lblAzienda, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblScadTessera, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblNascita, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblNome, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblCognome, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblCategoria, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblFascia, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(0, 0, 0))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblCodice)
                    .addComponent(lblCategoria))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblDenominazione)
                    .addComponent(lblCognome))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblNome)
                    .addComponent(lblOrganizzazione))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblOrganizzazione1)
                    .addComponent(lblNascita))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblOrganizzazione3)
                    .addComponent(lblAzienda))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblOrganizzazione4)
                    .addComponent(lblConvenzione))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblOrganizzazione5)
                    .addComponent(lblFascia))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblOrganizzazione2)
                    .addComponent(lblScadTessera))
                .addGap(6, 6, 6))
        );

        javax.swing.GroupLayout pnlClienteLayout = new javax.swing.GroupLayout(pnlCliente);
        pnlCliente.setLayout(pnlClienteLayout);
        pnlClienteLayout.setHorizontalGroup(
            pnlClienteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlClienteLayout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        pnlClienteLayout.setVerticalGroup(
            pnlClienteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pnlTop.add(pnlCliente);
        pnlCliente.setBounds(0, 0, 660, 140);
        pnlCliente.getAccessibleContext().setAccessibleDescription("Cliente");
        pnlCliente.getAccessibleContext().setAccessibleParent(pnlCliente);

        pnlCategorie.setBackground(new java.awt.Color(255, 204, 204));
        pnlCategorie.setBorder(javax.swing.BorderFactory.createTitledBorder("Categoria"));
        pnlCategorie.setLayout(new java.awt.GridLayout(10, 1, 1, 1));
        pnlTop.add(pnlCategorie);
        pnlCategorie.setBounds(0, 0, 9, 32);

        pnlConto.setBackground(new java.awt.Color(255, 255, 153));
        pnlConto.setBorder(javax.swing.BorderFactory.createTitledBorder("Conto"));
        pnlConto.setLayout(new java.awt.GridLayout(3, 0, 2, 2));

        jbtnDuplica.setBackground(new java.awt.Color(140, 240, 240));
        jbtnDuplica.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jbtnDuplica.setEnabled(false);
        jbtnDuplica.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnDuplicaActionPerformed(evt);
            }
        });
        pnlConto.add(jbtnDuplica);

        jbtnElimina.setBackground(new java.awt.Color(140, 240, 240));
        jbtnElimina.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jbtnElimina.setToolTipText("");
        jbtnElimina.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnEliminaActionPerformed(evt);
            }
        });
        pnlConto.add(jbtnElimina);

        jbtnAnnulla.setBackground(new java.awt.Color(140, 240, 240));
        jbtnAnnulla.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        jbtnAnnulla.setText("Annulla");
        jbtnAnnulla.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnAnnullaActionPerformed(evt);
            }
        });
        pnlConto.add(jbtnAnnulla);

        jbtnSu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnSuActionPerformed(evt);
            }
        });
        pnlConto.add(jbtnSu);

        jbtnGiu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnGiuActionPerformed(evt);
            }
        });
        pnlConto.add(jbtnGiu);

        txtTotaleCassa.setFont(new java.awt.Font("Tahoma", 1, 20)); // NOI18N
        txtTotaleCassa.setForeground(new java.awt.Color(242, 0, 0));
        txtTotaleCassa.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        txtTotaleCassa.setText("€ 0,00");
        txtTotaleCassa.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtTotaleCassaActionPerformed(evt);
            }
        });
        pnlConto.add(txtTotaleCassa);

        jbtnChiudi.setBackground(new java.awt.Color(51, 255, 51));
        jbtnChiudi.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        jbtnChiudi.setText("Chiudi");
        jbtnChiudi.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnChiudiActionPerformed(evt);
            }
        });
        pnlConto.add(jbtnChiudi);

        jbtnStampa.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnStampaActionPerformed(evt);
            }
        });
        pnlConto.add(jbtnStampa);

        txtTotalePunti.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        txtTotalePunti.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        txtTotalePunti.setText("Punti 0");
        txtTotalePunti.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtTotalePuntiActionPerformed(evt);
            }
        });
        pnlConto.add(txtTotalePunti);

        pnlTop.add(pnlConto);
        pnlConto.setBounds(286, 150, 257, 120);

        pnlAzioni.setBackground(new java.awt.Color(255, 204, 204));
        pnlAzioni.setBorder(javax.swing.BorderFactory.createTitledBorder("Azioni"));
        pnlAzioni.setLayout(new java.awt.GridLayout(2, 6, 2, 2));

        jBtnStorno.setToolTipText("Storno");
        jBtnStorno.setMargin(new java.awt.Insets(2, 2, 2, 2));
        jBtnStorno.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
        jBtnStorno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBtnStornoActionPerformed(evt);
            }
        });
        pnlAzioni.add(jBtnStorno);

        jBtnAsporto.setToolTipText("Modalità");
        jBtnAsporto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBtnAsportoActionPerformed(evt);
            }
        });
        pnlAzioni.add(jBtnAsporto);

        jBtnprodotti.setToolTipText("Prodotti");
        jBtnprodotti.setMargin(new java.awt.Insets(2, 2, 2, 2));
        jBtnprodotti.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBtnprodottiActionPerformed(evt);
            }
        });
        pnlAzioni.add(jBtnprodotti);

        jBtnMovimenti.setToolTipText("Ultimi movimenti");
        jBtnMovimenti.setMargin(new java.awt.Insets(2, 2, 2, 2));
        jBtnMovimenti.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBtnMovimentiActionPerformed(evt);
            }
        });
        pnlAzioni.add(jBtnMovimenti);

        jBtnBuoni.setToolTipText("");
        jBtnBuoni.setMargin(new java.awt.Insets(2, 2, 2, 2));
        jBtnBuoni.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBtnBuoniActionPerformed(evt);
            }
        });
        pnlAzioni.add(jBtnBuoni);

        jTBP0.setToolTipText("A Scalare");
        jTBP0.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTBP0ActionPerformed(evt);
            }
        });
        pnlAzioni.add(jTBP0);

        jTBP1.setToolTipText("Contanti");
        jTBP1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTBP1ActionPerformed(evt);
            }
        });
        pnlAzioni.add(jTBP1);

        jTBP2.setToolTipText("Ticket");
        jTBP2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTBP2ActionPerformed(evt);
            }
        });
        pnlAzioni.add(jTBP2);

        jTBP3.setToolTipText("Differito");
        jTBP3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTBP3ActionPerformed(evt);
            }
        });
        pnlAzioni.add(jTBP3);

        jbtnEsci.setBackground(new java.awt.Color(255, 255, 0));
        jbtnEsci.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        jbtnEsci.setText("Esci");
        jbtnEsci.setToolTipText("Esci");
        jbtnEsci.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnEsciActionPerformed(evt);
            }
        });
        pnlAzioni.add(jbtnEsci);

        pnlTop.add(pnlAzioni);
        pnlAzioni.setBounds(0, 153, 378, 73);

        pnlLista.setBackground(new java.awt.Color(204, 255, 204));
        pnlLista.setBorder(javax.swing.BorderFactory.createTitledBorder("Lista"));
        pnlLista.setLayout(new javax.swing.BoxLayout(pnlLista, javax.swing.BoxLayout.LINE_AXIS));

        scpLista.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N

        tblLista.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {},
                {},
                {},
                {}
            },
            new String [] {

            }
        ));
        tblLista.setName("jtbl"); // NOI18N
        scpLista.setViewportView(tblLista);

        pnlLista.add(scpLista);

        pnlTop.add(pnlLista);
        pnlLista.setBounds(288, 0, 140, 144);

        pnlProdotti.setBackground(new java.awt.Color(204, 255, 204));
        pnlProdotti.setBorder(javax.swing.BorderFactory.createTitledBorder("Prodotto"));
        pnlProdotti.setLayout(new java.awt.GridLayout(6, 2, 2, 2));
        pnlTop.add(pnlProdotti);
        pnlProdotti.setBounds(0, 0, 8, 33);

        pnlLista1.setBackground(new java.awt.Color(204, 255, 204));
        pnlLista1.setBorder(javax.swing.BorderFactory.createTitledBorder("Lista"));
        pnlLista1.setLayout(new javax.swing.BoxLayout(pnlLista1, javax.swing.BoxLayout.LINE_AXIS));

        scpLista1.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N

        tblLista1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {},
                {},
                {},
                {}
            },
            new String [] {

            }
        ));
        tblLista1.setName("jtbl"); // NOI18N
        scpLista1.setViewportView(tblLista1);

        pnlLista1.add(scpLista1);

        pnlTop.add(pnlLista1);
        pnlLista1.setBounds(288, 0, 140, 144);
        pnlLista1.getAccessibleContext().setAccessibleName("Lista1");

        getContentPane().add(pnlTop);
        pnlTop.setBounds(0, 188, 0, 0);
        pnlTop.getAccessibleContext().setAccessibleName("pnlTop");
        pnlTop.getAccessibleContext().setAccessibleDescription("");

        pnlLogin.setBackground(new java.awt.Color(255, 255, 153));
        pnlLogin.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Accesso al sistema", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 14))); // NOI18N
        pnlLogin.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N

        btnLogin.setText("Login");
        btnLogin.setEnabled(false);
        btnLogin.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnLogin.setName("btnLogin"); // NOI18N
        btnLogin.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
        btnLogin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLoginActionPerformed(evt);
            }
        });

        txtUsername.setEnabled(false);
        txtUsername.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                txtUsernameFocusGained(evt);
            }
        });
        txtUsername.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                txtUsernameMouseClicked(evt);
            }
        });

        lblUsername.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblUsername.setText("Username");
        lblUsername.setToolTipText("");

        lblPassword.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblPassword.setText("Password");

        txtPassword.setEnabled(false);
        txtPassword.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                txtPasswordFocusGained(evt);
            }
        });
        txtPassword.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                txtPasswordMouseClicked(evt);
            }
        });

        btnTermina.setIcon(new javax.swing.ImageIcon(getClass().getResource("/puntocassa/esci2.jpg"))); // NOI18N
        btnTermina.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        btnTermina.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
        btnTermina.setLabel("                              Termina Programma");
        btnTermina.setName("btnTermina"); // NOI18N
        btnTermina.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnTerminaActionPerformed(evt);
            }
        });

        jChLogin.setBackground(new java.awt.Color(255, 255, 153));
        jChLogin.setSelected(true);
        jChLogin.setText("Login con tessera");
        jChLogin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jChLoginActionPerformed(evt);
            }
        });

        jBtnDB1.setToolTipText("DB");
        jBtnDB1.setMargin(new java.awt.Insets(2, 2, 2, 2));
        jBtnDB1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBtnDB1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout pnlLoginLayout = new javax.swing.GroupLayout(pnlLogin);
        pnlLogin.setLayout(pnlLoginLayout);
        pnlLoginLayout.setHorizontalGroup(
            pnlLoginLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlLoginLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(pnlLoginLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(lblPassword, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(lblUsername, javax.swing.GroupLayout.DEFAULT_SIZE, 62, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(pnlLoginLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(txtPassword)
                    .addComponent(txtUsername)
                    .addComponent(btnLogin, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(pnlLoginLayout.createSequentialGroup()
                        .addComponent(jChLogin)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addComponent(jBtnDB1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(btnTermina, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 262, Short.MAX_VALUE))
                .addContainerGap())
        );
        pnlLoginLayout.setVerticalGroup(
            pnlLoginLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlLoginLayout.createSequentialGroup()
                .addComponent(jChLogin)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(pnlLoginLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblUsername))
                .addGap(10, 10, 10)
                .addGroup(pnlLoginLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblPassword))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(btnLogin, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jBtnDB1, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(btnTermina, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        getContentPane().add(pnlLogin);
        pnlLogin.setBounds(0, 70, 360, 220);
        pnlLogin.getAccessibleContext().setAccessibleName("pnlLogin");
        pnlLogin.getAccessibleContext().setAccessibleDescription("");

        lblUtenteLoggato.setText("[Nessun utente connesso]");
        lblUtenteLoggato.setVerticalAlignment(javax.swing.SwingConstants.TOP);
        lblUtenteLoggato.setAlignmentY(0.0F);
        lblUtenteLoggato.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        lblUtenteLoggato.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
        getContentPane().add(lblUtenteLoggato);
        lblUtenteLoggato.setBounds(20, 310, 130, 20);

        lblStatoConnessione.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lblStatoConnessione.setText("[Nessuna connessione]");
        lblStatoConnessione.setVerticalAlignment(javax.swing.SwingConstants.TOP);
        lblStatoConnessione.setAlignmentY(0.0F);
        lblStatoConnessione.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        lblStatoConnessione.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
        getContentPane().add(lblStatoConnessione);
        lblStatoConnessione.setBounds(425, 340, 120, 20);

        lblInfo.setText("[Info Turno]");
        lblInfo.setVerticalAlignment(javax.swing.SwingConstants.TOP);
        lblInfo.setAlignmentY(0.0F);
        lblInfo.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        lblInfo.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
        getContentPane().add(lblInfo);
        lblInfo.setBounds(180, 340, 130, 20);

        lblInfo2.setText("[Info Incassi]");
        lblInfo2.setVerticalAlignment(javax.swing.SwingConstants.TOP);
        lblInfo2.setAlignmentY(0.0F);
        lblInfo2.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        lblInfo2.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
        getContentPane().add(lblInfo2);
        lblInfo2.setBounds(160, 310, 130, 20);

        lblDB.setBackground(new java.awt.Color(51, 255, 0));
        lblDB.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lblDB.setText("DB");
        lblDB.setOpaque(true);
        getContentPane().add(lblDB);
        lblDB.setBounds(604, 360, 20, 20);

        getAccessibleContext().setAccessibleName("frmPrincipale");
        getAccessibleContext().setAccessibleDescription("");
        getAccessibleContext().setAccessibleParent(this);

        setBounds(0, 0, 857, 531);
    }// </editor-fold>//GEN-END:initComponents

    // ==========================================================================
    // ** Imposta dimensioni e posizione dei panel
    // ==========================================================================
    private void resize() {
        int x, y, w, h, tw, th;

        // -----------------------------------------------------------------------
        // *** Dimensioni del frame
        // -----------------------------------------------------------------------
        this.setSize(displayWidth, displayHeight);
        tw = this.getWidth();
        th = this.getHeight();

        // -----------------------------------------------------------------------
        // *** Posizione della status bar
        // -----------------------------------------------------------------------
        x = 0;
        y = th - 50;
        w = (tw / 8);
        h = 50;
        lblUtenteLoggato.setLocation(x, y);
        lblUtenteLoggato.setSize(w, h);
        lblInfo.setLocation(w, y);
        lblInfo.setSize(w * 2 + 60 - lblDB.getWidth(), h);

        lblInfo2.setLocation(w * 3 + 60 - lblDB.getWidth(), y);
//        lblInfo2.setSize(tw - (w * 2 + 10) - 131, h);
        int larg = tw - (w * 2 + 10) - 359;
        lblInfo2.setSize(larg, h);

        lblStatoConnessione.setLocation(tw - 181 - lblDB.getWidth(), y);
        lblStatoConnessione.setSize(175, h);

        lblDB.setLocation(tw - 181 - lblDB.getWidth() + lblStatoConnessione.getWidth(), y);

        // -----------------------------------------------------------------------
        // *** Posizione del panel Errore
        // -----------------------------------------------------------------------
        x = 0;
        y = 0;
        w = tw;
        h = th - lblUtenteLoggato.getHeight();
        pnlErrore.setLocation(x, y);
        pnlErrore.setSize(w, h);

        // -----------------------------------------------------------------------
        // *** Posizione del panel Login
        // -----------------------------------------------------------------------
        x = 0;
        y = 0;
        w = pnlLogin.getWidth();
        h = pnlLogin.getHeight();
        pnlLogin.setLocation((int) (tw - w) / 2, (int) (th - h) / 2);
        pnlLogin.setSize(w, h);

        // -----------------------------------------------------------------------
        // *** Posizione del panel Top (operativo)
        // -----------------------------------------------------------------------
        x = 0;
        y = 0;
        w = tw + 5;
        h = th - lblUtenteLoggato.getHeight();
        pnlTop.setLocation(x, y);
        pnlTop.setSize(w, h);

        // -----------------------------------------------------------------------
        // *** Posizionamento degli oggetti nel panel Top (operativo)
        // -----------------------------------------------------------------------
        tw = pnlTop.getWidth();
        th = pnlTop.getHeight();

        // -----------------------------------------------------------------------
        // ** Panel Categorie
        // -----------------------------------------------------------------------
        x = 0;
        y = 0;
        w = (int) (13 * tw / 100);
        h = (int) (68 * th / 100);
        pnlCategorie.setLocation(x, y);
        pnlCategorie.setSize(w, h);

        // -----------------------------------------------------------------------
        // ** Panel Prodotti
        // -----------------------------------------------------------------------
        x = w;
        y = 0;
        w = (int) (57 * tw / 100);
        h = (int) (68 * th / 100);
        pnlProdotti.setLocation(x, y);
        pnlProdotti.setSize(w, h);

        // -----------------------------------------------------------------------
        // ** Panel Lista
        // -----------------------------------------------------------------------
        x = x + w;
        y = 0;
        w = tw - x - 10;
        h = (int) (25 * th / 100);
        pnlLista.setLocation(x, y);
        pnlLista.setSize(w, h);
        scpLista.setLocation(0, 0);
        scpLista.setSize(w, h);
        scpLista.setBackground(Color.BLUE);
        tblLista.setLocation(0, 0);
        tblLista.setSize(w, h);
        tblLista.setShowGrid(true);

        int Col1 = (w / 100) * 80;
        MyTableModel model = new MyTableModel();
        String[] col = {"Prodotto", "Prezzo", "Punti"};
        model.setColumname(col);
        Object[][] data = null;
        model.setRow(data);

        tblLista.setModel(model);
        tblLista.getColumnModel().getColumn(0).setPreferredWidth(Col1);
        tblLista.getColumnModel().getColumn(1).setPreferredWidth(50);
        tblLista.getColumnModel().getColumn(1).setCellRenderer(new DecimalFormatRenderer());

        tblLista.getColumnModel().getColumn(2).setPreferredWidth(50);
        tblLista.setVisible(true);

        // -----------------------------------------------------------------------
        // ** Panel Lista1
        // -----------------------------------------------------------------------
        y = h;
        pnlLista1.setBorder(javax.swing.BorderFactory.createTitledBorder("Composizione"));
        pnlLista1.setLocation(x, y);
        pnlLista1.setSize(w, 70);
        scpLista1.setLocation(0, 0);
        scpLista1.setSize(w, h);
        scpLista1.setBackground(Color.BLUE);
        tblLista1.setLocation(0, 0);
        tblLista1.setSize(w, h);
        tblLista1.setShowGrid(true);

        MyTableModel model1 = new MyTableModel();
        String[] colVassoio = {"Vassoio", "Prezzo"};
        model1.setColumname(colVassoio);
        Object[][] data1 = null;
        model1.setRow(data1);

        tblLista1.setModel(model1);
        tblLista1.getColumnModel().getColumn(0).setPreferredWidth(Col1);
        tblLista1.getColumnModel().getColumn(1).setPreferredWidth(50);

        tblLista1.setVisible(true);

        // -----------------------------------------------------------------------
        // ** Panel Cliente
        // -----------------------------------------------------------------------
        x = 0;
        y = pnlCategorie.getHeight();
        w = pnlCategorie.getWidth() + pnlProdotti.getWidth() - 120;
        //h = pnlConto.getHeight();
        h = th - pnlProdotti.getHeight();
        pnlCliente.setLocation(x, y);
        pnlCliente.setSize(w, h);

        // -----------------------------------------------------------------------
        // ** Panel Conto
        // -----------------------------------------------------------------------
        x = pnlLista.getX();//pnlAzioni.getWidth();
        y = pnlLista.getHeight() + pnlLista1.getHeight();
        w = pnlLista.getWidth();

        h = 220;//th-y;    
        pnlConto.setLocation(x, y);
        pnlConto.setSize(w, h - 10);
        ImageIcon icon = new ImageIcon(imgPath + "freccia_down.jpg");
        Image img = icon.getImage();
        Image newimg = img.getScaledInstance(50, 50, java.awt.Image.SCALE_SMOOTH);
        icon = new ImageIcon(newimg);
        jbtnGiu.setIcon(icon);

        ImageIcon icon2 = new ImageIcon(imgPath + "freccia_up.jpg");
        Image img2 = icon2.getImage();
        Image newimg2 = img2.getScaledInstance(50, 50, java.awt.Image.SCALE_SMOOTH);
        icon2 = new ImageIcon(newimg2);
        jbtnSu.setIcon(icon2);

        ImageIcon icon3 = new ImageIcon(imgPath + "ticket2.png");
        Image img3 = icon3.getImage();
        Image newimg3 = img3.getScaledInstance(50, 50, java.awt.Image.SCALE_SMOOTH);
        icon3 = new ImageIcon(newimg3);
        jBtnBuoni.setIcon(icon3);

        ImageIcon iconFulmine = new ImageIcon(imgPath + "fulmine.jpg");
        Image imgF = iconFulmine.getImage();
        Image newimgF = imgF.getScaledInstance(50, 50, java.awt.Image.SCALE_SMOOTH);
        iconFulmine = new ImageIcon(newimgF);
        jbtnStampa.setIcon(iconFulmine);

        // -----------------------------------------------------------------------
        // ** Panel Azioni
        // -----------------------------------------------------------------------
        //x = 0;
        x = pnlLista.getX() - 120;
        y = pnlConto.getY() + pnlConto.getHeight();//pnlProdotti.getHeight() + pnlCliente.getHeight();
        w = pnlLista.getWidth() + 120; //pnlCategorie.getWidth() + pnlProdotti.getWidth();
        h = th - (pnlLista.getHeight() + pnlLista1.getHeight() + pnlConto.getHeight()); //th-y;    
        pnlAzioni.setLocation(x, y);
        pnlAzioni.setSize(w, h);

        // -----------------------------------------------------------------------
        // *** Refresh dell'interfaccia
        // -----------------------------------------------------------------------
        this.revalidate();
        this.repaint();

    }

    // ==========================================================================
    // *** Metodo per gestire gli eventi sui button dinamici
    // ==========================================================================
    public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        String tipo;
        String id;
        String sql = "";
        Statement st;
        ResultSet rs;
        int i, j, k;
//        JButton b;

        i = cmd.indexOf("[");
        j = cmd.indexOf("]");
        id = cmd.substring(i + 1, j);
        tipo = cmd.substring(0, i);

        switch (tipo) {
            case "CATEGORIA" -> pulsantiCategoria(id, cmd);

            case "PRODOTTO" -> {
                if (isCassaAperta) {
                    sql = "SELECT "
                            + "prodotti.id as idProdotto,"
                            + "prodotti.nome, "
                            + "prodotti.prezzo_base,"
                            + "tariffe.Punti as Punti_Base,"
                            + "tariffe.prezzo as Prezzo,"
                            + "tariffe.punti as Punti,"
                            + "prodotti.id_Categoria "
                            + "FROM prodotti "
                            + "left join tariffe on prodotti.id=tariffe.id_prodotto "
                            + "where prodotti.id = " + id + " and Tariffe.id_fascia=" + idProfiloTariffario;
                    try {

                        //spengo altri togglebutton
                        for (Integer y = 0; y < this.pnlProdotti.getComponentCount(); y++) {
                            JToggleButton bt = (JToggleButton) this.pnlProdotti.getComponent(y);
                            if (!bt.getActionCommand().equals(cmd)) {
                                bt.setSelected(false);
                            }
                        }

                        jbtnSu.setEnabled(true);
                        jbtnGiu.setEnabled(true);
                        jbtnElimina.setEnabled(true);
                        jbtnAnnulla.setEnabled(true);

                        doLayout();

                        Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
                        st = dbConnection.createStatement();
                        rs = st.executeQuery(sql);
                        MyTableModel model = (MyTableModel) tblLista.getModel();

                        while (rs.next()) {
                            Double prezzo = 0.0;
                            Integer punti = 0;

                            if (rs.getDouble("Prezzo") > 0) {
                                prezzo = rs.getDouble("Prezzo");
                            } else {
                                prezzo = rs.getDouble("prezzo_base");
                            }

                            if (rs.getDouble("Punti") > 0) {
                                punti = rs.getInt("Punti");
                            } else {
                                punti = rs.getInt("Punti_Base");
                            }
                            //14-01-2019
                            if (model.getRowCount() > 0) {
                                //è una composizione non la metto
                                if (rs.getLong("id_Categoria") == 0L) {
                                    JOptionPane.showOptionDialog(this, "Composizione gia presente!", "Attenzione",
                                            JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, null, null);
                                    return;
                                }
                            }
                            //21-12-8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                            model.addRow(new Object[]{rs.getString("nome"), prezzo, punti, rs.getLong("idProdotto"), prezzo, rs.getLong("id_Categoria")});
                        }
                        if (model.getRowCount() > 0) {
                            tblLista.setRowSelectionInterval(model.getRowCount() - 1, model.getRowCount() - 1);
                        }
                        tblLista.setModel(model);

                        controllaCompleti(model);
                        controllaExtra(model);
                        sommaColonne(model);

                        //inizio 21-12-18<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                        if (jbtnChiudi.isEnabled()) {
                            if (saldoAcquisti(0.0) == false
                                    && cercaTestoModoPagamento().equalsIgnoreCase("A scalare")
                                    && gratuitaResidue <= 0
                                    && (bonusResidui <= 0 || flagBonus == 0)
                                    && consentiCredito == false) {
                                JOptionPane.showOptionDialog(this, "Saldo tessera insufficiente!", "Attenzione",
                                        JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, null, null);
                                jbtnEliminaActionPerformed(null);
                                return;
                            }
                        } else {
                            if (idTessera != 0L) {
                                jbtnChiudi.setEnabled(true);
                            }
                        }
                        //fine 21-12-18<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

                        //stessa procedura in Cercates
                        //prendo l'ultimo valore della griglia
//                        if (model.getRowCount() > 0) {//
//
//                            Double totAcquisto = 0.0;
//                            try {
//
//                                if (txtTotaleCassa.getText().length() > 0) {
//                                    String saldo = txtTotaleCassa.getText().replace("? ", "").replace(".", "");
//                                    saldo = saldo.replace(",", ".");
//                                    totAcquisto = Double.valueOf(saldo);
//                                }
//                            } catch (Exception ex) {
//                                LogManager.getLogger(PuntoCassa.class).error(ex);
//                            }
//                            //DecimalFormat df2 = new DecimalFormat("##0.00");
//                            //String prezzoDisplay = ("E " + df2.format(totAcquisto));
//                            /*String fa = "FASCIA " + lblFascia.getText().replaceAll("Fascia", "").trim();
//                            if (fa.length() >= 10) {
//                            fa = fa.substring(fa.length() - 10, fa.length());
//                            } else {
//                            fa = spaziBianchi(fa, 10, true);
//                            }*/
//
//                            //String uProd = spaziBianchi("Totale ", 20, true);
//                        }
                        rs.close();
                        st.close();
                        dbConnection.close();

                    } catch (Exception ex) {
                        System.out.println(ex.getMessage());
                    }
                }
            }

            default -> {
            }
        }
    }

    private void pulsantiCategoria(String id, String cmd) {

        for (Integer k = this.pnlProdotti.getComponentCount(); k > 0; k--) {
            this.pnlProdotti.remove(k - 1);
        }
        this.caricaDati("PRODOTTI", id);
        //spengo altri togglebutton
        if (this.pnlCategorie.getComponentCount() > 2) {
            for (Integer y = 0; y < this.pnlCategorie.getComponentCount(); y++) {
                JToggleButton bt = (JToggleButton) this.pnlCategorie.getComponent(y);
                if (!bt.getActionCommand().equals(cmd)) {
                    bt.setSelected(false);
                } else {
                    if (bt.isSelected() == false) {
                        this.caricaPannello();
                    }

                }

            }
        }
    }

    private Boolean saldoAcquisti(Double prezzo) {
        Boolean ok = false;
        Double saldoTessera = 0.0;
        Double totAcquisto = 0.0;
        try {
            if (lblSaldo.getText().length() > 0) {
                String saldo = lblSaldo.getText().replace("? ", "").trim().replace(".", "");
                saldo = saldo.replace("[", "");
                saldo = saldo.replace("]", "");
                saldo = saldo.replace(",", ".");
                if (saldo.length() > 0) {
                    saldoTessera = Double.valueOf(saldo);
                }

            }
            if (txtTotaleCassa.getText().length() > 0) {
                String totaleCassa = txtTotaleCassa.getText().replace("? ", "").replace(".", "");
                totaleCassa = totaleCassa.replace(",", ".");
                totAcquisto = Double.valueOf(totaleCassa);
            }
        } catch (Exception e) {
            LogManager.getLogger(PuntoCassa.class).error(e);
        }
        Double s = saldoTessera - (totAcquisto + prezzo);
        if (s >= saldoMinimoStop) {
            ok = true;
        }

        return ok;
    }

    private void sommaColonne(MyTableModel model) {
        Double t = model.somma(colImporto);
        MyTableModel model2 = (MyTableModel) tblLista1.getModel();
        if (model2.getRowCount() > 0) {
            t = t + model2.somma(1);
        }

        DecimalFormat df2 = new DecimalFormat("#,###,###,##0.00");
        txtTotaleCassa.setText("? " + df2.format(t));

        int p = model.sommaInt(2);
        txtTotalePunti.setText("Punti " + p);

        //if(idModoPagamento==0L){
        if (cercaTestoModoPagamento().equalsIgnoreCase("A scalare")) {
            Double saldoCarta = 0.0;
            if (lblSaldo.getText().trim().length() > 0) {
                String saldo = lblSaldo.getText().replace("? ", "").trim().replace(".", "");
                saldo = saldo.replace("[", "");
                saldo = saldo.replace("]", "");
                saldo = saldo.replace(",", ".");
                if (saldo.length() > 0) {
                    saldoCarta = Double.valueOf(saldo);
                }
            }
            saldoCarta = saldoCarta - t;
            lblResiduo.setText("? " + df2.format(saldoCarta));
        }
    }

    private void controllaExtra(MyTableModel model) {
        if (flagExtra == false) {
            for (int i = 0; i < model.getRowCount(); i++) {
                Object row[] = model.getRow(i);
                Double p = Double.valueOf(row[colImporto].toString());
                if (p != 0) {
                    JOptionPane.showMessageDialog(this, "Composizione errata, questo prodotto sarà eliminato!");
                    jbtnEliminaActionPerformed(null);
                    break;
                }
            }
        } else {
            for (int i = 0; i < model.getRowCount(); i++) {
                Object row[] = model.getRow(i);
                Double p = Double.valueOf(row[colImporto].toString());
                if (p != 0) {
                    JOptionPane.showMessageDialog(this, "Nella lista sono presenti degli extra!");
                    break;
                }

            }

        }
    }

    //02/09/2021
    private void controllaCompleti(MyTableModel model) {
        if (passaggiEsauritiNoComposizione == true) {
            return;
        }

        MyTableModel model1 = (MyTableModel) tblLista1.getModel();
        //clearTable(model1);
        model1.clearTable();
        Boolean composizionePresente = false;
        StringBuilder sb = new StringBuilder();
        //verifico se sono presenti composizioni
        for (int i = 0; i < model.getRowCount(); i++) {
            Object row[] = model.getRow(i);
            Double p = Double.valueOf(row[4].toString());
            model.setValueAt(p, i, colImporto);
            sb.append(model.getValueAt(i, 3));
            sb.append(",");
            if (Long.parseLong(row[5].toString()) == 0L) {
                composizionePresente = true;
                if (gratuitaResidue > 0) {//Gratuita_ResidueProg
                    //clearTable(model1);
                    model1.clearTable();
                    model1.addRow(new Object[]{model.getValueAt(i, 0), 0.00, model.getValueAt(i, 3)});
                } else if (flagBonus == 1 && bonusResidui > 0) {
                    //clearTable(model1);
                    model1.clearTable();
                    model1.addRow(new Object[]{model.getValueAt(i, 0), 0.00, model.getValueAt(i, 3)});
                } else {
                    //clearTable(model1);
                    model1.clearTable();
                    model1.addRow(new Object[]{model.getValueAt(i, 0), model.getValueAt(i, 1), model.getValueAt(i, 3)});
                }

                model.setValueAt(0.0, i, colImporto);
            }

        }

        doLayout();

        if (composizionePresente == false && sb.toString().length() > 0) {
            //azzero prezzi dei componenti della composizione
            //23-09-22              
            for (int i = 0; i < model.getRowCount(); i++) {
                model.setValueAt(0.00, i, colImporto);
            }

            String idVassoio = Utils.mySelect("SELECT seleziona_composizione('" + sb.toString().substring(0, sb.toString().length() - 1) + "') "
                    + "as idCompleto from dual",
                    "idCompleto",
                    this);
            if (Long.parseLong(idVassoio) != -1) {
                String nomeVassoio = Utils.mySelect("Select nome from vassoi where id=" + idVassoio, "nome", 
                        this);
                String prezzo = Utils.mySelect("Select prezzo from tariffe where id_fascia=" + idProfiloTariffario + " "
                        + "and id_prodotto=" + idVassoio, "prezzo",
                        this);

                //clearTable(model1);
                model1.clearTable();
                if (gratuitaResidue > 0) {//Gratuita_ResidueProg                                        
                    model1.addRow(new Object[]{nomeVassoio, 0.00, idVassoio});
                } else if (flagBonus == 1 && bonusResidui > 0) {
                    model1.addRow(new Object[]{nomeVassoio, 0.00, idVassoio});
                } else {
                    model1.addRow(new Object[]{nomeVassoio, prezzo, idVassoio});
                }

                //azzero elemento appena inserito se fa parte di una composizione
                model.setValueAt(0.00, model.getRowCount() - 1, colImporto);
                doLayout();
            } else {
                JOptionPane.showMessageDialog(this, "Composizione errata, questo prodotto sarà eliminato!");
                jbtnEliminaActionPerformed(null);
            }
//            }
        }

        if (composizionePresente == true && sb.toString().length() > 0 && model.getRowCount() > 1) {
            JOptionPane.showMessageDialog(this, "Composizione presente, questo prodotto sarà eliminato!");
            jbtnEliminaActionPerformed(null);
        }

    }

    // ==========================================================================
    // ** Carica i dati di base per la maschera principale
    // ==========================================================================
    public void caricaDati(String tipo, String id) {
        String sql = "";
        String azione = "";
        String nome = "";
        Statement st;
        ResultSet rs;
        JToggleButton b;
        JPanel pnl = this.pnlCategorie;

        switch (tipo) {
            case "CATEGORIE" -> {               
                sql = "SELECT distinct c.id, c.nome, c.descrizione FROM categorie_prodotti c "
                        + " INNER JOIN prodotti p ON p.id_categoria = c.ID "
                        + " INNER JOIN catalogo_punti_cassa l ON l.id_prodotto = p.ID "
                        + " INNER JOIN punti_cassa x ON l.id_punto_cassa = x.ID "
                        + " WHERE x.id =" + idPuntoCassa + " order by c.descrizione";
                System.out.println(sql);
                azione = "CATEGORIA";
                pnl = this.pnlCategorie;
            }

            case "PRODOTTI" -> {
                sql = "SELECT p.ID, p.nome, NVL (t.prezzo, p.prezzo_base) AS prezzo,NVL (t.punti, 0) AS punti FROM prodotti p , tariffe t, catalogo_punti_cassa c "
                        + " WHERE p.id_categoria = " + id
                        + " AND t.id_prodotto = p.id "
                        + " AND t.id_fascia = " + idProfiloTariffario
                        + " AND c.id_prodotto = p.id AND c.id_punto_cassa =" + idPuntoCassa
                        + " ORDER BY p.flag_catalogo_variabile desc, p.nome";

                System.out.println(sql);
                azione = "PRODOTTO";
                pnl = this.pnlProdotti;
            }
        }
        try {
            Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
            st = dbConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);

            if (tipo.equalsIgnoreCase("CATEGORIE")) {
                int rowcount = 0;
                while (rs.next()) {
                    rowcount++;
                }
                if (rowcount > 0) {
                    numeroCategorie = rowcount;
                    rs.beforeFirst();
                    pnl.setLayout(new GridLayout(rowcount + 1, 1, 1, 1));
                }
            }

            pnl.removeAll();

            while (rs.next()) {
                nome = "<html>" + rs.getString("nome") + "</html>";
                b = new JToggleButton(nome);
                b.setEnabled(isCassaAperta);
                b.setHorizontalAlignment(SwingConstants.CENTER);
                b.setVerticalAlignment(SwingConstants.CENTER);
                b.setVerticalTextPosition(SwingConstants.CENTER);
                b.setText(nome);
                b.setName(rs.getString("id"));
                b.setActionCommand(azione + "[" + rs.getString("id") + "]");
                b.addActionListener(this);
                b.setVisible(true);
                if (tipo.equalsIgnoreCase("CATEGORIE")) {
                    Font f = new Font("Tahoma", Font.BOLD, 14);
                    b.setFont(f);
                    b.setForeground(Color.RED);

                }
                pnl.add(b);
            }

            if (tipo.equalsIgnoreCase("CATEGORIE")) {
                JToggleButton bGost = new JToggleButton("[DEFAULT]");
                bGost.setName("btnDefault");
                Font f = new Font("Tahoma", Font.BOLD, 14);
                bGost.setFont(f);
                bGost.setForeground(Color.RED);
                bGost.setActionCommand("CATEGORIA[0]");
                bGost.addActionListener(this);
                bGost.setVisible(false);
                pnl.add(bGost);
            }

            this.revalidate();
            this.repaint();
            rs.close();
            st.close();
            dbConnection.close();

        } catch (SQLException e) {
        }

    }

    public void caricaPannello() {
        String azione = "PRODOTTO";
        String where = "";
        Statement st;
        ResultSet rs;
        String sql = "select * from (SELECT p.ID, p.nome, NVL (t.prezzo, p.prezzo_base) AS prezzo,NVL (t.punti, 0) AS punti,cat.nome as Categoria ";
        String sql2 = " FROM prodotti p , tariffe t, catalogo_punti_cassa c,categorie_prodotti cat "
                + " WHERE p.flag_catalogo_variabile = 1"
                + " AND p.id_categoria = cat.id "
                + " AND t.id_prodotto = p.id "
                + " AND t.id_fascia = " + idProfiloTariffario
                + " AND c.id_prodotto = p.id AND c.id_punto_cassa =" + idPuntoCassa;
        //MyApplication myApp = new MyApplication();
        String nrec = Utils.mySelect("SELECT count(*) as nrec " + sql2, "nrec", 
                this);
        if (Integer.parseInt(nrec) <= 0) {
            menuGiornoPresente = false;
            String idComposizione = Utils.mySelect("select id from Categorie_Prodotti where Upper(Nome)='COMPOSIZIONE'", "id",
                    this);
            caricaDati("PRODOTTI", idComposizione);

        } else {
            menuGiornoPresente = true;
            sql = sql + sql2;
        }
        JPanel pnl = this.pnlProdotti;

        pnl.setLayout(new GridLayout(6, 5, 1, 1));
        pnl.removeAll();
        for (Integer r = 0; r < 6; r++) {
            Color c2 = new Color(255, 153, 255);
            switch (r) {
                case 0 -> where = " and upper(cat.CODICE)='PRIM' ";
                case 1 -> {
                    where = " and upper(cat.CODICE)='SECO' ";
                    c2 = Color.CYAN;
                }
                case 2 -> {
                    where = " and upper(cat.CODICE)='CONT' ";
                    c2 = new Color(146, 208, 80);
                }
                case 3 -> {
                    where = " and upper(cat.CODICE)='DESS' ";
                    c2 = Color.yellow;
                }
                case 4 -> {
                    where = " and (upper(cat.CODICE)='INSA' OR upper(cat.CODICE)='UNI' OR upper(cat.CODICE)='UNR2') ";
                    c2 = Color.GREEN;
                }
                case 5 -> {
                    where = " and (upper(cat.CODICE)='SALA' OR upper(cat.CODICE)='PIZZ') ";
                    c2 = new Color(255, 217, 102);
                }

            }
            Integer np = 0;
            try {
                Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
                st = dbConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
                rs = st.executeQuery(sql + where + " order by p.id) where ROWNUM <= 7");
                Font f = new Font("Tahoma", Font.BOLD, 13);
                String jolly = "";
                String idJolly = "";
                while (rs.next()) {
                    if (rs.getString("nome").toUpperCase().indexOf("JOLLY") >= 0) {
                        jolly = "<html>" + rs.getString("nome") + "</html>";
                        idJolly = rs.getString("id");
                    } else {
                        String nome = "<html>" + rs.getString("nome") + "</html>";
                        JToggleButton bt = new JToggleButton(nome);
                        bt.setBackground(c2);
                        bt.setEnabled(isCassaAperta);
                        bt.setFont(f);
                        Insets ins = new Insets(0, 0, 0, 0);
                        bt.setMargin(ins);
                        bt.setHorizontalAlignment(SwingConstants.LEFT);
                        bt.setVerticalAlignment(SwingConstants.TOP);
                        bt.setVerticalTextPosition(SwingConstants.TOP);
                        bt.setName(rs.getString("id"));
                        bt.setActionCommand(azione + "[" + rs.getString("id") + "]");
                        bt.addActionListener(this);
                        bt.setVisible(true);

                        pnl.add(bt);
                        np++;
                        if (np == 5) {
                            break;
                        }
                    }
                }

                for (Integer c = np; c < 6; c++) {
                    JToggleButton bt;
                    if (c == 5 && jolly.length() > 1) {
                        bt = new JToggleButton(jolly);
                        bt.setName(idJolly);
                        bt.setActionCommand(azione + "[" + idJolly + "]");
                    } else {
                        bt = new JToggleButton("");
                        bt.setName("0");
                        bt.setActionCommand(azione + "[0]");
                    }
                    bt.setBackground(c2);
                    bt.setFont(f);
                    bt.setEnabled(isCassaAperta);
                    Insets ins = new Insets(0, 0, 0, 0);
                    bt.setMargin(ins);
                    bt.setHorizontalAlignment(SwingConstants.LEFT);
                    bt.setVerticalAlignment(SwingConstants.TOP);
                    bt.setVerticalTextPosition(SwingConstants.TOP);
                    bt.addActionListener(this);
                    bt.setVisible(true);
                    pnl.add(bt);
                }
                rs.close();
                st.close();
                dbConnection.close();

            } catch (SQLException e) {
                LogManager.getLogger(PuntoCassa.class).error(e);
            }

        }

        this.revalidate();
        this.repaint();

    }

    private void caricaModiPagamento() {
        try {
            Statement st;
            ResultSet rs;
            Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
            st = dbConnection.createStatement();
            rs = st.executeQuery("Select * from Tipi_Pagamenti order by id");

            while (rs.next()) {
                modiPagamento.append(rs.getString("id")).append(';').append(rs.getString("nome")).append("|");
            }
            this.revalidate();
            this.repaint();
            rs.close();
            st.close();
            dbConnection.close();

        } catch (SQLException e) {
            LogManager.getLogger(PuntoCassa.class).error(e);
        }

    }

    // ==========================================================================
    // ** Quando viene chiusa la form esce dall'applicazione
    // ==========================================================================
    private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
        Object[] options = {"Si", "No"};

        Object selectedValue = JOptionPane.showOptionDialog(this, "Confermi chiusura programma?", "Attenzione",
                JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[1]);

        if (Integer.parseInt(selectedValue.toString()) == 0) {
            Utils.myInsert("UPDATE PARAMETRI set valore='NO' where chiave='FlagDownloadInCorso'", this);
            Long nrec = Utils.mySelectInteger("SELECT count(*) as nrec FROM acquisti", "nrec",
                    this);
            if (nrec > 0) {
                if (JOptionPane.showConfirmDialog(null, "Attenzione, ci sono " + nrec + " passaggi non ancora trasferiti al database centrale,\nconferma chiusura programma?", "Acquisti", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                    statoAttivoNonLoggato();
                    System.exit(0);
                } else {
                    return;
                }
            }
            statoAttivoNonLoggato();
            System.exit(0);
        }

    }//GEN-LAST:event_exitForm

    // ==========================================================================
    // ** Click sul btnLogin
    // ==========================================================================
    private Boolean turno() {
        Boolean ok = false;
        String query = "select t.dalle, t.alle, t.id, t.nome from turni t, turni_punti_distribuzione x, punti_distribuzione p, punti_cassa c "
                + "where x.id_turno = t.id "
                + "and x.id_punto_distribuzione = p.id "
                + "and c.id_punto_distribuzione = p.id and c.id =" + idPuntoCassa;

        try {
            String[] nowString = Utils.mySelect("Select sysdate as mo from dual", "mo",
                    this).split(" ");

            Statement st;
            ResultSet rs;
            Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
            st = dbConnection.createStatement();
            rs = st.executeQuery(query);
            while (rs.next()) {
                String dalle = rs.getString("dalle");
                String alle = rs.getString("alle");
                try {

                    Date now = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH).parse(nowString[0] + " " + nowString[1]);
                    Date da = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH).parse(nowString[0] + " " + dalle);
                    Date a = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH).parse(nowString[0] + " " + alle);

                    if (now.after(da) && now.before(a)) {
                        idTurno = rs.getLong("id");
                        nomeTurno = rs.getString("nome");
                        idTurnoAttuale = idTurno;
                        nomeTurnoAttuale = nomeTurno;
                        ok = true;
                        break;
                    }

                } catch (Exception e) {
                    LogManager.getLogger(PuntoCassa.class).error(e);
                }
            }
            rs.close();
            st.close();
            dbConnection.close();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this, "Errore DB ['" + query + "']");
        }
        return ok;
    }

    private void turnoAttuale() {
        String query = "select t.dalle, t.alle, t.id, t.nome from turni t, turni_punti_distribuzione x, punti_distribuzione p, punti_cassa c "
                + "where x.id_turno = t.id and x.id_punto_distribuzione = p.id "
                + "and c.id_punto_distribuzione = p.id and c.id =" + idPuntoCassa;

        try {
            String[] mo = Utils.mySelect("Select sysdate as mo from dual", "mo",
                    this).split(" ");

            Statement st;
            ResultSet rs;
            Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
            st = dbConnection.createStatement();
            rs = st.executeQuery(query);
            while (rs.next()) {
                String dalle = rs.getString("dalle");
                String alle = rs.getString("alle");
                try {

                    Date adesso = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH).parse(mo[0] + " " + mo[1]);
                    Date da = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH).parse(mo[0] + " " + dalle);
                    Date a = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH).parse(mo[0] + " " + alle);

                    //JOptionPane.showMessageDialog(this, da + " e " + now.compareTo(a));
                    if (adesso.after(da) && adesso.before(a)) {
                        idTurnoAttuale = rs.getLong("id");
                        nomeTurnoAttuale = rs.getString("nome");

                        break;
                    }

                } catch (Exception e) {
                    LogManager.getLogger(PuntoCassa.class).error(e);
                }
            }
            rs.close();
            st.close();
            dbConnection.close();
        } catch (SQLException e) {

            JOptionPane.showMessageDialog(this, "Errore DB ['" + query + "']");
        }

    }

    private void impostaAmbiente() {
        // -----------------------------------------------------------
        // ** id punto cassa
        // -----------------------------------------------------------
        idPuntoCassa = Utils.mySelectInteger("select Punti_Cassa.id as idPC from Punti_Cassa where Punti_Cassa.id=" + idPuntoCassa, "idPC",
                this);

        // -----------------------------------------------------------
        // ** Imposta l'ambiente
        // -----------------------------------------------------------
        txtUsername.setEnabled(false);
        txtPassword.setEnabled(false);
        btnLogin.setEnabled(false);
        addRemoveKeyDispatcher(true);
        aggiungiImmaginiPulsanti();
        if (jChLogin.isSelected() == false && utenteLoggato.length() <= 0) {
            utenteLoggato = txtUsername.getText();
        }

        lblUtenteLoggato.setText("LogIn: [" + utenteLoggato + "]");
        this.resize();
        this.caricaDati("CATEGORIE", "0");
        pnlErrore.setVisible(false);
        pnlLogin.setVisible(false);
        pnlTop.setVisible(true);
        pnlProdotti.setVisible(true);
        jBtnStorno.setEnabled(false);
        jBtnAsporto.setEnabled(false);
        jbtnSu.setEnabled(false);
        jbtnGiu.setEnabled(false);
        jbtnElimina.setEnabled(false);
        jbtnAnnulla.setEnabled(false);
        jbtnDuplica.setEnabled(false);

        String pulsante = Utils.mySelect("SELECT p.flag_imposta_tessera as Pulsante "
                + "FROM punti_distribuzione p, punti_cassa c "
                + "WHERE c.id_punto_distribuzione = p.id AND c.id =" + idPuntoCassa, "Pulsante",
                this);
        if (Integer.parseInt(pulsante) == 1) {
            bottoneImposta = true;
            btnImpostaCliente.setVisible(true);
            btnImpostaCliente.setEnabled(true);

            jTxtTessera.setEnabled(true);
        } else {
            bottoneImposta = false;
            btnImpostaCliente.setEnabled(false);
            jTxtTessera.setEnabled(false);
        }

        if (idPuntoCassa != 0) {
            aggiornaProgressivi();

            if (btnImpostaCliente.isVisible()) {
                btnImpostaCliente.setEnabled(false);
            }
            jBtnprodotti.setEnabled(false);
            meteo();
            if (btnImpostaCliente.isVisible()) {
                btnImpostaCliente.setEnabled(bottoneImposta);
            }
            jBtnprodotti.setEnabled(true);
            jbtnDuplica.setText("<html>Duplica<br />Prodotto</html>");
            jbtnElimina.setText("<html>Elimina<br />Prodotto</html>");

            caricaModiPagamento();
            verificaModoPagamento();
            pulsantiModoPagamento();

            //modifica 09-5-2018------------------------------------
            if (flagPrecaricaLista) {
                abilitaPulsanti(pnlCategorie, true, true);
                abilitaPulsanti(pnlProdotti, true, true);
                idProfiloTariffarioDefault = Utils.mySelectInteger("select Valore from Parametri where upper(chiave)='IDFASCIADEFAULT'", "Valore",
                        this);
                System.out.print("" + idProfiloTariffarioDefault);

                apriCassaDefault();
            }

        } else {
            JOptionPane.showMessageDialog(this, "ID Punto Cassa non configurato!");
        }
    }

    private void verificaDB() {
        final Timer timer = new Timer();
        final TimerTask task = new TimerTask() {
            @Override
            public void run() {
                Long res = Utils.mySelectInteger("SELECT db_remoto_connesso as Stato FROM dual", "Stato",
                        PuntoCassa.this);
                if (res == 1) {
                    lblDB.setBackground(Color.green);
                } else {
                    lblDB.setBackground(Color.red);
                }
                lblDB.setOpaque(true);
                lblDB.repaint();
            }
        };

        timer.schedule(task, 1000, 10000);

    }

    public void aggiornaProgressivi() {
        // -----------------------------------------------------------
        // ** progressivo assoluto scontrino
        // -----------------------------------------------------------

        String prog = Utils.mySelect("select nvl(max(prog_assoluto),0) as Prog from Progressivi where id_Punto_cassa=" + idPuntoCassa, "Prog",
                this);

//        if(progressivo < Long.parseLong(prog)){
        progressivo = Long.valueOf(prog);
//        }

        // -----------------------------------------------------------
        // ** progressivo giorno turno scontrino
        // -----------------------------------------------------------
        Date now = new Date();
        String progT = Utils.mySelect("select nvl(max(prog_turno),0) as Prog from Progressivi where id_Punto_cassa=" 
                + idPuntoCassa + " and id_Turno=" + idTurno + " and data=" + formattaData(now), 
                "Prog",
                this);
        progressivoTurno = Long.valueOf(progT);

        String progG = Utils.mySelect("select nvl(max(prog_giorno),0) as Prog from Progressivi where id_Punto_cassa=" 
                + idPuntoCassa + " and data=" + formattaData(now), "Prog",
                this);
        progressivoGiorno = Long.valueOf(progG);

        String controlloTurno = Utils.mySelect("select count(*) as Prog from Progressivi where id_Punto_cassa=" 
                + idPuntoCassa + " and data=" + formattaData(now) + " and id_Turno=" + idTurno, "Prog",
                this);
        if (Long.parseLong(controlloTurno) <= 0) {
            Utils.myInsert("Insert into Progressivi (data,id_Punto_cassa,id_Turno,prog_assoluto,prog_giorno,prog_turno) "
                    + " values (" + formattaData(now) + "," + idPuntoCassa + "," + idTurno + "," + progressivo + "," + progressivoGiorno + ",0)", 
                    this);          
        }

        // -----------------------------------------------------------
        // ** incassi turno pagamento a scalare
        // -----------------------------------------------------------
        String progPS = Utils.mySelect("select nvl(sum(incasso_turno_scalare),0) as Prog from Progressivi where id_Punto_cassa=" 
                + idPuntoCassa + " and id_Turno=" + idTurno + " and data=" + formattaData(now), "Prog",
                this);
        progressivoScalare = Double.valueOf(progPS);

        // -----------------------------------------------------------
        // ** incassi turno pagamento a contanti
        // -----------------------------------------------------------
        String progPC = Utils.mySelect("select nvl(sum(incasso_turno_contanti),0) as Prog from Progressivi where id_Punto_cassa=" 
                + idPuntoCassa + " and id_Turno=" + idTurno + " and data=" + formattaData(now), "Prog",
                this);
        progressivoContanti = Double.valueOf(progPC);

        // -----------------------------------------------------------
        // ** incassi turno pagamento ticket
        // -----------------------------------------------------------
        String progPT = Utils.mySelect("select nvl(sum(incasso_turno_ticket),0) as Prog from Progressivi where id_Punto_cassa=" 
                + idPuntoCassa + " and id_Turno=" + idTurno + " and data=" + formattaData(now), "Prog",
                this);
        progressivoTicket = Double.valueOf(progPT);

        // -----------------------------------------------------------
        // ** incassi turno pagamento differito
        // -----------------------------------------------------------
        String progDI = Utils.mySelect("select nvl(sum(incasso_turno_differito),0) as Prog from Progressivi where id_Punto_cassa=" 
                + idPuntoCassa + " and id_Turno=" + idTurno + " and data=" + formattaData(now), "Prog",
                this);
        progressivoDifferito = Double.valueOf(progDI);
        aggiornaLabelInfo();

        if (cercaTestoModoPagamento().equalsIgnoreCase("A scalare") && jTxtTessera.getText().length() > 0) {
            verificaSaldo(jTxtTessera.getText());

        }

    }

    private void aggiornaLabelInfo() {
        Long prog = progressivo;// - 1;
        Long progGG = progressivoGiorno;// - 1;
        Long progTurno = progressivoTurno;// - 1;
        if (progressivo <= 0) {
            prog = 0L;
        }
        if (progressivoGiorno <= 0) {
            progGG = 0L;
        }
        if (progressivoTurno <= 0) {
            progTurno = 0L;
        }

        lblInfo.setText("Passaggi: Tot. [" + prog + "], giorno [" + progGG + "], turno [" + progTurno + "]");
        DecimalFormat df2 = new DecimalFormat("#,###,###,##0.00");
        lblInfo2.setText("Incassi [" + nomeTurno + "]: Tot. [" + 
                df2.format(progressivoScalare + progressivoContanti + progressivoTicket + progressivoDifferito) + "] SC [" + 
                df2.format(progressivoScalare) + "], CO [" + 
                df2.format(progressivoContanti) + "], TI [" + 
                df2.format(progressivoTicket) + "], DI [" + 
                df2.format(progressivoDifferito) + "]");
    }

    public void addRemoveKeyDispatcher(Boolean aggiungi) {
        if (aggiungi) {
            if (keyDespatcherAttivo == false) {
                KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(keyDispatcher);
                keyDespatcherAttivo = true;
            }
        } else {

            KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(keyDispatcher);
            keyDespatcherAttivo = false;
        }

    }

    private void meteo() {
        String spia = Utils.mySelect("select controlla_meteo(" + idPuntoCassa + ") as res from dual", "res",
                this);
        if (Integer.parseInt(spia) == 1) {
            if (myMeteoForm == null) {
                myMeteoForm = new FrmMeteo(this, idPuntoCassa, true);

                this.setEnabled(false);
                Integer w = calcolaLarghezzaAltezza(300, largControlli);
                Integer h = calcolaLarghezzaAltezza(70, altControlli);

                myMeteoForm.setSize(w, h);
                myMeteoForm.setLocationRelativeTo(null);
                myMeteoForm.setVisible(true);
            }
        }

    }
   private void resizeRules(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_resizeRules
       resize();
   }//GEN-LAST:event_resizeRules

    private void jbtnSuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnSuActionPerformed
        // TODO add your handling code here:
        if (tblLista.getSelectedRow() > 0) {
            tblLista.setRowSelectionInterval(tblLista.getSelectedRow() - 1, tblLista.getSelectedRow() - 1);
            tblLista.scrollRectToVisible(new Rectangle(tblLista.getCellRect(tblLista.getSelectedRow(), 0, true)));
        }
    }//GEN-LAST:event_jbtnSuActionPerformed

    private void jbtnDuplicaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnDuplicaActionPerformed
        // TODO add your handling code here:
        if (tblLista.getSelectedRow() >= 0) {
            MyTableModel model = (MyTableModel) tblLista.getModel();
            Object row[] = model.getRow(tblLista.getSelectedRow());
            Boolean isComposizione = false;
            if (Long.parseLong(row[5].toString()) == 0L) {
                isComposizione = true;
            }
            if (isComposizione) {
                JOptionPane.showOptionDialog(this, "Composizione già presente!", "Attenzione",
                        JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, null, null);
            } else {

                model.addRow(row);
                tblLista.setRowSelectionInterval(model.getRowCount() - 1, model.getRowCount() - 1);
                tblLista.setModel(model);

                controllaCompleti(model);
                controllaExtra(model);
                sommaColonne(model);
            }
        }
    }//GEN-LAST:event_jbtnDuplicaActionPerformed

    private void jbtnGiuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnGiuActionPerformed
        // TODO add your handling code here:
        if (tblLista.getSelectedRow() < tblLista.getRowCount() - 1) {
            tblLista.setRowSelectionInterval(tblLista.getSelectedRow() + 1, tblLista.getSelectedRow() + 1);
            tblLista.scrollRectToVisible(new Rectangle(tblLista.getCellRect(tblLista.getSelectedRow(), 0, true)));
        }
    }//GEN-LAST:event_jbtnGiuActionPerformed

    private void jbtnStampaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnStampaActionPerformed

        Boolean ok = Utils.myInsert("UPDATE PARAMETRI set valore='NO' where chiave='FlagDownloadInCorso'", 
                this);
        if (ok) {
            JOptionPane.showOptionDialog(this, "Operazione correttamente eseguita.", "Attenzione",
                    JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
        } else {
            JOptionPane.showOptionDialog(this, "Errore nell'aggiornamento del parametro!", "Attenzione",
                    JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, null, null);
        }
    }//GEN-LAST:event_jbtnStampaActionPerformed
    private void cancellaComposizioni() {
        try {
            MyTableModel model1 = (MyTableModel) tblLista1.getModel();
            //clearTable(model1);
            model1.clearTable();
        } catch (Exception e) {
        }
    }
    private void jbtnEliminaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnEliminaActionPerformed
        cancellaComposizioni();
        MyTableModel model = (MyTableModel) tblLista.getModel();
        Integer riga = tblLista.getSelectedRow();
        if (riga >= 0) {
            model.deleteRow(riga);
            //ripristino i prezzi
            for (Integer i = 0; i < model.getRowCount(); i++) {
                model.setValueAt(model.getValueAt(i, colImporto2), i, colImporto);
            }
            //doLayout();
            if (tblLista.getRowCount() > 0) {
                if (riga > 0) {
                    tblLista.setRowSelectionInterval(riga - 1, riga - 1);
                } else {
                    tblLista.setRowSelectionInterval(0, 0);
                }
            }

            controllaCompleti(model);
            controllaExtra(model);
            sommaColonne(model);

            //spengo altri togglebutton
            for (Integer y = 0; y < this.pnlProdotti.getComponentCount(); y++) {
                JToggleButton bt = (JToggleButton) this.pnlProdotti.getComponent(y);
                bt.setSelected(false);
            }
            if (model.getRowCount() <= 0) {
                jbtnSu.setEnabled(false);
                jbtnGiu.setEnabled(false);
                jbtnElimina.setEnabled(false);
                jbtnAnnulla.setEnabled(false);
                jbtnDuplica.setEnabled(false);

            }
            doLayout();
        }

    }//GEN-LAST:event_jbtnEliminaActionPerformed

    private void jbtnChiudiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnChiudiActionPerformed

        if (verificaPrenotazioni()) {
            chiudi();
        }
    }//GEN-LAST:event_jbtnChiudiActionPerformed

    private boolean verificaPrenotazioni() {
        boolean ok = true;
        if (idTessera > 0L && idPrenotazione > 0L) {
            MyTableModel model = (MyTableModel) tblLista.getModel();
            StringBuilder elencoIdProdotti = new StringBuilder();
            for (int i = model.getRowCount() - 1; i >= 0; i--) {
                Long idCateg = Long.valueOf(model.getValueAt(i, colCategoria).toString());
                if (idCateg != 0L) {
                    elencoIdProdotti.append(model.getValueAt(i, colIDProdotto));
                    elencoIdProdotti.append(",");
                }
            }
            ok = controllaDiscrepanzePrenotazioni(elencoIdProdotti.toString());
            aggiornaPrenotazioni(elencoIdProdotti.toString());
        }
        return ok;
    }

    private String getNumeroTessera() {
        MyApplication myApp = new MyApplication();
        String nTessera = "";
        try {

            myApp.idTesseraA = "";
            String[] listReader;

            listReader = myApp.smartCard.listReaders();
            myApp.smartCard.setReader(listReader[0]);

            myApp.smartCard.connect("T=1");
            myApp.smartCard.getCurrentCardATR();

            String nTess = "";
            myApp.sendAPDU(this, "d000", "00", "A4", "00", "00", "02", "");
            myApp.sendAPDU(this, "d100", "00", "A4", "00", "00", "02", "");
            myApp.sendAPDU(this, "d101", "00", "A4", "00", "00", "02", "");
            String[] CF = myApp.sendAPDU(this, "", "00", "B0", "00", "00", "00", "140").split("\\|");

            myApp.sendAPDU(this, "3f00", "00", "A4", "00", "00", "02", "");
            myApp.sendAPDU(this, "1000", "00", "A4", "00", "00", "02", "");
            myApp.sendAPDU(this, "1003", "00", "A4", "00", "00", "02", "");
            nTess = myApp.sendAPDU(this, "", "00", "B0", "00", "00", "00", "14");

            myApp.smartCard.disconnect();
            if (CF.length > 1) {
                nTessera = nTess;
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, "Card Reader non collegato o errore di lettura!", 
                    "jBtnReadCardActionPerformed", JOptionPane.ERROR_MESSAGE);

        } finally {

            return nTessera;
        }

    }
    private void formWindowDeiconified(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowDeiconified
        // TODO add your handling code here:
        resize();
    }//GEN-LAST:event_formWindowDeiconified
    private void setTastiera(java.awt.event.MouseEvent evt) {
        setTastieraAfterEvent(evt);
    }    

    private void setTastiera(java.awt.event.FocusEvent evt) {
        setTastieraAfterEvent(evt);
    }
    
    private void setTastieraAfterEvent(ComponentEvent evt) {
        MyApplication myApp = new MyApplication();
        if (jChLogin.isSelected() == false) {
            if (myApp.tastieraVideo) {
                if (myApp.ultimoTxt.equalsIgnoreCase(evt.getComponent().toString())) {
                    myApp.ultimoTxt = " ";
                } else {
                    myApp.ultimoTxt = evt.getComponent().toString();
                    Rectangle pnl = pnlLogin.getBounds();

                    setTastiera((JTextField) evt.getComponent(), pnl.x, pnl.y);
                }
            }
        }
    }
    
    
    private void jbtnEsciActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnEsciActionPerformed
        Object[] options = {"Si", "No"};
        Object selectedValue = JOptionPane.showOptionDialog(this, "Confermi chiusura sessione?", "Attenzione",
                JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
        if (Integer.parseInt(selectedValue.toString()) == 0) {           
            pnlErrore.setVisible(false);
            pnlLogin.setVisible(true);
            pnlTop.setVisible(false);
            pnlProdotti.setVisible(false);
            utenteLoggato = "";
            idAccount = 0L;
            lblUtenteLoggato.setText("[Nessun Utente Connesso]");
            lblInfo.setText("[Info Turno]");
            lblInfo2.setText("[Info Incassi]");
            txtPassword.setEnabled(true);
            txtUsername.setEnabled(true);
            btnLogin.setEnabled(true);
            pnlCategorie.removeAll();
            pnlProdotti.removeAll();
            addRemoveKeyDispatcher(false);
            jChLoginActionPerformed(null);
            azzera();
            statoAttivoNonLoggato();
        } 
    }//GEN-LAST:event_jbtnEsciActionPerformed

    private void jBtnStornoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnStornoActionPerformed
        apriStorno(false);

    }//GEN-LAST:event_jBtnStornoActionPerformed

    private void apriStorno(Boolean daPassaggi) {
        FrmStorno jFrameStorno = new FrmStorno(this, idTessera, idPuntoCassa, imgPath, daPassaggi);
        this.setEnabled(false);
        Integer w = calcolaLarghezzaAltezza(550, largControlli);
        Integer h = calcolaLarghezzaAltezza(250, altControlli);

        jFrameStorno.setSize(w, h);
        jFrameStorno.setLocationRelativeTo(null);
        jFrameStorno.setVisible(true);
    }
    private void jBtnprodottiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnprodottiActionPerformed
        FrmProdotti jFrameProdotti = new FrmProdotti(this, imgPath);

        this.setEnabled(false);
        Integer w = calcolaLarghezzaAltezza(550, largControlli);
        Integer h = calcolaLarghezzaAltezza(250, altControlli);

        jFrameProdotti.setSize(w, h);
        jFrameProdotti.setLocationRelativeTo(null);
        jFrameProdotti.setVisible(true);
    }//GEN-LAST:event_jBtnprodottiActionPerformed

    private void selezionaTipoPagamento(int idTipo) {
        String tipo = setModoPagamento(idTipo);

        lblTipoPagamento.setText(tipo);
        if (tipo.equalsIgnoreCase("A scalare") && jTxtTessera.getText().length() > 0) {
            verificaSaldo(jTxtTessera.getText());

        }
    }

    public void clickModoPagamento(String ModoPagamento) {
        if (isCassaAperta == false) {
            isCassaAperta = true;
            idProfiloTariffario = 0L;
            idTessera = 0L;
        }

        lblResiduo.setText("[...]");
        lblSaldo.setText("[...]");
        lblTipoPagamento.setText(ModoPagamento);
    }

    public void clickCarta() {
        if (saldoAcquisti(0.0) == false && consentiCredito == false) {
            JOptionPane.showOptionDialog(this, "Saldo tessera insufficiente!", "Attenzione",
                    JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, null, null);
            return;
        }
        
        if (isCassaAperta == true) {
            lblResiduo.setText("[...]");
            setModoPagamento("A scalare");
            String tipo = cercaTestoModoPagamento();
            lblTipoPagamento.setText(tipo);

        }
    }

    private void aggiornaDB(Boolean messaggio) {
        try {
            Boolean aggiorna = false;
            if (messaggio) {
                Object[] options = {"Si", "No"};
                Object selectedValue = JOptionPane.showOptionDialog(this, "Confermi aggiornamento del database locale?", "Attenzione",
                        JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
                if (Integer.parseInt(selectedValue.toString()) != 0) {
                    return;
                } else {
                    aggiorna = true;
                }
            } else {
                aggiorna = true;
            }
            if (aggiorna) {

                myProgressForm = new FrmProgress(this);

                this.setEnabled(false);
                Integer w = calcolaLarghezzaAltezza(300, largControlli);
                Integer h = calcolaLarghezzaAltezza(100, altControlli);
                myProgressForm.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                myProgressForm.setResizable(false);
                myProgressForm.setTitle("Aggiornamento Database...");
                myProgressForm.setSize(w, h);
                myProgressForm.setLocationRelativeTo(null);
                myProgressForm.setVisible(true);
                myProgressForm.repaint();

                EventQueue.invokeLater(new Runnable() {
                    @Override
                    public void run() {

                        try {
                            Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
                            String plsql = "begin lancia_aggiorna_tabelle('S'); end;";
                            CallableStatement st = dbConnection.prepareCall(plsql);
                            st.execute();
                            st.close();
                            dbConnection.close();
                            PuntoCassa.this.myProgressForm.dispose();
                            //12/09/2016
                            if (PuntoCassa.this.pnlLogin.isVisible() == false) {
                                //23-12-15
                                PuntoCassa.this.impostaAmbiente();
                                PuntoCassa.this.setEnabled(true);
                            }

                            String esito = Utils.mySelect("SELECT esito FROM esiti where id = (select max(id) from esiti)", "esito",
                                    PuntoCassa.this);
                            JOptionPane.showOptionDialog(PuntoCassa.this, esito, "Aggiornamento Database", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, null, null);
                        } catch (Exception e) {
                            JOptionPane.showMessageDialog(PuntoCassa.this, "Errore " + e.getMessage());
                        }
                    }
                });
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Errore " + e.getMessage());

        }
    }
    private void txtTotaleCassaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtTotaleCassaActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_txtTotaleCassaActionPerformed

    private void jBtnReadCardActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnReadCardActionPerformed
        // TODO add your handling code here:
        jTxtTessera.setText("");
        String nTessera = getNumeroTessera();
        jTxtTessera.setText(nTessera);
    }//GEN-LAST:event_jBtnReadCardActionPerformed

    private void jTxtTesseraFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTxtTesseraFocusGained
        MyApplication myApp = new MyApplication();
        if (myApp.tastieraVideo) {
            if (myApp.ultimoTxt.equalsIgnoreCase(evt.getComponent().toString())) {
                myApp.ultimoTxt = " ";
            } else {
                myApp.ultimoTxt = evt.getComponent().toString();

                Rectangle pnl = pnlLogin.getBounds();
                setTastiera((JTextField) evt.getComponent(), pnl.x, pnl.y);
            }
        }
    }//GEN-LAST:event_jTxtTesseraFocusGained

    private void btnImpostaClienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnImpostaClienteActionPerformed
        FrmCerca jFrameCerca = new FrmCerca(this, jTxtTessera, imgPath, "", flagMostraDataDiNascita);

        this.setEnabled(false);
        Integer w = calcolaLarghezzaAltezza(650, largControlli);
        Integer h = calcolaLarghezzaAltezza(250, altControlli);

        jFrameCerca.setSize(w, h);
        jFrameCerca.setLocationRelativeTo(null);
        jFrameCerca.setVisible(true);


    }//GEN-LAST:event_btnImpostaClienteActionPerformed

    private void jbtnAnnullaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnAnnullaActionPerformed
        MyTableModel model = (MyTableModel) tblLista.getModel();
        if (model.getRowCount() > 0) {
            Object[] options = {"Si", "No"};
            Object selectedValue = JOptionPane.showOptionDialog(this, "Desideri annullare tutte le righe?", "Attenzione",
                    JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
            if (Integer.parseInt(selectedValue.toString()) == 0) {
                annulla();
                doLayout();
            } 
        }
    }//GEN-LAST:event_jbtnAnnullaActionPerformed
    private void annulla() {
        try {
            MyTableModel model = (MyTableModel) tblLista.getModel();
            MyTableModel model1 = (MyTableModel) tblLista1.getModel();
            //clearTable(model);
            //clearTable(model1);
            model.clearTable();
            model1.clearTable();
            jbtnSu.setEnabled(false);
            jbtnGiu.setEnabled(false);
            jbtnElimina.setEnabled(false);
            jbtnAnnulla.setEnabled(false);
            jbtnDuplica.setEnabled(false);
            sommaColonne(model);

            if (idTessera == 0L) {
                jbtnChiudi.setEnabled(false);
            } else {
                jbtnChiudi.setEnabled(true);
            }

            //spengo altri togglebutton
            for (Integer y = 0; y < this.pnlProdotti.getComponentCount(); y++) {
                JToggleButton bt = (JToggleButton) this.pnlProdotti.getComponent(y);
                bt.setSelected(false);
            }

        } catch (Exception e) {
            LogManager.getLogger(PuntoCassa.class).error(e);
        }

    }
    private void jBtnAsportoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnAsportoActionPerformed
        if (jBtnAsporto.isSelected()) {
            aggiungImmagini(jBtnAsporto, "da asporto.jpg", 50, 50);
        } else {
            aggiungImmagini(jBtnAsporto, "coltello e forchetta.jpg", 50, 50);
        }
    }//GEN-LAST:event_jBtnAsportoActionPerformed

    private void txtTotalePuntiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtTotalePuntiActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_txtTotalePuntiActionPerformed

    private void jBtnMovimentiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnMovimentiActionPerformed
        FrmMovimenti jFrameMovimenti = new FrmMovimenti(this, idTessera, idPuntoCassa, imgPath);

        this.setEnabled(false);
        Integer w = calcolaLarghezzaAltezza(680, largControlli);
        Integer h = calcolaLarghezzaAltezza(250, altControlli);

        jFrameMovimenti.setSize(w, h);
        jFrameMovimenti.setLocationRelativeTo(null);

        jFrameMovimenti.setVisible(true);
    }//GEN-LAST:event_jBtnMovimentiActionPerformed

    private void jBtnBuoniActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnBuoniActionPerformed

        FrmCerca jFrameCerca = new FrmCerca(this, jTxtTessera, imgPath, "BP", flagMostraDataDiNascita);
        this.setEnabled(false);
        Integer w = calcolaLarghezzaAltezza(650, largControlli);
        Integer h = calcolaLarghezzaAltezza(250, altControlli);

        jFrameCerca.setSize(w, h);
        jFrameCerca.setLocationRelativeTo(null);

        jFrameCerca.setVisible(true);

    }//GEN-LAST:event_jBtnBuoniActionPerformed

    private void jBtnDB1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnDB1ActionPerformed
        // TODO add your handling code here:
        aggiornaDB(true);
    }//GEN-LAST:event_jBtnDB1ActionPerformed

    private void jChLoginActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jChLoginActionPerformed
        // TODO add your handling code here:
        txtUsername.setEnabled(!jChLogin.isSelected());
        txtPassword.setEnabled(!jChLogin.isSelected());
        btnLogin.setEnabled(!jChLogin.isSelected());
        addRemoveKeyDispatcher(jChLogin.isSelected());
    }//GEN-LAST:event_jChLoginActionPerformed

    private void btnTerminaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnTerminaActionPerformed
        // TODO add your handling code here:
        exitForm(null);
    }//GEN-LAST:event_btnTerminaActionPerformed

    private void txtPasswordMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_txtPasswordMouseClicked
        setTastiera(evt);
    }//GEN-LAST:event_txtPasswordMouseClicked

    private void txtPasswordFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPasswordFocusGained
        setTastiera(evt);
    }//GEN-LAST:event_txtPasswordFocusGained

    private void txtUsernameMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_txtUsernameMouseClicked
        setTastiera(evt);
    }//GEN-LAST:event_txtUsernameMouseClicked

    private void txtUsernameFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtUsernameFocusGained
        setTastiera(evt);

    }//GEN-LAST:event_txtUsernameFocusGained

    private void btnLoginActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnLoginActionPerformed
        if (turno()) {

            String sql, pwd;
            int counter;
            //int hash = 0;
            //Statement st;
            //ResultSet rs;

            //pwd = new String();
            //sql = new String();

            // =======================================================================
            // *** Verifica la correttezza delle credenziali inserite - Account
            // =======================================================================
            sql = "SELECT count(*) as counter FROM accounts WHERE username = '" + this.txtUsername.getText() + "'";
            //MyApplication myApp = new MyApplication();
            counter = Integer.parseInt(Utils.mySelect(sql, "Counter", this));

            // ====================================================================
            // ** Verifica la password
            // ====================================================================
            if (counter == 1) {
                //Encoding en = new Encoding();
                pwd = new String(txtPassword.getPassword());
                sql = "SELECT id || '|' || id_Stato as res FROM accounts WHERE username = '" + this.txtUsername.getText() + "' "
                        + "and password = '" + Encoding.encodeString(pwd) + "'";
                //String[] el = myApp.mySelect(this, sql, "res").split("\\|");
                String[] el = Utils.mySelect(sql, "res",this).split("\\|");
                //if (myApp.isNumeric(el[0])) {
                if (Utils.isNumeric(el[0])) {
                    idAccount = Long.valueOf(el[0]);
                    if (Integer.parseInt(el[1]) == 2) {
                        //String messaggio = myApp.mySelect(this, "Select Descrizione from Stati_Accounts where id=" + el[1], "descrizione");
                        String messaggio = Utils.mySelect("Select Descrizione from Stati_Accounts where id=" + el[1], "descrizione",
                                this);
                        JOptionPane.showMessageDialog(this, messaggio + ".");
                        return;

                    }
                } else {
                    idAccount = 0L;
                }

                if (idAccount > 0L) {
                    sql = "SELECT count(*) as Counter FROM profili p WHERE p.id_account = " + idAccount + " AND p.id_ruolo IN (3, 10000000004)";
                    //counter = Integer.parseInt(myApp.mySelect(this, sql, "Counter"));
                    counter = Integer.parseInt(Utils.mySelect(sql, "Counter", this));

                    if (counter > 0) {
                        impostaAmbiente();
                        txtUsername.setText("");
                        txtPassword.setText("");
                        statoAttivoLoggato();
                        verificaAggiornamentoDB();

                    } else {
                        JOptionPane.showMessageDialog(this, "L'utente non dispone dei privilegi per l'utilizzo del modulo cassa.");
                    }

                } else {
                    JOptionPane.showMessageDialog(this, "Password errata.");
                }

                // --------------------------------------------------------------
                // *** Errore SQL in verifica password
                // --------------------------------------------------------------
                // =================================================================
                // ** Caso account sconosciuto
                // =================================================================
            } else {
                JOptionPane.showMessageDialog(this, "Account sconosciuto.");
            }

        } else {
            JOptionPane.showMessageDialog(this, "Impossibile eseguire il Login al sistema:\nNessun Turno Attivo!");
        }
    }//GEN-LAST:event_btnLoginActionPerformed
    //a scalare
    private void jTBP0ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTBP0ActionPerformed
        if (jTBP0.isSelected()) {
            try {
                jTBP0.setEnabled(false);
                jTBP1.setSelected(false);
                jTBP1.setEnabled(true);
                jTBP2.setSelected(false);
                jTBP2.setEnabled(true);
                jTBP3.setSelected(false);
                jTBP3.setEnabled(true);
                selezionaTipoPagamento(0);

                MyTableModel modelX = (MyTableModel) tblLista.getModel();
                sommaColonne(modelX);

            } catch (Exception ex) {
                LogManager.getLogger(PuntoCassa.class).error(ex);
            }

        }
    }//GEN-LAST:event_jTBP0ActionPerformed
    //contanti
    private void jTBP1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTBP1ActionPerformed

        if (jTBP1.isSelected()) {
            jTBP1.setEnabled(false);
            jTBP0.setSelected(false);
            jTBP0.setEnabled(true);
            jTBP2.setSelected(false);
            jTBP2.setEnabled(true);
            jTBP3.setSelected(false);
            jTBP3.setEnabled(true);
            selezionaTipoPagamento(1);
        }
    }//GEN-LAST:event_jTBP1ActionPerformed
    //ticket
    private void jTBP2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTBP2ActionPerformed
        if (jTBP2.isSelected()) {
            jTBP2.setEnabled(false);
            jTBP1.setSelected(false);
            jTBP1.setEnabled(true);
            jTBP0.setSelected(false);
            jTBP0.setEnabled(true);
            jTBP3.setSelected(false);
            jTBP3.setEnabled(true);
            selezionaTipoPagamento(2);
        }
    }//GEN-LAST:event_jTBP2ActionPerformed
    //differito
    private void jTBP3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTBP3ActionPerformed
        if (jTBP3.isSelected()) {
            jTBP3.setEnabled(false);
            jTBP1.setSelected(false);
            jTBP1.setEnabled(true);
            jTBP2.setSelected(false);
            jTBP2.setEnabled(true);
            jTBP0.setSelected(false);
            jTBP0.setEnabled(true);
            selezionaTipoPagamento(3);
        }
    }//GEN-LAST:event_jTBP3ActionPerformed

    private void setTastiera(JTextField jTxt, Integer MyX, Integer MyY) {

        MyKeyBoard keyboard = new MyKeyBoard(this, false);
        keyboard.txt = jTxt;
        keyboard.parent = this;
        Rectangle s = this.getBounds();
        Rectangle s2 = jTxt.getBounds();
        Integer l = s.x + s2.x + MyX;
        if (l + 800 > s.x + s.width) {
            l = s.x + s.width - 800;
        }
        keyboard.setBounds(l, s.y + s2.y + 60 + MyY, 800, 300);
        keyboard.setVisible(true);

    }

    private Boolean verificaSaldo(String numeroTessera) {
        Boolean OK = false;

        //andare su viewtessere
        String querySaldo = "select t.saldo || '|' || cf.saldo_minimo_alert || '|' || cf.saldo_minimo_stop || '|' || t.punti || '|' as saldi "
                + " from tessere t, utenti u, categorie_utenti c, categorie_utenti_fasce cf"
                + " where t.numero = '" + numeroTessera + "' and t.id_utente = u.id"
                + " and u.id_categoria = c.id and cf.id_categoria_utenti = c.id";

        String[] saldoMinimo = Utils.mySelect(querySaldo, "saldi", this).split("\\|");
        Double saldo = 0.0;
        if (saldoMinimo.length > 0 && saldoMinimo[0].length() > 0) {
            saldo = Double.valueOf(saldoMinimo[0].replace(",", "."));
        }
        Double saldoAlert = 0.0;
        if (saldoMinimo.length > 1 && saldoMinimo[1].length() > 0) {
            saldoAlert = Double.valueOf(saldoMinimo[1].replace(",", "."));
        }
        Double saldoStop = 0.0;
        if (saldoMinimo.length > 2 && saldoMinimo[2].length() > 0) {
            saldoStop = Double.valueOf(saldoMinimo[2].replace(",", "."));
        }
        saldoMinimoStop = saldoStop;
        String punti = "";
        if (saldoMinimo.length >= 4) {
            punti = saldoMinimo[3];
        }

        DecimalFormat df2 = new DecimalFormat("#,###,###,##0.00");
        lblSaldo.setText("? " + df2.format(saldo));

        //24-01-2020--------------------------
        MyTableModel model = (MyTableModel) tblLista.getModel();
        Double t = model.somma(colImporto);
        MyTableModel model2 = (MyTableModel) tblLista1.getModel();
        if (model2.getRowCount() > 0) {
            t = t + model2.somma(1);
        }
        //---------------------------
        lblResiduo.setText("? " + df2.format(saldo - t));
        lblPunti.setText(punti);
        String tipo = cercaTestoModoPagamento();
        lblTipoPagamento.setText(tipo);

        //21/12/2016  if (gratuitaResidue <= 0) {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        if (gratuitaResidue <= 0 && (flagBonus == 0 || bonusResidui <= 0)) {
            if ((saldo - calcolaTotale()) <= saldoStop) {

                //31-10-2019 se lista precaricata e saldo <0 devo chudere
                if (stoCalcolando == false) {
                    if (cercaTestoModoPagamento().equalsIgnoreCase("A scalare")) {
                        if ((saldo - calcolaTotale()) < 0) {
                            JOptionPane.showMessageDialog(this, "Saldo insufficiente!", "Saldo", JOptionPane.OK_OPTION);
                            logTessera();
                            azzera();
                            return true;
                        }
                    }
                }
                OK = true;
            } else if (saldo <= saldoAlert) {
                JOptionPane.showMessageDialog(this, 
                        "Saldo ridotto, potrebbero non essere disponibili tutti i prodotti!", 
                        "Saldo Alert", JOptionPane.ERROR_MESSAGE);
                OK = true;

            } else {
                OK = true;
            }
        }
        return OK;
    }

    private String cercaTestoModoPagamento() {
        String testo = "";
        String[] el = modiPagamento.toString().split("\\|");
        for (String el1 : el) {
            String[] t = el1.split(";");
            if (t[0].equalsIgnoreCase(idModoPagamento.toString())) {
                testo = t[1];
                break;
            }
        }
        return testo;
    }

    private void setModoPagamento(String Modo) {

        String[] el = modiPagamento.toString().split("\\|");
        for (String el1 : el) {
            String[] t = el1.split(";");
            if (t[1].equalsIgnoreCase(Modo)) {
                idModoPagamento = Long.valueOf(t[0]);
                break;
            }
        }

    }

    private String setModoPagamento(Integer Tipo) {
        String testo = "";
        if (modiPagamento.toString().length() > 5) {
            String[] el = modiPagamento.toString().split("\\|");
            int i = Tipo;
            String[] t = el[i].split(";");
            testo = t[1];
            idModoPagamento = Long.valueOf(Tipo.toString());
            lblResiduo.setText("[...]");
            lblSaldo.setText("[...]");

        }
        return testo;
    }

    private void pulsantiModoPagamento() {
        switch (Integer.parseInt(idModoPagamento.toString())) {
            case 0 -> {
                jTBP0.setEnabled(true);
                jTBP0.setSelected(true);
                jTBP0ActionPerformed(null);
                if (flagImpostaTipoPagamento) {
                    jTBP1.setEnabled(false);
                    jTBP2.setEnabled(false);
                    jTBP3.setEnabled(false);
                }
            }
            case 1 -> {
                jTBP1.setEnabled(true);
                jTBP1.setSelected(true);
                jTBP1ActionPerformed(null);
                if (flagImpostaTipoPagamento) {
                    jTBP0.setEnabled(false);
                    jTBP2.setEnabled(false);
                    jTBP3.setEnabled(false);
                }
            }
            case 2 -> {
                jTBP2.setEnabled(true);
                jTBP2.setSelected(true);
                jTBP2ActionPerformed(null);
                if (flagImpostaTipoPagamento) {
                    jTBP1.setEnabled(false);
                    jTBP0.setEnabled(false);
                    jTBP3.setEnabled(false);
                }
            }
            case 3 -> {
                jTBP3.setEnabled(true);
                jTBP3.setSelected(true);
                jTBP3ActionPerformed(null);
                if (flagImpostaTipoPagamento) {
                    jTBP1.setEnabled(false);
                    jTBP2.setEnabled(false);
                    jTBP0.setEnabled(false);
                }
            }
        }
    }

    private void chiudi() {

        //04-02-2019---------------------------------------------
        MyTableModel model = (MyTableModel) tblLista.getModel();
        if (model.getRowCount() > 0) {
            String numTessera = jTxtTessera.getText();

            if (cercaTestoModoPagamento().equalsIgnoreCase("A scalare")) {

                String querySaldo = "select t.saldo || '|' || cf.saldo_minimo_alert || '|' || cf.saldo_minimo_stop || '|' || t.punti || '|' as saldi "
                        + " from tessere t, utenti u, categorie_utenti c, categorie_utenti_fasce cf"
                        + " where t.numero = '" + numTessera + "' and t.id_utente = u.id"
                        + " and u.id_categoria = c.id and cf.id_categoria_utenti = c.id";

                String[] saldoMinimo = Utils.mySelect(querySaldo, "saldi",this).split("\\|");
                Double saldo = 0.0;
                String residuo = lblResiduo.getText().trim().replace("?", "");
                if (residuo.equalsIgnoreCase("[...]")) {
                    residuo = "0";
                }
                residuo = residuo.replace(".", "");
                residuo = residuo.replace(",", ".");
                saldo = Double.valueOf(residuo);

                Double saldoAlert = 0.0;
                if (saldoMinimo.length > 1 && saldoMinimo[1].length() > 0) {
                    saldoAlert = Double.valueOf(saldoMinimo[1].replace(",", "."));
                }

                if (gratuitaResidue <= 0 && (flagBonus == 0 || bonusResidui <= 0)) {
                    if (saldo <= saldoAlert) {
                        if (consentiCredito == true) {
                            if (messaggioSaldoUnaVolta == false) {
                                if (JOptionPane.showConfirmDialog(null, "Saldo insufficiente. Vuoi autorizzare comunque la transazione?", 
                                        "Saldo", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                                    messaggioSaldoUnaVolta = true;
                                } else {
                                    return;
                                }
                            }
                        } 
                    }
                }
                //--------------------------------------------------------
            } else {

                //Pagamento non a Scalare
                String querySaldo = "select t.saldo  "
                        + " from tessere t, utenti u, categorie_utenti c, categorie_utenti_fasce cf"
                        + " where t.numero = '" + numTessera + "' and t.id_utente = u.id"
                        + " and u.id_categoria = c.id and cf.id_categoria_utenti = c.id";

                Double saldo = Double.valueOf(Utils.mySelect(querySaldo, "saldo", this));
                Double costoPasto = Double.valueOf(txtTotaleCassa.getText().replace("?", "").trim().replace(",", "."));
                if (saldo > costoPasto) {
                    Object[] options = {"A Scalare", "Contanti"};
                    Object selectedValue = JOptionPane.showOptionDialog(this, 
                            "Attenzione, c'è saldo sufficiente sulla tessera,\nscegli la modalità di pagamento da utilizzare", "Modalità Pagamento",
                            JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, null);
                    if (Integer.parseInt(selectedValue.toString()) == 0) {
                        jTBP0.setSelected(true);
                        jTBP0ActionPerformed(null);

                    } else {
                        jTBP1.setSelected(true);
                        jTBP1ActionPerformed(null);

                    }
                }

            }
        }
        Boolean spiaProgressivo = false;
        //Date adesso = new Date();
        LocalDateTime adesso = LocalDateTime.now();
        String flagPassaggioTessera = "0";
        if (passaggioTessera) {
            flagPassaggioTessera = "1";
        }

        String tessera = idTessera.toString();
        String flagAsporto = "0";
        if (jBtnAsporto.isSelected()) {
            flagAsporto = "1";
        }

        //09-05-2019
        String composizione = Utils.spaziBianchi("", 20, false);
        MyTableModel model2 = (MyTableModel) tblLista1.getModel();
        for (int i = 0; i < model2.getRowCount(); i++) {
            String completo = model2.getValueAt(i, 0).toString();
            String pasto = "";
            if (completo.length() > 0) {
                String TT[] = completo.split("]", -1);
                if (TT.length > 0) {
                    pasto = "Pasto:" + TT[0].replace("[", "");
                }
            }
            composizione = Utils.spaziBianchi(pasto, 10, true);
            break;
        }

        //controllo passaggi   
        if (model.getRowCount() > 0) {
            String controlloPassaggi = "SELECT count(*) as passaggi FROM st_acquisti st "
                    + "INNER JOIN prodotti pr ON st.id_prodotto = pr.id "
                    + "WHERE pr.id_categoria = 0 "
                    + "AND trunc(st.data) = trunc(sysdate) "
                    + "AND st.id_tessera = " + idTessera 
                    + " AND st.id_turno=" + idTurno;
            Long abilitatoPassaggi = Utils.mySelectInteger(controlloPassaggi, "passaggi",
                                                            this);
            if (abilitatoPassaggi > 0) {
                abilitatoPassaggi = abilitatoPassaggi + 1;
                if (JOptionPane.showConfirmDialog(null, 
                        "Sei sicuro di voler registrare il passaggio n° " + abilitatoPassaggi + " sulla tessera " + jTxtTessera.getText() + "?", 
                        "Secondo Passaggio", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) {
                    azzera();
                    aggiornaLabelInfo();
                    return;
                }
            }
        }

        if (idTessera > 0L) {
            StringBuilder elencoIdProdotti = new StringBuilder();
            for (int i = model.getRowCount() - 1; i >= 0; i--) {
                Long idCateg = Long.valueOf(model.getValueAt(i, colCategoria).toString());
                if (idCateg != 0L) {
                    //04/03/2022 non e possibile acquistare prodotti che non siano partedi una composizione
                    String vassoio = "1";
                    Utils.myInsert("Insert into Acquisti "
                            + "(id,id_Tessera,id_Prodotto,id_Punto_Cassa,Data,Importo,Punti,"
                            + "Num_Progressivo,id_Tipo_Pagamento,flag_in_vassoio,id_Turno,flag_asporto,flag_passaggio_tessera)"
                            + "values(-1," + tessera + "," + model.getValueAt(i, colIDProdotto) + "," 
                            //+ idPuntoCassa + "," + formattaDataOra(adesso) + "," 
                            + idPuntoCassa + "," + formatLocalDateTime(adesso) + "," 
                            + model.getValueAt(i, colImporto) + "," + model.getValueAt(i, colPunti) + "," 
                            + progressivo + "," + idModoPagamento + "," + vassoio + "," + idTurno + "," 
                            + flagAsporto + "," + flagPassaggioTessera + ")",
                            this);

                    aggiornaProgressivoPagamentiTurno(Double.valueOf(model.getValueAt(i, colImporto).toString()));
                    elencoIdProdotti.append(model.getValueAt(i, colIDProdotto));
                    elencoIdProdotti.append(",");
                }
                model.deleteRow(i);
                spiaProgressivo = true;
            }

            for (int i = model2.getRowCount() - 1; i >= 0; i--) {
                String flagGratuita = "0";
                String flagBonus = "0";
                if (gratuitaResidue > 0) {// && gratuitaResidue>Gratuita_ResidueProg){
                    flagGratuita = "1";
                } else if (bonusResidui > 0) {
                    flagBonus = "1";
                }

                Utils.myInsert("Insert into Acquisti "
                        + "(id,id_Tessera,id_Prodotto,id_Punto_Cassa,Data,Importo,Punti,Num_Progressivo,id_Tipo_Pagamento,"
                        + "id_Turno,flag_gratuita,flag_bonus,flag_asporto,flag_passaggio_tessera)"
                        + "values(-1," + tessera + "," + model2.getValueAt(i, 2) + "," + idPuntoCassa + "," + 
                        //formattaDataOra(adesso) + "," + model2.getValueAt(i, 1) + ",0," + progressivo + "," + 
                        formatLocalDateTime(adesso) + "," + model2.getValueAt(i, 1) + ",0," + progressivo + "," + 
                        idModoPagamento + "," + idTurno + "," + flagGratuita + "," + flagBonus + "," + 
                        flagAsporto + "," + flagPassaggioTessera + ")",
                        this);
                aggiornaProgressivoPagamentiTurno(Double.valueOf(model2.getValueAt(i, 1).toString()));                
                model2.deleteRow(i);
                spiaProgressivo = true;
            }

        } else {
            StringBuilder elencoIdProdotti = new StringBuilder();
            for (int i = model.getRowCount() - 1; i >= 0; i--) {
                Long idCateg = Long.valueOf(model.getValueAt(i, colCategoria).toString());
                if (idCateg != 0L) {
                    //04/03/2022 non e possibile acquistare prodotti che non siano partedi una composizione
                    String vassoio = "1";
                    Utils.myInsert("Insert into Acquisti (id,id_Prodotto,id_Punto_Cassa,Data,Importo,Punti,Num_Progressivo,id_Tipo_Pagamento,"
                            + "flag_in_vassoio,id_Turno,flag_asporto,flag_passaggio_tessera)values(-1," 
                            //+ model.getValueAt(i, colIDProdotto) + "," + idPuntoCassa + "," + formattaDataOra(adesso) + "," 
                            + model.getValueAt(i, colIDProdotto) + "," + idPuntoCassa + "," + formatLocalDateTime(adesso) + "," 
                            + model.getValueAt(i, colImporto) + "," + model.getValueAt(i, colPunti) 
                            + "," + progressivo + "," + idModoPagamento + "," + vassoio + "," + idTurno + "," 
                            + flagAsporto + "," + flagPassaggioTessera + ")",
                            this);

                    aggiornaProgressivoPagamentiTurno(Double.valueOf(model.getValueAt(i, colImporto).toString()));

                    elencoIdProdotti.append(model.getValueAt(i, colIDProdotto));
                    elencoIdProdotti.append(",");                    
                }
                model.deleteRow(i);
                spiaProgressivo = true;

            }

            for (int i = model2.getRowCount() - 1; i >= 0; i--) {
                String flagGratuita = "0";
                String flagBonusPerInsert = "0";
                if (gratuitaResidue > 0) {// && gratuitaResidue>Gratuita_ResidueProg){
                    flagGratuita = "1";
                } else if (flagBonus == 1 && bonusResidui > 0) {
                    flagBonusPerInsert = "1";
                }

                Utils.myInsert("Insert into Acquisti (id,id_Prodotto,id_Punto_Cassa,Data,Importo,Punti,Num_Progressivo,id_Tipo_Pagamento,"
                        + "id_Turno,flag_gratuita,flag_bonus,flag_asporto,flag_passaggio_tessera)values(-1," 
                        //+ model2.getValueAt(i, 2) + "," + idPuntoCassa + "," + formattaDataOra(adesso) + "," 
                        + model2.getValueAt(i, 2) + "," + idPuntoCassa + "," + formatLocalDateTime(adesso) + "," 
                        + model2.getValueAt(i, 1) + ",0," + progressivo + "," + idModoPagamento + "," + idTurno 
                        + "," + flagGratuita + "," + flagBonusPerInsert + "," + flagAsporto + "," + flagPassaggioTessera + ")",
                        this);
                aggiornaProgressivoPagamentiTurno(Double.valueOf(model2.getValueAt(i, 1).toString()));
                model2.deleteRow(i);
                spiaProgressivo = true;

            }

        }

        //aggiorno progressivi-------------
        if (spiaProgressivo) {
            progressivo++;
            progressivoGiorno++;
            progressivoTurno++;
            Utils.myInsert("Update Progressivi set Prog_assoluto=" + progressivo + ",prog_giorno=" + progressivoGiorno 
                    + ",prog_Turno=" + progressivoTurno + ",incasso_turno_contanti=" + progressivoContanti 
                    + ",incasso_turno_ticket=" + progressivoTicket + ",incasso_turno_scalare=" + progressivoScalare 
                    + ",incasso_turno_differito=" + progressivoDifferito 
                    //+ " where id_Punto_cassa=" + idPuntoCassa + " and id_turno=" + idTurno + " and data=" + formattaData(adesso));
                    + " where id_Punto_cassa=" + idPuntoCassa + " and id_turno=" + idTurno + " and data=" + formatLocalDateTime(adesso),
                    this);

        }

        String residuo = lblResiduo.getText().replace("?", "").trim();
        if (residuo.equalsIgnoreCase("[...]")) {
            residuo = "0";
        }
        if (residuo.length() > 6) {
            residuo = residuo.substring(0, 5);
        } else {
            residuo = Utils.spaziBianchi(residuo, 6, false);
        }

        //Aggiornamento 12-04-2019       
        Integer bonus = 0;
        if (flagBonus == 1 && bonusResidui > 0) {
            bonus = bonusResidui--;

        }
        composizione = Utils.spaziBianchi(composizione + "Bonus:" + bonus, 20, true);
        String Riga2 = "Saldo " + residuo;
        display(composizione + Riga2, null);

        timerDisplay.schedule(new TimerTask() {

            @Override
            public void run() {

                statoAttivoLoggato();

            }
        }, 8000);

        azzera();
        aggiornaLabelInfo();

    }

    private boolean controllaDiscrepanzePrenotazioni(String elencoIdProdotto) {
        boolean ok = true;
        if (elencoIdProdotto.length() > 0) {
            elencoIdProdotto = elencoIdProdotto.substring(0, elencoIdProdotto.length() - 1);
            String[] el = elencoIdProdotto.split(",");
            String query = "SELECT count(*) as nr FROM VIEW_PRENOTAZIONI_TURNO "
                    + "WHERE id_Modalita in (2,3) "
                    + "and id_stato in (0,1) "
                    + "AND id_turno =" + idTurnoAttuale 
                    + " AND id_tessera = " + idTessera 
                    + " and id_Prenotazione=" + idPrenotazione;
            int rowCount = Integer.parseInt(Utils.mySelect(query, "nr", this));
            if (rowCount > 0) {
                if (rowCount == el.length) {
                    query = "SELECT count(*) as nr FROM VIEW_PRENOTAZIONI_TURNO "
                            + "WHERE id_Modalita in (2,3) "
                            + "and id_stato in (0,1) "
                            + "AND id_turno =" + idTurnoAttuale 
                            + " AND id_tessera = " + idTessera 
                            + " AND id_Prodotto in (" + elencoIdProdotto + ") "
                            + "and id_Prenotazione=" + idPrenotazione;
                    rowCount = Integer.parseInt(Utils.mySelect(query, "nr", this));
                    if (rowCount == el.length) {
                        return true;
                    }
                }

                Object[] options = {"Si", "No"};
                Object selectedValue = JOptionPane.showOptionDialog(this, 
                        "I prodotti selezionati sono diversi dai prenotati!\nVuoi proseguire?", "Prenotazione",
                        JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, null);
                if (Integer.parseInt(selectedValue.toString()) == 1) {
                    azzeraDopoStorno();
                    return false;
                }
            }
        }
        return ok;
    }

    private void aggiornaPrenotazioni(String elencoIdProdotto) {
        try {
            if (elencoIdProdotto.length() > 0) {
                String query = "SELECT id FROM VIEW_PRENOTAZIONI_TURNO "
                        + "WHERE id_Modalita in (2,3) "
                        + "and id_stato in (0,1) "
                        + "AND id_turno =" + idTurnoAttuale 
                        + " AND id_tessera = " + idTessera 
                        + " and id_Prenotazione=" + idPrenotazione;
                Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
                Statement st = dbConnection.createStatement();
                ResultSet rs = st.executeQuery(query);
                while (rs.next()) {
                    Utils.myInsert("Update PRENOTAZIONI_PASTI set id_Stato=2 where id=" + rs.getString("id"), 
                            this);
                }
                rs.close();
                st.close();
                dbConnection.close();
            }
        } catch (SQLException | NumberFormatException e) {
            System.err.println(e.getClass().getName() + ": " + e.getMessage());
        }

    }

    private void aggiornaProgressivoPagamentiTurno(Double importo) {

        if (cercaTestoModoPagamento().equalsIgnoreCase("A scalare")) {
            progressivoScalare = progressivoScalare + importo;
        }
        if (cercaTestoModoPagamento().equalsIgnoreCase("Contanti")) {
            progressivoContanti = progressivoContanti + importo;
        }
        if (cercaTestoModoPagamento().equalsIgnoreCase("Ticket")) {
            progressivoTicket = progressivoTicket + importo;
        }
        if (cercaTestoModoPagamento().equalsIgnoreCase("Differito")) {
            progressivoDifferito = progressivoDifferito + importo;
        }

    }

    private void azzera() {
        try {
            MyTableModel model = (MyTableModel) tblLista.getModel();
            MyTableModel model1 = (MyTableModel) tblLista1.getModel();
            /*clearTable(model);
            clearTable(model1);*/
            model.clearTable();
            model1.clearTable();
        } catch (Exception e) {
        }
        messaggioSaldoUnaVolta = false;
        idTessera = 0L;
        idPrenotazione = 0L;
        idProfiloTariffario = 0L;
        setModoPagamento(modoPagamentoDefault);
        isCassaAperta = false;
        txtTotaleCassa.setText("? 0,00");
        txtTotalePunti.setText("Punti 0");

        pnlCategorie.setVisible(false);
        pnlProdotti.setVisible(false);
        if (flagPrecaricaLista == false) {
            abilitaPulsanti(pnlCategorie, false, false);
            abilitaPulsanti(pnlProdotti, false, false);
        }
        pnlCategorie.setVisible(true);
        pnlProdotti.setVisible(true);

        bonusResidui = 0;
        jTxtTessera.setText("");
        pnlProdotti.removeAll();
        pnlProdotti.repaint();
        lblCategoria.setText("");
        lblCognome.setText("");
        lblNome.setText("");
        lblNascita.setText("");
        lblScadTessera.setText("");
        lblAzienda.setText("");
        lblConvenzione.setText("");
        lblFascia.setText("");
        jBtnStorno.setEnabled(false);
        jBtnAsporto.setEnabled(false);

        jbtnSu.setEnabled(false);
        jbtnGiu.setEnabled(false);
        jbtnElimina.setEnabled(false);
        jbtnAnnulla.setEnabled(false);
        jbtnDuplica.setEnabled(false);

        lblSaldo.setText("[...]");
        lblPunti.setText("[...]");
        lblTipoPagamento.setText("[...]");
        testoRFIDCard = new StringBuilder();
        testoSwipCard = new StringBuilder();
        statoCardLettore = false;
        if (btnImpostaCliente.isVisible()) {
            btnImpostaCliente.setEnabled(bottoneImposta);
        }
        jBtnBuoni.setEnabled(true);
        lblResiduo.setText("[...]");
        lblGratuita.setText("[...]");
        jBtnAsporto.setSelected(false);
        jBtnAsportoActionPerformed(null);
        passaggioTessera = false;
        passaggiEsauritiNoComposizione = false;
        saldoMinimoStop = 0.0;
        MyApplication myApp = new MyApplication();
        myApp.unaVolta = false;
        gratuitaResidue = 0;

        //9-5-18<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        if (flagPrecaricaLista) {
            apriCassaDefault();
        }

    }

    public void apriCassaDefault() {
        lblCategoria.setText("");
        lblCognome.setText("");
        lblNome.setText("");
        lblNascita.setText("");
        lblScadTessera.setText("");
        lblAzienda.setText("");
        lblConvenzione.setText("");
        lblFascia.setText("");

        if (isCassaAperta == false) {

            turnoAttuale();
            if ((idTurnoAttuale - idTurno) != 0) {

                progressivoTurno = 1L;
                progressivoContanti = 0.00;
                progressivoScalare = 0.00;
                progressivoTicket = 0.00;
                progressivoDifferito = 0.00;
                if (nomeTurnoAttuale.equalsIgnoreCase("Pranzo")) {
                    progressivoGiorno = 1L;
                }
                idTurno = idTurnoAttuale;
                nomeTurno = nomeTurnoAttuale;

                Date adesso = new Date();
                String controlloTurno = Utils.mySelect("select count(*) as Prog from Progressivi "
                        + "where id_Punto_cassa=" + idPuntoCassa 
                        + " and data=" + formattaData(adesso) 
                        + " and id_Turno=" + idTurno, "Prog",
                        this);
                if (Long.parseLong(controlloTurno) <= 0) {
                    Utils.myInsert("Insert into Progressivi (data,id_Punto_cassa,id_Turno,prog_assoluto,prog_giorno,prog_turno) "
                            + " values (" + formattaData(adesso) + "," + idPuntoCassa + "," + idTurno + "," 
                            + progressivo + "," + progressivoGiorno + ",0)",
                            this);
                }

                aggiornaLabelInfo();
            }

            isCassaAperta = true;
            idProfiloTariffario = idProfiloTariffarioDefault;//0L

            setModoPagamento(modoPagamentoDefault);

            this.caricaPannello();
            abilitaPulsanti(pnlCategorie, true, true);
            jbtnChiudi.setEnabled(false);
        }
    }

    public void cercaTessera() {//String QueryCF) {
        MyApplication myApp = new MyApplication();
        myApp.unaVolta = false;
        setModoPagamento(modoPagamentoDefault);
        String numeroTessera = jTxtTessera.getText();
        String query = "SELECT DISTINCT c.nome || '|' || u.cognome || '|' || u.nome || '|' || "
                + "TO_CHAR (u.data_di_nascita, 'dd/mm/yyyy') || '|' || u.matricola || '|' || a.nome || '|' "
                + "|| c.nome || '|' || f.nome || '|' || t.ID || '|' || "
                + "TO_CHAR (t.data_scadenza, 'dd/mm/yyyy') || '|' || t.id_stato || '|' || u.ID || '|' || f.ID || '|' "
                + "|| t.gratuita_residue || '|' || t.bonus_residui AS ris "
                + " FROM categorie_utenti c, tessere t, utenti u, categorie_utenti_fasce cf, fasce f, aziende a "
                + "WHERE t.id_utente = u.ID "
                + "AND u.id_categoria = c.ID "
                + "AND c.id_azienda = a.ID "
                + "AND cf.id_categoria_utenti = c.ID "
                + "AND cf.id_fascia = f.ID "
                + "AND t.numero = '" + numeroTessera + "'";

        String res = Utils.mySelect(query, "ris", this);

        if (res.length() > 0) {
            String dati[] = res.split("\\|", -1);

            Date now = new Date();

            Date scadenza = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

            idProfiloTariffario = Long.valueOf(dati[12]);
            if (idProfiloTariffario.equals(idProfiloTariffarioDefault)) {
                JOptionPane.showOptionDialog(this, "Impostato Profilo Tariffario di default!", "Attenzione",
                        JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
            }
            Integer idStato = Integer.valueOf(dati[10]);
            idTessera = Long.valueOf(dati[8]);
            logIDTessera = idTessera.toString();

            logTessera();

            try {
                // controllo abilitazione tessera
                String controlloPunto = "Select controlla_abilitazione('" + numeroTessera + "'," + idPuntoCassa + ") as T from dual";
                Long abilitato = Utils.mySelectInteger(controlloPunto, "T", this);
                if (abilitato == 0) {
                    Object[] options = {"Si", "No"};
                    Object selectedValue = JOptionPane.showOptionDialog(this, "Tessera non abilitata per questo punto di distribuzione!\nConsenti passaggio?", "Attenzione",
                            JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
                    if (Integer.parseInt(selectedValue.toString()) != 0) {
                        return;
                    } else {
                        Utils.myInsert("Insert into Forzature (id,id_account,id_Punto_Cassa,id_Tessera,id_Tipo_Forzatura) values (-1," 
                                       + idAccount + "," + idPuntoCassa + "," + idTessera + ",1)",
                                       this);

                    }

                }

                //controllo passaggi
                String controlloPassaggi = "Select controlla_passaggi('" + numeroTessera + "'," + idPuntoCassa + ") as T from dual";
                Long abilitatoPassaggi = Utils.mySelectInteger(controlloPassaggi, "T", this);

                if (abilitatoPassaggi == 0L) {
                    //05/09/2022
                    String queryPassaggi = "select count(*) as NRec from st_acquisti a inner join prodotti p on a.id_prodotto=p.id inner join Tipi_Pagamenti tp on a.id_tipo_pagamento=tp.id where TRUNC(data) = TRUNC(SYSDATE) and id_tessera=" + idTessera + " and flag_in_vassoio=0 and id_punto_cassa=" + idPuntoCassa;
                    Long numeroPassaggi = Utils.mySelectInteger(queryPassaggi, "NRec", this);
                    //fine----
                    if (flagEsegueStorni && numeroPassaggi > 0) {
                        Object[] options = {"Si", "No"};
                        Object selectedValue = JOptionPane.showOptionDialog(this, "N° passaggi giornalieri esauriti. Non è possibile usufruire del pasto!\nSi desidera effettuare uno storno per un pasto erroneamente addebitato?", "Attenzione",
                                JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[1]);
                        if (Integer.parseInt(selectedValue.toString()) == 0) {
                            apriStorno(true);
                        } else {
                            azzeraDopoStorno();
                            return;

                        }
                    } else {
                        JOptionPane.showMessageDialog(this, "N° passaggi giornalieri esauriti. Non è possibile usufruire del pasto!");
                        azzeraDopoStorno();
                        return;
                    }
                }

                //aggiungo un giorno altrimenti in caso di scadenza nello stesso giorno
                //considera le ore
                scadenza = formatter.parse(dati[9]);
                Calendar c = Calendar.getInstance();
                c.setTime(scadenza);
                c.add(Calendar.DATE, 1);
                scadenza = c.getTime();

                if (scadenza.after(now) && idStato != 2) {

                    String modoPagamento = cercaTestoModoPagamento();
                    lblCategoria.setText(dati[0]);
                    lblCognome.setText(dati[1]);
                    lblNome.setText(dati[2]);

                    if (flagMostraDataDiNascita) {
                        lblNascita.setText(dati[3]);
                    }
                    
                    lblAzienda.setText(dati[5]);
                    lblConvenzione.setText(dati[6]);
                    lblFascia.setText(dati[7]);
                    jBtnStorno.setEnabled(flagEsegueStorni);

                    jBtnAsporto.setEnabled(true);
                    jbtnChiudi.setEnabled(true);
                    
                    if (btnImpostaCliente.isVisible()) {
                        btnImpostaCliente.setEnabled(false);
                        jBtnBuoni.setEnabled(false);
                    }
                    if (flagPrecaricaLista == false) {
                        isCassaAperta = true;
                        abilitaPulsanti(pnlCategorie, true, true);
                        abilitaPulsanti(pnlProdotti, true, true);
                    }
                    if (dati.length > 13) {
                        if (dati[13].length() > 0) {
                            gratuitaResidue = Integer.parseInt(dati[13]);
                        }                        
                        lblGratuita.setText(dati[13]);
                    }

                    bonusResidui = 0;
                    if (dati.length > 14) {
                        if (dati[14].length() > 0) {
                            bonusResidui = Integer.parseInt(dati[14]);
                        }
                    }

                    lblScadTessera.setText("" + bonusResidui);                    

                    if (modoPagamento.equalsIgnoreCase("A scalare")) {                        
                        //modifica 09-11-18
                        if (calcolaTotale() > 0.00 && flagPrecaricaLista == false) {
                            verificaSaldo(numeroTessera);
                        }
                        //fine modifica

                    } else {
                        //MyApplication myApplication = new MyApplication();
                        //String punti = myApplication.mySelect(this, "Select Punti from Tessere where numero='" + numeroTessera + "'", "Punti");
                        String punti = Utils.mySelect("Select Punti from Tessere where numero='" + numeroTessera + "'", "Punti",
                                this);
                        lblPunti.setText(punti);
                        String tipo = cercaTestoModoPagamento();
                        lblTipoPagamento.setText(tipo);

                    }
                    stoCalcolando = true;
                    pulsantiModoPagamento();
                    stoCalcolando = false;
                    this.caricaPannello();
                    abilitaPulsanti(pnlCategorie, true, true);
                    //statoTesseraLetta(gratuitaResidue, bonusResidui);

                    //28-09-2016 quando c'è una sola categoria faccio click
                    if (numeroCategorie == 1) {
                        Component[] components = pnlCategorie.getComponents();
                        JToggleButton bt = (JToggleButton) components[0];

                    }

                    //FlagDefaultAsporto
                    if (asporto) {
                        jBtnAsporto.setSelected(true);
                        jBtnAsportoActionPerformed(null);
                    }

                    MyTableModel model = (MyTableModel) tblLista.getModel();
                    if (flagPrecaricaLista) {
                        forzaPrezzi(model);
                    }

                    controllaCompleti(model);
                    controllaExtra(model);
                    sommaColonne(model);
                    //modifica 09-11-18
                    if (modoPagamento.equalsIgnoreCase("A scalare")) {
                        if (calcolaTotale() > 0.00 && flagPrecaricaLista) {
                            verificaSaldo(numeroTessera);
                        }
                    }
                    //fine modifica
                    //05-06-2020
                    if (abilitatoPassaggi != 0L) {
                        controllaPrenotazioni();
                    }
                } else {
                    JOptionPane.showMessageDialog(this, "Tessera Scaduta o Disabilitata!");
                    logTessera();
                    azzera();

                }
            } catch (ParseException e) {
                logTesseraErrore = e.getMessage();
                logTessera();
                azzera();

            }
        } else {

            JOptionPane.showMessageDialog(this, "Errore in lettura della tessera!");
            logTessera();
            azzera();
        }

    }

    private void controllaPrenotazioni() {
        try {

            String query = "SELECT * FROM (SELECT id_Prenotazione as nr FROM VIEW_PRENOTAZIONI_TURNO "
                                + "WHERE id_modalita in (2,3) "
                                + "AND id_stato IN (0,1) "
                                + "AND id_turno = " + idTurnoAttuale + " "
                                + "AND id_tessera = " + idTessera + " "
                                + "order by id_prenotazione) "
                            + "where rownum = 1";
            String idP = Utils.mySelect(query, "nr", this);
            if (idP.length() > 0) {
                Long rowCount = Long.valueOf(idP);
                idPrenotazione = rowCount;
                if (rowCount > 0L) {
                    query = "SELECT Distinct Nome FROM VIEW_PRENOTAZIONI_TURNO v join prodotti p on v.ID_PRODOTTO=p.ID "
                            + "WHERE id_Modalita in (2,3) "
                            + "and id_stato in (0,1) "
                            + "AND id_turno =" + idTurnoAttuale 
                            + " AND id_tessera = " + idTessera 
                            + " and id_prenotazione=" + idPrenotazione 
                            + " order by Nome";
                    Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
                    Statement st = dbConnection.createStatement();
                    ResultSet rs = st.executeQuery(query);
                    StringBuilder s = new StringBuilder("");
                    while (rs.next()) {
                        s.append(rs.getString("Nome"));
                        s.append("\n");
                    }

                    rs.close();
                    st.close();
                    dbConnection.close();

                    if (JOptionPane.showConfirmDialog(null, "Prenotazione presente:\n" + s.toString() + "Inserisco i prodotti?", "Prenotazione", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                        inserisciPrenotazioni();
                    }

                }
            }
        } catch (SQLException | NumberFormatException e) {
            System.err.println(e.getClass().getName() + ": " + e.getMessage());
        } finally {

        }
    }

    private void inserisciPrenotazioni() {
        try {

            MyTableModel model = (MyTableModel) tblLista.getModel();
            MyTableModel model1 = (MyTableModel) tblLista1.getModel();
            /*clearTable(model);
            clearTable(model1);*/
            model.clearTable();
            model1.clearTable();
            sommaColonne(model);

            String query = "SELECT * FROM VIEW_PRENOTAZIONI_TURNO "
                    + "WHERE id_Modalita in (2,3) "
                    + "and id_stato in (0,1) "
                    + "AND id_turno =" + idTurnoAttuale 
                    + " AND id_tessera = " + idTessera 
                    + " and id_prenotazione=" + idPrenotazione;

            Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
            Statement st = dbConnection.createStatement();
            ResultSet rs = st.executeQuery(query);

            while (rs.next()) {

                java.awt.event.ActionEvent evt;
                evt = new java.awt.event.ActionEvent(new Object(), 0, "PRODOTTO[" + rs.getString("ID_PRODOTTO") + "]");
                actionPerformed(evt);

            }
            rs.close();
            st.close();
            dbConnection.close();

        } catch (SQLException | NumberFormatException e) {
            System.err.println(e.getClass().getName() + ": " + e.getMessage());
        } finally {

        }
    }

    public void azzeraDopoStorno() {

        annulla();
        timerDisplay.schedule(new TimerTask() {

            @Override
            public void run() {
                azzera();
                aggiornaProgressivi();

            }
        }, 500);

        passaggiEsauritiNoComposizione = true;
    }

    private Double calcolaTotale() {
        Double totAcquisto = 0.00;
        if (txtTotaleCassa.getText().length() > 0) {
            String saldo = txtTotaleCassa.getText().replace("? ", "").replace(".", "");
            saldo = saldo.replace(",", ".");
            totAcquisto = Double.valueOf(saldo);
        }
        return totAcquisto;
    }

    private void forzaPrezzi(MyTableModel model) {
        for (int y = 0; y < model.getRowCount(); y++) {
            Object row[] = model.getRow(y);
            String idProdotto = row[3].toString();
            String query = "SELECT Punti || '|' || prezzo as res FROM tariffe "
                    + "where id_Prodotto = " + idProdotto 
                    + " and id_fascia=" + idProfiloTariffario;
            String res = Utils.mySelect(query, "res", this);
            if (res.length() > 0) {
                String[] el = res.split("\\|", -1);
                Double prezzo;
                Integer punti;
                punti = Integer.valueOf(el[0]);

                prezzo = Double.valueOf(el[1].replace(",", "."));

                model.setValueAt(prezzo, y, colImporto);
                model.setValueAt(prezzo, y, colImporto2);
                model.setValueAt(punti, y, colPunti);
                doLayout();
            }

        }

    }

    private void abilitaPulsanti(JPanel aPanel, Boolean abilita, Boolean apertura) {
        Component c;
        Component[] components = aPanel.getComponents();

        if (components != null) {
            int numComponents = components.length;
            for (int i = 0; i < numComponents; i++) {
                c = components[i];
                if (c != null) {
                    JToggleButton bt = (JToggleButton) c;
                    if (bt == null) {
                        c.setEnabled(abilita);
                    } else {
                        try {
                            if (bt.getText().equalsIgnoreCase("<html>Composizione</html>") && passaggiEsauritiNoComposizione && aPanel.getName().equalsIgnoreCase("pnlCategorie")) {
                                bt.setEnabled(false);
                            } else {
                                bt.setEnabled(abilita);
                            }

                            if (bt.getText().equalsIgnoreCase("<html>Composizione</html>") && menuGiornoPresente == false && apertura) {
                                bt.setEnabled(true);
                                bt.setSelected(true);
                                pulsantiCategoria("0", "Categoria[0]");

                            } else {
                                bt.setSelected(false);
                            }
                        } catch (Exception ex) {
                        }
                    }
                }
            }
        }

    }   

    public Object[][] rowData(String query, String[] cols, String[] colType, int rowCount) {
        Object[][] rows = null;
        try {
            Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
            Statement st = dbConnection.createStatement();
            ResultSet rs = st.executeQuery(query);
            rows = new Object[rowCount][];
            int r = 0;
            while (rs.next()) {
                Object[] row = new Object[cols.length];
                for (int i = 0; i < cols.length; i++) {
                    if (rs.getString(cols[i].replace(" ", "_")) == null) {
                        row[i] = "";
                    } else {
                        row[i] = rs.getString(cols[i].replace(" ", "_"));
                    }
                    switch (colType[i]) {

                        case "text" -> {
                            if (rs.getString(cols[i].replace(" ", "_")) == null) {
                                row[i] = "";
                            } else {
                                row[i] = rs.getString(cols[i].replace(" ", "_"));
                            }
                        }
                        case "integer" -> {
                            if (rs.getString(cols[i].replace(" ", "_")) == null) {
                                row[i] = 0;
                            } else {
                                row[i] = rs.getInt(cols[i].replace(" ", "_"));
                            }
                        }
                        case "boolean" -> {
                            if (rs.getString(cols[i].replace(" ", "_")) == null) {
                                row[i] = false;
                            } else {
                                row[i] = rs.getBoolean(cols[i].replace(" ", "_"));
                            }
                        }
                        case "float" -> {
                            if (rs.getString(cols[i].replace(" ", "_")) == null) {
                                row[i] = 0.00;
                            } else {
                                String v = rs.getString(cols[i].replace(" ", "_"));

                                row[i] = Float.valueOf(v.replace(",", "."));
                            }
                        }

                    }

                }
                rows[r] = row;
                r++;

            }
            rs.close();
            st.close();
            dbConnection.close();

        } catch (SQLException | NumberFormatException e) {
            System.err.println(e.getClass().getName() + ": " + e.getMessage());
        } finally {

            return rows;
        }

    }

    

    

    
   

    public void getImage(String idProdotto) {
        String fullName = null;
        InputStream gifData = null;
        try {

            String query = "select icona from Prodotti where id=" + idProdotto;
// create prepare Statement pst
            Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
            PreparedStatement pst = dbConnection.prepareStatement(query);
            ResultSet result = pst.executeQuery();
            if (result.next()) {
                fullName = imgPath + idProdotto + ".jpg";
//using Srteam Method'''''
                gifData = result.getBinaryStream(1);
//create file
                if (gifData != null) {
                    File gifFile = new File(fullName);
//write the byte array into a local file.

                    FileOutputStream file = new FileOutputStream(gifFile);
                    int chunk = 0;

                    while ((chunk = gifData.read()) != -1) {

                        file.write(chunk);

                    }
                    file.flush();
                    file.close();
                }
            }
            result.close();
            pst.close();
            dbConnection.close();
        } catch (Exception e) {
            e.printStackTrace();

        }

    }

    /*private byte[] getPhoto(String query)
            throws Exception, SQLException {
        String req = "";
        Blob img;
        byte[] imgData = null;
        Connection dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
        Statement stmt = dbConnection.createStatement();

        // query
        req = query;

        ResultSet rset = stmt.executeQuery(req);

        while (rset.next()) {
            img = rset.getBlob(1);
            imgData = img.getBytes(1, (int) img.length());
        }

        rset.close();
        stmt.close();
        dbConnection.close();
        return imgData;
    }*/

    /*private String formattaDataOra(Date data) {
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        return "to_date('" + formatter.format(data) + "','dd/mm/yyyy HH24:MI:SS')";        
    }*/
    
    private String formatLocalDateTime(LocalDateTime data){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
        return data.format(formatter);
    }

    private String formattaData(Date data) {
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        return "to_date('" + formatter.format(data) + "','dd/mm/yyyy')";        
    }

    private void aggiungiImmaginiPulsanti() {
        aggiungImmagini(jBtnStorno, "Storno.png", 70, 70);
        aggiungImmagini(jBtnAsporto, "coltello e forchetta.jpg", 50, 50);
        aggiungImmagini(jTBP0, "a scalare.png", 50, 50);
        aggiungImmagini(jTBP1, "Contanti.png", 50, 50);
        aggiungImmagini(jTBP2, "Ticket.png", 50, 50);
        aggiungImmagini(jTBP3, "differito.png", 50, 50);
        aggiungImmagini(jBtnprodotti, "Prodotti.png", 50, 50);

        SwingUtilities.updateComponentTreeUI(jTBP0);

        aggiungImmagini(jBtnMovimenti, "Movimenti.png", 50, 50);
    }

    private void aggiungImmagini(JButton btn, String immagine, int width, int height) {
        ImageIcon icon = new ImageIcon(imgPath + immagine);
        Image img = icon.getImage();
        Image newimg = img.getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH);
        icon = new ImageIcon(newimg);
        btn.setIcon(icon);
    }

    private void aggiungImmagini(JToggleButton btn, String immagine, int width, int height) {
        ImageIcon icon = new ImageIcon(imgPath + immagine);
        Image img = icon.getImage();
        Image newimg = img.getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH);
        icon = new ImageIcon(newimg);
        btn.setIcon(icon);

        btn.setDisabledIcon(null);
        btn.setDisabledIcon(icon);

    }

    // ==========================================================================
    // * Metodo main()
    // *
    // * @param args the command line arguments
    // *
    // ==========================================================================
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {

                // =================================================================
                // *** Crea la form base
                // =================================================================
                PuntoCassa p = new PuntoCassa();
                p.aggiungImmagini(p.jBtnDB1, "DB.png", 50, 50);

                // =================================================================
                // *** Esegue il resize a seconda delle impostazioni video per 
                // *** occupare tutto lo schermo utile
                // =================================================================
                Toolkit toolkit = Toolkit.getDefaultToolkit();
                Dimension screenSize = toolkit.getScreenSize();                

                p.setSize(1024, 768);
                p.setLocation((int) (screenSize.width - 1024) / 2, (int) (screenSize.height - 768) / 2);
                p.resize();

                // =================================================================
                // *** Mostra la form nello stato iniziale
                // =================================================================
                p.pnlErrore.setVisible(false);
                p.pnlLogin.setVisible(true);
                p.lblUtenteLoggato.setVisible(true);
                p.lblInfo.setVisible(true);
                p.lblStatoConnessione.setVisible(true);
                p.pnlTop.setVisible(false);
                p.setVisible(true);

            }
        });

    }

    public void controllaLogInCarta(String nTessera) {
        if (turno()) {

            String query = "select a.username || '|' || a.id || '|' || a.id_stato as res"
                    + "  from accounts a, utenti u, tessere t, profili p, ruoli r where a.id_utente = u.id"
                    + "  and t.id_utente = u.id"
                    + "  and p.id_account = a.id"
                    + "  and p.id_ruolo = r.id"
                    //+ "  and r.id = 10000000004" + //*** Operatore di cassa ***/
                    + "  and t.numero = '" + nTessera + "'";  //*** Numero della tessera letto su smartcard ***
            //MyApplication myApp = new MyApplication();
            //String[] res = myApp.mySelect(this, query, "res").split("\\|");
            String[] res = Utils.mySelect(query, "res", this).split("\\|");
            if (res.length >= 3) {
                utenteLoggato = res[0];
                idAccount = Long.valueOf(res[1]);
                Integer stato = Integer.valueOf(res[2]);
                if (utenteLoggato.length() > 0 && idAccount > 0L && stato == 1) {
                    String sql = "SELECT count(*) as Counter FROM profili p WHERE p.id_account = " + idAccount + " AND p.id_ruolo = 10000000004";
                    //Integer counter = Integer.valueOf(myApp.mySelect(this, sql, "Counter"));
                    Integer counter = Integer.valueOf(Utils.mySelect(sql, "Counter", this));
                    if (counter == 1) {
                        impostaAmbiente();
                        verificaAggiornamentoDB();

                    } else {
                        idAccount = 0L;
                        utenteLoggato = "";
                        JOptionPane.showMessageDialog(this, "L'utente non dispone dei privilegi per l'utilizzo del modulo cassa.");
                    }
                } else {
                    utenteLoggato = "";
                    idAccount = 0L;
                    if (stato == 2) {
                        //String messaggio = myApp.mySelect(this, "Select Descrizione from Stati_Accounts where id=" + stato, "descrizione");
                        String messaggio = Utils.mySelect("Select Descrizione from Stati_Accounts where id=" + stato, "descrizione", 
                                this);
                        JOptionPane.showMessageDialog(this, messaggio + ".");

                    } else {

                        JOptionPane.showMessageDialog(this, "Tessera sconosciuta!");
                    }
                }
            } else {
                JOptionPane.showMessageDialog(this, "Tessera sconosciuta!");
            }
            cartaLetta = true;
        } else {
            JOptionPane.showMessageDialog(this, "Impossibile eseguire il Login al sistema:\nNessun Turno Attivo!");
        }

    }

    private void display(String titolo, String prezzo) {
        System.out.println("Display: " + titolo);
        if (visualizzaMessaggiDisplay) {

            try {
                SerialPort serialPort = new SerialPort("COM3");
                try {
                    serialPort.openPort();//Open serial port
                    serialPort.setParams(SerialPort.BAUDRATE_9600,
                            SerialPort.DATABITS_8,
                            SerialPort.STOPBITS_1,
                            SerialPort.PARITY_NONE);//Set params. Also you can set params by this string: serialPort.setParams(9600, 8, 1, 0);
                    String testo = titolo;
                    if (prezzo != null) {
                        testo = titolo + Utils.spaziBianchi(prezzo, 40 - titolo.length(), false);
                    }

                    serialPort.writeBytes(testo.getBytes());//Write data to port
                    serialPort.closePort();//Close serial port
                } catch (SerialPortException ex) {
                    if (serialPort.isOpened()) {
                        serialPort.closePort();
                    }
                    JOptionPane.showMessageDialog(this, ex.getMessage());
                }
            } catch (SerialPortException | HeadlessException ex) {

                JOptionPane.showMessageDialog(this, ex.getMessage());
            }
        }
    }

    

    private void statoAttivoNonLoggato() {
        String PC = idPuntoCassa.toString();
        if (PC.length() >= 5) {
            PC = PC.substring(PC.length() - 5, PC.length());
        } else {
            PC = Utils.spaziBianchi(PC, 5, false);
        }

        String Riga = Utils.spaziBianchi(messageDisplay, 20, true) + "POS " + PC + "     CHIUSO";
        display(Riga, null);
    }

    private void statoAttivoLoggato() {
        //per evitare che inserendo la tessera successiva mi cancelli il num tessera
        if (jTxtTessera.getText().trim().length() <= 0) {
            String PC = idPuntoCassa.toString();
            if (PC.length() >= 5) {
                PC = PC.substring(PC.length() - 5, PC.length());
            } else {
                PC = Utils.spaziBianchi(PC, 5, false);
            }

            String riga = Utils.spaziBianchi(messageDisplay, 20, true) + "POS " + PC + "     APERTO";
            display(riga, null);
        }
    }

    /*private void statoTesseraLetta(int gratuita, int bonus) {
        String tess = jTxtTessera.getText();
        if (tess.length() >= 12) {
            tess = tess.substring(tess.length() - 12, tess.length());
        } else {
            tess = Utils.spaziBianchi(tess, 12, false);
        }
        String fa = "";
        fa = Utils.spaziBianchi(fa, 13, true);

        if (gratuita > 0) {

        } else if (bonus > 0) {
            fa = "BONUS        ";
        }

    }*/
   

    class CardTask extends TimerTask {

        PuntoCassa frmA;

        public CardTask(PuntoCassa frmx) {
            frmA = frmx;
        }

        public void run() {
            MyApplication myApp = new MyApplication();
            try {
                myApp.smartCard.setReader(jcmbSC.getSelectedItem());
                myApp.smartCard.connect("T=1");
                statoCarta = StatiCarta.INSERITA;
                if (pnlLogin.isVisible() == false && cartaLetta == false) {
                    jBtnReadCardActionPerformed(null);
                    passaggioTessera = true;
                    frmA.cercaTessera();

                    cartaLetta = true;
                } else if (pnlLogin.isVisible() == true && cartaLetta == false) {
                    frmA.controllaLogInCarta(getNumeroTessera());

                }
            } catch (Exception e) {
                if (statoCarta == StatiCarta.INSERITA) {
                    statoCarta = StatiCarta.RIMOSSA;
                } else {
                    statoCarta = StatiCarta.ASSENTE;
                }
                cartaLetta = false;
            }

        }

    }
    
    // ==========================================================================
    // *** Sottoclasse per la gestione degli eventi a timer
    // ==========================================================================
    public class timerDBConn extends java.util.TimerTask {

        // =======================================================================
        // ** Implementazione del riferimento alla classe contenitore
        // =======================================================================
        private PuntoCassa pc;
        Connection dbConnection;

        timerDBConn(PuntoCassa pc) {
            this.pc = pc;
        }

        PuntoCassa getPuntoCassa() {
            return pc;
        }

        // =======================================================================
        // ** Contiene il processo da eseguire in background 
        // =======================================================================
        public void run() {

            String sql;
            Statement st = null;
            ResultSet rs;

            // ====================================================================
            // * Se non c'è connessione al DB prova a connettersi
            // ====================================================================            
            try {
                Class.forName(dbDriver);

                dbConnection = DriverManager.getConnection(dbStringa, dbUsername, dbPassword);
            } catch (Exception ex) {
                this.pc.utenteLoggato = "";
                this.pc.lblStatoConnessione.setText("Errore di connessione al db");
            }
            //}

            // ====================================================================
            // * Se c'e connessione
            // ====================================================================            
            // -----------------------------------------------------------------
            // *** Verifica lo stato di attivita della connessione
            // -----------------------------------------------------------------
            if (dbTipo.equals("Oracle")) {
                sql = "Select Valore as now from Parametri where chiave='UltimoAggTabelle'";
            } else {
                sql = "SELECT now() AS now FROM dual";
            }
            try {

                st = dbConnection.createStatement();
                rs = st.executeQuery(sql);
                while (rs.next()) {
                    String strRiga = rs.getString("now");
                    this.pc.lblStatoConnessione.setText(strRiga + " Vers. " + versione);

                }

                // --------------------------------------------------------------
                // ** Verifica se c'e un utente loggato
                // --------------------------------------------------------------
                this.pc.pnlErrore.setVisible(false);

                // --------------------------------------------------------------
                // ** Verifica se c'e un utente loggato
                // --------------------------------------------------------------
                if (this.pc.utenteLoggato.equals("")) {
                    this.pc.pnlLogin.setVisible(true);
                } else {
                    this.pc.pnlLogin.setVisible(false);
                }

                rs.close();
                st.close();
                dbConnection.close();

            } catch (SQLException e) {
                this.pc.pnlErrore.setVisible(true);
                this.pc.lblMessaggioErrore.setText("Errore di connessione al database!");//Errore query " + sql);
            }

        }
    }
    
    


    // Variables declaration - do not modify//GEN-BEGIN:variables
    public javax.swing.JButton btnImpostaCliente;
    private javax.swing.JButton btnLogin;
    private javax.swing.JButton btnTermina;
    private javax.swing.JToggleButton jBtnAsporto;
    private javax.swing.JButton jBtnBuoni;
    private javax.swing.JButton jBtnDB1;
    private javax.swing.JButton jBtnMovimenti;
    private javax.swing.JButton jBtnReadCard;
    private javax.swing.JButton jBtnStorno;
    private javax.swing.JButton jBtnprodotti;
    private javax.swing.JCheckBox jChLogin;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JToggleButton jTBP0;
    private javax.swing.JToggleButton jTBP1;
    private javax.swing.JToggleButton jTBP2;
    private javax.swing.JToggleButton jTBP3;
    private javax.swing.JTextField jTxtTessera;
    private javax.swing.JButton jbtnAnnulla;
    private javax.swing.JButton jbtnChiudi;
    private javax.swing.JButton jbtnDuplica;
    private javax.swing.JButton jbtnElimina;
    private javax.swing.JButton jbtnEsci;
    private javax.swing.JButton jbtnGiu;
    private javax.swing.JButton jbtnStampa;
    private javax.swing.JButton jbtnSu;
    private javax.swing.JComboBox jcmbSC;
    private javax.swing.JLabel lblAzienda;
    private javax.swing.JLabel lblCategoria;
    private javax.swing.JLabel lblCodice;
    private javax.swing.JLabel lblCodice1;
    private javax.swing.JLabel lblCodice2;
    private javax.swing.JLabel lblCodice3;
    private javax.swing.JLabel lblCodice4;
    private javax.swing.JLabel lblCodice5;
    private javax.swing.JLabel lblCognome;
    private javax.swing.JLabel lblConvenzione;
    private javax.swing.JLabel lblDB;
    private javax.swing.JLabel lblDenominazione;
    private javax.swing.JLabel lblFascia;
    private javax.swing.JLabel lblGratuita;
    private javax.swing.JLabel lblInfo;
    private javax.swing.JLabel lblInfo2;
    private javax.swing.JLabel lblMessaggioErrore;
    private javax.swing.JLabel lblNascita;
    private javax.swing.JLabel lblNome;
    private javax.swing.JLabel lblOrganizzazione;
    private javax.swing.JLabel lblOrganizzazione1;
    private javax.swing.JLabel lblOrganizzazione2;
    private javax.swing.JLabel lblOrganizzazione3;
    private javax.swing.JLabel lblOrganizzazione4;
    private javax.swing.JLabel lblOrganizzazione5;
    private javax.swing.JLabel lblPassword;
    private javax.swing.JLabel lblPunti;
    private javax.swing.JLabel lblResiduo;
    private javax.swing.JLabel lblSaldo;
    private javax.swing.JLabel lblScadTessera;
    private javax.swing.JLabel lblStatoConnessione;
    private javax.swing.JLabel lblTipoPagamento;
    private javax.swing.JLabel lblUsername;
    private javax.swing.JLabel lblUtenteLoggato;
    private javax.swing.JPanel pnlAzioni;
    private javax.swing.JPanel pnlCategorie;
    private javax.swing.JPanel pnlCliente;
    private javax.swing.JPanel pnlConto;
    private javax.swing.JPanel pnlErrore;
    private javax.swing.JPanel pnlLista;
    private javax.swing.JPanel pnlLista1;
    private javax.swing.JPanel pnlLogin;
    private javax.swing.JPanel pnlProdotti;
    protected javax.swing.JPanel pnlTop;
    private javax.swing.JScrollPane scpLista;
    private javax.swing.JScrollPane scpLista1;
    private javax.swing.JTable tblLista;
    private javax.swing.JTable tblLista1;
    private javax.swing.JPasswordField txtPassword;
    private javax.swing.JTextField txtTotaleCassa;
    private javax.swing.JTextField txtTotalePunti;
    private javax.swing.JTextField txtUsername;
    // End of variables declaration//GEN-END:variables
}
