Calculadora Simples Nacional [Gui]

Compartilhe seus scripts, funções, ferramentas e programas

Moderator: Gio

pedro45_vs
Posts: 39
Joined: 28 Jun 2020, 18:46

Calculadora Simples Nacional [Gui]

08 Sep 2023, 14:45

Calculadora das alíquotas do simples nacional com diversas opções de cálculo.
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
}

Return to “Scripts e Funções”

Who is online

Users browsing this forum: No registered users and 46 guests