Workforce/installer/Migration/V5_2_0/Migration.php
rajesh.n 8e294d7c5b
Some checks failed
Upgrade Test (4.x) / upgrade_test (map[file:V4_0.sql version:4.0]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_1.sql version:4.1]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_10.sql version:4.10]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_10_1.sql version:4.10.1]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_1_1.sql version:4.1.1]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_1_2.sql version:4.1.2]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_1_2_1.sql version:4.1.2.1]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_2_0_1.sql version:4.2.0.1]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_3.sql version:4.3]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_3_1.sql version:4.3.1]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_3_2.sql version:4.3.2]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_3_3.sql version:4.3.3]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_3_4.sql version:4.3.4]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_3_5.sql version:4.3.5]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_4.sql version:4.4]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_5.sql version:4.5]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_6.sql version:4.6]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_6_0_1.sql version:4.6.0.1]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_7.sql version:4.7]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_8.sql version:4.8]) (push) Has been cancelled
Upgrade Test (4.x) / upgrade_test (map[file:V4_9.sql version:4.9]) (push) Has been cancelled
Build / build (push) Has been cancelled
Cypress / cypress (push) Has been cancelled
Docker Build Test / build (push) Has been cancelled
Lint / lint (push) Has been cancelled
Scheduled Test / db_test (map[admin:mariadb-admin image:mariadb:11.0]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mariadb-admin image:mariadb:11.1]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mariadb-admin image:mariadb:11.2]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mariadb-admin image:mariadb:11.3]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mariadb-admin image:mariadb:11.4]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.0]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.10]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.11]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.1]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.2]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.3]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.4]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.5]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.6]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.7]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.8]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:10.9]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mariadb:5.5]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mysql:5.5]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mysql:5.6]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mysql:5.7]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mysql:8.0]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mysql:8.1]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mysql:8.2]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mysql:8.3]) (push) Has been cancelled
Scheduled Test / db_test (map[admin:mysqladmin image:mysql:8.4]) (push) Has been cancelled
Scheduled Test / php_test (php7.4) (push) Has been cancelled
Scheduled Test / php_test (php8.0) (push) Has been cancelled
Scheduled Test / php_test (php8.1) (push) Has been cancelled
Scheduled Test / php_test (php8.2) (push) Has been cancelled
Scheduled Test / php_test (php8.3) (push) Has been cancelled
Test / test (map[image:mariadb:10.3 name:mariadb103]) (push) Has been cancelled
Test / test (map[image:mysql:5.7 name:mysql57]) (push) Has been cancelled
Test / composer_check (push) Has been cancelled
Test / installation (push) Has been cancelled
first commit
2025-10-10 15:31:35 +05:30

376 lines
16 KiB
PHP
Executable File

