--FIX cambios promociones y ventas

This commit is contained in:
2024-12-28 14:55:55 -07:00
parent 54adbe2477
commit d05b9cab65
2 changed files with 168 additions and 327 deletions

View File

@@ -775,7 +775,7 @@
<td>
<asp:UpdatePanel ID="UPPVentas" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:DropDownList ID="DdlVendedor" runat="server" CssClass="form-control input-sm select2me" AppendDataBoundItems="true" DataTextField="Vendedor" DataValueField="CveVendedor" Width="100%">
<asp:DropDownList ID="DdlVendedor" runat="server" CssClass="form-control input-sm select2me" AppendDataBoundItems="true" DataTextField="Vendedor" DataValueField="CveVendedor" Width="100%" AutoPostBack="true" OnSelectedIndexChanged="DdlVendedor_SelectedIndexChanged">
<asp:ListItem Selected="true" Text="Sin asignar" Value="0"></asp:ListItem>
</asp:DropDownList>
</ContentTemplate>
@@ -1215,13 +1215,16 @@
</div>
</div>
<div class="row">
<div class="col-md-12">
<asp:TextBox ID="TxtPrecio" runat="server" TabIndex="3" onkeypress="setFocus(event,'LbAgregar');" onkeyup="Recalcula();" CausesValidation="true" lang="nb" ClientIDMode="Static" Text="0.00" MaxLength="12" ValidationGroup="GprAgregaPS" Width="100%" Height="24px" CssClass="form-control input-sm "></asp:TextBox>
<div class="col-md-12" style="display: flex; align-items: center">
<asp:TextBox ID="TxtPrecio" runat="server" TabIndex="3" onkeypress="setFocus(event,'LbAgregar');" onkeyup="Recalcula();" CausesValidation="true" lang="nb" ClientIDMode="Static" Text="0.00" MaxLength="12" ValidationGroup="GprAgregaPS" Width="110px" Height="24px" CssClass="form-control input-sm "></asp:TextBox>
<ajax:FilteredTextBoxExtender ID="FilteredTextBoxExtender4" runat="server" TargetControlID="TxtPrecio" FilterType="Custom, Numbers" ValidChars="." />
<asp:RequiredFieldValidator ID="RFVPrecio" runat="server" ControlToValidate="TxtPrecio" Display="None" ErrorMessage="<b><span style='text-decoration: underline'>ERROR:</span></b><br />El campo <b>''Precio''</b> es necesario, por favor ingréselo." ValidationGroup="GprAgregaPS"></asp:RequiredFieldValidator>
<ajax:ValidatorCalloutExtender ID="VCPrecio" runat="server" HighlightCssClass="vco" TargetControlID="RFVPrecio" Width="300px"></ajax:ValidatorCalloutExtender>
<asp:CustomValidator ID="CVPrecio" runat="server" ClientValidationFunction="ValidaDecimal6digits" ControlToValidate="TxtPrecio" Display="None" ErrorMessage="<b><span style='text-decoration: underline'>ERROR:</span></b><br />El campo <b>''Precio''</b> no tiene el formato correcto. Por favor rectifique y vuelva a intentar." ValidateEmptyText="True" ValidationGroup="GprAgregaPS"></asp:CustomValidator>
<ajax:ValidatorCalloutExtender ID="VCEPrecio" runat="server" HighlightCssClass="vco" TargetControlID="CVPrecio" Width="300px"></ajax:ValidatorCalloutExtender>
<div id="TagPromocion" runat="server" visible="false" style="width: 12px; margin-left: 5px;">
<i class="fa fa-tag" aria-hidden="true" style="color: #E43A45"></i>
</div>
</div>
</div>
</th>
@@ -8207,7 +8210,7 @@
</div>
<div class="modal-body">
<div class="row" style="padding-left: 16px;">
<div id="DivValidaRFC" runat="server" visible="false" class="col-md-8">
<div id="DivValidaRFC" runat="server" visible="false" class="col-md-9">
<div class="row">
<asp:Panel ID="PnlRFCCliente" runat="server" DefaultButton="BtnValidarRFC">
<div class="form-group form-md-line-input input-iconright col-xs-9">
@@ -8221,47 +8224,21 @@
</asp:Panel>
</div>
</div>
<div id="DivValidaPorNombre" runat="server" visible="false" class="col-md-8">
<div id="DivValidaPorNombre" runat="server" visible="false" class="col-md-9">
<div class="row">
<asp:Panel ID="PnlValidaNombre" runat="server" DefaultButton="BtnValidaPorNombre">
<div class="form-group form-md-line-input input-iconright col-xs-9">
<asp:TextBox ID="TxtRFCNombre" Style="text-transform: uppercase;" placeholder="Ingrese el RFC/Nombre para su validación" runat="server" CssClass="form-control" MaxLength="13" CausesValidation="true"></asp:TextBox>
<label for="<%= TxtRFCNombre.ClientID.ToString()%>">RFC / Nombre:</label>
</div>
<div class="form-group form-md-line-input input-iconright col-xs-3">
<asp:Button ID="BtnValidaPorNombre" runat="server" CssClass="btn btn-success" Text="Consultar" />
<div class="form-group form-md-line-input input-iconright col-xs-3" style="display:flex;">
<asp:Button ID="BtnValidaPorNombre" runat="server" CssClass="btn btn-success" Text="Buscar"/>
<asp:LinkButton ID="BtnCrearCliente" runat="server" CssClass="btn btn-primary" Text="<i class='fa fa-plus'></i>" OnClick="BtnCrearCliente_Click" />
</div>
</asp:Panel>
</div>
</div>
<div id="DivBusquedaCliente" runat="server" visible="false" >
<div style="overflow-y: auto; width: 100%; height: 250px;">
<asp:GridView ID="GvBusquedaCliente" runat="server" AutoGenerateColumns="false" EmptyDataText="No se encontraron registros"
CssClass="ScrollAD table table-smallpadding Widthall" GridLines="None">
<Columns>
<asp:TemplateField ItemStyle-Width="15%">
<HeaderTemplate>Código</HeaderTemplate>
<ItemTemplate>
<asp:Literal ID="LtlCodigo" runat="server"></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-CssClass="truncate" ItemStyle-Width="55%">
<HeaderTemplate>Nombre</HeaderTemplate>
<ItemTemplate>
<asp:Literal ID="LtlNombre" runat="server"></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="30%">
<HeaderTemplate>RFC</HeaderTemplate>
<ItemTemplate>
<asp:Literal ID="LtlRFC" runat="server"></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</div>
<div class="col-md-4">
<div class="col-md-3">
<div runat="server" id="DivTipoPersona" visible="false" class="form-group form-md-line-input input-iconright">
<asp:RadioButtonList runat="server" ID="RdTipoPersona" RepeatDirection="Horizontal" OnSelectedIndexChanged="RdTipoPersona_SelectedIndexChanged" AutoPostBack="true" CssClass="form-control">
<asp:ListItem Value="0">Física</asp:ListItem>
@@ -8271,7 +8248,37 @@
<i></i>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="DivBusquedaCliente" runat="server" visible="false">
<div style="overflow-y: auto; width: 100%; height: 250px;">
<asp:GridView ID="GvBusquedaCliente" runat="server" AutoGenerateColumns="false" EmptyDataText="No se encontraron registros"
CssClass="ScrollAD table table-smallpadding Widthall" GridLines="None">
<Columns>
<asp:TemplateField ItemStyle-Width="15%">
<HeaderTemplate>Código</HeaderTemplate>
<ItemTemplate>
<asp:Literal ID="LtlCodigo" runat="server"></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-CssClass="truncate" ItemStyle-Width="55%">
<HeaderTemplate>Nombre</HeaderTemplate>
<ItemTemplate>
<asp:Literal ID="LtlNombre" runat="server"></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="30%">
<HeaderTemplate>RFC</HeaderTemplate>
<ItemTemplate>
<asp:Literal ID="LtlRFC" runat="server"></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12" runat="server" id="DivRazonSocial2">

