class CalcSNacional

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

Moderator: Gio

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

class CalcSNacional

07 Sep 2023, 08:50

Classe para calcular as alíquotas do simples nacional. Permite o cálculo até a 5ª faixa de tributação. A sexta exige regras especiais não contempladas.

Permite definir exclusões de impostos, útil para calcular vendas com substituição tributária de ICMS, com tributação monofásica de PIS e COFINS ou isenções diversas.

Exemplo de uso:

Code: Select all

#Requires AutoHotkey v2.0
#Include <CalcSNacional>

; Exemplo 1
; Comércio com substituição tributária de icms
calc := CalcSNacional('I', 200153.35)
calc.definirExclusoes('icms')
MsgBox(calc.aliqEfetiva) ; Resultado: 0.028593018318204513
MsgBox(calc.irpj) ; Parcela do IRPJ (0.0023827515265170429)


; Exemplo 2
; Comercio com vendas monofásicas de pis e cofins
calc := CalcSNacional('I', 80000)
calc.definirExclusoes('pis', 'cofins')
MsgBox(calc.aliqEfetiva) ; Resultado 0.033799999999999997
[/code]



[code]
/************************************************************************
 * @description Class para calcular as alíquotas do Simples Nacional
 * @file CalcSNacional.ahk
 * @author Pedro Henrique C. Xavier
 * @date 2023/09/07
 * @version 2.0.7
 ***********************************************************************/

/**
 * Classe para cálculo das alíquotas do Simples Nacional.
 *
 * Permite definir exclusões de tributos para cálculo do ST, monofásico e retenções.
 *
 * Compatível até a 5ª faixa de tributação (a 6ª faixa requer regras especiais)
 *
 * @prop {number} aliqEfetiva retorna a alíquota devida
 * @prop {number} pis retorna a parcela correspondente ao PIS
 * @prop {number} cofins retorna a parcela correspondente ao COFINS
 * @prop {number} irpj retorna a parcela correspondente ao IRPJ
 * @prop {number} csll retorna a parcela correspondente ao CSLL
 * @prop {number} inss retorna a parcela correspondente ao INSS
 * @prop {number} ipi retorna a parcela correspondente ao IPI
 * @prop {number} icms retorna a parcela correspondente ao ICMS
 * @prop {number} iss retorna a parcela correspondente ao ISS
 */
