Skip to main content

Biblioteca para acesso ao Webservices de NFSe da Prefeitura Municipal de Sao Jose - SC

Project description

Biblioteca para auxiliar a assinar, gerar e consultar NFSe da Prefeitura Municipal de São José. Padrão ABRASF da Betha Software.

Instalação

A biblioteca está disponível no PyPi:

user@host:~$ pip install nfsepmsj

Desenvolvimento

Clonar o repositório:

user@host:~$ git clone https://github.com/qualitaocupacional/nfsepmsj.git

Instalar a lib em modo desenvolvimento:

(virtualenv) user@host:~/nfsepmsj$ pip install -e ".[testing]"

Usando

from nfsepmsj.client import NFSeAbrasf

pfx_file = '/caminho/do/arquivo.pfx'
pfx_passwd = 'Senha do arquivo pfx'

nfse = NFSeAbrasf(pfx_file, pfx_passwd)
nf_data = {
    'rps.lote.id': 'loteid',
    'nf.data.emissao': 'AAAA-MM-DD',
    'nf.total_nota': '100.30'
    # demais campos...
}
nfse.add_rps(data)
result, errors = nfse.send()

result vai ser uma lista de dicionários com a estrutura:

[
    {
        'rps.lote.id': 'loteid',
        'xml.response': 'XML com a resposta do webservices',
        'xml.request': 'o XML que foi gerado para envio',
    }
]

E errors, se houver algum, como, por exemplo, erro de validação do XML, vai ser:

[
    {
        'rps.lote.id': 'loteid',
        'xml.request': 'o XML que foi gerado para envio',
        'error': 'a mensagem do erro'
    }
]

Para utilizar o ambiente de Testes ao invés do de Produção:

from nfsepmsj.client import NFSeAbrasf

nfse = NFSeAbrasf(pfx_file, pfx_passwd, 'test')
# ...

Estrutura do dicionário com os campos da nota fiscal:

Nome

Descrição

‘rps.lote.id’

Identificação única do lote

‘rps.numero’

‘rps.serie’

‘rps.tipo’

‘rps.data.emissao’

‘rps.status’

1-Normal, 2-Cancelado

‘rps.substituido.numero’

‘rps.substituido.serie’

‘rps.substituido.tipo’

‘nf.data.emissao’

‘nf.total_servicos’

‘nf.valor_deducoes’

‘nf.valor_pis’

‘nf.valor_cofins’

‘nf.valor_inss’

‘nf.valor_IR’

‘nf.valor_csll’

‘nf.valor_outros’

‘nf.valor_iss’

‘nf.aliquota’

‘nf.desconto_incondicionado’

‘nf.desconto_condicionado’

‘nf.iss_retido’

‘nf.responsavel_retencao’

‘nf.codigo_servico’

‘nf.codigo_cnae’

‘nf.codigo_tributacao_municipio’

‘nf.discriminacao’

‘nf.codigo_municipio’

‘nf.codigo_pais’

‘nf.exigibilidade_iss’

‘nf.codigo_municipio_incidencia’

‘nf.numero_processo’

‘nf.prestador.documento’

‘nf.prestador.inscricao_municipal’

‘nf.tomador.documento’

‘nf.tomador.inscricao_municipal’

‘nf.tomador.razao_social’

‘nf.tomador.logradouro’

‘nf.tomador.numero_logradouro’

‘nf.tomador.complemento’

‘nf.tomador.bairro’

‘nf.tomador.codigo_municipio’

‘nf.tomador.uf’

‘nf.tomador.codigo_pais’

‘nf.tomador.cep’

‘nf.tomador.contato.telefone’

‘nf.tomador.contato.email’

‘nf.regime_especial_tributacao’

‘nf.optante_simples’

‘nf.incentivo_fiscal’

‘nf.intermediario.razao_social

‘nf.intermediario.documento

‘nf.intermediario.inscricao_municipal

‘nf.construcao_civil.codigo_obra

‘nf.construcao_civil.art

Campos adicionais para Cancelamento de NFSe:

Nome

Descrição

‘nf.cancela.id’

Identificação única do cancelamento

‘nf.numero’

Número da NFSe gerada

‘nf.codigo_cancelamento’

Código do cancelamento

O Código do Cancelamento é obrigatório, apesar que na documentação da versão 2.02 informar que esse código é opcional. Sem esse código o webservices retorna “Erro desconhecido”.

Os valores possíveis são:

  • 1 - Erro na emissão

  • 2 - Serviço não prestado

  • 3 - Erro de assinatura

  • 4 - Duplicidade da nota

  • 5 - Erro de processamento

Sendo que os códigos 3 e 5 são de uso restrito da Administração Tributária Municipal.

Cancelando uma NFSe

from nfsepmsj.client import NFSeAbrasf

pfx_file = '/caminho/do/arquivo.pfx'
pfx_passwd = 'Senha do arquivo pfx'

