125 lines
4.6 KiB
PHP
125 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace Modules\SupplyChain\Http\Controllers;
|
|
|
|
use Carbon\Carbon;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\Controller;
|
|
use Modules\SupplyChain\Http\Controllers\Concerns\AuthorizesSupplyChain;
|
|
use Modules\SupplyChain\Models\SupplierScorecard;
|
|
use Modules\SupplyChain\Services\SupplierScorecardService;
|
|
use Modules\SupplyChain\Utils\SupplyChainUtil;
|
|
use Yajra\DataTables\Facades\DataTables;
|
|
|
|
class SupplierScorecardController extends Controller
|
|
{
|
|
use AuthorizesSupplyChain;
|
|
|
|
public function __construct(
|
|
protected SupplyChainUtil $supplyChainUtil,
|
|
protected SupplierScorecardService $scorecardService
|
|
) {
|
|
}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$this->authorizeSupplyChain('supplychain.scorecard.view');
|
|
|
|
$businessId = $this->supplyChainUtil->getBusinessId();
|
|
|
|
if ($request->ajax()) {
|
|
$scorecards = SupplierScorecard::forBusiness($businessId)
|
|
->with('contact')
|
|
->orderByDesc('period_end');
|
|
|
|
return DataTables::of($scorecards)
|
|
->addColumn('supplier_name', fn ($row) => $row->contact?->name ?? '—')
|
|
->addColumn('period', fn ($row) => $row->period_start->format('Y-m-d').' — '.$row->period_end->format('Y-m-d'))
|
|
->addColumn('risk_badge', function ($row) {
|
|
$class = $this->supplyChainUtil->riskBadgeClass($row->risk_level);
|
|
|
|
return '<span class="label '.$class.'">'.__('supplychain::lang.risk_'.$row->risk_level).'</span>';
|
|
})
|
|
->addColumn('action', function ($row) {
|
|
return '<a class="btn btn-xs btn-info" href="'.action([self::class, 'show'], $row->id).'"><i class="fa fa-eye"></i></a>';
|
|
})
|
|
->rawColumns(['risk_badge', 'action'])
|
|
->make(true);
|
|
}
|
|
|
|
return view('supplychain::supplier_scorecards.index');
|
|
}
|
|
|
|
public function show($id)
|
|
{
|
|
$this->authorizeSupplyChain('supplychain.scorecard.view');
|
|
|
|
$businessId = $this->supplyChainUtil->getBusinessId();
|
|
$scorecard = SupplierScorecard::forBusiness($businessId)->with('contact')->findOrFail($id);
|
|
|
|
return view('supplychain::supplier_scorecards.show', compact('scorecard'));
|
|
}
|
|
|
|
public function calculate(Request $request)
|
|
{
|
|
$this->authorizeSupplyChain('supplychain.scorecard.create');
|
|
|
|
$businessId = $this->supplyChainUtil->getBusinessId();
|
|
$data = $request->validate([
|
|
'period_start' => 'nullable|date',
|
|
'period_end' => 'nullable|date|after_or_equal:period_start',
|
|
]);
|
|
|
|
$start = ! empty($data['period_start']) ? Carbon::parse($data['period_start']) : null;
|
|
$end = ! empty($data['period_end']) ? Carbon::parse($data['period_end']) : null;
|
|
|
|
$results = $this->scorecardService->calculateForBusiness($businessId, $start, $end);
|
|
|
|
return $this->supplyChainUtil->jsonOrRedirect(
|
|
$request,
|
|
true,
|
|
__('supplychain::lang.scorecards_calculated', ['count' => count($results)]),
|
|
action([self::class, 'index'])
|
|
);
|
|
}
|
|
|
|
public function calculateSupplier(Request $request, $contactId)
|
|
{
|
|
$this->authorizeSupplyChain('supplychain.scorecard.create');
|
|
|
|
$businessId = $this->supplyChainUtil->getBusinessId();
|
|
$this->scorecardService->calculateForSupplier($businessId, (int) $contactId);
|
|
|
|
return $this->supplyChainUtil->jsonOrRedirect(
|
|
$request,
|
|
true,
|
|
__('supplychain::lang.scorecard_calculated')
|
|
);
|
|
}
|
|
|
|
public function contactScorecards($contactId)
|
|
{
|
|
$this->authorizeSupplyChain('supplychain.scorecard.view');
|
|
|
|
$businessId = $this->supplyChainUtil->getBusinessId();
|
|
$scorecards = SupplierScorecard::forBusiness($businessId)
|
|
->where('contact_id', (int) $contactId)
|
|
->orderByDesc('period_end')
|
|
->limit(12)
|
|
->get();
|
|
|
|
return response()->json([
|
|
'scorecards' => $scorecards->map(function ($sc) {
|
|
return [
|
|
'period' => $sc->period_start->format('Y-m-d').' — '.$sc->period_end->format('Y-m-d'),
|
|
'overall_score' => number_format($sc->overall_score, 1),
|
|
'otif_score' => number_format($sc->otif_score, 1),
|
|
'quality_score' => number_format($sc->quality_score, 1),
|
|
'risk_class' => $this->supplyChainUtil->riskBadgeClass($sc->risk_level),
|
|
'risk_label' => __('supplychain::lang.risk_'.$sc->risk_level),
|
|
];
|
|
}),
|
|
]);
|
|
}
|
|
}
|