@Override
	public List<IProducto> filtrarProductos(List<IProducto> productos) {

		Boolean hubo_coincidencias = true;
		List<IProducto> prodsAplican = new ArrayList<IProducto>();

		// productos que coinciden con un registro de la oferta
		List<IProducto> productos_encontrados = new ArrayList<IProducto>();

		// copia de los registros de la oferta
		List<RegistroProducto> copia_registros = new ArrayList<RegistroProducto>(
				registro_productos);

		while (hubo_coincidencias) {

			/*
			 * Por cada registro de la oferta, busca en todos los productos si
			 * alguno coincide. Si encuentra uno, lo agrega a los productos
			 * encontrados y saca ese registro de la lista copia de registros
			 */
			for (RegistroProducto registro : registro_productos) {
				for (IProducto producto : productos) {
					if (producto.validarRegistroProducto(registro)) {
						if (copia_registros.contains(registro)) {
							productos_encontrados.add(producto);
							copia_registros.remove(registro);
						}
					}
				}
			}

			// Termina si no encuentra combos
			if (!copia_registros.isEmpty()) {
				hubo_coincidencias = false;
			} else {
				for (IProducto producto : productos_encontrados) {
					productos.remove(producto);
				}
				ProductoCombo combo = new ProductoCombo(productos_encontrados);
				productos.add(combo);
				prodsAplican.add(combo);
			}
			productos_encontrados.clear();
			copia_registros.clear();
			copia_registros.addAll(registro_productos);
		}

		return prodsAplican;
	}