/// <summary>
        /// Genera los nodos correspondientes a la poliza de una salida de ganado en transito por muerte
        /// </summary>
        /// <param name="datosPoliza">El objeto SalidaGanadoEnTransitoInfo con la informacion de la salida de ganado en transito por muerte al que se le generara la poliza</param>
        /// <returns>Regresa la lista de nodos de la poliza generada por la salida de ganado en transito por muerte</returns>
        public override IList <PolizaInfo> GeneraPoliza(object datosPoliza)
        {
            try
            {
                IList <PolizaInfo> polizaSalida = new List <PolizaInfo>();
                var input = (SalidaGanadoEnTransitoInfo)datosPoliza;
                detalles = input.DetallesSalida;
                datos    = ObtenerDatosPolizaSalidaPorMuerte(input);

                var noLinea = 1;

                //genera el ref3:
                var ref3 = new StringBuilder();
                ref3.Append("03");
                ref3.Append(Convert.ToString(input.Folio).PadLeft(10, ' '));
                ref3.Append(new Random(10).Next(10, 20));
                ref3.Append(new Random(30).Next(30, 40));
                ref3.Append(DateTime.Now.Millisecond.ToString(CultureInfo.InvariantCulture));
                ref3.Append(datos.PostFijoRef3);
                //

                //genera el folio de archivo:
                var archivoFolio = new StringBuilder();
                archivoFolio.Append("P01");
                archivoFolio.Append(input.Fecha.ToString("yyyyMMdd"));
                archivoFolio.Append(DateTime.Now.Minute);
                archivoFolio.Append(DateTime.Now.Second);
                archivoFolio.Append(new Random(1).Next(1, 9));
                //

                //busca el costo de ganado
                var costoGanado = input.Costos.FirstOrDefault(costo => costo.CostoID == Costo.CostoGanado.GetHashCode());
                //

                if (costoGanado != null)
                {
                    //calcula el importe total sumando los importes de los detalles
                    if (input.DetallesSalida != null)
                    {
                        input.Importe = input.DetallesSalida.Sum(x => x.ImporteCosto);

                        #region Primer nodo : Total de costos de salida

                        //genera un nodo generico de la poliza por salida de ganado en transito por muerte
                        var nodo1 = GenerarNodoPlantillaPolizaMuerteTransito(input, noLinea, ref3.ToString(),
                                                                             archivoFolio.ToString());
                        //

                        //busca la cuenta de Faltantes / Sobrantes de la organizacion que registro la salida de ganado en transito
                        var parOrganizacion = new ParametroOrganizacionBL();
                        var claveCuenta     = parOrganizacion.ObtenerPorOrganizacionIDClaveParametro(input.OrganizacionID,
                                                                                                     ParametrosEnum.CTAFALTANTESOBRANTE.ToString());
                        nodo1.Cuenta = claveCuenta.Valor;
                        if (claveCuenta.Valor.Substring(0, 4) == "5001")
                        {
                            nodo1.CentroCosto = datos.ParametroOrganizacionValor;
                        }
                        //

                        var importeCostos = input.DetallesSalida.Sum(costo => costo.ImporteCosto);
                        nodo1.Importe = "-" + importeCostos.ToString(CultureInfo.InvariantCulture);
                        polizaSalida.Add(nodo1);

                        #endregion

                        #region segundo nodo : Costo de salida correspondiente a salida de ganado

                        noLinea++;
                        ClaveContableInfo clavecontablecargo;
                        var nodo2 = GenerarNodoPlantillaPolizaMuerteTransito(input, noLinea, ref3.ToString(),
                                                                             archivoFolio.ToString());

                        if (claveCuenta.Valor.Substring(0, 4) == "5001")
                        {
                            nodo2.CentroCosto = datos.ParametroOrganizacionValor;
                        }
                        var salidaPorMuerteEnTransitoDetalle =
                            input.DetallesSalida.FirstOrDefault(
                                detalle => detalle.CostoId == Costo.CostoGanado.GetHashCode());
                        if (salidaPorMuerteEnTransitoDetalle != null)
                        {
                            nodo2.Importe =
                                salidaPorMuerteEnTransitoDetalle.ImporteCosto.ToString(CultureInfo.InvariantCulture);
                        }
                        else
                        {
                            var ex = new Exception(Properties.ResourceServices.PolizaSalidaMuerteGanadoTransito_CostosGanadoNoEncontrado);
                            Logger.Error(ex);
                            throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
                        }

                        costos = ObtenerCostos();
                        var firstOrDefault = costos.FirstOrDefault(x => x.CostoID == costoGanado.CostoID);
                        if (firstOrDefault != null)
                        {
                            var costoAbonos = new CostoInfo
                            {
                                ClaveContable = firstOrDefault.ClaveContable
                            };
                            clavecontablecargo = ObtenerCuentaInventario(costoAbonos, input.OrganizacionID,
                                                                         TipoPoliza.SalidaMuerteEnTransito);
                            if (clavecontablecargo != null)
                            {
                                nodo2.Cuenta = clavecontablecargo.Valor;
                            }
                        }
                        else
                        {
                            var ex = new Exception(Properties.ResourceServices.PolizaSalidaMuerteGanadoTransito_CostosGanadoNoEncontrado);
                            Logger.Error(ex);
                            throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
                        }
                        polizaSalida.Add(nodo2);

                        #endregion

                        #region nodos de detalles importes costo corral

                        var nodosDetalles = new List <PolizaInfo>();
                        var costosPl      = new CostoPL();
                        var costosclaves  = costosPl.ObtenerTodos(EstatusEnum.Activo);

                        //agrega todos los costos de los detalles excepto el costo de ganado (por que ya se encuentra agregado)
                        foreach (
                            var costoCargo in
                            input.DetallesSalida.SkipWhile(costo => costo.CostoId == Costo.CostoGanado.GetHashCode())
                            )
                        {
                            noLinea++;

                            var temp = GenerarNodoPlantillaPolizaMuerteTransito(input, noLinea, ref3.ToString(),
                                                                                archivoFolio.ToString());
                            if (costosclaves == null)
                            {
                                var ex = new Exception(Properties.ResourceServices.PolizaSalidaMuerteGanadoTransito_CostosNoEncontrados);
                                Logger.Error(ex);
                                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
                            }
                            var claveCosto = costosclaves.FirstOrDefault(x => x.CostoID == costoCargo.CostoId);
                            if (claveCosto != null)
                            {
                                var costosAbono = new CostoInfo
                                {
                                    ClaveContable = claveCosto.ClaveContable
                                };
                                //busca la clave contable para el costo correspondiente
                                clavecontablecargo = ObtenerCuentaInventario(costosAbono, input.OrganizacionID,
                                                                             TipoPoliza.SalidaMuerteEnTransito);
                                if (clavecontablecargo != null)
                                {
                                    temp.Cuenta = clavecontablecargo.Valor;
                                }
                            }
                            else
                            {
                                var ex = new Exception(
                                    string.Format(Properties.ResourceServices.PolizaSalidaMuerteGanadoTransito_CostoIdNoEncontrado, costoCargo.CostoId));
                                Logger.Error(ex);
                                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
                            }
                            if (claveCuenta.Valor.Substring(0, 4) == "5001")
                            {
                                temp.CentroCosto = datos.ParametroOrganizacionValor;
                            }
                            temp.Importe = costoCargo.ImporteCosto.ToString(CultureInfo.InvariantCulture);
                            nodosDetalles.Add(temp);
                        }

                        foreach (var polizaItem in nodosDetalles)
                        {
                            polizaSalida.Add(polizaItem);
                        }

                        #endregion
                    }
                    else
                    {
                        var ex = new Exception(Properties.ResourceServices.PolizaSalidaMuerteGanadoTransito_DetalleSalidaGanadoTransitoNoProporcionados);
                        Logger.Error(ex);
                        throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
                    }
                }
                else
                {
                    var ex = new Exception(Properties.ResourceServices.PolizaSalidaMuerteGanadoTransito_CostosGanadoNoEncontrado);
                    Logger.Error(ex);
                    throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
                }
                return(polizaSalida);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }
Exemple #2
0
        /// <summary>
        /// Metodo para armar los objetos para generar poliza
        /// </summary>
        /// <param name="datosPoliza">Objeto salidaGanadotransitoInfo</param>
        /// <returns>poliza</returns>
        public override IList <PolizaInfo> GeneraPoliza(object datosPoliza)
        {
            IList <PolizaInfo> polizaSalida = new List <PolizaInfo>();

            var noLinea         = 1;
            var costosPl        = new CostoPL();
            var cliente         = new ClientePL();
            var cuentasSap      = ObtenerCuentasSAP();
            var interfaceBl     = new InterfaceSalidaBL();
            var parOrganizacion = new ParametroOrganizacionBL();
            var parametroCentro = new ParametroOrganizacionInfo();
            var input           = (SalidaGanadoEnTransitoInfo)datosPoliza;
            var costosClaves    = costosPl.ObtenerTodos(EstatusEnum.Activo);
            var costoAbono      = new CostoInfo {
                ClaveContable = string.Empty
            };
            var costoGanado = input.Costos.FirstOrDefault(x => x.CostoID == Costo.CostoGanado.GetHashCode());
            var claveCuenta = parOrganizacion.ObtenerPorOrganizacionIDClaveParametro(input.OrganizacionID, ParametrosEnum.CTAFALTANTESOBRANTE.ToString());

            ClaveContableInfo clavecontablecargo;

            detalles      = input.DetallesSalida;
            datos         = obtenerDatosPolizaSalidaPorVenta(input);
            input.Cliente = cliente.ObtenerPorID(input.Cliente.ClienteID);

            //la var datos debe contener datos para poder acceder a su valor en la propiedad PostFijoRef3
            var ref3         = Ref3(input);
            var archivoFolio = ArchivoFolio(input);

            #region linea1(+) Proveedor
            var linea1 = InicializarPolizaInfo(input, ref3, archivoFolio, noLinea);
            linea1.Importe = input.Importe.ToString("N", CultureInfo.InvariantCulture);
            linea1.Cliente = input.Cliente.CodigoSAP;
            //linea1.Cuenta = input.Cliente.CodigoSAP;
            polizaSalida.Add(linea1);
            noLinea++;
            #endregion

            #region linea2(-) Beneficiario
            var linea2 = InicializarPolizaInfo(input, ref3, archivoFolio, noLinea);
            //linea2.Cliente = input.Cliente.CodigoSAP;
            linea2.Importe = "-" + input.Importe.ToString("N", CultureInfo.InvariantCulture);
            var claveContableAbono = interfaceBl.ObtenerCuentaInventario(costoAbono, input.OrganizacionID, ClaveCuenta.CuentaBeneficioInventario);

            if (claveContableAbono != null)
            {
                var cuentaSap = cuentasSap.FirstOrDefault(clave => clave.CuentaSAP == claveContableAbono.Valor);
                claveContableAbono.Descripcion = cuentaSap == null ? string.Empty : cuentaSap.Descripcion;
            }
            else
            {
                claveContableAbono = new ClaveContableInfo
                {
                    Valor = string.Empty
                };
            }

            var beneficio = false;
            if (claveContableAbono.Valor.StartsWith(PrefijoCuentaCentroBeneficio))
            {
                parametroCentro = ObtenerParametroOrganizacionPorClave(input.OrganizacionID, ParametrosEnum.CTACENTROBENEFICIOENG.ToString());

                if (parametroCentro == null)
                {
                    throw new ExcepcionServicio(string.Format("{0}", "CENTRO DE BENEFICIO NO CONFIGURADO"));
                }
                beneficio = true;
            }
            else
            {
                if (claveContableAbono.Valor.StartsWith(PrefijoCuentaCentroCosto) || claveContableAbono.Valor.StartsWith(PrefijoCuentaCentroGasto))
                {
                    parametroCentro = ObtenerParametroOrganizacionPorClave(input.OrganizacionID, ParametrosEnum.CTACENTROCOSTOENG.ToString());

                    if (parametroCentro == null)
                    {
                        throw new ExcepcionServicio(string.Format("{0}", "CENTRO DE BENEFICIO NO CONFIGURADO"));
                    }
                }
            }
            if (beneficio)
            {
                linea2.CentroBeneficio = parametroCentro.Valor;
            }
            else
            {
                linea2.CentroCosto = parametroCentro.Valor;
            }

            linea2.Cuenta = claveContableAbono.Valor;
            polizaSalida.Add(linea2);
            noLinea++;
            #endregion

            #region linea3 cargo a cuenta costo ganado(-)
            //se elimino esta linea
            #endregion

            #region linea4 cargo a costo corral(-)
            if (costoGanado == null)
            {
                return(polizaSalida);
            }

            var linea4 = InicializarPolizaInfo(input, ref3, archivoFolio, noLinea);
            linea4.Cuenta = claveCuenta.Valor;

            if (claveCuenta.Valor.Substring(0, 4) == "5001")
            {
                linea4.CentroCosto = datos.ParametroOrganizacionValor;
            }

            var importeCostos = input.DetallesSalida.Sum(costo => costo.ImporteCosto);

            linea4.Importe = "-" + importeCostos.ToString(CultureInfo.InvariantCulture);
            polizaSalida.Add(linea4);
            noLinea++;
            #endregion

            #region linea5 cargoACuentaResultados (-)(importe total)
            var linea5 = InicializarPolizaInfo(input, ref3, archivoFolio, noLinea);

            if (claveCuenta.Valor.Substring(0, 4) == "5001")
            {
                linea5.CentroCosto = datos.ParametroOrganizacionValor;
            }

            var salidaVentaTransito = input.DetallesSalida.FirstOrDefault(detalle => detalle.CostoId == Costo.CostoGanado.GetHashCode());
            if (salidaVentaTransito != null)
            {
                linea5.Importe = salidaVentaTransito.ImporteCosto.ToString(CultureInfo.InvariantCulture);
            }

            costos = ObtenerCostos();
            var firstOrDefault = costos.FirstOrDefault(x => x.CostoID == costoGanado.CostoID);

            if (firstOrDefault != null)
            {
                costoAbono.ClaveContable = firstOrDefault.ClaveContable;
                clavecontablecargo       = ObtenerCuentaInventario(costoAbono, input.OrganizacionID, TipoPoliza.PolizaMuerteTransito);
                if (clavecontablecargo != null)
                {
                    linea5.Cuenta = clavecontablecargo.Valor;
                }
            }

            polizaSalida.Add(linea5);
            noLinea++;
            #endregion

            #region linea6 abono a cuenta Resultados a la misma cuenta que el punto anterior en foreach
            var linea6 = new List <PolizaInfo>();

            foreach (var costoCargo in input.DetallesSalida.SkipWhile(costo => costo.CostoId == Costo.CostoGanado.GetHashCode()))
            {
                var temp = InicializarPolizaInfo(input, ref3, archivoFolio, noLinea);
                temp.Importe = costoCargo.ImporteCosto.ToString(CultureInfo.InvariantCulture);

                var claveCosto = costosClaves.FirstOrDefault(x => x.CostoID == costoCargo.CostoId);
                if (claveCosto != null)
                {
                    costoAbono.ClaveContable = claveCosto.ClaveContable;
                    clavecontablecargo       = ObtenerCuentaInventario(costoAbono, input.OrganizacionID, TipoPoliza.PolizaMuerteTransito);
                    if (clavecontablecargo != null)
                    {
                        temp.Cuenta = clavecontablecargo.Valor;
                    }
                }

                if (claveCuenta.Valor.Substring(0, 4) == "5001")
                {
                    temp.CentroCosto = datos.ParametroOrganizacionValor;
                }

                linea6.Add(temp);
                noLinea++;
            }

            foreach (var polizaItem in linea6)
            {
                polizaSalida.Add(polizaItem);
            }
            #endregion

            return(polizaSalida);
        }