/// <summary>
        /// Guarda los costos de los movimientos
        /// </summary>
        /// <param name="distribucionDeIngredientes"></param>
        /// <param name="almacenMovimientoID"></param>
        /// <param name="distribucionorganizaciones"></param>
        /// <returns></returns>
        internal bool GuardarCosto(DistribucionDeIngredientesInfo distribucionDeIngredientes, long almacenMovimientoID, DistribucionDeIngredientesOrganizacionInfo distribucionorganizaciones)
        {
            bool regreso = true;

            try
            {
                var cuentaSAPBL = new CuentaSAPBL();
                IList <CuentaSAPInfo> cuentasSAP = cuentaSAPBL.ObtenerTodos(EstatusEnum.Activo);
                var almacenMovimientoCostoBl     = new AlmacenMovimientoCostoBL();
                if (almacenMovimientoID > 0)
                {
                    //Se obtiene el porcentaje a cobrar cargar por organizacion
                    decimal porcentajeSurtido = distribucionDeIngredientes.CantidadTotal > 0 ?
                                                (decimal)distribucionorganizaciones.CantidadSurtir / (decimal)distribucionDeIngredientes.CantidadTotal : 0;
                    foreach (var costoDistribucion in distribucionDeIngredientes.ListaPremezclaDistribucionCosto)
                    {
                        var almacenMovimientoCosto = new AlmacenMovimientoCostoInfo
                        {
                            AlmacenMovimientoId = almacenMovimientoID,
                            Iva               = costoDistribucion.Iva,
                            Retencion         = costoDistribucion.Retencion,
                            CostoId           = costoDistribucion.Costo.CostoID,
                            Importe           = costoDistribucion.Importe * porcentajeSurtido,
                            UsuarioCreacionId = costoDistribucion.UsuarioCreacionID
                        };

                        if (costoDistribucion.TieneCuenta)
                        {
                            CuentaSAPInfo cuenta =
                                cuentasSAP.FirstOrDefault(
                                    sap => sap.CuentaSAP.Trim().Equals(costoDistribucion.CuentaSAP.CuentaSAP.Trim()));
                            if (cuenta != null)
                            {
                                almacenMovimientoCosto.CuentaSAPID = cuenta.CuentaSAPID;
                                almacenMovimientoCosto.TieneCuenta = costoDistribucion.TieneCuenta;
                            }
                        }
                        else
                        {
                            almacenMovimientoCosto.ProveedorId = costoDistribucion.Proveedor.ProveedorID;
                        }

                        almacenMovimientoCostoBl.Crear(almacenMovimientoCosto);
                    }
                }
            }
            catch (ExcepcionGenerica)
            {
                regreso = false;
                throw;
            }
            catch (Exception ex)
            {
                regreso = false;
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }

            return(regreso);
        }
