Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
f1c60f7
Aprimorando exibição de pagamentos com valores padrão e mensagens de …
bulfaitelo Apr 22, 2026
3504485
Atualizando ícones na exibição de estatísticas do sistema
bulfaitelo Apr 22, 2026
452430d
Adicionando suporte a busca e snippets na tabela de Wikis
bulfaitelo Apr 22, 2026
b9d9e39
Aumentando o tamanho dos snippets de busca para melhor exibição nas t…
bulfaitelo Apr 22, 2026
03e0e45
Aprimorando a exibição do balancete com formatação resumida e complet…
bulfaitelo Apr 22, 2026
e62e8ff
Reorganizando o estilo da balancete para melhorar a estrutura do código
bulfaitelo Apr 22, 2026
51a5fd6
Adicionando detecção de alterações em formulários para prevenir perda…
bulfaitelo Apr 22, 2026
75def79
adicionando atributo target="_blank" ao link do rodapé para abrir em …
bulfaitelo Apr 22, 2026
bcf3d71
adicionando informações adicionais na tabela de OS com ícones para se…
bulfaitelo Apr 22, 2026
3396dbb
adicionando o relacionamento 'status' na consulta de listagem de vendas
bulfaitelo Apr 22, 2026
8e47997
adicionando estilos de ícones para anotações, senhas e arquivos na ta…
bulfaitelo Apr 22, 2026
5ee90e0
adicionando campo 'usuario' na tabela de OS e atualizando formulários…
bulfaitelo Apr 22, 2026
c23ab81
adicionando vírgula ao final da lista de campos preenchíveis na class…
bulfaitelo Apr 22, 2026
61098be
invertendo a verificação de tipos de informações para anotações e sen…
bulfaitelo Apr 23, 2026
2d46ef3
definindo todos os proxies como confiáveis na classe TrustProxies
bulfaitelo Apr 23, 2026
dac47d3
alterando a forma de referência de caminhos para arquivos estáticos e…
bulfaitelo Apr 24, 2026
303c3dc
adicionando a classe EmitenteFactory e o seeder EmitenteSeeder; imple…
bulfaitelo Apr 27, 2026
d8cc997
corrigindo pontuação na documentação do método principal na classe Em…
bulfaitelo Apr 27, 2026
eb80a08
adicionando rota e método para obter categoria associada ao modelo
bulfaitelo Apr 29, 2026
40d3ee6
adicionando permissão para acessar a categoria associada ao modelo
bulfaitelo Apr 29, 2026
62f8400
detectando mudanças apenas nos campos principais da OS
bulfaitelo Apr 29, 2026
99cb91d
adicionando botão para copiar informações da OS para WhatsApp e imple…
bulfaitelo Apr 30, 2026
a1e6f57
refatorando a exibição do botão de cópia para WhatsApp e ajustando a …
bulfaitelo Apr 30, 2026
ee5003d
adicionando IDs aos campos de seleção e texto, e implementando o tom-…
bulfaitelo Apr 30, 2026
0a67dd3
ajustando a formatação do texto no método getWhatsappText para melhor…
bulfaitelo Apr 30, 2026
71afffe
Apply fixes from StyleCI
StyleCIBot Apr 30, 2026
a8c0b35
Merge pull request #17 from bulfaitelo/analysis-KgpAV3
bulfaitelo Apr 30, 2026
57077fe
Adiciona novos campos à tabela de categorias e atualiza a lógica de c…
bulfaitelo May 1, 2026
2395eba
Apply fixes from StyleCI
StyleCIBot May 1, 2026
8511648
Merge pull request #18 from bulfaitelo/analysis-rDEMgV
bulfaitelo May 1, 2026
6a500f8
Adiciona arquivo version.env com versões base e da aplicação
bulfaitelo May 1, 2026
ab10ffa
Adiciona lógica para exibir a versão da aplicação e cria arquivo de c…
bulfaitelo May 1, 2026
9a69988
Adiciona lógica para gerar e injetar a versão da aplicação no .env e …
bulfaitelo May 5, 2026
91edce3
Ajusta formatação de código no arquivo version.php
bulfaitelo May 5, 2026
4d3aeee
Reorganiza etapas do workflow de deploy para melhor estruturação e le…
bulfaitelo May 5, 2026
d8d608b
Atualiza workflow de deploy para definir o caminho do projeto e garan…
bulfaitelo May 5, 2026
e0d289c
Adiciona suporte a auditoria com o pacote OwenIt/laravel-auditing e c…
bulfaitelo May 5, 2026
0f1fb22
Adiciona o pacote OwenIt/laravel-auditing como dependência no composer
bulfaitelo May 5, 2026
bfb9de8
Implementa a interface Auditable em diversos modelos e ajusta a migra…
bulfaitelo May 5, 2026
b9effa9
Remove linha em branco no método up da migração de auditoria
bulfaitelo May 5, 2026
b56550a
Adiciona funcionalidade de auditoria com criação de controlador, rota…
bulfaitelo May 5, 2026
ab92fca
Remove implementação da interface Auditable na classe Movimentacao
bulfaitelo May 5, 2026
a7206c4
Adiciona filtro por ID do registro auditado na listagem de auditoria …
bulfaitelo May 5, 2026
9d46162
Ajusta a seleção de modelos no filtro da auditoria para utilizar a co…
bulfaitelo May 5, 2026
64449d3
Merge pull request #19 from bulfaitelo/audit
bulfaitelo May 5, 2026
1ed944a
Adiciona opção 'skip-ssl' na configuração da conexão MySQL
bulfaitelo May 6, 2026
95b1198
Ajusta a chamada do método para obter o valor total na função getWhat…
bulfaitelo May 7, 2026
7a2c528
Altera a classe do cartão para 'card-oslab' nas views de criação, edi…
bulfaitelo May 7, 2026
9d04d1c
Refactor back button labels across multiple views for consistency
bulfaitelo May 7, 2026
9f52630
Move auditoria button to show-cliente view for better accessibility
bulfaitelo May 15, 2026
03c2b70
Remove placeholder attribute from 'auditable_type' select field in au…
bulfaitelo May 16, 2026
b43f26c
Adiciona funcionalidade de busca na barra lateral com redirecionament…
bulfaitelo May 16, 2026
3833ba9
Melhora a funcionalidade de busca na barra lateral, adicionando trata…
bulfaitelo May 16, 2026
b33608b
Adiciona funcionalidade de gerenciamento de páginas favoritas, inclui…
bulfaitelo May 16, 2026
35e9ad2
Refatora formulários e botões nas páginas de edição e listagem de pág…
bulfaitelo May 16, 2026
916cf08
Adiciona migração para adicionar colunas 'color' e 'order' à tabela '…
bulfaitelo May 16, 2026
9c29c54
Adiciona controle de permissões para páginas favoritas, incluindo mid…
bulfaitelo May 16, 2026
1e88c5f
Merge pull request #20 from bulfaitelo/itens_favoritos
bulfaitelo May 16, 2026
25f1a35
Merge branch 'notificacao' into main
bulfaitelo May 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 27 additions & 5 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
name: Deploy OSLab


