413 lines
16 KiB
PHP
413 lines
16 KiB
PHP
<?php
|
|
|
|
namespace Modules\Tms\Http\Controllers;
|
|
|
|
use App\Http\MenuIcons;
|
|
use App\Utils\ModuleUtil;
|
|
use Illuminate\Routing\Controller;
|
|
use Menu;
|
|
use Modules\Tms\Models\CustomsClearance;
|
|
use Modules\Tms\Models\Shipment;
|
|
use Modules\Tms\Services\TmsShipmentService;
|
|
use Modules\Tms\Utils\TmsUtil;
|
|
|
|
class DataController extends Controller
|
|
{
|
|
public function superadmin_package()
|
|
{
|
|
return [
|
|
[
|
|
'name' => 'tms_module',
|
|
'label' => __('tms::lang.module_name'),
|
|
'default' => false,
|
|
],
|
|
];
|
|
}
|
|
|
|
public function user_permissions()
|
|
{
|
|
return [
|
|
['value' => 'tms.access', 'label' => __('tms::lang.access'), 'default' => false],
|
|
['value' => 'tms.view', 'label' => __('tms::lang.view_dashboard'), 'default' => false],
|
|
['value' => 'tms.shipments.view', 'label' => __('tms::lang.shipments_view'), 'default' => false],
|
|
['value' => 'tms.shipments.create', 'label' => __('tms::lang.shipments_create'), 'default' => false],
|
|
['value' => 'tms.shipments.update', 'label' => __('tms::lang.shipments_update'), 'default' => false],
|
|
['value' => 'tms.shipments.delete', 'label' => __('tms::lang.shipments_delete'), 'default' => false],
|
|
['value' => 'tms.vehicles.view', 'label' => __('tms::lang.vehicles_view'), 'default' => false],
|
|
['value' => 'tms.vehicles.create', 'label' => __('tms::lang.vehicles_create'), 'default' => false],
|
|
['value' => 'tms.vehicles.update', 'label' => __('tms::lang.vehicles_update'), 'default' => false],
|
|
['value' => 'tms.vehicles.delete', 'label' => __('tms::lang.vehicles_delete'), 'default' => false],
|
|
['value' => 'tms.drivers.view', 'label' => __('tms::lang.drivers_view'), 'default' => false],
|
|
['value' => 'tms.drivers.create', 'label' => __('tms::lang.drivers_create'), 'default' => false],
|
|
['value' => 'tms.drivers.update', 'label' => __('tms::lang.drivers_update'), 'default' => false],
|
|
['value' => 'tms.drivers.delete', 'label' => __('tms::lang.drivers_delete'), 'default' => false],
|
|
['value' => 'tms.carriers.view', 'label' => __('tms::lang.carriers_view'), 'default' => false],
|
|
['value' => 'tms.carriers.create', 'label' => __('tms::lang.carriers_create'), 'default' => false],
|
|
['value' => 'tms.carriers.update', 'label' => __('tms::lang.carriers_update'), 'default' => false],
|
|
['value' => 'tms.carriers.delete', 'label' => __('tms::lang.carriers_delete'), 'default' => false],
|
|
['value' => 'tms.reports.view', 'label' => __('tms::lang.reports_view'), 'default' => false],
|
|
['value' => 'tms.tracking.view', 'label' => __('tms::lang.tracking_view'), 'default' => false],
|
|
['value' => 'tms.tracking.report', 'label' => __('tms::lang.tracking_report'), 'default' => false],
|
|
['value' => 'tms.routes.view', 'label' => __('tms::lang.routes_view'), 'default' => false],
|
|
['value' => 'tms.routes.create', 'label' => __('tms::lang.routes_create'), 'default' => false],
|
|
['value' => 'tms.routes.update', 'label' => __('tms::lang.routes_update'), 'default' => false],
|
|
['value' => 'tms.routes.delete', 'label' => __('tms::lang.routes_delete'), 'default' => false],
|
|
['value' => 'tms.customs.view', 'label' => __('tms::lang.customs_view'), 'default' => false],
|
|
['value' => 'tms.customs.create', 'label' => __('tms::lang.customs_create'), 'default' => false],
|
|
['value' => 'tms.customs.update', 'label' => __('tms::lang.customs_update'), 'default' => false],
|
|
['value' => 'tms.customs.delete', 'label' => __('tms::lang.customs_delete'), 'default' => false],
|
|
['value' => 'tms.brokers.view', 'label' => __('tms::lang.brokers_view'), 'default' => false],
|
|
['value' => 'tms.brokers.create', 'label' => __('tms::lang.brokers_create'), 'default' => false],
|
|
['value' => 'tms.brokers.update', 'label' => __('tms::lang.brokers_update'), 'default' => false],
|
|
['value' => 'tms.brokers.delete', 'label' => __('tms::lang.brokers_delete'), 'default' => false],
|
|
];
|
|
}
|
|
|
|
public function after_sale_saved($data)
|
|
{
|
|
$transaction = $data['transaction'] ?? null;
|
|
if (! $transaction || $transaction->type !== 'sell') {
|
|
return;
|
|
}
|
|
|
|
$module_util = new ModuleUtil();
|
|
if (! $this->isTmsEnabled($module_util, (int) $transaction->business_id)) {
|
|
return;
|
|
}
|
|
|
|
$tmsUtil = app(TmsUtil::class);
|
|
$settings = $tmsUtil->getTmsSettings((int) $transaction->business_id);
|
|
|
|
if (empty($settings['auto_create_on_sale'])) {
|
|
return;
|
|
}
|
|
|
|
$hasShipping = ! empty($transaction->shipping_address)
|
|
|| ! empty($transaction->shipping_details)
|
|
|| (float) ($transaction->shipping_charges ?? 0) > 0;
|
|
|
|
if (! $hasShipping) {
|
|
return;
|
|
}
|
|
|
|
app(TmsShipmentService::class)->createFromTransaction($transaction);
|
|
}
|
|
|
|
public function get_contact_view_tabs()
|
|
{
|
|
$module_util = new ModuleUtil();
|
|
$business_id = request()->session()->get('user.business_id');
|
|
|
|
if (! $this->isTmsEnabled($module_util, (int) $business_id)) {
|
|
return [];
|
|
}
|
|
|
|
if (! auth()->user()->can('tms.shipments.view')) {
|
|
return [];
|
|
}
|
|
|
|
return [
|
|
[
|
|
'tab_menu_path' => 'tms::contact.partial.tab_menu',
|
|
'tab_content_path' => 'tms::contact.partial.tab_content',
|
|
'tab_data' => [],
|
|
'module_js_path' => 'tms::contact.partial.tab_js',
|
|
],
|
|
];
|
|
}
|
|
|
|
public function transaction_show_actions($data)
|
|
{
|
|
$transaction = $data['transaction'] ?? null;
|
|
if (! $transaction) {
|
|
return '';
|
|
}
|
|
|
|
$module_util = new ModuleUtil();
|
|
if (! $this->isTmsEnabled($module_util, (int) $transaction->business_id)) {
|
|
return '';
|
|
}
|
|
|
|
$html = '';
|
|
|
|
if (in_array($transaction->type, ['sell', 'sell_transfer', 'purchase'], true)) {
|
|
$html .= $this->shipmentTransactionActions($transaction);
|
|
}
|
|
|
|
if (in_array($transaction->type, ['purchase', 'sell'], true)) {
|
|
$html .= $this->customsTransactionActions($transaction);
|
|
}
|
|
|
|
return $html;
|
|
}
|
|
|
|
protected function shipmentTransactionActions($transaction): string
|
|
{
|
|
if (! in_array($transaction->type, ['sell', 'sell_transfer', 'purchase'], true)) {
|
|
return '';
|
|
}
|
|
|
|
if (! auth()->user()->can('tms.shipments.view') && ! auth()->user()->can('tms.shipments.create')) {
|
|
return '';
|
|
}
|
|
|
|
$shipment = Shipment::where('business_id', $transaction->business_id)
|
|
->where('transaction_id', $transaction->id)
|
|
->first();
|
|
|
|
$tmsUtil = app(TmsUtil::class);
|
|
|
|
return view('tms::integrations.transaction_actions', [
|
|
'transaction' => $transaction,
|
|
'shipment' => $shipment,
|
|
'statuses' => $tmsUtil->shipmentStatuses(),
|
|
])->render();
|
|
}
|
|
|
|
protected function customsTransactionActions($transaction): string
|
|
{
|
|
if (! auth()->user()->can('tms.customs.view') && ! auth()->user()->can('tms.customs.create')) {
|
|
return '';
|
|
}
|
|
|
|
$clearance = CustomsClearance::where('business_id', $transaction->business_id)
|
|
->where('transaction_id', $transaction->id)
|
|
->with('shipment:id,ref_no')
|
|
->first();
|
|
|
|
return view('tms::integrations.customs_transaction_actions', [
|
|
'transaction' => $transaction,
|
|
'clearance' => $clearance,
|
|
'shipment' => $clearance?->shipment ?? Shipment::where('business_id', $transaction->business_id)->where('transaction_id', $transaction->id)->first(),
|
|
])->render();
|
|
}
|
|
|
|
public function get_additional_script()
|
|
{
|
|
if (! \Module::has('Tms') || ! \Module::isEnabled('Tms')) {
|
|
return [];
|
|
}
|
|
|
|
$module_util = new ModuleUtil();
|
|
$business_id = (int) session()->get('user.business_id', 0);
|
|
if (! $business_id || ! $this->isTmsEnabled($module_util, $business_id)) {
|
|
return [];
|
|
}
|
|
|
|
$createUrl = url('tms/shipments/from-transaction/__ID__');
|
|
$customsUrl = url('tms/customs/from-transaction/__ID__');
|
|
|
|
return [
|
|
'additional_js' => '<script type="text/javascript">
|
|
$(document).on("click", ".tms-create-shipment-btn", function(e) {
|
|
e.preventDefault();
|
|
var btn = $(this);
|
|
var txnId = btn.data("transaction-id");
|
|
if (!txnId || btn.prop("disabled")) return;
|
|
btn.prop("disabled", true);
|
|
$.ajax({
|
|
method: "POST",
|
|
url: "'.e($createUrl).'".replace("__ID__", txnId),
|
|
data: { _token: "'.csrf_token().'" },
|
|
dataType: "json",
|
|
success: function(res) {
|
|
if (res.success) {
|
|
toastr.success(res.msg);
|
|
if (res.redirect) { window.location.href = res.redirect; }
|
|
else { btn.closest(".modal").modal("hide"); }
|
|
} else {
|
|
toastr.error(res.msg || LANG.something_went_wrong);
|
|
btn.prop("disabled", false);
|
|
}
|
|
},
|
|
error: function() {
|
|
toastr.error(LANG.something_went_wrong);
|
|
btn.prop("disabled", false);
|
|
}
|
|
});
|
|
});
|
|
$(document).on("click", ".tms-create-customs-btn", function(e) {
|
|
e.preventDefault();
|
|
var btn = $(this);
|
|
var txnId = btn.data("transaction-id");
|
|
if (!txnId || btn.prop("disabled")) return;
|
|
btn.prop("disabled", true);
|
|
$.ajax({
|
|
method: "POST",
|
|
url: "'.e($customsUrl).'".replace("__ID__", txnId),
|
|
data: { _token: "'.csrf_token().'" },
|
|
dataType: "json",
|
|
success: function(res) {
|
|
if (res.success) {
|
|
toastr.success(res.msg);
|
|
if (res.redirect) { window.open(res.redirect, "_blank"); }
|
|
else { btn.closest(".modal").modal("hide"); }
|
|
} else {
|
|
toastr.error(res.msg || LANG.something_went_wrong);
|
|
btn.prop("disabled", false);
|
|
}
|
|
},
|
|
error: function() {
|
|
toastr.error(LANG.something_went_wrong);
|
|
btn.prop("disabled", false);
|
|
}
|
|
});
|
|
});
|
|
</script>',
|
|
];
|
|
}
|
|
|
|
public function dashboard_widget()
|
|
{
|
|
$module_util = new ModuleUtil();
|
|
$business_id = (int) request()->session()->get('user.business_id');
|
|
|
|
if (! $this->isTmsEnabled($module_util, $business_id) || ! auth()->user()->can('tms.shipments.view')) {
|
|
return [];
|
|
}
|
|
|
|
$pending = \Modules\Tms\Models\Shipment::where('business_id', $business_id)
|
|
->whereIn('status', ['draft', 'scheduled', 'in_transit'])
|
|
->count();
|
|
|
|
return [
|
|
'position' => 'top_left',
|
|
'widget' => view('tms::dashboard.widget', compact('pending'))->render(),
|
|
];
|
|
}
|
|
|
|
public function modifyAdminMenu()
|
|
{
|
|
if (! \Module::has('Tms') || ! \Module::isEnabled('Tms')) {
|
|
return;
|
|
}
|
|
|
|
$business_id = session()->get('user.business_id');
|
|
$module_util = new ModuleUtil();
|
|
|
|
if (! $this->isTmsEnabled($module_util, (int) $business_id)) {
|
|
return;
|
|
}
|
|
|
|
$user = auth()->user();
|
|
if (! $user->can('tms.access') && ! $user->can('tms.view')) {
|
|
return;
|
|
}
|
|
|
|
Menu::modify('admin-sidebar-menu', function ($menu) {
|
|
$menu->dropdown(
|
|
__('tms::lang.module_name'),
|
|
function ($sub) {
|
|
$user = auth()->user();
|
|
|
|
if ($user->can('tms.view') || $user->can('tms.access')) {
|
|
$sub->url(
|
|
action([DashboardController::class, 'index']),
|
|
__('tms::lang.dashboard'),
|
|
['active' => request()->segment(1) == 'tms' && request()->segment(2) == 'dashboard']
|
|
);
|
|
}
|
|
|
|
if ($user->can('tms.shipments.view')) {
|
|
$sub->url(
|
|
action([ShipmentController::class, 'index']),
|
|
__('tms::lang.shipments'),
|
|
['active' => request()->segment(2) == 'shipments']
|
|
);
|
|
}
|
|
|
|
if ($user->can('tms.vehicles.view')) {
|
|
$sub->url(
|
|
action([VehicleController::class, 'index']),
|
|
__('tms::lang.vehicles'),
|
|
['active' => request()->segment(2) == 'vehicles']
|
|
);
|
|
}
|
|
|
|
if ($user->can('tms.drivers.view')) {
|
|
$sub->url(
|
|
action([DriverController::class, 'index']),
|
|
__('tms::lang.drivers'),
|
|
['active' => request()->segment(2) == 'drivers']
|
|
);
|
|
}
|
|
|
|
if ($user->can('tms.carriers.view')) {
|
|
$sub->url(
|
|
action([CarrierController::class, 'index']),
|
|
__('tms::lang.carriers'),
|
|
['active' => request()->segment(2) == 'carriers']
|
|
);
|
|
}
|
|
|
|
if ($user->can('tms.customs.view')) {
|
|
$sub->url(
|
|
action([\Modules\Tms\Http\Controllers\CustomsClearanceController::class, 'index']),
|
|
__('tms::lang.customs'),
|
|
['active' => request()->segment(2) == 'customs']
|
|
);
|
|
}
|
|
|
|
if ($user->can('tms.brokers.view')) {
|
|
$sub->url(
|
|
action([\Modules\Tms\Http\Controllers\CustomsBrokerController::class, 'index']),
|
|
__('tms::lang.brokers'),
|
|
['active' => request()->segment(2) == 'brokers']
|
|
);
|
|
}
|
|
|
|
if ($user->can('tms.routes.view')) {
|
|
$sub->url(
|
|
action([RouteController::class, 'index']),
|
|
__('tms::lang.routes'),
|
|
['active' => request()->segment(2) == 'routes']
|
|
);
|
|
}
|
|
|
|
if ($user->can('tms.tracking.view')) {
|
|
$sub->url(
|
|
action([TrackingController::class, 'index']),
|
|
__('tms::lang.live_tracking'),
|
|
['active' => request()->segment(2) == 'tracking']
|
|
);
|
|
}
|
|
|
|
if ($user->can('tms.tracking.report')) {
|
|
$sub->url(
|
|
action([DriverTrackController::class, 'index']),
|
|
__('tms::lang.driver_gps'),
|
|
['active' => request()->segment(2) == 'driver']
|
|
);
|
|
}
|
|
|
|
if ($user->can('tms.access')) {
|
|
$sub->url(
|
|
action([SettingsController::class, 'index']),
|
|
__('tms::lang.settings'),
|
|
['active' => request()->segment(2) == 'settings']
|
|
);
|
|
}
|
|
},
|
|
['icon' => MenuIcons::svg('truck'), 'active' => request()->segment(1) == 'tms', 'data-module' => 'Tms', 'data-menu-group' => 'integrations']
|
|
)->order(86);
|
|
});
|
|
}
|
|
|
|
protected function isTmsEnabled(ModuleUtil $module_util, int $business_id): bool
|
|
{
|
|
if (! \Module::has('Tms') || ! \Module::isEnabled('Tms')) {
|
|
return false;
|
|
}
|
|
|
|
if (! $module_util->isModuleInstalled('Tms')) {
|
|
return false;
|
|
}
|
|
|
|
if ($module_util->isSuperadminInstalled()) {
|
|
return (bool) $module_util->hasThePermissionInSubscription($business_id, 'tms_module');
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|