@GET
 @Path("{id}")
 @Produces(MediaType.APPLICATION_JSON)
 public DataProducto getProducto(@PathParam(value = "id") Long id) {
   Producto p = em.find(Producto.class, id);
   return p.getDataProducto();
 }
 @GET
 @Path("")
 @Produces(MediaType.APPLICATION_JSON)
 public List<DataProducto> getProductos(@QueryParam("generico") Boolean generico) {
   TypedQuery<Producto> query = em.createNamedQuery("Producto.findAll", Producto.class);
   List<Producto> prods = query.getResultList();
   List<DataProducto> ret = new ArrayList<DataProducto>();
   for (Producto p : prods) {
     if (generico == null || generico.equals(p.getGenerico())) {
       ret.add(p.getDataProducto());
     }
   }
   return ret;
 }
  // User || admin
  @POST
  @Path("/create")
  @Produces(MediaType.APPLICATION_JSON)
  @Consumes(MediaType.APPLICATION_JSON)
  public Response addProducto(@QueryParam("mongo") Boolean mongo, DataProducto dp) {
    Producto p = new Producto();

    p.setNombre(dp.getNombre());
    p.setDescripcion(dp.getDescripcion());
    Categoria cat = em.find(Categoria.class, dp.getCategoria());
    if (cat == null) {
      DataResponse dr = new DataResponse();
      dr.setMensaje("Categoria " + dp.getCategoria() + " no existe");
      return Response.status(500).entity(dr).build();
    }
    p.setCategoria(cat);
    p.setGenerico(dp.getIsgenerico());
    try {
      em.persist(p);
      em.flush();
      dp.setID(p.getId());

      // MONGO
      if (mongo == null || mongo) new MongoController().upsertProduct(dp);

      return Response.status(201).entity(dp).build();

    } catch (Exception e) {
      DataResponse dr = new DataResponse();
      dr.setMensaje("Error inesperado.");
      dr.setDescripcion(e.getMessage());
      return Response.status(409).build();
    }
  }
  @POST
  @Path("{id}/imagenes/remove")
  @Produces(MediaType.APPLICATION_JSON)
  @Consumes(MediaType.APPLICATION_JSON)
  public Response removeImages(@PathParam(value = "id") Long id, List<String> images) {
    try {
      Producto p = em.find(Producto.class, id);
      List<String> images_old = new ArrayList<>();
      if (p.getImagenes() != null && !p.getImagenes().equals("")) {
        images_old = Arrays.asList(p.getImagenes().split(","));
      }
      HashSet<String> set = new HashSet<>(images_old);
      set.removeAll(images);
      String joined = String.join(",", set);
      p.setImagenes(joined);

      // update doc mongo
      DataProducto dp = p.getDataProducto();
      new MongoController().upsertProduct(dp);

      return Response.status(200).entity(dp).build();

    } catch (Exception e) {
      e.printStackTrace();
      DataResponse dr = new DataResponse();
      dr.setMensaje("Error remover imagenes");
      dr.setDescripcion("Problema en mongodb");
      return Response.status(500).entity(dr).build();
    }
  }
  // if producto generico admin
  // else user
  @PUT
  @Path("{id}")
  @Produces(MediaType.APPLICATION_JSON)
  @Consumes(MediaType.APPLICATION_JSON)
  public Response updateProducto(@PathParam(value = "id") Long id, DataProducto dp) {
    Producto p = em.find(Producto.class, id);
    p.setNombre(dp.getNombre());
    p.setDescripcion(dp.getDescripcion());
    p.setGenerico(dp.getIsgenerico());
    Categoria cat = em.find(Categoria.class, dp.getCategoria());
    if (cat == null) {
      DataResponse dr = new DataResponse();
      dr.setMensaje("Categoria " + dp.getCategoria() + " no existe");
      return Response.status(500).entity(dr).build();
    }
    p.setCategoria(cat);

    em.merge(p);

    // mongo thread
    dp.setID(p.getId());
    new MongoController().upsertProduct(dp);

    return Response.status(200).build();
  }
  @POST
  @Path("{id}/tags/remove")
  @Produces(MediaType.APPLICATION_JSON)
  @Consumes(MediaType.APPLICATION_JSON)
  public Response removeTag(@PathParam(value = "id") Long id, List<String> tag) {
    Producto p = em.find(Producto.class, id);
    List<String> tags_old = new ArrayList<>();
    if (p.getTags() != null && !p.getTags().equals("")) {
      tags_old = Arrays.asList(p.getTags().split(","));
    }
    HashSet<String> set = new HashSet<>(tags_old);
    set.removeAll(tag);
    String joined = String.join(",", set);
    p.setTags(joined);

    // Mongo
    DataProducto dp = p.getDataProducto();
    new MongoController().upsertProduct(dp);

    return Response.status(200).entity(tag).build();
  }
 @POST
 @Path("/unificar")
 @Produces(MediaType.APPLICATION_JSON)
 @Consumes(MediaType.APPLICATION_JSON)
 public Response doGenerico(DataUnificar du) {
   Producto nuevo = new Producto();
   nuevo.setNombre(du.getNombre());
   nuevo.setCategoria(em.find(Categoria.class, du.getCategoria()));
   nuevo.setDescripcion(du.getDescripcion());
   nuevo.setGenerico(true);
   nuevo.setCarritoProductos(new ArrayList<CarritoProducto>());
   for (Long productoid : du.getProductos()) {
     Producto p = em.find(Producto.class, productoid);
     nuevo.getCarritoProductos().addAll(p.getCarritoProductos());
     nuevo.getReportesMovimientoStocks().addAll(p.getReportesMovimientoStocks());
     nuevo.getStocks().addAll(p.getStocks());
   }
   return Response.status(200).build();
 }