Ejemplo n.º 1
0
 def icms_bonif_industria(self, codNCM):
     if codNCM in ('08043000', '10063021'):
         self.declare(TributBaseFact(icms_cst="40"))
         self.cst = "40"
     elif codNCM in ('19053100', '19059090'):
         self.declare(TributBaseFact(icms_cst="00"))
         self.cst = "00"
         if codNCM in ('19053100'):
             self.declare(TributBaseFact(icms_aliquota=float(12)))
             self.aliquota = float(12)
         elif codNCM in ('19059090'):
             self.declare(TributBaseFact(icms_aliquota=float(7)))
             self.aliquota = float(7)
     elif codNCM in ('21069029', '17049020'):
         self.declare(TributBaseFact(icms_cst="20"))
         self.cst = "20"
         self.declare(TributBaseFact(icms_aliquota=float(18)))
         self.aliquota = float(18)
         self.declare(TributBaseFact(icms_reducao=33.33))
         self.reducao = 33.33
     elif codNCM in ('22030000', '22011000'):
         self.declare(TributBaseFact(icms_cst="10"))
         self.cst = "10"
         self.declare(TributBaseFact(icms_mva=float(140.0)))
         self.declare(TributBaseFact(icms_st_aliquota=float(29.0)))
Ejemplo n.º 2
0
 def ipi_compras(self, codNCM):
     if codNCM in ('22030000', '22011000'):
         self.declare(TributBaseFact(ipi_cst="00"))  #49 - Outras Entradas
         self.declare(TributBaseFact(ipi_aliquota=4.8))
     elif codNCM in ('22041010'):
         self.declare(TributBaseFact(ipi_cst="00"))
         self.cst = "00"
         self.declare(TributBaseFact(ipi_aliquota=10))
Ejemplo n.º 3
0
 def icms_bonif_simples(self, codNCM):
     if codNCM in ('17049020', '19053100', '19059090', '21069029',
                   '08043000', '10063021'):
         self.declare(TributBaseFact(icms_cst="90"))
         self.cst = "90"
     elif codNCM in ('22030000', '22011000'):
         self.declare(TributBaseFact(icms_cst="10"))
         self.cst = "10"
         self.declare(TributBaseFact(icms_mva=140.0))
         self.declare(TributBaseFact(icms_st_aliquota=float(29.0)))
Ejemplo n.º 4
0
 def icms_perdas(self, codNCM):
     if codNCM in ('19059090'):
         self.declare(TributBaseFact(icms_cst="00"))
         self.cst = "00"
         self.declare(TributBaseFact(icms_aliquota=float(7)))
         self.aliquota = float(7)
     elif codNCM in ('17049020', '19053100', '21069029'):
         self.declare(TributBaseFact(icms_cst="20"))
         self.cst = "20"
         if codNCM in ('19053100'):
             self.declare(TributBaseFact(icms_aliquota=float(12)))
             self.aliquota = float(12)
             self.declare(TributBaseFact(icms_reducao=41.6667))
             self.reducao = 41.6667
         elif codNCM in ('17049020', '21069029'):
             self.declare(TributBaseFact(icms_aliquota=float(18)))
             self.aliquota = float(18)
             self.declare(TributBaseFact(icms_reducao=33.33))
             self.reducao = 33.33
     elif codNCM in ('08043000', '10063021'):
         self.declare(TributBaseFact(icms_cst="40"))
         self.cst = "40"
     elif codNCM in ('22030000', '22011000'):
         self.declare(TributBaseFact(icms_cst="60"))
         self.cst = "60"
Ejemplo n.º 5
0
 def icms_aliquota_venda_distribuidor(self, codNCM):
     if codNCM in ('19059090'):
         self.declare(TributBaseFact(icms_aliquota=float(7)))
         self.aliquota = float(7)
     elif codNCM in ('21069029'):
         self.declare(TributBaseFact(icms_aliquota=float(8.4)))
         self.aliquota = float(8.4)
     elif codNCM in ('19053100'):
         self.declare(TributBaseFact(icms_aliquota=float(12)))
         self.aliquota = float(12)
     elif codNCM in ('17049020'):
         self.declare(TributBaseFact(icms_aliquota=float(18)))
         self.aliquota = float(18)