<?php
/**
* OrangeHRM is a comprehensive Human Resource Management (HRM) System that captures
* all the essential functionalities required for any enterprise.
* Copyright (C) 2006 OrangeHRM Inc., http://www.orangehrm.com
*
* OrangeHRM is free software: you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation, either
* version 3 of the License, or (at your option) any later version.
*
* OrangeHRM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with OrangeHRM.
* If not, see <https://www.gnu.org/licenses/>.
*/
namespace OrangeHRM\Installer\Migration\V5_2_0;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Schema\ForeignKeyConstraint;
use Doctrine\DBAL\Types\Types;
use OrangeHRM\Core\Service\ConfigService;
use OrangeHRM\Installer\Util\Logger;
use OrangeHRM\Installer\Util\V1\AbstractMigration;
use OrangeHRM\Installer\Util\V1\LangStringHelper;
use Symfony\Component\Yaml\Yaml;
class Migration extends AbstractMigration
{
protected ?LangStringHelper $langStringHelper = null;
/**
* @inheritDoc
*/
public function up(): void
{
$this->cleanLDAPAddonData();
$this->getDataGroupHelper()->insertApiPermissions(__DIR__ . '/permission/api.yaml');
$this->getDataGroupHelper()->insertScreenPermissions(__DIR__ . '/permission/screen.yaml');
$this->getDataGroupHelper()->insertDataGroupPermissions(__DIR__ . '/permission/data_group.yaml');
$this->getSchemaHelper()->changeColumn(
'ohrm_i18n_translate',
'value',
['Notnull' => false, 'Default' => null]
);
$q = $this->createQueryBuilder()
->update('ohrm_i18n_translate', 'translate')
->set('translate.value', ':translateValue')
->where('translate.value = :currentValue');
$q->setParameter('currentValue', $q->expr()->literal(''))
->setParameter('translateValue', null)
->executeQuery();
$this->getSchemaHelper()->dropColumn(
'ohrm_i18n_translate',
'translated'
);
$this->getLangHelper()->deleteLangStringByUnitId(
'leave_requests_action',
$this->getLangHelper()->getGroupIdByName('leave')
);
$this->getLangHelper()->deleteLangStringByUnitId(
'should_be_least_n_characters',
$this->getLangHelper()->getGroupIdByName('general')
);
$oldGroups = ['admin', 'general', 'leave', 'pim', 'attendance', 'dashboard', 'time'];
foreach ($oldGroups as $group) {
$this->getLangStringHelper()->insertOrUpdateLangStrings(__DIR__, $group);
}
$this->updatePimLeftMenuConfigurators();
$this->updateOrganizationStructure();
$this->updateHomePage('Admin', 'dashboard/index');
$this->updateHomePage('ESS', 'dashboard/index');
$this->getSchemaHelper()->createTable('ohrm_user_auth_provider')
->addColumn('id', Types::INTEGER, ['Autoincrement' => true])
->addColumn('user_id', Types::INTEGER, ['Notnull' => true])
->addColumn('provider_type', Types::INTEGER, ['Notnull' => true])
->addColumn('ldap_user_hash', Types::STRING, ['Length' => 255, 'Notnull' => false, 'Default' => null])
->addColumn('ldap_user_dn', Types::STRING, ['Length' => 255, 'Notnull' => false, 'Default' => null])
->addColumn('ldap_user_unique_id', Types::STRING, ['Length' => 255, 'Notnull' => false, 'Default' => null])
->setPrimaryKey(['id'])
->create();
$foreignKeyConstraint = new ForeignKeyConstraint(
['user_id'],
'ohrm_user',
['id'],
'ohrm_user_id',
['onDelete' => 'CASCADE', 'onUpdate' => 'RESTRICT']
);
$this->getSchemaHelper()->addForeignKey('ohrm_user_auth_provider', $foreignKeyConstraint);
$q = $this->createQueryBuilder()
->update('ohrm_user', 'user')
->set('user.user_password', ':nullValue')
->setParameter('nullValue', null);
$q->where('user.user_password = :emptyString')
->setParameter('emptyString', $q->expr()->literal(''))
->executeQuery();
$this->getSchemaHelper()->createTable('ohrm_ldap_sync_status')
->addColumn('id', Types::INTEGER, ['Autoincrement' => true])
->addColumn('sync_started_at', Types::DATETIME_MUTABLE, ['Notnull' => true])
->addColumn('sync_finished_at', Types::DATETIME_MUTABLE, ['Notnull' => false, 'Default' => null])
->addColumn('synced_by', Types::INTEGER, ['Notnull' => false, 'Default' => null])
->addColumn('sync_status', Types::INTEGER, ['Notnull' => true])
->setPrimaryKey(['id'])
->create();
$foreignKeyConstraint = new ForeignKeyConstraint(
['synced_by'],
'ohrm_user',
['id'],
'ohrm_ldap_sync_status_synced_by',
['onDelete' => 'SET NULL', 'onUpdate' => 'RESTRICT']
);
$this->getSchemaHelper()->addForeignKey('ohrm_ldap_sync_status', $foreignKeyConstraint);
$this->getSchemaHelper()->createTable('ohrm_task_scheduler_log')
->addColumn('id', Types::INTEGER, ['Autoincrement' => true])
->addColumn('started_at', Types::DATETIME_MUTABLE, ['Notnull' => true])
->addColumn('finished_at', Types::DATETIME_MUTABLE, ['Notnull' => false, 'Default' => null])
->addColumn('command', Types::STRING, ['Length' => 255, 'Notnull' => true])
->addColumn('input', Types::TEXT, ['Notnull' => false, 'Default' => null, 'Comment' => '(DC2Type:json)'])
->addColumn('status', Types::INTEGER, ['Notnull' => true])
->setPrimaryKey(['id'])
->create();
$this->cleanI18nGroups();
$this->insertLDAPMenuItem();
$this->insertLangStringNotes();
$this->getConfigHelper()
->setConfigValue(
ConfigService::KEY_DASHBOARD_EMPLOYEES_ON_LEAVE_TODAY_SHOW_ONLY_ACCESSIBLE,
0
);
$this->getSchemaHelper()->dropIndex('ohrm_user', 'user_name');
$this->getConfigHelper()->setConfigValue('help.url', 'https://starterhelp.orangehrm.com');
$this->getConfigHelper()->setConfigValue('help.processorClass', 'ZendeskHelpProcessor');
Logger::getLogger()->info('Deleting invalid config values');
$this->getConfigHelper()->deleteConfigValue('https://opensourcehelp.orangehrm.com');
$this->getConfigHelper()->deleteConfigValue('ZendeskHelpProcessor');
Logger::getLogger()->info('Deleting legacy config values');
$this->getConfigHelper()->deleteConfigValue('ldap_domain_name');
$this->getConfigHelper()->deleteConfigValue('ldap_port');
$this->getConfigHelper()->deleteConfigValue('ldap_server');
$this->getConfigHelper()->deleteConfigValue('ldap_status');
$this->getConfigHelper()->deleteConfigValue('beacon.activation_acceptance_status');
$this->getConfigHelper()->deleteConfigValue('beacon.activiation_status');
$this->getConfigHelper()->deleteConfigValue('beacon.company_name');
$this->getConfigHelper()->deleteConfigValue('beacon.flash_period');
$this->getConfigHelper()->deleteConfigValue('beacon.lock');
$this->getConfigHelper()->deleteConfigValue('beacon.next_flash_time');
$this->getConfigHelper()->deleteConfigValue('beacon.uuid');
$this->getConfigHelper()->deleteConfigValue('showSIN');
$this->getConfigHelper()->deleteConfigValue('showSSN');
$this->getConfigHelper()->deleteConfigValue('showTaxExemptions');
$this->getConfigHelper()->deleteConfigValue('report.mysql_group_concat_max_len');
$this->getConfigHelper()->deleteConfigValue('attendanceEmpEditSubmitted');
$this->getConfigHelper()->deleteConfigValue('attendanceSupEditSubmitted');
$this->getConfigHelper()->deleteConfigValue('hsp_accrued_last_updated');
$this->getConfigHelper()->deleteConfigValue('hsp_current_plan');
$this->getConfigHelper()->deleteConfigValue('hsp_used_last_updated');
}
/**
* @inheritDoc
*/
public function getVersion(): string
{
return '5.2.0';
}
/**
* @return LangStringHelper
*/
public function getLangStringHelper(): LangStringHelper
{
if (is_null($this->langStringHelper)) {
$this->langStringHelper = new LangStringHelper(
$this->getConnection()
);
}
return $this->langStringHelper;
}
private function updatePimLeftMenuConfigurators(): void
{
$qb = $this->createQueryBuilder()
->update('ohrm_screen', 'screen')
->set('screen.menu_configurator', ':menuConfiguratorClassName')
->setParameter('menuConfiguratorClassName', 'OrangeHRM\\Pim\\Menu\\PIMLeftMenuItemConfigurator')
->andWhere('screen.module_id = :moduleId')
->setParameter('moduleId', $this->getDataGroupHelper()->getModuleIdByName('pim'));
$qb->andWhere($qb->expr()->in('screen.action_url', ':screenUrls'))
->setParameter('screenUrls', [
'viewPersonalDetails',
'contactDetails',
'viewEmergencyContacts',
'viewDependents',
'viewImmigration',
'viewJobDetails',
'viewSalaryList',
'viewUsTaxExemptions',
'viewReportToDetails',
'viewQualifications',
'viewMemberships',
'viewPhotograph',
], Connection::PARAM_STR_ARRAY);
$qb->executeQuery();
}
private function updateOrganizationStructure(): void
{
$q = $this->createQueryBuilder();
$q->select('orgInfo.name')
->from('ohrm_organization_gen_info', 'orgInfo');
$organizationName = $q->executeQuery()->fetchOne();
if ($organizationName != null) {
$this->createQueryBuilder()
->update('ohrm_subunit', 'subunit')
->set('subunit.name', ':organizationName')
->setParameter('organizationName', $organizationName)
->andWhere('subunit.level = :topLevel')
->setParameter('topLevel', 0)
->executeQuery();
}
}
/**
* @param string $userRole
* @param string $url
*/
private function updateHomePage(string $userRole, string $url): void
{
$this->createQueryBuilder()
->update('ohrm_home_page', 'homePage')
->set('homePage.action', ':url')
->setParameter('url', $url)
->andWhere('homePage.user_role_id = :userRoleId')
->setParameter('userRoleId', $this->getDataGroupHelper()->getUserRoleIdByName($userRole))
->executeQuery();
}
private function insertLDAPMenuItem(): void
{
$adminId = $this->createQueryBuilder()
->select('menu_item.id')
->from('ohrm_menu_item', 'menu_item')
->where('menu_item.menu_title = :menuTitle')
->setParameter('menuTitle', 'Admin')
->andWhere('level = :level')
->setParameter('level', 1)
->executeQuery()
->fetchOne();
$configurationId = $this->createQueryBuilder()
->select('menu_item.id')
->from('ohrm_menu_item', 'menu_item')
->where('menu_item.menu_title = :menuTitle')
->setParameter('menuTitle', 'Configuration')
->andWhere('level = :level')
->setParameter('level', 2)
->andWhere('parent_id = :parentId')
->setParameter('parentId', $adminId)
->executeQuery()
->fetchOne();
$ldapConfigScreenId = $this->createQueryBuilder()
->select('screen.id')
->from('ohrm_screen', 'screen')
->where('screen.name = :screenName')
->setParameter('screenName', 'Admin - LDAP Configuration')
->executeQuery()
->fetchOne();
$this->createQueryBuilder()
->insert('ohrm_menu_item')
->values(
[
'menu_title' => ':menuTitle',
'screen_id' => ':screenId',
'parent_id' => ':parentId',
'level' => ':level',
'order_hint' => ':orderHint',
'status' => ':status'
]
)
->setParameter('menuTitle', 'LDAP Configuration')
->setParameter('screenId', $ldapConfigScreenId)
->setParameter('parentId', $configurationId)
->setParameter('level', 3)
->setParameter('orderHint', 1000)
->setParameter('status', 1)
->executeQuery();
}
private function cleanLDAPAddonData(): void
{
$this->createQueryBuilder()
->delete('ohrm_data_group')
->andWhere('ohrm_data_group.name = :dataGroupName')
->setParameter('dataGroupName', 'ldap_configuration')
->executeQuery();
$this->createQueryBuilder()
->delete('ohrm_screen')
->andWhere('ohrm_screen.name = :screenName')
->setParameter('screenName', 'LDAP Configuration')
->executeQuery();
$this->createQueryBuilder()
->delete('ohrm_module')
->andWhere('ohrm_module.name = :moduleName')
->setParameter('moduleName', 'ldapAuthentication')
->executeQuery();
}
private function insertLangStringNotes(): void
{
$filepath = $filepath = __DIR__ . '/lang-string/notes.yaml';
$yml = Yaml::parseFile($filepath);
$langStrings = array_shift($yml);
foreach ($langStrings as $langString) {
$groupId = $this->langStringHelper->getGroupId($langString['group']);
$this->createQueryBuilder()
->update('ohrm_i18n_lang_string', 'langString')
->set('langString.note', ':note')
->setParameter('note', $langString['note'])
->where('langString.unit_id = :unitId')
->andWhere('langString.group_id = :group')
->setParameter('unitId', $langString['unitId'])
->setParameter('group', $groupId)
->executeQuery();
}
}
private function cleanI18nGroups(): void
{
$qb = $this->createQueryBuilder()->delete('ohrm_i18n_group');
$qb->where($qb->expr()->in('ohrm_i18n_group.name', ':groups'))
->setParameter('groups', ['directory', 'branding'], Connection::PARAM_STR_ARRAY)
->executeQuery();
$qb = $this->createQueryBuilder()
->select('ohrm_i18n_group.id')
->from('ohrm_i18n_group')
->andWhere('ohrm_i18n_group.name = :name')
->setParameter('name', 'help')
->orderBy('ohrm_i18n_group.id', 'DESC');
$ids = $qb->executeQuery()->fetchFirstColumn();
$helpGroupId = array_pop($ids);
$qb = $this->createQueryBuilder()
->update('ohrm_i18n_lang_string', 'langString')
->set('langString.group_id', ':groupId')
->setParameter('groupId', $helpGroupId);
$qb->andWhere($qb->expr()->in('langString.group_id', ':groupsToBeDeleted'))
->setParameter('groupsToBeDeleted', $ids, Connection::PARAM_INT_ARRAY)
->executeQuery();
$qb = $this->createQueryBuilder()
->delete('ohrm_i18n_group');
$qb->where($qb->expr()->in('ohrm_i18n_group.id', ':groupsToBeDeleted'))
->setParameter('groupsToBeDeleted', $ids, Connection::PARAM_INT_ARRAY)
->executeQuery();
}
}