private void tf_cantidadFocusLost(
     java.awt.event.FocusEvent evt) { // GEN-FIRST:event_tf_cantidadFocusLost
   // TODO add your handling code here:
   Articulo a = (Articulo) obtenerArticulo(tf_articulo.getText());
   cantidadActual = a.getCantidadStock() + cantidad;
   MovimientoStock ms = (MovimientoStock) obtenerStock(Integer.parseInt(tf_codigo.getText()));
   cantidadInicialExtraida = ms.getCantidad();
   if (cantidadActual <= 0 || cantidadActual < (Integer.parseInt(tf_cantidad.getText()))) {
     resp =
         JOptionPane.showConfirmDialog(
             null,
             "No se cuenta en stock actual con la cantidad solicitada, Desea extraer la cantidad con la que se cuenta actualmente en stock?",
             "Confirmar Modificación",
             JOptionPane.YES_NO_OPTION);
     if (resp == JOptionPane.YES_OPTION) {
       tf_cantidad.setText(String.valueOf(cantidadActual));
       tf_cantidad.setEnabled(false);
       tf_fecha.setEnabled(true);
     } else if (resp != JOptionPane.YES_OPTION) {
       tf_cantidad.setText(null);
       tf_cantidad.requestFocus();
     } else {
       tf_fecha.setEnabled(true);
       // btn_guardar3.setEnabled(true);
     }
   }
 } // GEN-LAST:event_tf_cantidadFocusLost
  private void btn_eliminarActionPerformed(
      java.awt.event.ActionEvent evt) { // GEN-FIRST:event_btn_eliminarActionPerformed
    // TODO add your handling code here:
    String valor;
    int codigo;
    codigo = Integer.parseInt(tf_codigo.getText());

    resp =
        JOptionPane.showConfirmDialog(
            null,
            "Esta seguro que desea eliminar?",
            "Confirmar Eliminación",
            JOptionPane.YES_NO_OPTION);
    if (resp == JOptionPane.YES_OPTION) {
      entityManager.getTransaction().begin();
      MovimientoStock ms =
          entityManager.find(MovimientoStock.class, Integer.parseInt(tf_codigo.getText()));
      valor = ms.toString(); // guardamos el objeto antes de eliminar
      entityManager.remove(ms);
      registrarAuditoria("Eliminar", "Movimiento Stock", valor, "No existen cambios");
      // actualizar stock articulo
      Articulo a = (Articulo) obtenerArticulo(tf_articulo.getText());
      String antes = a.toString();
      cantidadActual = a.getCantidadStock();
      Articulo art = obtenerArticulo(tf_articulo.getText());
      art.setCodigoArticulo(a.getCodigoArticulo());
      art.setCantidadStock(cantidadActual + Integer.parseInt(tf_cantidad.getText()));
      art.setCantidadMaxima(a.getCantidadMaxima());
      art.setCantidadMinima(a.getCantidadMinima());
      art.setCodCategoria(a.getCodCategoria());
      art.setCodigoProveedor(a.getCodigoProveedor());
      art.setCosto(a.getCosto());
      art.setNombre(a.getNombre());
      art.setPrecio(a.getPrecio());
      art.setTipo(a.getTipo());
      // entityManager.getTransaction().begin();
      entityManager.merge(art);
      entityManager.flush();
      registrarAuditoria("Actualizacion Articulo", "cantidad Stock", antes, art.toString());
      entityManager.getTransaction().commit();
      // entityManager.close();
      JOptionPane.showMessageDialog(null, "Eliminación Exitosa");

      refrescar();
      vaciar();
    }
  } // GEN-LAST:event_btn_eliminarActionPerformed
  private void btn_guardarActionPerformed(
      java.awt.event.ActionEvent evt) { // GEN-FIRST:event_btn_guardarActionPerformed
    String antes;
    String despues;
    int codigo;

    if (tf_cantidad.getText().length() == 0 || tf_fecha.getText().length() == 0) {
      JOptionPane.showMessageDialog(
          null, "No se permiten campos con valores nulos", "Error", JOptionPane.ERROR_MESSAGE);
      tf_cantidad.requestFocus();
    } else {
      Articulo a = (Articulo) obtenerArticulo(tf_articulo.getText());
      cantidadActual = a.getCantidadStock() + (Integer.parseInt(tf_cantidad.getText()));
      MovimientoStock ms = (MovimientoStock) obtenerStock(Integer.parseInt(tf_codigo.getText()));
      cantidadInicialExtraida = cantidad;

      resp =
          JOptionPane.showConfirmDialog(
              null,
              "Desea modificar la extraccion de un articulo?",
              "Confirmar Creación",
              JOptionPane.YES_NO_OPTION);
      if (resp == JOptionPane.YES_OPTION) {
        query = entityManager.createNamedQuery("MovimientoStock.findByCodigoMovimiento");
        query.setParameter("codigoMovimiento", Integer.parseInt(tf_codigo.getText()));
        List<MovimientoStock> m = query.getResultList();
        // antes de los cambios
        antes = m.get(0).toString();
        MovimientoStock mv = new MovimientoStock();
        mv.setCodigoMovimiento(Integer.parseInt(tf_codigo.getText()));
        mv.setCodigoArticulo(a);
        mv.setCantidad(Integer.parseInt(tf_cantidad.getText()));
        mv.setFechaHora(tf_fecha.getText());
        entityManager.getTransaction().begin();
        entityManager.merge(mv);
        entityManager.flush();
        despues = mv.toString();
        // registramos los datos de la auditoria
        registrarAuditoria("Modificacion", "Movimiento Articulo", antes, despues);
        // actualizar stock articulo
        antes = a.toString();
        Articulo art = obtenerArticulo(tf_articulo.getText());
        art.setCodigoArticulo(a.getCodigoArticulo());
        art.setCantidadStock(
            (a.getCantidadStock() + cantidadInicialExtraida)
                - Integer.parseInt(tf_cantidad.getText()));
        art.setCantidadMaxima(a.getCantidadMaxima());
        art.setCantidadMinima(a.getCantidadMinima());
        art.setCodCategoria(a.getCodCategoria());
        art.setPrecio(a.getPrecio());
        art.setTipo(a.getTipo());
        art.setCodigoProveedor(a.getCodigoProveedor());
        art.setCosto(a.getCosto());
        art.setNombre(a.getNombre());
        // entityManager.getTransaction().begin();
        despues = art.toString();
        entityManager.merge(art);
        entityManager.flush();
        registrarAuditoria("Actualizacion Articulo", "cantidad Stock", antes, despues);

        detalleOrdenCompraQuery =
            entityManager.createNativeQuery(
                "select * from detalle_orden_compra "
                    + "where cod_articulo="
                    + art.getCodigoArticulo(),
                DetalleOrdenCompra.class);
        List<DetalleOrdenCompra> doc = detalleOrdenCompraQuery.getResultList();
        // verifica que ya no exista orden de compra
        if (doc.isEmpty()) {
          // verificar y generar en caso necesario orden compra
          if (art.getCantidadStock() <= art.getCantidadMinima()) {

            // genera detalle de la orden de compra
            DetalleOrdenCompra detalleOC = new DetalleOrdenCompra();
            detalleOC.setCantidadPedida(art.getCantidadMaxima() - art.getCantidadStock());
            detalleOC.setCodArticulo(art);
            detalleOC.setEstado("pendiente");
            entityManager.persist(detalleOC);
            entityManager.flush();
            registrarAuditoria("Creacion", "orden compra", detalleOC.toString(), "no hay cambios");
            entityManager.getTransaction().commit();
          }
        }
        JOptionPane.showMessageDialog(
            null,
            "Extraccion de Articulo Exitosa",
            "Confirmación",
            JOptionPane.INFORMATION_MESSAGE);
        refrescar();
        vaciar();
      }
    }
  } // GEN-LAST:event_btn_guardarActionPerformed