ultimatepos/Modules/Tms/Http/Controllers/DataController.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;
}
}