View File

@@ -1396,6 +1396,15 @@ Partial Class Ventas
End Property
#End Region
Private Property ObjDescuentoGral As Modelos.VentaDescuentos
Get
Return If(IsNothing(ViewState("ObjDescuentoGral")), Nothing, CType(ViewState("ObjDescuentoGral"), Modelos.VentaDescuentos))
End Get
Set(value As Modelos.VentaDescuentos)
ViewState("ObjDescuentoGral") = value
End Set
End Property
#Region "Propiedades PuntoVenta"
Private Property CveCorte As Integer
@@ -7436,6 +7445,13 @@ Partial Class Ventas
DdlMetodoPago33.Enabled = True
DdlFormaPago33.Enabled = True
End If
Dim ObjVentas As New ClsVentas
If ObjVentas.GetPromocionesPS(-1, TxtFecha.Text.ToDateTime, DdlSubProyectoDatos.SelectedValue.ToEntero(), CveCliente, DdlVendedor.SelectedValue.ToEntero(), 1, UsuarioActual.CveEmpresa) Then
DtPromociones = ObjVentas.DtResultados.Copy()
End If
ObjVentas.Dispose()
'If UsuarioActual.Empresa.Funcionalidad(705) = "1" Then
' Using ObjVentas As New ClsVentas
' If ObjVentas.GetLineasAdicionales(-1, CveCliente, -1, -1, DdlMoneda.SelectedValue.ToEntero(), MinFecha, MaxFecha, 0, UsuarioActual.CveEmpresa) Then
@@ -9064,8 +9080,9 @@ Partial Class Ventas
End Sub
Protected Sub GvPS_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GvPS.RowUpdating
'Dim TipoDescuento As Integer
Dim CvePSNuevo As Integer = GvPS.Rows(e.RowIndex).FCDropDownLost("DdlPS").SelectedValue.ToEntero()
Dim Cantidad, PU, CantidadInventario As Decimal
Dim Cantidad, PU As Decimal
Dim ObjDescuento As New Modelos.VentaDescuentos
Dim CuentaPredial As String
Cantidad = GvPS.Rows(e.RowIndex).FCTextBox("TxtCantidad").Text.ToDecimal
@@ -9101,234 +9118,17 @@ Partial Class Ventas
Exit Sub
End If
Dim DdlUM As DropDownList = GvPS.Rows(e.RowIndex).FCDropDownList("DdlUnidadMedida")
Dim DdlCla As DropDownList = GvPS.Rows(e.RowIndex).FCDropDownList("DdlClasificacion")
Dim DdlSP As DropDownList = GvPS.Rows(e.RowIndex).FCDropDownList("DdlSubProyecto")
Dim CantidadOriginal As Decimal = GvPS.Rows(e.RowIndex).DataKey("Cantidad").ToDecimal()
Dim TotalOriginal As Decimal = GvPS.Rows(e.RowIndex).DataKey("Total").ToDecimal()
Dim DatarowPS As DataRow = Nothing
DatarowPS = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=TmpDT.Rows(e.RowIndex)("CvePS").ToString().ToEntero()).FiltroPrimero("") ' Estado = -1
Dim DrProducto = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa, CvePS:=CvePSNuevo).FiltroPrimero("")
If UsuarioActual.Empresa.Funcionalidad(601) = "1" Then 'valida anticipo que tenga conceptos válidos
If DdlTipoComprobante.SelectedValue = "Ant" Then
Dim PSCodigoSAT As String = DatarowPS("SATClavePS").ToString
If PSCodigoSAT <> "84111506" Then
Alert($"El producto y/o servicio no es válido para generar anticipos.", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
End If
End If
Dim PrecioLibre As Boolean = False
If UsuarioActual.Empresa.Funcionalidad(382) = "1" Then
If DdlTipoComprobante.SelectedValue = "Cot" Then
If PU < DatarowPS("PrecioMinimo").ToString().ToDecimal() Then
Alert($"El precio no puede ser menor al precio mínimo. Precio Mínimo: {DatarowPS("PrecioMinimo"):N2}", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
End If
PrecioLibre = CBool(DatarowPS("PrecioLibre"))
End If
'verifica si tiene ventaminima
If Cantidad > 0 AndAlso DatarowPS("VentaMinima").ToString().ToDecimal > 0 AndAlso (DdlTipoComprobante.SelectedValue.Contiene("Rem", "Ing", "PA")) Then
'verifico que la cantidad sea multiplo de venta minima, es decir ventaminima =5, solo puede vender 5,10,15...
If Cantidad Mod DatarowPS("VentaMinima").ToString().ToDecimal <> 0 Then
Alert(String.Format("El producto se vende solo en cantidades de {0}", DatarowPS("VentaMinima").ToString()))
Exit Sub
End If
End If
'si es remisión, ingreso, anticipo debe de considerar el preciominimo
If Not UsuarioActual.TienePermisoProceso(169) Then ' NO VALIDA EXISTENCIAS NI COSTO - PERMISO PARA NO VALIDAR
Dim CvePS As Integer = DatarowPS("CvePS").ToString().ToEntero()
Dim CveUM As Integer = GvPS.Rows(e.RowIndex).FCDropDownList("DdlUnidadMedida").SelectedValue.ToEntero() 'DatarowPS("CveUM").ToString().ToEntero()
Dim CveTipoPS As Integer = DatarowPS("CveTipoPS").ToString().ToEntero()
CantidadInventario = GvPS.Rows(e.RowIndex).DataKey("CantidadInventario").ToDecimal
Dim CveUMInicial As Integer = GvPS.Rows(e.RowIndex).DataKey("CveUM").ToEntero
Dim ValidaExistencia As Boolean = True
If (CantidadInventario > 0) OrElse (Cantidad <= CantidadOriginal) Then 'si ya hay algo surtido, que no valide existencia
ValidaExistencia = False
End If
If CveUM <> CveUMInicial Then ValidaExistencia = True
'SOLO VALIDA EXISTENCIAS Y COSTO: SI USA INVENTARIOS, SOLO PRODUCTOS TIPO PRODUCTO, SOLO REMISIONES E INGRESOS
Dim ValidaExistenciasCosto As Boolean = UsuarioActual.Empresa.UsaInventarios AndAlso CveTipoPS = 2 AndAlso (DdlTipoComprobante.SelectedValue.Contiene("Rem", "Ing", "PA") Or (DdlTipoComprobante.SelectedValue.Contiene("Cot") And UsuarioActual.CveEmpresa.Contiene(119)))
'VALIDA COSTO PARA LAS COTIZACIONES
If Not ValidaExistenciasCosto Then
If DdlTipoComprobante.SelectedValue.Contiene("Cot") AndAlso (UsuarioActual.Empresa.Funcionalidad(382) = "1" OrElse UsuarioActual.CveEmpresa = 1) Then
ValidaExistenciasCosto = True
End If
End If
If ValidaExistenciasCosto Then
Dim ObjInventarios As New ClsInventarios
Dim Existencia As Decimal
If ValidaExistencia Then
Dim BuscarEnTabla As Boolean = If(UsuarioActual.Empresa.Funcionalidad(715) = "1", True, False)
Existencia = ObjInventarios.GetExistenciasPS(CvePS, CveUM, UsuarioActual.CveEmpresa, -1, FechaMovto:=DateTime.Today.AddDays(1).ToString("yyyy/MM/dd HH:mm"), CveSubProyecto:=DdlSubProyectoDatos.SelectedValue.ToEntero(), CveVendedor:=DdlVendedor.SelectedValue.ToEntero(), CveCliente:=If(UsuarioActual.Empresa.Funcionalidad(146) = "1", -1, CveCliente), ExcluyeAdelantado:=1, PendientePorSurtir:=1, RestringirAlmacenes:=1, ExcluyeApartados:=-1, BuscarEnTabla:=BuscarEnTabla)
End If
Dim Costo As Decimal
If UsuarioActual.Empresa.Funcionalidad(602) = "UC" Then 'validación sobre el último costo
If ObjInventarios.GetUltimoCosto(UsuarioActual.CveEmpresa, CvePS) Then
Dim dr As DataRow = ObjInventarios.DtResultados.FiltroPrimero("")
If dr IsNot Nothing Then
Costo = dr("UltimoCosto").ToString.ToDecimal
End If
End If
Else
Costo = ObjInventarios.GetCostoPS(CvePS, TxtCantidad.Text.Trim.ToDecimal, -1, "-1", TxtFecha.Text.ToDate, DdlSubProyectoDatos.SelectedValue.ToEntero(), CveTipoAlmacen:=1)
'si el costo es cero, puede ser que no halla movimientos del producto, en esa sucursal. y se volverá a sacar sin especificar sucursal
If Costo <= 0 Then Costo = ObjInventarios.GetCostoPS(CvePS, TxtCantidad.Text.Trim.ToDecimal, -1, "-1", TxtFecha.Text.ToDate, -1, CveTipoAlmacen:=1)
End If
ObjInventarios.Dispose()
Dim PrecioMinimo As Decimal = 0
'RMF. condicion temporal, para reubicación, precio mínimo
If UsuarioActual.CveEmpresa = 119 Then
'Dim CvePrecioLista As Integer = 38
Dim objPS As New ClsProductosServicios
If objPS.GetPSSucursalesALL(CvePS, UsuarioActual.CveEmpresa, CveSubProyecto:=DdlSubProyectoDatos.SelectedValue.ToEntero()) Then
PrecioMinimo = objPS.DtResultados.FiltroPrimeroValor("PrecioMinimo", "").ToDecimal
'If PrecioMinimo > 0 Then
' Costo = PrecioMinimo
'End If
End If
objPS.Dispose()
End If
If ValidaExistencia AndAlso DdlTipoComprobante.SelectedValue <> "Cot" And ChkSinExistencia.Checked = False AndAlso Not RegistroxOC Then
'VALIDA EXISTENCIA
If UsuarioActual.CveEmpresa.Contiene({72, 80, 119, 140, 153, 190, 192, 197, 189}) Then
'SI ES VENTA NUEVA TOMA EN CUENTA LO DEL TMPDT
If CveVenta <= 0 Then
If Existencia - TmpDT.SUM("Cantidad", $"CvePS = {CvePS} AND (EntregaDirecta IS NULL OR EntregaDirecta < 1)") < TxtCantidad.Text.ToDouble Then
Alert("No cuenta con la cantidad suficiente en inventario. Cuenta con " + Existencia.FormatoNumero(2) + ".", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
Else
If DdlTipoComprobante.SelectedValue = "Rem" Then
Dim CantidadVenta As Double = 0
Using ObjVentas As New ClsVentas
If ObjVentas.GetVentaDetalle(CveVenta) Then
CantidadVenta = ObjVentas.DtResultados.SUM("Cantidad", $"CvePS = {CvePS}")
End If
End Using
'SUMA LO YA RESTADO EN PENDIENTE POR SURTIR QUE PERTENESCA A LA VENTA.
'PARA QUE NO RESTE LA EXISTENCIA 2 VECES Y PUEDAS COMPARAR LO REAL
If (Existencia + CantidadVenta) - TmpDT.SUM("Cantidad", $"CvePS = {CvePS} AND (EntregaDirecta IS NULL OR EntregaDirecta < 1)") < TxtCantidad.Text.ToDouble Then
Alert("No cuenta con la cantidad suficiente en inventario. Cuenta con " + Existencia.FormatoNumero(2) + ".", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
End If
End If
End If
End If
'VALIDA COSTOS
If Not CveContrato > 0 Then
'BANDERAS PARA VALIDACIONES
Dim EsValido As Boolean = False
Dim EsValidoMayor As Boolean = False
Dim CostoMenor As Decimal = 0
Dim CostoMayor As Decimal = 0
Dim PorcentajeMinimoCostoEmpresa = UsuarioActual.Empresa.Funcionalidad(129).ToDecimal
If UsuarioActual.Empresa.Funcionalidad(382) = "1" Then
If DatarowPS IsNot Nothing Then
If DatarowPS("PorcentajeMinimoUtilidad").ToString() <> "" AndAlso DatarowPS("PorcentajeMinimoUtilidad").ToString().ToDecimal() <> 0 Then
PorcentajeMinimoCostoEmpresa = DatarowPS("PorcentajeMinimoUtilidad").ToString.ToDecimal
End If
End If
End If
'PRECIO MINIMO
If PorcentajeMinimoCostoEmpresa <> 0 AndAlso UsuarioActual.CveUsuario <> 1560 Then
'' NOTA. si tiene preciominimo, debe de validarlos e ignorar el costo, pero se debe de considerar el TC, para el costo
If PrecioMinimo > 0 Then
'SI EL PRECIO ES MAYOR AL COSTO, SI PASA
If PU >= PrecioMinimo Then ' aqui se comparar los importes directos, sin el TC
EsValido = True
End If
Else
CostoMenor = Costo + ((PorcentajeMinimoCostoEmpresa / 100) * Costo)
'SI EL PRECIO ES MAYOR AL COSTO, SI PASA
If PU * If(DdlMoneda.SelectedValue = "1", 1, TxtTipoCambio.Text.ToDecimal) >= CostoMenor Then
EsValido = True
End If
End If
Else
EsValido = True
End If
'PRECIO MAXIMO
If UsuarioActual.Empresa.Funcionalidad(133).ToEntero() > 0 AndAlso UsuarioActual.CveUsuario <> 1560 Then
CostoMayor = Costo + ((UsuarioActual.Empresa.Funcionalidad(133).ToDecimal / 100) * Costo)
'SI EL PRECIO ES MAYOR AL COSTO MAXIMO, SI PASA
If PU * If(DdlMoneda.SelectedValue = "1", 1, TxtTipoCambio.Text.ToDecimal) <= CostoMayor Then
EsValidoMayor = True
End If
Else
EsValidoMayor = True
End If
''VALIDA PROMOCION: SI TIENE PROMOCION Y EL PRECIO ES MENOR AL PRECIO DE PROMOCION, NO PASA | SI YA CUMPLE NO VUELVE A VALIDAR
''SIRVE PARA VALIDAR PRECIOS DEBAJO DEL PRECIO MINIMO PERMITIDO
'If Not EsValido Then
' If DtPromociones.FiltraParametros($"CvePS = {CvePS}").Rows.Count > 0 Then
' If PU * If(DdlMoneda.SelectedValue.ToEntero() = 1, 1, TxtTipoCambio.Text.ToDecimal) >= DtPromociones.FiltroPrimeroValor("PUPromocion", $"CvePS = {CvePS}").ToDecimal Then
' EsValido = True
' End If
' End If
'End If
'NO DEJA REGISTRAR MENOS AL PRECIO MINIMO
Dim MensajeCosto As New StringBuilder
Dim TienePermisoImportes As Boolean = UsuarioActual.TienePermisoProceso(201)
If Not PrecioLibre Then
If Not EsValido Then
MensajeCosto.AppendFormat("El Producto <b>{0}</b>. No se puede vender a un precio menor de su Costo <br/>", DatarowPS("CodigoPS").ToString())
If TienePermisoImportes Then
MensajeCosto.AppendFormat("El costo del producto es: <b>${0:#,###.00}</b> <br/>", Costo)
MensajeCosto.AppendFormat("El rango menor aceptado es: {0:#,###.00}% <b>${1}</b> <br/>", PorcentajeMinimoCostoEmpresa, CostoMenor)
MensajeCosto.AppendFormat("El precio indicado es: <b>${0:#,###.00}</b> ({1}% de ganancia) <br/>", PU.FormatoNumero, (If(Costo > 0, ((PU - Costo) * 100) / Costo, 0)).FormatoNumero)
End If
Alert(String.Format(MensajeCosto.ToString()), TipoMensaje.MsgAdvertencia)
MensajeCosto.Clear()
e.Cancel = True
Exit Sub
End If
'NO DEJA REGISTRAR MAS AL PRECIO MAXIMO
If Not EsValidoMayor Then
MensajeCosto.AppendFormat("El Producto <b>{0}</b>. No se puede vender a un precio mayor de su rango aceptado<br/>", HdnPS.Value)
If TienePermisoImportes Then
MensajeCosto.AppendFormat("El costo del producto es: <b>${0:#,###.00}</b> <br/>", Costo)
MensajeCosto.AppendFormat("El rango mayor aceptado es: {0}% <b>${1:#,###.00}</b> <br/>", UsuarioActual.Empresa.Funcionalidad(133).ToEntero(), CostoMayor)
MensajeCosto.AppendFormat("El precio indicado es: <b>${0:#,###.00}</b> ({1}% de ganancia) <br/>", PU.FormatoNumero, (If(Costo > 0, ((PU - Costo) * 100) / Costo, 0)).FormatoNumero)
End If
Alert(MensajeCosto.ToString(), TipoMensaje.MsgAdvertencia)
MensajeCosto.Clear()
e.Cancel = True
Exit Sub
End If
End If
End If
End If
If Not ValidaAgregarPS(Cantidad, CvePSNuevo, DdlUM.SelectedValue.ToEntero(), PU, DrProducto("CveTipoPS").ToString().ToEntero(), DdlCla.SelectedValue.ToEntero(), DdlSP.SelectedValue.ToEntero(), ObjDescuento) Then
Exit Sub
End If
If UsuarioActual.Empresa.Funcionalidad(558) = "1" AndAlso ListaDescuentos IsNot Nothing AndAlso ObjDescuento IsNot Nothing Then
@@ -9343,8 +9143,6 @@ Partial Class Ventas
If TmpDT.Rows(e.RowIndex)("CvePS").ToString() <> GvPS.Rows(e.RowIndex).FCDropDownLost("DdlPS").SelectedValue Then
'eliminar y cargar el ps ***
Dim DdlUM As DropDownList = GvPS.Rows(e.RowIndex).FCDropDownList("DdlUnidadMedida")
Dim DdlCla As DropDownList = GvPS.Rows(e.RowIndex).FCDropDownList("DdlClasificacion")
If DtPromociones IsNot Nothing AndAlso DtPromociones.Rows.Count > 0 Then
ObjDescuento = CalcularDescuentos(GvPS.Rows(e.RowIndex).FCDropDownLost("DdlPS").SelectedValue.ToEntero(), Cantidad, PU)
@@ -9355,27 +9153,6 @@ Partial Class Ventas
NumTurnos = GvPS.Rows(e.RowIndex).FCTextBox("TxtNumTurnosEditar").Text.ToDecimal()
End If
DatarowPS = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=GvPS.Rows(e.RowIndex).FCDropDownLost("DdlPS").SelectedValue.ToEntero()).FiltroPrimero("") ' Estado = -1
If UsuarioActual.Empresa.Funcionalidad(601) = "1" Then 'valida anticipo que tenga conceptos válidos
If DdlTipoComprobante.SelectedValue = "Ant" Then
Dim PSCodigoSAT As String = DatarowPS("SATClavePS").ToString
If PSCodigoSAT <> "84111506" Then
Alert($"El producto y/o servicio no es válido para generar anticipos.", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
End If
End If
If UsuarioActual.Empresa.Funcionalidad(382) = "1" Then
If DdlTipoComprobante.SelectedValue = "Cot" Then
If PU < DatarowPS("PrecioMinimo").ToString().ToDecimal() Then
Alert($"El precio no puede ser menor al precio mínimo. Precio Mínimo: {DatarowPS("PrecioMinimo"):N2}", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
End If
End If
TmpDT.Rows.Remove(TmpDT.Rows(e.RowIndex))
CalculaUsados()
@@ -9420,8 +9197,7 @@ Partial Class Ventas
End If
Else
Dim DrPS As DataRow = Nothing
DrPS = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=TmpDT.Rows(e.RowIndex)("CvePS").ToString().ToEntero()).FiltroPrimero("")
Dim DrPS As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=TmpDT.Rows(e.RowIndex)("CvePS").ToString().ToEntero()).FiltroPrimero("")
If Not ClienteDesglosaIEPS Then
PU = PU * (1 + DrPS("IEPSPorcentaje").ToString().ToDecimal)
@@ -10380,6 +10156,7 @@ Partial Class Ventas
EsValidoPU = False ' SI NO TIENE PROMOCION NO SE PUEDE VENDER A 0
End If
End If
'NO DEJA REGISTRAR CON VALIDACION DE COSTO ALMACEN O PROMOCION
Dim TienePermisoImportes As Boolean = UsuarioActual.TienePermisoProceso(201)
If Not EsValido Then
@@ -18606,6 +18383,21 @@ Partial Class Ventas
End If
End If
End If
End If
Me.ObjDescuentoGral = CalcularDescuentos(CvePSParametro, TxtCantidad.Text.Trim.ToDecimal, TxtPrecio.Text.ToDecimal())
If Me.ObjDescuentoGral IsNot Nothing Then
If ObjDescuentoGral.CvePromocionDetalle > 0 Then
TagPromocion.Visible = True
End If
If Me.ObjDescuentoGral.EsPUModificado Then
TxtPrecio.Text = Me.ObjDescuentoGral.PU.ToString()
End If
End If
If AgregarPSAutomaticamente Then
@@ -19240,6 +19032,12 @@ Partial Class Ventas
CargaListasPreciosSubProyectos(If(DdlPS.SelectedValue.ToEntero() <= 0, -1, DdlPS.SelectedValue.ToEntero()))
Dim ObjVentas As New ClsVentas
If ObjVentas.GetPromocionesPS(-1, TxtFecha.Text.ToDateTime, DdlSubProyectoDatos.SelectedValue.ToEntero(), CveCliente, DdlVendedor.SelectedValue.ToEntero(), 1, UsuarioActual.CveEmpresa) Then
DtPromociones = ObjVentas.DtResultados.Copy()
End If
ObjVentas.Dispose()
UpDetalle.Update()
UpEmitirTransitorio.Update()
End Sub
@@ -19520,7 +19318,7 @@ Partial Class Ventas
Protected Sub LbAgregar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LbAgregar.Click
AgregarPS()
End Sub
Private Function ValidaAgregarPS(CvePS As Integer, CveUM As Integer, PU As Double, CveTipoPS As Integer, Optional CantidadModal As Decimal = 0D, Optional PSValidarModal As String = "") As Boolean 'NO TOCAR - IPP
Private Function ValidaAgregarPS(Cantidad As Decimal, CvePS As Integer, CveUM As Integer, PU As Double, CveTipoPS As Integer, CveClasificacion As Integer, CveSubProyecto As Integer, ObjDescuento As Modelos.VentaDescuentos, Optional CantidadModal As Decimal = 0D, Optional PSValidarModal As String = "") As Boolean 'NO TOCAR - IPP
'VALIDA PARAMETROS
If CvePS <= 0 Or CveUM <= 0 Then
@@ -19532,19 +19330,19 @@ Partial Class Ventas
HdnPS.Value = PSValidarModal
End If
If HdnPS.Value = "" Or HdnPS.Value = "-1" Then
Alert("Es necesario seleccionar el Producto o Servicio a facturar.", TipoMensaje.MsgAdvertencia)
Return False
End If
'If HdnPS.Value = "" Or HdnPS.Value = "-1" Then
' Alert("Es necesario seleccionar el Producto o Servicio a facturar.", TipoMensaje.MsgAdvertencia)
' Return False
'End If
'SI USA CONTABILIDAD LA CLASIFICACION ES OBLIGATORIA
If DdlClasificacion.SelectedValue.ToEntero() <= 0 AndAlso UsuarioActual.Empresa.UsaContabilidad Then
If CveClasificacion <= 0 AndAlso UsuarioActual.Empresa.UsaContabilidad Then
Alert("La Clasificación es obligatoria, favor de seleccionarla", TipoMensaje.MsgAdvertencia)
Return False
End If
'SUBPROYECTO OBLIGATORIO
If DdlSubProyecto.SelectedValue.ToEntero() <= 0 AndAlso UsuarioActual.Empresa.Funcionalidad(120) = "1" Then
If CveSubProyecto <= 0 AndAlso UsuarioActual.Empresa.Funcionalidad(120) = "1" Then
Alert("El Subproyecto es obligatorio, favor de seleccionarlo", TipoMensaje.MsgAdvertencia)
Return False
End If
@@ -19556,8 +19354,6 @@ Partial Class Ventas
Dim PrecioLibre As Boolean = False
If UsuarioActual.Empresa.Funcionalidad(382) = "1" Then
Dim DatarowPS = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=CvePS).FiltroPrimero("")
If DatarowPS IsNot Nothing Then
@@ -19588,18 +19384,20 @@ Partial Class Ventas
'SI NO VIENE DESDE EL MODAL
If CantidadModal = 0 Then
If TxtCantidad.Text.ToDecimal() <= 0 Then
If Cantidad <= 0 Then
Alert("La cantidad debe ser mayor a cero", TipoMensaje.MsgAdvertencia)
Return False
End If
End If
'VALIDA PROMOCIONES
Dim ObjVentas As New ClsVentas
If ObjVentas.GetPromocionesPS(-1, TxtFecha.Text.ToDateTime, DdlSubProyectoDatos.SelectedValue.ToEntero(), CveCliente, DdlVendedor.SelectedValue.ToEntero(), 1, UsuarioActual.CveEmpresa) Then
DtPromociones = ObjVentas.DtResultados
End If
ObjVentas.Dispose()
'If DtPromociones Is Nothing Then
' Dim ObjVentas As New ClsVentas
' If ObjVentas.GetPromocionesPS(-1, TxtFecha.Text.ToDateTime, CveSubProyecto, CveCliente, DdlVendedor.SelectedValue.ToEntero(), 1, UsuarioActual.CveEmpresa) Then
' DtPromociones = ObjVentas.DtResultados.Copy()
' End If
' ObjVentas.Dispose()
'End If
'VALIDA PRECIO CERO (0)
'If UsuarioActual.Empresa.Funcionalidad(139).ToString().ToEntero() > 0 And PU = 0 And DtPromociones.FiltroPrimeroValor("PUPromocion", $"CvePS = {CvePS}").ToDecimal > 0 Then
@@ -19645,9 +19443,9 @@ Partial Class Ventas
ObjInventarios.Dispose()
Else
Dim ObjInventarios As New ClsInventarios
Costo = ObjInventarios.GetCostoPS(CvePS, TxtCantidad.Text.Trim.ToDecimal, -1, "-1", TxtFecha.Text.ToDate, DdlSubProyectoDatos.SelectedValue.ToEntero(), CveTipoAlmacen:=1)
Costo = ObjInventarios.GetCostoPS(CvePS, Cantidad, -1, "-1", TxtFecha.Text.ToDate, CveSubProyecto, CveTipoAlmacen:=1)
'si el costo es cero, puede ser que no halla movimientos del producto, en esa sucursal. y se volverá a sacar sin especificar sucursal
If Costo <= 0 Then Costo = ObjInventarios.GetCostoPS(CvePS, TxtCantidad.Text.Trim.ToDecimal, -1, "-1", TxtFecha.Text.ToDate, -1, CveTipoAlmacen:=1)
If Costo <= 0 Then Costo = ObjInventarios.GetCostoPS(CvePS, Cantidad, -1, "-1", TxtFecha.Text.ToDate, -1, CveTipoAlmacen:=1)
ObjInventarios.Dispose()
End If
@@ -19656,7 +19454,7 @@ Partial Class Ventas
If UsuarioActual.CveEmpresa = 119 Then
'Dim CvePrecioLista As Integer = 38
Dim objPS As New ClsProductosServicios
If objPS.GetPSSucursalesALL(CvePS, UsuarioActual.CveEmpresa, CveSubProyecto:=DdlSubProyectoDatos.SelectedValue.ToEntero()) Then
If objPS.GetPSSucursalesALL(CvePS, UsuarioActual.CveEmpresa, CveSubProyecto:=CveSubProyecto) Then
PrecioMinimo = objPS.DtResultados.FiltroPrimeroValor("PrecioMinimo", "").ToDecimal
End If
objPS.Dispose()
@@ -19685,14 +19483,14 @@ Partial Class Ventas
CveAlmacenConsulta = ddlAlmacen.SelectedValue.ToEntero()
End If
Existencia = ObjInv2.GetExistenciasPS(CvePS, CveUM, UsuarioActual.CveEmpresa, CveAlmacenConsulta, FechaMovto:=DateTime.Today.AddDays(1).ToString("yyyy/MM/dd HH:mm"), CveSubProyecto:=DdlSubProyectoDatos.SelectedValue.ToEntero(),
Existencia = ObjInv2.GetExistenciasPS(CvePS, CveUM, UsuarioActual.CveEmpresa, CveAlmacenConsulta, FechaMovto:=DateTime.Today.AddDays(1).ToString("yyyy/MM/dd HH:mm"), CveSubProyecto:=CveSubProyecto,
CveVendedor:=DdlVendedor.SelectedValue.ToEntero(), CveCliente:=If(UsuarioActual.Empresa.Funcionalidad(146) = "1", -1, CveCliente), ExcluyeAdelantado:=1, PendientePorSurtir:=1,
RestringirAlmacenes:=1, ExcluyeApartados:=-1, BuscarEnTabla:=BuscarEnTabla)
End If
End Using
If CveVenta <= 0 OrElse Me.EsCreaApartirDe Then
If Existencia - TmpDT.SUM("Cantidad", $"CvePS = {CvePS} AND (EntregaDirecta IS NULL OR EntregaDirecta < 1)") < (If(CantidadModal > 0, CantidadModal, TxtCantidad.Text.ToDouble)) Then
If Existencia - TmpDT.SUM("Cantidad", $"CvePS = {CvePS} AND (EntregaDirecta IS NULL OR EntregaDirecta < 1)") < (If(CantidadModal > 0, CantidadModal, Cantidad)) Then
Dim CveAlmacenConsulta As Integer = -1
Dim StrAlmacen As New StringBuilder
@@ -19718,7 +19516,7 @@ Partial Class Ventas
'SUMA LO YA RESTADO EN PENDIENTE POR SURTIR QUE PERTENESCA A LA VENTA.
'PARA QUE NO RESTE LA EXISTENCIA 2 VECES Y PUEDAS COMPARAR LO REAL
If (Existencia + CantidadVenta) - TmpDT.SUM("Cantidad", $"CvePS = {CvePS} And (EntregaDirecta Is NULL Or EntregaDirecta < 1)") < (If(CantidadModal > 0, CantidadModal, TxtCantidad.Text.ToDouble)) Then
If (Existencia + CantidadVenta) - TmpDT.SUM("Cantidad", $"CvePS = {CvePS} And (EntregaDirecta Is NULL Or EntregaDirecta < 1)") < (If(CantidadModal > 0, CantidadModal, Cantidad)) Then
Alert("No cuenta con la cantidad suficiente en inventario. Cuenta con " + Existencia.FormatoNumero(2) + ".", TipoMensaje.MsgAdvertencia)
Return False
End If
@@ -19728,8 +19526,21 @@ Partial Class Ventas
End If
End If
Dim VerificarCostos As Boolean = True
If ObjDescuento IsNot Nothing Then
If ObjDescuento.CvePromocionDetalle > 0 Then
VerificarCostos = False
End If
If ObjDescuento.ImporteDescuento > 0 Then
VerificarCostos = False
End If
If ObjDescuento.EsPUModificado Then
VerificarCostos = False
End If
End If
'VALIDA COSTOS
If Not CveContrato > 0 Then
If Not CveContrato > 0 AndAlso VerificarCostos Then
'BANDERAS PARA VALIDACIONES
Dim EsValido As Boolean = False
@@ -19788,9 +19599,9 @@ Partial Class Ventas
Dim DrPS As DataRow = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa, CvePS:=CvePS).FiltroPrimero("")
'valida sino tiene promocion la clasificacion
If DrPS IsNot Nothing Then
If DtPromociones.FiltraParametros(String.Format("CveClasificacion = {0}", DdlClasificacion.SelectedValue.ToEntero())).Rows.Count > 0 Then
If DtPromociones.FiltraParametros(String.Format("CveClasificacion = {0}", CveClasificacion)).Rows.Count > 0 Then
''falta aplicar si tiene promocion
Dim drPromo As DataRow = DtPromociones.FiltroPrimero(String.Format("CveClasificacion = {0}", DdlClasificacion.SelectedValue.ToEntero()))
Dim drPromo As DataRow = DtPromociones.FiltroPrimero(String.Format("CveClasificacion = {0}", CveClasificacion))
If drPromo IsNot Nothing Then
If drPromo("CveMarca").ToString() = DrPS("CveMarca").ToString() Then
@@ -19837,10 +19648,7 @@ Partial Class Ventas
End If
End If
Return True
End Function
Private Function CalcularDescuentos(CvePS As Integer, Cantidad As Decimal, PU As Decimal) As Modelos.VentaDescuentos
Dim Descuento As Decimal = HdnDescuento.Value.ToDecimal
@@ -20083,20 +19891,21 @@ Partial Class Ventas
CvePS = DdlPS.SelectedValue.ToEntero()
End If
If ValidaAgregarPS(CvePS, DdlUnidadMedida.SelectedValue.ToEntero(), TxtPrecio.Text.Trim.ToDouble, HdnTipoPS.Value.ToEntero()) Then
Dim Cantidad As Decimal = TxtCantidad.Text.ToDecimal
Dim PU As Decimal = If(CvePSAmortizacion > 0, TxtPrecio.Text.Trim.ToDecimal * -1, TxtPrecio.Text.Trim.ToDecimal)
Dim ObjDescuento As New Modelos.VentaDescuentos
If ObjDescuentoGral IsNot Nothing Then
ObjDescuento = ObjDescuentoGral
End If
If ValidaAgregarPS(Cantidad, CvePS, DdlUnidadMedida.SelectedValue.ToEntero(), PU, HdnTipoPS.Value.ToEntero(), DdlClasificacion.SelectedValue.ToEntero(), DdlSubProyecto.SelectedValue.ToEntero(), ObjDescuento) Then
If UsuarioActual.Empresa.Funcionalidad(507) = DdlPS.SelectedValue Then
CvePSAmortizacion = DdlPS.SelectedValue.ToEntero().ToEntero()
End If
Dim Cantidad As Decimal = TxtCantidad.Text.ToDecimal
Dim PU As Decimal = If(CvePSAmortizacion > 0, TxtPrecio.Text.Trim.ToDecimal * -1, TxtPrecio.Text.Trim.ToDecimal)
Dim ObjDescuento As Modelos.VentaDescuentos = CalcularDescuentos(CvePS, Cantidad, PU)
If ObjDescuento.EsPUModificado Then
PU = ObjDescuento.PU
End If
Dim CvePrecioListaPS As Integer = -1
Dim PrecioListaPS As String = ""
@@ -20109,16 +19918,13 @@ Partial Class Ventas
Else
PrecioListaPS = DdlPrecioLista.SelectedItem.Text
End If
Else
Dim PermiteEdicion = UsuarioActual.CveEmpresa = 189 AndAlso TxtPrecio.Enabled
If Not PermiteEdicion Then
'sino es la seleccionada se recalcula de nuevo
CargaPrecioLista(DdlPS.SelectedValue.ToEntero)
Exit Sub
End If
End If
Else
If Me.CvePrecioLista > 0 Then
@@ -20377,6 +20183,7 @@ Partial Class Ventas
HdnPorcentajeIEPS.Value = "0"
HdnCodigo.Value = "-1"
TxtCuentaPredial.Text = ""
TagPromocion.Visible = False
' codigo comentado RMF. 2016.06.13, esto paa que respete el que tenga selecionado e nla sucursal
'DdlProyecto.SelectedIndex = 0
'DdlSubProyecto.Items.Clear()
@@ -20398,6 +20205,8 @@ Partial Class Ventas
TxtCodigoSerie.Text = ""
TxtTiempoEntrega.Text = ""
ObjDescuentoGral = Nothing
'FOCUS DEPENDIENDO MODALIDAD DE CODIGO BARRAS
If DIVCod.Visible Then
TxtCodigoBarras.Focus()
@@ -20818,6 +20627,7 @@ Partial Class Ventas
DrPoliza("SATClaveProdServ") = DrPSAdicional("SATClavePS")
DrPoliza("SATClaveUM") = DrPSAdicional("SATClaveUnidadMedida")
DrPoliza("CveActivoFijo") = -1
DrPoliza("CvePromocionDetalle") = -1
TmpDT.Rows.Add(DrPoliza)
End If
@@ -24337,7 +24147,7 @@ Partial Class Ventas
HdnIVARetAPS.Value = DrProducto("RetIVA").ToString()
HdnCodigo.Value = DrProducto("Codigo").ToString()
If ValidaAgregarPS(DrProducto("CvePS").ToString().ToEntero(), DrProducto("CveUM").ToString().ToEntero(), TxtPrecio.Text.Trim.ToDouble, DrProducto("CveTipoPS").ToString().ToEntero()) Then
If ValidaAgregarPS(TxtCantidad.Text.ToDecimal(), DrProducto("CvePS").ToString().ToEntero(), DrProducto("CveUM").ToString().ToEntero(), TxtPrecio.Text.Trim.ToDouble, DrProducto("CveTipoPS").ToString().ToEntero(), DdlClasificacion.SelectedValue.ToEntero(), DdlSubProyectoDatos.SelectedValue.ToEntero(), Nothing) Then
If UsuarioActual.Empresa.Funcionalidad(507) = DdlPS.SelectedValue Then
CvePSAmortizacion = DdlPS.SelectedValue.ToEntero().ToEntero()
@@ -36425,6 +36235,12 @@ Partial Class Ventas
TFuenteRecaudacion.Visible = False
End If
Dim ObjVentas As New ClsVentas
If ObjVentas.GetPromocionesPS(-1, TxtFecha.Text.ToDateTime, DdlSubProyectoDatos.SelectedValue.ToEntero(), CveCliente, DdlVendedor.SelectedValue.ToEntero(), 1, UsuarioActual.CveEmpresa) Then
DtPromociones = ObjVentas.DtResultados.Copy()
End If
ObjVentas.Dispose()
End Sub
Private Function DescargarFactura(CveVenta As Integer, CveEmpresa As Integer, CveUsuarioCreo As Integer, Optional GetBytes As Boolean = True, Optional Regenerar As Boolean = False, Optional strURLHOST As String = "") As Byte()
@@ -39233,7 +39049,7 @@ Partial Class Ventas
Dim PU As Decimal = GvRow.FCTextBox("TxtPrecio").Text.ToDecimal
If Cantidad > 0 Then
If Not ValidaAgregarPS(CvePS, CveUnidadMedida, PU, 2, Cantidad, CodigoPS) Then
If Not ValidaAgregarPS(0, CvePS, CveUnidadMedida, PU, 2, CveClasificacion, DdlSubProyectoDatos.SelectedValue.ToEntero(), Nothing, CantidadModal:=Cantidad, PSValidarModal:=CodigoPS) Then
Alert("No hay existencia.", TipoMensaje.MsgAdvertencia)
Exit Sub
End If
@@ -40200,5 +40016,23 @@ Partial Class Ventas
objV.Dispose()
End If
End Sub
Protected Sub DdlVendedor_SelectedIndexChanged(sender As Object, e As EventArgs)
'RECARGAR PROMOCIONES
Dim ObjVentas As New ClsVentas
If ObjVentas.GetPromocionesPS(-1, TxtFecha.Text.ToDateTime, DdlSubProyectoDatos.SelectedValue.ToEntero(), CveCliente, DdlVendedor.SelectedValue.ToEntero(), 1, UsuarioActual.CveEmpresa) Then
DtPromociones = ObjVentas.DtResultados.Copy()
End If
ObjVentas.Dispose()
End Sub
Protected Sub BtnCrearCliente_Click(sender As Object, e As EventArgs)
DivValidaRFC.Visible = True
DivValidaPorNombre.Visible = False
DivBusquedaCliente.Visible = False
TxtRFCCliente.Text = TxtRFCNombre.Text
BtnValidarRFC_Click(Nothing, EventArgs.Empty)
End Sub
End Class