diff --git a/Ventas/PV.aspx.vb b/Ventas/PV.aspx.vb index a6f0cfd74..aae2e0d11 100644 --- a/Ventas/PV.aspx.vb +++ b/Ventas/PV.aspx.vb @@ -34,7 +34,7 @@ Partial Class PV Private Property FolioXML As String Private Property SubTotal As Decimal Private Property Total As Decimal = 0 - Private Property Descuentos As Decimal = 0 + 'Private Property Descuentos As Decimal = 0 Private Property EmisorRFC As String Private Property ReceptorRFC As String Private Property TrasladoIVA As Decimal = 0 @@ -83,6 +83,15 @@ Partial Class PV End Set End Property + Private Property DtPorcentajeMarcas As DataTable + Get + Return If(IsNothing(ViewState("DtPorcentajeMarcas")), Nothing, CType(ViewState("DtPorcentajeMarcas"), DataTable)) + End Get + Set(value As DataTable) + ViewState("DtPorcentajeMarcas") = value + End Set + End Property + Private Property RemisionesLista As List(Of Integer) Get Return If(IsNothing(ViewState("RemisionesLista")), Nothing, CType(ViewState("RemisionesLista"), List(Of Integer))) @@ -2576,6 +2585,12 @@ Partial Class PV If Not String.IsNullOrEmpty(ObjCliente.Vendedor) Then LbVendedor.Text = GlobalDTVendedores(UsuarioActual.CveEmpresa).FiltroPrimeroValor("Vendedor", $"CveVendedor = {ObjCliente.Vendedor}") End If + + ' si es empresa acumuladores + If UsuarioActual.Empresa.Funcionalidad(531) = "1" Then + CargaPorcentajeMarcas() + End If + Else TrEsDistribuidor.Visible = False End If @@ -2697,6 +2712,14 @@ Partial Class PV UPCondicionesPago.Update() End Sub + Private Sub CargaPorcentajeMarcas() + Dim ObjPS As New ClsProductosServicios + If ObjPS.GetPorcentajeMarcas(CveCliente) Then + DtPorcentajeMarcas = ObjPS.DtResultados.Copy() + End If + ObjPS.Dispose() + End Sub + Private Sub CambiaSucursal() CargaFormatoSucursal() CargaFolios() @@ -4134,6 +4157,176 @@ Partial Class PV UpAddVenta.Update() UPPDescuento.Update() End Sub + + Partial Class Descuentos + Public ImporteDescuento As Decimal = 0 + Public CvePromocionDetalle As Integer = -1 + Public PU As Decimal = 0 + Public EsPUModificado As Boolean = False + Public ImporteProntoPago As Decimal = 0 + End Class + + Private Function CalcularDescuentos(CvePS As Integer, Cantidad As Decimal, PU As Decimal) As Descuentos + Dim Descuento As Decimal = HdnDescuento.Value.ToDecimal + + If HdnTipoDescuento.Value = "0" Then + Descuento = HdnDescuento.Value.ToDecimal * Cantidad + End If + + Dim ValidaCondicionesComerciales As Boolean = True + + 'AGREGA PROMOCION EN EL DESCUENTO + Dim TipoPromo As Integer = 0 + Dim TotalPromocion As Decimal = 0 + Dim PromocionPorcentaje As Decimal = 0 + Dim PUModificado As Decimal = 0 + Dim SeAjustoPU As Boolean = False + Dim PUPromocion As Decimal = 0 + Dim CantMinima As Integer = 0 + Dim CveMarcaPS As Integer = 0 + Dim CveClasifPS As Integer = 0 + Dim CveRinTamañoPS As Integer = 0 + Dim CvePromocionDetalle As Integer = 0 + Dim IncluyeImpuestos As Boolean = False + Dim TipoAplicacion As Integer = 1 ' 1 - descuento, 2 en PU + Dim ObjDescuento As New Descuentos + + If DdlSubProyectoDatos.SelectedValue = "11842" Then '' E141, el subproyecto: Franquicia, no proceden las promociones + Return ObjDescuento + End If + + + Dim DrPS As DataRow = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa, CvePS:=CvePS).FiltroPrimero("") + If DrPS IsNot Nothing Then + + CveMarcaPS = DrPS("CveMarca").ToString().ToEntero() + CveClasifPS = DrPS("CveClasificacion").ToString().ToEntero() + CveRinTamañoPS = DrPS("CveRinTamaño").ToString().ToEntero() + + If CveClasifPS = 20636 Then + ValidaCondicionesComerciales = False + End If + + End If + + Dim dr As DataRow = Nothing + If DtPromociones IsNot Nothing AndAlso DtPromociones.Rows.Count > 0 Then + dr = DtPromociones.FiltroPrimero(String.Format("CvePS = {0} AND (CveSubProyecto = {1} OR CveSubProyecto IS NULL) AND (CveRinTamaño = {2} OR CveRinTamaño IS NULL) AND ((TipoPromocion <> 3 AND (CantidadMinima <= {3} OR CantidadMinima IS NULL)) OR (TipoPromocion = 3 AND CantidadMinima <= {3} ))", CvePS, DdlSubProyectoDatos.SelectedValue, CveRinTamañoPS, Cantidad), Orderby:="CantidadMinima desc ") + If dr Is Nothing Then + + 'verifica marca, si tiene asignada la promocion + dr = DtPromociones.FiltroPrimero(String.Format("CvePS IS NULL AND CveClasificacion = {0} AND (CveMarca = {1} OR CveMarca IS NULL) AND (CveSubProyecto = {2} OR CveSubProyecto IS NULL) AND (CveRinTamaño = {3} OR CveRinTamaño IS NULL) AND ((TipoPromocion <> 3 AND (CantidadMinima <= {4} OR CantidadMinima IS NULL)) OR (TipoPromocion = 3 AND CantidadMinima <= {4} )) ", CveClasifPS, CveMarcaPS, DdlSubProyectoDatos.SelectedValue, CveRinTamañoPS, Cantidad), Orderby:="CantidadMinima desc") + + End If + End If + Dim Cant As Integer = 1 + If dr IsNot Nothing Then + + TipoPromo = dr("TipoPromocion").ToString().ToEntero() + CantMinima = dr("CantidadMinima").ToString().ToEntero() + IncluyeImpuestos = dr("IncluyeImpuestos").ToString() = "True" + PromocionPorcentaje = dr("Promocion").ToString().ToDecimal + PUPromocion = dr("PUPromocion").ToString().ToDecimal + CvePromocionDetalle = dr("CvePromocionDetalle").ToString().ToEntero() + TipoAplicacion = dr("TipoAplicacion").ToString().ToEntero() + + If CantMinima > 0 Then + Cant = Math.Floor(Cantidad / CantMinima).ToEntero() + End If + + End If + + Dim PorcentajeIVA As Decimal = ViewState("SubProyectoPorcentajeIVA").ToString.ToDecimal ''Math.Round(ViewState("SubProyectoPorcentajeIVA").ToString.ToDecimal, 2).ToDecimal + + TotalPromocion = Math.Round(PUPromocion * Cant / (1 + If(IncluyeImpuestos, PorcentajeIVA, 0)), 6) + + If TipoPromo = 1 Then 'Promocion por Importe $ + If TipoAplicacion = 2 Then + Descuento = 0 + SeAjustoPU = True + PUModificado = Math.Round(PUPromocion / (1 + If(IncluyeImpuestos, PorcentajeIVA, 0)), 6) + Else + Descuento = Descuento + PU - TotalPromocion + End If + + ElseIf TipoPromo = 2 Then 'Promocion por % + Descuento = Descuento + ((PU * PromocionPorcentaje / 100) * Cantidad) + ElseIf TipoPromo = 3 Then 'Promocion por Cantidad + If Cantidad >= CantMinima Then + Descuento = Descuento + TotalPromocion + Else + CvePromocionDetalle = -1 + End If + End If + + + 'VERIFICA SI APLICAN CONDICIONES COMERCIALES + If ValidaCondicionesComerciales AndAlso DtPorcentajeMarcas IsNot Nothing AndAlso DtPorcentajeMarcas.Rows.Count > 0 Then + 'VERIFICA SI EL PRODUCTO TIENE ESPECIFICADA UNA MARCA + If Not String.IsNullOrEmpty(DrPS("CveMarca").ToString()) AndAlso DrPS("CveMarca").ToString().ToEntero() > 0 Then + Dim RowPorcentaje = DtPorcentajeMarcas.FiltroPrimero($"CveMarca={DrPS("CveMarca").ToString()}") + 'REALIZA LOS DESCUENTOS DE ACUERDO AL PORCENTAJE POR MARCA + If RowPorcentaje IsNot Nothing Then + '(AHORA LOS DESCUENTOS SON ACUMULABLES) + 'Descuento = 0 + Dim PorcentajeProducto = RowPorcentaje("PorcentajeProducto").ToString().ToDecimal() / 100D + Dim PorcentajeProducto2 = RowPorcentaje("PorcentajeProducto2").ToString().ToDecimal() / 100D + Dim PorcentajeProducto3 = RowPorcentaje("PorcentajeProducto3").ToString().ToDecimal() / 100D + + Dim TotalInicial As Decimal = (Cantidad * (PU)) '- Descuento + Dim TotalFinal = TotalInicial + 'SI APLICA EL PRIMER DESCUENTO + If PorcentajeProducto > 0 Then + Dim Descuento1 As Decimal = (TotalInicial * PorcentajeProducto).RoundSQL(2) + Dim Total2 = (TotalInicial - Descuento1) + + 'SI APLICA EL SEGUNDO DESCUENTO + If PorcentajeProducto2 > 0 Then + Dim Descuento2 As Decimal = (Total2 * PorcentajeProducto2).RoundSQL(2) + Dim Total3 = (Total2 - Descuento2) + + 'SI APLICA EL TERCER DESCUENTO + If PorcentajeProducto3 > 0 Then + Dim Descuento3 As Decimal = (Total3 * PorcentajeProducto3).RoundSQL(2) + TotalFinal = Total3 - Descuento3 + Else + TotalFinal = Total3 + End If + Else + TotalFinal = Total2 + End If + Else + TotalFinal = TotalInicial + End If + + If PorcentajeProducto > 0 Then + Descuento += ((Cantidad * PU) - TotalFinal) + End If + + 'SI TIENE PRONTO PAGO CALCULA EL IMPORTE + If DdlTipoComprobante.SelectedValue = "Ing" AndAlso RowPorcentaje("ProntoPago").ToString().ToDecimal() > 0 Then + Dim TotalProntoPago As Decimal = (Cantidad * (PU)) - Descuento + Dim PorcentajeProntoPago = RowPorcentaje("ProntoPago").ToString().ToDecimal() / 100D + + ObjDescuento.ImporteProntoPago = (TotalProntoPago * PorcentajeProntoPago).RoundSQL(2) + End If + + End If + End If + End If + + ObjDescuento.ImporteDescuento = Descuento + ObjDescuento.CvePromocionDetalle = CvePromocionDetalle + If SeAjustoPU Then + ObjDescuento.PU = PUModificado + ObjDescuento.EsPUModificado = True + End If + + Return ObjDescuento + End Function + + + Protected Sub DdlPS_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DdlPS.selectedindexchange DdlPSIndexChange(DdlPS.SelectedValue.ToEntero, DdlPS) End Sub @@ -5114,15 +5307,22 @@ Partial Class PV Descuento = HdnDescuento.Value.ToDecimal * TxtCantidad.Text.ToDecimal End If + Dim ObjDescuento As New Descuentos If DrPS("CveClasificacion").ToString.ToEntero.Contiene(20516, 20515) Then - Descuento = ((Cantidad * PU) * ClasificacionesDescuentos(DrPS("CveClasificacion").ToString.ToEntero)) + ObjDescuento.ImporteDescuento = ((Cantidad * PU) * ClasificacionesDescuentos(DrPS("CveClasificacion").ToString.ToEntero)) End If + ObjDescuento = CalcularDescuentos(CvePS, Cantidad, PU) + If ObjDescuento.EsPUModificado Then + PU = ObjDescuento.PU + End If + + Dim CveProyecto As Integer = GlobalDTSubProyectos(-1, CveSubProyecto:=DdlSubProyectoDatos.SelectedValue.ToEntero, CveEmpresa:=UsuarioActual.CveEmpresa).Rows(0)("CveProyecto").ToString.ToEntero Dim Proyecto As String = GlobalDTSubProyectos(-1, CveSubProyecto:=DdlSubProyectoDatos.SelectedValue.ToEntero, CveEmpresa:=UsuarioActual.CveEmpresa).Rows(0)("Proyecto").ToString Dim Consec = AgregarProductoServicio(Cantidad, DdlUnidadMedida.SelectedValue.ToEntero, DdlUnidadMedida.SelectedItem.Text, DdlClasificacion.SelectedValue.ToEntero, DdlClasificacion.SelectedItem.Text, - CvePS, "", TxtObsPS.Text.Trim, PU, Descuento, + CvePS, "", TxtObsPS.Text.Trim, PU, ObjDescuento.ImporteDescuento, CveProyecto, Proyecto, DdlSubProyectoDatos.SelectedValue.ToEntero, DdlSubProyectoDatos.SelectedItem.Text, Serie:="", TiempoEntrega:="", CuentaPredial:="", RegeneraIEPS:=ClienteDesglosaIEPS, CveVentaDetalle:=CveVentaDetalle, EsCargo:=EsCargo)