# SIGED - Conversão para Laravel Multi-tenant

## Visão Geral

Este é um projeto de conversão completa do SIGED (Sistema de Gestão Empresarial) de PHP puro para Laravel 11 com arquitetura multi-tenant usando o pacote Stancl Tenancy.

### Principais Características

- **Multi-tenant**: Suporte a múltiplos clientes (instituições) em um único servidor
- **Escalável**: Preparado para crescimento em hospedagem compartilhada (cPanel)
- **Seguro**: Implementação de permissões com Spatie Laravel Permission
- **Robusto**: Sistema completo de automação e orquestração de fluxos
- **Integrável**: APIs RESTful com Sanctum, WhatsApp, Google Maps, IA, reconhecimento facial
- **Instalador Web**: Interface gráfica via navegador para configuração inicial

## Estrutura de Diretórios

```
├── app/
│   ├── Http/
│   │   ├── Controllers/
│   │   │   ├── Installer/          # Instalador web
│   │   │   ├── Admin/              # Controllers administrativos
│   │   │   ├── Academic/           # Controllers acadêmicos
│   │   │   ├── Discipline/         # Controllers disciplinares
│   │   │   ├── Api/                # API endpoints
│   │   │   └── ...
│   │   ├── Middleware/             # Middlewares customizados
│   │   └── Requests/               # Form requests
│   ├── Models/                     # Modelos Eloquent
│   │   ├── Aluno.php
│   │   ├── Turma.php
│   │   ├── Disciplina.php
│   │   ├── Nota.php
│   │   ├── Falta.php
│   │   ├── OcorrenciaDisciplinar.php
│   │   ├── ChamadaBiometrica.php
│   │   ├── Usuario.php
│   │   ├── Tenant.php
│   │   └── ...
│   ├── Services/                   # Serviços de negócio
│   │   ├── AcademicService.php
│   │   ├── DisciplinaryService.php
│   │   ├── BiometricService.php
│   │   ├── WhatsAppService.php
│   │   └── ...
│   ├── Traits/                     # Traits reutilizáveis
│   ├── Helpers/                    # Helper functions
│   └── Events/                     # Eventos do sistema
├── database/
│   ├── migrations/                 # Migrações do banco
│   ├── seeders/                    # Seeders de dados
│   └── factories/                  # Factories para testes
├── resources/
│   ├── views/
│   │   ├── installer/              # Views do instalador
│   │   ├── dashboard/              # Views do dashboard
│   │   ├── academic/               # Views acadêmicas
│   │   ├── discipline/             # Views disciplinares
│   │   ├── layouts/                # Layouts base
│   │   └── ...
│   ├── js/                         # Assets JavaScript
│   └── css/                        # Assets CSS
├── routes/
│   ├── web.php                     # Rotas web
│   ├── api.php                     # Rotas API
│   ├── installer.php               # Rotas do instalador
│   └── tenant.php                  # Rotas do tenant
├── config/
│   ├── app.php
│   ├── database.php
│   ├── tenancy.php                 # Configuração multi-tenant
│   ├── permission.php              # Configuração de permissões
│   └── ...
├── tests/                          # Testes automatizados
├── .env.example                    # Exemplo de variáveis de ambiente
├── composer.json                   # Dependências PHP
└── README.md                       # Este arquivo
```

## Instalação

### Pré-requisitos

- PHP 8.1+
- MySQL 5.7+ (ou MariaDB 10.5+)
- Composer
- Node.js (para assets)

### Passo 1: Clonar o Repositório

```bash
git clone https://github.com/seu-usuario/siged-laravel-multitenant.git
cd siged-laravel-multitenant
```

### Passo 2: Instalar Dependências

```bash
composer install
npm install
```

### Passo 3: Configurar Ambiente

```bash
cp .env.example .env
php artisan key:generate
```

### Passo 4: Acessar Instalador Web

1. Coloque os arquivos em seu servidor web
2. Acesse `http://seu-dominio.com/installer`
3. Siga os passos:
   - Verificação de requisitos
   - Configuração do banco de dados
   - Configuração do sistema
   - Configuração do tenant
   - Revisar e confirmar

