/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package adgsyncms.service;

import adgsyncms.repository.Servers;
import static adgsyncms.repository.db._SQLQuery;
import static adgsyncms.repository.db._connection;
import static adgsyncms.repository.db.openConnection;

import static adgsyncms.repository.db_express._ex_SQLQuery;
import static adgsyncms.repository.db_express._ex_connection;
import static adgsyncms.repository.db_express.ex_openConnection;
import static adgsyncms.repository.db_express._ex_Host;
import static adgsyncms.repository.db_express._ex_Database;
import static adgsyncms.repository.db_express._ex_Port;
import static adgsyncms.repository.db_express._ex_User;
import static adgsyncms.repository.db_express._ex_Password;
import static adgsyncms.repository.db_express.Ultimo_Error;

import adgsyncms.repository.message;
import adgsyncms.repository.repository;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import javax.swing.JLabel;
import javax.swing.JTextArea;

/**
 *
 * @author amartinez
 */
public class Productos {

    public Boolean b_result;
    public String Caja, Compania;
    JTextArea jtext1;
    JLabel lblTransaccion;

    public boolean BuscarProductosCajas() {
        ResultSet prod_srv, rsCaja;
        PreparedStatement ps;
        this.b_result = true;
        repository repo1 = new repository();
        repo1.readSetting();

        //Cargando la lista de servidores independientes
        Iterator<Servers> servidor = repo1.lstservidores.iterator();

        while (servidor.hasNext()) {
            Servers caja = servidor.next();

            SetCaja(caja.cajas, repo1.Company);
            SetSlaveConnection(caja.host_name, caja.database_name, caja.port_number, caja.user_name, caja.user_pwd);
            message.setMessage(jtext1, "Sincronizando productos en el servidor: " + caja.alias + " - " + caja.host_name);

            // Consultando los productos por sincronizar en la caja
            try {
                if (_ex_connection != null && !_ex_connection.isClosed()) {
                    _ex_connection.close();
                }

                if (_connection != null && !_connection.isClosed()) {
                    _connection.close();
                }
                openConnection();
                b_result = true;

                if (ex_openConnection()) {
                    //Consultando las cajas del servidor local
                    _ex_SQLQuery = "SELECT caja_cod FROM inv_cajas WHERE cia_codigo = ? ORDER BY caja_cod";
                    ps = _ex_connection.prepareStatement(_ex_SQLQuery);
                    ps.setString(1, repo1.Company);
                    rsCaja = ps.executeQuery();
                    Caja = "";
                    while (rsCaja.next()) {
                        Caja = Caja + (!Caja.isEmpty() ? "," : " ") + ("'" + rsCaja.getString("caja_cod") + "'");
                    }
                    _SQLQuery = "Select cia_codigo,prod_referencia,prod_referencia_old from vtas.productos_cajas where cia_codigo = ? "
                            + " and caja_cod in ( " + Caja + ") and sincronizada = false"
                            + " group by cia_codigo,prod_referencia,prod_referencia_old;";
                    ps = _connection.prepareStatement(_SQLQuery);
                    ps.setString(1, repo1.Company);
                    prod_srv = ps.executeQuery();

                    while (prod_srv.next()) {

                        //Verificar si hubo un cambio de referencia
                        if (!prod_srv.getString("prod_referencia").trim().equals(prod_srv.getString("prod_referencia_old").trim())) {
                            if (!prod_srv.getString("prod_referencia").trim().equals("") && !prod_srv.getString("prod_referencia_old").trim().equals("")) {
                                this.b_result = Cambiar_Referencia(prod_srv.getString("prod_referencia_old").trim(), prod_srv.getString("prod_referencia").trim());
                            }
                        }

                        if (this.b_result == true) {
                            this.b_result = ActualizarProductos(prod_srv.getString("cia_codigo"), prod_srv.getString("prod_referencia"));
                        }

                        if (this.b_result) {
                            _connection.commit();
                            _ex_connection.commit();
                        } else {
                            _connection.rollback();
                            _ex_connection.rollback();
                        }
                    }
                    _ex_connection.close();
                } else {
                    message.setMessage(jtext1, "No se pudo establecer la conexion con el servidor: " + caja.alias + " - " + caja.host_name + " " + Ultimo_Error);
                    this.b_result = false;
                }
            } catch (SQLException e) {
                message.setMessage(jtext1, "Ocurrio el siguiente error: " + e.getMessage());
            }
        }
        try {
            _connection.close();
            if (_ex_connection != null && !_ex_connection.isClosed()) {
                _ex_connection.close();
            }
        } catch (SQLException ex) {

            message.setMessage(jtext1, "Ocurrio el siguiente error al actualizar los productos: " + ex.getMessage());
            this.b_result = false;
        }

        return this.b_result;
    }