on:
workflow_run:
workflows: ["OSLab Laravel Application Test"]
types:
- completed

jobs:
deploy:
runs-on: self-hosted
Expand All @@ -20,6 +20,28 @@ jobs:
cd /var/Docker/Docker_Dev_Web/www/oslab
git pull origin main

- name: Gerar e Injetar Versão no .env
run: |
# Define o caminho real do projeto no servidor
PROJECT_PATH="/var/Docker/Docker_Dev_Web/www/oslab"

# Lê a base do arquivo version.env recém atualizado
BASE=$(grep -E "^BASE_VERSION=" $PROJECT_PATH/version.env | cut -d '=' -f2 | tr -d '\r')

# Dados para a versão visual e URL
BRANCH=${{ github.ref_name }}
SHORT_HASH=$(echo ${{ github.sha }} | cut -c1-7)
FULL_HASH=${{ github.sha }}
REPO=${{ github.repository }}

# Remove as linhas das versões antigas do .env de produção para não duplicar
sed -i '/^APP_VERSION=/d' $PROJECT_PATH/.env
sed -i '/^APP_VERSION_URL=/d' $PROJECT_PATH/.env

# Salva a nova versão no .env real do servidor
echo "APP_VERSION=${BASE}-${BRANCH}-${SHORT_HASH}" >> $PROJECT_PATH/.env
echo "APP_VERSION_URL=https://github.com/${REPO}/commit/${FULL_HASH}" >> $PROJECT_PATH/.env