class CalcSNacional
{
    /**
     * Inicia a classe e define as propriedades de acordo com a alíquota
     * @param {string} anexo O anexo a ser considerado. Opções válidas são: I, II, III, IV e V
     * @param {number} RB12 A Receita Bruta acumulada dos 12 últimos meses
     */
    __New(anexo, RB12 := 1)
    {
        this.anexo := anexo
        this.RB12 := RB12
        this.faixa := this.definirfaixa(RB12)
        this.definirImpostos()
    }
    /**
     * Enumerador personalizado com as propriedades disponíveis
     * @param prop
     * @param value Opcional
     * @returns {$enumerator}
     */
    __Enum(prop, value?)
    {
        num := 0, arr := ['pis', 'cofins', 'irpj', 'csll', 'inss', 'ipi', 'icms', 'iss']
        Enumerator(&prop, &value?)
        {
            if num >= 8
                return false

            num++, prop := arr[num], value := this.%prop%
            return true
        }
        return Enumerator
    }
    anexos := Map(
        'I',[
        { aliq: 0.04,  ded: 0,      pis: 0.0276, cofins: 0.1274, irpj: 0.0550, csll: 0.0350, inss: 0.4150, ipi: 0.0000, icms: 0.3400, iss: 0.0000 },
        { aliq: 0.073, ded: 5940,   pis: 0.0276, cofins: 0.1274, irpj: 0.0550, csll: 0.0350, inss: 0.4150, ipi: 0.0000, icms: 0.3400, iss: 0.0000 },
        { aliq: 0.095, ded: 13860,  pis: 0.0276, cofins: 0.1274, irpj: 0.0550, csll: 0.0350, inss: 0.4200, ipi: 0.0000, icms: 0.3350, iss: 0.0000 },
        { aliq: 0.107, ded: 22500,  pis: 0.0276, cofins: 0.1274, irpj: 0.0550, csll: 0.0350, inss: 0.4200, ipi: 0.0000, icms: 0.3350, iss: 0.0000 },
        { aliq: 0.143, ded: 87300,  pis: 0.0276, cofins: 0.1274, irpj: 0.0550, csll: 0.0350, inss: 0.4200, ipi: 0.0000, icms: 0.3350, iss: 0.0000 }
    ], 'II', [
        { aliq: 0.045, ded: 0,      pis: 0.0249, cofins: 0.1151, irpj: 0.0550, csll: 0.0350, inss: 0.3750, ipi: 0.0750, icms: 0.3200, iss: 0.0000 },
        { aliq: 0.078, ded: 5940,   pis: 0.0249, cofins: 0.1151, irpj: 0.0550, csll: 0.0350, inss: 0.3750, ipi: 0.0750, icms: 0.3200, iss: 0.0000 },
        { aliq: 0.100, ded: 13860,  pis: 0.0249, cofins: 0.1151, irpj: 0.0550, csll: 0.0350, inss: 0.3750, ipi: 0.0750, icms: 0.3200, iss: 0.0000 },
        { aliq: 0.112, ded: 22500,  pis: 0.0249, cofins: 0.1151, irpj: 0.0550, csll: 0.0350, inss: 0.3750, ipi: 0.0750, icms: 0.3200, iss: 0.0000 },
        { aliq: 0.147, ded: 85500,  pis: 0.0249, cofins: 0.1151, irpj: 0.0550, csll: 0.0350, inss: 0.3750, ipi: 0.0750, icms: 0.3200, iss: 0.0000 }
    ], 'III', [
        { aliq: 0.060, ded: 0,      pis: 0.0278, cofins: 0.1282, irpj: 0.0400, csll: 0.0350, inss: 0.4340, ipi: 0.0000, icms: 0.0000, iss: 0.3350 },
        { aliq: 0.112, ded: 9360,   pis: 0.0305, cofins: 0.1405, irpj: 0.0400, csll: 0.0350, inss: 0.4340, ipi: 0.0000, icms: 0.0000, iss: 0.3200 },
        { aliq: 0.135, ded: 17640,  pis: 0.0296, cofins: 0.1364, irpj: 0.0400, csll: 0.0350, inss: 0.4340, ipi: 0.0000, icms: 0.0000, iss: 0.3250 },
        { aliq: 0.160, ded: 35640,  pis: 0.0296, cofins: 0.1364, irpj: 0.0400, csll: 0.0350, inss: 0.4340, ipi: 0.0000, icms: 0.0000, iss: 0.3250 },
        { aliq: 0.210, ded: 125640, pis: 0.0278, cofins: 0.1282, irpj: 0.0400, csll: 0.0350, inss: 0.4340, ipi: 0.0000, icms: 0.0000, iss: 0.3350 }
    ], 'IV', [
        { aliq: 0.045, ded: 0,      pis: 0.0383, cofins: 0.1767, irpj: 0.1880, csll: 0.1520, inss: 0.0000, ipi: 0.0000, icms: 0.0000, iss: 0.4450 },
        { aliq: 0.090, ded: 8100,   pis: 0.0445, cofins: 0.2055, irpj: 0.1980, csll: 0.1520, inss: 0.0000, ipi: 0.0000, icms: 0.0000, iss: 0.4000 },
        { aliq: 0.102, ded: 12420,  pis: 0.0427, cofins: 0.1973, irpj: 0.2080, csll: 0.1520, inss: 0.0000, ipi: 0.0000, icms: 0.0000, iss: 0.4000 },
        { aliq: 0.140, ded: 39780,  pis: 0.0410, cofins: 0.1890, irpj: 0.1780, csll: 0.1920, inss: 0.0000, ipi: 0.0000, icms: 0.0000, iss: 0.4000 },
        { aliq: 0.220, ded: 183780, pis: 0.0392, cofins: 0.1808, irpj: 0.1880, csll: 0.1920, inss: 0.0000, ipi: 0.0000, icms: 0.0000, iss: 0.4000 }
    ], 'V', [
        { aliq: 0.155, ded: 0,      pis: 0.0305, cofins: 0.1410, irpj: 0.2500, csll: 0.1500, inss: 0.2885, ipi: 0.0000, icms: 0.0000, iss: 0.1400 },
        { aliq: 0.180, ded: 4500,   pis: 0.0305, cofins: 0.1410, irpj: 0.2300, csll: 0.1500, inss: 0.2785, ipi: 0.0000, icms: 0.0000, iss: 0.1700 },
        { aliq: 0.195, ded: 9900,   pis: 0.0323, cofins: 0.1492, irpj: 0.2400, csll: 0.1500, inss: 0.2385, ipi: 0.0000, icms: 0.0000, iss: 0.1900 },
        { aliq: 0.205, ded: 17100,  pis: 0.0341, cofins: 0.1574, irpj: 0.2100, csll: 0.1500, inss: 0.2385, ipi: 0.0000, icms: 0.0000, iss: 0.2100 },
        { aliq: 0.230, ded: 62100,  pis: 0.0305, cofins: 0.1410, irpj: 0.2300, csll: 0.1250, inss: 0.2385, ipi: 0.0000, icms: 0.0000, iss: 0.2350 }
    ] )