Ejemplo n.º 6
0
 def icms_cst_venda_consumidor(self, codNCM):
     if codNCM in ('17049020', '19053100', '19059090', '21069029'):
         self.declare(TributBaseFact(icms_cst="00"))
         self.cst = '00'
     elif codNCM in ('08043000', '10063021'):
         self.declare(TributBaseFact(icms_cst="40"))
         self.cst = "40"
         self.declare(TributBaseFact(icms_aliquota=float(0)))
         self.aliquota = float(0)
     elif codNCM in ('22030000', '22011000'):
         self.declare(TributBaseFact(icms_cst="60"))
         self.cst = "60"
         self.declare(TributBaseFact(icms_aliquota=float(0)))
         self.aliquota = float(0)
Ejemplo n.º 7
0
def run_engine():
    output_label.is_showing = False
    coin.start_animating()
    product = button_group.product
    engine = IcmsEngine(product)
    engine_cofins = CofinsEngine(product)

    tp_mvto = ""
    if button_group1.buttons[0].is_pressed:
        tp_mvto = 'compra'
    elif button_group1.buttons[1].is_pressed:
        tp_mvto = 'venda'
    elif button_group1.buttons[2].is_pressed:
        tp_mvto = 'bonificacao'
    elif button_group1.buttons[3].is_pressed:
        tp_mvto = 'perdas'

    car_trib = ""

    if button_group2.buttons[0].is_pressed:
        car_trib = 'consumidor'
    elif button_group2.buttons[1].is_pressed:
        car_trib = 'distribuidor'
    elif button_group2.buttons[2].is_pressed:
        car_trib = 'industria'
    elif button_group2.buttons[3].is_pressed:
        car_trib = 'simples'

    engine.reset()

    engine.declare(TributBaseFact(tp_mvto=tp_mvto))
    engine.declare(TributBaseFact(car_trib=car_trib))
    engine.declare(TributBaseFact(codNCM=product.ncm_code))
    engine.declare(TributBaseFact(codbarras=product.cod_barras))

    engine_cofins.reset()
    engine_cofins.declare(TributBaseFact(tp_mvto=tp_mvto))
    engine_cofins.declare(TributBaseFact(car_trib=car_trib))
    engine_cofins.declare(TributBaseFact(codNCM=product.ncm_code))
    engine_cofins.declare(TributBaseFact(codbarras=product.cod_barras))

    engine.run()
    engine_cofins.run()

    global facts, cst, aliquota, facts_cofins, aliquota_cofins, cst_cofins, aliquota_pis, nat_pis_cofins, icms_reducao
    facts = engine.facts
    facts_cofins = engine_cofins.facts

    cst = engine.cst
    aliquota = engine.aliquota
    icms_reducao = engine.reducao
    aliquota_cofins = engine_cofins.aliquota_cofins
    cst_cofins = engine_cofins.cofins_cst
    aliquota_pis = engine_cofins.aliquota_pis
    nat_pis_cofins = engine_cofins.cofins_natureza
    def cofins_venda_cst_t(self, codNCM):
        if codNCM in ('19053100', '19059090', '21069029', '17049020'):
            self.cofins_cst = '01'
        elif codNCM in ('22030000', '22011000'):
            self.cofins_cst = '04'
        elif codNCM in ('08043000', '10063021'):
            self.cofins_cst = '06'

        self.declare(TributBaseFact(cofins_cst=self.cofins_cst))
    def cofins_tributacao_06(self, codNCM):
        if codNCM in ('04012010', '04012110', '04014010'):
            self.cofins_natureza = '110'
        elif codNCM in ('08043000', '10063021'):
            self.cofins_natureza = '116'
        elif codNCM in ('02012010', '02012020', '02012090'):
            self.cofins_natureza = '121'
        elif codNCM in ('03038943', '03038955', '03038963', '03038990'):
            self.cofins_natureza = '122'

        self.declare(TributBaseFact(cofins_natureza=self.cofins_natureza))
