61 lines
3.0 KiB
PHP
61 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\EconomicCluster;
|
|
use App\Models\InvestmentGap;
|
|
use App\Models\ValueChain;
|
|
use App\Models\ValueChainLink;
|
|
use App\Services\PortalAudit;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class ClusterValueChainController extends Controller
|
|
{
|
|
public function link(Request $request, EconomicCluster $cluster): RedirectResponse
|
|
{
|
|
$data = $request->validate([
|
|
'from_value_chain_id' => ['required', 'uuid', Rule::exists('value_chains', 'id')->where('cluster_id', $cluster->id)->whereNull('deleted_at')],
|
|
'to_value_chain_id' => ['required', 'uuid', 'different:from_value_chain_id', Rule::exists('value_chains', 'id')->where('cluster_id', $cluster->id)->whereNull('deleted_at')],
|
|
'link_type' => ['required', Rule::in(['supplies', 'processes', 'distributes', 'supports'])],
|
|
]);
|
|
DB::transaction(function () use ($cluster, $data, $request) {
|
|
EconomicCluster::whereKey($cluster->id)->lockForUpdate()->firstOrFail();
|
|
$link = ValueChainLink::where($data)->first() ?? new ValueChainLink;
|
|
PortalAudit::save($link, $data, $request->user()->id);
|
|
});
|
|
|
|
return back()->with('success', 'Ligação entre etapas guardada.');
|
|
}
|
|
|
|
public function removeLink(Request $request, EconomicCluster $cluster, ValueChainLink $link): RedirectResponse
|
|
{
|
|
DB::transaction(function () use ($cluster, $link, $request) {
|
|
EconomicCluster::whereKey($cluster->id)->lockForUpdate()->firstOrFail();
|
|
abort_unless(ValueChain::where('cluster_id', $cluster->id)->whereIn('id', [$link->from_value_chain_id, $link->to_value_chain_id])->count() === 2, 404);
|
|
PortalAudit::save($link, ['deleted_at' => now()], $request->user()->id);
|
|
});
|
|
|
|
return back()->with('success', 'Ligação retirada. O histórico foi preservado.');
|
|
}
|
|
|
|
public function gap(Request $request, EconomicCluster $cluster, ?InvestmentGap $gap = null): RedirectResponse
|
|
{
|
|
abort_if($gap && $gap->cluster_id !== $cluster->id, 404);
|
|
$data = $request->validate([
|
|
'value_chain_id' => ['required', 'uuid', Rule::exists('value_chains', 'id')->where('cluster_id', $cluster->id)->whereNull('deleted_at')],
|
|
'title' => ['required', 'string', 'max:200'],
|
|
'location' => ['required', 'string', 'max:1000'],
|
|
'required_capacity' => ['required', 'string', 'max:2000'],
|
|
'rationale' => ['required', 'string', 'min:10', 'max:5000'],
|
|
'status' => ['required', Rule::in(['identified', 'in_review', 'resolved', 'withdrawn'])],
|
|
'call_to_action' => ['required', 'string', 'max:2000'],
|
|
]);
|
|
PortalAudit::save($gap ?? new InvestmentGap, [...$data, 'cluster_id' => $cluster->id], $request->user()->id);
|
|
|
|
return back()->with('success', 'Lacuna de investimento guardada.');
|
|
}
|
|
}
|