    faixa := [ { FatMin: 0,          FatMax: 180000  },
               { FatMin: 180000.01,  FatMax: 360000  },
               { FatMin: 360000.01,  FatMax: 720000  },
               { FatMin: 720000.01,  FatMax: 1800000 },
               { FatMin: 1800000.01, FatMax: 3600000 } ]

    /**
     * Permite definir quais impostos serão excluídos do cálculo e atualiza as propriedades
     *
     * Por exemplo, em vendas com ST, o ICMS deve ser excluído.
     * Já para saídas monofásicas, o PIS e COFINS deve ser excluído.
     * @param {variadic} params Os impostos a serem excluídos
     */
    definirExclusoes(params*)
    {
        f := this.faixa, a := this.anexo, exclusoes := 0
        for prop in params
        {
            exclusoes += this.anexos[a][f].%prop%
            this.%prop% := 0
        }
        this.aliqEfetiva *= (1 - exclusoes)
    }
    /**
     * Método interno. Não deve ser chamado diretamente
     * Define as propriedades de cada imposto de acordo com a alíquota devida
     */
    definirImpostos()
    {
        f := this.faixa, a := this.anexo
        this.aliqEfetiva := (this.RB12 * this.anexos[a][f].aliq - this.anexos[a][f].ded) / this.RB12

        for prop in ['pis', 'cofins', 'irpj', 'csll', 'inss', 'ipi', 'icms', 'iss']
            this.DefineProp(prop, {value: this.anexos[a][f].%prop% * this.aliqEfetiva})
    }
    /**
     * Método interno. Não deve ser chamado diretamente
     * Define qual é a faixa de impostos e deduções que será aplicada
     */
    definirfaixa(RB12)
    {
        for i, v in this.faixa
        {
            if (RB12 >= this.faixa[A_Index].FatMin and RB12 <= this.faixa[A_Index].FatMax)
            {
                ind := A_Index
                break
            }
        }
        if not IsSet(ind)
            throw ValueError('Receita Bruta fora da faixa de limite', -2)

        return ind
    }
}

Return to “Scripts e Funções”

Who is online

Users browsing this forum: No registered users and 90 guests