' === Pratica Obrigatoria 1 (ATIVO) ===
Option Explicit

Sub ProcessamentoFinanceiroBlindado()
    On Error GoTo TratarErro
    
    Dim ws As Worksheet
    Dim curValorTotal As Currency
    Dim dblPesoKg As Double
    Dim curPrecoPorKg As Currency
    Dim curBackup As Variant
    
    Set ws = ThisWorkbook.Worksheets(1)
    
    ' Armazena estado anterior para Rollback
    curBackup = ws.Range("C2").Value
    
    curValorTotal = CCur(ws.Range("A2").Value)
    dblPesoKg = CDbl(ws.Range("B2").Value)
    
    curPrecoPorKg = curValorTotal / dblPesoKg
    
    ws.Range("C2").Value = curPrecoPorKg
    ws.Range("C2").NumberFormat = "R$ #,##0.00"
    ws.Range("D2").Value = "PROCESSADO COM SUCESSO"
    ws.Range("D2").Interior.Color = RGB(220, 255, 220)
    
    Exit Sub

TratarErro:
    ' Executa Rollback dos dados (Desafio de Fixação)
    ws.Range("C2").Value = curBackup
    ws.Range("D2").Value = "CANCELADO: FALHA NA TRANSAÇÃO"
    ws.Range("D2").Interior.Color = RGB(255, 200, 200)
    
    ' Registro de Auditoria Forense
    Call RegistrarLogErro(Err.Number, Err.Description, "ProcessamentoFinanceiroBlindado")
    
    MsgBox "Ocorreu uma falha no cálculo financeiro." & vbCrLf & _
           "As alterações foram desfeitas com segurança (Rollback) e o erro foi registrado para a TI.", _
           vbExclamation, "FastLog Resiliência"
End Sub

Private Sub RegistrarLogErro(ByVal lngNum As Long, ByVal strDesc As String, ByVal strProc As String)
    Dim wsAudit As Worksheet
    Dim lngLinha As Long
    
    On Error Resume Next
    Set wsAudit = ThisWorkbook.Worksheets("Auditoria_Erros")
    On Error GoTo 0
    
    If wsAudit Is Nothing Then
        Set wsAudit = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
        wsAudit.Name = "Auditoria_Erros"
        wsAudit.Tab.Color = RGB(192, 57, 43)
        wsAudit.Range("A1:E1").Value = Array("DATA_HORA", "USUARIO", "ROTINA", "COD_ERRO", "MENSAGEM")
        wsAudit.Range("A1:E1").Font.Bold = True
    End If
    
    lngLinha = wsAudit.Cells(wsAudit.Rows.Count, "A").End(xlUp).Row + 1
    wsAudit.Cells(lngLinha, 1).Value = Now
    wsAudit.Cells(lngLinha, 2).Value = Environ("USERNAME")
    wsAudit.Cells(lngLinha, 3).Value = strProc
    wsAudit.Cells(lngLinha, 4).Value = lngNum
    wsAudit.Cells(lngLinha, 5).Value = strDesc
    wsAudit.Columns("A:E").AutoFit
End Sub

