Apesar de não contemplar todas as variações possíveis, não é difícil ajustá-la para as necessidades específicas.
Também exibe o cálculo detalhado por tributo ao clicar no botão com setinha '>'.
Code: Select all
/************************************************************************
* @description Calculadora do Simples Nacional
* Calcula a alíquota do simples nacional e o aproveitamento do ICMS/ISS
* Não contempla as regras especiais de recolhimento por faturamento elevado
* @file Calculadora Simples Nacional.ahk
* @author Pedro Henrique C Xavier
* @date 2023/09/07
* @version 2.0.7
***********************************************************************/
#Requires AutoHotKey v2.0
#Include <NumLib>
#Include <CalcSNacional>
#SingleInstance
TraySetIcon('calc.exe')
GuiP := Gui(, 'Calc S Nacional')
GuiP.OnEvent('Escape', Limpar)
GuiP.BackColor := 'White'
GuiP.SetFont('S14 bold', 'Verdana')
GuiP.AddText('w240', 'Calculadora')
GuiP.AddText('wp y+10', 'Simples Nacional')
GuiP.SetFont('S10 norm', 'Segoe UI')
GuiP.AddButton('x+-30 yp w30', '>').OnEvent('Click', ShowDetalhes)
GuiP.AddText('xm y80 section', 'Selecione a atividade:')
Drop := GuiP.AddDropDownList('w240 Choose1',
['Comércio', 'Comércio - ST', 'Comércio - Monofásico', 'Comércio - Monofásico e ST', 'Comércio - Exportação',
'Indústria', 'Indústria - Exportação', 'Serviços - Anexo III', 'Serviços - Anexo III e Retenção ISS',
'Serviços - Anexo IV', 'Serviços - Anexo IV e Retenção ISS', 'Serviços - Anexo V', 'Serviços - Anexo V e Retenção ISS',
'Serviços - Comunicação Imune ICMS', 'Locação de Bens Móveis', 'Transportes'])
GuiP.AddText('wp', 'Receita Bruta 12 meses')
Edt1 := GuiP.AddEdit('Right wp Limit18')
Edt1.OnEvent('Change', Formata_Contabil)
GuiP.AddText('wp', 'Faturamento Mensal')
Edt2 := GuiP.AddEdit('wp Right Limit18')
Edt2.OnEvent('Change', Formata_Contabil)
GuiP.AddButton('default w110', 'Calcular').OnEvent('Click', Calcular)
GuiP.AddButton('x+20 yp wp', 'Limpar').OnEvent('Click', Limpar)
GuiP.AddText('xm y+10 wp Right', 'Alíquota Efetiva')
Parc := GuiP.AddText('x+20 yp wp Right', 'Parcela ICMS/ISS')
Edt3 := GuiP.AddEdit('xm y+10 wp Right ReadOnly BackgroundFFFFFF', '0,00%')
Edt4 := GuiP.AddEdit('x+20 yp wp Right ReadOnly BackgroundFFFFFF', '0,00%')
GuiP.AddText('xm y+10 w240 Right', 'Valor do Imposto')
Edt5 := GuiP.AddEdit('Right wp ReadOnly BackgroundFFFFFF', '0,00')
GuiP.SetFont('s8')
GuiP.AddStatusBar()
/**
* GUI auxiliar para mostrar os detalhes do cálculo
* Inicialmente ocultada, só é mostrada ao clicar no botão '>'
*/
GuiP.SetFont('S14 bold', 'Verdana')
DCal := GuiP.AddText('w250 xm+300 ym section Hidden', 'Detalhes do cálculo')
GuiP.SetFont('S10 norm', 'Tahoma')
Gca1 := GuiP.AddText('w50 xs y+13 Hidden', 'Imposto')
Gca2 := GuiP.AddText('w70 x+20 yp Hidden Right', 'Alíquota')
Gca3 := GuiP.AddText('w70 x+20 yp Hidden Right', 'Valor')
GTe1 := GuiP.AddText('w50 xs y+20 Hidden', 'IRPJ')
GAl1 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00%')
GEd1 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00')
GTe2 := GuiP.AddText('w50 xs y+20 Hidden', 'CSLL')
GAl2 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00%')
GEd2 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00')
GTe3 := GuiP.AddText('w50 xs y+20 Hidden', 'COFINS')
GAl3 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00%')
GEd3 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00')
GTe4 := GuiP.AddText('w50 xs y+20 Hidden', 'PIS')
GAl4 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00%')
GEd4 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00')
GTe5 := GuiP.AddText('w50 xs y+20 Hidden', 'INSS')
GAl5 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00%')
GEd5 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00')
GTe6 := GuiP.AddText('w50 xs y+20 Hidden', 'ICMS')
GAl6 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00%')
GEd6 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00')
GTe7 := GuiP.AddText('w50 xs y+20 Hidden', 'IPI')
GAl7 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00%')
GEd7 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00')
GTe8 := GuiP.AddText('w50 xs y+20 Hidden', 'ISS')
GAl8 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00%')
GEd8 := GuiP.AddEdit('w70 x+20 yp Hidden Right', '0,00')
GuiP.Show('AutoSize')
; Essa função permite que se possa mover a janela clicando em qualquer posição
OnMessage(0x201, (wParam, lParam, msg, hwnd) => PostMessage(0xA1, 2, , , hwnd))
/**
* Limpa os campos da Gui
*/
Limpar(*)
{
Edt1.Text := Edt2.Text := ''
for Gctrl in [Edt3, Edt4, GAl1, GAl2, GAl3, GAl4, GAl5, GAl6, GAl7, GAl8]
Gctrl.Value := '0,00%'
for Gctrl in [Edt5, GEd1, GEd2, GEd3, GEd4, GEd5, GEd6, GEd7, GEd8]
Gctrl.Value := '0,00'
}
/**
* Realiza o cálculo principal, atualizando os campos da Gui
*/
Calcular(*)
{
choice := Drop.Text
RB12 := (ToNum(Edt1.Value) || 1)
FATM := (ToNum(Edt2.Value) || 0)
if RB12 > 3600000
{
MsgBox('Receita bruta ultrapassa a 5a faixa e não é contemplada pelo programa', , 'IconX')
return
}
if choice = 'Comércio'
{
calc := CalcSNacional('I', RB12)
}
else if Choice = 'Comércio - ST'
{
calc := CalcSNacional('I', RB12)
calc.definirExclusoes('icms')
}
else if Choice = 'Comércio - Monofásico'
{
calc := CalcSNacional('I', RB12)
calc.definirExclusoes('pis', 'cofins')
}
else if Choice = 'Comércio - Monofásico e ST' or Choice = 'Comércio - Exportação'
{
calc := CalcSNacional('I', RB12)
calc.definirExclusoes('pis', 'cofins', 'icms')
}
else if Choice = 'Indústria'
{
calc := CalcSNacional('II', RB12)
}
else if Choice = 'Indústria - Exportação'
{
calc := CalcSNacional('II', RB12)
calc.definirExclusoes('pis', 'cofins', 'icms', 'ipi')
}
else if Choice = 'Serviços - Anexo III'
{
calc := CalcSNacional('III', RB12)
}
else if Choice = 'Serviços - Anexo III e Retenção ISS'
or Choice = 'Locação de Bens Móveis' or Choice = 'Serviços - Comunicação Imune ICMS'
{
calc := CalcSNacional('III', RB12)
calc.definirExclusoes('iss')
}
else if Choice = 'Serviços - Anexo IV'
{
calc := CalcSNacional('IV', RB12)
}
else if Choice = 'Serviços - Anexo IV e Retenção ISS'
{
calc := CalcSNacional('IV', RB12)
calc.definirExclusoes('iss')
}
else if Choice = 'Serviços - Anexo V'
{
calc := CalcSNacional('V', RB12)
}
else if Choice = 'Serviços - Anexo V e Retenção ISS'
{
calc := CalcSNacional('V', RB12)
calc.definirExclusoes('iss')
}
else if Choice = 'Transportes'
{
parc_icms := CalcSNacional('I', RB12).icms
calc := CalcSNacional('III', RB12)
calc.definirExclusoes('iss')
calc.aliqEfetiva += parc_icms
calc.icms := parc_icms
}
/** Tenta realizar um arrendondamento mais próximo do cálculo da receita
* "Edt5.Value := milhar(calc.aliqEfetiva * FATM)" apesar de mais simples,
* frequentemente não bate com o arrendondamento da guia gerada.
*/
vlrImposto := 0
for prop in ['irpj', 'csll', 'cofins', 'pis', 'inss', 'icms', 'ipi', 'iss']
vlrImposto += Round(calc.%prop% * FATM, 2)
Edt3.Value := milhar(calc.aliqEfetiva * 100) '%'
Edt4.Value := milhar((calc.icms ? calc.icms : calc.iss) * 100) '%'
Edt5.Value := milhar(vlrImposto)
GAl1.Value := milhar(calc.irpj * 100) '%'
GEd1.Value := milhar(calc.irpj * FATM)
GAl2.Value := milhar(calc.csll * 100) '%'
GEd2.Value := milhar(calc.csll * FATM)
GAl3.Value := milhar(calc.cofins * 100) '%'
GEd3.Value := milhar(calc.cofins * FATM)
GAl4.Value := milhar(calc.pis * 100) '%'
GEd4.Value := milhar(calc.pis * FATM)
GAl5.Value := milhar(calc.inss * 100) '%'
GEd5.Value := milhar(calc.inss * FATM)
GAl6.Value := milhar(calc.icms * 100) '%'
GEd6.Value := milhar(calc.icms * FATM)
GAl7.Value := milhar(calc.ipi * 100) '%'
GEd7.Value := milhar(calc.ipi * FATM)
GAl8.Value := milhar(calc.iss * 100) '%'
GEd8.Value := milhar(calc.iss * FATM)
}
/**
* Mostra ou oculta os controles com o cálculo detalhado
* na lateral da Gui principal
* @param GuiCtrl
*/
ShowDetalhes(GuiCtrl, *)
{
controls := [DCal, Gca1, Gca2, Gca3, GTe1, GAl1, GEd1, GTe2, GAl2, GEd2, GTe3, GAl3, GEd3,
GTe4, GAl4, GEd4, GTe5, GAl5, GEd5, GTe6, GAl6, GEd6, GTe7, GAl7, GEd7, GTe8, GAl8, GEd8]
if DCal.Visible
{
for ctrl in controls
ctrl.Visible := false
GuiCtrl.Text := '>'
}
else
{
for ctrl in controls
ctrl.Visible := true
GuiCtrl.Text := '<'
}
GuiP.Show('AutoSize')
}
/**
* Funções para formatação e exibição dos números
* @param EditCtrl
*/
Formata_Contabil(EditCtrl, *)
{
vlr := RegExReplace(EditCtrl.Text, '\D')
EditCtrl.Text := milhar(vlr ? vlr / 100 : 0)
ControlSend '{End}', EditCtrl
}