innovar_amr_tray_controller/README.md

75 lines
4 KiB
Markdown

# Innovar AMR Tray Controller
Microserviço responsável por atuar como controlador de integrações entre a plataforma de e-commerce Tray, o emissor de NFe Plugnotas e o ERP Sienge.
## Visão Geral
Este projeto consome mensagens de uma fila RabbitMQ (originadas de webhooks) e orquestra a comunicação entre diferentes sistemas para automatizar o fluxo de vendas:
1. **Tray (E-commerce):**
- Recebe webhooks de criação (`insert`) e atualização (`update`) de pedidos.
- Busca dados completos do pedido na API da Tray.
- Atualiza dados fiscais (NFe) no pedido dentro da Tray após faturamento.
2. **Plugnotas (Notas Fiscais):**
- Envia dados do pedido para emissão de Nota Fiscal Eletrônica.
- Recebe webhooks informando a conclusão da emissão da NFe, extraindo a chave de acesso, o número e os produtos a partir do XML retornado (base64).
3. **Sienge (ERP - Integração via Filas/RPC):**
- **Clientes:** Envia requisições (RPC) para criação de clientes no Sienge quando um novo pedido é gerado.
- **Títulos a Receber:** Envia requisições (RPC) para geração de títulos financeiros no Sienge após a emissão da NFe.
## Fluxo de Processamento
### 1. Webhook Tray (`Recebimento`)
- **Ação `insert`:** O controlador identifica o novo pedido, cria/sincroniza o cliente no ERP Sienge e atualiza o ID do cliente no banco de dados local.
- **Ação `update`:** Caso o pedido passe para o status "A ENVIAR", o serviço envia os dados mapeados para a fila de emissão de NFe, sinalizando no banco local que o envio ocorreu.
### 2. Webhook Plugnotas (`RecebimentoPlugnotas`)
- Ao receber a confirmação de que a NFe foi gerada com status "CONCLUIDO":
- Decodifica e extrai as informações pertinentes da nota a partir do XML da NFe.
- Envia a ordem para criar o título a receber no ERP (Sienge).
- Atualiza a nota fiscal (chave, link, xml) diretamente no painel da Tray.
- Grava o status atualizado no banco de dados local.
## Tecnologias e Bibliotecas
- **Python 3**
- **Bibliotecas Principais:** Pydantic (validação de dados), SQLAlchemy/Psycopg2 (banco de dados), Redis, Requests, Pika (RabbitMQ).
- **Mensageria:** RabbitMQ para filas assíncronas e RPC, facilitado pelas bibliotecas base da equipe (`Exchange2`).
- **Banco de Dados:** PostgreSQL (Persistência de estado dos pedidos, status de integrações e logs).
- **Cache / Configuração:** Redis (Armazenamento e busca das credenciais e configurações de ambiente em tempo real).
- **Infraestrutura:** Docker & Docker Compose.
## Como Executar
### Pré-requisitos
- Docker e Docker Compose instalados no ambiente de execução.
- Acesso aos repositórios Git base (`Exchange2` e `SoftGOModel`) pois o script de build fará o clone de dependências proprietárias.
- Instâncias do Redis, RabbitMQ e PostgreSQL acessíveis na rede (`sg_base_network`).
### Passos para Build e Deploy
1. Clone o repositório e navegue até a pasta raiz.
2. Execute o script de build para baixar as dependências e criar a imagem Docker:
```bash
chmod +x buildImages.sh
./buildImages.sh
```
3. Inicie o container com o Docker Compose:
```bash
docker-compose up -d
```
## Variáveis de Ambiente e Configurações
O container do `controller` possui poucas configurações no `docker-compose.yml`, pois o sistema busca suas credenciais principais (banco, AMQP, endpoints, chaves de API da Tray, etc.) diretamente de uma chave JSON no **Redis** (`innovar_amr_tray-system_config-innovar`).
Certifique-se de que essa chave JSON esteja corretamente populada no Redis para que o microserviço consiga inicializar.
## Estrutura de Diretórios
- `src/controller.py`: Ponto de entrada do serviço e consumidor principal da fila RabbitMQ.
- `src/services/`: Regras de negócio, transformações e mapeamentos (Tray para Sienge, Tray para NFe).
- `src/models/`: Definições Pydantic para validação das estruturas de dados.
- `src/api/`: Comunicação HTTP direta com APIs externas.
- `src/db/`: Instância e métodos de comunicação com o PostgreSQL local.