private IList <PolizaInfo> ObtenerPoliza(List <PolizaEntradaSalidaPorAjusteModel> ajustesDeInventario) { var polizasSalidaAjuste = new List <PolizaInfo>(); TipoPolizaInfo tipoPoliza = TiposPoliza.FirstOrDefault(clave => clave.TipoPolizaID == TipoPoliza.SalidaAjuste.GetHashCode()); if (tipoPoliza == null) { throw new ExcepcionServicio(string.Format("{0} {1}", "EL TIPO DE POLIZA", TipoPoliza.SalidaAjuste)); } string textoDocumento = tipoPoliza.TextoDocumento; string tipoMovimiento = tipoPoliza.ClavePoliza; string postFijoRef3 = tipoPoliza.PostFijoRef3; var linea = 1; var almacenMovimientoBL = new AlmacenMovimientoBL(); List <AlmacenMovimientoDetalle> almancenMovimientosDetalle = ajustesDeInventario.Select(mov => new AlmacenMovimientoDetalle { AlmacenMovimientoDetalleID = mov.AlmacenMovimientoDetalleID }).ToList(); AlmacenMovimientoInfo almacenMovimiento = almacenMovimientoBL.ObtenerMovimientoPorClaveDetalle(almancenMovimientosDetalle); if (almacenMovimiento == null) { almacenMovimiento = new AlmacenMovimientoInfo(); } string archivoFolio = ObtenerArchivoFolio(almacenMovimiento.FechaMovimiento); AlmacenInfo almacen = ObtenerAlmacen(almacenMovimiento.AlmacenID); if (almacen == null) { almacen = new AlmacenInfo { Organizacion = new OrganizacionInfo() }; } OrganizacionInfo organizacion = ObtenerOrganizacionIVA(almacen.Organizacion.OrganizacionID); if (organizacion == null) { organizacion = new OrganizacionInfo { TipoOrganizacion = new TipoOrganizacionInfo() }; } var ref3 = new StringBuilder(); ref3.Append("03"); ref3.Append( string.Format("{0}{1}{2}", DateTime.Today.Day, DateTime.Today.Month, DateTime.Today.Year).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); //string numeroReferencia = ObtenerNumeroReferencia; string numeroReferencia = ObtenerNumeroReferenciaFolio(almacenMovimiento.FolioMovimiento); ParametroOrganizacionInfo parametroOrganizacionMerma; if (almacen.TipoAlmacen.TipoAlmacenID == TipoAlmacenEnum.Enfermeria.GetHashCode() || almacen.TipoAlmacen.TipoAlmacenID == TipoAlmacenEnum.ManejoGanado.GetHashCode() || almacen.TipoAlmacen.TipoAlmacenID == TipoAlmacenEnum.ReimplanteGanado.GetHashCode()) { parametroOrganizacionMerma = ObtenerParametroOrganizacionPorClave(organizacion.OrganizacionID, ParametrosEnum.CTAMERMAENG.ToString()); } else { parametroOrganizacionMerma = ObtenerParametroOrganizacionPorClave(organizacion.OrganizacionID, ParametrosEnum.CTAMERMA.ToString()); } if (parametroOrganizacionMerma == null) { throw new ExcepcionServicio("CUENTA DE MERMA NO CONFIGURADA"); } IList <CuentaSAPInfo> cuentasSAP = ObtenerCuentasSAP(); IList <CuentaAlmacenSubFamiliaInfo> almacenesSubFamilia = ObtenerCostosSubFamilia(almacen.AlmacenID); IList <ClaseCostoProductoInfo> almacenesProductos = ObtenerCostosProducto(almacen.AlmacenID); IList <ProductoInfo> productos = ObtenerProductos(); IList <UnidadMedicionInfo> unidades = ObtenerUnidadesMedicion(); ProductoInfo producto; ParametroOrganizacionInfo parametroCentroCosto = ObtenerParametroOrganizacionPorClave(organizacion.OrganizacionID, ParametrosEnum.CTACENTROCOSTOMP.ToString()); if (parametroCentroCosto == null) { throw new ExcepcionServicio(string.Format("{0}", "CENTRO DE COSTO NO CONFIGURADO")); } ClaseCostoProductoInfo almacenProducto; CuentaAlmacenSubFamiliaInfo almacenSubFamilia; CuentaSAPInfo cuentaSAP; bool afectaCosto; for (var indexAjustes = 0; indexAjustes < ajustesDeInventario.Count; indexAjustes++) { PolizaEntradaSalidaPorAjusteModel ajuste = ajustesDeInventario[indexAjustes]; cuentaSAP = null; producto = productos.FirstOrDefault(clave => clave.ProductoId == ajuste.ProductoID); if (producto == null) { throw new ExcepcionServicio(string.Format("CUENTA DE MERMA NO CONFIGURADA {0}", ajuste.ProductoID)); } afectaCosto = ValidarAfectacionCuentaCosto(producto); if (!afectaCosto && (almacen.TipoAlmacen.TipoAlmacenID == TipoAlmacenEnum.Enfermeria.GetHashCode() || almacen.TipoAlmacen.TipoAlmacenID == TipoAlmacenEnum.ManejoGanado.GetHashCode() || almacen.TipoAlmacen.TipoAlmacenID == TipoAlmacenEnum.ReimplanteGanado.GetHashCode())) { almacenSubFamilia = almacenesSubFamilia.FirstOrDefault(sub => sub.SubFamiliaID == producto.SubfamiliaId); if (almacenSubFamilia != null) { cuentaSAP = cuentasSAP.FirstOrDefault(cuenta => cuenta.CuentaSAPID == almacenSubFamilia.CuentaSAPID); } } else { almacenProducto = almacenesProductos.FirstOrDefault(prod => prod.ProductoID == producto.ProductoId); if (almacenProducto != null) { cuentaSAP = cuentasSAP.FirstOrDefault(cuenta => cuenta.CuentaSAPID == almacenProducto.CuentaSAPID); } } if (cuentaSAP == null) { throw new ExcepcionServicio(string.Format("{0} {1}", "CUENTA NO CONFIGURADA PARA EL PRODUCTO", producto.ProductoDescripcion)); } UnidadMedicionInfo unidad = unidades.FirstOrDefault(uni => uni.UnidadID == producto.UnidadId); if (unidad == null) { unidad = new UnidadMedicionInfo(); } CuentaSAPInfo cuentaCargo = cuentasSAP.FirstOrDefault( clave => clave.CuentaSAP.Equals(parametroOrganizacionMerma.Valor, StringComparison.CurrentCultureIgnoreCase)); if (cuentaCargo == null) { throw new ExcepcionServicio("CUENTA DE MERMA NO CONFIGURADA"); } var datos = new DatosPolizaInfo { NumeroReferencia = numeroReferencia, FechaEntrada = almacenMovimiento.FechaMovimiento, Folio = almacenMovimiento.FolioMovimiento.ToString(), Importe = string.Format("{0}", ajuste.Importe.ToString("F2")), Renglon = Convert.ToString(linea++), ImporteIva = "0", Ref3 = ref3.ToString(), Cuenta = parametroOrganizacionMerma.Valor, CentroCosto = parametroOrganizacionMerma.Valor.StartsWith(PrefijoCuentaCentroCosto) || parametroOrganizacionMerma.Valor.StartsWith(PrefijoCuentaCentroGasto) ? parametroCentroCosto.Valor : string.Empty, Division = organizacion.Division, ArchivoFolio = archivoFolio, DescripcionCosto = cuentaCargo.Descripcion, PesoOrigen = Math.Round(ajuste.Cantidad, 0), TipoDocumento = textoDocumento, ClaseDocumento = postFijoRef3, Concepto = String.Format("{0}-{1} {2} {3} {4}", tipoMovimiento, almacenMovimiento.FolioMovimiento, producto.ProductoDescripcion, string.Format("{0} {1}", ajuste.Cantidad.ToString("N2"), unidad.ClaveUnidad), ajuste.Precio.ToString("C2")), Sociedad = organizacion.Sociedad, Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacion.Sociedad), }; PolizaInfo polizaSalida = GeneraRegistroPoliza(datos); polizasSalidaAjuste.Add(polizaSalida); datos = new DatosPolizaInfo { NumeroReferencia = numeroReferencia, FechaEntrada = almacenMovimiento.FechaMovimiento, Folio = almacenMovimiento.FolioMovimiento.ToString(), Importe = string.Format("{0}", (ajuste.Importe * -1).ToString("F2")), Renglon = Convert.ToString(linea++), ImporteIva = "0", Ref3 = ref3.ToString(), Cuenta = cuentaSAP.CuentaSAP, Division = organizacion.Division, ArchivoFolio = archivoFolio, DescripcionCosto = cuentaSAP.Descripcion, CentroCosto = cuentaSAP.CuentaSAP.StartsWith(PrefijoCuentaCentroCosto) || cuentaSAP.CuentaSAP.StartsWith(PrefijoCuentaCentroGasto) ? parametroCentroCosto.Valor : string.Empty, PesoOrigen = Math.Round(ajuste.Cantidad, 0), TipoDocumento = textoDocumento, ClaseDocumento = postFijoRef3, Concepto = String.Format("{0}-{1} {2} {3} {4}", tipoMovimiento, almacenMovimiento.FolioMovimiento, producto.ProductoDescripcion, string.Format("{0} {1}", ajuste.Cantidad.ToString("N2"), unidad.ClaveUnidad), ajuste.Precio.ToString("C2")), Sociedad = organizacion.Sociedad, Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacion.Sociedad), }; polizaSalida = GeneraRegistroPoliza(datos); polizasSalidaAjuste.Add(polizaSalida); } return(polizasSalidaAjuste); }
private IList <ResultadoPolizaModel> GenerarPolizaCierreDiaPA(CierreDiaInventarioPAInfo cierreDiaInventarioPA, List <EstatusInfo> listaEstatusInventario, bool imprimePoliza) { EstatusInfo estatusAplicado = listaEstatusInventario.FirstOrDefault( esta => esta.DescripcionCorta.Trim().Equals(ConstantesBL.MovimientoAplicado.Trim())); if (estatusAplicado == null) { return(null); } var filtros = new FiltroAlmacenMovimientoInfo { AlmacenID = cierreDiaInventarioPA.AlmacenID, OrganizacionID = cierreDiaInventarioPA.OrganizacionID, TipoMovimientoID = TipoMovimiento.InventarioFisico.GetHashCode(), EstatusID = estatusAplicado.EstatusId, FolioMovimiento = cierreDiaInventarioPA.FolioMovimiento }; var almacenMovimientoDAL = new AlmacenMovimientoDAL(); List <ContenedorAlmacenMovimientoCierreDia> movimientos = almacenMovimientoDAL.ObtenerMovimientosInventarioFiltros(filtros); if (movimientos == null || !movimientos.Any()) { return(null); } var resultadosPolizaModel = new List <ResultadoPolizaModel>(); var listaDatosPolizaEntrada = new List <PolizaEntradaSalidaPorAjusteModel>(); var listaDatosPolizaSalida = new List <PolizaEntradaSalidaPorAjusteModel>(); foreach (var detalles in cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle.Where(det => (det.InventarioFisico - det.InventarioTeorico > 0))) { ContenedorAlmacenMovimientoCierreDia almacenMovimientoDetalle; if (detalles.ManejaLote) { almacenMovimientoDetalle = movimientos.FirstOrDefault( mov => mov.Producto.ProductoId == detalles.ProductoID && mov.AlmacenMovimientoDetalle.AlmacenInventarioLoteId == detalles.AlmacenInventarioLoteID); } else { almacenMovimientoDetalle = movimientos.FirstOrDefault( mov => mov.Producto.ProductoId == detalles.ProductoID); } if (almacenMovimientoDetalle == null) { continue; } int cantidadEntrada = Math.Abs(detalles.InventarioFisico - detalles.InventarioTeorico); var polizaDetalle = new PolizaEntradaSalidaPorAjusteModel { Importe = detalles.CostoUnitario * cantidadEntrada, Cantidad = cantidadEntrada, Precio = almacenMovimientoDetalle.AlmacenMovimientoDetalle.Precio, AlmacenMovimientoDetalleID = almacenMovimientoDetalle.AlmacenMovimientoDetalle.AlmacenMovimientoDetalleID, ProductoID = detalles.ProductoID, CantidadInventarioFisico = detalles.InventarioFisico, CantidadInventarioTeorico = detalles.InventarioTeorico, Observaciones = almacenMovimientoDetalle.AlmacenMovimiento.Observaciones, Lote = detalles.Lote }; listaDatosPolizaEntrada.Add(polizaDetalle); } foreach (var detalles in cierreDiaInventarioPA.ListaCierreDiaInventarioPADetalle.Where(det => (det.InventarioFisico - det.InventarioTeorico < 0))) { ContenedorAlmacenMovimientoCierreDia almacenMovimientoDetalle; if (detalles.ManejaLote) { almacenMovimientoDetalle = movimientos.FirstOrDefault( mov => mov.Producto.ProductoId == detalles.ProductoID && mov.AlmacenMovimientoDetalle.AlmacenInventarioLoteId == detalles.AlmacenInventarioLoteID); } else { almacenMovimientoDetalle = movimientos.FirstOrDefault( mov => mov.Producto.ProductoId == detalles.ProductoID); } if (almacenMovimientoDetalle == null) { continue; } int cantidadSalida = Math.Abs(detalles.InventarioFisico - detalles.InventarioTeorico); var polizaDetalle = new PolizaEntradaSalidaPorAjusteModel { Importe = detalles.CostoUnitario * cantidadSalida, Cantidad = cantidadSalida, Precio = almacenMovimientoDetalle.AlmacenMovimientoDetalle.Precio, AlmacenMovimientoDetalleID = almacenMovimientoDetalle.AlmacenMovimientoDetalle.AlmacenMovimientoDetalleID, ProductoID = detalles.ProductoID, CantidadInventarioFisico = detalles.InventarioFisico, CantidadInventarioTeorico = detalles.InventarioTeorico, Observaciones = almacenMovimientoDetalle.AlmacenMovimiento.Observaciones, Lote = detalles.Lote }; listaDatosPolizaSalida.Add(polizaDetalle); } if (listaDatosPolizaSalida.Any()) { var poliza = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(TipoPoliza.SalidaAjuste); IList <PolizaInfo> polizas = poliza.GeneraPoliza(listaDatosPolizaSalida); if (polizas != null) { MemoryStream stream = null; if (imprimePoliza) { stream = poliza.ImprimePoliza(listaDatosPolizaSalida, polizas); } var polizaBL = new PolizaBL(); polizas.ToList().ForEach(datos => { datos.UsuarioCreacionID = cierreDiaInventarioPA.UsuarioCreacionID; datos.OrganizacionID = cierreDiaInventarioPA.OrganizacionID; datos.ArchivoEnviadoServidor = 1; }); polizaBL.GuardarServicioPI(polizas, TipoPoliza.SalidaAjuste); var resultadoPolizaModel = new ResultadoPolizaModel { Polizas = polizas, PDFs = new Dictionary <TipoPoliza, MemoryStream> { { TipoPoliza.SalidaAjuste, stream } } }; resultadosPolizaModel.Add(resultadoPolizaModel); } } if (listaDatosPolizaEntrada.Any()) { var poliza = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(TipoPoliza.EntradaAjuste); IList <PolizaInfo> polizas = poliza.GeneraPoliza(listaDatosPolizaEntrada); if (polizas != null) { MemoryStream stream = null; if (imprimePoliza) { stream = poliza.ImprimePoliza(listaDatosPolizaEntrada, polizas); } var polizaBL = new PolizaBL(); polizas.ToList().ForEach(datos => { datos.UsuarioCreacionID = cierreDiaInventarioPA.UsuarioCreacionID; datos.OrganizacionID = cierreDiaInventarioPA.OrganizacionID; datos.ArchivoEnviadoServidor = 1; }); polizaBL.GuardarServicioPI(polizas, TipoPoliza.EntradaAjuste); var resultadoPolizaModel = new ResultadoPolizaModel { Polizas = polizas, PDFs = new Dictionary <TipoPoliza, MemoryStream> { { TipoPoliza.EntradaAjuste, stream } } }; resultadosPolizaModel.Add(resultadoPolizaModel); } } return(resultadosPolizaModel); }