<?php
namespace App\Model;
use Pimcore\Model\DataObject\Customer;
use Symfony\Component\HttpFoundation\Request;
use Pimcore\Model\DataObject;
use App\Model\InvitationModel;
use App\Model\UserModel;
use App\Model\PackageModel;
use App\Model\LocationModel;
use App\Service\UserPermission;
use Pimcore\Model\DataObject\UserRole;
use Pimcore\Model\DataObject\UserTag;
use Carbon\Carbon;
use Psr\Log\LoggerInterface;
use Doctrine\DBAL\Connection;
use App\Service\NCMCRMIntegrationService;
use App\Model\ReportingPortalModel;
use App\Model\WeatherParameterModel;
use App\Model\EwsPortalModel;
use Pimcore\Model\DataObject\Organization;
use Pimcore\Model\DataObject\PermissionGroup;
class OrganizationModel
{
public $userModel;
public $invitationModel;
public $organizationModel;
public $locationModel;
private $userPermission;
private $crmService;
private $reportingPortalModel;
private $ewsPortalModel;
private $parameterModel;
private $connection;
function __construct()
{
$this->userModel = new UserModel();
$this->invitationModel = new InvitationModel();
$this->locationModel = new LocationModel();
$this->userPermission = new UserPermission();
$this->crmService = new NCMCRMIntegrationService();
$this->reportingPortalModel = new ReportingPortalModel();
$this->ewsPortalModel = new EwsPortalModel();
$this->parameterModel = new WeatherParameterModel();
}
/**
* Create organization
*
*/
public function createOrganization($request, $params, $loggedInUser, $translator): array
{
try {
$listing = new Organization\Listing();
$listing->setUnpublished(true); // Include unpublished
$listing->setOrderKey('o_id');
$listing->setOrder('DESC');
$listing->setLimit(1);
$last = $listing->current();
$nextNumber = 1;
if ($last instanceof Organization) {
$lastId = $last->getUniqueId(); // e.g. NCM-ENT-00023
if (preg_match('/NCM-ENT-(\d+)/', $lastId, $matches)) {
$nextNumber = (int)$matches[1] + 1;
}
}
// Format: NCM-ENT-00001
$newUniqueId = 'NCM-ENT-' . str_pad($nextNumber, 5, '0', STR_PAD_LEFT);
$result = [];
$orgName = trim(strip_tags($params['name']));
$orgNameAr = trim(strip_tags($params['nameAr']));
$email = trim($params['email']);
$orgCode = trim(strip_tags($params['code']));
//$logo = trim(strip_tags($params['logo']));
$clientType = trim(strip_tags($params['client_type']));
$organization = new DataObject\Organization();
$organization->setParent(DataObject\Service::createFolderByPath('/UserManagement/Organization'));
$organization->setKey($orgName);
$organization->setName($orgName, 'en');
$organization->setName($orgNameAr, 'ar');
$organization->setCode($orgCode);
$organization->setEmail($email);
//$organization->setImage($this->createAssetByURL($logo));
$organization->setCilent_type($clientType);
$organization->setClientType($clientType);
$organization->setStatus($params['entityStatus']);
$organization->setTrialLimit($params['trialLimit']);
$organization->setPackageActivationDate(Carbon::now());
$organization->setPackage($params['package'] ?? null);
$organization->setIsActive(true);
$organization->setCreatedBy($loggedInUser);
$organization->setPublished(true);
$organization->setUniqueId($newUniqueId);
$organization->save();
return ["success" => true, "message" => $translator->trans("organization_created_successifully"), 'data' => $organization];
} catch (\Exception $ex) {
return ["success" => false, "message" => $ex->getMessage()];
}
return $result;
}
/**
* Create Entity
*
*/
public function createEntity($request, $params, $user, $translator): array
{
$package = DataObject\Package::getById($params['packageId'], true);
if (!$package instanceof DataObject\Package) {
return ["success" => false, "message" => $translator->trans("package_not_found")];
}
$entity = DataObject\Organization::getByName($params['name'], 'en', ['limit' => 1, 'unpublished' => true]);
if ($entity instanceof DataObject\Organization) {
return ["success" => false, "message" => $translator->trans("entity_already_exists") . " : " . $params['name']];
}
$createNameEn = trim(strip_tags($params['name']));
$createNameAr = isset($params['nameAr']) ? trim(strip_tags($params['nameAr'])) : $createNameEn;
$orgCode = isset($params['code']) ? trim(strip_tags($params['code'])) : $params['name'];
$clientType = trim(strip_tags($params['clientType']));
$listing = new Organization\Listing();
$listing->setUnpublished(true); // Include unpublished
$listing->setOrderKey('o_id');
$listing->setOrder('DESC');
$listing->setLimit(1);
$last = $listing->current();
$nextNumber = 1;
if ($last instanceof Organization) {
$lastId = $last->getUniqueId(); // e.g. NCM-ENT-00023
if (preg_match('/NCM-ENT-(\d+)/', $lastId, $matches)) {
$nextNumber = (int)$matches[1] + 1;
}
}
// Format: NCM-ENT-00001
$newUniqueId = 'NCM-ENT-' . str_pad($nextNumber, 5, '0', STR_PAD_LEFT);
// $result = $this->reportingPortalModel->createOrganization([
// 'name' => $params['name'],
// 'nameAr' => $params['nameAr'],
// 'code' => isset($params['code']) ? $params['code'] : null,
// 'packageName' => $package->getPackageName('en'),
// 'clientType' => $params['clientType'],
// 'trialLimit' => isset($params['trialLimit']) ? $params['trialLimit'] : null,
// 'status' => isset($params['status']) ? $params['status'] : null,
// 'userEmail' => $user->getEmail(),
// 'uniqueId' => $newUniqueId,
// ]);
$entity = new DataObject\Organization();
$entity->setParent(DataObject\Service::createFolderByPath('/UserManagement/Organization'));
$entity->setKey($createNameEn);
$entity->setName($createNameEn, 'en');
$entity->setName($createNameAr, 'ar');
$entity->setCode($orgCode);
$entity->setClientType($clientType);
$entity->setPackage($package);
if (isset($params['entityStatus']) && !empty($params['entityStatus'])) {
$entity->setStatus($params['entityStatus']);
if (!isset($params['trialLimit']) || empty($params['trialLimit'])) {
if ($params['entityStatus'] === 'trial') {
return ["success" => false, "message" => $translator->trans("trial_limit_is_required")];
} else {
return ["success" => false, "message" => $translator->trans("tenure_is_required")];
}
}
$entity->setTrialLimit($params['trialLimit']);
} else {
// When entityStatus is not sent, set trial limit
if (!isset($params['trialLimit']) || empty($params['trialLimit'])) {
return ["success" => false, "message" => $translator->trans("tenure_is_required")];
}
$entity->setTrialLimit($params['trialLimit']);
}
$entityTag = DataObject\UserTag::getById($params['tagId'], true);
if (isset($params['tagId']) && !empty($params['tagId'])) {
$entity->setTag($entityTag);
}
$entity->setPackageActivationDate(Carbon::parse($params['startDate']));
$entity->setPublished(true);
$entity->setIsActive(false);
$entity->setCreatedBy($user);
$entity->setUniqueId($newUniqueId);
$entity->save();
return ["success" => true, "message" => $translator->trans("entity_created")];
}
/**
* Edit organization
*
*/
public function editOrganization($request, $params, $packageModel, $translator): array
{
$updateOrganization = DataObject\Organization::getById($params['id'], true);
// $result = $this->reportingPortalModel->editOrganization([
// 'name' => $params['name'],
// 'nameAr' => $params['nameAr'],
// 'code' => isset($params['code']) ? $params['code'] : null,
// 'clientType' => isset($params['clientType']) ? $params['clientType'] : null,
// 'trialLimit' => isset($params['trialLimit']) ? $params['trialLimit'] : null,
// 'status' => isset($params['status']) ? $params['status'] : null,
// 'country' => isset($params['country']) ? $params['country'] : null,
// 'state' => isset($params['state']) ? $params['state'] : null,
// 'phone' => isset($params['phone']) ? $params['phone'] : null,
// 'packageId' => isset($params['packageId']) ? $params['packageId'] : null,
// 'uniqueId' => $updateOrganization->getUniqueId(),
// ]);
if ($updateOrganization) {
if (isset($params['name']) && !empty($params['name'])) {
// Check if the name already exists for another organization
$existingOrganization = DataObject\Organization::getByName($params['name'], 'en', ['limit' => 1, 'unpublished' => true]);
if ($existingOrganization && $existingOrganization->getId() !== $updateOrganization->getId()) {
return ["success" => false, "message" => $translator->trans("entity_already_exists") . " : " . $params['name']];
}
$updateOrganization->setName(trim(strip_tags($params['name'])), 'en');
$updateOrganization->setKey(trim(strip_tags($params['name']))); // Update key to match new name
}
if (isset($params['nameAr']) && !empty($params['nameAr'])) {
$updateOrganization->setName(trim(strip_tags($params['nameAr'])), 'ar');
}
// if (isset($params['email']) && !empty($params['email'])) {
// $updateOrganization->setEmail(trim(strip_tags($params['email'])));
// }
if (isset($params['clientType']) && !empty($params['clientType'])) {
$updateOrganization->setClientType(trim(strip_tags($params['clientType'])));
}
if (isset($params['isActive']) && !empty($params['isActive'])) {
$updateOrganization->setIsActive($params['isActive']);
}
if (isset($params['startDate']) && !empty($params['startDate'])) {
$updateOrganization->setPackageActivationDate(Carbon::parse($params['startDate']));
}
if (isset($params['entityStatus']) && !empty($params['entityStatus'])) {
$updateOrganization->setStatus($params['entityStatus']);
if (!isset($params['trialLimit']) || empty($params['trialLimit'])) {
if ($params['entityStatus'] === 'trial') {
return ["success" => false, "message" => $translator->trans("trial_limit_is_required")];
} else {
return ["success" => false, "message" => $translator->trans("tenure_is_required")];
}
}
$updateOrganization->setTrialLimit($params['trialLimit']);
} else {
if (!isset($params['trialLimit']) || empty($params['trialLimit'])) {
return ["success" => false, "message" => $translator->trans("tenure_is_required")];
}
$updateOrganization->setTrialLimit($params['trialLimit']);
}
if (isset($params['isSMSEnabled']) && !empty($params['isSMSEnabled'])) {
$updateOrganization->setIsSMSEnabled($params['isSMSEnabled']);
}
if (isset($params['code']) && !empty($params['code'])) {
$updateOrganization->setCode(trim(strip_tags($params['code'])));
}
if (isset($params['country']) && !empty($params['country'])) {
$updateOrganization->setCountry(trim(strip_tags($params['country'])));
}
if (isset($params['state']) && !empty($params['state'])) {
$updateOrganization->setState(trim(strip_tags($params['state'])));
}
if (isset($params['phone']) && !empty($params['phone'])) {
$updateOrganization->setPhone(trim(strip_tags($params['phone'])));
}
if (isset($params['packageId']) && !empty($params['packageId'])) {
$package = DataObject\Package::getById($params['packageId'], true);
if ($package instanceof DataObject\Package) {
$packageModel->updateEntityPackage($package, $updateOrganization, $translator);
}
}
if (isset($params['tagId']) && !empty($params['tagId'])) {
$entityTag = DataObject\UserTag::getById($params['tagId'], true);
$updateOrganization->setTag($entityTag);
} else {
$updateOrganization->setTag(null);
}
// if (isset($params['logo']) && !empty($params['logo'])) {
// $updateOrganization->setImage($this->createAssetByURL($params['logo']));
// }
$updateOrganization->save();
return ["success" => true, "message" => $translator->trans("organization_updated_successifully")];
}
return ["success" => false, "message" => $translator->trans("organization_does_not_exists")];
}
/**
* List organization
*
*/
public function listOrganizations($request, $params, $translator, $paginator): array
{
$pageSize = isset($params['page_size']) ? $params['page_size'] : LIMIT_PER_PAGE;
$page = isset($params['page']) ? $params['page'] : 1;
$organizations = new DataObject\Organization\Listing();
$organizations->addConditionParam("isInternal IS NULL OR isInternal = 0"); // Exclude internal organizations
if (isset($params['isArchived']) && !empty($params['isArchived'] && $params['isArchived'] == true)) {
$organizations->setUnpublished(true); // Include unpublished
$organizations->addConditionParam("o_published = 0"); // Filter only unpublished
$organizations->addConditionParam("isDeleted = 1"); // Filter only deleted
}
if (isset($params['search']) && !empty($params['search'])) {
$organizations->addConditionParam("name LIKE " . $organizations->quote("%" . $params['search'] . "%"));
}
if (isset($params['packageId']) && !empty($params['packageId'])) {
$organizations->addConditionParam("package__id =?", [$params['packageId']]);
}
if (isset($params['clientType']) && !empty($params['clientType'])) {
$organizations->filterByClientType($params['clientType']);
}
if (isset($params['isActive'])) {
$organizations->filterByIsActive($params['isActive']);
}
if (isset($params['status']) && !empty($params['status'])) {
$organizations->filterByStatus($params['status']);
}
if (isset($params['isSMSEnabled'])) {
$organizations->filterByIsSMSEnabled($params['isSMSEnabled'] ?? false);
}
if (isset($params['tagId'])) {
$tag = DataObject\UserTag::getById($params['tagId']);
if ($tag) {
$organizations->filterByTag($tag);
}
}
//get by customer name
if (isset($params['username'])) {
$organizations->addConditionParam("createdBy__id IN (SELECT u.oo_id FROM object_query_customer u WHERE u.name LIKE ?)", ['%' . $params['username'] . '%']);
}
$orderKeyArray = ["clientType", "o_creationDate", "isSMSEnabled", "isActive", "name", "packageExpiry", "totalAdmins", "totalUsers", "createdBy"];
$orderArray = ["asc", "desc"];
if (isset($params["orderKey"], $params["order"]) && in_array($params["orderKey"], $orderKeyArray) && in_array(strtolower($params["order"]), $orderArray)) {
if ($params["orderKey"] === "packageExpiry") {
$sqlExpression = "CASE
WHEN packageActivationDate IS NULL OR trialLimit IS NULL OR trialLimit <= 0 THEN NULL
WHEN packageActivationDate REGEXP '^[0-9]+$' THEN
DATE_ADD(FROM_UNIXTIME(packageActivationDate), INTERVAL trialLimit DAY)
ELSE
DATE_ADD(packageActivationDate, INTERVAL trialLimit DAY)
END";
$organizations->setOrderKey($sqlExpression, false);
$organizations->setOrder($params["order"]);
} elseif ($params["orderKey"] === "totalAdmins") {
// Order by total client admins per organization using a correlated subquery
$clientAdminRole = DataObject\UserRole::getByName(USER_ROLES['CLIENT_ADMIN'], true);
$clientAdminRoleId = $clientAdminRole instanceof DataObject\UserRole ? (int)$clientAdminRole->getId() : 0;
// Use the correct table reference for the outer query when localized tables are used
$organizations->setOrderKey("
(SELECT COUNT(*)
FROM object_customer c
WHERE c.organization__id = object_localized_organization_en.o_id AND c.role__id = {$clientAdminRoleId})
", false);
$organizations->setOrder($params["order"]);
} elseif (($params["orderKey"] === "totalUsers")) {
// Order by total client users per organization using a correlated subquery
$clientUserRole = DataObject\UserRole::getByName(USER_ROLES['CLIENT_USER'], true);
$clientUserRoleId = $clientUserRole instanceof DataObject\UserRole ? (int)$clientUserRole->getId() : 0;
// Use the correct table reference for the outer query when localized tables are used
$organizations->setOrderKey("
(SELECT COUNT(*)
FROM object_customer c
WHERE c.organization__id = object_localized_organization_en.o_id AND c.role__id = {$clientUserRoleId})
", false);
$organizations->setOrder($params["order"]);
} elseif (($params["orderKey"] === "createdBy")) {
$organizations->setOrderKey("
COALESCE(
(SELECT c.name
FROM object_customer c
WHERE c.oo_id = (
SELECT o.createdBy__id
FROM object_organization o
WHERE o.o_id = object_localized_organization_en.o_id
LIMIT 1
)
LIMIT 1),
''
)
", false);
$organizations->setOrder($params["order"]);
} else {
$organizations->setOrderKey($params["orderKey"]);
$organizations->setOrder($params["order"]);
}
}else{
$organizations->setOrderKey("o_creationDate");
$organizations->setOrder("desc");
}
$paginator = $paginator->paginate(
$organizations,
$page,
$pageSize
);
$organizationsListData = [];
foreach ($paginator as $organization) {
$packageData = [];
$trialLeftDays = null;
if ($organization instanceof DataObject\Organization) {
if ($organization->getPackage() instanceof DataObject\Package) {
$packageData = [
"id" => $organization->getPackage()->getId(),
"nameEn" => $organization->getPackage()->getPackageName("en"),
"nameAr" => $organization->getPackage()->getPackageName("ar"),
"packageExpiry" => $this->calculatePackageExpiry($organization)
];
}
// if ($organization->getIsActive()) {
$trialLeftDays = \App\Lib\Utility::getTrialLeftDays($organization->getPackageActivationDate(), $organization->getTrialLimit());
// }
$clientType = $organization ? $organization->getClientType() : '';
$entityTypeArray = [
"key" => $clientType,
'nameEn' => $clientType === 'organization' ? 'Entity' : ($clientType ? $translator->trans($clientType, [], null, 'en') : ''),
'nameAr' => $clientType === 'organization' ? 'الجهة' : ($clientType ? $translator->trans($clientType, [], null, 'ar') : ''),
];
$organizationsListData[] = [
"id" => $organization->getId(),
"nameEn" => $organization->getName("en"),
"nameAr" => $organization->getName("ar"),
"code" => $organization->getCode(),
"city" => $organization->getCity(),
"state" => $organization->getState(), // Province or Region
"zip" => $organization->getZip(),
"email" => $organization->getEmail(),
"country" => $organization->getCountry(),
"isActive" => !$organization->getIsSuspend() && $organization->getIsActive(),
"isSuspended" => $organization->getIsSuspend() ? true : false,
"assignedPackage" => $packageData,
"createdAt" => (new \DateTime())->setTimestamp($organization->getCreationDate())->format('Y-m-d H:i:s'),
"updatedAt" => (new \DateTime())->setTimestamp($organization->getModificationDate())->format('Y-m-d H:i:s'),
"adminUserCount" => $this->getUserCountByEntity($organization, USER_ROLES['CLIENT_ADMIN']),
"userCount" => $this->getUserCountByEntity($organization, USER_ROLES['CLIENT_USER']),
"status" => $organization->getStatus(),
"isSMSEnabled" => $organization->getIsSMSEnabled() ? true : false,
"entityType" => $entityTypeArray,
'trialLeftDays' => $organization->getTrialLimit() ? $organization->getTrialLimit() : null,
"smsConsumption" => $organization->getSmsConsumption(),
"SMSLimit" => $organization->getSmsLimit(),
"createdBy" => $organization->getCreatedBy() ? $organization->getCreatedBy()->getName() : null,
"startDate" => $organization->getPackageActivationDate() ? (new \DateTime($organization->getPackageActivationDate()))->setTimezone(new \DateTimeZone('Asia/Riyadh'))->format('Y-m-d') : null,
"tag" => $organization->getTag() ? [
"id" => $organization->getTag()->getId(),
"name" => $organization->getTag()->getName()
] : null,
"endDate" => $organization->getPackageActivationDate() && isset($trialLeftDays)
? (clone (new \DateTime($organization->getPackageActivationDate())))
->add(new \DateInterval('P' . (int)$organization->getTrialLimit() . 'D'))
->setTimezone(new \DateTimeZone('Asia/Riyadh'))
->format('Y-m-d')
: null,
];
}
}
return ["success" => true, "data" => $organizationsListData, 'paginationVariables' => $paginator->getPaginationData()];
}
private function getUserCountByEntity($organization, $roleName = null)
{
// force to return all objects including unpublished ones, even if setUnpublished is set to false
\Pimcore\Model\DataObject::setHideUnpublished(false);
$customers = new Customer\Listing();
$customers->filterByOrganization($organization);
if ($roleName) {
$role = DataObject\UserRole::getByName($roleName, true);
$customers->filterByRole($role);
}
return $customers->getCount();
}
/**
* Delete organization
*
*/
public function deleteOrganization($user, $params, $translator): array
{
$ids = is_array($params['id']) ? $params['id'] : [$params['id']];
$results = [];
foreach ($ids as $orgId) {
$entity = DataObject\Organization::getById($orgId, true);
if ($entity) {
// $result = $this->reportingPortalModel->deleteOrganization([
// 'uniqueId' => $entity->getUniqueId(),
// 'userEmail' => $user->getEmail(),
// ]);
if ($this->getUserCountByEntity($entity) === 0) {
$entity->setIsDeleted(true); // Custom field
$entity->setDeletedBy($user);
$entity->setDeletedAt(Carbon::now());
$entity->setPublished(false);
$entity->save();
$results[] = ["id" => $orgId, "success" => true, "message" => $translator->trans("organization_deleted_successifully")];
} else {
$results[] = ["id" => $orgId, "success" => false, "message" => $translator->trans("organization_has_users")];
}
} else {
$results[] = ["id" => $orgId, "success" => false, "message" => $translator->trans("organization_does_not_exists")];
}
}
if (!is_array($params['id'])) {
$single = $results[0] ?? ["success" => false, "message" => $translator->trans("unknown_error")];
return ["success" => $single["success"], "message" => $single["message"]];
}
$successCount = 0;
$failedCount = 0;
$failedItems = [];
foreach ($results as $r) {
if (!empty($r['success'])) {
$successCount++;
} else {
$failedCount++;
$failedItems[] = [
'id' => $r['id'],
'reason' => $r['message']
];
}
}
$message = sprintf("%s: %d", $translator->trans("organization_deleted_successifully"), $successCount);
if ($failedCount > 0) {
$message .= sprintf(", %s: %d", $translator->trans("failed"), $failedCount);
}
return [
"success" => true,
"message" => $message,
"processed" => $successCount,
"failed" => $failedCount,
"failedItems" => $failedItems
];
}
/**
* Retrieve organization
*
*/
public function retrieveOrganization($user, $params, $translator): array
{
$entity = DataObject\Organization::getById($params['id'], true);
if ($entity) {
$entity->setIsDeleted(false); // Custom field
$entity->setDeletedBy(null);
$entity->setDeletedAt(null);
$entity->setPublished(true);
$entity->save();
return ["success" => true, "message" => $translator->trans("organization_retrieved_successifully")];
}
return ["success" => false, "message" => $translator->trans("organization_does_not_exists")];
}
/**
* Send invite to NCM users
*
*/
public function adminInviteNCMUser($request, $translator, $email, $fullName, $role, $userTagId, $hostName, $loggedInUser, $allowedApiGroups, $permissionUserGroupIds, $templating, $isNoExpiry = false, $phone = null): array
{
$result = [];
// try {
$user = DataObject\Customer::getByEmail($email, ['limit' => 1, 'unpublished' => true]);
if ($user instanceof DataObject\Customer) {
if ($user->getRole()->getName() == USER_ROLES['CLIENT_ADMIN'] || $user->getRole()->getName() == USER_ROLES['CLIENT_USER']) {
return ["success" => false, "message" => $translator->trans("user_already_exists_in_external_user")];
} else {
return ["success" => false, "message" => $translator->trans("user_already_exists")];
}
}
$organization = $loggedInUser->getOrganization();
if ($organization instanceof DataObject\Organization) {
// Register user if not exists
if ($loggedInUser->getRole()->getName() == USER_ROLES['NCM_OPERATOR'] && $role == USER_ROLES['NCM_IT']) {
return ["success" => false, "message" => $translator->trans("NCM_OPERATOR_can_not_invite_NCM_IT.")];
}
if ($loggedInUser->getRole()->getName() == USER_ROLES['CLIENT_ADMIN'] || $loggedInUser->getRole()->getName() == USER_ROLES['CLIENT_USER']) {
return ["success" => false, "message" => $translator->trans(USER_ROLES[$loggedInUser->getRole()->getName()] . "_can_not_invite_" . USER_ROLES[$role])];
}
$userRole = DataObject\UserRole::getByName(USER_ROLES[$role], true);
if ($userRole instanceof DataObject\UserRole) {
$package = $userRole->getCustomPackage();
if (!$package instanceof DataObject\Package) {
return ["success" => false, "message" => $translator->trans("package_not_found")];
}
// // check package user limit
// $subscriptionList = new DataObject\Subscription\Listing();
// $subscriptionList->filterBySubscribedUser($loggedInUser);
// // $subscriptionList->filterBySubscriptionType("custom");
// $subscriptionList->filterByIsActive(true);
// $subscriptionList->load();
// $customerList = new DataObject\Customer\Listing();
// $customerList->filterByOrganization($organization);
// $customerList->setUnpublished(1);
// $totalcustomer = $customerList->count();
// $maxUser = 0;
// foreach ($subscriptionList as $subscription) {
// $loggedInUserPackage = $subscription->getSubscribedPackage();
// if ($loggedInUserPackage instanceof DataObject\Package) {
// if ($loggedInUserPackage->getMaxUsers()) {
// $maxUser += (int) $loggedInUserPackage->getMaxUsers();
// }
// }
// }
// if ($totalcustomer >= $maxUser) {
// return ["success" => false, "message" => $translator->trans("invite_user_limit_exceeded_for_this_organization")];
// }
// // check package user limit
$params = [
'email' => $email,
'organization' => $organization,
'name' => $fullName,
'groupId' => null,
'createdBy' => $loggedInUser,
'isNoExpiry' => $isNoExpiry,
'phone' => $phone,
'permissionUserGroupIds' => $permissionUserGroupIds
];
$userResponse = $this->createUser($userRole, $params, $translator);
if ($userResponse['success'] == true) {
$user = $userResponse['data'];
// assign user tag to user
if (isset($userTagId) && !empty($userTagId)) {
$tage = UserTag::getById($userTagId);
if ($tage instanceof UserTag) {
$user->setTag($tage);
$user->save();
}
}
// Send invite
$permission = [];
$params = [
'user' => $user,
'email' => $user->getEmail(),
'userName' => $user->getName(),
'role' => ($user->getRole() ? $user->getRole()->getName() : null),
'url' => $hostName . $userResponse['token'],
'clientType' => "NCM_admin",
'inviteSenderName' => $loggedInUser->getName(),
'permissions' => $permission,
'subject' => "Invitation to Join Admin Portal as NCM Admin",
'hostPath' => $request->getSchemeAndHttpHost(),
'resend' => false,
];
$inviteResponse = $this->invitationModel->sendInvite($params, $translator, $templating);
return $inviteResponse;
// $ncmUserSubscription = $this->userModel->setNcmUserSubscription($userRole, $user, $allowedApiGroups, $isNoExpiry);
// if ($ncmUserSubscription instanceof DataObject\Subscription) {
// // Send invite
// $permission = [];
// $params = [
// 'user' => $user,
// 'email' => $user->getEmail(),
// 'userName' => $user->getName(),
// 'role' => ($user->getRole() ? $user->getRole()->getName() : null),
// 'url' => $hostName . $userResponse['token'],
// 'clientType' => "NCM_admin",
// 'inviteSenderName' => $loggedInUser->getName(),
// 'permissions' => $permission,
// 'subject' => "Invitation to Join Admin Portal as NCM Admin",
// 'hostPath' => $request->getSchemeAndHttpHost(),
// 'resend' => false,
// ];
// $inviteResponse = $this->invitationModel->sendInvite($params, $translator, $templating);
// return $inviteResponse;
// } else {
// return ["success" => false, "message" => $translator->trans("user_subscription_not_created")];
// }
} else {
return $userResponse;
}
} else {
return ["success" => false, "message" => $translator->trans("user_role_not_found")];
}
} else {
return ["success" => false, "message" => $translator->trans("no_organization_is_associated_with_logged_in_user")];
}
// } catch (\Exception $ex) {
// $result = ["success" => false, "message" => $ex->getMessage()];
// }
return $result;
}
/**
* Send invite to Organization and Individual users
*
*/
public function adminInvite(
$request,
$translator,
$email,
$name,
$role,
$logo,
$clientType,
$companyNameEn,
$companyNameAR,
$locations,
$loggedInUser,
$hostName,
$department,
$title,
$groupId,
$packageId,
$organizationId,
$templating,
$phone,
$entityStatus,
$trialLimit
): array {
$result = [];
// try {
$user = DataObject\Customer::getByEmail($email, ['limit' => 1, 'unpublished' => true]);
if ($user instanceof DataObject\Customer) {
if ($user->getRole()->getName() == USER_ROLES['NCM_OPERATOR'] || $user->getRole()->getName() == USER_ROLES['NCM_IT']) {
return ["success" => false, "message" => $translator->trans("user_already_exists_in_internal_user")];
} else {
$data = ['email' => $email, 'name' => $name, 'role' => $role];
return ["success" => false, "message" => $translator->trans("user_already_exists"), 'data' => $data];
}
}
switch ($clientType) {
case 'organization':
case 'government':
// Register organization if not exists
$package = DataObject\Package::getById($packageId, true);
if (!$package instanceof DataObject\Package) {
return ["success" => false, "message" => $translator->trans("package_not_found")];
}
// Check if the name already exists for another organization
$organization = DataObject\Organization::getByName($companyNameEn, 'en', ['limit' => 1, 'unpublished' => true]);
if ($organization instanceof DataObject\Organization) {
return ["success" => false, "message" => $translator->trans("organization_already_exists") . " : " . $companyNameEn];
}
// $organizationByEmail = DataObject\Organization::getByEmail($email, true);
// if ($organizationByEmail instanceof DataObject\Organization) {
// return ["success" => false, "message" => sprintf($translator->trans("organization_already_created_with_this: %s"), $email)];
// }
$allowedStatuses = ['paid', 'trial', 'expired'];
if (!in_array($entityStatus, $allowedStatuses)) {
return ["success" => false, "message" => $translator->trans("undefined_entity_status")];
}
$params = [
'name' => $companyNameEn,
'nameAr' => $companyNameAR,
'code' => $companyNameEn,
'client_type' => $clientType,
'email' => $email,
'phone' => $phone,
'entityStatus' => $entityStatus,
'trialLimit' => $trialLimit,
'package' => $package,
// 'logo'=>$logo
];
$organization = $this->createOrganization($request, $params, $loggedInUser, $translator);
if (isset($organization['data']) && $organization['data'] instanceof DataObject\Organization) {
// check role of user before inviting
if ($loggedInUser->getRole()->getName() == USER_ROLES['CLIENT_ADMIN'] && ($role == USER_ROLES['NCM_IT'] || $role == USER_ROLES['NCM_OPERATOR'])) {
return ["success" => false, "message" => $translator->trans("CLIENT_ADMIN_can_not_invite_NCM_IT_or_NCM_OPERATOR")];
}
if ($loggedInUser->getRole()->getName() == USER_ROLES['CLIENT_ADMIN']) {
return ["success" => false, "message" => $translator->trans("CLIENT_USER_can_not_invite")];
}
$userRole = DataObject\UserRole::getByName(USER_ROLES['CLIENT_ADMIN'], true);
if (!$userRole instanceof UserRole) {
return ["success" => false, "message" => $translator->trans("User_Role_Not_Found")];
}
$params = [
'email' => $email,
'organization' => $organization['data'],
'name' => $name,
'groupId' => $groupId,
'createdBy' => $loggedInUser,
'phone' => $phone
];
$userResponse = $this->createUser($userRole, $params, $translator);
if ($userResponse['success'] != true) {
return $userResponse;
}
// new invited user
$user = $userResponse['data'];
$params = [
'locations' => $locations,
'loggedInUser' => $loggedInUser,
'user' => $user,
'package' => $package,
'disallowedApiGroupsArray' => null,
'subscriptionType' => 'custom'
];
$assignPermission = $this->assignPermissionAndLocation($user, $userRole, $params, $translator);
if ($assignPermission['success'] != true) {
return $assignPermission;
}
// Send invite
$permission = [
'Allow Custom Notification' => "",
'Allow Add Location' => "",
'Allow AlertHistory For Custom Alerts' => "",
'Allow Forecast' => "",
'Allow Organization Admin To Invite Users' => "",
];
$params = [
'user' => $user,
'email' => $user->getEmail(),
'userName' => $user->getName(),
'url' => $hostName . $userResponse['token'],
'role' => ($user->getRole() ? $user->getRole()->getName() : null),
'clientType' => $clientType,
'inviteSenderName' => $loggedInUser->getName(),
'organization_name' => ($user->getOrganization() ? $user->getOrganization()->getName() : null),
'NCMItAdminsData' => $this->getNCMItData(),
'entityAdminsData' => $this->getEntityAdminData($user->getOrganization()),
'permissions' => $permission,
'inviteSenderRole' => ($loggedInUser->getRole() ? $loggedInUser->getRole()->getName() : null),
'subject' => "Invitation to Join NCM Business Portal",
'NCMItAdminNotificationSubject' => "NCM Admin Invited Organization",
'resend' => false,
'hostPath' => $request->getSchemeAndHttpHost()
];
$inviteResponse = $this->invitationModel->sendInvite($params, $translator, $templating);
return $inviteResponse;
} else {
return ["success" => false, "message" => $translator->trans("Organization_does_not_created")];
}
break;
case 'individual':
// Register user if not exists
$organization['data'] = $loggedInUser->getOrganization();
if (isset($organization['data']) && $organization['data'] instanceof \Pimcore\Model\DataObject\Organization) {
// Register user if not exists
$organization_users = new DataObject\Customer\Listing();
$organization_users->filterByOrganization($organization['data']);
$organization_users->load();
if ($organization_users->getCount() >= $organization['data']->getLimit()) {
throw new \Exception("Inivite Limit Exceeded");
}
$userRole = DataObject\UserRole::getByName(USER_ROLES['CLIENT_USER'], true);
if (!$userRole instanceof UserRole) {
throw new \Exception("User role not found");
}
$params = [
'email' => $email,
'organization' => $organization['data'],
'name' => $name,
'department' => $department,
'title' => $title,
'groupId' => $groupId,
'createdBy' => $loggedInUser,
'phone' => $phone
];
// check package user limit
$customSubscriptions = new DataObject\Subscription\Listing();
$customSubscriptions->filterBySubscribedUser($loggedInUser);
$customSubscriptions->filterByIsActive(true);
$customSubscriptions->filterBySubscriptionType("custom");
$customSubscription = $customSubscriptions->current();
if (!$customSubscription instanceof DataObject\Subscription) {
return ["success" => false, "message" => $translator->trans("no_custom_subscription_found_to_organization")];
}
$package = $customSubscription->getSubscribedPackage();
if (!$package instanceof DataObject\Package) {
return ["success" => false, "message" => $translator->trans("custom_package_not_found_to_organization")];
}
$customerList = new DataObject\Customer\Listing();
$customerList->filterByOrganization($organization['data']);
$customerList->setUnpublished(1);
$totalcustomer = $customerList->count();
$maxUser = 0;
if ($package->getMaxUsers()) {
$maxUser = (int) $package->getMaxUsers();
}
if ($totalcustomer >= $maxUser) {
return ["success" => false, "message" => $translator->trans("invite_user_limit_exceeded_for_this_organization")];
}
// check package user limit
$userResponse = $this->createUser($userRole, $params, $translator);
if ($userResponse['success'] != true) {
return $userResponse;
}
// new invited user
$user = $userResponse['data'];
$params = [
'locations' => $locations,
'loggedInUser' => $loggedInUser,
'user' => $user,
'package' => $package,
'disallowedApiGroupsArray' => null,
'subscriptionType' => 'custom'
];
$assignPermission = $this->assignPermissionAndLocation($user, $userRole, $params, $translator);
if ($assignPermission['success'] != true) {
return $assignPermission;
}
// Send invite
$params = [
'user' => $user,
'email' => $user->getEmail(),
'userName' => $user->getName(),
'url' => $hostName . $userResponse['token'],
'role' => ($user->getRole() ? $loggedInUser->getRole()->getName() : null),
'clientType' => "individual",
'inviteSenderName' => $loggedInUser->getName(),
'entityAdminsData' => $this->getEntityAdminData($user->getOrganization()),
'subject' => "Invitation to Join NCM Business Portal",
'hostPath' => $request->getSchemeAndHttpHost(),
'phone' => $phone,
'resend' => false,
// 'invite_sender_organization_name' => ($loggedInUser->getOrganization() ? $loggedInUser->getOrganization()->getName() : null),
];
$inviteResponse = $this->invitationModel->sendInvite($params, $translator, $templating);
return $inviteResponse;
} else {
return ["success" => false, "message" => $translator->trans("no_organization_is_associated_with_logged_in_user")];
}
break;
case 'user':
// Register user if not exists
if ($organizationId != null) {
$organization = DataObject\Organization::getById($organizationId, true);
if (!$organization instanceof DataObject\Organization) {
return ["success" => false, "message" => $translator->trans("organization_does_not_exists")];
}
}
$organizationEmail = $organization->getEmail();
// if(substr(strrchr($organizationEmail, "@"), 1) != substr(strrchr($email, "@"), 1)){
// return ["success" => false, "message" => $translator->trans("email_does_not_belongs_to_organization")];
// }
// get organization package
$package = $organization->getPackage();
if (!$package instanceof DataObject\Package) {
$organizationUser = DataObject\Customer::getByOrganization($organization, ['limit' => 1, 'unpublished' => true]);
if (!$organizationUser instanceof DataObject\Customer) {
return ["success" => false, "message" => $translator->trans("organization_owner_not_exists")];
}
// Get Custom Subscription of the organization and package
$customSubscriptions = new DataObject\Subscription\Listing();
$customSubscriptions->filterBySubscribedUser($organizationUser);
$customSubscriptions->filterByIsActive(true);
$customSubscriptions->filterBySubscriptionType("custom");
$customSubscription = $customSubscriptions->current();
if (!$customSubscription instanceof DataObject\Subscription) {
return ["success" => false, "message" => $translator->trans("no_custom_subscription_found_to_organization")];
}
$package = $customSubscription->getSubscribedPackage();
if (!$package instanceof DataObject\Package) {
return ["success" => false, "message" => $translator->trans("custom_package_not_found_to_organization")];
}
}
// check package user limit
$customerList = new DataObject\Customer\Listing();
$customerList->filterByOrganization($organization);
$customerList->setUnpublished(1);
$totalcustomer = $customerList->count();
// get package user limit
$maxUser = (int) $package->getMaxUsers();;
if ($totalcustomer >= $maxUser) {
return ["success" => false, "message" => $translator->trans("invite_user_limit_exceeded_for_this_organization")];
}
// check package user limit
$userRole = DataObject\UserRole::getByName($role, true);
if (!$userRole instanceof UserRole) {
throw new \Exception("User role not found");
}
$params = [
'email' => $email,
'organization' => $organization,
'name' => $name,
'department' => $department,
'title' => $title,
'groupId' => $groupId,
'createdBy' => $loggedInUser,
'phone' => $phone
];
$userResponse = $this->createUser($userRole, $params, $translator);
if ($userResponse['success'] != true) {
return $userResponse;
}
// new invited user
$user = $userResponse['data'];
$params = [
'locations' => $locations,
'loggedInUser' => $loggedInUser,
'user' => $user,
'package' => $package,
'disallowedApiGroupsArray' => null,
'subscriptionType' => 'custom'
];
$assignPermission = $this->assignPermissionAndLocation($user, $userRole, $params, $translator);
if ($assignPermission['success'] != true) {
return $assignPermission;
}
// Send invite
$params = [
'user' => $user,
'email' => $user->getEmail(),
'userName' => $user->getName(),
'url' => $hostName . $userResponse['token'],
'role' => ($user->getRole() ? $user->getRole()->getName() : null),
'clientType' => "user",
'inviteSenderName' => $loggedInUser->getName(),
'entityAdminsData' => $this->getEntityAdminData($user->getOrganization()),
'subject' => "Invitation to Join NCM Business Portal",
'hostPath' => $request->getSchemeAndHttpHost(),
'resend' => false,
//'invite_sender_organization_name' => ($loggedInUser->getOrganization() ? $loggedInUser->getOrganization()->getName() : null),
];
// Send invitation
$inviteResponse = $this->invitationModel->sendInvite($params, $translator, $templating);
//set organization active if it is not active and total customer is less than 1
if ($totalcustomer < 1 && !$organization->getIsActive()) {
$organization->setIsActive(true);
// assign package to organization if not assigned
if (!$organization->getPackage() instanceof DataObject\Package) {
$organization->setPackage($package);
}
$organization->setPackageActivationDate(Carbon::now());
$organization->save();
}
return $inviteResponse;
break;
default:
return ["success" => false, "message" => $translator->trans("invalid_client_type")];
}
// } catch (\Exception $ex) {
// // $result = ["success" => false, "message" => $ex->getMessage()];
// }
return $result;
}
/**
* Create new user directly form admin and organization or user by NCM
*
*/
public function adminCreateUser(
$request,
$translator,
$email,
$name,
$role,
$logo = null,
$clientType,
$companyNameEn,
$companyNameAr,
$locations,
$loggedInUser,
$department = null,
$title = null,
$groupId,
$packageId,
$organizationId,
$password,
$phone = null,
$entityStatus,
$trialLimit,
$templating
) {
$result = [];
$user = DataObject\Customer::getByEmail($email, ['limit' => 1, 'unpublished' => true]);
if ($user instanceof DataObject\Customer) {
if ($user->getRole()->getName() == USER_ROLES['NCM_OPERATOR'] || $user->getRole()->getName() == USER_ROLES['NCM_IT']) {
return ["success" => false, "message" => $translator->trans("user_already_exists_in_internal_user")];
} else {
return ["success" => false, "message" => $translator->trans("user_already_exists")];
}
}
switch ($clientType) {
case 'organization':
case 'government':
// Register organization if not exists
$package = DataObject\Package::getById($packageId, true);
if (!$package instanceof DataObject\Package) {
return ["success" => false, "message" => $translator->trans("package_not_found")];
}
// Check if the name already exists for another organization
$organization = DataObject\Organization::getByName($companyNameEn, 'en', ['limit' => 1, 'unpublished' => true]);
if ($organization instanceof DataObject\Organization) {
return ["success" => false, "message" => $translator->trans("organization_already_exists") . " : " . $companyNameEn];
}
// $organizationByEmail = DataObject\Organization::getByEmail($email, true);
// if ($organizationByEmail instanceof DataObject\Organization) {
// return ["success" => false, "message" => sprintf($translator->trans("organization_already_created_with_this: %s"), $email)];
// }
$allowedStatuses = ['paid', 'trial', 'expired'];
if (!in_array($entityStatus, $allowedStatuses)) {
return ["success" => false, "message" => $translator->trans("undefined_entity_status")];
}
// set params to create organization
$params = [
'name' => $companyNameEn,
'nameAr' => $companyNameAr,
'code' => $companyNameEn,
'client_type' => $clientType,
'email' => $email,
'entityStatus' => $entityStatus,
'trialLimit' => $trialLimit,
'package' => $package
// 'logo'=>$logo
];
$organization = $this->createOrganization($request, $params, $loggedInUser, $translator);
if (isset($organization['data']) && $organization['data'] instanceof DataObject\Organization) {
// check role of user before inviting
if ($loggedInUser->getRole()->getName() == USER_ROLES['CLIENT_ADMIN'] && ($role == USER_ROLES['NCM_IT'] || $role == USER_ROLES['NCM_OPERATOR'])) {
return ["success" => false, "message" => $translator->trans("CLIENT_ADMIN_can_not_invite_NCM_IT_or_NCM_OPERATOR")];
}
if ($loggedInUser->getRole()->getName() == USER_ROLES['CLIENT_ADMIN']) {
return ["success" => false, "message" => $translator->trans("CLIENT_USER_can_not_invite")];
}
$userRole = DataObject\UserRole::getByName(USER_ROLES['CLIENT_ADMIN'], true);
if (!$userRole instanceof UserRole) {
return ["success" => false, "message" => $translator->trans("User_Role_Not_Found")];
}
// set params to create user
$params = [
'email' => $email,
'organization' => $organization['data'],
'name' => $name,
'role' => $userRole,
'groupId' => $groupId,
'title' => $title,
'department' => $department,
'password' => $password,
'createdBy' => $loggedInUser,
'token' => null,
'published' => true,
'phone' => $phone
];
$userResponse = $this->userModel->register($request, $params, $translator);
if ($userResponse['success'] == true) {
$user = $userResponse['data'];
if (empty($user->getNcmCRMId())) {
// Prepare contact data for CRM
$contactData = [
"firstName" => $user->getName(),
"lastName" => "",
"fullName" => $user->getName(),
"email" => $user->getEmail(),
"businessPhone" => $user->getPhoneNo() ?? "",
"address" => new \stdClass(),
];
// Call CRM Service
$crmId = $this->crmService->addContact($contactData);
if ($crmId) {
$user->setNcmCRMId($crmId);
$user->save();
}
}
}
if ($userResponse['success'] != true) {
return $userResponse;
}
// new invited user
$user = $userResponse['data'];
$params = [
'locations' => $locations,
'loggedInUser' => $loggedInUser,
'user' => $user,
'package' => $package,
'disallowedApiGroupsArray' => null,
'subscriptionType' => 'custom'
];
$assignPermission = $this->assignPermissionAndLocation($user, $userRole, $params, $translator);
if ($assignPermission['success'] != true) {
return $assignPermission;
}
return ["success" => true, "message" => $translator->trans("organization_created_successfully")];
} else {
return ["success" => false, "message" => $translator->trans("Organization_does_not_created")];
}
break;
case 'user':
// Register user if not exists
if ($organizationId != null) {
$organization = DataObject\Organization::getById($organizationId, true);
if (!$organization instanceof DataObject\Organization) {
return ["success" => false, "message" => $translator->trans("organization_does_not_exists")];
}
}
$organizationEmail = $organization->getEmail();
// if(substr(strrchr($organizationEmail, "@"), 1) != substr(strrchr($email, "@"), 1)){
// return ["success" => false, "message" => $translator->trans("email_does_not_belongs_to_organization")];
// }
// get organization package
$package = $organization->getPackage();
if (!$package instanceof DataObject\Package) {
$organizationUser = DataObject\Customer::getByOrganization($organization, ['limit' => 1, 'unpublished' => true]);
if (!$organizationUser instanceof DataObject\Customer) {
return ["success" => false, "message" => $translator->trans("organization_owner_not_exists")];
}
// Get Custom Subscription of the organization and package
$customSubscriptions = new DataObject\Subscription\Listing();
$customSubscriptions->filterBySubscribedUser($organizationUser);
$customSubscriptions->filterByIsActive(true);
$customSubscriptions->filterBySubscriptionType("custom");
$customSubscription = $customSubscriptions->current();
if (!$customSubscription instanceof DataObject\Subscription) {
return ["success" => false, "message" => $translator->trans("no_custom_subscription_found_to_organization")];
}
$package = $customSubscription->getSubscribedPackage();
if (!$package instanceof DataObject\Package) {
return ["success" => false, "message" => $translator->trans("custom_package_not_found_to_organization")];
}
}
// check package user limit
$customerList = new DataObject\Customer\Listing();
$customerList->filterByOrganization($organization);
$customerList->setUnpublished(1);
$totalcustomer = $customerList->count();
// get package user limit
$maxUser = (int) $package->getMaxUsers();
if ($totalcustomer >= $maxUser) {
return ["success" => false, "message" => $translator->trans("invite_user_limit_exceeded_for_this_organization")];
}
// check package user limit
$userRole = DataObject\UserRole::getByName($role, true);
if (!$userRole instanceof UserRole) {
return ["success" => false, "message" => $translator->trans("User_Role_Not_Found")];
}
// set params to create user
$params = [
'email' => $email,
'organization' => $organization,
'name' => $name,
'role' => $userRole,
'groupId' => $groupId,
'title' => $title,
'department' => $department,
'password' => $password,
'createdBy' => $loggedInUser,
'token' => null,
'published' => true,
'phone' => $phone
];
$userResponse = $this->userModel->register($request, $params, $translator);
if ($userResponse['success'] != true) {
return $userResponse;
}
if ($userResponse['success'] == true) {
$user = $userResponse['data'];
if (empty($user->getNcmCRMId())) {
$contactData = [
"firstName" => $user->getName(),
"lastName" => "",
"fullName" => $user->getName(),
"email" => $user->getEmail(),
"businessPhone" => $user->getPhoneNo() ?? "",
"address" => new \stdClass(),
];
// Call CRM Service
$crmId = $this->crmService->addContact($contactData);
if ($crmId) {
$user->setNcmCRMId($crmId);
$user->save();
}
}
}
// new invited user
$user = $userResponse['data'];
$params = [
'locations' => $locations,
'loggedInUser' => $loggedInUser,
'user' => $user,
'package' => $package,
'disallowedApiGroupsArray' => null,
'subscriptionType' => 'custom'
];
$assignPermission = $this->assignPermissionAndLocation($user, $userRole, $params, $translator);
if ($assignPermission['success'] != true) {
return $assignPermission;
}
$userData = [
'userId' => $user->getId(),
'email' => $user->getEmail(),
'name' => $user->getName(),
'role' => $role,
'type' => 'created',
];
$entityAdminsData = $this->getEntityAdminData($organization);
// Temporarily closed for testing purposes
// $this->invitationModel->notifyAdmins($userData, $entityAdminsData, $translator, $templating);
//set organization active if it is not active and total customer is less than 1
if ($totalcustomer < 1 && !$organization->getIsActive()) {
$organization->setIsActive(true);
// assign package to organization if not assigned
if (!$organization->getPackage() instanceof DataObject\Package) {
$organization->setPackage($package);
}
$organization->setPackageActivationDate(Carbon::now());
$organization->save();
}
return ["success" => true, "message" => $translator->trans("user_created_successfully")];
break;
default:
return ["success" => false, "message" => $translator->trans("invalid_client_type")];
}
return $result;
}
/**
* Send invite to Organization and Individual users
*
*/
public function clientInvite(
$request,
$translator,
$email,
$name,
$role,
$clientType,
$locations,
$locationTagIds,
$loggedInUser,
$hostName,
$department,
$title,
$groupId,
$disallowedApiGroupsArray,
$templating,
$isNoExpiry = false
) {
$user = DataObject\Customer::getByEmail($email, ['limit' => 1, 'unpublished' => true]);
if ($user instanceof DataObject\Customer) {
if (($user->getRole()->getName() == USER_ROLES['CLIENT_ADMIN'] || $user->getRole()->getName() == USER_ROLES['CLIENT_USER']) && $user->getOrganization()->getId() == $loggedInUser->getOrganization()->getId()) {
return ["success" => false, "message" => $translator->trans("user_already_exists")];
} elseif (($user->getRole()->getName() == USER_ROLES['CLIENT_ADMIN'] || $user->getRole()->getName() == USER_ROLES['CLIENT_USER']) && $user->getOrganization()->getId() != $loggedInUser->getOrganization()->getId()) {
return ["success" => false, "message" => $translator->trans("user_already_exists_in_different_organization")];
} elseif ($user->getRole()->getName() == USER_ROLES['NCM_OPERATOR'] || $user->getRole()->getName() == USER_ROLES['NCM_IT']) {
return ["success" => false, "message" => $translator->trans("user_already_exists_in_admin")];
}
}
$organization = $loggedInUser->getOrganization();
if (!$organization instanceof DataObject\Organization) {
return ["success" => false, "message" => $translator->trans("no_organization_is_associated_with_logged_in_user")];
}
$organizationEmail = $organization->getEmail();
// Set organization email if not set
if (empty($organizationEmail)) {
$organization->setEmail($email);
$organization->save();
} else {
if (substr(strrchr($organizationEmail, "@"), 1) != substr(strrchr($email, "@"), 1)) {
return ["success" => false, "message" => $translator->trans("email_does_not_belongs_to_organization")];
}
}
$userRole = DataObject\UserRole::getByName(USER_ROLES[$role], true);
if (!$userRole instanceof UserRole) {
return ["success" => false, "message" => $translator->trans("User_role_not_found")];
}
$package = $organization->getPackage();
if (!$package instanceof DataObject\Package) {
// Get Custom Subscription of the organization and package
$customSubscriptions = new DataObject\Subscription\Listing();
$customSubscriptions->filterBySubscribedUser($loggedInUser);
$customSubscriptions->filterByIsActive(true);
$customSubscriptions->filterBySubscriptionType("custom");
$customSubscription = $customSubscriptions->current();
if (!$customSubscription instanceof DataObject\Subscription) {
return ["success" => false, "message" => $translator->trans("no_custom_subscription_found_to_organization")];
}
$package = $customSubscription->getSubscribedPackage();
if (!$package instanceof DataObject\Package) {
return ["success" => false, "message" => $translator->trans("custom_package_not_found_to_organization")];
}
}
$customerList = new DataObject\Customer\Listing();
$customerList->filterByOrganization($organization);
$customerList->setUnpublished(1);
$totalcustomer = $customerList->count();
$maxUser = 0;
if ($package->getMaxUsers()) {
$maxUser = (int) $package->getMaxUsers();
}
if ($totalcustomer >= $maxUser) {
return ["success" => false, "message" => $translator->trans("invite_user_limit_exceeded_for_this_organization")];
}
$params = [
'email' => $email,
'organization' => $organization,
'name' => $name,
'department' => $department,
'title' => $title,
'groupId' => $groupId,
'createdBy' => $loggedInUser,
'isNoExpiry' => $isNoExpiry
];
$userResponse = $this->createUser($userRole, $params, $translator);
if ($userResponse['success'] != true) {
return $userResponse;
}
// new invited user
$user = $userResponse['data'];
$params = [
'locations' => $locations,
'loggedInUser' => $loggedInUser,
'user' => $user,
'package' => $package,
'disallowedApiGroupsArray' => $role == USER_ROLES['CLIENT_USER'] ? $disallowedApiGroupsArray : null,
'subscriptionType' => 'custom',
'isNoExpiry' => $isNoExpiry,
];
$assignPermission = $this->assignPermissionAndLocation($user, $userRole, $params, $translator);
if ($assignPermission['success'] != true) {
return $assignPermission;
}
// Assign location by location tag id to user
if (isset($locationTagIds) && !empty($locationTagIds)) {
$assignLocationByLocationTagId = $this->userModel->assignLocationToUser($loggedInUser, null, $locationTagIds, [$user->getId()], null, false, false, $translator);
if (isset($assignLocationByLocationTagId['success']) && $assignLocationByLocationTagId['success'] == false) {
return $assignLocationByLocationTagId;
}
}
// Send invite
$params = [
'user' => $user,
'email' => $user->getEmail(),
'userName' => $user->getName(),
'url' => $hostName . $userResponse['token'],
'role' => ($user->getRole() ? $user->getRole()->getName() : null),
'clientType' => "user",
'inviteSenderName' => $loggedInUser->getName(),
// 'invite_sender_organization_name' => ($loggedInUser->getOrganization() ? $loggedInUser->getOrganization()->getName() : null),
'subject' => "Invitation to Join NCM Business Portal",
'hostPath' => $request->getSchemeAndHttpHost(),
'entityAdminsData' => $this->getEntityAdminData($user->getOrganization()),
'resend' => false,
];
// Send invitation
$inviteResponse = $this->invitationModel->sendInvite($params, $translator, $templating);
return $inviteResponse;
}
/**
* Resend invite to Organization , NCM_users or Individual users
*
*/
public function resendInvite($request, $userIdOrIds, $loggedInUser, $translator, $templating): array
{
$ids = is_array($userIdOrIds) ? $userIdOrIds : [$userIdOrIds];
$results = [];
foreach ($ids as $userId) {
$user = DataObject\Customer::getById($userId, true);
if ($user instanceof \Pimcore\Model\DataObject\Customer) {
if (!empty($user->getToken())) {
$organization = $user->getOrganization();
if ($organization instanceof \Pimcore\Model\DataObject\Organization) {
$headers = array('alg' => 'HS256', 'typ' => 'JWT');
//create token for new user
$payload = array('email' => $user->getEmail(), 'org_id' => $organization->getId(), 'time' => time());
$newToken = $this->invitationModel->generateJwtToken($headers, $payload);
$user->setToken($newToken);
$user->save();
if ($user) {
$decodedJwtToken['username'] = $user->getEmail();
$userPermissions = $this->userPermission->checkPermission($decodedJwtToken, $translator);
$userPermission = $userPermissions['success'] ? $userPermissions['grants'] : null;
$role = ($user->getRole()) ? $user->getRole()->getName() : null;
$clientType = null;
if ($role == 'CLIENT_ADMIN' || $role == 'CLIENT_USER') {
$hostName = NCM_HOST_NAME;
$subject = "Invitation to Join NCM Business Portal";
$clientOrganization = DataObject\Organization::getByEmail($user->getEmail(), true);
if ($clientOrganization instanceof \Pimcore\Model\DataObject\Organization) {
$clientType = $clientOrganization->getCilent_type();
} else {
$clientType = "user";
}
} else {
$hostName = NCM_ADMIN_HOST_NAME;
$subject = "Invitation to Join NCM Admin Portal";
$clientType = "NCM_admin";
}
if ($clientType == "NCM_admin") {
$permission = [
'Inviting Clients' => isset($userPermission['grants']['invite_user']) ? $userPermission['grants']['invite_user'] : false,
'Managing Clients' => isset($userPermission['grants']['edit_user']) ? $userPermission['grants']['edit_user'] : false,
'Deleting Clients' => isset($userPermission['grants']['delete_user']) ? $userPermission['grants']['delete_user'] : false,
'Inviting NCM Admin' => isset($userPermission['grants']['invite_ncm_user']) ? $userPermission['grants']['invite_ncm_user'] : false,
'Managing NCM Admin' => isset($userPermission['grants']['edit_ncm_user']) ? $userPermission['grants']['edit_ncm_user'] : false,
'Deleting NCM Admin' => isset($userPermission['grants']['delete_ncm_user']) ? $userPermission['grants']['delete_ncm_user'] : false,
];
$params = [
'user' => $user,
'email' => $user->getEmail(),
'userName' => $user->getName(),
'role' => ($user->getRole() ? $user->getRole()->getName() : null),
'url' => $hostName . $newToken,
'clientType' => "NCM_admin",
'inviteSenderName' => $loggedInUser->getName(),
'permissions' => $permission,
'subject' => "Invitation to Join Admin Portal as NCM Admin",
'resend' => true
];
} elseif ($clientType == "organization" || $clientType == "government") {
$permission = [
'Allow Custom Notification' => isset($userPermission['grants']['get_custom_notification']) ? $userPermission['grants']['get_custom_notification'] : false,
'Allow Add Location' => isset($userPermission['grants']['compare_location']) ? $userPermission['grants']['compare_location'] : false,
'Allow AlertHistory For Custom Alerts' => isset($userPermission['grants']['alert_history']) ? $userPermission['grants']['alert_history'] : false,
'Allow Forecast' => isset($userPermission['grants']['get_weather']) ? $userPermission['grants']['get_weather'] : false,
'Allow Organization Admin To Invite Users' => isset($userPermission['grants']['invite_user']) ? $userPermission['grants']['invite_user'] : false,
];
$params = [
'user' => $user,
'email' => $user->getEmail(),
'userName' => $user->getName(),
'url' => $hostName . $newToken,
'role' => ($user->getRole() ? $user->getRole()->getName() : null),
'clientType' => $clientType,
'inviteSenderName' => $loggedInUser->getName(),
'organization_name' => ($user->getOrganization() ? $user->getOrganization()->getName() : null),
'NCMItAdminsData' => $this->getNCMItData(),
'permissions' => $permission,
'inviteSenderRole' => ($loggedInUser->getRole() ? $loggedInUser->getRole()->getName() : null),
'subject' => "Invitation to Join NCM Business Portal",
'NCMItAdminNotificationSubject' => "NCM Admin Invited Organization",
'resend' => true
];
} elseif ($clientType == "individual" || $clientType == "user") {
$params = [
'user' => $user,
'email' => $user->getEmail(),
'userName' => $user->getName(),
'url' => $hostName . $newToken,
'role' => ($user->getRole() ? $loggedInUser->getRole()->getName() : null),
'clientType' => "user",
'inviteSenderName' => $loggedInUser->getName(),
// 'invite_sender_organization_name' => ($loggedInUser->getOrganization() ? $loggedInUser->getOrganization()->getName() : null),
'subject' => "Invitation to Join NCM Business Portal",
'resend' => true
];
}
// Send invitation
$inviteResponse = $this->invitationModel->sendInvite($params, $translator, $templating);
$results[] = ["id" => $userId, "success" => ($inviteResponse['success'] ?? false), "message" => ($inviteResponse['message'] ?? null)];
}
} else {
$results[] = ["id" => $userId, "success" => false, "message" => $translator->trans("no_organization_is_associated_with_logged_in_user")];
}
} else {
$results[] = ["id" => $userId, "success" => false, "message" => $translator->trans("user_token_is_invalid")];
}
} else {
$results[] = ["id" => $userId, "success" => false, "message" => $translator->trans("user_is_not_available")];
}
}
if (!is_array($userIdOrIds)) {
$single = $results[0] ?? ["success" => false, "message" => $translator->trans("unknown_error")];
return ["success" => $single["success"], "message" => $single["message"]];
}
$successCount = 0;
foreach ($results as $r) {
if (!empty($r['success'])) {
$successCount++;
}
}
return ["success" => true, "message" => sprintf("%s: %d", $translator->trans("reinvite_email_sent"), $successCount)];
}
/**
* Get NCM_IT Admins Data
*/
public function getNCMItData()
{
$NCMItData = [];
$NCMItRole = DataObject\UserRole::getByName(USER_ROLES['NCM_IT'], true);
$NCMItAdmins = new DataObject\Customer\Listing();
$NCMItAdmins->filterByRole($NCMItRole);
foreach ($NCMItAdmins as $NCMItAdminsData) {
$NCMItData[] = [
'email' => $NCMItAdminsData->getEmail(),
'name' => $NCMItAdminsData->getName()
];
}
return $NCMItData;
}
/**
* Get Entity Admins Data
*/
public function getEntityAdminData(Organization $organization)
{
$entityAdminData = [];
$entityAdminRole = DataObject\UserRole::getByName(USER_ROLES['CLIENT_ADMIN'], true);
$entityAdmins = new DataObject\Customer\Listing();
$entityAdmins->filterByRole($entityAdminRole);
$entityAdmins->filterByOrganization($organization);
foreach ($entityAdmins as $entityAdmin) {
$entityAdminData[] = [
'id' => $entityAdmin->getId(),
'email' => $entityAdmin->getEmail(),
'name' => $entityAdmin->getName(),
'entityName' => $organization->getName(),
];
}
return $entityAdminData;
}
/**
* Create asset
*/
private function createAssetByURL($url)
{
$asset = new \Pimcore\Model\Asset\Image();
$asset->setFilename(time() . '-' . basename(parse_url($url, PHP_URL_PATH)));
$asset->setData(file_get_contents($url));
$asset->setParent(\Pimcore\Model\Asset\Service::createFolderByPath("organization_logo"));
$asset->save();
$advancedImage = new \Pimcore\Model\DataObject\Data\Hotspotimage();
$advancedImage->setImage($asset);
return $advancedImage;
}
/**
* Create user if not exists
*/
private function createUser($userRole, $params, $translator)
{
$userResponse = [];
if ($userRole instanceof \Pimcore\Model\DataObject\UserRole) {
$headers = array('alg' => 'HS256', 'typ' => 'JWT');
//create token for new user
$payload = array('email' => $params['email'], 'org_id' => $params['organization']->getId(), 'time' => time());
$token = $this->invitationModel->generateJwtToken($headers, $payload);
$requestParam = [
'email' => $params['email'],
'organization' => $params['organization'],
'name' => $params['name'],
'role' => $userRole,
'groupId' => $params['groupId'],
'title' => (isset($params['title']) ? $params['title'] : ''),
'department' => (isset($params['department']) ? $params['department'] : ''),
'password' => (isset($params['password']) ? $params['password'] : ''),
'token' => $token,
'isNoExpiry' => (isset($params['isNoExpiry']) ? $params['isNoExpiry'] : false),
'createdBy' => $params['createdBy'],
'published' => (isset($params['published']) ? $params['published'] : false),
'phone' => isset($params['phone']) ? $params['phone'] : null,
'permissionUserGroupIds' => isset($params['permissionUserGroupIds']) ? $params['permissionUserGroupIds'] : []
];
$userResponse = $this->userModel->register(null, $requestParam, $translator);
if ($userResponse['success'] == true) {
$user = $userResponse['data'];
if ($user->getRole()->getName() !== USER_ROLES['NCM_IT']) {
if (empty($user->getNcmCRMId())) {
$contactData = [
"firstName" => $user->getName(),
"lastName" => "",
"fullName" => $user->getName(),
"email" => $user->getEmail(),
"businessPhone" => $user->getPhoneNo() ?? "",
"address" => new \stdClass(),
];
$crmId = $this->crmService->addContact($contactData);
if ($crmId) {
$user->setNcmCRMId($crmId);
$user->save();
}
}
}
}
$userResponse['token'] = $token;
}
return $userResponse;
}
/**
* Assiging user permission
*/
private function assignPermissionAndLocation($user, $userRole, $params, $translator)
{
try {
if (!$user instanceof \Pimcore\Model\DataObject\Customer) {
throw new \Exception($translator->trans("user_not_exists"));
}
// assign user to assigned locations
if (!empty($params['locations']) && count($params['locations'][0]) > 0) {
foreach ($params['locations'][0] as $key => $value) {
$location = DataObject\Location::getById($value, true);
if ($location) {
$this->locationModel->locationMetaData($location, $user);
} else {
return ["success" => false, "message" => $translator->trans("location_does_not_exists")];
}
}
}
$params = [
'user' => $user,
'userRole' => $userRole,
'loggedInUser' => $params['loggedInUser'],
'package' => $params['package'],
'disallowedApiGroupsArray' => $params['disallowedApiGroupsArray'],
'isNoExpiry' => (isset($params['isNoExpiry']) ? $params['isNoExpiry'] : false),
];
//$userPermissionResponse = $this->userModel->setPcakageSubscription($params);
$subscription = $this->userModel->setSubscription($params['package'], $user, $params['disallowedApiGroupsArray'], "custom", $params['isNoExpiry']);
$result = $this->parameterModel->riskCategoryBulkCreation($user, $translator);
if ($subscription && $result) {
return ["success" => true, "message" => "set_subscription."];
}
//return $subscription;
} catch (\Exception $ex) {
return ["success" => false, "message" => $ex->getMessage()];
}
}
/**
* add NCM user by admin
*
*/
public function adminAddNCMUser($request, $translator, $email, $fullName, $role, $userTagId, $hostName, $loggedInUser, $allowedApiGroups, $permissionUserGroupIds, $templating, $isNoExpiry = false, $phone = null, $password = ""): array
{
$result = [];
// try {
$user = DataObject\Customer::getByEmail($email, ['limit' => 1, 'unpublished' => true]);
if ($user instanceof DataObject\Customer) {
if ($user->getRole()->getName() == USER_ROLES['CLIENT_ADMIN'] || $user->getRole()->getName() == USER_ROLES['CLIENT_USER']) {
return ["success" => false, "message" => $translator->trans("user_already_exists_in_external_user")];
} else {
return ["success" => false, "message" => $translator->trans("user_already_exists")];
}
}
$organization = $loggedInUser->getOrganization();
if ($organization instanceof DataObject\Organization) {
// Register user if not exists
if ($loggedInUser->getRole()->getName() == USER_ROLES['NCM_OPERATOR'] && $role == USER_ROLES['NCM_IT']) {
return ["success" => false, "message" => $translator->trans("NCM_OPERATOR_can_not_invite_NCM_IT.")];
}
if ($loggedInUser->getRole()->getName() == USER_ROLES['CLIENT_ADMIN'] || $loggedInUser->getRole()->getName() == USER_ROLES['CLIENT_USER']) {
return ["success" => false, "message" => $translator->trans(USER_ROLES[$loggedInUser->getRole()->getName()] . "_can_not_invite_" . USER_ROLES[$role])];
}
$userRole = DataObject\UserRole::getByName(USER_ROLES[$role], true);
if ($userRole instanceof DataObject\UserRole) {
$package = $userRole->getCustomPackage();
if (!$package instanceof DataObject\Package) {
return ["success" => false, "message" => $translator->trans("package_not_found")];
}
$params = [
'email' => $email,
'organization' => $organization,
'name' => $fullName,
'groupId' => null,
'createdBy' => $loggedInUser,
'isNoExpiry' => $isNoExpiry,
'phone' => $phone,
'published' => true,
"password" => $password,
'permissionUserGroupIds' => $permissionUserGroupIds
];
$userResponse = $this->createUser($userRole, $params, $translator);
if ($userResponse['success'] == true) {
$user = $userResponse['data'];
// assign user tag to user
if (isset($userTagId) && !empty($userTagId)) {
$tage = UserTag::getById($userTagId);
if ($tage instanceof UserTag) {
$user->setTag($tage);
$user->save();
}
}
return ["success" => true, "message" => $translator->trans("user_created")];
// $ncmUserSubscription = $this->userModel->setNcmUserSubscription($userRole, $user, $allowedApiGroups, $isNoExpiry);
// if ($ncmUserSubscription instanceof DataObject\Subscription) {
// $accessWRSIds = [];
// $accessWRSApiGroups = new DataObject\APIGroup\Listing();
// $accessWRSApiGroups->setCondition("groupName LIKE ?", ["weather_report%"]);
// foreach ($accessWRSApiGroups as $Wrsgroup) {
// $accessWRSIds[] = $Wrsgroup->getId();
// }
// $accessEWSIds = [];
// $accessEWSApiGroups = new DataObject\APIGroup\Listing();
// $accessEWSApiGroups->setCondition("groupName LIKE ?", ["ews_alert%"]);
// foreach ($accessEWSApiGroups as $Ewsgroup) {
// $accessEWSIds[] = $Ewsgroup->getId();
// }
// $matchedEWS = array_intersect($allowedApiGroups, $accessEWSIds);
// $matchedWRS = array_intersect($allowedApiGroups, $accessWRSIds);
// if ($matchedEWS) {
// $ncmEwsUser = $this->ewsPortalModel->addNcmUser([
// 'name' => $fullName,
// 'email' => $email,
// 'role' => $role,
// 'allowedApiGroups' => $allowedApiGroups,
// 'hostName' => $hostName,
// 'isNoExpiry' => $isNoExpiry,
// 'phone' => $phone,
// 'password' => $password,
// ]);
// }
// if ($matchedWRS) {
// $ncmReportingUser = $this->reportingPortalModel->addNcmUser([
// 'name' => $fullName,
// 'email' => $email,
// 'role' => $role,
// 'allowedApiGroups' => $allowedApiGroups,
// 'hostName' => $hostName,
// 'isNoExpiry' => $isNoExpiry,
// 'phone' => $phone,
// 'password' => $password,
// ]);
// }
// return ["success" => true, "message" => $translator->trans("user_created")];
// } else {
// return ["success" => false, "message" => $translator->trans("user_subscription_not_created")];
// }
} else {
return $userResponse;
}
} else {
return ["success" => false, "message" => $translator->trans("user_role_not_found")];
}
} else {
return ["success" => false, "message" => $translator->trans("no_organization_is_associated_with_logged_in_user")];
}
// } catch (\Exception $ex) {
// $result = ["success" => false, "message" => $ex->getMessage()];
// }
return $result;
}
public function updateEntityStatus($params, $loggedInUser, $translator)
{
$ids = is_array($params['organization_id']) ? $params['organization_id'] : [$params['organization_id']];
$entityStatus = $params['entity_status'] ?? null;
$trialLimit = $params['trialLimit'] ?? null;
if (!$entityStatus) {
return [
'success' => false,
'message' => $translator->trans("invalid_entity_status"),
];
}
$userRole = $loggedInUser->getRole()->getName();
if (!in_array($userRole, [USER_ROLES['NCM_IT'], USER_ROLES['NCM_OPERATOR']])) {
return [
'success' => false,
'message' => $translator->trans("%s_has_not_permission_change_entity_status", [
'%s' => $userRole,
]),
];
}
$results = [];
foreach ($ids as $orgId) {
$organization = DataObject\Organization::getById($orgId);
if (!$organization instanceof DataObject\Organization) {
$results[] = [
'id' => $orgId,
'success' => false,
'message' => $translator->trans("organization_does_not_exist"),
];
continue;
}
if ($entityStatus === "trial" && !empty($trialLimit)) {
$organization->setPackageActivationDate(Carbon::now());
$organization->setTrialLimit($trialLimit);
}
$organization->setStatus($entityStatus);
$organization->save();
$results[] = [
'id' => $orgId,
'success' => true,
'message' => $translator->trans("entity_status_updated"),
];
}
if (!is_array($params['organization_id'])) {
$single = $results[0] ?? [
'success' => false,
'message' => $translator->trans("unknown_error"),
];
return [
'success' => $single['success'],
'message' => $single['message'],
];
}
$successCount = 0;
$failedCount = 0;
foreach ($results as $r) {
if (!empty($r['success'])) {
$successCount++;
} else {
$failedCount++;
}
}
return [
'success' => true,
'processed' => $successCount,
'failed' => $failedCount,
'results' => $results,
'message' => sprintf("%s: %d", $translator->trans("entity_status_updated"), $successCount),
];
}
public function updateEntitySmsConfig($request, $params, $translator)
{
$ids = is_array($params['organizationId']) ? $params['organizationId'] : [$params['organizationId']];
$results = [];
foreach ($ids as $orgId) {
$organization = DataObject\Organization::getById($orgId,);
if (!$organization instanceof DataObject\Organization) {
$results[] = ['id' => $orgId, 'success' => false, 'message' => $translator->trans("organization_does_not_exist")];
continue;
}
$organization->setIsSMSEnabled($params['isSmsEnabled']);
$organization->save();
$results[] = ['id' => $orgId, 'success' => true, 'message' => $translator->trans('sms_config_updated')];
}
if (!is_array($params['organizationId'])) {
$single = $results[0] ?? ['success' => false, 'message' => $translator->trans('unknown_error')];
return ['success' => $single['success'], 'message' => $single['message']];
}
$successCount = 0;
foreach ($results as $r) {
if (!empty($r['success'])) {
$successCount++;
}
}
return ['success' => true, 'message' => sprintf("%s: %d", $translator->trans('sms_config_updated'), $successCount)];
}
public function renewEntitySMSConsumption($request, $params, $translator)
{
$ids = is_array($params['organizationId']) ? $params['organizationId'] : [$params['organizationId']];
$results = [];
foreach ($ids as $orgId) {
$organization = DataObject\Organization::getById($orgId,);
if (!$organization instanceof DataObject\Organization) {
$results[] = ['id' => $orgId, 'success' => false, 'message' => $translator->trans("organization_does_not_exist")];
continue;
}
$organization->setIsSMSEnabled(true);
$organization->setSmsConsumption(0);
$organization->save();
$results[] = ['id' => $orgId, 'success' => true, 'message' => $translator->trans('sms_consumption_renewed')];
}
if (!is_array($params['organizationId'])) {
$single = $results[0] ?? ['success' => false, 'message' => $translator->trans('unknown_error')];
return ['success' => $single['success'], 'message' => $single['message']];
}
$successCount = 0;
foreach ($results as $r) {
if (!empty($r['success'])) {
$successCount++;
}
}
return ['success' => true, 'message' => sprintf("%s: %d", $translator->trans('sms_consumption_renewed'), $successCount)];
}
public function bulkEntityAction($params, $packageModel, $user, $translator)
{
$actionType = $params['actionType'] ?? null;
$entityIds = $params['entityIds'] ?? [];
$payload = $params['payload'] ?? [];
$processed = 0;
foreach ($entityIds as $id) {
$entity = DataObject\Organization::getById($id);
if (!$entity instanceof DataObject\Organization) {
continue;
}
switch ($actionType) {
case 'update_status':
if (!empty($payload['status'])) {
$entity->setStatus($payload['status']); // Enum: Trial, Paid, Expired
$entity->save();
$processed++;
}
break;
case 'update_package':
if (!empty($payload['packageId'])) {
$package = DataObject\Package::getById($payload['packageId']);
if ($package instanceof DataObject\Package) {
$packageModel->updateEntityPackage($entity, $package, $translator);
$entity->setPackage($package);
$entity->save();
$processed++;
}
}
break;
case 'edit':
// Update fields dynamically (only safe editable fields!)
foreach ($payload as $field => $value) {
$setter = 'set' . ucfirst($field);
if (method_exists($entity, $setter)) {
$entity->$setter($value);
}
}
$entity->save();
$processed++;
break;
case 'soft_delete':
if ($this->getUserCountByEntity($entity) === 0) {
$entity->setIsDeleted(true); // Custom field
$entity->setDeletedBy($user);
$entity->setDeletedAt(Carbon::now());
$entity->setPublished(false);
$entity->save();
$processed++;
}
break;
}
}
return [
"success" => true,
"processed" => $processed,
"message" => $translator->trans("action_completed"),
];
}
private function calculatePackageExpiry($organization): ?string
{
try {
$packageActivationDate = $organization->getPackageActivationDate();
if (!$packageActivationDate) {
return null;
}
$trialLimit = $organization->getTrialLimit();
if (!$trialLimit || $trialLimit <= 0) {
return null;
}
if (is_numeric($packageActivationDate)) {
$activationDate = new \DateTime();
$activationDate->setTimestamp($packageActivationDate);
} else {
$activationDate = $packageActivationDate;
}
$expiryDate = clone $activationDate;
$expiryDate->add(new \DateInterval('P' . $trialLimit . 'D'));
return $expiryDate->format('Y-m-d H:i:s');
} catch (\Exception $e) {
return null;
}
}
public function suspendEntity($loggedInUser, $params, $translator)
{
$ids = is_array($params['organization_id']) ? $params['organization_id'] : [$params['organization_id']];
$userRole = $loggedInUser->getRole()->getName();
if (!in_array($userRole, [USER_ROLES['NCM_IT'], USER_ROLES['NCM_OPERATOR']])) {
return [
'success' => false,
'message' => $translator->trans("%s_has_not_permission_change_entity_status", [
'%s' => $userRole,
]),
];
}
$results = [];
foreach ($ids as $orgId) {
$organization = DataObject\Organization::getById($orgId,);
if (!$organization instanceof DataObject\Organization) {
$results[] = ['id' => $orgId, 'success' => false, 'message' => $translator->trans("organization_does_not_exist")];
continue;
}
$organization->setIsSuspend(true);
$organization->save();
$results[] = ['id' => $orgId, 'success' => true, 'message' => $translator->trans("entity_suspended")];
}
if (!is_array($params['organization_id'])) {
$single = $results[0] ?? ['success' => false, 'message' => $translator->trans("unknown_error")];
return ['success' => $single['success'], 'message' => $single['message']];
}
$successCount = 0;
foreach ($results as $r) {
if (!empty($r['success'])) {
$successCount++;
}
}
return ['success' => true, 'message' => sprintf("%s: %d", $translator->trans("entity_suspended"), $successCount)];
}
public function resumeEntity($loggedInUser, $params, $translator)
{
$ids = is_array($params['organization_id']) ? $params['organization_id'] : [$params['organization_id']];
$userRole = $loggedInUser->getRole()->getName();
if (!in_array($userRole, [USER_ROLES['NCM_IT'], USER_ROLES['NCM_OPERATOR']])) {
return [
'success' => false,
'message' => $translator->trans("%s_has_not_permission_change_entity_status", [
'%s' => $userRole,
]),
];
}
$results = [];
foreach ($ids as $orgId) {
$organization = DataObject\Organization::getById($orgId,);
if (!$organization instanceof DataObject\Organization) {
$results[] = ['id' => $orgId, 'success' => false, 'message' => $translator->trans("organization_does_not_exist")];
continue;
}
$organization->setIsSuspend(false);
$organization->save();
$results[] = ['id' => $orgId, 'success' => true, 'message' => $translator->trans("entity_resumed")];
}
if (!is_array($params['organization_id'])) {
$single = $results[0] ?? ['success' => false, 'message' => $translator->trans("unknown_error")];
return ['success' => $single['success'], 'message' => $single['message']];
}
$successCount = 0;
foreach ($results as $r) {
if (!empty($r['success'])) {
$successCount++;
}
}
return ['success' => true, 'message' => sprintf("%s: %d", $translator->trans("entity_resumed"), $successCount)];
}
}