Instanciando um Cliente SAT

Para ter acesso às funções SAT é preciso instanciar um cliente SAT, que pode ser um Cliente Local, no cenário em que o equipamento SAT está conectado ao mesmo computador em que está instalado o aplicativo comercial, ou um Cliente SATHub, quando o acesso ao equipamento SAT é compartilhado.

Cliente Local

Em um cliente local o acesso ao equipamento SAT é feito através da biblioteca SAT que é fornecida pelo fabricante do equipamento, distribuída normalmente como uma DLL (dinamic-link library, .dll) ou shared library (.so), de modo que é necessário indicar o caminho completo para a biblioteca.

from satcfe import BibliotecaSAT
from satcfe import ClienteSATLocal

cliente = ClienteSATLocal(BibliotecaSAT('/opt/fabricante/libsat.so'),
        codigo_ativacao='12345678')

resposta = cliente.consultar_sat()

Cliente SATHub

Em um cliente SATHub o acesso ao equipamento SAT é compartilhado e feito através de uma requisição HTTP para endereço onde o servidor SATHub responde. Em ambos os casos a chamada à função é exatamente a mesma, com exceção da instanciação do cliente:

from satcfe import ClienteSATHub

cliente = ClienteSATHub('192.168.0.101', 8088, numero_caixa=7)
resposta = cliente.consultar_sat()

Via de regra o código que acessa as funções da biblioteca SAT não deveria se importar se o cliente é um cliente local ou remoto, de modo que o aplicativo comercial precisa apenas implementar um factory que resulte no cliente SAT adequadamente configurado.

Numeração de Sessões

Um outro aspecto relevante é a questão da numeração de sessões, que conforme a ER SAT, item 6, alínea “d”, diz o seguinte:

O SAT deverá responder às requisições do AC de acordo com o número de sessão recebido. O aplicativo comercial deverá gerar um número de sessão aleatório de 6 dígitos que não se repita nas últimas 100 comunicações.

Para um cliente SAT local, é fornecida uma implementação básica de numeração de sessão que é encontrada na classe satcfe.base.NumeroSessaoMemoria, que é capaz de atender o requisito conforme descrito na ER SAT. Entretando, essa implementação básica não é capaz (ainda) de persistir os números gerados.

Se for necessário utilizar um esquema de numeração de sessão diferente, basta escrever um e passá-lo como argumento durante a criação do cliente local. Um numerador de sessão é apenas um callable que, quando invocado, resulta no próximo número de sessão a ser usado em uma função SAT. Por exemplo:

def meu_numerador():
    numero = ... # lógica diferente
    return numero

cliente = ClienteSATLocal(
        BibliotecaSAT('/opt/fabricante/libsat.so'),
        codigo_ativacao='12345678'
        numerador_sessao=meu_numerador)

Para os clientes SATHub há um esquema de numeração de sessão mais robusto, já que as requisições tem origem em caixas (pontos-de-venda) diferentes, o requisito é resolvido de maneira a evitar colisões de numeração ou repetição de numeração mesmo atendendo requisições concorrentes. Consulte a documentação do projeto SATHub para os detalhes.