- name: Rodar Composer dentro do diretório Oslab
run: |
sudo docker exec app composer install -d oslab
Expand All @@ -28,10 +50,10 @@ jobs:
run: |
sudo docker exec app php oslab/artisan migrate

- name: Limpando cache de configuração
run: |
sudo docker exec app php oslab/artisan optimize:clear

- name: Rodar Artisan db:update-defaults (chamando direto na classe)
run: |
sudo docker exec app php oslab/artisan db:seed --class DatabaseDefaultPermissionsUpdate

- name: Limpando cache de configuração (Agora lendo o .env novo)
run: |
sudo docker exec app php oslab/artisan optimize:clear
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[![OSLab](https://raw.githubusercontent.com/bulfaitelo/oslab/main/public/vendor/oslab/imgs/oslab_logo_marca.png)]()
[![Version](https://img.shields.io/badge/version-0.0.1-blue.svg?longCache=true&style=flat-square)]()
[![Version](https://img.shields.io/badge/version-0.1.0-blue.svg?longCache=true&style=flat-square)]()
[![Issues](https://img.shields.io/github/issues/bulfaitelo/oslab.svg?longCache=true&style=flat-square)](https://github.com/bulfaitelo/OSLab/issues)
[![GitHub branch check runs](https://img.shields.io/github/check-runs/bulfaitelo/OSLab/main?logo=github-actions&logoColor=white&style=flat-square)](https://github.com/bulfaitelo/oslab/actions)
[![StyleCI](https://github.styleci.io/repos/642922269/shield?branch=main)](https://github.styleci.io/repos/642922269)
Expand Down
94 changes: 94 additions & 0 deletions app/Http/Controllers/Configuracao/PaginaFavoritaController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php

namespace App\Http\Controllers\Configuracao;

use App\Http\Controllers\Controller;
use App\Models\OsLab\PaginaFavorita;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class PaginaFavoritaController extends Controller
{
public function __construct()
{
// ACL DE PERMISSÕES
$this->middleware('permission:config_pagina_favorita', ['only' => ['index', 'update', 'destroy', 'updateOrder', 'edit']]);
}

/**
* Display a listing of the resource.
*/
public function index()
{
$user = Auth::user();
$favoritas = PaginaFavorita::where('user_id', $user->id)
->orderBy('order')
->get();

return view('configuracao.pagina-favorita.index', [
'favoritas' => $favoritas,
'colors' => PaginaFavorita::AVAILABLE_COLORS,
]);
}

/**
* Show the form for editing the specified resource.
*/
public function edit(PaginaFavorita $paginaFavorita)
{
$this->authorize('update', $paginaFavorita);

return view('configuracao.pagina-favorita.edit', [
'favorita' => $paginaFavorita,
'colors' => PaginaFavorita::AVAILABLE_COLORS,
]);
}

/**
* Update the specified resource in storage.
*/
public function update(Request $request, PaginaFavorita $paginaFavorita)
{
$this->authorize('update', $paginaFavorita);

$validated = $request->validate([
'text' => 'required|string|max:255',
'color' => 'required|in:'.implode(',', array_keys(PaginaFavorita::AVAILABLE_COLORS)),
]);

$paginaFavorita->update($validated);

return redirect()->route('configuracao.pagina-favorita.index')
->with('success', 'Página favorita atualizada com sucesso!');
}

/**
* Remove the specified resource from storage.
*/
public function destroy(PaginaFavorita $paginaFavorita)
{
$this->authorize('delete', $paginaFavorita);

$paginaFavorita->delete();

return redirect()->route('configuracao.pagina-favorita.index')
->with('success', 'Página favorita removida com sucesso!');
}

/**
* Update the order of favorites via AJAX.
*/
public function updateOrder(Request $request)
{
$user = Auth::user();
$order = $request->input('order', []);

foreach ($order as $index => $id) {
PaginaFavorita::where('id', $id)
->where('user_id', $user->id)
->update(['order' => $index]);
}

return response()->json(['success' => true]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public function __construct()
// ACL DE PERMISSÕES
$this->middleware('permission:config_categoria', ['only' => 'index']);
$this->middleware('permission:config_categoria_create', ['only' => ['create', 'store']]);
$this->middleware('permission:config_categoria_show', ['only' => 'show']);
$this->middleware('permission:config_categoria_show', ['only' => ['show', 'getDadosCategoria']]);
$this->middleware('permission:config_categoria_edit', ['only' => ['edit', 'update']]);
$this->middleware('permission:config_categoria_destroy', ['only' => 'destroy']);
}
Expand Down Expand Up @@ -47,7 +47,11 @@ public function store(StoreUpdateCategoriaRequest $request)
try {
$categoria = new Categoria;
$categoria->name = $request->name;
$categoria->descricao_categoria = $request->descricao_categoria;
$categoria->descricao = $request->descricao;
$categoria->defeito = $request->defeito;
$categoria->observacao = $request->observacao;
$categoria->laudo = $request->laudo;
$categoria->user_id = Auth::id();
$categoria->garantia_id = $request->garantia_id;
$categoria->centro_custo_id = $request->centro_custo_id;
Expand Down Expand Up @@ -85,7 +89,11 @@ public function update(StoreUpdateCategoriaRequest $request, Categoria $categori
{
try {
$categoria->name = $request->name;
$categoria->descricao_categoria = $request->descricao_categoria;
$categoria->descricao = $request->descricao;
$categoria->defeito = $request->defeito;
$categoria->observacao = $request->observacao;
$categoria->laudo = $request->laudo;
$categoria->user_id = Auth::id();
$categoria->garantia_id = $request->garantia_id;
$categoria->centro_custo_id = $request->centro_custo_id;
Expand Down Expand Up @@ -114,4 +122,21 @@ public function destroy(Categoria $categoria)
throw $th;
}
}

/**
* Retorna os dados da categoria em formato JSON.
*/
public function getDadosCategoria(Categoria $categoria)
{
try {
return response()->json([
'descricao' => $categoria->descricao,
'defeito' => $categoria->defeito,
'observacao' => $categoria->observacao,
'laudo' => $categoria->laudo,
], 200);
} catch (\Throwable $th) {
return response()->json(['error' => 'Dados não encontrados'], 404);
}
}
}
23 changes: 22 additions & 1 deletion app/Http/Controllers/Configuracao/Wiki/ModeloController.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class ModeloController extends Controller
public function __construct()
{
// ACL DE PERMISSÕES
$this->middleware('permission:config_wiki_modelo', ['only' => ['index', 'apiModeloSelect']]);
$this->middleware('permission:config_wiki_modelo', ['only' => ['index', 'apiModeloSelect', 'getCategoriaByModelo']]);
$this->middleware('permission:config_wiki_modelo_create', ['only' => ['create', 'store']]);
$this->middleware('permission:config_wiki_modelo_show', ['only' => 'show']);
$this->middleware('permission:config_wiki_modelo_edit', ['only' => ['edit', 'update']]);
Expand Down Expand Up @@ -146,4 +146,25 @@ public function apiModeloSelect(Request $request)
return response()->json($th, 403);
}
}

/**
* Get Categoria by Modelo.
*
* Retorna a categoria associada ao modelo selecionado.
*
* @return response, json Retorna a categoria do modelo
**/
public function getCategoriaByModelo(Modelo $modelo)
{
try {
$categoria = $modelo->wiki->categoria;

return response()->json([
'id' => $categoria->id,
'name' => $categoria->name,
], 200);
} catch (\Throwable $th) {
return response()->json(['error' => 'Categoria não encontrada'], 404);
}
}
}
1 change: 0 additions & 1 deletion app/Http/Controllers/Os/OsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ public function printPdf(Os $os)
$pdf = Pdf::loadView('os.pdf.print', compact('os', 'emitente'));
// $pdf->setWarnings(true);
$pdf->setPaper('a4');
// $css = asset('vendor/adminlte/dist/css/adminlte.min.css');

return $pdf->stream('OSLab_OS_'.$os->id.'_'.$os->cliente->titleName().'.pdf');
}
Expand Down
1 change: 1 addition & 0 deletions app/Http/Controllers/Os/OsPublicController.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public function update($uuid, Request $request)
// dd($request->input());
try {
$informacao->informacao = $request->informacao;
$informacao->usuario = $request->usuario;
$informacao->descricao = $request->descricao;
$informacao->uuid = null;
$informacao->status = 3;
Expand Down
88 changes: 88 additions & 0 deletions app/Http/Controllers/Relatorio/Sistema/AuditoriaController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<?php

namespace App\Http\Controllers\Relatorio\Sistema;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use OwenIt\Auditing\Models\Audit;

class AuditoriaController extends Controller
{
public function __construct()
{
// ACL DE PERMISSÕES
$this->middleware('permission:relatorio_sistema_auditoria', ['only' => ['index', 'show']]);
}

/**
* Display a listing of the audit records.
*/
public function index(Request $request)
{
$auditorias = Audit::query();
$auditorias->with('user');

// Filtro por modelo
if ($request->filled('auditable_type')) {
$auditorias->where('auditable_type', $request->auditable_type);
}

// Filtro por tipo de evento
if ($request->filled('event')) {
$auditorias->where('event', $request->event);
}

// Filtro por usuário
if ($request->filled('user_id')) {
$auditorias->where('user_id', $request->user_id);
}

// Filtro por ID do registro auditado
if ($request->filled('auditable_id')) {
$auditorias->where('auditable_id', $request->auditable_id);
}

// Filtro por data
if ($request->filled('data_inicio')) {
$auditorias->whereDate('created_at', '>=', $request->data_inicio);
}

if ($request->filled('data_fim')) {
$auditorias->whereDate('created_at', '<=', $request->data_fim);
}

// Ordenação padrão
$auditorias = $auditorias->latest('created_at')->paginate(50);

// Obter lista de modelos auditados para o filtro
$modelos = Audit::select('auditable_type')
->distinct()
->orderBy('auditable_type')
->pluck('auditable_type')
->toArray();

$modelos = collect($modelos)
->mapWithKeys(fn ($type) => [$type => class_basename($type)])
->all();

// Obter lista de usuários
$usuarios = \App\Models\User::orderBy('name')->pluck('name', 'id');

return view('relatorio.sistema.auditoria.index', [
'auditorias' => $auditorias,
'request' => $request,
'modelos' => $modelos,
'usuarios' => $usuarios,
]);
}

/**
* Display the specified audit record.
*/
public function show(Audit $auditoria)
{
return view('relatorio.sistema.auditoria.show', [
'auditoria' => $auditoria,
]);
}
}
4 changes: 3 additions & 1 deletion app/Http/Middleware/TrustProxies.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ class TrustProxies extends Middleware
*
* @var array<int, string>|string|null
*/
protected $proxies;
// protected $proxies;

protected $proxies = '*';

/**
* The headers that should be used to detect proxies.
Expand Down
Loading
Loading