erppackages / laravel-model-timeline
Timeline e histórico polimórfico para Laravel.
Package info
github.com/erichfr/laravel-model-timeline
pkg:composer/erppackages/laravel-model-timeline
v1.0.0
2026-02-02 15:51 UTC
Requires
- php: ^8.1
- illuminate/auth: ^10.0
- illuminate/database: ^10.0
- illuminate/support: ^10.0
README
Um sistema robusto e polimórfico de Histórico e Timeline para Models Eloquent. Ideal para ERPs, CRMs e sistemas que necessitam de rastreabilidade detalhada de ações (Auditoria e Comentários).
🚀 Funcionalidades
- Polimórfico: Funciona em qualquer Model (Clientes, Vendas, Mensalidades, etc).
- Atores Automáticos: Identifica automaticamente o usuário logado (
Auth::user()). - Eventos de Sistema: Suporta ações realizadas por rotinas automáticas (Cron Jobs) sem usuário atrelado.
- Metadados JSON: Armazena dados técnicos (ex:
old_value,new_value,ip_address) sem sujar a tabela principal. - Comentários: Helper simples para adicionar observações manuais (estilo CRM).
📦 Instalação
Instale o pacote via Composer:
composer require erppackages/laravel-model-timeline
Em seguida, rode as migrations para criar a tabela model_timelines
php artisan migrate
⚙️ Configuração
Adicione a Trait HasTimeline no Model que você deseja rastrear.
Exemplo em uma Mensalidade:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use ErpPackages\ModelTimeline\Traits\HasTimeline; // <--- Importe a Trait
class Mensalidade extends Model
{
use HasTimeline; // <--- Use a Trait
// ...
}
📚 Como Usar
- Registrando um Evento Genérico Use o método recordTimeline.
$mensalidade = Mensalidade::find(1);
$mensalidade->recordTimeline(
description: 'Data de vencimento alterada para 15/05',
action: 'update', // Opcional (default: 'info')
metadata: ['old' => '10/05', 'new' => '15/05'] // Opcional
);
- Registrando Comentários (CRM) Ideal para observações de atendimento ao cliente.
$mensalidade->comment("Cliente ligou pedindo para segurar o boleto.");
- Eventos de Sistema (Sem Usuário Logado) Se o código rodar em uma Cron Job ou Queue, o pacote define o actor como NULL automaticamente, indicando uma ação do sistema.
$novaMensalidade->recordTimeline(
description: 'Renovação automática de contrato',
action: 'system_event'
);
- Forçando um Ator Específico Você pode passar um usuário específico caso esteja "impersonando" ou rodando um comando administrativo.
$admin = User::find(1);
$mensalidade->recordTimeline(
description: 'Alteração forçada pelo suporte',
actor: $admin
);
🔍 Recuperando o Histórico
Para exibir no Frontend (Blade/Vue/React):
$historico = $mensalidade->timeline()
->with('actor') // Traz os dados do usuário que fez a ação
->get();
foreach ($historico as $entry) {
echo $entry->created_at->format('d/m/Y H:i');
echo " - " . $entry->description;
// Verifica se foi usuário ou sistema
echo " (Por: " . ($entry->actor ? $entry->actor->name : 'Sistema') . ")";
}
🛠 Estrutura do Banco de Dados
A tabela model_timelines possui a seguinte estrutura:
📄 Licença
MIT License.