Ejemplo n.º 10
0
    def cofins_compra_cst_t(self, codNCM):
        if codNCM in ('19053100', '19059090', '21069029', '17049020'):
            self.cofins_cst = '50'  #Operação com direito a crédito
        elif codNCM in ('22030000', '08119000', '22021000', '22011000'):
            self.cofins_cst = '70'  #Operação de aquisição sem direito a crédito
        #elif ncm in ('5'):
        #    self.cofins_cst='72'  #Operação de aquisição com isenção
        elif codNCM in ('08043000', '02012010', '02012090', '10063021'):
            self.cofins_cst = '73'  #Operação de aquisição com alíquota zero
        elif codNCM in ('24022000'):
            self.cofins_cst = '75'  #Operação de aquisição por substituição tributária

        self.declare(TributBaseFact(cofins_cst=self.cofins_cst))
Ejemplo n.º 11
0
    def cofins_tributacao_04(self, codNCM):
        if codNCM in ('22071090'):
            self.cofins_natureza = '112'
        elif codNCM in ('08119000', '22021000'):
            self.cofins_natureza = '202'
        elif codNCM in ('22011000', '22029000'):
            self.cofins_natureza = '420'
        elif codNCM in ('22030000'):
            self.cofins_natureza = '423'
        elif codNCM in ('22011000'):
            self.cofins_natureza = '424'

        self.declare(TributBaseFact(cofins_natureza=self.cofins_natureza))
Ejemplo n.º 12
0
    def icms_pauta(self, codbarras):
        valor = float(0)
        if codbarras == "7896045501502":
            valor = 3.06
        elif codbarras == '7896045501489':
            valor = 2.00
        elif codbarras == '7896639663609':
            valor = 2.65
        elif codbarras == '7896052600328':
            valor = 3.40
        elif codbarras == '7891149102013':
            valor = 2.65
        elif codbarras == '7891991008662':
            valor = 12.80
        elif codbarras == '7897395050191':
            valor = 3.14
        elif codbarras == '7891991000796':
            valor = 2.58
        elif codbarras == '7891991000796':
            valor = 2.62
        elif codbarras == '0000078909182':
            valor = 3.63
        elif codbarras == '7896045506095':
            valor = 1.78
        elif codbarras == '7896045506095':
            valor = 1.77
        elif codbarras == '0000078905290':
            valor = 8.53
        elif codbarras == '0000078905351':
            valor = 6.31
        elif codbarras == '7891149030309':
            valor = 4.09
        elif codbarras == '0000078905276':
            valor = 6.31
        elif codbarras == '0000078904644':
            valor = 5.32
        elif codbarras == '7891149200405':
            valor = 6.94
        elif codbarras == '7891149010400':
            valor = 7.10

        self.declare(TributBaseFact(icms_pauta=valor))
from icms_engine import IcmsEngine
from tribut_base_fact import TributBaseFact
from product import Product
from pyknow import *

#Carga dos dados informados pelo usuário
ncm_code = input("Informe o NCM do produto")
tp_mvto = input("Informe o tipo do movimento (venda / compra)") #venda / compra / bonificacao / perdas
car_trib = input("Informe o tipo de carga tributária (consumidor / industria / distribuidor / simples)")

product = Product('normal', 1)
product(ncm_code=ncm_code)
product(tp_mvto=tp_mvto)
product(car_trib=car_trib)
#Execução do sistema
engine = IcmsEngine(product)
engine.reset()

engine.declare(TributBaseFact(ncm_code=ncm_code))
engine.declare(TributBaseFact(tp_mvto=tp_mvto))
engine.declare(TributBaseFact(car_trib=car_trib))

engine.run()

print(engine.facts)
Ejemplo n.º 14
0
    def cofins_tributacao_05(self, codNCM):
        if codNCM in ('24022000'):
            self.cofins_natureza = '101'

        self.declare(TributBaseFact(cofins_natureza=self.cofins_natureza))
