ultimatepos/Modules/ProfessionalProject/Http/Controllers/DataController.php

226 lines
10 KiB
PHP

<?php
namespace Modules\ProfessionalProject\Http\Controllers;
use App\Http\MenuIcons;
use App\Utils\ModuleUtil;
use Illuminate\Routing\Controller;
use Menu;
use Modules\ProfessionalProject\Entities\PpProjectCategory;
use Modules\ProfessionalProject\Entities\PpTask;
class DataController extends Controller
{
public function parse_notification($notification)
{
if ($notification->type !== 'Modules\ProfessionalProject\Notifications\NewTaskAssignedNotification') {
return [];
}
$data = $notification->data;
$task = PpTask::with('project')->find($data['pp_task_id'] ?? null);
if (empty($task)) {
return [];
}
return [
'msg' => __(
'professionalproject::lang.new_task_assigned_notification',
[
'created_by' => $data['actor_name'] ?? __('lang_v1.unknown'),
'subject' => $task->title,
]
),
'icon_class' => 'fas fa-tasks bg-green',
'link' => action([\Modules\ProfessionalProject\Http\Controllers\ProjectController::class, 'show'], ['id' => $task->project_id]).'?tab=tasks',
'read_at' => $notification->read_at,
'created_at' => format_relative_time($notification->created_at),
];
}
public function superadmin_package()
{
return [
[
'name' => 'professional_project_module',
'label' => __('professionalproject::lang.module_name'),
'default' => false,
],
];
}
public function user_permissions()
{
return [
['value' => 'professionalproject.access', 'label' => __('professionalproject::lang.access'), 'default' => false],
['value' => 'professionalproject.create_project', 'label' => __('professionalproject::lang.create_project'), 'default' => false],
['value' => 'professionalproject.edit_project', 'label' => __('professionalproject::lang.edit_project'), 'default' => false],
['value' => 'professionalproject.delete_project', 'label' => __('professionalproject::lang.delete_project'), 'default' => false],
['value' => 'professionalproject.create_task', 'label' => __('professionalproject::lang.create_task'), 'default' => false],
['value' => 'professionalproject.edit_task', 'label' => __('professionalproject::lang.edit_task'), 'default' => false],
['value' => 'professionalproject.delete_task', 'label' => __('professionalproject::lang.delete_task'), 'default' => false],
['value' => 'professionalproject.manage_milestones', 'label' => __('professionalproject::lang.manage_milestones'), 'default' => false],
['value' => 'professionalproject.view_gantt', 'label' => __('professionalproject::lang.view_gantt'), 'default' => false],
['value' => 'professionalproject.manage_task_statuses', 'label' => __('professionalproject::lang.manage_task_statuses'), 'default' => false],
];
}
public function modifyAdminMenu()
{
if (! \Module::has('ProfessionalProject') || ! \Module::isEnabled('ProfessionalProject') || ! auth()->user()->can('professionalproject.access')) {
return;
}
$business_id = (int) session()->get('user.business_id');
$categories = PpProjectCategory::forBusiness($business_id)
->orderBy('position')
->orderBy('name')
->get();
$unified_projects_menu = (bool) config('menu_consolidation.unified_projects_menu', true);
$module_util = new ModuleUtil();
$is_legacy_project_enabled = (bool) $module_util->hasThePermissionInSubscription($business_id, 'project_module');
Menu::modify('admin-sidebar-menu', function ($menu) use ($categories, $unified_projects_menu, $is_legacy_project_enabled) {
if ($unified_projects_menu) {
$menu->dropdown(
__('lang_v1.unified_projects_menu'),
function ($sub) use ($categories, $is_legacy_project_enabled) {
if ($is_legacy_project_enabled) {
$sub->header(__('lang_v1.projects_operational'));
$sub->url(
action([\Modules\Project\Http\Controllers\ProjectController::class, 'index']).'?project_view=list_view',
__('lang_v1.projects_operational'),
['active' => request()->segment(1) == 'project' || request()->get('type') == 'project']
);
}
$sub->header(__('lang_v1.projects_professional_pm'));
self::addProfessionalProjectCoreLinks($sub);
},
[
'icon' => MenuIcons::svg('briefcase'),
'active' => request()->segment(1) == 'professional-project'
|| request()->segment(1) == 'project',
'data-module' => 'ProfessionalProject',
'data-menu-group' => 'engineering',
]
)->order(85);
self::addProjectCategoriesDropdown($menu, $categories);
return;
}
$menu->dropdown(
__('professionalproject::lang.module_name'),
function ($sub) {
self::addProfessionalProjectCoreLinks($sub);
},
['icon' => MenuIcons::svg('briefcase'), 'active' => request()->segment(1) == 'professional-project' && ! request()->filled('filter_category'), 'data-module' => 'ProfessionalProject', 'data-menu-group' => 'engineering']
)->order(85);
self::addProjectCategoriesDropdown($menu, $categories);
});
}
protected static function addProfessionalProjectCoreLinks($sub): void
{
$sub->url(
action([\Modules\ProfessionalProject\Http\Controllers\ProjectController::class, 'index']).'?view=list',
__('professionalproject::lang.projects'),
['active' => request()->segment(1) == 'professional-project'
&& request()->segment(2) == 'projects'
&& request()->get('view', 'list') === 'list'
&& ! request()->filled('filter_category')]
);
$sub->url(
action([\Modules\ProfessionalProject\Http\Controllers\ProjectController::class, 'index']).'?view=kanban',
__('professionalproject::lang.kanban_board').' — '.__('professionalproject::lang.projects'),
['active' => request()->segment(1) == 'professional-project'
&& request()->segment(2) == 'projects'
&& request()->get('view') === 'kanban'
&& ! request()->filled('filter_category')]
);
$sub->url(
action([\Modules\ProfessionalProject\Http\Controllers\TaskController::class, 'index']),
__('professionalproject::lang.tasks'),
['active' => request()->segment(2) == 'tasks']
);
if (auth()->user()->can('professionalproject.manage_task_statuses')) {
$sub->url(
action([\Modules\ProfessionalProject\Http\Controllers\TaskStatusController::class, 'index']),
__('professionalproject::lang.task_statuses'),
['active' => request()->segment(2) == 'task-statuses']
);
}
}
protected static function addProjectCategoriesDropdown($menu, $categories): void
{
if (! ($categories->isNotEmpty() || (
\Module::has('ManagementTools')
&& \Module::isEnabled('ManagementTools')
&& auth()->user()->can('managementtools.access')
&& (auth()->user()->can('managementtools.manage_employee_tasks')
|| auth()->user()->can('managementtools.manage_project_categories'))
))) {
return;
}
$menu->dropdown(
__('professionalproject::lang.project_categories'),
function ($sub) use ($categories) {
self::addCategoryLinks($sub, $categories);
if (\Module::has('ManagementTools')
&& \Module::isEnabled('ManagementTools')
&& auth()->user()->can('managementtools.access')
&& (auth()->user()->can('managementtools.manage_employee_tasks')
|| auth()->user()->can('managementtools.manage_project_categories'))) {
$sub->url(
action([\Modules\ManagementTools\Http\Controllers\ProjectCategoryController::class, 'index']),
__('professionalproject::lang.manage_categories'),
[
'icon' => MenuIcons::child('settings'),
'active' => request()->segment(1) == 'management-tools'
&& request()->segment(2) == 'project-categories',
]
);
}
},
[
'icon' => MenuIcons::child('folder'),
'active' => (request()->segment(1) == 'professional-project' && request()->filled('filter_category'))
|| (request()->segment(1) == 'management-tools' && request()->segment(2) == 'project-categories'),
'data-module' => 'ProfessionalProject',
'data-menu-group' => 'engineering',
]
)->order(84);
}
protected static function addCategoryLinks($sub, $categories, ?int $parent_id = null, int $depth = 0): void
{
$children = $parent_id === null
? $categories->whereNull('parent_id')
: $categories->where('parent_id', $parent_id);
foreach ($children as $category) {
$icon = ! empty($category->icon) ? $category->icon : 'fa fa-folder';
$label = str_repeat('— ', $depth).$category->name;
$sub->url(
action([\Modules\ProfessionalProject\Http\Controllers\ProjectController::class, 'index'])
.'?view=list&filter_category='.$category->id,
$label,
[
'icon' => $icon,
'active' => request()->segment(1) == 'professional-project'
&& request()->segment(2) == 'projects'
&& (string) request()->get('filter_category') === (string) $category->id,
]
);
self::addCategoryLinks($sub, $categories, $category->id, $depth + 1);
}
}
}