Sistema exemplo de Mini ERP/CRM com autenticação por sessão, cadastro de clientes, pedidos e criação de cobranças via Asaas. Usa MySQL para persistência e RabbitMQ para processamento assíncrono (publicação/consumo de eventos).
- Login e Sessão: autenticação simples baseada em sessão (PHP nativo).
- Mini CRM/ERP: gestão de clientes, pedidos e cobranças com dashboard.
- Integração Asaas: criação de clientes e cobranças (PIX, Boleto, Cartão) via API.
- Persistência MySQL: tabelas
users
,clients
,orders
,payments
. - RabbitMQ: publicação do evento
order.created
ao criar pedido e worker consumidor (em desenvolvimento) para orquestrar integrações/filas relacionadas ao gateway de pagamento. - Docker Compose: orquestra PHP+Apache, MySQL, RabbitMQ e um worker PHP.
- PHP 8.2 (Apache) • Docker/Docker Compose
- MySQL 8
- RabbitMQ 3 (com
management
UI) - Asaas API (sandbox/prod)
- Bibliotecas:
php-amqplib/php-amqplib
,monolog/monolog
Estrutura em camadas (sem framework), estilo MVC enxuto:
public/index.php
: roteamento básico por caminho/método HTTP e bootstrap de sessão/env.src/Controllers
: lógica de interface/fluxos (ex.:AuthController
,ClientController
,OrderController
,PaymentController
).src/Models
: acesso a dados via PDO (ex.:User
,Client
,Order
,Payment
).src/Services
: integrações externas (ex.:AsaasService
).src/Queue
: publicação de mensagens (RabbitMQPublisher
).bin/worker.php
: consumidor RabbitMQ (processa eventos).src/Config/Database.php
: criação de conexão PDO usando env.views/*
: templates PHP simples (login, dashboard, formulários).sql/init.sql
: schema e seed do usuário admin.
O roteador manual em public/index.php
expõe rotas como:
- Autenticação:
GET /login
,POST /login
,GET /logout
- Clientes:
GET /clients/create
,POST /clients/store
,GET /clients/edit
,POST /clients/update
,GET /clients/delete
- Pedidos:
GET /orders/create
,POST /orders/store
,GET /orders/edit
,POST /orders/update
,GET /orders/delete
- Pagamentos:
GET /payments/create
,POST /payments/store
,GET /payments/client
- Dashboard:
GET /
ouGET /dashboard
- Página
views/login.php
e controladorAuthController
. - Verificação por
User::findByEmail
epassword_verify
. - Sessões armazena
user_id
euser_name
. - Seed de usuário admin (em
sql/init.sql
):- Email:
[email protected]
- Senha:
admin123
- Email:
- Clientes (
Client
): CRUD básico; opção de criar cliente correspondente na Asaas ao cadastrar/editar. - Pedidos (
Order
): criação/edição/exclusão; ao criar, publica evento no RabbitMQ. - Cobranças (
Payment
+ Asaas): cria cobrança na Asaas e persiste informações locais (valor, vencimento, status, URLs). - Dashboard (
views/dashboard.php
): visão de clientes e pedidos; atalho para criar cobrança e listar cobranças do cliente.
O serviço App\Services\AsaasService
encapsula chamadas à API:
createCustomer
(POST/customers
)listCustomers
(GET/customers
)getCustomer
(GET/customers/{id}
)createPayment
(POST/payments
)
Uso na aplicação:
ClientController
: cria cliente na Asaas (opcional) durante cadastro/edição local (exigename
ecpfCnpj
).PaymentController
: garante existência docustomer
na Asaas e cria cobrança; salva na tabelapayments
dados retornados (ex.:invoiceUrl
,bankSlipUrl
,pixQrCode
).
Variáveis de ambiente relevantes (ver .env
/env.example
):
ASAAS_API_URL=https://api-sandbox.asaas.com/v3
ASAAS_ACCESS_TOKEN=seu_token_aqui
- Publicação via
App\Queue\RabbitMQPublisher
(AMQP topic):- Exchange:
orders
- Routing key:
orders.created
- Payload:
{ type: 'order.created', order_id, client_id, total_amount, meta, timestamp }
- Exchange:
- Consumo via
bin/worker.php
:- Declara
exchange=orders
,queue=orders.created.q
, bindingorders.created
. - Processa mensagens
order.created
(simula envio de e-mail, notificação e atualização de estoque) e dáack
.
- Declara
Status atual do RabbitMQ: implementação funcional de publicação/consumo para eventos de pedido. Em desenvolvimento está a orquestração de integrações voltadas ao gateway de pagamento (ex.: consumo de eventos de pagamento/assinaturas, atualização assíncrona de status de cobranças, processamento de webhooks da Asaas para filas internas e reconciliação no banco).
Conexão via App\Config\Database::pdo()
(PDO). Schema inicial em sql/init.sql
:
users (id, email, password_hash, name, created_at)
— seed admin.clients (id, name, email, phone, cpf_cnpj, asaas_customer_id, asaas_synced_at, created_at)
.orders (id, client_id, total_amount, status, created_at)
.payments (id, client_id, asaas_payment_id, billing_type, value, due_date, status, description, invoice_url, bank_slip_url, pix_qr_code, created_at)
.
Pré-requisitos: Docker Desktop.
-
Copie as variáveis de ambiente:
cp env.example .env
- Edite
.env
e informeASAAS_ACCESS_TOKEN
(sandbox ou produção).
- Edite
-
Suba os serviços:
- Windows:
start.bat
- Linux/macOS:
./start.sh
- Ou manualmente:
docker-compose up -d
- Windows:
-
Acesse:
- Aplicação:
http://localhost:8080
- RabbitMQ Management:
http://localhost:15672
(guest/guest) - MySQL:
localhost:3307
(DB:erp
, user:erp_user
, pass:erp_pass
)
- Aplicação:
-
Login inicial:
[email protected]
/admin123
-
Logs do worker (consumidor RabbitMQ):
docker logs -f worker
Veja env.example
para a lista completa. Principais chaves:
# App
APP_ENV=local
APP_DEBUG=1
# Database
DB_HOST=mysql
DB_PORT=3306
DB_NAME=erp
DB_USER=erp_user
DB_PASS=erp_pass
# RabbitMQ
RABBITMQ_HOST=rabbitmq
RABBITMQ_PORT=5672
RABBITMQ_USER=guest
RABBITMQ_PASS=guest
# Asaas
ASAAS_API_URL=https://api-sandbox.asaas.com/v3
ASAAS_ACCESS_TOKEN=token_conta_asaas
Método | Rota | Descrição |
---|---|---|
GET | /login | Formulário de login |
POST | /login | Autentica e cria sessão |
GET | /logout | Encerra a sessão |
GET | /dashboard | Dashboard (requer login) |
GET | /clients/create | Form novo cliente |
POST | /clients/store | Cria cliente (e opcionalmente na Asaas) |
GET | /clients/edit | Edita cliente |
POST | /clients/update | Atualiza cliente |
GET | /clients/delete | Exclui cliente |
GET | /orders/create | Form novo pedido |
POST | /orders/store | Cria pedido e publica evento RabbitMQ |
GET | /orders/edit | Edita pedido |
POST | /orders/update | Atualiza pedido |
GET | /orders/delete | Exclui pedido |
GET | /payments/create | Form nova cobrança |
POST | /payments/store | Cria cobrança na Asaas e persiste local |
GET | /payments/client | Lista cobranças de um cliente |
Há um exemplo em examples/create_customer.php
que carrega env e demonstra a criação de cliente pela AsaasController
. Você pode executá-lo dentro do container:
docker exec -it php_apache php examples/create_customer.php
- Webhooks da Asaas -> filas internas -> atualização de status em
payments
. - Filas dedicadas para retentativas, dead-letter e auditoria de eventos.
- Regras de permissão/roles na autenticação e melhoria de segurança.
- Validações e mensagens de erro mais ricas nos formulários.
Este repositório tem fins educacionais/demonstração para padrões de integração e orquestração com filas e um gateway de pagamento (Asaas).