Option Explicit On Option Strict On Imports System.Data Imports Extensiones Imports Microsoft.Reporting.WebForms Partial Class Inventarios_RepApartados Inherits ClsPaginas #Region " PROPIEDADES " Private Property DtApartados As DataTable Get Return DirectCast(ViewState("DtApartados"), DataTable) End Get Set(value As DataTable) ViewState("DtApartados") = value End Set End Property #End Region Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load If Not IsPostBack Then SetValues() InicializaParam() End If End Sub #Region " SET VALUES " Private Sub SetValues() DdlSubProyectos.DataSource = GlobalDTSubProyectos(-1, CveEmpresa:=UsuarioActual.CveEmpresa) DdlSubProyectos.DataBind() DdlSubProyectos.Items.Insert(0, New ListItem(" Todas ", "-1")) If UsuarioActual.Empresa.Funcionalidad(105) = "1" Then DdlClientesWS.setEsWebService(True) Else DdlClientesWS.setEsWebService(False) DdlClientesWS.DataSource = GlobalDTCliente(UsuarioActual.CveEmpresa, -1) DdlClientesWS.DataBind() DdlClientesWS.ddl.Items.Insert(0, New ListItem("Todos", "-1")) End If DdlClienteTraspasar.setEsWebService(True) DdlVendedor.DataSource = GlobalDTVendedores(UsuarioActual.CveEmpresa, Estatus:=-1) DdlVendedor.DataBind() DdlVendedor.Items.Insert(0, New ListItem(" Todos ", "-1")) 'FUNCIONALIDAD 105 If UsuarioActual.Empresa.Funcionalidad(105) = "1" Then DdlPS.setEsWebService(True) Else DdlPS.setEsWebService(False) 'FUNCIONALIDAD DE COMPUESTO If UsuarioActual.Empresa.Funcionalidad(143) = "1" Then DdlPS.ddl.DataTextField = "PSCodigoCompuesto" End If DdlPS.DataSource = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa) DdlPS.DataBind() End If txtFechaI.Text = Now.FirstDayOfMonth.ToShortDateString txtFechaF.Text = Now.ToShortDateString End Sub #End Region Private Sub InicializaParam() Dim Anio, Mes, AnioMes, Fecha, FechaI, FechaF As String Dim CveCliente, CveVendedor, CveSucursal, CvePS As String Anio = If(Request("Anio") IsNot Nothing, Request("Anio").ToString, "-1").ToString Mes = If(Request("Mes") IsNot Nothing, Request("Mes").ToString, "-1").ToString AnioMes = If(Request("AnioMes") IsNot Nothing, Request("AnioMes").ToString, "-1").ToString Fecha = If(Request("Fecha") IsNot Nothing, Request("Fecha").ToString, "-1").ToString FechaI = If(Request("FechaI") IsNot Nothing, Request("FechaI").ToString, "-1").ToString FechaF = If(Request("FechaF") IsNot Nothing, Request("FechaF").ToString, "-1").ToString CveCliente = If(Request("CveCliente") IsNot Nothing AndAlso Request("CveCliente").ToEntero() > 0, Request("CveCliente").ToEntero(), -1).ToString CveVendedor = If(Request("CveVendedor") IsNot Nothing AndAlso Request("CveVendedor").ToEntero() > 0, Request("CveVendedor").ToEntero(), -1).ToString CveSucursal = If(Request("CveSubProyecto") IsNot Nothing AndAlso Request("CveSubProyecto").ToEntero() > 0, Request("CveSubProyecto").ToEntero(), -1).ToString CvePS = If(Request("CvePS") IsNot Nothing AndAlso Request("CvePS").ToEntero() > 0, Request("CvePS").ToEntero(), -1).ToString If FechaF <> "-1" Then txtFechaF.Text = FechaF End If If FechaI <> "-1" Then txtFechaI.Text = FechaI End If txtFechaI.Text = If(Anio <> "-1", String.Format("01/01/{0}", Anio), txtFechaI.Text) txtFechaI.Text = If(Mes <> "-1", String.Format("01/{0}/0001", Mes), txtFechaI.Text) Dim sMes As String Dim sAnio As String = If(AnioMes <> "-1", AnioMes.Substring(0, 4), "") If AnioMes.Trim.Length = 7 Then sMes = AnioMes.Substring(5, 2).ToEntero.ToString("00") Else sMes = If(AnioMes <> "-1", AnioMes.Substring(5, 1).ToEntero.ToString("00"), "") End If txtFechaI.Text = If(AnioMes <> "-1", String.Format("01/{0}/{1}", sMes, sAnio), txtFechaI.Text) If Anio <> "-1" Then txtFechaF.Text = String.Format("31/12/{0}", Anio) ElseIf Mes <> "-1" Then txtFechaF.Text = String.Format("{0}/{1}/{2}", txtFechaI.Text.ToDate.LastDayOfMonth.Day, Mes, Now.Year) ElseIf AnioMes <> "-1" Then txtFechaF.Text = txtFechaI.Text.ToDate.LastDayOfMonth.ToShortDateString End If If Fecha <> "-1" Then txtFechaI.Text = Fecha txtFechaF.Text = Fecha End If If CveCliente <> "-1" Then DdlClientesWS.SelectedValue = CveCliente DdlClientesWS.SelectedText = GlobalDTCliente(UsuarioActual.CveEmpresa).FiltroPrimeroValor("NombreComercial", $"CveCliente ={CveCliente}") Else DdlClientesWS.SelectedValue = CveCliente DdlClientesWS.SelectedText = "Todos" End If DdlClienteTraspasar.SelectedValue = "-1" DdlClienteTraspasar.SelectedText = "Seleccione" If UsuarioActual.CveVendedor > 0 AndAlso CveVendedor.ToEntero <= 0 Then CveVendedor = UsuarioActual.CveVendedor.ToString End If DdlVendedor.SelectedValueExist(CveVendedor) DdlSubProyectos.SelectedValueExist(CveSucursal) 'DdlPS.ddl.SelectedValueExist(CvePS) DdlPS.SelectedValue = CvePS If CvePS <> "-1" Then DdlPS.SelectedValue = CvePS DdlPS.SelectedText = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=CvePS.ToEntero)(0)("PSCodigo").ToString Else DdlPS.SelectedValue = CvePS DdlPS.SelectedText = "Todos" End If If Anio <> "-1" Or Mes <> "-1" Or AnioMes <> "-1" Or Fecha <> "-1" Or FechaI <> "-1" Or FechaF <> "-1" Or CveCliente <> "-1" Or CveVendedor <> "-1" Or CveSucursal <> "-1" Or CvePS <> "-1" Then CargaDatos() End If End Sub Protected Sub BtnConsultar_Click(sender As Object, e As EventArgs) CargaDatos() End Sub Private Sub CargaDatos() Dim CveAlmacenApartado = -1 If DdlSubProyectos.SelectedValue.ToEntero > 0 Then CveAlmacenApartado = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltroPrimeroValor("CveAlmacen", $"CveTipoAlmacen IN (9) And Estatus = 'Activo' And CveSubProyecto = {DdlSubProyectos.SelectedValue.ToEntero}").ToEntero If CveAlmacenApartado <= 0 Then Alert("No se encontro el almacen de Apartado de la sucursal seleccionada. Por favor verifique y vuelva a intentar.", TipoMensaje.MsgAdvertencia) Exit Sub End If End If Dim ObjInventarios As New ClsInventarios If ObjInventarios.ApartadosRep(CveAlmacenApartado, DdlClientesWS.SelectedValue.ToEntero, DdlVendedor.SelectedValue.ToEntero, UsuarioActual.CveEmpresa, DdlPS.SelectedValue.ToEntero, txtFechaI.Text.ToDate, txtFechaF.Text.ToDate) Then DtApartados = ObjInventarios.DtResultados End If ObjInventarios.Dispose() GvDatos.DataSource = DtApartados If DdlSubProyectos.SelectedValue.ToEntero() > 0 AndAlso DtApartados.COUNT("CveVendedor", $"CveVendedor={UsuarioActual.CveVendedor}") > 0 Then GvDatos.Columns(6).Visible = True LnkTraspasarApartados.Visible = True End If GvDatos.DataBind() UpDatos.Update() UpTraspasar.Update() End Sub Protected Sub GvDatos_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GvDatos.RowDataBound If e.Row.RowType = DataControlRowType.DataRow Then If e.Row.DBCampo("IDGPO").ToString.ToEntero = 1 Then e.Row.CssClass = "Totales" End If If e.Row.DBCampo("IDGPO").ToString.ToEntero = 2 Then e.Row.CssClass = "SubTotales2" End If If e.Row.DBCampo("IDGPO").ToString.ToEntero = 3 Then If DdlSubProyectos.SelectedValue.ToEntero() > 0 AndAlso e.Row.DBCampo("CveVendedor").ToEntero() = UsuarioActual.CveVendedor Then e.Row.FCTextBox("TxtCantidad").Visible = True e.Row.FCRangeValidator("RVCantidad").Visible = True e.Row.FCTextBox("TxtCantidad").Attributes.Add("onkeyup", $"LimitaCantidad({e.Row.FCTextBox("TxtCantidad").ClientID},{e.Row.DBCampo("Cantidad").ToEntero});") End If End If End If End Sub #Region "PDF" Private Sub LnkPdf_Click(sender As Object, e As EventArgs) Handles LnkPdf.Click If DtApartados IsNot Nothing Then Dim StrFiltro As New StringBuilder If txtFechaI.Text <> "" Then StrFiltro.AppendFormat(" Fecha Inicio: {0}", txtFechaI.Text) If txtFechaF.Text <> "" Then StrFiltro.AppendFormat(" Fecha Fin: {0}", txtFechaF.Text) If DdlSubProyectos.SelectedValue <> "-1" Then StrFiltro.AppendFormat(" Sucursal: {0}", DdlSubProyectos.SelectedItem.Text) If DdlVendedor.SelectedValue <> "-1" Then StrFiltro.AppendFormat(" Vendedor: {0}", DdlVendedor.SelectedItem.Text) If DdlClientesWS.SelectedValue <> "-1" Then StrFiltro.AppendFormat(" Cliente: {0}", DdlClientesWS.SelectedText) If DdlPS.SelectedValue <> "-1" Then StrFiltro.AppendFormat(" Producto/Servicio: {0}", DdlPS.SelectedText) Dim Imagen As New System.IO.FileInfo(String.Format("{0}/Logo.png", UsuarioActual.Empresa.Ruta)) Dim logouri = String.Format("{0}://{1}:{2}/Empresas/{3}/Logo.png", Request.Url.Scheme, Request.Url.Host, Request.Url.Port, UsuarioActual.CveEmpresa) Dim params As New List(Of ReportParameter) params.Add(New ReportParameter("NombreEmpresa", UsuarioActual.Empresa.Empresa)) params.Add(New ReportParameter("UsuarioImprimio", UsuarioActual.Nombre)) params.Add(New ReportParameter("FechaImpresion", Now.ToDateTime.ToShortDateString)) params.Add(New ReportParameter("Filtros", StrFiltro.ToString)) If Imagen.Exists Then params.Add(New ReportParameter("LogoPath", logouri)) Else params.Add(New ReportParameter("LogoPath", "")) End If ImprimirPDF("Empresas/Grales/Formatos/RepApartados.rdlc", DtApartados, params, String.Format("ReporteApartados-{0}", Now.ToDateTime.ToShortDateString)) Else Alert("No hay datos consultados", TipoMensaje.MsgAdvertencia) End If End Sub Private Sub ImgExcel_Click(sender As Object, e As EventArgs) Handles ImgExcel.Click GvDatos.ExportToExcel("Reporte de Apartados" & Now.ToShortDateString) End Sub #End Region Protected Sub LnkTraspasarApartados_Click(sender As Object, e As EventArgs) LtlAlmacen.Text = GlobalDTAlmacen(UsuarioActual.CveEmpresa, CveTipoAlmacen:=9).FiltroPrimeroValor("Almacen", $"CveSubProyecto={DdlSubProyectos.SelectedValue.ToEntero()}") TxtObs.Text = "" DdlClienteTraspasar.SelectedValue = "-1" DdlClienteTraspasar.SelectedText = "Seleccione" UpTraspasar.Update() UpGenerarTraspaso.Update() RegistraScript("$('#ModalTraspaso').modal('show');") End Sub Protected Sub BtnTraspasar_Click(sender As Object, e As EventArgs) If DdlClienteTraspasar.SelectedValue.ToEntero() <= 0 Then Alert("No se ha seleccionado ningun cliente", TipoMensaje.MsgAdvertencia) Exit Sub End If If Not GvDatos.Rows.Cast(Of GridViewRow).Any(Function(gvr) gvr.FCTextBox("TxtCantidad").Text.ToEntero() > 0) Then Alert("No se ha seleccionado ningun producto para realizar el traspaso", TipoMensaje.MsgAdvertencia) Exit Sub End If Dim ErrorMovInv As Boolean = False Dim Mensaje As StringBuilder = New StringBuilder Dim SalidasAlmacen As New List(Of MMovimientoAlmacen) Dim EntradasAlmacen As New List(Of MMovimientoAlmacen) Dim ObjInventario As New ClsInventarios ObjInventario.IniciaTransacSQL() Try Dim CveClienteTraspasar As Integer = DdlClienteTraspasar.SelectedValue.ToEntero() Dim CveAlmacenApartado As Integer = GlobalDTAlmacen(UsuarioActual.CveEmpresa, CveTipoAlmacen:=9).FiltroPrimeroValor("CveAlmacen", $"CveSubProyecto={DdlSubProyectos.SelectedValue.ToEntero()}").ToEntero() Dim DtTraspaso As DataTable = CrearDTTraspasosClientes() 'SE VAN A REALIZAR LOS MOVIMIENTOS POR CADA CLIENTE CONSIDERADO For Each Row As DataRow In DtTraspaso.FiltraParametros("", DistinctColumns:={"CveCliente", "CveVendedor"}).Rows 'SACA LOS PS A TRASPASAR Dim DtPSTraspasar As DataTable = DtTraspaso.FiltraParametros($"CveCliente={Row("CveCliente")} AND CveVendedor={Row("CveVendedor")}") 'CUADRA LOS LOS PRODUCTOS CON LO QUE SE PUEDE DESAPARTAR Dim DtDetalleTraspasar As DataTable = CuadrarMovimientosApartado(CveAlmacenApartado, Row("CveCliente").ToString().ToEntero(), Row("CveVendedor").ToString().ToEntero(), DtPSTraspasar, ObjInventario) If DtDetalleTraspasar.Rows.Count = 0 Then ErrorMovInv = True Mensaje.Append("No se encontraron productos para realizar el traspaso.") End If DtPSTraspasar.Dispose() Dim MovSalida = GenerarMovimientoAlmacen(CveAlmacenApartado, 8, Row("CveVendedor").ToString().ToEntero(), Row("CveCliente").ToString().ToEntero(), -1, TxtObs.Text.Trim(), DtDetalleTraspasar, ObjInventario, "RepApar/1") DtDetalleTraspasar.Dispose() ErrorMovInv = MovSalida.CveMovimiento <= 0 If Not ErrorMovInv Then SalidasAlmacen.Add(MovSalida) Dim MovEntrada = GenerarMovimientoAlmacen(CveAlmacenApartado, 9, UsuarioActual.CveVendedor, CveClienteTraspasar, MovSalida.CveMovimiento, TxtObs.Text.Trim(), Nothing, ObjInventario, "RepApar/2") ErrorMovInv = MovEntrada.CveMovimiento <= 0 If Not ErrorMovInv Then EntradasAlmacen.Add(MovEntrada) Else Mensaje.Append("No se pudo generar el movimiento de apartado.") End If Else Mensaje.Append("No se pudo generar el movimiento de desapartado.") Exit For End If Next If Not ErrorMovInv Then Mensaje.Append("Se realizó con éxito el traspaso.") For Each MovSalida In SalidasAlmacen Mensaje.AppendFormat("