## Funcionalidades Principais

### 1. Gestão Acadêmica
- ✅ Gestão de alunos
- ✅ Gestão de turmas
- ✅ Gestão de disciplinas
- ✅ Lançamento de notas
- ✅ Controle de frequência (chamada biométrica)
- ✅ Gestão de faltas

### 2. Disciplina Escolar
- ✅ Registro de ocorrências disciplinares
- ✅ Sistema de punições (repreensão, suspensão, expulsão)
- ✅ Agravantes e atenuantes
- ✅ Assinatura digital de punições
- ✅ Histórico disciplinar do aluno

### 3. Chamada Biométrica
- ✅ Integração com leitores biométricos
- ✅ Reconhecimento facial (opcional)
- ✅ Registro de entrada/saída
- ✅ Análise de presença em tempo real
- ✅ Relatórios de frequência

### 4. Portal do Aluno
- ✅ Visualização de notas
- ✅ Visualização de faltas
- ✅ Histórico de ocorrências
- ✅ Confirmação de honrarias

### 5. Comunicação
- ✅ Integração WhatsApp
- ✅ Envio de mensagens de notificação
- ✅ Chat interno
- ✅ Sistema de avisos

### 6. Integrações
- ✅ Google Maps (geolocalização)
- ✅ IA (análise de dados)
- ✅ AWS S3 (armazenamento)
- ✅ Reconhecimento facial
- ✅ APIs externas

### 7. Relatórios
- ✅ Relatórios de desempenho acadêmico
- ✅ Relatórios disciplinares
- ✅ Relatórios de frequência
- ✅ Exportação em PDF/Excel

## Arquitetura Multi-tenant

### Banco de Dados

```
Banco Landlord (Central):
├── tenants          # Tabela de tenants
├── usuarios         # Usuários de administração
└── roles            # Papéis e permissões globais

Banco por Tenant:
├── alunos
├── turmas
├── disciplinas
├── notas
├── faltas
├── ocorrencias_disciplinares
├── chamadas_biometricas
├── usuarios         # Usuários específicos do tenant
└── ...
```

### Domínios

```
- siged.example.com           # Portail de administração
- instituicao1.siged.example.com
- instituicao2.siged.example.com
- instituicaon.siged.example.com
```

## Segurança

### Implementado

- ✅ Autenticação Sanctum para APIs
- ✅ Hash de senhas com bcrypt
- ✅ CSRF Protection
- ✅ SQL Injection Prevention (Eloquent ORM)
- ✅ XSS Protection (Blade escaping)
- ✅ HTTPS obrigatório
- ✅ Headers de segurança

### Permissões

Sistema baseado em Spatie Laravel Permission:

```
Papéis:
- admin              # Acesso total
- diretor           # Gestão acadêmica e disciplinar
- coordinador       # Gestão de turmas
- professor         # Lançamento de notas e faltas
- aluno             # Visualização de dados pessoais
- responsavel       # Visualização de dados do aluno
```

## APIs RESTful

### Autenticação

```bash
POST /api/auth/login
POST /api/auth/logout
POST /api/auth/refresh
```

### Alunos

```bash
GET    /api/alunos
GET    /api/alunos/{id}
POST   /api/alunos
PUT    /api/alunos/{id}
DELETE /api/alunos/{id}
GET    /api/alunos/{id}/notas
GET    /api/alunos/{id}/faltas
GET    /api/alunos/{id}/ocorrencias
```

### Notas

```bash
GET    /api/notas
POST   /api/notas
PUT    /api/notas/{id}
GET    /api/notas/aluno/{id}
GET    /api/notas/relatorio/media-turma
```

### Faltas

```bash
GET    /api/faltas
POST   /api/faltas
PUT    /api/faltas/{id}
GET    /api/faltas/aluno/{id}
GET    /api/faltas/relatorio/frequencia
```

## Instalação em Hospedagem Compartilhada (cPanel)

### Passo 1: Preparar Diretórios

1. Acesse cPanel
2. Crie um novo addon domain para cada tenant
3. Aponte todos para o mesmo diretório `public`