    public boolean ActualizarProductos(String s_Compania, String s_Referencia) {
        Boolean b_return = true;
        PreparedStatement ps;
        ResultSet rsProductos, rsUnidades, rsCodigosSecundarios, rsPuntosPreferenciales;

        _SQLQuery = "select cia_codigo,prod_referencia,prod_nombre,prod_2daref,prod_marca,prod_uso,prod_unidad,prod_codbarra,"
                + "depa_codigo,sdepa_codigo,prod_itbis,prod_inventario,prod_status,prod_venta,prod_neto,prod_cospromed,"
                + "prod_cosultimo,prod_precio1,prod_precio2,prod_precio3,prod_precio4,clave,prod_netodetalle,id_marca,id_unidad,"
                + "prod_digitacant,prod_pesado,prod_refprodinv,id_grupo,id_fabricante,id_tipo_producto,prod_facturarsinprecio,"
                + "id_undpresentacion,prod_factdebajocosto,cod_tipo_producto,cod_clasificacion,cod_subclas,cod_familia,prod_clasif_impuesto,"
                + "prod_monto_boletas,prod_cant_boletas,prod_codigo,prod_existencia "
                + " from inv_productos where cia_codigo = ?::varchar and prod_referencia = ?::varchar ";
        try {
            ps = _connection.prepareStatement(_SQLQuery);
            ps.setString(1, s_Compania);
            ps.setString(2, s_Referencia);
            rsProductos = ps.executeQuery();
            while (rsProductos.next()) {
                PreparedStatement ps_Condicion, ps_Cambios, ps_Valores;

                String tabla = "inv_productos";
                String Campos = "cia_codigo,prod_referencia,prod_nombre,prod_2daref,prod_marca,prod_uso,prod_unidad,prod_codbarra,"
                        + "depa_codigo,sdepa_codigo,prod_itbis,prod_inventario,prod_status,prod_venta,prod_neto,prod_cospromed,"
                        + "prod_cosultimo,prod_precio1,prod_precio2,prod_precio3,prod_precio4,clave,prod_netodetalle,id_marca,id_unidad,"
                        + "prod_digitacant,prod_pesado,prod_refprodinv,id_grupo,id_fabricante,id_tipo_producto,prod_facturarsinprecio,"
                        + "id_undpresentacion,prod_factdebajocosto,cod_tipo_producto,cod_clasificacion,cod_subclas,cod_familia,prod_clasif_impuesto,"
                        + "prod_monto_boletas,prod_cant_boletas,prod_codigo,prod_existencia ";
                String Condicion = "cia_codigo = ?::varchar and prod_referencia = ?::varchar ";

                String Cambios = "prod_nombre = ?::varchar,prod_2daref= ?::varchar,prod_marca= ?::varchar,prod_uso= ?::varchar,"
                        + "prod_unidad= ?::varchar,prod_codbarra= ?::varchar,depa_codigo= ?::varchar,sdepa_codigo= ?::varchar,"
                        + "prod_itbis= ?::varchar,prod_inventario= ?::varchar,prod_status= ?::varchar,prod_venta= ?::varchar,"
                        + "prod_neto= ?::varchar,prod_cospromed= ?::numeric,prod_cosultimo= ?::numeric,prod_precio1= ?::numeric,"
                        + "prod_precio2= ?::numeric,prod_precio3= ?::numeric,prod_precio4= ?::numeric,clave= ?::varchar,prod_netodetalle= ?::varchar,"
                        + "id_marca= ?::integer,id_unidad= ?::integer,prod_digitacant= ?,prod_pesado= ?,prod_refprodinv= ?::varchar,"
                        + "id_grupo= ?::varchar,id_fabricante= ?::varchar,id_tipo_producto= ?::varchar,prod_facturarsinprecio= ?,"
                        + "id_undpresentacion= ?::integer,prod_factdebajocosto= ?,cod_tipo_producto= ?,cod_clasificacion= ?,"
                        + "cod_subclas= ?::integer,cod_familia= ?::integer,prod_clasif_impuesto= ?::integer,"
                        + "prod_monto_boletas= ?::numeric,prod_cant_boletas = ?::integer,prod_existencia= ?::numeric";

                String Valores = "?::varchar ,?::varchar,?::varchar,?::varchar,?::varchar,?::varchar,"
                        + "?::varchar,?::varchar,?::varchar,?::varchar,"
                        + "?::varchar,?::varchar,?::varchar,?::varchar,"
                        + "?::varchar,?::numeric,?::numeric,?::numeric,"
                        + "?::numeric,?::numeric,?::numeric,?::varchar,?::varchar,"
                        + "?::integer,?::integer,?,?,?::varchar,"
                        + "?::varchar,?::varchar,?::varchar,?,"
                        + "?::integer,?,?,?,"
                        + "?::integer,?::integer,?::integer,"
                        + "?::numeric,?::integer,?::varchar,"
                        + "?::numeric";

                ps_Condicion = _ex_connection.prepareStatement(Condicion);
                ps_Condicion.setString(1, s_Compania);
                ps_Condicion.setString(2, s_Referencia);
                message.setCaption(lblTransaccion, "Actualizando producto: " + s_Referencia);

                ps_Cambios = _ex_connection.prepareStatement(Cambios);
                ps_Cambios.setString(1, rsProductos.getString("prod_nombre"));
                ps_Cambios.setString(2, rsProductos.getString("prod_2daref"));
                ps_Cambios.setString(3, rsProductos.getString("prod_marca"));
                ps_Cambios.setString(4, rsProductos.getString("prod_uso"));

                ps_Cambios.setString(5, rsProductos.getString("prod_unidad"));
                ps_Cambios.setString(6, rsProductos.getString("prod_codbarra"));
                ps_Cambios.setString(7, rsProductos.getString("depa_codigo"));
                ps_Cambios.setString(8, rsProductos.getString("sdepa_codigo"));

                ps_Cambios.setString(9, rsProductos.getString("prod_itbis"));
                ps_Cambios.setString(10, rsProductos.getString("prod_inventario"));
                ps_Cambios.setString(11, rsProductos.getString("prod_status"));
                ps_Cambios.setString(12, rsProductos.getString("prod_venta"));

                ps_Cambios.setString(13, rsProductos.getString("prod_neto"));
                ps_Cambios.setDouble(14, rsProductos.getDouble("prod_cospromed"));
                ps_Cambios.setDouble(15, rsProductos.getDouble("prod_cosultimo"));
                ps_Cambios.setDouble(16, rsProductos.getDouble("prod_precio1"));

                ps_Cambios.setDouble(17, rsProductos.getDouble("prod_precio2"));
                ps_Cambios.setDouble(18, rsProductos.getDouble("prod_precio3"));
                ps_Cambios.setDouble(19, rsProductos.getDouble("prod_precio4"));
                ps_Cambios.setString(20, rsProductos.getString("clave"));
                ps_Cambios.setString(21, rsProductos.getString("prod_netodetalle"));

                ps_Cambios.setInt(22, rsProductos.getInt("id_marca"));
                ps_Cambios.setInt(23, rsProductos.getInt("id_unidad"));
                ps_Cambios.setShort(24, rsProductos.getShort("prod_digitacant"));
                ps_Cambios.setShort(25, rsProductos.getShort("prod_pesado"));
                ps_Cambios.setString(26, rsProductos.getString("prod_refprodinv"));

                ps_Cambios.setString(27, rsProductos.getString("id_grupo"));
                ps_Cambios.setString(28, rsProductos.getString("id_fabricante"));
                ps_Cambios.setString(29, rsProductos.getString("id_tipo_producto"));
                ps_Cambios.setShort(30, rsProductos.getShort("prod_facturarsinprecio"));

                ps_Cambios.setInt(31, rsProductos.getInt("id_undpresentacion"));
                ps_Cambios.setShort(32, rsProductos.getShort("prod_factdebajocosto"));
                ps_Cambios.setShort(33, rsProductos.getShort("cod_tipo_producto"));
                ps_Cambios.setInt(34, rsProductos.getInt("cod_clasificacion"));

                ps_Cambios.setInt(35, rsProductos.getInt("cod_subclas"));
                ps_Cambios.setInt(36, rsProductos.getInt("cod_familia"));
                ps_Cambios.setInt(37, rsProductos.getInt("prod_clasif_impuesto"));

                ps_Cambios.setDouble(38, rsProductos.getDouble("prod_monto_boletas"));
                ps_Cambios.setInt(39, rsProductos.getInt("prod_cant_boletas"));
                ps_Cambios.setDouble(40, rsProductos.getDouble("prod_existencia"));

                ps_Valores = _ex_connection.prepareStatement(Valores);
                ps_Valores.setString(1, rsProductos.getString("cia_codigo"));
                ps_Valores.setString(2, rsProductos.getString("prod_referencia"));
                ps_Valores.setString(3, rsProductos.getString("prod_nombre"));
                ps_Valores.setString(4, rsProductos.getString("prod_2daref"));
                ps_Valores.setString(5, rsProductos.getString("prod_marca"));
                ps_Valores.setString(6, rsProductos.getString("prod_uso"));

                ps_Valores.setString(7, rsProductos.getString("prod_unidad"));
                ps_Valores.setString(8, rsProductos.getString("prod_codbarra"));
                ps_Valores.setString(9, rsProductos.getString("depa_codigo"));
                ps_Valores.setString(10, rsProductos.getString("sdepa_codigo"));

                ps_Valores.setString(11, rsProductos.getString("prod_itbis"));
                ps_Valores.setString(12, rsProductos.getString("prod_inventario"));
                ps_Valores.setString(13, rsProductos.getString("prod_status"));
                ps_Valores.setString(14, rsProductos.getString("prod_venta"));

                ps_Valores.setString(15, rsProductos.getString("prod_neto"));
                ps_Valores.setDouble(16, rsProductos.getDouble("prod_cospromed"));
                ps_Valores.setDouble(17, rsProductos.getDouble("prod_cosultimo"));
                ps_Valores.setDouble(18, rsProductos.getDouble("prod_precio1"));

                ps_Valores.setDouble(19, rsProductos.getDouble("prod_precio2"));
                ps_Valores.setDouble(20, rsProductos.getDouble("prod_precio3"));
                ps_Valores.setDouble(21, rsProductos.getDouble("prod_precio4"));
                ps_Valores.setString(22, rsProductos.getString("clave"));
                ps_Valores.setString(23, rsProductos.getString("prod_netodetalle"));

                ps_Valores.setInt(24, rsProductos.getInt("id_marca"));
                ps_Valores.setInt(25, rsProductos.getInt("id_unidad"));
                ps_Valores.setShort(26, rsProductos.getShort("prod_digitacant"));
                ps_Valores.setShort(27, rsProductos.getShort("prod_pesado"));
                ps_Valores.setString(28, rsProductos.getString("prod_refprodinv"));

                ps_Valores.setString(29, rsProductos.getString("id_grupo"));
                ps_Valores.setString(30, rsProductos.getString("id_fabricante"));
                ps_Valores.setString(31, rsProductos.getString("id_tipo_producto"));
                ps_Valores.setShort(32, rsProductos.getShort("prod_facturarsinprecio"));

                ps_Valores.setInt(33, rsProductos.getInt("id_undpresentacion"));
                ps_Valores.setShort(34, rsProductos.getShort("prod_factdebajocosto"));
                ps_Valores.setShort(35, rsProductos.getShort("cod_tipo_producto"));
                ps_Valores.setInt(36, rsProductos.getInt("cod_clasificacion"));

                ps_Valores.setInt(37, rsProductos.getInt("cod_subclas"));
                ps_Valores.setInt(38, rsProductos.getInt("cod_familia"));
                ps_Valores.setInt(39, rsProductos.getInt("prod_clasif_impuesto"));

                ps_Valores.setDouble(40, rsProductos.getDouble("prod_monto_boletas"));
                ps_Valores.setInt(41, rsProductos.getInt("prod_cant_boletas"));
                ps_Valores.setString(42, rsProductos.getString("prod_codigo"));
                ps_Valores.setDouble(43, rsProductos.getDouble("prod_existencia"));

//?tabla, ?cambios1, ?cambios2, ?cambios3, ?condicion, ?campos, ?valores1, ?valores2, ?valores3
                _ex_SQLQuery = "SELECT * FROM public.fn_editar(?::varchar, ?::varchar, ?::varchar, ?::varchar, ?::varchar, ?::varchar, ?::varchar, ?::varchar, ?::varchar);";
                ps = _ex_connection.prepareStatement(_ex_SQLQuery);
                ps.setString(1, tabla);
                ps.setString(2, ps_Cambios.toString());
                ps.setString(3, "");
                ps.setString(4, "");
                ps.setString(5, ps_Condicion.toString());
                ps.setString(6, Campos);
                ps.setString(7, ps_Valores.toString());
                ps.setString(8, "");
                ps.setString(9, "");
                ps.executeQuery();

                //Actualizando las unidades del producto
                _SQLQuery = "SELECT "
                        + "  cia_codigo,  prod_referencia,  unid_codigo,  unid_barra,  unid_factor,  unid_precio,  unid_precio1,"
                        + "  unid_precio2,  unid_precio3,  unid_precio4,  unid_sumaresta,  id_unidad,  unid_benef1,  unid_benef2,"
                        + "  unid_benef3,  unid_benef4,  unid_defectoventa,  unid_defectocompra,  unid_activa,  unid_nogenera_puntos "
                        + "FROM public.inv_unidadest "
                        + "WHERE cia_codigo = ?::varchar and prod_referencia = ?::varchar";
                ps = _connection.prepareStatement(_SQLQuery);
                ps.setString(1, s_Compania);
                ps.setString(2, s_Referencia);
                rsUnidades = ps.executeQuery();

                _ex_SQLQuery = "delete from inv_unidadest where cia_codigo = ?::varchar and prod_referencia = ?::varchar ;";
                ps = _ex_connection.prepareStatement(_ex_SQLQuery);
                ps.setString(1, s_Compania);
                ps.setString(2, s_Referencia);
                ps.execute();

                while (rsUnidades.next()) {
                    _ex_SQLQuery = "insert into inv_unidadest ("
                            + "  cia_codigo,  prod_referencia,  unid_codigo,  unid_barra,  unid_factor,  unid_precio,  unid_precio1,"
                            + "  unid_precio2,  unid_precio3,  unid_precio4,  unid_sumaresta,  id_unidad,  unid_benef1,  unid_benef2,"
                            + "  unid_benef3,  unid_benef4,  unid_defectoventa,  unid_defectocompra,  unid_activa,  unid_nogenera_puntos)"
                            + "values(?::varchar,?::varchar,?::varchar,?::varchar,?::numeric,?::numeric,?::numeric,"
                            + "?::numeric,?::numeric,?::numeric,?::varchar,?::integer,?::numeric,?::numeric,"
                            + "?::numeric,?::numeric,?::boolean,?::boolean,?::boolean,?::boolean)";
                    ps = _ex_connection.prepareStatement(_ex_SQLQuery);
                    ps.setString(1, s_Compania);
                    ps.setString(2, s_Referencia);
                    ps.setString(3, rsUnidades.getString("unid_codigo"));
                    ps.setString(4, rsUnidades.getString("unid_barra"));
                    ps.setDouble(5, rsUnidades.getDouble("unid_factor"));
                    ps.setDouble(6, rsUnidades.getDouble("unid_precio"));
                    ps.setDouble(7, rsUnidades.getDouble("unid_precio1"));

                    ps.setDouble(8, rsUnidades.getDouble("unid_precio2"));
                    ps.setDouble(9, rsUnidades.getDouble("unid_precio3"));
                    ps.setDouble(10, rsUnidades.getDouble("unid_precio4"));
                    ps.setString(11, rsUnidades.getString("unid_sumaresta"));
                    ps.setInt(12, rsUnidades.getInt("id_unidad"));
                    ps.setDouble(13, rsUnidades.getDouble("unid_benef1"));
                    ps.setDouble(14, rsUnidades.getDouble("unid_benef2"));

                    ps.setDouble(15, rsUnidades.getDouble("unid_benef3"));
                    ps.setDouble(16, rsUnidades.getDouble("unid_benef4"));
                    ps.setBoolean(17, rsUnidades.getBoolean("unid_defectoventa"));
                    ps.setBoolean(18, rsUnidades.getBoolean("unid_defectocompra"));
                    ps.setBoolean(19, rsUnidades.getBoolean("unid_activa"));
                    ps.setBoolean(20, rsUnidades.getBoolean("unid_nogenera_puntos"));

                    ps.execute();
                }
                
                // Actualizando existencia por almacenes
                _SQLQuery = "SELECT cia_codigo, alma_codigo, prod_referencia, alm_existencia, alm_costord,"
                            + " alm_costous, alm_reservada, prod_consig, alma_despachoporrecibir"
                        + " FROM inv_almacenes_item"
                        + " WHERE cia_codigo = ?::VARCHAR AND prod_referencia = ?::VARCHAR";
                
                ps = _connection.prepareStatement(_SQLQuery);
                ps.setString(1, s_Compania);
                ps.setString(2, s_Referencia);
                rsUnidades = ps.executeQuery();

                _ex_SQLQuery = "DELETE FROM inv_almacenes_item WHERE cia_codigo = ?::VARCHAR AND prod_referencia = ?::VARCHAR ;";
                ps = _ex_connection.prepareStatement(_ex_SQLQuery);
                ps.setString(1, s_Compania);
                ps.setString(2, s_Referencia);
                ps.execute();

                while (rsUnidades.next()) {
                    _ex_SQLQuery = "INSERT INTO inv_almacenes_item (cia_codigo, prod_referencia, alma_codigo, alm_existencia,"
                                + " alm_costord, alm_costous, alm_reservada, prod_consig, alma_despachoporrecibir)"
                            + " VALUES(?::varchar, ?::varchar, ?::varchar, ?::numeric,"
                                + " ?::numeric, ?::numeric, ?::numeric, ?::numeric, ?::numeric)";
                    ps = _ex_connection.prepareStatement(_ex_SQLQuery);
                    ps.setString(1, s_Compania);
                    ps.setString(2, s_Referencia);
                    ps.setString(3, rsUnidades.getString("alma_codigo"));
                    
                    ps.setDouble(4, rsUnidades.getDouble("alm_existencia"));
                    ps.setDouble(5, rsUnidades.getDouble("alm_costord"));
                    ps.setDouble(6, rsUnidades.getDouble("alm_costous"));
                    ps.setDouble(7, rsUnidades.getDouble("alm_reservada"));
                    ps.setDouble(8, rsUnidades.getDouble("prod_consig"));
                    ps.setDouble(9, rsUnidades.getDouble("alma_despachoporrecibir"));

                    ps.execute();
                }                
                
                //Actualizando los codigos secundarios del producto
                _SQLQuery = "select CIA_CODIGO,PROD_REFERENCIA,CODIGO_BARRA,ID_UNIDAD from INV_PRODUCTOS_CODBARRAS "
                        + " where cia_codigo = ?::varchar and prod_referencia = ?::varchar ";
                ps = _connection.prepareStatement(_SQLQuery);
                ps.setString(1, s_Compania);
                ps.setString(2, s_Referencia);
                rsCodigosSecundarios = ps.executeQuery();

                _ex_SQLQuery = "delete from INV_PRODUCTOS_CODBARRAS "
                        + " where cia_codigo = ?::varchar and prod_referencia = ?::varchar ";
                ps = _ex_connection.prepareStatement(_ex_SQLQuery);
                ps.setString(1, s_Compania);
                ps.setString(2, s_Referencia);
                ps.execute();

                while (rsCodigosSecundarios.next()) {
                    _ex_SQLQuery = "INSERT INTO INV_PRODUCTOS_CODBARRAS (CIA_CODIGO,PROD_REFERENCIA,CODIGO_BARRA,ID_UNIDAD)"
                            + "VALUES (?::VARCHAR, ?::varchar,?::varchar,?::integer)";
                    ps = _ex_connection.prepareStatement(_ex_SQLQuery);
                    ps.setString(1, s_Compania);
                    ps.setString(2, s_Referencia);
                    ps.setString(3, rsCodigosSecundarios.getString("codigo_barra"));
                    ps.setInt(4, rsCodigosSecundarios.getInt("id_unidad"));

                    ps.execute();
                }

                //Actualizando los puntos de tarjetas preferenciales por productos
                _SQLQuery = "select  codigo_tiptar,  puntos"
                        + " from inv_productos_puntos where cia_codigo = ?::varchar "
                        + " and prod_referencia = ?::varchar ";
                ps = _connection.prepareStatement(_SQLQuery);
                ps.setString(1, s_Compania);
                ps.setString(2, s_Referencia);
                rsPuntosPreferenciales = ps.executeQuery();

                _ex_SQLQuery = "delete from inv_productos_puntos "
                        + " where cia_codigo = ?::varchar and prod_referencia = ?::varchar ";
                ps = _ex_connection.prepareStatement(_ex_SQLQuery);
                ps.setString(1, s_Compania);
                ps.setString(2, s_Referencia);
                ps.execute();
                while (rsPuntosPreferenciales.next()) {
                    _ex_SQLQuery = "INSERT INTO  public.inv_productos_puntos(  cia_codigo,  prod_referencia,  codigo_tiptar,  puntos)"
                            + "values(?::varchar, ?::varchar, ?::integer, ?)";
                    ps = _ex_connection.prepareStatement(_ex_SQLQuery);
                    ps.setString(1, s_Compania);
                    ps.setString(2, s_Referencia);
                    ps.setInt(3, rsPuntosPreferenciales.getInt("codigo_tiptar"));
                    ps.setInt(4, rsPuntosPreferenciales.getInt("puntos"));

                    ps.execute();
                }

                //Actualizando como sincronizado el producto en la caja
                _SQLQuery = "update vtas.productos_cajas set sincronizada = true,prod_referencia_old='' where caja_cod in(" + this.Caja + ") and cia_codigo = ?::varchar and prod_referencia = ?::varchar ;";
                ps = _connection.prepareStatement(_SQLQuery);
                ps.setString(1, s_Compania);
                ps.setString(2, s_Referencia);
                ps.execute();

            }
        } catch (SQLException ex) {
            message.setMessage(jtext1, "Ocurrio el siguiente error: " + ex.getMessage());
            b_return = false;
        }

        return b_return;
    }

    private boolean Cambiar_Referencia(String Referencia, String NuevaReferencia) {
        PreparedStatement ps_cambioref;
        String SqlCambioRef = "SELECT * FROM sis.fn_cambiar_referencia_productos(?::varchar,?::varchar,?::VARCHAR,?::INTEGER)";
        try {
            ps_cambioref = _ex_connection.prepareStatement(SqlCambioRef);
            ps_cambioref.setString(1, this.Compania);
            ps_cambioref.setString(2, Referencia);
            ps_cambioref.setString(3, NuevaReferencia);
            ps_cambioref.setInt(4, 0);
            ps_cambioref.executeQuery();

        } catch (SQLException ex) {
            message.setMessage(jtext1, "Ocurrio el siguiente error al actualizar la referencia del producto: " + ex.getMessage());
            return false;
        }
        return true;
    }

    public void SetCaja(String CodigoCaja, String codigocompania) {
        this.Caja = CodigoCaja;
        this.Compania = codigocompania;

    }

    public void SetSlaveConnection(String host, String database, String portnumber, String username, String password) {
        _ex_Host = host;
        _ex_Database = database;
        _ex_User = username;
        _ex_Port = portnumber;
        _ex_Password = password;

    }

}
