ultimatepos/Modules/Project/Http/Controllers/ProjectTmsController.php

89 lines
3.2 KiB
PHP

<?php
namespace Modules\Project\Http\Controllers;
use App\Utils\ModuleUtil;
use App\Utils\Util;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Project\Entities\Project;
use Modules\Tms\Models\Shipment;
use Modules\Tms\Utils\TmsUtil;
use Yajra\DataTables\Facades\DataTables;
class ProjectTmsController extends Controller
{
public function __construct(
protected Util $commonUtil,
protected ModuleUtil $moduleUtil,
protected TmsUtil $tmsUtil
) {}
public function shipments(Request $request, $project_id)
{
$business_id = (int) request()->session()->get('user.business_id');
$this->authorizeProjectAccess($business_id, (int) $project_id);
if (! $request->ajax() || ! $this->isTmsAvailable($business_id)) {
abort(404);
}
if (! auth()->user()->can('tms.shipments.view')) {
abort(403, 'Unauthorized action.');
}
$statuses = $this->tmsUtil->shipmentStatuses();
$types = $this->tmsUtil->shipmentTypes();
$query = Shipment::where('business_id', $business_id)
->where('pjt_project_id', $project_id)
->with(['driver:id,name', 'vehicle:id,plate_number'])
->orderByDesc('created_at');
return DataTables::of($query)
->editColumn('status', fn ($row) => $statuses[$row->status] ?? $row->status)
->editColumn('shipment_type', fn ($row) => $types[$row->shipment_type] ?? $row->shipment_type)
->editColumn('freight_cost', fn ($row) => $this->commonUtil->num_f($row->freight_cost, true))
->editColumn('scheduled_at', fn ($row) => $row->scheduled_at?->format('Y-m-d H:i') ?? '—')
->addColumn('driver_name', fn ($row) => $row->driver?->name ?? '—')
->addColumn('action', function ($row) {
return '<a href="'.action([\Modules\Tms\Http\Controllers\ShipmentController::class, 'show'], [$row->id]).'" class="btn btn-xs btn-info"><i class="fa fa-eye"></i></a>';
})
->rawColumns(['action'])
->make(true);
}
protected function isTmsAvailable(int $business_id): bool
{
if (! \Module::has('Tms') || ! \Module::isEnabled('Tms')) {
return false;
}
if (! $this->moduleUtil->isModuleInstalled('Tms')) {
return false;
}
if ($this->moduleUtil->isSuperadminInstalled()) {
return (bool) $this->moduleUtil->hasThePermissionInSubscription($business_id, 'tms_module');
}
return true;
}
protected function authorizeProjectAccess(int $business_id, int $project_id): void
{
if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'project_module'))) {
abort(403, 'Unauthorized action.');
}
$query = Project::where('business_id', $business_id)->where('id', $project_id);
if (! $this->commonUtil->is_admin(auth()->user(), $business_id)) {
$user_id = auth()->user()->id;
$query->whereHas('members', fn ($q) => $q->where('user_id', $user_id));
}
$query->firstOrFail();
}
}