Option Explicit

Public Sub Main()
Dim nuevaTG, nuevaTP
Dim keepPrecios
Dim factorRedondeo
Dim s

' 1: Obtener parámetros
	On Error Resume Next
	
	Do
		s = InputBox("Nueva tasa para el impuesto general:" & vbCrLf & "(deje en blanco para interrumpir la actualizacion)", "Actualizacion de IVA")
		If s = "" Then Exit Sub
		nuevaTG = CDbl(s)
		If Err.Number Then
			MsgBox Err.Description, vbCritical, "ERROR"
			s = "x"
			Err.Clear
		ElseIf nuevaTG < 0 Or nuevaTG > 30 Then
			MsgBox "El valor está fuera del rango permitido", vbCritical, "ERROR"
			s = "x"
		End If
	Loop While s = "x"

	Do
		s = InputBox("Nueva tasa para el impuesto preferencial:" & vbCrLf & "(deje en blanco para interrumpir la actualizacion)", "Actualizacion de IVA")
		If s = "" Then Exit Sub
		nuevaTP = CDbl(s)
		If Err.Number Then
			MsgBox Err.Description, vbCritical, "ERROR"
			s = "x"
			Err.Clear
		ElseIf nuevaTG < 0 Or nuevaTG > 30 Then
			MsgBox "El valor está fuera del rango permitido", vbCritical, "ERROR"
			s = "x"
		End If
	Loop While s = "x"

	keepPrecios = MsgBox("¿Desea alterar los precios de los productos" & vbCrLf & _
										"para que el valor final (incluyendo el IVA) sea" & vbCrLf & _
										"igual al actual?" & vbCrLf & _
										"IMPORTANTE: Si el IVA está subiendo, los precios" & vbCrLf & _
										"bajarán.", vbYesNoCancel + vbDefaultButton2, "Actualizacion de IVA")

	if keepPrecios = vbCancel Then Exit Sub
	
	keepPrecios = (keepPrecios = vbYes)

	Do
		s = InputBox("Los precios unitarios finales, incluyendo el IVA, deberán ser múltiplos de:" & vbCrLf & "(deje en blanco para interrumpir la actualizacion)", "Actualizacion de IVA", "0,01")
		If s = "" Then Exit Sub
