user()->tenant_id ? to_route('dashboard') : Inertia::render('company/setup'); } public function store(Request $request, RequisitionWorkflow $workflow): RedirectResponse { abort_if($request->user()->tenant_id !== null, 403); $data = $request->validate(['name' => 'required|string|max:150', 'department' => 'required|string|max:100', 'second_name' => 'required|string|max:100', 'second_email' => 'required|email|max:255|unique:users,email', 'second_password' => 'required|string|min:12|confirmed', 'first_limit' => ['required', 'string', 'regex:/^\d{1,12}(\.\d{1,2})?$/D'], 'second_limit' => ['required', 'string', 'regex:/^\d{1,12}(\.\d{1,2})?$/D'], 'includes_tax' => 'required|boolean']); 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'], ...OrganizationConfiguration::rules($data)]); $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::Configured])->save(); $second = new User; $second->forceFill(['tenant_id' => $tenant->id, 'department_id' => $department->id, 'name' => $data['second_name'], 'email' => $data['second_email'], 'password' => $data['second_password'], 'purchasing_role' => PurchasingRole::Configured])->save(); app(OrganizationConfiguration::class)->initialise($user, $second); $workflow->audit($user, 'company.created', null, null, ['name' => $data['name'], 'initial_administrators' => [$user->id, $second->id], 'rules' => $tenant->only(['first_limit_minor', 'second_limit_minor', 'approval_includes_tax', 'rules_provisional'])]); }); return to_route('dashboard'); } public function index(Request $request): Response|RedirectResponse { $this->admin($request); if (app(OrganizationAccess::class)->active($request->user()->tenant_id)) { return to_route('organization.parameters'); } 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())->reject(fn (PurchasingRole $role) => $role === PurchasingRole::Configured)->values()->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); abort_if(app(OrganizationAccess::class)->active($request->user()->tenant_id), 409, 'Crie utilizadores e atribua perfis na parametrização.'); $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 { app(OrganizationConfiguration::class)->administrator($request->user()); } }