Exemple #2
0
 /// <summary>
 /// Guarda la premezcla distribucion
 /// </summary>
 /// <param name="distribucionIngredientes"></param>
 /// <returns></returns>
 public PremezclaDistribucionInfo GuardarPremezclaDistribucion(DistribucionDeIngredientesInfo distribucionIngredientes)
 {
     try
     {
         var premezclaDistribucion = new PremezclaDistribucionBL();
         return(premezclaDistribucion.GuardarPremezclaDistribucion(distribucionIngredientes));
     }
     catch (ExcepcionServicio ex)
     {
         Logger.Error(ex);
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
        internal List <PremezclaDistribucionCostoInfo> GuardarPremezclaDistribucionCosto(DistribucionDeIngredientesInfo distribucionIngredientes)
        {
            Logger.Info();
            var premezcla = new List <PremezclaDistribucionCostoInfo>();

            try
            {
                Dictionary <string, object> parametros = AuxPremezclaDistribucionCostoDAL.ObtenerParametrosGuardarPremezclaDistribucionCosto(distribucionIngredientes);
                DataSet ds = Retrieve("PremezclaDistribucionCosto_Crear", parametros);
                if (ValidateDataSet(ds))
                {
                    premezcla = MapPremezclaDistribucionCostoDAL.ObtenerPremezclaDistribucionCosto(ds);
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }

            return(premezcla);
        }
Exemple #4
0
        private IList <PolizaInfo> ObtenerPoliza(DistribucionDeIngredientesInfo distribucionIngredientes)
        {
            var polizaPremezcla = new List <PolizaInfo>();

            IList <CuentaSAPInfo>      cuentasSap       = ObtenerCuentasSAP();
            IList <UnidadMedicionInfo> unidadesMedicion = ObtenerUnidadesMedicion();

            TipoPolizaInfo tipoPoliza =
                TiposPoliza.FirstOrDefault(clave => clave.TipoPolizaID == TipoPoliza.PolizaPremezcla.GetHashCode());

            if (tipoPoliza == null)
            {
                throw new ExcepcionServicio(string.Format("{0} {1}", "EL TIPO DE POLIZA", TipoPoliza.PolizaPremezcla));
            }

            string textoDocumento = tipoPoliza.TextoDocumento;
            string tipoMovimiento = tipoPoliza.ClavePoliza;
            string postFijoRef3   = tipoPoliza.PostFijoRef3;

            var renglon     = 0;
            int milisegundo = DateTime.Now.Millisecond;

            ProductoInfo producto = distribucionIngredientes.Producto;

            DateTime fecha = distribucionIngredientes.FechaEntrada;
            int      folio = producto.ProductoId;

            var ref3 = new StringBuilder();

            ref3.Append("03");
            ref3.Append(Convert.ToString(folio).PadLeft(10, ' '));
            ref3.Append(new Random(10).Next(10, 20));
            ref3.Append(new Random(30).Next(30, 40));
            ref3.Append(milisegundo);
            ref3.Append(postFijoRef3);

            var almacenMovimientoBL = new AlmacenMovimientoBL();

            string archivoFolio = ObtenerArchivoFolio(fecha);
            //string numeroReferencia = ObtenerNumeroReferencia;

            List <DistribucionDeIngredientesOrganizacionInfo> organizaciones = distribucionIngredientes.ListaOrganizaciones;
            DistribucionDeIngredientesOrganizacionInfo        organizacionDistribucion;
            ClaseCostoProductoInfo      claseCostoProducto;
            CuentaAlmacenSubFamiliaInfo almacenesSubFamilia;
            CuentaSAPInfo   cuentaSap;
            PolizaInfo      poliza;
            DatosPolizaInfo datos;

            bool tieneIva        = distribucionIngredientes.Iva == 1;
            bool costosTienenIva =
                distribucionIngredientes.ListaPremezclaDistribucionCosto.Any(tieneIVA => tieneIVA.Iva);

            string unidad =
                unidadesMedicion.Where(clave => clave.UnidadID == producto.UnidadId).Select(uni => uni.ClaveUnidad).
                FirstOrDefault();

            OrganizacionInfo organizacion = null;
            decimal          totalIva     = 0;

            /* Se calcula el costo extra y se proratea entre las organizaciones*/
            decimal costoTotal    = 0;
            decimal costoUnitario = 0;

            organizaciones = organizaciones.Where(cant => cant.CantidadSurtir > 0 || cant.CantidadNueva > 0).ToList();
            int    cantidad;
            string numeroReferencia = string.Empty;

            for (var indexOrganizaciones = 0; indexOrganizaciones < organizaciones.Count; indexOrganizaciones++) //Polizas por organizacion
            {
                organizacionDistribucion = organizaciones[indexOrganizaciones];
                AlmacenMovimientoInfo movimientoGenerado = almacenMovimientoBL.ObtenerPorId(organizacionDistribucion.AlmaceMovimiento.AlmacenMovimientoID);
                numeroReferencia = ObtenerNumeroReferenciaFolio(movimientoGenerado.FolioMovimiento);
                cuentaSap        = null;
                if (organizacionDistribucion.Lote.AlmacenInventario.Almacen.TipoAlmacenID ==
                    TipoAlmacenEnum.Enfermeria.GetHashCode()
                    ||
                    organizacionDistribucion.Lote.AlmacenInventario.Almacen.TipoAlmacenID ==
                    TipoAlmacenEnum.ManejoGanado.GetHashCode())
                {
                    IList <CuentaAlmacenSubFamiliaInfo> cuentasAlmacenSubFamilia =
                        ObtenerCostosSubFamilia(organizacionDistribucion.Lote.AlmacenInventario.Almacen.AlmacenID);

                    almacenesSubFamilia =
                        cuentasAlmacenSubFamilia.FirstOrDefault(sub => sub.SubFamiliaID == producto.SubfamiliaId);
                    if (almacenesSubFamilia != null)
                    {
                        cuentaSap =
                            cuentasSap.FirstOrDefault(cuenta => cuenta.CuentaSAPID == almacenesSubFamilia.CuentaSAPID);
                    }
                }
                else
                {
                    IList <ClaseCostoProductoInfo> claseCostosProductos =
                        ObtenerCostosProducto(organizacionDistribucion.Lote.AlmacenInventario.Almacen.AlmacenID);
                    claseCostoProducto =
                        claseCostosProductos.FirstOrDefault(prod => prod.ProductoID == producto.ProductoId);
                    if (claseCostoProducto != null)
                    {
                        cuentaSap =
                            cuentasSap.FirstOrDefault(clave => clave.CuentaSAPID == claseCostoProducto.CuentaSAPID);
                    }
                }


                if (cuentaSap == null)
                {
                    throw new ExcepcionServicio(string.Format("{0} {1}", "NO HAY CONFIGURACION PARA EL PRODUCTO",
                                                              producto.Descripcion));
                }
                organizacion = ObtenerOrganizacionIVA(organizacionDistribucion.Organizacion.OrganizacionID);
                cantidad     = organizacionDistribucion.CantidadSurtir;
                if (cantidad == 0)
                {
                    cantidad = organizacionDistribucion.CantidadNueva;
                }

                if (distribucionIngredientes.ListaOrganizaciones.Any())
                {
                    costoTotal    = distribucionIngredientes.ListaPremezclaDistribucionCosto.Sum(c => c.Importe);
                    costoUnitario = costoTotal / distribucionIngredientes.CantidadTotal;
                }
                //Polizas de Cargo por Organizacion
                datos = new DatosPolizaInfo
                {
                    NumeroReferencia = numeroReferencia,
                    FechaEntrada     = fecha,
                    Folio            = numeroReferencia,
                    Importe          =
                        string.Format("{0}",
                                      (organizacionDistribucion.CostoTotal + (costoUnitario * organizacionDistribucion.CantidadSurtir)).ToString("F2")),
                    IndicadorImpuesto = String.Empty,
                    Renglon           = Convert.ToString(++renglon),
                    ImporteIva        = "0",
                    Ref3             = ref3.ToString(),
                    Cuenta           = cuentaSap.CuentaSAP,
                    ArchivoFolio     = archivoFolio,
                    DescripcionCosto = cuentaSap.Descripcion,
                    PesoOrigen       =
                        Math.Round(Convert.ToDecimal(organizacionDistribucion.CantidadSurtir), 2),
                    Division       = organizacion.Division,
                    TipoDocumento  = textoDocumento,
                    ClaseDocumento = postFijoRef3,
                    Concepto       = String.Format("{0}-{1} {2} {3} {4} ${5} {6}",
                                                   tipoMovimiento,
                                                   numeroReferencia,
                                                   cantidad.ToString("F0"),
                                                   unidad, producto.Descripcion,
                                                   (organizacionDistribucion.CostoTotal).ToString("F2"),
                                                   postFijoRef3),
                    Sociedad = organizacion.Sociedad,
                    Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacion.Sociedad),
                };
                poliza = GeneraRegistroPoliza(datos);
                polizaPremezcla.Add(poliza);

                //Si el cabecero tiene IVA o los costos tienen iva, crea una linea de iva por organizacion en la poliza
                if (tieneIva || costosTienenIva)
                {
                    decimal importeIva = tieneIva?
                                         organizacionDistribucion.CostoTotal * (organizacion.Iva.TasaIva / 100):0;
                    totalIva += importeIva;
                    CuentaSAPInfo cuentaIva = cuentasSap.FirstOrDefault(
                        clave => clave.CuentaSAP.Equals(organizacion.Iva.CuentaRecuperar.ClaveCuenta));
                    if (cuentaIva == null)
                    {
                        throw new ExcepcionServicio(
                                  string.Format("CUENTA DE IVA NO CONFIGURADA PARA LA ORGANIZACION {0}",
                                                organizacion.Descripcion));
                    }

                    decimal porcientoOrg = (decimal)organizacionDistribucion.CantidadSurtir / (decimal)distribucionIngredientes.CantidadTotal;

                    var totalCostosIva = costosTienenIva?
                                         distribucionIngredientes.ListaPremezclaDistribucionCosto.Where(iva => iva.Iva).Sum(sumIva => sumIva.Importe * (organizacion.Iva.TasaIva / 100)):0;
                    decimal porcientoIva          = totalCostosIva * porcientoOrg;
                    var     totalImporteCostosIva = costosTienenIva
                        ? distribucionIngredientes.ListaPremezclaDistribucionCosto.Where(iva => iva.Iva)
                                                    .Sum(sumIva => sumIva.Importe)
                        : 0;
                    var porcentajeImporteCostosIva = costosTienenIva ? totalImporteCostosIva * porcientoOrg : 0;
                    //Poliza de Iva de importe + Iva de costos

                    var importeIVA = costosTienenIva && tieneIva
                        ? (organizacionDistribucion.CostoTotal + porcentajeImporteCostosIva)
                        : (costosTienenIva && !tieneIva) ? porcentajeImporteCostosIva : (!costosTienenIva && tieneIva) ? organizacionDistribucion.CostoTotal : 0;

                    datos = new DatosPolizaInfo
                    {
                        NumeroReferencia = numeroReferencia,
                        FechaEntrada     = fecha,
                        Folio            = numeroReferencia,
                        Importe          =
                            string.Format("{0}",
                                          (importeIva + porcientoIva).ToString("F2")),
                        IndicadorImpuesto = organizacion.Iva.IndicadorIvaRecuperar,
                        Renglon           = Convert.ToString(++renglon),
                        ImporteIva        = (importeIVA).ToString("F2"),
                        Ref3              = ref3.ToString(),
                        Cuenta            = cuentaIva.CuentaSAP,
                        ClaveImpuesto     = ClaveImpuesto,
                        CondicionImpuesto = CondicionImpuesto,
                        ArchivoFolio      = archivoFolio,
                        DescripcionCosto  = cuentaIva.Descripcion,
                        PesoOrigen        =
                            Math.Round(Convert.ToDecimal(organizacionDistribucion.CantidadSurtir), 2),
                        Division       = organizacion.Division,
                        TipoDocumento  = textoDocumento,
                        ClaseDocumento = postFijoRef3,
                        Concepto       = String.Format("{0}-{1} {2} {3} {4} ${5} {6}",
                                                       tipoMovimiento,
                                                       numeroReferencia,
                                                       cantidad.ToString("F0"),
                                                       unidad, producto.Descripcion,
                                                       (organizacionDistribucion.CostoTotal).ToString("F2"),
                                                       postFijoRef3),
                        Sociedad = organizacion.Sociedad,
                        Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacion.Sociedad),
                    };
                    poliza = GeneraRegistroPoliza(datos);
                    polizaPremezcla.Add(poliza);
                    //Poliza de Costo de la distribucion por organizacion mas IVA pagada al proveedor
                    datos = new DatosPolizaInfo
                    {
                        NumeroReferencia = numeroReferencia,
                        FechaEntrada     = fecha,
                        Folio            = numeroReferencia,
                        Importe          =
                            string.Format("{0}",
                                          ((importeIva + organizacionDistribucion.CostoTotal) * -1).ToString("F2")),
                        IndicadorImpuesto = String.Empty,
                        Renglon           = Convert.ToString(++renglon),
                        ImporteIva        = String.Empty,
                        Ref3           = ref3.ToString(),
                        ClaveProveedor = distribucionIngredientes.Proveedor.CodigoSAP,

                        ClaveImpuesto     = ClaveImpuesto,
                        CondicionImpuesto = CondicionImpuesto,
                        ArchivoFolio      = archivoFolio,
                        DescripcionCosto  = distribucionIngredientes.Proveedor.CodigoSAP,
                        PesoOrigen        =
                            Math.Round(Convert.ToDecimal(organizacionDistribucion.CantidadSurtir), 2),
                        Division       = organizacion.Division,
                        TipoDocumento  = textoDocumento,
                        ClaseDocumento = postFijoRef3,
                        Concepto       = String.Format("{0}-{1} {2} {3} {4} ${5} {6}",
                                                       tipoMovimiento,
                                                       numeroReferencia,
                                                       cantidad.ToString("F0"),
                                                       unidad, producto.Descripcion,
                                                       (organizacionDistribucion.CostoTotal).ToString("F2"),
                                                       postFijoRef3),
                        Sociedad = organizacion.Sociedad,
                        Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacion.Sociedad),
                    };
                    poliza = GeneraRegistroPoliza(datos);
                    polizaPremezcla.Add(poliza);
                }

                IList <int> costosConRetencion =
                    distribucionIngredientes.ListaPremezclaDistribucionCosto.Where(x => x.Retencion)
                    .Select(x => x.Costo.CostoID)
                    .ToList();
                foreach (var costo in distribucionIngredientes.ListaPremezclaDistribucionCosto)
                {
                    if (costo.Retencion)
                    {
                        var           retencionBL = new RetencionBL();
                        var           retenciones = retencionBL.ObtenerRetencionesConCosto(costosConRetencion);
                        RetencionInfo retencion   = null;
                        if (retenciones != null && retenciones.Any())
                        {
                            retencion =
                                retenciones.FirstOrDefault(
                                    costoRet => costoRet.CostoID == costo.Costo.CostoID);
                        }
                        if (retencion != null)
                        {
                            if (!costo.Iva)
                            {
                                renglon++;
                                datos = new DatosPolizaInfo
                                {
                                    NumeroReferencia = numeroReferencia.ToString(),
                                    FechaEntrada     = distribucionIngredientes.FechaEntrada,
                                    Folio            = numeroReferencia,
                                    Division         = organizacion.Division,
                                    ClaveProveedor   = costo.Proveedor.CodigoSAP,
                                    Importe          = string.Format("{0}", (costo.Importe * -1).ToString("F2")),
                                    Renglon          = Convert.ToString(renglon),
                                    ImporteIva       = "0",
                                    Ref3             = ref3.ToString(),
                                    ArchivoFolio     = archivoFolio.ToString(),
                                    DescripcionCosto = costo.Proveedor.Descripcion,
                                    PesoOrigen       = organizacionDistribucion.CantidadSurtir,
                                    TipoDocumento    = textoDocumento,
                                    ClaseDocumento   = postFijoRef3,
                                    Concepto         = String.Format("{0}-{1} {2} {3} {4} ${5} {6}",
                                                                     tipoMovimiento,
                                                                     numeroReferencia,
                                                                     organizacionDistribucion.CantidadExistente.ToString("N0"),
                                                                     unidad, costo.Costo.Descripcion,
                                                                     costoUnitario.ToString("N2"), postFijoRef3),
                                    Sociedad = organizacion.Sociedad,
                                    Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacion.Sociedad),
                                };
                                poliza = GeneraRegistroPoliza(datos);
                                polizaPremezcla.Add(poliza);
                            }
                            var parametrosRetencion = new StringBuilder();
                            parametrosRetencion.Append(String.Format("{0}{1}"
                                                                     , retencion.IndicadorRetencion
                                                                     , retencion.TipoRetencion));
                            datos = new DatosPolizaInfo
                            {
                                NumeroReferencia  = numeroReferencia.ToString(),
                                FechaEntrada      = distribucionIngredientes.FechaEntrada,
                                Folio             = numeroReferencia,
                                Division          = organizacion.Division,
                                ClaveProveedor    = costo.Proveedor.CodigoSAP,
                                Importe           = string.Format("-{0}", "0"),
                                IndicadorImpuesto = parametrosRetencion.ToString(),
                                Renglon           = Convert.ToString(renglon),
                                ImporteIva        = "0",
                                Ref3             = ref3.ToString(),
                                CodigoRetencion  = retencion.IndicadorImpuesto,
                                TipoRetencion    = retencion.IndicadorRetencion,
                                ArchivoFolio     = archivoFolio.ToString(),
                                DescripcionCosto = costo.Proveedor.Descripcion,
                                PesoOrigen       = organizacionDistribucion.CantidadSurtir,
                                TipoDocumento    = textoDocumento,
                                ClaseDocumento   = postFijoRef3,
                                Concepto         = String.Format("{0}-{1} {2} {3} {4} ${5} {6}",
                                                                 tipoMovimiento,
                                                                 numeroReferencia,
                                                                 organizacionDistribucion.CantidadExistente.ToString("N0"),
                                                                 unidad, costo.Costo.Descripcion,
                                                                 costoUnitario.ToString("N2"), postFijoRef3),
                                Sociedad = organizacion.Sociedad,
                                Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacion.Sociedad),
                            };
                            poliza = GeneraRegistroPoliza(datos);
                            polizaPremezcla.Add(poliza);
                        }
                    }
                    decimal porcientoOrg = (decimal)organizacionDistribucion.CantidadSurtir /
                                           (decimal)distribucionIngredientes.CantidadTotal;
                    var importePorciento = costo.Iva
                            ? (costo.Importe * ((organizacion.Iva.TasaIva / 100) + 1)) * porcientoOrg
                            : costo.Importe * porcientoOrg;

                    var descripcion = costo.TieneCuenta ? costo.CuentaSAP.Descripcion : costo.Proveedor.Descripcion;
                    var cuenta      = costo.TieneCuenta ? costo.CuentaSAP.CuentaSAP : costo.Proveedor.CodigoSAP;


                    datos = new DatosPolizaInfo
                    {
                        NumeroReferencia = numeroReferencia,
                        FechaEntrada     = fecha,
                        Folio            = numeroReferencia,
                        Importe          =
                            string.Format("{0}",
                                          ((importePorciento) * -1).ToString("F2")),
                        IndicadorImpuesto = String.Empty,
                        Renglon           = Convert.ToString(++renglon),
                        ImporteIva        = String.Empty,
                        Ref3              = ref3.ToString(),
                        Cuenta            = String.Empty,
                        ClaveProveedor    = String.Empty,
                        ClaveImpuesto     = ClaveImpuesto,
                        CondicionImpuesto = CondicionImpuesto,
                        ArchivoFolio      = archivoFolio,
                        DescripcionCosto  = descripcion,
                        PesoOrigen        =
                            Math.Round(Convert.ToDecimal(organizacionDistribucion.CantidadSurtir), 2),
                        Division       = organizacion.Division,
                        TipoDocumento  = textoDocumento,
                        ClaseDocumento = postFijoRef3,
                        Concepto       = String.Format("{0}-{1} {2} {3} {4} ${5} {6}",
                                                       tipoMovimiento,
                                                       numeroReferencia,
                                                       cantidad.ToString("F0"),
                                                       unidad, descripcion,
                                                       (organizacionDistribucion.CostoTotal).ToString("F2"),
                                                       postFijoRef3),
                        Sociedad = organizacion.Sociedad,
                        Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacion.Sociedad),
                    };
                    if (costo.TieneCuenta)
                    {
                        datos.Cuenta = cuenta;
                    }
                    else
                    {
                        datos.ClaveProveedor = cuenta;
                    }
                    poliza = GeneraRegistroPoliza(datos);
                    polizaPremezcla.Add(poliza);
                }
            }
            if (!tieneIva && !costosTienenIva)
            {
                decimal importe = organizaciones.Sum(imp => imp.CostoTotal) + totalIva;
                decimal peso    = organizaciones.Sum(kg => kg.CantidadSurtir);
                if (peso == 0)
                {
                    peso = organizaciones.Sum(kg => kg.CantidadNueva);
                }
                bool esCuenta  = false;
                var  proveedor = distribucionIngredientes.Proveedor.CodigoSAP;
                if (!proveedor.StartsWith("0"))
                {
                    esCuenta = true;
                }
                //numeroReferencia = ObtenerNumeroReferencia;
                datos = new DatosPolizaInfo
                {
                    NumeroReferencia = numeroReferencia,
                    FechaEntrada     = fecha,
                    Folio            = numeroReferencia,
                    Importe          =
                        string.Format("{0}",
                                      (distribucionIngredientes.CostoTotal * -1).ToString("F2")),
                    IndicadorImpuesto = String.Empty,
                    Renglon           = Convert.ToString(++renglon),
                    ImporteIva        = "0",
                    Ref3             = ref3.ToString(),
                    ClaveProveedor   = esCuenta ? String.Empty : distribucionIngredientes.Proveedor.CodigoSAP,
                    Cuenta           = esCuenta ? distribucionIngredientes.Proveedor.CodigoSAP : String.Empty,
                    ArchivoFolio     = archivoFolio,
                    DescripcionCosto = distribucionIngredientes.Proveedor.Descripcion,
                    PesoOrigen       =
                        Math.Round(peso, 2),
                    Division       = organizacion.Division,
                    TipoDocumento  = textoDocumento,
                    ClaseDocumento = postFijoRef3,
                    Concepto       = String.Format("{0}-{1} {2} {3} {4} ${5} {6}",
                                                   tipoMovimiento,
                                                   numeroReferencia,
                                                   (peso).ToString("F0"),
                                                   unidad, producto.Descripcion,
                                                   (importe).ToString("F2"),
                                                   postFijoRef3),
                    Sociedad = organizacion.Sociedad,
                    Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacion.Sociedad),
                };
                poliza = GeneraRegistroPoliza(datos);
                polizaPremezcla.Add(poliza);
            }
            return(polizaPremezcla);
        }
        internal PremezclaDistribucionInfo GuardarPremezclaDistribucion(DistribucionDeIngredientesInfo distribucionIngredientes)
        {
            PremezclaDistribucionInfo distribucion = null;

            try
            {
                var  almacenMovimientoBl             = new AlmacenMovimientoBL();
                var  almacenInventarioLoteBl         = new AlmacenInventarioLoteBL();
                var  almacenInventarioBl             = new AlmacenInventarioBL();
                var  almacenMovimientoDetalleBl      = new AlmacenMovimientoDetalleBL();
                var  premezclaDistribucionDal        = new PremezclaDistribucionDAL();
                var  premezclaDistribucionDetalleDal = new PremezclaDistribucionDetalleDAL();
                var  premezclaDistribucionCostoDal   = new PremezclaDistribucionCostoDAL();
                long almacenMovimientoId             = 0;
                // Afectamos el inventario.
                using (var transaction = new TransactionScope())
                {
                    distribucion = premezclaDistribucionDal.GuardarPremezclaDistribucion(new PremezclaDistribucionInfo
                    {
                        ProveedorId       = distribucionIngredientes.Proveedor.ProveedorID,
                        Iva               = distribucionIngredientes.Iva,
                        ProductoId        = distribucionIngredientes.Producto.ProductoId,
                        CantidadExistente = distribucionIngredientes.CantidadTotal,
                        CostoUnitario     = distribucionIngredientes.CostoUnitario,
                        UsuarioCreacionId = distribucionIngredientes.UsuarioId,
                    });

                    distribucionIngredientes.PremezclaDistribucionID = distribucion.PremezclaDistribucionId;

                    distribucion.ListaPremezclaDistribucionCosto =
                        premezclaDistribucionCostoDal.GuardarPremezclaDistribucionCosto(distribucionIngredientes);

                    /* Se calcula el costo extra y se proratea entre las organizaciones*/
                    //decimal costoDeCostosPorOrganizacion = 0;
                    decimal importeCostoTotal = 0;

                    if (distribucionIngredientes.ListaOrganizaciones.Any())
                    {
                        importeCostoTotal = distribucionIngredientes.ListaPremezclaDistribucionCosto.Sum(c => c.Importe);
                    }

                    foreach (var distribucionorganizaciones in distribucionIngredientes.ListaOrganizaciones)
                    {
                        decimal porcentajeSurtido = distribucionIngredientes.CantidadTotal > 0 ?
                                                    (decimal)distribucionorganizaciones.CantidadSurtir / (decimal)distribucionIngredientes.CantidadTotal : 0;
                        if (distribucionorganizaciones.Lote.AlmacenInventarioLoteId != 0)
                        {
                            // Se Genera un movimiento de almacen
                            ////Insertar en almacenmovimiento
                            var almacenMovimientoInfo = new AlmacenMovimientoInfo
                            {
                                ProveedorId       = distribucionIngredientes.Proveedor.ProveedorID,
                                AlmacenID         = distribucionorganizaciones.Lote.AlmacenInventario.Almacen.AlmacenID,
                                TipoMovimientoID  = TipoMovimiento.EntradaAlmacen.GetHashCode(),
                                Observaciones     = "",
                                Status            = Estatus.AplicadoInv.GetHashCode(),
                                UsuarioCreacionID = distribucionIngredientes.UsuarioId
                            };
                            almacenMovimientoId = almacenMovimientoBl.Crear(almacenMovimientoInfo);

                            //Se crea el Almacen Movimiento Costo
                            GuardarCosto(distribucionIngredientes, almacenMovimientoId, distribucionorganizaciones);

                            // Se modifica el Almacen Inventario
                            distribucionorganizaciones.Lote.AlmacenInventario.Cantidad =
                                distribucionorganizaciones.Lote.AlmacenInventario.Cantidad + distribucionorganizaciones.CantidadSurtir;

                            distribucionorganizaciones.Lote.AlmacenInventario.Importe =
                                distribucionorganizaciones.Lote.AlmacenInventario.Importe + distribucionorganizaciones.CostoTotal + (importeCostoTotal * porcentajeSurtido);

                            distribucionorganizaciones.Lote.AlmacenInventario.PrecioPromedio = distribucionorganizaciones.Lote.AlmacenInventario.Importe / distribucionorganizaciones.Lote.AlmacenInventario.Cantidad;



                            distribucionorganizaciones.Lote.AlmacenInventario.UsuarioModificacionID =
                                distribucionIngredientes.UsuarioId;
                            almacenInventarioBl.Actualizar(distribucionorganizaciones.Lote.AlmacenInventario);

                            // Se modifica el Almacen Inventario Lote
                            distribucionorganizaciones.Lote.Cantidad =
                                distribucionorganizaciones.Lote.Cantidad + distribucionorganizaciones.CantidadSurtir;

                            distribucionorganizaciones.Lote.Importe = distribucionorganizaciones.Lote.Importe + distribucionorganizaciones.CostoTotal + (importeCostoTotal * porcentajeSurtido);

                            distribucionorganizaciones.Lote.PrecioPromedio = distribucionorganizaciones.Lote.Importe / distribucionorganizaciones.Lote.Cantidad;


                            distribucionorganizaciones.Lote.UsuarioModificacionId = distribucionIngredientes.UsuarioId;
                            almacenInventarioLoteBl.Actualizar(distribucionorganizaciones.Lote);

                            // Se genera el Almacen Movimiento Detalle
                            almacenMovimientoDetalleBl.Crear(new AlmacenMovimientoDetalle
                            {
                                AlmacenMovimientoID     = almacenMovimientoId,
                                AlmacenInventarioLoteId = distribucionorganizaciones.Lote.AlmacenInventarioLoteId,
                                Piezas            = 0,
                                ProductoID        = distribucionorganizaciones.Lote.AlmacenInventario.ProductoID,
                                Precio            = distribucionorganizaciones.CostoUnitario,
                                Cantidad          = distribucionorganizaciones.CantidadSurtir,
                                Importe           = distribucionorganizaciones.CostoTotal,
                                UsuarioCreacionID = distribucionIngredientes.UsuarioId,
                                FechaCreacion     = DateTime.Now
                            });

                            var premezclaDistribucionDetalle = premezclaDistribucionDetalleDal.GuardarPremezclaDistribucionDetalle(new PremezclaDistribucionDetalleInfo
                            {
                                AlmacenMovimientoId     = almacenMovimientoId,
                                PremezclaDistribucionId = distribucion.PremezclaDistribucionId,
                                CantidadASurtir         = distribucionorganizaciones.CantidadSurtir,
                                OrganizacionId          = distribucionorganizaciones.Organizacion.OrganizacionID,
                                UsuarioCreacionId       = distribucionIngredientes.UsuarioId
                            });
                            distribucion.ListaPremezclaDistribucionDetalle.Add(premezclaDistribucionDetalle);

                            foreach (var distribucionOrg in distribucionIngredientes
                                     .ListaOrganizaciones.Where(distribucionOrg =>
                                                                distribucionOrg.Organizacion.OrganizacionID == premezclaDistribucionDetalle.OrganizacionId))
                            {
                                distribucionOrg.AlmaceMovimiento = new AlmacenMovimientoInfo
                                {
                                    AlmacenMovimientoID = premezclaDistribucionDetalle.AlmacenMovimientoId
                                };
                            }
                        }
                    }

                    #region POLIZA

                    distribucionIngredientes.AlmaceMovimientoID = almacenMovimientoId;
                    var poliza = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(TipoPoliza.PolizaPremezcla);
                    distribucionIngredientes.FechaEntrada = DateTime.Now;
                    IList <PolizaInfo> polizas = poliza.GeneraPoliza(distribucionIngredientes);
                    if (polizas != null && polizas.Any())
                    {
                        var polizaBL       = new PolizaBL();
                        int organizacionID =
                            distribucionIngredientes.ListaOrganizaciones[0].Organizacion.OrganizacionID;
                        int usuarioCreacionID = distribucionIngredientes.UsuarioId;
                        polizas.ToList().ForEach(datos =>
                        {
                            datos.OrganizacionID         = organizacionID;
                            datos.UsuarioCreacionID      = usuarioCreacionID;
                            datos.ArchivoEnviadoServidor = 1;
                        });
                        polizaBL.GuardarServicioPI(polizas, TipoPoliza.PolizaPremezcla);
                    }

                    #endregion POLIZA
                    transaction.Complete();
                }

                return(distribucion);
            }
            catch (ExcepcionServicio ex)
            {
                Logger.Error(ex);
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }
        internal static Dictionary <string, object> ObtenerParametrosGuardarPremezclaDistribucionCosto(DistribucionDeIngredientesInfo distribucionIngredientes)
        {
            try
            {
                Logger.Info();

                var xml =
                    new XElement("ROOT",
                                 from info in distribucionIngredientes.ListaPremezclaDistribucionCosto
                                 select
                                 new XElement("PremezclaDistribucionCosto",
                                              new XElement("PremezclaDistribucionID", distribucionIngredientes.PremezclaDistribucionID),
                                              new XElement("Costo", info.Costo.CostoID),
                                              new XElement("TieneCuenta", info.TieneCuenta),
                                              new XElement("Proveedor", info.Proveedor.ProveedorID),
                                              new XElement("CuentaProvision", info.CuentaSAP.CuentaSAP),
                                              new XElement("Importe", info.Importe),
                                              new XElement("Iva", info.Iva),
                                              new XElement("Retencion", info.Retencion),
                                              new XElement("Activo", info.Activo.GetHashCode()),
                                              new XElement("UsuarioCreacionID", info.UsuarioCreacionID),
                                              new XElement("UsuarioModificacionID", info.UsuarioModificacionID)
                                              ));
                var parametros =
                    new Dictionary <string, object>
                {
                    { "@PremezclaDistribucionCostoXML", xml.ToString() }
                };
                return(parametros);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }
 /// <summary>
 /// Obtiene una lista de distribucion de ingredientes
 /// </summary>
 /// <param name="reader"></param>
 /// <returns></returns>
 internal static List <DistribucionDeIngredientesInfo> ObtenerPremezclaDistribucionConciliacion(IDataReader reader)
 {
     try
     {
         Logger.Info();
         var distribuciones = new List <DistribucionDeIngredientesInfo>();
         DistribucionDeIngredientesInfo distribucion;
         while (reader.Read())
         {
             distribucion = new DistribucionDeIngredientesInfo
             {
                 Producto = new ProductoInfo
                 {
                     ProductoId   = Convert.ToInt32(reader["ProductoID"]),
                     Descripcion  = Convert.ToString(reader["Producto"]),
                     UnidadId     = Convert.ToInt32(reader["UnidadID"]),
                     SubfamiliaId = Convert.ToInt32(reader["SubFamiliaID"])
                 },
                 Iva = Convert.ToInt32(reader["IVA"]),
                 CantidadExistente       = Convert.ToInt32(reader["CantidadExistente"]),
                 CostoUnitario           = Convert.ToInt32(reader["CostoUnitario"]),
                 PremezclaDistribucionID = Convert.ToInt32(reader["PremezclaDistribucionID"]),
                 FechaEntrada            = Convert.ToDateTime(reader["FechaEntrada"]),
                 AlmaceMovimientoID      = Convert.ToInt64(reader["AlmacenMovimientoID"]),
                 Proveedor = new ProveedorInfo
                 {
                     ProveedorID = Convert.ToInt32(reader["ProveedorID"]),
                     Descripcion = Convert.ToString(reader["Proveedor"]),
                     CodigoSAP   = Convert.ToString(reader["CodigoSAP"])
                 }
             };
             distribuciones.Add(distribucion);
         }
         reader.NextResult();
         var distribucionIngredientesOrganizaciones = new List <DistribucionDeIngredientesOrganizacionInfo>();
         DistribucionDeIngredientesOrganizacionInfo distribucionIngredienteOrganizacion;
         while (reader.Read())
         {
             distribucionIngredienteOrganizacion = new DistribucionDeIngredientesOrganizacionInfo
             {
                 Lote = new AlmacenInventarioLoteInfo
                 {
                     Lote = Convert.ToInt32(reader["Lote"]),
                     AlmacenInventario = new AlmacenInventarioInfo
                     {
                         Almacen = new AlmacenInfo
                         {
                             AlmacenID = Convert.ToInt32(reader["AlmacenID"])
                         }
                     }
                 },
                 Organizacion = new OrganizacionInfo
                 {
                     OrganizacionID = Convert.ToInt32(reader["OrganizacionID"])
                 },
                 CantidadSurtir          = Convert.ToInt32(reader["CantidadASurtir"]),
                 CantidadNueva           = Convert.ToInt32(reader["CantidadASurtir"]),
                 PremezclaDistribucionID = Convert.ToInt32(reader["PremezclaDistribucionID"]),
             };
             distribucionIngredientesOrganizaciones.Add(distribucionIngredienteOrganizacion);
         }
         distribuciones.ForEach(datos =>
         {
             datos.ListaOrganizaciones =
                 distribucionIngredientesOrganizaciones.Where(
                     id => id.PremezclaDistribucionID == datos.PremezclaDistribucionID)
                 .Select(org => new DistribucionDeIngredientesOrganizacionInfo
             {
                 Lote                    = org.Lote,
                 Organizacion            = org.Organizacion,
                 CantidadSurtir          = org.CantidadNueva,
                 PremezclaDistribucionID =
                     org.PremezclaDistribucionID,
                 CostoTotal =
                     org.CantidadNueva * datos.CostoUnitario
             }).ToList();
         });
         return(distribuciones);
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }