# 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.