'		s = Replace(s, ".", ",")
		factorRedondeo = CDbl(s)
		If Err.Number <> 0 Then
			msgBox Err.Description, vbCritial, "ERROR"
			s = "x"
		ElseIf factorRedondeo < 0 Then
			msgBox "El valor está fuera del rango permitido", vbCritical, "ERROR"
			s = "x"
		End If
		
		If s <> "x" Then
			If factorRedondeo >= 1 Then
				If msgBox("¿Está seguro de querer usar un factor de redondeo de Bs. " & factorRedondeo & "?", vbYesNo, "CONFIRMAR") = vbNo Then s = "x"
			End If
		End If
	Loop While s = "x"

	If msgBox("Son correctos los siguientes datos: " & vbCrLf & _
						"Tasa General: " & NuevaTG &  vbCrLf &_
						"Tasa preferencial: " & NuevaTP &  vbCrLf &_
						"Mantener precio final: " & keepPrecios &  vbCrLf & _
						"Redondear precios a Bs.: " & factorRedondeo, vbYesNo + vbDefaultButton2, "Actualizacion de IVA: CONFIRMAR") = vbNo Then
		Exit Sub
	End If
	
	On Error GoTo 0
	
	Dim tgActual, tpActual
	With CrearObjeto("TiposImpuesto")
		tgActual = .ValorActualImpuesto("IV1")
		tpActual = .ValorActualImpuesto("IV2")
	End With
	
	If Abs(tgActual - nuevaTG) < 0.01 And Abs(tpActual - nuevaTP) < 0.01 Then
		MsgBox "No hay cambios en las tasas... Actualizacion cancelada", vbInformation, "Actualizacion de IVA"
		Exit Sub
	End If

	SetGlobalLock
	StartTransaction
	ExecuteSQL "UPDATE TiposImpuesto SET Porcentaje = ? WHERE Codigo = 'IV1'", nuevaTG
	ExecuteSQL "UPDATE TiposImpuesto SET Porcentaje = ? WHERE Codigo = 'IV2'", nuevaTP
	
	If keepPrecios Then
		ExecuteSQL "UPDATE ItemsVenta SET Precio1 = Precio1 * ? / ?, Precio2 = Precio2 * ? / ?, Precio3 = Precio3 * ? / ?, Precio4 = Precio4 * ? / ? WHERE TipoImpuesto1 = 'IV1'", _
			1.0 + tgActual / 100, 1.0 + nuevaTG / 100, 1.0 + tgActual / 100, 1.0 + nuevaTG / 100, 1.0 + tgActual / 100, 1.0 + nuevaTG / 100, 1.0 + tgActual / 100, 1.0 + nuevaTG / 100
		ExecuteSQL "UPDATE ItemsVenta SET Precio1 = Precio1 * ? / ?, Precio2 = Precio2 * ? / ?, Precio3 = Precio3 * ? / ?, Precio4 = Precio4 * ? / ? WHERE TipoImpuesto1 = 'IV2'", _
			1.0 + tpActual / 100, 1.0 + nuevaTP / 100, 1.0 + tpActual / 100, 1.0 + nuevaTP / 100, 1.0 + tpActual / 100, 1.0 + nuevaTP / 100, 1.0 + tpActual / 100, 1.0 + nuevaTP / 100
	End If

	If factorRedondeo > 0 Then
		Dim factorTasa, keyWrd
		If InStr(1, CrearObjeto("Database").ConnectionString, "Provider=Microsoft.Jet.OLEDB.4.0") = 0 Then
			keyWrd = "FLOOR"
		Else
			keyWrd = "INT"
		End If
		factorTasa = 1.0 + nuevaTG / 100
		ExecuteSQL "UPDATE ItemsVenta SET " & _
			"Precio1 = " & keyWrd & "(Precio1 * ? / ? + 0.5) * ? / ?, " & _
			"Precio2 = " & keyWrd & "(Precio2 * ? / ? + 0.5) * ? / ?, " & _
			"Precio3 = " & keyWrd & "(Precio3 * ? / ? + 0.5) * ? / ?, " & _
			"Precio4 = " & keyWrd & "(Precio4 * ? / ? + 0.5) * ? / ? " & _
			"WHERE TipoImpuesto1 = 'IV1'", _
			factorTasa, factorRedondeo, factorRedondeo, factorTasa, _
			factorTasa, factorRedondeo, factorRedondeo, factorTasa, _
			factorTasa, factorRedondeo, factorRedondeo, factorTasa, _
			factorTasa, factorRedondeo, factorRedondeo, factorTasa
		factorTasa = 1.0 + nuevaTP / 100
		ExecuteSQL "UPDATE ItemsVenta SET " & _
			"Precio1 = " & keyWrd & "(Precio1 * ? / ? + 0.5) * ? / ?, " & _
			"Precio2 = " & keyWrd & "(Precio2 * ? / ? + 0.5) * ? / ?, " & _
			"Precio3 = " & keyWrd & "(Precio3 * ? / ? + 0.5) * ? / ?, " & _
			"Precio4 = " & keyWrd & "(Precio4 * ? / ? + 0.5) * ? / ? " & _
			"WHERE TipoImpuesto1 = 'IV2'", _
			factorTasa, factorRedondeo, factorRedondeo, factorTasa, _
			factorTasa, factorRedondeo, factorRedondeo, factorTasa, _
			factorTasa, factorRedondeo, factorRedondeo, factorTasa, _
			factorTasa, factorRedondeo, factorRedondeo, factorTasa
	End If
	CommitTransaction
	FreeGlobalLock
	With CrearObjeto("TiposImpuesto")
		.Item("IV1").Porcentaje = CDbl(nuevaTG)
		.Item("IV2").Porcentaje = CDbl(nuevaTP)
	End With
	
	MsgBox "Proceso terminado!"
End Sub
