arcadiasuite/plus/app/Http/Controllers/SuiteApiController.php

462 lines
16 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Cliente;
use App\Models\Fornecedor;
use App\Models\Produto;
use App\Models\Empresa;
use App\Models\Plano;
use App\Models\User;
use App\Models\PreVenda;
use App\Models\Pedido;
use App\Models\ContaReceber;
use App\Models\ContaPagar;
use App\Models\Nfe;
use App\Models\Nfce;
use Illuminate\Http\Request;
class SuiteApiController extends Controller
{
public function stats()
{
return response()->json([
'empresas' => Empresa::count(),
'planos' => Plano::count(),
'usuarios' => User::count(),
'nfes' => Nfe::count(),
'nfces' => Nfce::count(),
'mrr' => Plano::sum('valor') ?? 0
]);
}
public function empresas()
{
$empresas = Empresa::with('plano')
->orderBy('id', 'desc')
->limit(100)
->get()
->map(function($e) {
return [
'id' => $e->id,
'nome' => $e->nome ?? $e->razao_social,
'razao_social' => $e->razao_social,
'cnpj' => $e->cpf_cnpj,
'email' => $e->email,
'telefone' => $e->telefone,
'cidade' => $e->cidade,
'uf' => $e->uf,
'plano' => $e->plano ? $e->plano->nome : null,
'status' => $e->status ? 'ativo' : 'inativo',
'created_at' => $e->created_at
];
});
return response()->json($empresas);
}
public function clientes(Request $request)
{
$empresaId = $request->header('X-Empresa-Id', 1);
$clientes = Cliente::where('empresa_id', $empresaId)
->orderBy('id', 'desc')
->limit(100)
->get()
->map(function($c) {
return [
'id' => $c->id,
'nome' => $c->razao_social ?? $c->nome,
'razao_social' => $c->razao_social,
'cpf_cnpj' => $c->cpf_cnpj,
'email' => $c->email,
'telefone' => $c->telefone,
'celular' => $c->celular,
'cidade' => $c->cidade,
'uf' => $c->uf,
'endereco' => $c->rua,
'bairro' => $c->bairro,
'status' => $c->status ? 'ativo' : 'inativo'
];
});
return response()->json($clientes);
}
public function fornecedores(Request $request)
{
$empresaId = $request->header('X-Empresa-Id', 1);
$fornecedores = Fornecedor::where('empresa_id', $empresaId)
->orderBy('id', 'desc')
->limit(100)
->get()
->map(function($f) {
return [
'id' => $f->id,
'nome' => $f->razao_social ?? $f->nome,
'razao_social' => $f->razao_social,
'cpf_cnpj' => $f->cpf_cnpj,
'email' => $f->email,
'telefone' => $f->telefone,
'cidade' => $f->cidade,
'uf' => $f->uf,
'status' => $f->status ? 'ativo' : 'inativo'
];
});
return response()->json($fornecedores);
}
public function produtos(Request $request)
{
$empresaId = $request->header('X-Empresa-Id', 1);
$produtos = Produto::where('empresa_id', $empresaId)
->orderBy('id', 'desc')
->limit(100)
->get()
->map(function($p) {
return [
'id' => $p->id,
'codigo' => $p->codigo ?? $p->id,
'nome' => $p->nome,
'descricao' => $p->descricao,
'ncm' => $p->ncm,
'unidade' => $p->unidade,
'valor_unitario' => $p->valor_unitario,
'valor_compra' => $p->valor_compra,
'estoque_atual' => $p->estoque_atual ?? 0,
'estoque_minimo' => $p->estoque_minimo ?? 0,
'codigo_barras' => $p->codigo_barras,
'categoria' => $p->categoria ? $p->categoria->nome : null,
'status' => $p->status ? 'ativo' : 'inativo'
];
});
return response()->json($produtos);
}
public function vendas(Request $request)
{
$empresaId = $request->header('X-Empresa-Id', 1);
$vendas = PreVenda::where('empresa_id', $empresaId)
->with(['cliente'])
->orderBy('id', 'desc')
->limit(50)
->get()
->map(function($v) {
return [
'id' => $v->id,
'numero' => $v->numero ?? $v->id,
'cliente' => $v->cliente ? $v->cliente->razao_social : 'Consumidor',
'valor_total' => $v->valor_total ?? 0,
'status' => $v->estado ?? 'pendente',
'data' => $v->created_at
];
});
return response()->json($vendas);
}
public function compras(Request $request)
{
$empresaId = $request->header('X-Empresa-Id', 1);
$compras = Pedido::where('empresa_id', $empresaId)
->with(['fornecedor'])
->orderBy('id', 'desc')
->limit(50)
->get()
->map(function($c) {
return [
'id' => $c->id,
'numero' => $c->numero ?? $c->id,
'fornecedor' => $c->fornecedor ? $c->fornecedor->razao_social : null,
'valor_total' => $c->valor_total ?? 0,
'status' => $c->estado ?? 'pendente',
'data' => $c->created_at
];
});
return response()->json($compras);
}
public function contasReceber(Request $request)
{
$empresaId = $request->header('X-Empresa-Id', 1);
$contas = ContaReceber::where('empresa_id', $empresaId)
->with(['cliente'])
->orderBy('data_vencimento', 'asc')
->limit(50)
->get()
->map(function($c) {
return [
'id' => $c->id,
'descricao' => $c->descricao,
'cliente' => $c->cliente ? $c->cliente->razao_social : null,
'valor' => $c->valor,
'valor_recebido' => $c->valor_recebido ?? 0,
'vencimento' => $c->data_vencimento,
'status' => $c->status
];
});
return response()->json($contas);
}
public function contasPagar(Request $request)
{
$empresaId = $request->header('X-Empresa-Id', 1);
$contas = ContaPagar::where('empresa_id', $empresaId)
->with(['fornecedor'])
->orderBy('data_vencimento', 'asc')
->limit(50)
->get()
->map(function($c) {
return [
'id' => $c->id,
'descricao' => $c->descricao,
'fornecedor' => $c->fornecedor ? $c->fornecedor->razao_social : null,
'valor' => $c->valor,
'valor_pago' => $c->valor_pago ?? 0,
'vencimento' => $c->data_vencimento,
'status' => $c->status
];
});
return response()->json($contas);
}
public function dashboardStats(Request $request)
{
$empresaId = $request->header('X-Empresa-Id', 1);
try {
$clientes = Cliente::where('empresa_id', $empresaId)->count();
} catch (\Exception $e) {
$clientes = 0;
}
try {
$fornecedores = Fornecedor::where('empresa_id', $empresaId)->count();
} catch (\Exception $e) {
$fornecedores = 0;
}
try {
$produtos = Produto::where('empresa_id', $empresaId)->count();
} catch (\Exception $e) {
$produtos = 0;
}
try {
$vendas = PreVenda::where('empresa_id', $empresaId)->count();
} catch (\Exception $e) {
$vendas = 0;
}
try {
$contasReceber = ContaReceber::where('empresa_id', $empresaId)->sum('valor') ?? 0;
} catch (\Exception $e) {
$contasReceber = 0;
}
try {
$contasPagar = ContaPagar::where('empresa_id', $empresaId)->sum('valor') ?? 0;
} catch (\Exception $e) {
$contasPagar = 0;
}
return response()->json([
'clientes' => $clientes,
'fornecedores' => $fornecedores,
'produtos' => $produtos,
'vendas' => $vendas,
'contas_receber' => floatval($contasReceber),
'contas_pagar' => floatval($contasPagar)
]);
}
// ========== SUPERADMIN APIs ==========
public function planos()
{
$planos = Plano::orderBy('id', 'desc')
->get()
->map(function($p) {
return [
'id' => $p->id,
'nome' => $p->nome,
'valor' => floatval($p->valor ?? 0),
'descricao' => $p->descricao,
'limite_usuarios' => $p->limite_usuarios ?? 1,
'limite_empresas' => $p->limite_empresas ?? 1,
'limite_nfe' => $p->limite_nfe ?? 0,
'limite_nfce' => $p->limite_nfce ?? 0,
'modulos' => $p->modulos ?? [],
'status' => $p->status ? 'ativo' : 'inativo',
'empresas_count' => $p->empresas()->count(),
'created_at' => $p->created_at
];
});
return response()->json($planos);
}
public function criarPlano(Request $request)
{
$validated = $request->validate([
'nome' => 'required|string|max:255',
'valor' => 'required|numeric|min:0',
'descricao' => 'nullable|string',
'limite_usuarios' => 'nullable|integer|min:1',
'limite_empresas' => 'nullable|integer|min:1',
'limite_nfe' => 'nullable|integer|min:0',
'limite_nfce' => 'nullable|integer|min:0',
'modulos' => 'nullable|array',
]);
$plano = Plano::create([
'nome' => $validated['nome'],
'valor' => $validated['valor'],
'descricao' => $validated['descricao'] ?? null,
'limite_usuarios' => $validated['limite_usuarios'] ?? 1,
'limite_empresas' => $validated['limite_empresas'] ?? 1,
'limite_nfe' => $validated['limite_nfe'] ?? 100,
'limite_nfce' => $validated['limite_nfce'] ?? 100,
'modulos' => $validated['modulos'] ?? [],
'status' => true,
]);
return response()->json(['success' => true, 'plano' => $plano], 201);
}
public function atualizarPlano(Request $request, $id)
{
$plano = Plano::findOrFail($id);
$validated = $request->validate([
'nome' => 'sometimes|string|max:255',
'valor' => 'sometimes|numeric|min:0',
'descricao' => 'nullable|string',
'limite_usuarios' => 'nullable|integer|min:1',
'limite_empresas' => 'nullable|integer|min:1',
'limite_nfe' => 'nullable|integer|min:0',
'limite_nfce' => 'nullable|integer|min:0',
'modulos' => 'nullable|array',
'status' => 'sometimes|boolean',
]);
$plano->update($validated);
return response()->json(['success' => true, 'plano' => $plano]);
}
public function deletarPlano($id)
{
$plano = Plano::findOrFail($id);
if ($plano->empresas()->count() > 0) {
return response()->json(['error' => 'Plano possui empresas vinculadas'], 400);
}
$plano->delete();
return response()->json(['success' => true]);
}
public function usuarios()
{
$usuarios = User::with(['empresas'])
->orderBy('id', 'desc')
->limit(100)
->get()
->map(function($u) {
return [
'id' => $u->id,
'nome' => $u->name,
'email' => $u->email,
'admin' => $u->admin ?? false,
'status' => $u->status ? 'ativo' : 'inativo',
'empresas_count' => $u->empresas ? $u->empresas->count() : 0,
'ultimo_acesso' => $u->last_login_at,
'created_at' => $u->created_at
];
});
return response()->json($usuarios);
}
public function criarEmpresa(Request $request)
{
$validated = $request->validate([
'razao_social' => 'required|string|max:255',
'nome_fantasia' => 'nullable|string|max:255',
'cpf_cnpj' => 'required|string|max:18',
'email' => 'nullable|email|max:255',
'telefone' => 'nullable|string|max:20',
'cidade' => 'nullable|string|max:100',
'uf' => 'nullable|string|max:2',
'plano_id' => 'nullable|exists:planos,id',
]);
$empresa = Empresa::create([
'razao_social' => $validated['razao_social'],
'nome' => $validated['nome_fantasia'] ?? $validated['razao_social'],
'cpf_cnpj' => $validated['cpf_cnpj'],
'email' => $validated['email'] ?? null,
'telefone' => $validated['telefone'] ?? null,
'cidade' => $validated['cidade'] ?? null,
'uf' => $validated['uf'] ?? null,
'plano_id' => $validated['plano_id'] ?? null,
'status' => true,
]);
return response()->json(['success' => true, 'empresa' => $empresa], 201);
}
public function atualizarEmpresa(Request $request, $id)
{
$empresa = Empresa::findOrFail($id);
$validated = $request->validate([
'razao_social' => 'sometimes|string|max:255',
'nome_fantasia' => 'nullable|string|max:255',
'cpf_cnpj' => 'sometimes|string|max:18',
'email' => 'nullable|email|max:255',
'telefone' => 'nullable|string|max:20',
'cidade' => 'nullable|string|max:100',
'uf' => 'nullable|string|max:2',
'plano_id' => 'nullable|exists:planos,id',
'status' => 'sometimes|boolean',
]);
if (isset($validated['nome_fantasia'])) {
$validated['nome'] = $validated['nome_fantasia'];
unset($validated['nome_fantasia']);
}
$empresa->update($validated);
return response()->json(['success' => true, 'empresa' => $empresa]);
}
public function superadminStats()
{
return response()->json([
'empresas' => Empresa::count(),
'empresas_ativas' => Empresa::where('status', true)->count(),
'planos' => Plano::count(),
'usuarios' => User::count(),
'usuarios_ativos' => User::where('status', true)->count(),
'nfes_total' => Nfe::count(),
'nfces_total' => Nfce::count(),
'mrr' => Empresa::whereHas('plano')->with('plano')->get()->sum(fn($e) => $e->plano->valor ?? 0),
]);
}
}