/**
  * Modifica la cantidad del lote en el almacen especificado.
  *
  * @param almacen el <code>Almacen</code> donde se modificará el inventario.
  * @param codigoLote es el codigo del lote para buscar en la base de datos.
  * @param cantidad es la cantidad con la que se quiere reemplazar al viejo valor.
  * @throws Exception Se lanza si el codigo del lote no está registrado en la base de datos, o si
  *     el almacen no contiene al lote especificado.
  */
 public void corregirLoteAlmacenado(Almacen almacen, String codigoLote, Double cantidad)
     throws Exception {
   Lote lote = loteJpaController.buscarLotePorCodigo(codigoLote);
   LoteAlmacenado loteAlmacenado = loteJpaController.buscarLoteAlmacenado(almacen, lote);
   if (loteAlmacenado != null) {
     String msg =
         "El punto de venta tiene una cantidad de "
             + loteAlmacenado.getCantidad()
             + " del producto "
             + codigoLote.toUpperCase()
             + "."
             + "\n¿Desea reemplazar por la cantidad "
             + cantidad
             + "?";
     int showOptionDialog =
         JOptionPane.showOptionDialog(
             null,
             msg,
             "Corregir Inventario",
             JOptionPane.YES_OPTION,
             JOptionPane.QUESTION_MESSAGE,
             null,
             null,
             null);
     if (showOptionDialog == 0) {
       loteAlmacenado.setCantidad(cantidad);
       loteJpaController.editarLoteAlmacenado(loteAlmacenado);
       operacionJpaController.registrarOperacionCorreccionDeInventario(
           ControllerSingleton.getEmpleadoJpaController().getEmpleadoQueInicioSesion(),
           loteAlmacenado);
     }
   } else {
     throw new Exception("El almacén no contiene este lote.");
   }
 }
 /**
  * Elimina un almacen de la base de datos con el <code>id</code> especificado.
  *
  * @param id el <code>id</code> del almacen en la base de datos.
  * @throws NonexistentEntityException Se lanza ésta excepción cuando el almacen que se quiere
  *     eliminar no existe en la base de datos.
  */
 public void destruirAlmacen(Long id) throws NonexistentEntityException {
   EntityManager em = null;
   try {
     em = getEntityManager();
     em.getTransaction().begin();
     Almacen almacen;
     try {
       almacen = em.getReference(Almacen.class, id);
       almacen.getId();
     } catch (EntityNotFoundException enfe) {
       throw new NonexistentEntityException(
           "El almacen que desea eliminar de la base de datos no existe.", enfe);
     }
     Sucursal sucursal = almacen.getSucursal();
     if (sucursal != null) {
       sucursal.getAlmacenes().remove(almacen);
       sucursal = em.merge(sucursal);
     }
     List<LoteAlmacenado> lotesAlmacenados = almacen.getLotesAlmacenados();
     for (LoteAlmacenado lotesAlmacenadosLoteAlmacenado : lotesAlmacenados) {
       lotesAlmacenadosLoteAlmacenado.setAlmacen(null);
       lotesAlmacenadosLoteAlmacenado = em.merge(lotesAlmacenadosLoteAlmacenado);
     }
     em.remove(almacen);
     em.getTransaction().commit();
   } finally {
     if (em != null) {
       em.close();
     }
   }
 }
 /**
  * Devuelve la cantidad de productos que existen en el almacen especificado.
  *
  * @param almacen el <code>Almacen</code> donde se buscará el producto.
  * @param producto el <code>Producto</code> que se buscará.
  * @return cantidad.
  */
 public Double cantidadDeProductosEnAlmacen(Almacen almacen, Producto producto) {
   Iterator<Lote> i = loteJpaController.obtenerLotesPorProducto(producto).iterator();
   Double cantidad = 0.0;
   while (i.hasNext()) {
     LoteAlmacenado loteAlmacenado = loteJpaController.buscarLoteAlmacenado(almacen, i.next());
     if (loteAlmacenado != null) cantidad += loteAlmacenado.getCantidad();
   }
   return cantidad;
 }
 /**
  * Descuenta de un lote de un almacen la cantidad indicada. Si el almacén no contiene el lote,
  * lanza una excepción. Si el almacen si contiene el lote pero la cantidad que se requiere
  * transferir es mayor al contenido en el lote, lanza una excepción.
  *
  * @param almacen el <code>Almacen</code> donde se modificará el inventario.
  * @param lote el <code>Lote</code> de donde se descontará.
  * @param cantidad la cantidad que se descontará.
  * @throws Exception Se lanza si no hay cantidad suficiente para descontar o si el almacen no
  *     contiene al lote especificado.
  */
 public void descontarDeAlmacen(Almacen almacen, Lote lote, Double cantidad) throws Exception {
   LoteAlmacenado loteAlmacenado = loteJpaController.buscarLoteAlmacenado(almacen, lote);
   if (loteAlmacenado != null) {
     if (loteAlmacenado.getCantidad() >= cantidad) {
       Double cantidadNueva = loteAlmacenado.getCantidad() - cantidad;
       loteAlmacenado.setCantidad(cantidadNueva);
       loteJpaController.editarLoteAlmacenado(loteAlmacenado);
     } else {
       throw new Exception("No hay cantidad suficiente para satisfacer la transferencia.");
     }
   } else {
     throw new Exception("El almacén no contienen ningun lote con el código de lote ingresado.");
   }
 }
 /**
  * Incrementa la cantidad de lote en el almacen especificado. Si el lote no está en el almacen, se
  * agrega.
  *
  * @param almacen el <code>Almacen</code> donde se modificará el inventario.
  * @param lote el <code>Lote</code> donde se incrementará.
  * @param cantidad la cantidad que se requiere incrementar.
  * @throws Exception Se lanza si ocurre un error en la base de datos.
  */
 public void aumentarStockEnAlmacen(Almacen almacen, Lote lote, Double cantidad) throws Exception {
   LoteAlmacenado loteAlmacenado = loteJpaController.buscarLoteAlmacenado(almacen, lote);
   if (loteAlmacenado != null) {
     Double cantidadNueva = loteAlmacenado.getCantidad() + cantidad;
     loteAlmacenado.setCantidad(cantidadNueva);
     loteJpaController.editarLoteAlmacenado(loteAlmacenado);
   } else {
     LoteAlmacenado nuevoLoteAlmacenado = new LoteAlmacenado();
     nuevoLoteAlmacenado.setAlmacen(almacen);
     nuevoLoteAlmacenado.setLote(lote);
     nuevoLoteAlmacenado.setCantidad(cantidad);
     loteJpaController.crearLoteAlmacenado(nuevoLoteAlmacenado);
   }
 }
 /**
  * Persiste un objeto <code>Almacen</code> en la base de datos.
  *
  * @param almacen es el <code>Almacen</code> que se persistirá.
  */
 public void crearAlmacen(Almacen almacen) {
   if (almacen.getLotesAlmacenados() == null) {
     almacen.setLotesAlmacenados(new ArrayList<LoteAlmacenado>());
   }
   EntityManager em = null;
   try {
     em = getEntityManager();
     em.getTransaction().begin();
     Sucursal sucursal = almacen.getSucursal();
     if (sucursal != null) {
       sucursal = em.getReference(sucursal.getClass(), sucursal.getId());
       almacen.setSucursal(sucursal);
     }
     List<LoteAlmacenado> attachedLotesAlmacenados = new ArrayList();
     for (LoteAlmacenado lotesAlmacenadosLoteAlmacenadoToAttach : almacen.getLotesAlmacenados()) {
       lotesAlmacenadosLoteAlmacenadoToAttach =
           em.getReference(
               lotesAlmacenadosLoteAlmacenadoToAttach.getClass(),
               lotesAlmacenadosLoteAlmacenadoToAttach.getId());
       attachedLotesAlmacenados.add(lotesAlmacenadosLoteAlmacenadoToAttach);
     }
     almacen.setLotesAlmacenados(attachedLotesAlmacenados);
     em.persist(almacen);
     if (sucursal != null) {
       sucursal.getAlmacenes().add(almacen);
       sucursal = em.merge(sucursal);
     }
     for (LoteAlmacenado lotesAlmacenadosLoteAlmacenado : almacen.getLotesAlmacenados()) {
       Almacen oldAlmacenOfLotesAlmacenadosLoteAlmacenado =
           lotesAlmacenadosLoteAlmacenado.getAlmacen();
       lotesAlmacenadosLoteAlmacenado.setAlmacen(almacen);
       lotesAlmacenadosLoteAlmacenado = em.merge(lotesAlmacenadosLoteAlmacenado);
       if (oldAlmacenOfLotesAlmacenadosLoteAlmacenado != null) {
         oldAlmacenOfLotesAlmacenadosLoteAlmacenado
             .getLotesAlmacenados()
             .remove(lotesAlmacenadosLoteAlmacenado);
         oldAlmacenOfLotesAlmacenadosLoteAlmacenado =
             em.merge(oldAlmacenOfLotesAlmacenadosLoteAlmacenado);
       }
     }
     em.getTransaction().commit();
   } finally {
     if (em != null) {
       em.close();
     }
   }
 }
 /**
  * Actualiza un objeto <code>Almacen</code> en la base de datos.
  *
  * @param almacen es el <code>Almacen</code> que se actualizará en la base de datos.
  * @throws NonexistentEntityException Se lanza ésta excepción cuando el almacen que se quiere
  *     actualizar no existe en la base de datos.
  * @throws Exception
  */
 public void editarAlmacen(Almacen almacen) throws NonexistentEntityException, Exception {
   EntityManager em = null;
   try {
     em = getEntityManager();
     em.getTransaction().begin();
     Almacen persistentAlmacen = em.find(Almacen.class, almacen.getId());
     Sucursal sucursalOld = persistentAlmacen.getSucursal();
     Sucursal sucursalNew = almacen.getSucursal();
     List<LoteAlmacenado> lotesAlmacenadosOld = persistentAlmacen.getLotesAlmacenados();
     List<LoteAlmacenado> lotesAlmacenadosNew = almacen.getLotesAlmacenados();
     if (sucursalNew != null) {
       sucursalNew = em.getReference(sucursalNew.getClass(), sucursalNew.getId());
       almacen.setSucursal(sucursalNew);
     }
     List<LoteAlmacenado> attachedLotesAlmacenadosNew = new ArrayList();
     for (LoteAlmacenado lotesAlmacenadosNewLoteAlmacenadoToAttach : lotesAlmacenadosNew) {
       lotesAlmacenadosNewLoteAlmacenadoToAttach =
           em.getReference(
               lotesAlmacenadosNewLoteAlmacenadoToAttach.getClass(),
               lotesAlmacenadosNewLoteAlmacenadoToAttach.getId());
       attachedLotesAlmacenadosNew.add(lotesAlmacenadosNewLoteAlmacenadoToAttach);
     }
     lotesAlmacenadosNew = attachedLotesAlmacenadosNew;
     almacen.setLotesAlmacenados(lotesAlmacenadosNew);
     almacen = em.merge(almacen);
     if (sucursalOld != null && !sucursalOld.equals(sucursalNew)) {
       sucursalOld.getAlmacenes().remove(almacen);
       sucursalOld = em.merge(sucursalOld);
     }
     if (sucursalNew != null && !sucursalNew.equals(sucursalOld)) {
       sucursalNew.getAlmacenes().add(almacen);
       sucursalNew = em.merge(sucursalNew);
     }
     for (LoteAlmacenado lotesAlmacenadosOldLoteAlmacenado : lotesAlmacenadosOld) {
       if (!lotesAlmacenadosNew.contains(lotesAlmacenadosOldLoteAlmacenado)) {
         lotesAlmacenadosOldLoteAlmacenado.setAlmacen(null);
         lotesAlmacenadosOldLoteAlmacenado = em.merge(lotesAlmacenadosOldLoteAlmacenado);
       }
     }
     for (LoteAlmacenado lotesAlmacenadosNewLoteAlmacenado : lotesAlmacenadosNew) {
       if (!lotesAlmacenadosOld.contains(lotesAlmacenadosNewLoteAlmacenado)) {
         Almacen oldAlmacenOfLotesAlmacenadosNewLoteAlmacenado =
             lotesAlmacenadosNewLoteAlmacenado.getAlmacen();
         lotesAlmacenadosNewLoteAlmacenado.setAlmacen(almacen);
         lotesAlmacenadosNewLoteAlmacenado = em.merge(lotesAlmacenadosNewLoteAlmacenado);
         if (oldAlmacenOfLotesAlmacenadosNewLoteAlmacenado != null
             && !oldAlmacenOfLotesAlmacenadosNewLoteAlmacenado.equals(almacen)) {
           oldAlmacenOfLotesAlmacenadosNewLoteAlmacenado
               .getLotesAlmacenados()
               .remove(lotesAlmacenadosNewLoteAlmacenado);
           oldAlmacenOfLotesAlmacenadosNewLoteAlmacenado =
               em.merge(oldAlmacenOfLotesAlmacenadosNewLoteAlmacenado);
         }
       }
     }
     em.getTransaction().commit();
   } catch (Exception ex) {
     String msg = ex.getLocalizedMessage();
     if (msg == null || msg.length() == 0) {
       Long id = almacen.getId();
       if (encontrarAlmacen(id) == null) {
         throw new NonexistentEntityException(
             "El almacén que desea actualizar en la base de datos no existe.");
       }
     }
     throw ex;
   } finally {
     if (em != null) {
       em.close();
     }
   }
 }