public Servicios.DTO.Proveedores.OrdenDeCompra EntidadToDto(Modelo.Proveedores.OrdenDeCompra entidad, Servicios.DTO.Proveedores.OrdenDeCompra dto,List<Articulo> articulos,ObjetivosDeCompra objetivos)
		{
			var plantilla = this.cargarPlantilla(entidad.Proveedor.Id);

			dto.Id = entidad.Id;
			dto.Nombre = entidad.Nombre;
			dto.Codigo = entidad.Codigo;
            
			dto.CondicionDePago = Mapeador.Instancia.EntidadToDto<Modelo.Proveedores.CondicionDePagoProveedor, Servicios.DTO.Proveedores.CondicionDePagoProveedor>(entidad.CondicionDePago);
			dto.Deposito = Mapeador.Instancia.EntidadToDto<Inteldev.Core.Modelo.Stock.Deposito, Inteldev.Core.DTO.Stock.Deposito>(entidad.Deposito);
			dto.Estado = Mapeador.Instancia.EntidadToDto<Modelo.Proveedores.EstadoOrdenDeCompra, Servicios.DTO.Proveedores.EstadoOrdenDeCompra>(entidad.Estado);
			dto.FechaEntrega = entidad.FechaEntrega;
			dto.ImporteFinal = entidad.ImporteFinal;
			dto.Marca = Mapeador.Instancia.EntidadToDto<Modelo.Articulos.Marca, Servicios.DTO.Articulos.Marca>(entidad.Marca);
			dto.TipoOrden = Mapeador.Instancia.EntidadToDto<Modelo.Proveedores.TipoOrden, Servicios.DTO.Proveedores.TipoOrden>(entidad.TipoOrden);
			dto.TotalBultos = entidad.TotalBultos;
			dto.Proveedor = Mapeador.Instancia.EntidadToDto<Modelo.Proveedores.Proveedor, Servicios.DTO.Proveedores.Proveedor>(entidad.Proveedor);
			dto.ListaDePrecios = Mapeador.Instancia.EntidadToDto<Modelo.Proveedores.ListaDePrecios, Servicios.DTO.Proveedores.ListaDePrecios>(entidad.ListaDePrecios);
            if (plantilla != null)
            {
                dto.Columnas = this.getColumnas(plantilla);
                dto.Detalle = this.crearDataTable(plantilla);
                this.cargarDataTable(dto.Detalle, entidad, articulos, objetivos);
            }
			if (dto.Id != 0)
			{
				foreach (DataRow row in dto.Detalle.Rows)
				{
					var neto = (int)row["Cantidad"];
					if (neto != 0)
						row.SetModified();
				}
			}
			return dto;

		}
		public Servicios.DTO.Proveedores.OrdenDeCompra EntidadToDto(Modelo.Proveedores.OrdenDeCompra entidad, List<Articulo> articulos, ObjetivosDeCompra objetivos)
		{
			var listaDto = new Servicios.DTO.Proveedores.OrdenDeCompra();
			return this.EntidadToDto(entidad, listaDto,articulos, objetivos);
		}
		public Modelo.Proveedores.OrdenDeCompra DtoToEntidad(Servicios.DTO.Proveedores.OrdenDeCompra dto, Modelo.Proveedores.OrdenDeCompra entidad)
		{
			entidad.Id = dto.Id;
			entidad.Nombre = dto.Nombre;
			entidad.Codigo = dto.Codigo;
			entidad.CondicionDePago = Mapeador.Instancia.DtoToEntidad<Servicios.DTO.Proveedores.CondicionDePagoProveedor, Modelo.Proveedores.CondicionDePagoProveedor>(dto.CondicionDePago);
			entidad.Deposito = Mapeador.Instancia.DtoToEntidad<Inteldev.Core.DTO.Stock.Deposito, Inteldev.Core.Modelo.Stock.Deposito>(dto.Deposito);
			entidad.Estado = Mapeador.Instancia.DtoToEntidad<Servicios.DTO.Proveedores.EstadoOrdenDeCompra, Modelo.Proveedores.EstadoOrdenDeCompra>(dto.Estado);			;
			entidad.FechaEntrega = dto.FechaEntrega;
			entidad.ImporteFinal = dto.ImporteFinal;
			entidad.Marca = Mapeador.Instancia.DtoToEntidad<Servicios.DTO.Articulos.Marca, Modelo.Articulos.Marca>(dto.Marca);
			entidad.TipoOrden = Mapeador.Instancia.DtoToEntidad<Servicios.DTO.Proveedores.TipoOrden, Modelo.Proveedores.TipoOrden>(dto.TipoOrden);
			entidad.TotalBultos = dto.TotalBultos;
			entidad.Proveedor = Mapeador.Instancia.DtoToEntidad<Servicios.DTO.Proveedores.Proveedor, Modelo.Proveedores.Proveedor>(dto.Proveedor);
			entidad.ListaDePrecios = Mapeador.Instancia.DtoToEntidad<Servicios.DTO.Proveedores.ListaDePrecios, Modelo.Proveedores.ListaDePrecios>(dto.ListaDePrecios);
			this.sincronizarDetalle(dto.Detalle, entidad.Detalle);
			return entidad;
		}
		private void cargarDataTable(DataTable tabla, Modelo.Proveedores.OrdenDeCompra entidad, List<Articulo> articulos, ObjetivosDeCompra objetivos)
		{
            ParameterOverride[] parameters = { new ParameterOverride("empresa", empresa), new ParameterOverride("entidad", entidad) };
            var db = (IDataSwitch<OrdenDeCompra>)FabricaNegocios.Instancia.Resolver(typeof(IDataSwitch<OrdenDeCompra>),parameters);
			var lista = entidad.ListaDePrecios;
			
			string no = "No";

			var resultado = from a in articulos
							join l in lista.Detalle on a.Id equals l.ArticuloId into aa
							join u in entidad.Detalle on a.Id equals u.ArticuloId into cc
							join h in objetivos.Objetivos on a.Id equals h.Articulo.Id into ee
							from bb in aa.DefaultIfEmpty(new Modelo.Proveedores.ListaDePreciosDetalle())
							from dd in cc.DefaultIfEmpty(new Modelo.Proveedores.OrdenDeCompraDetalle())
							from ff in ee.DefaultIfEmpty(new Modelo.Proveedores.Objetivos())
							select new
							{
								dd.Cantidad,
								Articulo = a.Id,
								Descripcion = a.Nombre,
								Bultos = ff.Bultos,
								DescuentoPotencial = ff.Descuento,
								DescuentoAplicado = no,
								bb.Neto,
								bb.Iva,
								bb.ImpInterno,
								bb.Costo,
								bb.Final,
								bb.Columnas
							};
			

			var columnas = tabla.Columns;
			foreach (var item in resultado)
			{
				var row = tabla.NewRow();
				foreach (DataColumn columna in columnas)
				{
					var prop = item.GetType().GetProperty(columna.ColumnName);
					object valor = null;
					if (prop == null)
					{
						if (item.Columnas.Any())
						{
							var result = item.Columnas.Where(c => c.Nombre == columna.ColumnName).FirstOrDefault();
							if(result != null)
								valor = result.Valor;
						}
						else
							valor = 0;
					}
					else
					{
						valor = prop.GetValue(item);
					}

					if (valor != null)
					{
						row[columna.ColumnName] = valor;
					}
					else
					{
						if (columna.DataType.Equals(typeof(int)) || columna.DataType.Equals(typeof(decimal)))
						{
							row[columna.ColumnName] = 0;
						}
					}
				}
				tabla.Rows.Add(row);
			}
			foreach (DataRow row in tabla.Rows)
			{
				row.AcceptChanges();
			}
		}