Ejemplo n.º 15
0
class CofinsEngine(KnowledgeEngine):
    cofins_aliq_basica = 0
    pis_aliq_basica = 0

    def __init__(self, product):
        KnowledgeEngine.__init__(self)
        self.product = product
        self.aliquota_cofins = 0
        self.cofins_cst = ""
        self.cofins_natureza = ""
        self.aliquota_pis = 0

    @DefFacts()
    def _initial_action(self):
        yield TributBaseFact(regime_empresa='Lucro Real')

    @Rule(TributBaseFact(regime_empresa='Lucro Real'), salience=10)
    def cofins_aliq_basica_lucro_real(self):
        self.cofins_aliq_basica = 7.6
        self.pis_aliq_basica = 1.65

    @Rule(NOT(TributBaseFact(regime_empresa='Lucro Real')), salience=10)
    def cofins_aliq_basica_lucro_presumido(self):
        self.cofins_aliq_basica = 3
        self.pis_aliq_basica = 0.65

    @Rule(OR(TributBaseFact(cofins_cst='01'), TributBaseFact(cofins_cst='50')),
          salience=8)
    def cofins_tributacao_01_50(self):
        self.aliquota_cofins = self.cofins_aliq_basica
        self.aliquota_pis = self.pis_aliq_basica

    @Rule(TributBaseFact(cofins_cst='04'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=8)
    def cofins_tributacao_04(self, codNCM):
        if codNCM in ('22071090'):
            self.cofins_natureza = '112'
        elif codNCM in ('08119000', '22021000'):
            self.cofins_natureza = '202'
        elif codNCM in ('22011000', '22029000'):
            self.cofins_natureza = '420'
        elif codNCM in ('22030000'):
            self.cofins_natureza = '423'
        elif codNCM in ('22011000'):
            self.cofins_natureza = '424'

        self.declare(TributBaseFact(cofins_natureza=self.cofins_natureza))

    @Rule(TributBaseFact(cofins_cst='05'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=8)
    def cofins_tributacao_05(self, codNCM):
        if codNCM in ('24022000'):
            self.cofins_natureza = '101'

        self.declare(TributBaseFact(cofins_natureza=self.cofins_natureza))

    @Rule(TributBaseFact(cofins_cst='06'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=8)
    def cofins_tributacao_06(self, codNCM):
        if codNCM in ('04012010', '04012110', '04014010'):
            self.cofins_natureza = '110'
        elif codNCM in ('08043000', '10063021'):
            self.cofins_natureza = '116'
        elif codNCM in ('02012010', '02012020', '02012090'):
            self.cofins_natureza = '121'
        elif codNCM in ('03038943', '03038955', '03038963', '03038990'):
            self.cofins_natureza = '122'

        self.declare(TributBaseFact(cofins_natureza=self.cofins_natureza))

    # COFINS - Vendas
    @Rule(TributBaseFact(tp_mvto='venda'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=9)
    def cofins_venda_cst_t(self, codNCM):
        if codNCM in ('19053100', '19059090', '21069029', '17049020'):
            self.cofins_cst = '01'
        elif codNCM in ('22030000', '22011000'):
            self.cofins_cst = '04'
        elif codNCM in ('08043000', '10063021'):
            self.cofins_cst = '06'

        self.declare(TributBaseFact(cofins_cst=self.cofins_cst))

    # COFINS - Compras
    @Rule(
        TributBaseFact(tp_mvto='compra'),
        #OR(TributBaseFact(car_trib='distribuidor'), TributBaseFact(car_trib='simples'), TributBaseFact(car_trib='industria')),
        TributBaseFact(codNCM=MATCH.codNCM),
        salience=9)
    def cofins_compra_cst_t(self, codNCM):
        if codNCM in ('19053100', '19059090', '21069029', '17049020'):
            self.cofins_cst = '50'  #Operação com direito a crédito
        elif codNCM in ('22030000', '08119000', '22021000', '22011000'):
            self.cofins_cst = '70'  #Operação de aquisição sem direito a crédito
        #elif ncm in ('5'):
        #    self.cofins_cst='72'  #Operação de aquisição com isenção
        elif codNCM in ('08043000', '02012010', '02012090', '10063021'):
            self.cofins_cst = '73'  #Operação de aquisição com alíquota zero
        elif codNCM in ('24022000'):
            self.cofins_cst = '75'  #Operação de aquisição por substituição tributária

        self.declare(TributBaseFact(cofins_cst=self.cofins_cst))

    # COFINS - Bonificação
    @Rule(TributBaseFact(tp_mvto='bonificacao'), salience=9)
    def cofins_bonificacao_cst(self):
        self.cofins_cst = '70'
        self.declare(TributBaseFact(cofins_cst=self.cofins_cst))

    # COFINS - Perdas
    @Rule(TributBaseFact(tp_mvto='perdas'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=9)
    def cofins_perdas_cst(self, codNCM):
        if codNCM in ('19053100', '19059090', '21069029', '17049020'):
            self.cofins_cst = '01'
        elif codNCM in ('22030000', '22011000'):
            self.cofins_cst = '04'
        elif codNCM in ('08043000', '10063021'):
            self.cofins_cst = '06'

        self.declare(TributBaseFact(cofins_cst=self.cofins_cst))
Ejemplo n.º 16
0
 def _initial_action(self):
     yield TributBaseFact(regime_empresa='Lucro Real')
Ejemplo n.º 17
0
 def cofins_bonificacao_cst(self):
     self.cofins_cst = '70'
     self.declare(TributBaseFact(cofins_cst=self.cofins_cst))
Ejemplo n.º 18
0
 def icms_origem(self, origem):
     if origem in ('1', '2', '3', '6', '7'):
         self.declare(TributBaseFact(icms_aliquota=float(4)))
         self.aliquota = float(4)
Ejemplo n.º 19
0
class IcmsEngine(KnowledgeEngine):
    def __init__(self, product):
        KnowledgeEngine.__init__(self)
        self.product = product
        self.aliquota = 0.0
        self.cst = ""
        self.reducao = 0.0

    @DefFacts()
    def _initial_action(self):
        yield TributBaseFact(regime_empresa="Lucro Real")

    # Definição de Pauta Fiscal - regra final, somente se a tributação for de ICMS-ST
    @Rule(TributBaseFact(codbarras=MATCH.codbarras), salience=5)
    def icms_pauta(self, codbarras):
        valor = float(0)
        if codbarras == "7896045501502":
            valor = 3.06
        elif codbarras == '7896045501489':
            valor = 2.00
        elif codbarras == '7896639663609':
            valor = 2.65
        elif codbarras == '7896052600328':
            valor = 3.40
        elif codbarras == '7891149102013':
            valor = 2.65
        elif codbarras == '7891991008662':
            valor = 12.80
        elif codbarras == '7897395050191':
            valor = 3.14
        elif codbarras == '7891991000796':
            valor = 2.58
        elif codbarras == '7891991000796':
            valor = 2.62
        elif codbarras == '0000078909182':
            valor = 3.63
        elif codbarras == '7896045506095':
            valor = 1.78
        elif codbarras == '7896045506095':
            valor = 1.77
        elif codbarras == '0000078905290':
            valor = 8.53
        elif codbarras == '0000078905351':
            valor = 6.31
        elif codbarras == '7891149030309':
            valor = 4.09
        elif codbarras == '0000078905276':
            valor = 6.31
        elif codbarras == '0000078904644':
            valor = 5.32
        elif codbarras == '7891149200405':
            valor = 6.94
        elif codbarras == '7891149010400':
            valor = 7.10

        self.declare(TributBaseFact(icms_pauta=valor))

    #Caso se trate de 1 - Mercadoria Estrangeira / 2 - Mercadoria Estrangeira Adquirida no Mercado Interno
    # 3 - Mercadoria nacional com conteúdo de importação superior a 40%
    # 6 - Mercadoria estrangeira com importação direta constante em lista de resolução CAMEX
    # 7 - Mercadoria estrangeira adquirida no mercado interno constante em lista de resolução CAMEX
    @Rule(TributBaseFact(origem=MATCH.origem),
          TributBaseFact(icms_cst='00'),
          salience=6)
    def icms_origem(self, origem):
        if origem in ('1', '2', '3', '6', '7'):
            self.declare(TributBaseFact(icms_aliquota=float(4)))
            self.aliquota = float(4)

    # ICMS - Vendas
    # Venda consumidor
    @Rule(TributBaseFact(tp_mvto='venda'),
          TributBaseFact(car_trib='consumidor'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=10)
    def icms_cst_venda_consumidor(self, codNCM):
        if codNCM in ('17049020', '19053100', '19059090', '21069029'):
            self.declare(TributBaseFact(icms_cst="00"))
            self.cst = '00'
        elif codNCM in ('08043000', '10063021'):
            self.declare(TributBaseFact(icms_cst="40"))
            self.cst = "40"
            self.declare(TributBaseFact(icms_aliquota=float(0)))
            self.aliquota = float(0)
        elif codNCM in ('22030000', '22011000'):
            self.declare(TributBaseFact(icms_cst="60"))
            self.cst = "60"
            self.declare(TributBaseFact(icms_aliquota=float(0)))
            self.aliquota = float(0)

    # Venda distribuidor
    @Rule(TributBaseFact(tp_mvto='venda'),
          OR(TributBaseFact(car_trib='distribuidor'),
             TributBaseFact(car_trib='simples'),
             TributBaseFact(car_trib='industria')),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=10)
    def icms_cst_venda_distribuidor(self, codNCM):
        if codNCM in ('17049020', '19053100', '19059090', '21069029'):
            self.declare(TributBaseFact(icms_cst="00"))
            self.cst = "00"
        elif codNCM in ('08043000', '10063021'):
            self.declare(TributBaseFact(icms_cst="40"))
            self.cst = "40"
            self.declare(TributBaseFact(icms_aliquota=float(0)))
            self.aliquota = float(0)
        elif codNCM in ('22030000', '22011000'):
            self.declare(TributBaseFact(icms_cst="60"))
            self.cst = "60"
            self.declare(TributBaseFact(icms_aliquota=float(0)))
            self.aliquota = float(0)

    #Venda CST 00
    @Rule(TributBaseFact(tp_mvto='venda'),
          TributBaseFact(car_trib='consumidor'),
          TributBaseFact(icms_cst="00"),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=9)
    def icms_aliquota_venda_consumidor(self, codNCM):
        if codNCM in ('19059090'):
            self.declare(TributBaseFact(icms_aliquota=float(7)))
            self.aliquota = float(7)
        elif codNCM in ('21069029'):
            self.declare(TributBaseFact(icms_aliquota=float(8.4)))
            self.aliquota = float(8.4)
        elif codNCM in ('19053100'):
            self.declare(TributBaseFact(icms_aliquota=float(12)))
            self.aliquota = float(12)
        elif codNCM in ('17049020'):
            self.declare(TributBaseFact(icms_aliquota=float(18)))
            self.aliquota = float(18)

    @Rule(TributBaseFact(tp_mvto='venda'),
          OR(TributBaseFact(car_trib='distribuidor'),
             TributBaseFact(car_trib='simples'),
             TributBaseFact(car_trib='industria')),
          TributBaseFact(icms_cst="00"),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=9)
    def icms_aliquota_venda_distribuidor(self, codNCM):
        if codNCM in ('19059090'):
            self.declare(TributBaseFact(icms_aliquota=float(7)))
            self.aliquota = float(7)
        elif codNCM in ('21069029'):
            self.declare(TributBaseFact(icms_aliquota=float(8.4)))
            self.aliquota = float(8.4)
        elif codNCM in ('19053100'):
            self.declare(TributBaseFact(icms_aliquota=float(12)))
            self.aliquota = float(12)
        elif codNCM in ('17049020'):
            self.declare(TributBaseFact(icms_aliquota=float(18)))
            self.aliquota = float(18)

    # ICMS - Compras
    @Rule(TributBaseFact(tp_mvto='compra'),
          TributBaseFact(car_trib='simples'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=10)
    def icms_compra_simples(self, codNCM):
        if codNCM in ('17049020', '19053100', '19059090', '21069029',
                      '08043000', '10063021'):
            self.declare(TributBaseFact(icms_cst="90"))
            self.cst = "90"
        elif codNCM in ('22030000', '22011000'):
            self.declare(TributBaseFact(icms_cst="10"))
            self.cst = "10"
            self.declare(TributBaseFact(icms_mva=140.0))
            self.declare(TributBaseFact(icms_st_aliquota=29.0))

    @Rule(TributBaseFact(tp_mvto='compra'),
          TributBaseFact(car_trib='distribuidor'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=10)
    def icms_compra_distribuidor(self, codNCM):
        if codNCM in ('08043000', '10063021'):
            self.declare(TributBaseFact(icms_cst="40"))
            self.cst = "40"
        elif codNCM in ('19053100', '19059090'):
            self.declare(TributBaseFact(icms_cst="00"))
            self.cst = "00"
            if codNCM in ('19053100'):
                self.declare(TributBaseFact(icms_aliquota=float(12)))
                self.aliquota = float(12)
            elif codNCM in ('19059090'):
                self.declare(TributBaseFact(icms_aliquota=float(7)))
                self.aliquota = float(7)
        elif codNCM in ('21069029', '17049020'):
            self.declare(TributBaseFact(icms_cst="20"))
            self.cst = "20"
            self.declare(TributBaseFact(icms_aliquota=float(18)))
            self.aliquota = float(18)
            self.declare(TributBaseFact(icms_reducao=33.33))
            self.reducao = 33.33
        elif codNCM in ('22030000', '22011000'):
            self.declare(TributBaseFact(icms_cst="60"))
            self.cst = "60"

    @Rule(TributBaseFact(tp_mvto='compra'),
          TributBaseFact(car_trib='industria'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=float(10))
    def icms_compra_industria(self, codNCM):
        if codNCM in ('08043000', '10063021'):
            self.declare(TributBaseFact(icms_cst="40"))
            self.cst = "40"
        elif codNCM in ('19053100', '19059090'):
            self.declare(TributBaseFact(icms_cst="00"))
            self.cst = "00"
            if codNCM in ('19053100'):
                self.declare(TributBaseFact(icms_aliquota=float(12)))
                self.aliquota = float(12)
            elif codNCM in ('19059090'):
                self.declare(TributBaseFact(icms_aliquota=float(7)))
                self.aliquota = float(7)
        elif codNCM in ('21069029', '17049020'):
            self.declare(TributBaseFact(icms_cst="20"))
            self.cst = "20"
            self.declare(TributBaseFact(icms_aliquota=float(18)))
            self.aliquota = float(18)
            self.declare(TributBaseFact(icms_reducao=33.33))
            self.reducao = 33.33
        elif codNCM in ('22030000', '22011000'):
            self.declare(TributBaseFact(icms_cst="10"))
            self.cst = "10"
            self.declare(TributBaseFact(icms_mva=140.0))
            self.declare(TributBaseFact(icms_st_aliquota=float(29.0)))

    # ICMS - Bonificação
    @Rule(TributBaseFact(tp_mvto='bonificacao'),
          TributBaseFact(car_trib='simples'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=10)
    def icms_bonif_simples(self, codNCM):
        if codNCM in ('17049020', '19053100', '19059090', '21069029',
                      '08043000', '10063021'):
            self.declare(TributBaseFact(icms_cst="90"))
            self.cst = "90"
        elif codNCM in ('22030000', '22011000'):
            self.declare(TributBaseFact(icms_cst="10"))
            self.cst = "10"
            self.declare(TributBaseFact(icms_mva=140.0))
            self.declare(TributBaseFact(icms_st_aliquota=float(29.0)))

    @Rule(TributBaseFact(tp_mvto='bonificacao'),
          TributBaseFact(car_trib='distribuidor'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=10)
    def icms_bonif_distribuidor(self, codNCM):
        if codNCM in ('08043000', '10063021'):
            self.declare(TributBaseFact(icms_cst="40"))
            self.cst = "40"
        elif codNCM in ('19053100', '19059090'):
            self.declare(TributBaseFact(icms_cst="00"))
            self.cst = "00"
            if codNCM in ('19053100'):
                self.declare(TributBaseFact(icms_aliquota=float(12)))
                self.aliquota = float(12)
            elif codNCM in ('19059090'):
                self.declare(TributBaseFact(icms_aliquota=float(7)))
                self.aliquota = float(7)
        elif codNCM in ('21069029', '17049020'):
            self.declare(TributBaseFact(icms_cst="20"))
            self.cst = "20"
            self.declare(TributBaseFact(icms_aliquota=float(18)))
            self.aliquota = float(18)
            self.declare(TributBaseFact(icms_reducao=33.33))
            self.reducao = 33.33
        elif codNCM in ('22030000', '22011000'):
            self.declare(TributBaseFact(icms_cst="60"))
            self.cst = "60"

    @Rule(TributBaseFact(tp_mvto='bonificacao'),
          TributBaseFact(car_trib='industria'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=10)
    def icms_bonif_industria(self, codNCM):
        if codNCM in ('08043000', '10063021'):
            self.declare(TributBaseFact(icms_cst="40"))
            self.cst = "40"
        elif codNCM in ('19053100', '19059090'):
            self.declare(TributBaseFact(icms_cst="00"))
            self.cst = "00"
            if codNCM in ('19053100'):
                self.declare(TributBaseFact(icms_aliquota=float(12)))
                self.aliquota = float(12)
            elif codNCM in ('19059090'):
                self.declare(TributBaseFact(icms_aliquota=float(7)))
                self.aliquota = float(7)
        elif codNCM in ('21069029', '17049020'):
            self.declare(TributBaseFact(icms_cst="20"))
            self.cst = "20"
            self.declare(TributBaseFact(icms_aliquota=float(18)))
            self.aliquota = float(18)
            self.declare(TributBaseFact(icms_reducao=33.33))
            self.reducao = 33.33
        elif codNCM in ('22030000', '22011000'):
            self.declare(TributBaseFact(icms_cst="10"))
            self.cst = "10"
            self.declare(TributBaseFact(icms_mva=float(140.0)))
            self.declare(TributBaseFact(icms_st_aliquota=float(29.0)))

    # ICMS - Perdas
    @Rule(TributBaseFact(tp_mvto='perdas'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=10)
    def icms_perdas(self, codNCM):
        if codNCM in ('19059090'):
            self.declare(TributBaseFact(icms_cst="00"))
            self.cst = "00"
            self.declare(TributBaseFact(icms_aliquota=float(7)))
            self.aliquota = float(7)
        elif codNCM in ('17049020', '19053100', '21069029'):
            self.declare(TributBaseFact(icms_cst="20"))
            self.cst = "20"
            if codNCM in ('19053100'):
                self.declare(TributBaseFact(icms_aliquota=float(12)))
                self.aliquota = float(12)
                self.declare(TributBaseFact(icms_reducao=41.6667))
                self.reducao = 41.6667
            elif codNCM in ('17049020', '21069029'):
                self.declare(TributBaseFact(icms_aliquota=float(18)))
                self.aliquota = float(18)
                self.declare(TributBaseFact(icms_reducao=33.33))
                self.reducao = 33.33
        elif codNCM in ('08043000', '10063021'):
            self.declare(TributBaseFact(icms_cst="40"))
            self.cst = "40"
        elif codNCM in ('22030000', '22011000'):
            self.declare(TributBaseFact(icms_cst="60"))
            self.cst = "60"

    # IPI - Compras
    @Rule(TributBaseFact(tp_mvto='compra'),
          TributBaseFact(car_trib='industria'),
          TributBaseFact(codNCM=MATCH.codNCM),
          salience=10)
    def ipi_compras(self, codNCM):
        if codNCM in ('22030000', '22011000'):
            self.declare(TributBaseFact(ipi_cst="00"))  #49 - Outras Entradas
            self.declare(TributBaseFact(ipi_aliquota=4.8))
        elif codNCM in ('22041010'):
            self.declare(TributBaseFact(ipi_cst="00"))
            self.cst = "00"
            self.declare(TributBaseFact(ipi_aliquota=10))