### Passo 2: Upload via FTP

```
/
├── public/              # Document root
├── app/
├── bootstrap/
├── config/
├── database/
├── resources/
├── routes/
├── storage/
├── vendor/
└── ...
```

### Passo 3: Configurar Banco de Dados

1. Crie dois bancos MySQL:
   - `siged_landlord` (banco central)
   - `siged_tenant_1` (banco do tenant 1)

2. Atribua usuário do MySQL aos bancos

### Passo 4: Configurar Permissões

```bash
chmod 755 storage
chmod 755 bootstrap/cache
chmod 644 .env
```

### Passo 5: Executar Instalador

Acesse `https://seu-dominio.com/installer` e siga os passos.

## Variáveis de Ambiente Importantes

```env
# Banco Landlord
DB_HOST=localhost
DB_DATABASE=siged_landlord
DB_USERNAME=usuario
DB_PASSWORD=senha

# Tenancy
TENANCY_DB_PREFIX=siged_tenant_

# Multi-domínio
APP_URL=https://siged.example.com

# WhatsApp
WHATSAPP_API_URL=
WHATSAPP_API_TOKEN=

# Google Maps
GOOGLE_MAPS_API_KEY=

# AWS S3
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_BUCKET=siged-uploads
```

## Migrations e Seeders

### Executar Migrations

```bash
# Banco central
php artisan migrate

# Todos os tenants
php artisan tenants:migrate
```

### Executar Seeders

```bash
# Banco central
php artisan db:seed

# Todos os tenants
php artisan tenants:seed
```

## Comandos Úteis

```bash
# Criar novo tenant
php artisan tenants:create --name="Instituição" --domain="instituicao.siged.example.com"

# Listar tenants
php artisan tenants:list

# Executar comando em um tenant específico
php artisan tenants:exec --tenant=1 "command:name"

# Limpar cache
php artisan cache:clear
php artisan config:clear

# Gerar chaves de aplicação
php artisan key:generate

# Executar testes
php artisan test
```

## Desenvolvimento

### Criar um novo Module

```bash
php artisan make:migration create_novos_tabela
php artisan make:model NovoModelo
php artisan make:controller NovoModelo/NovoModeloController
php artisan make:request StoreNovoModelo
```

### Estrutura de um Controller

```php
<?php

namespace App\Http\Controllers\Admin;

use App\Models\Aluno;
use Illuminate\Http\Request;

class AlunoController extends Controller
{
    public function index()
    {
        $alunos = Aluno::paginate(15);
        return view('admin.alunos.index', compact('alunos'));
    }

    public function create()
    {
        return view('admin.alunos.create');
    }

    public function store(Request $request)
    {
        $aluno = Aluno::create($request->validated());
        return redirect()->route('alunos.show', $aluno);
    }
}
```

## Resolução de Problemas

### Problema: "SQLSTATE[HY000]: General error: 1030 Got error"

**Solução**: Aumentar limite de memória MySQL em `my.cnf`

```ini
max_connections=1000
max_allowed_packet=512M
```

### Problema: Arquivo não encontrado em uploads

**Solução**: Verificar permissões de `storage/app/public`

```bash
chmod -R 775 storage/app/public
php artisan storage:link
```

### Problema: Tenant não encontrado

**Solução**: Verificar domínio cadastrado

```bash
php artisan tenants:list
```

## Testes

```bash
# Executar todos os testes
php artisan test

# Executar testes específicos
php artisan test tests/Unit/Models/AlunoTest.php

# Com cobertura
php artisan test --coverage
```

## Performance

### Otimizações Implementadas

- ✅ Índices em campos de busca frequente
- ✅ Cache de configurações
- ✅ Eager loading de relacionamentos
- ✅ Paginação de resultados
- ✅ Compressão de assets

### Recomendações

1. Usar Redis para cache
2. Implementar fila para tarefas pesadas
3. Usar CDN para assets estáticos
4. Monitorar performance com Laravel Horizon

## Suporte e Contribuição

Para suporte, abra uma issue no repositório do projeto.

## Licença

Proprietary - SIGED

---

**Última atualização**: 2024