Folio de Salida: {0}", MovSalida.Folio, MovSalida.CveMovimiento) Mensaje.AppendFormat("
Imprimir Reporte", Encripta(String.Format("OP=Alm&CveMovimiento={0}", MovSalida.CveMovimiento))) Next For Each MovEntrada In EntradasAlmacen Mensaje.AppendFormat("

Folio de Entrada: {0}", MovEntrada.Folio, MovEntrada.CveMovimiento) Mensaje.AppendFormat("
Imprimir Reporte", Encripta(String.Format("OP=Alm&CveMovimiento={0}", MovEntrada.CveMovimiento))) Next End If RegistraScript("$('#ModalTraspaso').modal('hide');") Alert(Mensaje.ToString(), If(ErrorMovInv, TipoMensaje.MsgError, TipoMensaje.MsgInformacion)) Catch ex As Exception ErrorMovInv = True OnError("Ocurrió un error al realizar el traspaso", ex) End Try If ErrorMovInv Then ObjInventario.RollBack() Else ObjInventario.Commit() End If ObjInventario.Dispose() CargaDatos() End Sub Private Function CuadrarMovimientosApartado(CveAlmacenApartado As Integer, CveCliente As Integer, CveVendedor As Integer, DtPSTraspasar As DataTable, ByRef ObjInventarios As ClsInventarios) As DataTable Dim DtRetorno As DataTable = Nothing Dim DtDesapartado As DataTable = Nothing If ObjInventarios.DesapartadosGet(CveAlmacenApartado, CveCliente, CveVendedor, UsuarioActual.CveEmpresa) Then DtDesapartado = ObjInventarios.DtResultados.Copy() DtRetorno = DtDesapartado.Clone() End If If DtRetorno IsNot Nothing Then For Each RowTraspasar As DataRow In DtPSTraspasar.Rows Dim Filtro As New StringBuilder Filtro.AppendFormat("CvePS={0}", RowTraspasar("CvePS")) 'SI TIENE SERIE LA AGREGA AL FILTRO If Not String.IsNullOrEmpty(RowTraspasar("Serie").ToString()) Then Filtro.AppendFormat(" AND Serie='{0}'", RowTraspasar("Serie")) Else Filtro.AppendFormat(" AND ISNULL(Serie,'') = ''") End If 'FILTRA EL MOVIMIENTO DE APARTADO ORIGINAL If Not String.IsNullOrEmpty(RowTraspasar("CveMovimientoDetalleEntrada").ToString()) Then Filtro.AppendFormat(" AND CveMovimientoDetalle={0}", RowTraspasar("CveMovimientoDetalleEntrada")) End If Dim RowDesapartado As DataRow = DtDesapartado.Select(Filtro.ToString()).FirstOrDefault() RowDesapartado("Cantidad") = RowTraspasar("Cantidad") DtRetorno.Rows.Add(RowDesapartado.ItemArray) Next End If Return DtRetorno End Function Private Function CrearDTTraspasosClientes() As DataTable Dim Dt As New DataTable Dt.Columns.Add(New DataColumn("Cantidad", GetType(Integer))) Dt.Columns.Add(New DataColumn("CvePS", GetType(Integer))) Dt.Columns.Add(New DataColumn("Serie", GetType(String))) Dt.Columns.Add(New DataColumn("CveCliente", GetType(Integer))) Dt.Columns.Add(New DataColumn("CveVendedor", GetType(Integer))) Dt.Columns.Add(New DataColumn("CveMovimientoDetalleEntrada", GetType(Integer))) For Each GvRow As GridViewRow In GvDatos.Rows.Cast(Of GridViewRow).Where(Function(gvr) gvr.FCTextBox("TxtCantidad").Text.ToEntero() > 0) Dim Row As DataRow = Dt.NewRow Row("Cantidad") = GvRow.FCTextBox("TxtCantidad").Text.ToEntero() Row("CvePS") = GvRow.DataKey("CvePS").ToEntero() Row("Serie") = GvRow.DataKey("Serie") Row("CveCliente") = GvRow.DataKey("CveCliente").ToEntero() Row("CveVendedor") = GvRow.DataKey("CveVendedor").ToEntero() Row("CveMovimientoDetalleEntrada") = GvRow.DataKey("CveMovimientoDetalleEntrada").ToEntero() Dt.Rows.Add(Row) Next Return Dt End Function Private Function GenerarMovimientoAlmacen(CveAlmacen As Integer, CveConceptoAlmacen As Integer, CveVendedor As Integer, CveCliente As Integer, CveMovimientoRelacionado As Integer, Obs As String, DtDetalle As DataTable, ObjInventario As ClsInventarios, Modulo As String) As MMovimientoAlmacen Dim ErrorMovInv As Boolean = False Dim Retorno As New MMovimientoAlmacen Dim CveMovimiento As Integer = -1 Dim Folio As Integer = -1 CveMovimiento = ObjInventario.AddMovimiento(CveAlmacen, CveConceptoAlmacen, 1, Now, -1, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, -1, -1, -1, -1, Observaciones:=Obs, MovimientoFijo:=True, CveMovimientoRelacionado:=CveMovimientoRelacionado, CveVendedor:=CveVendedor, CveCliente:=CveCliente, Modulo:=Modulo) Folio = ObjInventario.Folio If Not CveMovimiento > 0 Then ErrorMovInv = True End If 'SI ES MOVIMIENTO DE SALIDA TOMA DE LA TABLA DONDE SE CUADRARON LOS MOVIMIENTOS If Not ErrorMovInv AndAlso DtDetalle IsNot Nothing AndAlso CveMovimientoRelacionado <= 0 AndAlso CveConceptoAlmacen = 8 Then For Each Dr As DataRow In DtDetalle.Rows If Not ObjInventario.AddMovimientoDetalle(CveMovimiento, Dr("Cantidad").ToString().ToEntero(), Dr("CveUM").ToString().ToEntero(), Dr("CvePS").ToString().ToEntero(), Dr("PU").ToString().ToDecimal(), -1, CveSeccionAlmacen:=Dr("CveSeccionAlmacen").ToString().ToEntero(), Serie:=Dr("Serie").ToString(), Lote:=Dr("Lote").ToString(), FechaCaducidad:=Dr("FechaCaducidad").ToString.ToDate, CveMovimientoDetalleEntrada:=Dr("CveMovimientoDetalle").ToString.ToEntero) Then ErrorMovInv = True Exit For End If Next 'SI ES MOVIMIENTO DE ENTRADA TOMA LOS DATOS DEL MOVIMIENTO DE SALIDA ElseIf Not ErrorMovInv AndAlso DtDetalle Is Nothing AndAlso CveMovimientoRelacionado > 0 AndAlso CveConceptoAlmacen = 9 Then Dim DtMovimientoDetalle As DataTable = Nothing If ObjInventario.GetMovimientosDetalle(CveMovimientoRelacionado, UsuarioActual.CveEmpresa) Then DtMovimientoDetalle = ObjInventario.DtResultados.Copy() Else ErrorMovInv = True End If If Not ErrorMovInv AndAlso DtMovimientoDetalle IsNot Nothing Then For Each Dr As DataRow In DtMovimientoDetalle.Rows If Not ObjInventario.AddMovimientoDetalle(CveMovimiento, Dr("Cantidad").ToString.ToDouble, Dr("CveUM").ToString.ToEntero, Dr("CvePS").ToString.ToEntero, Dr("PU").ToString.ToDecimal, CveAF:=Dr("CveAF").ToString.ToEntero, CveSeccionAlmacen:=Dr("CveSeccionAlmacen").ToString().ToEntero(), Serie:=Dr("Serie").ToString, Lote:=Dr("Lote").ToString, FechaCaducidad:=Dr("FechaCaducidad").ToString.ToDate, CveMovimientoDetalleEntrada:=Dr("CveMovimientoDetalle").ToString.ToEntero) Then ErrorMovInv = True Exit For End If Next End If DtMovimientoDetalle.Dispose() End If If Not ErrorMovInv Then Retorno.CveMovimiento = CveMovimiento Retorno.Folio = Folio Retorno.CveConcepto = CveConceptoAlmacen End If Return Retorno End Function End Class Class MMovimientoAlmacen Public Property CveMovimiento As Integer Public Property Folio As Integer Public Property CveConcepto As Integer End Class