nfse = NFSeAbrasf(pfx_file, pfx_passwd)
cancel_data = {
    'nf.cancela.id': 'cancel_id1',
    'nf.codigo_cancelamento': '1',
    'nf.numero': '1',
    'nf.prestador.documento': '99999999999999',
    'nf.prestador.inscricao_municipal': '9999999',
    'nf.codigo_municipio': '4216602',
}
nfse.add_to_cancel(cancel_data)
result, errors = nfse.cancel()

result vai ser uma lista de dicionários com a estrutura:

[
    {
        'nf.cancela.id': 'cancel_id1',
        'xml.response': 'XML com a resposta do webservices',
        'xml.request': 'o XML que foi gerado para envio',
    }
]

E errors, se houver algum, como, por exemplo, erro de validação do XML, vai ser:

[
    {
        'nf.cancela.id': 'cancel_id1',
        'xml.request': 'o XML que foi gerado para envio',
        'error': 'a mensagem do erro'
    }
]

Campos adicionais para Envio em Lote de NFSe:

Nome

Descrição

‘lote.id’

Identificação única do lote

‘lote.numero’

Número do lote

‘nf.prestador.documento’

CPF/CNPJ do prestador

‘nf.prestador.inscricao_municipal’

Inscrição municipal do prestador

Lembrando que nesta modalidade os dados de RPS devem conter os campos:

  • ‘rps.numero’

  • ‘rps.serie’

  • ‘rps.tipo’

  • ‘rps.data.emissao’

  • ‘rps.status’

Enviando um lote (sincrono)

from nfsepmsj.client import NFSeAbrasf

pfx_file = '/caminho/do/arquivo.pfx'
pfx_passwd = 'Senha do arquivo pfx'

nfse = NFSeAbrasf(pfx_file, pfx_passwd)
# ...

nfse.add_rps(rps01_data)
nfse.add_rps(rps02_data)
# ...
batch_data = {
    'lote.id': 'lote_id',
    'lote.numero': '201901',
    'nf.prestador.documento': '99999999999999',
    'nf.prestador.inscricao_municipal': '9999999',
}
result, errors = nfse.send_batch(batch_data)

result vai ser um dicionário com a estrutura:

{
    'lote.id': 'lote_id',
    'xml.response': 'XML com a resposta do webservices',
    'xml.request': 'o XML que foi gerado para envio',
}

E errors, se houver algum, como, por exemplo, erro de validação do XML, vai ser:

{
    'lote.id': 'lote_id',
    'xml.request': 'o XML que foi gerado para envio',
    'error': 'a mensagem do erro'
}

Consultando o Status de um Lote

Campos adicionais para Consulta de Lote de NFSe:

Nome

Descrição

‘lote.protocolo’

Número do protocolo recebido (geralmente ao enviar lotes assíncronos)

from nfsepmsj.client import NFSeAbrasf

pfx_file = '/caminho/do/arquivo.pfx'
pfx_passwd = 'Senha do arquivo pfx'

nfse = NFSeAbrasf(pfx_file, pfx_passwd)
params = {
    'lote.protocolo': '12346',
    'nf.prestador.documento': '99999999999999',
    'nf.prestador.inscricao_municipal': '9999999',
}
result, error = nfse.get_batch_status(params)

result vai ser um dicionário com a estrutura:

{
    'xml.response': 'XML com a resposta do webservices',
    'xml.request': 'o XML que foi gerado para envio',
}

E error, se houver algum, como, por exemplo, erro de validação do XML, vai ser:

{
    'xml.request': 'o XML que foi gerado para envio',
    'error': 'a mensagem do erro'
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nfsepmsj-0.0.4.tar.gz (34.1 kB view details)

Uploaded Source

Built Distribution

nfsepmsj-0.0.4-py2.py3-none-any.whl (34.4 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file nfsepmsj-0.0.4.tar.gz.

File metadata

  • Download URL: nfsepmsj-0.0.4.tar.gz
  • Upload date:
  • Size: 34.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.5.0 requests-toolbelt/0.8.0 tqdm/4.36.1 CPython/2.7.15+

File hashes

Hashes for nfsepmsj-0.0.4.tar.gz
Algorithm Hash digest
SHA256 58ee6fb2b620c3c4f6b751024829caa989c61c35d798ab7ec8036d12f7491868
MD5 dad6ee15ae573d3e23d9a2084ee58bff
BLAKE2b-256 6080ea171620640e598125e52bbcbd807f168029040705a98ccf795c5dc6a71a

See more details on using hashes here.

File details

Details for the file nfsepmsj-0.0.4-py2.py3-none-any.whl.

File metadata

  • Download URL: nfsepmsj-0.0.4-py2.py3-none-any.whl
  • Upload date:
  • Size: 34.4 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.5.0 requests-toolbelt/0.8.0 tqdm/4.36.1 CPython/2.7.15+

File hashes

Hashes for nfsepmsj-0.0.4-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 4a43ba32b55b1861277451595fc790e4bb8d55f4495c30427b9cbeb076e445f3
MD5 b119ecd249a7dc638797cabad098b760
BLAKE2b-256 c394083d476da2bad3d640bcd3eb1d4c12edd68ecac2ad15275b5113ee5aa184

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page