Ejemplo n.º 1
0
        private IList <PolizaInfo> GeneraDatosPoliza(InterfaceSalidaTraspasoInfo interfaceSalidaTraspaso)
        {
            var polizasSalidaTraspaso = new List <PolizaInfo>();

            IList <CuentaSAPInfo> cuentasSap = ObtenerCuentasSAP();

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

            if (tipoPoliza == null)
            {
                throw new ExcepcionServicio(string.Format("{0} {1}", "EL TIPO DE POLIZA",
                                                          TipoPoliza.SalidaGanado));
            }
            string textoDocumento  = tipoPoliza.TextoDocumento;
            string postFijoRef3    = tipoPoliza.PostFijoRef3;
            string prefijoConcepto = tipoPoliza.ClavePoliza;

            OrganizacionInfo organizacionDestino =
                ObtenerOrganizacionIVA(interfaceSalidaTraspaso.OrganizacionDestino.OrganizacionID);

            OrganizacionInfo organizacionOrigen =
                ObtenerOrganizacionIVA(interfaceSalidaTraspaso.OrganizacionId);
            string divisionOrigen = organizacionOrigen.Division;

            long folioTraspaso = interfaceSalidaTraspaso.FolioTraspaso;

            var             animalBL = new AnimalBL();
            List <LoteInfo> lotes    =
                interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Select(lote => lote.Lote).ToList();
            List <AnimalInfo> animalesMovimientoSalidaTraspaso = animalBL.ObtenerMovimientosPorLoteXML(lotes);

            List <AnimalInfo> animalesMovimientoSacrificadosLote = animalBL.ObtenerMovimientosPorLoteSacrificadosXML(lotes);

            if (animalesMovimientoSacrificadosLote == null)
            {
                animalesMovimientoSacrificadosLote = new List <AnimalInfo>();
            }

            if (animalesMovimientoSalidaTraspaso != null && animalesMovimientoSalidaTraspaso.Any())
            {
                var costosGanadoTransferido = new List <InterfaceSalidaTraspasoCostoInfo>();
                var animalesMovimiento      = new List <AnimalMovimientoInfo>();
                animalesMovimientoSalidaTraspaso.ForEach(
                    movs => animalesMovimiento.AddRange(movs.ListaAnimalesMovimiento));

                var animalCostoBL = new AnimalCostoBL();
                List <AnimalCostoInfo> costosAnimal =
                    animalCostoBL.ObtenerCostosAnimal(animalesMovimientoSalidaTraspaso);

                var costoBL = new CostoBL();
                IList <CostoInfo> costos = costoBL.ObtenerTodos(EstatusEnum.Activo);

                List <AnimalInfo> animalesPorLote;
                List <AnimalInfo> animalesSacrificadosPorLote;

                int loteID;

                const string COMPLEMENTO_REF1       = "czas.";
                const string UNIDAD_MOVIMIENTO      = "Kgs.";
                const string DESCRIPCION_MOVIMIENTO = "CABEZAS";

                DateTime fechaEnvio = interfaceSalidaTraspaso.FechaEnvio;

                for (var indexLotes = 0; indexLotes < lotes.Count; indexLotes++)
                {
                    Thread.Sleep(999);
                    var ref3 = new StringBuilder();
                    ref3.Append("03");
                    ref3.Append(Convert.ToString(folioTraspaso).PadLeft(10, ' '));
                    ref3.Append(new Random(10).Next(10, 20));
                    ref3.Append(new Random(30).Next(30, 40));
                    ref3.Append(DateTime.Now.Millisecond);
                    ref3.Append(postFijoRef3);

                    var archivoFolio =
                        new StringBuilder(ObtenerArchivoFolio(fechaEnvio));
                    //var numeroDocumento =
                    //    new StringBuilder(string.Format("{0}{1}", folioTraspaso, ObtenerNumeroReferencia));
                    var numeroDocumento = ObtenerNumeroReferenciaFolio(folioTraspaso);

                    loteID          = lotes[indexLotes].LoteID;
                    animalesPorLote = (from ani in animalesMovimientoSalidaTraspaso
                                       from movs in animalesMovimiento
                                       where ani.AnimalID == movs.AnimalID &&
                                       movs.LoteID == loteID
                                       orderby ani.AnimalID
                                       select ani).ToList();
                    animalesSacrificadosPorLote =
                        animalesMovimientoSacrificadosLote.Where(lote => lote.LoteID == loteID).ToList();
                    var renglon = 1;
                    if (animalesPorLote.Any())
                    {
                        int cabezas = interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Where(
                            loteId => loteId.Lote.LoteID == loteID).Select(
                            cabe => cabe.Cabezas).FirstOrDefault();
                        int interfaceSalidaTraspasoDetalleID =
                            interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Where(
                                loteId => loteId.Lote.LoteID == loteID).Select(
                                cabe => cabe.InterfaceSalidaTraspasoDetalleID).FirstOrDefault();
                        animalesPorLote = EliminarAnimalesSacrificados(animalesPorLote,
                                                                       animalesSacrificadosPorLote);
                        animalesPorLote = animalesPorLote.Take(cabezas).ToList();
                        if (animalesPorLote.Any())
                        {
                            List <AnimalCostoInfo> costosAnimalesTraspasados =
                                costosAnimal.Join(animalesPorLote, info => info.AnimalID, cos => cos.AnimalID,
                                                  (info, cos) => info).ToList();
                            List <AnimalCostoInfo> costosAnimalesTraspasadosIndividual;
                            if (costosAnimalesTraspasados.Any())
                            {
                                costosAnimalesTraspasadosIndividual = costosAnimalesTraspasados
                                                                      .GroupBy(costoAnimal => new { costoAnimal.CostoID, costoAnimal.AnimalID })
                                                                      .Select(dinero => new AnimalCostoInfo
                                {
                                    AnimalCostoID =
                                        dinero.Select(id => id.AnimalCostoID).FirstOrDefault(),
                                    AnimalID   = dinero.Key.AnimalID,
                                    CostoID    = dinero.Key.CostoID,
                                    FechaCosto =
                                        dinero.Select(fecha => fecha.FechaCosto).
                                        FirstOrDefault(),
                                    FolioReferencia =
                                        dinero.Select(folio => folio.FolioReferencia).
                                        FirstOrDefault(),
                                    Importe        = dinero.Sum(imp => imp.Importe),
                                    OrganizacionID =
                                        dinero.Select(org => org.OrganizacionID).
                                        FirstOrDefault(),
                                    TipoReferencia =
                                        dinero.Select(tipo => tipo.TipoReferencia).
                                        FirstOrDefault()
                                }).ToList();

                                costosAnimalesTraspasados = costosAnimalesTraspasados
                                                            .GroupBy(costoAnimal => costoAnimal.CostoID)
                                                            .Select(dinero => new AnimalCostoInfo
                                {
                                    AnimalCostoID =
                                        dinero.Select(id => id.AnimalCostoID).FirstOrDefault(),
                                    AnimalID =
                                        dinero.Select(id => id.AnimalID).FirstOrDefault(),
                                    CostoID    = dinero.Select(id => id.CostoID).FirstOrDefault(),
                                    FechaCosto =
                                        dinero.Select(fecha => fecha.FechaCosto).
                                        FirstOrDefault(),
                                    FolioReferencia =
                                        dinero.Select(folio => folio.FolioReferencia).
                                        FirstOrDefault(),
                                    Importe        = dinero.Sum(imp => imp.Importe),
                                    OrganizacionID =
                                        dinero.Select(org => org.OrganizacionID).
                                        FirstOrDefault(),
                                    TipoReferencia =
                                        dinero.Select(tipo => tipo.TipoReferencia).
                                        FirstOrDefault()
                                }).ToList();
                                costosGanadoTransferido.AddRange(
                                    costosAnimalesTraspasadosIndividual.Select(
                                        dato => new InterfaceSalidaTraspasoCostoInfo
                                {
                                    AnimalID          = dato.AnimalID,
                                    Activo            = EstatusEnum.Activo,
                                    Importe           = dato.Importe,
                                    UsuarioCreacionID =
                                        interfaceSalidaTraspaso.
                                        UsuarioModificacionID.Value,
                                    Costo = new CostoInfo
                                    {
                                        CostoID =
                                            dato.CostoID
                                    },
                                    InterfaceSalidaTraspasoDetalle =
                                        new InterfaceSalidaTraspasoDetalleInfo
                                    {
                                        InterfaceSalidaTraspasoDetalleID
                                            =
                                                interfaceSalidaTraspasoDetalleID
                                    }
                                }));
                                ClaveContableInfo claveContableDestino;
                                ClaveContableInfo claveContableOrigen;
                                CostoInfo         costo;

                                CuentaSAPInfo   cuentaSapDestino;
                                CuentaSAPInfo   cuentaSapOrigen;
                                DatosPolizaInfo datos;
                                PolizaInfo      polizaSalida;

                                int cabezasRecibidas =
                                    interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Sum(cab => cab.Cabezas);
                                decimal         pesoOrigen = interfaceSalidaTraspaso.PesoBruto - interfaceSalidaTraspaso.PesoTara;
                                AnimalCostoInfo animalCosto;
                                for (var indexCostos = 0; indexCostos < costosAnimalesTraspasados.Count; indexCostos++)
                                {
                                    animalCosto = costosAnimalesTraspasados[indexCostos];
                                    costo       =
                                        costos.FirstOrDefault(
                                            id => id.CostoID == animalCosto.CostoID);
                                    claveContableDestino = ObtenerCuentaInventario(costo
                                                                                   , organizacionOrigen.OrganizacionID
                                                                                   ,
                                                                                   TipoOrganizacion.Ganadera.GetHashCode
                                                                                       ());
                                    claveContableOrigen = ObtenerCuentaInventario(costo
                                                                                  , organizacionDestino.OrganizacionID
                                                                                  , TipoPoliza.SalidaGanado);
                                    cuentaSapDestino =
                                        cuentasSap.FirstOrDefault(
                                            clave => clave.CuentaSAP.Equals(claveContableDestino.Valor));
                                    if (cuentaSapDestino == null)
                                    {
                                        throw new ExcepcionServicio(string.Format("{0} {1}",
                                                                                  "NO SE CUENTA CON CONFIGURACIÓN PARA CUENTA DE INVENTARIO",
                                                                                  claveContableDestino.Valor));
                                    }
                                    cuentaSapOrigen =
                                        cuentasSap.FirstOrDefault(
                                            clave => clave.CuentaSAP.Equals(claveContableOrigen.Valor));
                                    if (cuentaSapOrigen == null)
                                    {
                                        throw new ExcepcionServicio(string.Format("{0} {1}",
                                                                                  "NO SE CUENTA CON CONFIGURACIÓN PARA CUENTA DE TRANSITO",
                                                                                  claveContableOrigen.Valor));
                                    }
                                    datos = new DatosPolizaInfo
                                    {
                                        NumeroReferencia = numeroDocumento,
                                        FechaEntrada     = fechaEnvio,
                                        Folio            = folioTraspaso.ToString(),
                                        CabezasRecibidas = cabezasRecibidas.ToString(),
                                        NumeroDocumento  = folioTraspaso.ToString(),
                                        ClaseDocumento   = postFijoRef3,
                                        Importe          =
                                            string.Format("{0}", Cancelacion ? (animalCosto.Importe * -1).ToString("F2")
                                                                             : animalCosto.Importe.ToString("F2")),
                                        IndicadorImpuesto = String.Empty,
                                        Renglon           = Convert.ToString(renglon++),
                                        Cabezas           = Convert.ToString(cabezasRecibidas),
                                        ImporteIva        = "0",
                                        Ref3             = ref3.ToString(),
                                        ArchivoFolio     = archivoFolio.ToString(),
                                        DescripcionCosto = cuentaSapOrigen.Descripcion,
                                        Cuenta           = cuentaSapOrigen.CuentaSAP,
                                        PesoOrigen       = pesoOrigen,
                                        Division         = divisionOrigen,
                                        ComplementoRef1  = COMPLEMENTO_REF1,
                                        TipoDocumento    = textoDocumento,
                                        Concepto         =
                                            String.Format("{0}-{1} ,{2} {3}, {4} {5}", prefijoConcepto,
                                                          folioTraspaso,
                                                          cabezasRecibidas, DESCRIPCION_MOVIMIENTO,
                                                          pesoOrigen.ToString("N0"), UNIDAD_MOVIMIENTO),
                                        Sociedad = organizacionDestino.Sociedad,
                                        Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacionDestino.Sociedad),
                                    };
                                    polizaSalida = GeneraRegistroPoliza(datos);
                                    polizasSalidaTraspaso.Add(polizaSalida);

                                    datos = new DatosPolizaInfo
                                    {
                                        NumeroReferencia = numeroDocumento,
                                        FechaEntrada     = fechaEnvio,
                                        Folio            = folioTraspaso.ToString(),
                                        CabezasRecibidas = cabezasRecibidas.ToString(),
                                        NumeroDocumento  = folioTraspaso.ToString(),
                                        ClaseDocumento   = postFijoRef3,
                                        Importe          =
                                            string.Format("{0}", Cancelacion ? animalCosto.Importe.ToString("F2")
                                                                             : (animalCosto.Importe * -1).ToString("F2")),
                                        IndicadorImpuesto = String.Empty,
                                        Renglon           = Convert.ToString(renglon++),
                                        Cabezas           = Convert.ToString(cabezasRecibidas),
                                        ImporteIva        = "0",
                                        Ref3             = ref3.ToString(),
                                        ArchivoFolio     = archivoFolio.ToString(),
                                        DescripcionCosto = cuentaSapDestino.Descripcion,
                                        Cuenta           = cuentaSapDestino.CuentaSAP,
                                        PesoOrigen       = pesoOrigen,
                                        Division         = divisionOrigen,
                                        ComplementoRef1  = COMPLEMENTO_REF1,
                                        TipoDocumento    = textoDocumento,
                                        Concepto         =
                                            String.Format("{0}-{1} ,{2} {3}, {4} {5}", prefijoConcepto,
                                                          folioTraspaso,
                                                          cabezasRecibidas, DESCRIPCION_MOVIMIENTO,
                                                          pesoOrigen.ToString("N0"), UNIDAD_MOVIMIENTO),
                                        Sociedad = organizacionDestino.Sociedad,
                                        Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacionDestino.Sociedad),
                                    };
                                    polizaSalida = GeneraRegistroPoliza(datos);
                                    polizasSalidaTraspaso.Add(polizaSalida);
                                }
                            }
                        }
                    }
                }
                if (costosGanadoTransferido.Any())
                {
                    var interfaceSalidaTraspasoCostoBL = new InterfaceSalidaTraspasoCostoBL();
                    interfaceSalidaTraspasoCostoBL.Guardar(costosGanadoTransferido);
                }
            }
            return(polizasSalidaTraspaso);
        }