Brunomm/br_nfe

View on GitHub
lib/br_nfe/product/nfe/item_tax/pis.rb

Summary

Maintainability
C
1 day
Test Coverage
module BrNfe
    module Product
        module Nfe
            module ItemTax
                class Pis < BrNfe::ActiveModelBase
                    # CÓDIGO DA SITUAÇÃO TRIBUTÁRIA do PIS
                    #  01 = Operação Tributável (base de cálculo = valor da operação alíquota normal (cumulativo/não cumulativo));
                    #  02 = Operação Tributável (base de cálculo = valor da operação (alíquota diferenciada));
                    #  03 = Operação Tributável: (base de cálculo = quantidade vendida x alíquota por unidade de produto);
                    #  04 = Operação Tributável (tributação monofásica (alíquota zero));
                    #  05 = Operação Tributável (Substituição Tributária);
                    #  06 = Operação Tributável (alíquota zero);
                    #  07 = Operação Isenta da Contribuição;
                    #  08 = Operação Sem Incidência da Contribuição;
                    #  09 = Operação com Suspensão da Contribuição;
                    #  49 = Outras Operações de Saída;
                    #  50 = Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Tributada no Mercado Interno;
                    #  51 = Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Não Tributada no Mercado Interno;
                    #  52 = Operação com Direito a Crédito – Vinculada Exclusivamente a Receita de Exportação;
                    #  53 = Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno;
                    #  54 = Operação com Direito a Crédito - Vinculada a Receitas Tributadas no Mercado Interno e de Exportação;
                    #  55 = Operação com Direito a Crédito - Vinculada a Receitas Não Tributadas no Mercado Interno e de Exportação;
                    #  56 = Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação;
                    #  60 = Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Tributada no Mercado Interno;
                    #  61 = Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno;
                    #  62 = Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita de Exportação;
                    #  63 = Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno;
                    #  64 = Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas no Mercado Interno e de Exportação;
                    #  65 = Crédito Presumido - Operação de Aquisição Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação;
                    #  66 = Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação;
                    #  67 = Crédito Presumido - Outras Operações;
                    #  70 = Operação de Aquisição sem Direito a Crédito;
                    #  71 = Operação de Aquisição com Isenção;
                    #  72 = Operação de Aquisição com Suspensão;
                    #  73 = Operação de Aquisição a Alíquota Zero;
                    #  74 = Operação de Aquisição; sem Incidência da Contribuição;
                    #  75 = Operação de Aquisição por Substituição Tributária;
                    #  98 = Outras Operações de Entrada;
                    #  99 = Outras Operações;
                    # 
                    # <b>Type:     </b> _Number_ <- string
                    # <b>Required: </b> _Yes_
                    # <b>Example:  </b> _00_
                    # <b>Length:   </b> _2_
                    # <b>tag:      </b> CST
                    # 
                    attr_accessor :codigo_cst
                    def codigo_cst
                        "#{@codigo_cst}".rjust(2, '0') if @codigo_cst.present?
                    end
                    alias_attribute :CST, :codigo_cst

                    # VALOR DA BASE DE CÁLCULO DO PIS
                    # 
                    # <b>Type:     </b> _Float_
                    # <b>Required: </b> _No_ (Yes if cst in [01 02])
                    # <b>Example:  </b> _350.47_
                    # <b>tag:      </b> vBC
                    # 
                    attr_accessor :total_base_calculo
                    alias_attribute :vBC, :total_base_calculo

                    # ALÍQUOTA DO PIS (EM PERCENTUAL)
                    # 
                    # <b>Type:     </b> _Float_
                    # <b>Required: </b> _No_ (Yes if cst in [01 02])
                    # <b>Example:  </b> _350.47_
                    # <b>tag:      </b> pPIS
                    # 
                    attr_accessor :aliquota
                    alias_attribute :pPIS, :aliquota

                    # VALOR DO PIS
                    # 
                    # <b>Type:     </b> _Float_
                    # <b>Required: </b> _Yes_ (No if cst in [04 05 06 07 08 09])
                    # <b>Example:  </b> _350.47_
                    # <b>tag:      </b> vPIS
                    # 
                    attr_accessor :total
                    alias_attribute :vPIS, :total

                    # QUANTIDADE VENDIDA
                    # 
                    # <b>Type:     </b> _Float_
                    # <b>Required: </b> _No_ (Yes if cst is 03)
                    # <b>Example:  </b> _10.0_
                    # <b>Length:   </b> _12v0-4_
                    # <b>tag:      </b> qBCProd
                    # 
                    attr_accessor :quantidade_vendida
                    alias_attribute :qBCProd, :quantidade_vendida

                    # ALÍQUOTA DO PIS (EM REAIS)
                    # 
                    # <b>Type:     </b> _Float_
                    # <b>Required: </b> _No_ (Yes if cst is 03)
                    # <b>Example:  </b> _10.0_
                    # <b>Length:   </b> _11v0-4_
                    # <b>tag:      </b> vAliqProd
                    # 
                    attr_accessor :total_aliquota
                    alias_attribute :vAliqProd, :total_aliquota

                    def default_values
                        {
                            codigo_cst: '07'
                        }
                    end
                    
                    validates :codigo_cst, presence: true
                    validates :codigo_cst, inclusion: {in: %w[01 02 03 04 05 06 07 08 09 49 50 51 52 53 54 55 56 60 61 62 63 64 65 66 67 70 71 72 73 74 75 98 99]}

                    with_options if: lambda{ |r| r.codigo_cst.in?(%w[01 02]) } do |record|
                        record.validates :total_base_calculo, presence: true
                        record.validates :total_base_calculo, numericality: {greater_than_or_equal_to: 0.0}, allow_blank: true
                        record.validates :aliquota,           presence: true
                        record.validates :aliquota,           numericality: {greater_than_or_equal_to: 0.0}, allow_blank: true
                        record.validates :total,              presence: true
                        record.validates :total,              numericality: {greater_than_or_equal_to: 0.0}, allow_blank: true
                    end
                    with_options if: lambda{ |r| r.codigo_cst == '03' } do |record|
                        record.validates :quantidade_vendida, presence: true
                        record.validates :quantidade_vendida, numericality: {greater_than_or_equal_to: 0.0}, allow_blank: true
                        record.validates :total_aliquota,     presence: true
                        record.validates :total_aliquota,     numericality: {greater_than_or_equal_to: 0.0}, allow_blank: true
                        record.validates :total,              presence: true
                        record.validates :total,              numericality: {greater_than_or_equal_to: 0.0}, allow_blank: true
                    end
                    with_options if: lambda{ |r| r.codigo_cst.in?(%w[49 50 51 52 53 54 55 56 60 61 62 63 64 65 66 67 70 71 72 73 74 75 98 99]) } do |record|
                        record.validates :total,              presence: true
                        record.validates :total,              numericality: {greater_than_or_equal_to: 0.0}, allow_blank: true
                    end
                end
            end
        end
    end
end