ultimatepos/app/Utils/ModuleUtil.php

551 lines
18 KiB
PHP

<?php
namespace App\Utils;
use App\Account;
use App\BusinessLocation;
use App\Product;
use App\System;
use App\Transaction;
use App\User;
use Composer\Semver\Comparator;
use Module;
class ModuleUtil extends Util
{
/**
* This function check if a module is installed or not.
*
* @param string $module_name (Exact module name, with first letter capital)
* @return bool
*/
public function isModuleInstalled($module_name)
{
$is_available = Module::has($module_name);
if ($is_available) {
//Check if installed by checking the system table {module_name}_version
$module_version = System::getProperty(strtolower($module_name).'_version');
if (empty($module_version)) {
return false;
} else {
return true;
}
}
return false;
}
/**
* This function check if superadmin module is installed or not.
*
* @return bool
*/
public function isSuperadminInstalled()
{
return $this->isModuleInstalled('Superadmin');
}
/**
* This function check if a function provided exist in all modules
* DataController, merges the data and returned it.
*
* @param string $function_name
* @return array
*/
public function getModuleData($function_name, $arguments = null, $get_data_from_modules = [])
{
$modules = Module::toCollection()->toArray();
$installed_modules = [];
foreach ($modules as $module => $details) {
if ($this->isModuleInstalled($details['name'])) {
$installed_modules[] = $details;
}
}
// If specific module names are provided, filter the installed modules
if (!empty($get_data_from_modules) && is_array($get_data_from_modules)) {
$installed_modules = array_filter($installed_modules, function ($module) use ($get_data_from_modules) {
return in_array($module['name'], $get_data_from_modules);
});
}
$data = [];
if (! empty($installed_modules)) {
foreach ($installed_modules as $module) {
$class = 'Modules\\'.$module['name'].'\Http\Controllers\DataController';
if (class_exists($class)) {
$class_object = new $class();
if (method_exists($class_object, $function_name)) {
if (! empty($arguments)) {
$data[$module['name']] = call_user_func([$class_object, $function_name], $arguments);
} else {
$data[$module['name']] = call_user_func([$class_object, $function_name]);
}
}
}
}
}
return $data;
}
/**
* Checks if a module is defined
*
* @param string $module_name
* @return bool
*/
public function isModuleDefined($module_name)
{
$is_installed = $this->isModuleInstalled($module_name);
$check_for_enable = [];
$output = ! empty($is_installed) ? true : false;
if (in_array($module_name, $check_for_enable) &&
! $this->isModuleEnabled(strtolower($module_name))) {
$output = false;
}
return $output;
}
/**
* This function check if a business has active subscription packages
*
* @param int $business_id
* @return bool
*/
public function isSubscribed($business_id)
{
if ($this->isSuperadminInstalled()) {
$package = \Modules\Superadmin\Entities\Subscription::active_subscription($business_id);
if (empty($package)) {
return false;
}
}
return true;
}
/**
* This function checks if a business has
*
* @param int $business_id
* @param string $permission
* @param string $callback_function = null
* @return bool
*/
public function hasThePermissionInSubscription($business_id, $permission, $callback_function = null)
{
if ($this->isSuperadminInstalled()) {
if (auth()->user()->can('superadmin')) {
return true;
}
$package = \Modules\Superadmin\Entities\Subscription::active_subscription($business_id);
if (empty($package)) {
return false;
} elseif (isset($package['package_details'][$permission])) {
if (! is_null($callback_function)) {
$obj = new ModuleUtil();
$permissions = $obj->getModuleData($callback_function);
$permission_formatted = [];
foreach ($permissions as $per) {
foreach ($per as $details) {
$permission_formatted[$details['name']] = $details['label'];
}
}
if (isset($permission_formatted[$permission])) {
return $package['package_details'][$permission];
} else {
return false;
}
} else {
return $package['package_details'][$permission];
}
} else {
return false;
}
}
return true;
}
/**
* Returns the name of view used to display for subscription expired.
*
* @return string
*/
public static function expiredResponse($redirect_url = null)
{
$response_array = ['success' => 0,
'msg' => __(
'superadmin::lang.subscription_expired_toastr',
['app_name' => config('app.name'),
'subscribe_url' => action([\Modules\Superadmin\Http\Controllers\SubscriptionController::class, 'index']),
]
),
];
if (request()->ajax()) {
if (request()->wantsJson()) {
return $response_array;
} else {
return view('superadmin::subscription.subscription_expired_modal');
}
} else {
if (is_null($redirect_url)) {
return back()
->with('status', $response_array);
} else {
return redirect($redirect_url)
->with('status', $response_array);
}
}
}
public function countBusinessLocation($business_id)
{
$count = BusinessLocation::where('business_id', $business_id)
->count();
return $count;
}
public function countUsers($business_id)
{
$count = User::where('business_id', $business_id)
->where('allow_login', 1)
->count();
return $count;
}
public function countProducts($business_id, $start_dt, $end_dt)
{
$query = Product::where('business_id', $business_id);
if (! empty($start_dt) && ! empty($start_dt)) {
$query->whereBetween('created_at', [$start_dt, $end_dt]);
}
$count = $query->count();
return $count;
}
public function countInvoice($business_id, $start_dt, $end_dt)
{
$query = Transaction::where('business_id', $business_id)
->where('type', 'sell')
->where('status', 'final');
if (! empty($start_dt) && ! empty($start_dt)) {
$query->whereBetween('created_at', [$start_dt, $end_dt]);
}
$count = $query->count();
return $count;
}
public function getResourceCount($business_id, $package)
{
$is_available = $this->isSuperadminInstalled();
$start_dt = null;
$end_dt = null;
if (! empty($package)) {
$start_dt = $package->start_date->toDateTimeString();
$end_dt = $package->end_date->endOfDay()->toDateTimeString();
}
$output = [
'locations_created' => $this->countBusinessLocation($business_id),
'users_created' => $this->countUsers($business_id),
'products_created' => $this->countProducts($business_id, $start_dt, $end_dt),
'invoices_created' => $this->countInvoice($business_id, $start_dt, $end_dt),
];
return $output;
}
/**
* This function check if a business has available quota for various types.
*
* @param string $type
* @param int $business_id
* @param int $total_rows default 0
* @return bool
*/
public function isQuotaAvailable($type, $business_id, $total_rows = 0)
{
$is_available = $this->isSuperadminInstalled();
if ($is_available) {
$package = \Modules\Superadmin\Entities\Subscription::active_subscription($business_id);
if (empty($package)) {
return false;
}
//Start
$start_dt = $package->start_date->toDateTimeString();
$end_dt = $package->end_date->endOfDay()->toDateTimeString();
if ($type == 'locations') {
//Check for available location and max number allowed.
$max_allowed = isset($package->package_details['location_count']) ? $package->package_details['location_count'] : 0;
if ($max_allowed == 0) {
return true;
} else {
$count = $this->countBusinessLocation($business_id);
if ($count >= $max_allowed) {
return false;
}
}
} elseif ($type == 'users') {
//Check for available location and max number allowed.
$max_allowed = isset($package->package_details['user_count']) ? $package->package_details['user_count'] : 0;
if ($max_allowed == 0) {
return true;
} else {
$count = $this->countUsers($business_id);
if ($count >= $max_allowed) {
return false;
}
}
} elseif ($type == 'products') {
$max_allowed = isset($package->package_details['product_count']) ? $package->package_details['product_count'] : 0;
if ($max_allowed == 0) {
return true;
} else {
$count = $this->countProducts($business_id, $start_dt, $end_dt);
$total_products = $count + $total_rows;
if ($total_products >= $max_allowed) {
return false;
}
}
} elseif ($type == 'invoices') {
$max_allowed = isset($package->package_details['invoice_count']) ? $package->package_details['invoice_count'] : 0;
if ($max_allowed == 0) {
return true;
} else {
$count = $this->countInvoice($business_id, $start_dt, $end_dt);
if ($count >= $max_allowed) {
return false;
}
}
}
}
return true;
}
/**
* This function returns the response for expired quota
*
* @param string $type
* @param int $business_id
* @param string $redirect_url = null
* @return \Illuminate\Http\Response
*/
public function quotaExpiredResponse($type, $business_id, $redirect_url = null)
{
if ($type == 'locations') {
if (request()->ajax()) {
if (request()->wantsJson()) {
$response_array = ['success' => 0,
'msg' => __('superadmin::lang.max_locations'),
];
return $response_array;
} else {
return view('superadmin::subscription.max_location_modal');
}
}
} elseif ($type == 'users') {
$response_array = ['success' => 0,
'msg' => __('superadmin::lang.max_users'),
];
return redirect($redirect_url)
->with('status', $response_array);
} elseif ($type == 'products') {
$response_array = ['success' => 0,
'msg' => __('superadmin::lang.max_products'),
];
return redirect($redirect_url)
->with('status', $response_array);
} elseif ($type == 'invoices') {
$response_array = ['success' => 0,
'msg' => __('superadmin::lang.max_invoices'),
];
if (request()->wantsJson()) {
return $response_array;
} else {
return redirect($redirect_url)
->with('status', $response_array);
}
}
}
public function accountsDropdown($business_id, $prepend_none = false, $closed = false, $show_balance = false)
{
$dropdown = [];
if ($this->isModuleEnabled('account')) {
$dropdown = Account::forDropdown($business_id, $prepend_none, $closed, $show_balance);
}
return $dropdown;
}
/**
* This function returns the extra form fields in array format
* required by any module which will be included during adding
* or updating a resource
*
* @param string $function_name function name to be called to get data from
* @return array
*/
public function getModuleFormField($function_name)
{
$form_fields = [];
$module_form_fields = $this->getModuleData($function_name);
if (! empty($module_form_fields)) {
foreach ($module_form_fields as $key => $value) {
if (! empty($value) && is_array($value)) {
$form_fields = array_merge($form_fields, $value);
}
}
}
return $form_fields;
}
public function getApiSettings($api_token)
{
$settings = \Modules\Ecommerce\Entities\EcomApiSetting::where('api_token', $api_token)
->first();
return $settings;
}
/**
* This function returns the installed version, available version
* and uses comparator to check if update is available or not.
*
* @param string $module_name (Exact module name, with first letter capital)
* @return array
*/
public function getModuleVersionInfo($module_name)
{
$output = ['installed_version' => null,
'available_version' => null,
'is_update_available' => null,
];
$is_available = Module::has($module_name);
if ($is_available) {
//Check if installed by checking the system table {module_name}_version
$module_version = System::getProperty(strtolower($module_name).'_version');
$output['installed_version'] = $module_version;
$output['available_version'] = config(strtolower($module_name).'.module_version');
$output['is_update_available'] = Comparator::greaterThan($output['available_version'], $output['installed_version']);
}
return $output;
}
public function availableModules()
{
return [
'purchases' => ['name' => __('purchase.purchases')],
'add_sale' => ['name' => __('sale.add_sale')],
'pos_sale' => ['name' => __('sale.pos_sale')],
'stock_transfers' => ['name' => __('lang_v1.stock_transfers')],
'stock_adjustment' => ['name' => __('stock_adjustment.stock_adjustment')],
'expenses' => ['name' => __('expense.expenses')],
'account' => ['name' => __('lang_v1.account')],
'tables' => ['name' => __('restaurant.tables'),
'tooltip' => __('restaurant.tooltip_tables'),
],
'modifiers' => ['name' => __('restaurant.modifiers'),
'tooltip' => __('restaurant.tooltip_modifiers'),
],
'service_staff' => [
'name' => __('restaurant.service_staff'),
'tooltip' => __('restaurant.tooltip_service_staff'),
],
'booking' => ['name' => __('lang_v1.enable_booking')],
'kitchen' => [
'name' => __('restaurant.kitchen_for_restaurant'),
],
'subscription' => ['name' => __('lang_v1.enable_subscription')],
'types_of_service' => ['name' => __('lang_v1.types_of_service'),
'tooltip' => __('lang_v1.types_of_service_help_long'),
],
];
}
/**
* Validate module category types and
* return module category data if validates
*
* @param string $category_type
* @return array
*/
public function getTaxonomyData($category_type)
{
$category_types = ['product'];
$modules_data = $this->getModuleData('addTaxonomies');
// print_r($modules_data);
// exit;
$module_data = [];
foreach ($modules_data as $module => $data) {
foreach ($data as $key => $value) {
//key is category type
//check if category type is duplicate
if (! in_array($key, $category_types)) {
$category_types[] = $key;
} else {
echo __('lang_v1.duplicate_taxonomy_type_found');
exit;
}
if ($category_type == $key) {
$module_data = $value;
}
}
}
if (! in_array($category_type, $category_types)) {
echo __('lang_v1.taxonomy_type_not_found');
exit;
}
return $module_data;
}
}