105 lines
4.8 KiB
PHP
105 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Enums\PurchasingRole;
|
|
use App\Models\CostCenter;
|
|
use App\Models\Department;
|
|
use App\Models\Tenant;
|
|
use App\Models\User;
|
|
use App\Services\RequisitionWorkflow;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Validation\Rule;
|
|
use Inertia\Inertia;
|
|
use Inertia\Response;
|
|
|
|
class CompanyController extends Controller
|
|
{
|
|
public function setup(Request $request): Response|RedirectResponse
|
|
{
|
|
return $request->user()->tenant_id ? to_route('dashboard') : Inertia::render('company/setup');
|
|
}
|
|
|
|
public function store(Request $request, RequisitionWorkflow $workflow): RedirectResponse
|
|
{
|
|
$data = $request->validate(['name' => 'required|string|max:150', 'department' => 'required|string|max:100']);
|
|
DB::transaction(function () use ($request, $data, $workflow) {
|
|
$user = User::query()->lockForUpdate()->findOrFail($request->user()->id);
|
|
abort_if($user->tenant_id !== null, 403);
|
|
$tenant = Tenant::query()->create(['name' => $data['name']]);
|
|
$department = Department::query()->create(['tenant_id' => $tenant->id, 'name' => $data['department']]);
|
|
CostCenter::query()->create(['tenant_id' => $tenant->id, 'department_id' => $department->id, 'code' => 'GERAL', 'name' => 'Centro de custo geral']);
|
|
$user->forceFill(['tenant_id' => $tenant->id, 'department_id' => $department->id, 'purchasing_role' => PurchasingRole::Admin])->save();
|
|
$workflow->audit($user, 'company.created', null, null, ['name' => $data['name']]);
|
|
});
|
|
|
|
return to_route('dashboard');
|
|
}
|
|
|
|
public function index(Request $request): Response
|
|
{
|
|
$this->admin($request);
|
|
|
|
return Inertia::render('company/index', [
|
|
'company' => Tenant::query()->findOrFail($request->user()->tenant_id),
|
|
'departments' => Department::query()->orderBy('name')->get(),
|
|
'costCenters' => CostCenter::query()->orderBy('code')->get(),
|
|
'users' => User::query()->where('tenant_id', $request->user()->tenant_id)->orderBy('name')->get(['id', 'name', 'email', 'department_id', 'purchasing_role']),
|
|
'roles' => collect(PurchasingRole::cases())->map(fn (PurchasingRole $role) => ['value' => $role->value, 'label' => $role->label()]),
|
|
]);
|
|
}
|
|
|
|
public function department(Request $request, RequisitionWorkflow $workflow): RedirectResponse
|
|
{
|
|
$this->admin($request);
|
|
$data = $request->validate(['name' => ['required', 'string', 'max:100', Rule::unique('departments')->where('tenant_id', $request->user()->tenant_id)]]);
|
|
DB::transaction(function () use ($request, $data, $workflow) {
|
|
$department = Department::query()->create(['tenant_id' => $request->user()->tenant_id, ...$data]);
|
|
$workflow->audit($request->user(), 'department.created', null, null, $department->toArray());
|
|
});
|
|
|
|
return back();
|
|
}
|
|
|
|
public function costCenter(Request $request, RequisitionWorkflow $workflow): RedirectResponse
|
|
{
|
|
$this->admin($request);
|
|
$data = $request->validate([
|
|
'department_id' => ['required', Rule::exists('departments', 'id')->where('tenant_id', $request->user()->tenant_id)],
|
|
'code' => ['required', 'string', 'max:30', Rule::unique('cost_centers')->where('tenant_id', $request->user()->tenant_id)],
|
|
'name' => 'required|string|max:100',
|
|
]);
|
|
DB::transaction(function () use ($request, $data, $workflow) {
|
|
$center = CostCenter::query()->create(['tenant_id' => $request->user()->tenant_id, ...$data]);
|
|
$workflow->audit($request->user(), 'cost_center.created', null, null, $center->toArray());
|
|
});
|
|
|
|
return back();
|
|
}
|
|
|
|
public function user(Request $request, RequisitionWorkflow $workflow): RedirectResponse
|
|
{
|
|
$this->admin($request);
|
|
$data = $request->validate([
|
|
'name' => 'required|string|max:100', 'email' => 'required|email|max:255|unique:users',
|
|
'password' => 'required|string|min:12|confirmed',
|
|
'department_id' => ['required', Rule::exists('departments', 'id')->where('tenant_id', $request->user()->tenant_id)],
|
|
'purchasing_role' => ['required', Rule::enum(PurchasingRole::class)],
|
|
]);
|
|
DB::transaction(function () use ($request, $data, $workflow) {
|
|
$user = new User;
|
|
$user->forceFill($data + ['tenant_id' => $request->user()->tenant_id])->save();
|
|
$workflow->audit($request->user(), 'user.created', null, null, $user->only(['id', 'name', 'email', 'department_id', 'purchasing_role']));
|
|
});
|
|
|
|
return back();
|
|
}
|
|
|
|
private function admin(Request $request): void
|
|
{
|
|
abort_unless($request->user()->purchasing_role === PurchasingRole::Admin, 403);
|
|
}
|
|
}
|