<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use App\DBAL\Types\AccessRoleType;
use App\Entity\User;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
use EWZ\SymfonyAdminBundle\Util\StringUtil;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\String\Slugger\AsciiSlugger;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20180809165311 extends AbstractMigration implements ContainerAwareInterface
{
/** @var ContainerInterface */
private $container;
/**
* @param ContainerInterface|null $container
*/
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf('mysql' !== $this->connection->getDatabasePlatform()->getName(), 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('DROP TABLE administrators_favorites');
$this->addSql('RENAME TABLE administrators_teams TO user_team');
$this->addSql('ALTER TABLE user_team ENGINE = InnoDB');
$this->addSql('ALTER TABLE user_team CHARACTER SET = utf8mb4');
$this->addSql('
ALTER TABLE user_team
DROP type,
CHANGE name name VARCHAR(255) NOT NULL
');
$this->addSql('
CREATE TABLE user_report (
object_id INT NOT NULL,
report_id INT NOT NULL,
INDEX IDX_A17D6CB9232D562B (object_id),
INDEX IDX_A17D6CB94BD2A4C0 (report_id),
PRIMARY KEY(object_id, report_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE group_report (
object_id INT NOT NULL,
report_id INT NOT NULL,
INDEX IDX_17A9AF54232D562B (object_id),
INDEX IDX_17A9AF544BD2A4C0 (report_id),
PRIMARY KEY(object_id, report_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE report (
id INT AUTO_INCREMENT NOT NULL,
token VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
category VARCHAR(255) NOT NULL,
enabled TINYINT(1) NOT NULL,
INDEX idx_token (token),
INDEX idx_name (name),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
foreach ($this->getReports() as $key => $value) {
$id = (int) (array_search($key, array_keys($this->getReports()))) + 1;
$slugger = new AsciiSlugger();
$token = $slugger->slug(sprintf('%s_%s', $value['category'], $value['name']));
$this->addSql('INSERT INTO report (id, token, name, category, enabled) VALUES (:id, :token, :name, :category, 1)', [
'id' => $id,
'token' => $token,
'name' => $value['name'],
'category' => $value['category'],
]);
}
$this->addSql('
CREATE TABLE user_widget (
object_id INT NOT NULL,
widget_id INT NOT NULL,
INDEX IDX_E0AB05ED232D562B (object_id),
INDEX IDX_E0AB05EDFBE885E2 (widget_id),
PRIMARY KEY(object_id, widget_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE group_widget (
object_id INT NOT NULL,
widget_id INT NOT NULL,
INDEX IDX_567FC600232D562B (object_id),
INDEX IDX_567FC600FBE885E2 (widget_id),
PRIMARY KEY(object_id, widget_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE widget (
id INT AUTO_INCREMENT NOT NULL,
token VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
category VARCHAR(255) NOT NULL,
enabled TINYINT(1) NOT NULL,
INDEX idx_token (token),
INDEX idx_name (name),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
foreach ($this->getWidgets() as $key => $value) {
$id = (int) (array_search($key, array_keys($this->getWidgets()))) + 1;
$slugger = new AsciiSlugger();
$token = $slugger->slug(sprintf('%s_%s', $value['category'], $value['name']));
$this->addSql('INSERT INTO widget (id, token, name, category, enabled) VALUES (:id, :token, :name, :category, 1)', [
'id' => $id,
'token' => $token,
'name' => $value['name'],
'category' => $value['category'],
]);
}
$this->addSql('
ALTER TABLE administrators_groups
ADD access_customer_entity TINYINT(1) NOT NULL,
ADD access_customer_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_lead_entity TINYINT(1) NOT NULL,
ADD access_lead_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_event_entity TINYINT(1) NOT NULL,
ADD access_event_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_feed_entity TINYINT(1) NOT NULL,
ADD access_feed_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_issue_entity TINYINT(1) NOT NULL,
ADD access_issue_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_message_entity TINYINT(1) NOT NULL,
ADD access_message_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_all_reports TINYINT(1) NOT NULL,
ADD access_all_widgets TINYINT(1) NOT NULL
');
$stmt = $this->connection->prepare('SELECT * FROM administrators_groups');
$stmt->execute();
while ($row = $stmt->fetch(\PDO::FETCH_OBJ)) {
$reports = $row->reports ? explode(',', $row->reports) : [];
$widgets = $row->dashboard ? explode(',', $row->dashboard) : [];
$permissions = $row->permissions ? json_decode($row->permissions, true) : [];
$accessCustomerEntityRoles = [];
$accessLeadEntityRoles = [];
$accessEventEntityRoles = [];
if (\array_key_exists('customers', $permissions)) {
if (\in_array('new', $permissions['customers'])) {
$accessCustomerEntityRoles[] = AccessRoleType::CREATE;
}
if (\in_array('edit', $permissions['customers'])) {
$accessCustomerEntityRoles[] = AccessRoleType::EDIT;
}
if (\in_array('delete', $permissions['customers'])) {
$accessCustomerEntityRoles[] = AccessRoleType::DELETE;
}
}
if (\array_key_exists('leads', $permissions)) {
if (\in_array('new', $permissions['leads'])) {
$accessLeadEntityRoles[] = AccessRoleType::CREATE;
}
if (\in_array('edit', $permissions['leads'])) {
$accessLeadEntityRoles[] = AccessRoleType::EDIT;
}
if (\in_array('delete', $permissions['leads'])) {
$accessLeadEntityRoles[] = AccessRoleType::DELETE;
}
}
if (\array_key_exists('events', $permissions)) {
if (\in_array('new', $permissions['events'])) {
$accessEventEntityRoles[] = AccessRoleType::CREATE;
}
if (\in_array('edit', $permissions['events'])) {
$accessEventEntityRoles[] = AccessRoleType::EDIT;
}
if (\in_array('delete', $permissions['events'])) {
$accessEventEntityRoles[] = AccessRoleType::DELETE;
}
}
if (\array_key_exists('*', $permissions)) {
$accessCustomerEntityRoles = [
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
];
$accessLeadEntityRoles = [
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
];
$accessEventEntityRoles = [
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
];
}
if (empty($accessCustomerEntityRoles)) {
$accessCustomerEntityRoles = null;
}
if (empty($accessLeadEntityRoles)) {
$accessLeadEntityRoles = null;
}
if (empty($accessEventEntityRoles)) {
$accessEventEntityRoles = null;
}
$this->addSql('UPDATE administrators_groups SET access_all_reports = :access_all_reports, access_all_widgets = :access_all_widgets, access_customer_entity = :access_customer_entity, access_customer_entity_role = :access_customer_entity_role, access_lead_entity = :access_lead_entity, access_lead_entity_role = :access_lead_entity_role, access_event_entity = :access_event_entity, access_event_entity_role = :access_event_entity_role, access_feed_entity = :access_feed_entity, access_feed_entity_role = :access_feed_entity_role, access_issue_entity = :access_issue_entity, access_issue_entity_role = :access_issue_entity_role, access_message_entity = :access_message_entity, access_message_entity_role = :access_message_entity_role WHERE id = :id', [
'id' => $row->id,
'access_all_reports' => (int) \in_array('*', $reports),
'access_all_widgets' => (int) \in_array('*', $reports),
'access_customer_entity' => (int) (\array_key_exists('*', $permissions) || \array_key_exists('customers', $permissions)),
'access_customer_entity_role' => $accessCustomerEntityRoles ? serialize($accessCustomerEntityRoles) : null,
'access_lead_entity' => (int) (\array_key_exists('*', $permissions) || \array_key_exists('leads', $permissions)),
'access_lead_entity_role' => $accessLeadEntityRoles ? serialize($accessLeadEntityRoles) : null,
'access_event_entity' => (int) (\array_key_exists('*', $permissions) || \array_key_exists('events', $permissions)),
'access_event_entity_role' => $accessEventEntityRoles ? serialize($accessEventEntityRoles) : null,
'access_feed_entity' => true,
'access_feed_entity_role' => serialize([
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
]),
'access_issue_entity' => true,
'access_issue_entity_role' => serialize([
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
]),
'access_message_entity' => true,
'access_message_entity_role' => serialize([
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
]),
]);
if (!empty($reports)) {
$reports = array_unique($reports);
foreach ($reports as $report) {
if ($report && '*' !== $report && \array_key_exists($report, $this->getReports())) {
$report = (int) (array_search($report, array_keys($this->getReports()))) + 1;
$this->addSql('INSERT INTO group_report (object_id, report_id) values (:object_id, :report_id)', [
'object_id' => $row->id,
'report_id' => $report,
]);
}
}
}
if (!empty($widgets)) {
$widgets = array_unique($widgets);
foreach ($widgets as $widget) {
if ($widget && '*' !== $widget) {
$tmp = [];
if (\array_key_exists($widget, $this->getWidgets())) {
$tmp[] = $widget;
} else {
foreach ($this->getWidgets() as $key => $value) {
$legacy = $value['legacy'] ?? [];
if (!\is_array($legacy)) {
$legacy = [$legacy];
}
if (\in_array($widget, $legacy)) {
$tmp[] = $key;
}
}
}
foreach ($tmp as $widget) {
$widget = (int) (array_search($widget, array_keys($this->getWidgets()))) + 1;
$this->addSql('INSERT IGNORE INTO group_widget (object_id, widget_id) values (:object_id, :widget_id)', [
'object_id' => $row->id,
'widget_id' => $widget,
]);
}
}
}
}
}
$this->addSql('RENAME TABLE administrators_groups TO user_group');
$this->addSql('ALTER TABLE user_group ENGINE = InnoDB');
$this->addSql('ALTER TABLE user_group CHARACTER SET = utf8mb4');
$this->addSql('
ALTER TABLE user_group
DROP permissions,
DROP reports,
DROP dashboard,
CHANGE name name VARCHAR(255) NOT NULL
');
$this->addSql('
CREATE TABLE user_join_group (
user_id INT NOT NULL,
group_id INT NOT NULL,
INDEX IDX_43E5F184A76ED395 (user_id),
INDEX IDX_43E5F184FE54D947 (group_id),
PRIMARY KEY(user_id, group_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE user_join_team (
user_id INT NOT NULL,
team_id INT NOT NULL,
INDEX IDX_55586662A76ED395 (user_id),
INDEX IDX_55586662296CD8AE (team_id),
PRIMARY KEY(user_id, team_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE user_join_access_user (
user_id INT NOT NULL,
access_user_id INT NOT NULL,
INDEX IDX_C256DA04A76ED395 (user_id),
INDEX IDX_C256DA046F4B0980 (access_user_id),
PRIMARY KEY(user_id, access_user_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE user_join_access_group (
user_id INT NOT NULL,
access_group_id INT NOT NULL,
INDEX IDX_65E2BCE4A76ED395 (user_id),
INDEX IDX_65E2BCE493411876 (access_group_id),
PRIMARY KEY(user_id, access_group_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE user_join_access_chat_user (
user_id INT NOT NULL,
access_user_id INT NOT NULL,
INDEX IDX_213F6F29A76ED395 (user_id),
INDEX IDX_213F6F296F4B0980 (access_user_id),
PRIMARY KEY(user_id, access_user_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE user_join_access_chat_group (
user_id INT NOT NULL,
access_group_id INT NOT NULL,
INDEX IDX_20DE8924A76ED395 (user_id),
INDEX IDX_20DE892493411876 (access_group_id),
PRIMARY KEY(user_id, access_group_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
ALTER TABLE administrators
ADD access_all_users TINYINT(1) NOT NULL,
ADD access_all_groups TINYINT(1) NOT NULL,
ADD access_chat_all_users TINYINT(1) NOT NULL,
ADD access_chat_all_groups TINYINT(1) NOT NULL,
ADD access_customer_entity TINYINT(1) NOT NULL,
ADD access_customer_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_lead_entity TINYINT(1) NOT NULL,
ADD access_lead_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_event_entity TINYINT(1) NOT NULL,
ADD access_event_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_feed_entity TINYINT(1) NOT NULL,
ADD access_feed_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_issue_entity TINYINT(1) NOT NULL,
ADD access_issue_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_message_entity TINYINT(1) NOT NULL,
ADD access_message_entity_role LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
ADD access_all_reports TINYINT(1) NOT NULL,
ADD access_all_widgets TINYINT(1) NOT NULL,
ADD access_group_permissions TINYINT(1) NOT NULL,
CHANGE user_password user_password VARCHAR(255) DEFAULT NULL
');
$stmt = $this->connection->prepare('SELECT * FROM administrators');
$stmt->execute();
/** @var UserPasswordEncoderInterface $encoder */
$encoder = $this->container->get('security.password_encoder');
while ($row = $stmt->fetch(\PDO::FETCH_OBJ)) {
$levels = $row->levels ? explode(',', $row->levels) : [];
$colors = $row->colors ? explode(',', $row->colors) : [];
$phones = $row->phones ? unserialize($row->phones) : [];
$networks = $row->networks ? unserialize($row->networks) : [];
$tmp = [];
foreach ($levels as $level) {
switch ((int) $level) {
case 1: $tmp[] = 'red'; break;
case 2: $tmp[] = 'copper'; break;
case 3: $tmp[] = 'bronze'; break;
case 4: $tmp[] = 'silver'; break;
case 5: $tmp[] = 'gold'; break;
case 6: $tmp[] = 'platinum'; break;
case 7: $tmp[] = 'diamond'; break;
}
}
$levels = !empty($tmp) ? $tmp : null;
$tmp = [];
foreach ($colors as $color) {
if (\in_array($color, [
'006400', // green
'eeee00', // yellow
'ffa500', // orange
'ff0000', // red
'ffc0cb', // pink
'0000ff', // blue
'a020f0', // purple
'00ffff', // aqua
'00ff00', // lime
'999999', // grey
])) {
$tmp[] = $color;
}
}
$colors = !empty($tmp) ? $tmp : null;
$tmp = [];
foreach ($phones as $key => $value) {
$tmp[] = [
'key' => $key,
'value' => $value,
];
}
$phones = !empty($tmp) ? $tmp : null;
$tmp = [];
foreach ($networks as $key => $value) {
$tmp[] = [
'key' => $key,
'value' => $value,
];
}
$networks = !empty($tmp) ? $tmp : null;
$users = $row->owner_administrators ? explode(',', $row->owner_administrators) : [];
$groups = $row->owner_administrators_groups ? explode(',', $row->owner_administrators_groups) : [];
$chatUsers = $row->chats_administrators ? explode(',', $row->chats_administrators) : [];
$chatGroups = $row->chats_administrators_groups ? explode(',', $row->chats_administrators_groups) : [];
$reports = $row->reports ? explode(',', $row->reports) : [];
$widgets = $row->dashboard ? explode(',', $row->dashboard) : [];
$permissions = $row->permissions ? json_decode($row->permissions, true) : [];
$accessCustomerEntityRoles = [];
$accessLeadEntityRoles = [];
$accessEventEntityRoles = [];
if (\array_key_exists('customers', $permissions)) {
if (\in_array('new', $permissions['customers'])) {
$accessCustomerEntityRoles[] = AccessRoleType::CREATE;
}
if (\in_array('edit', $permissions['customers'])) {
$accessCustomerEntityRoles[] = AccessRoleType::EDIT;
}
if (\in_array('delete', $permissions['customers'])) {
$accessCustomerEntityRoles[] = AccessRoleType::DELETE;
}
}
if (\array_key_exists('leads', $permissions)) {
if (\in_array('new', $permissions['leads'])) {
$accessLeadEntityRoles[] = AccessRoleType::CREATE;
}
if (\in_array('edit', $permissions['leads'])) {
$accessLeadEntityRoles[] = AccessRoleType::EDIT;
}
if (\in_array('delete', $permissions['leads'])) {
$accessLeadEntityRoles[] = AccessRoleType::DELETE;
}
}
if (\array_key_exists('events', $permissions)) {
if (\in_array('new', $permissions['events'])) {
$accessEventEntityRoles[] = AccessRoleType::CREATE;
}
if (\in_array('edit', $permissions['events'])) {
$accessEventEntityRoles[] = AccessRoleType::EDIT;
}
if (\in_array('delete', $permissions['events'])) {
$accessEventEntityRoles[] = AccessRoleType::DELETE;
}
}
if (\array_key_exists('*', $permissions)) {
$accessCustomerEntityRoles = [
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
];
$accessLeadEntityRoles = [
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
];
$accessEventEntityRoles = [
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
];
}
if (empty($accessCustomerEntityRoles)) {
$accessCustomerEntityRoles = null;
}
if (empty($accessLeadEntityRoles)) {
$accessLeadEntityRoles = null;
}
if (empty($accessEventEntityRoles)) {
$accessEventEntityRoles = null;
}
// set random password when missing
$row->raw_password = $row->raw_password ?: StringUtil::generatePassword();
$this->addSql('UPDATE administrators SET user_password = :user_password, raw_password = :raw_password, levels = :levels, colors = :colors, phones = :phones, networks = :networks, access_all_users = :access_all_users, access_all_groups = :access_all_groups, access_chat_all_users = :access_chat_all_users, access_chat_all_groups = :access_chat_all_groups, access_all_reports = :access_all_reports, access_all_widgets = :access_all_widgets, access_customer_entity = :access_customer_entity, access_customer_entity_role = :access_customer_entity_role, access_lead_entity = :access_lead_entity, access_lead_entity_role = :access_lead_entity_role, access_event_entity = :access_event_entity, access_event_entity_role = :access_event_entity_role, access_feed_entity = :access_feed_entity, access_feed_entity_role = :access_feed_entity_role, access_issue_entity = :access_issue_entity, access_issue_entity_role = :access_issue_entity_role, access_message_entity = :access_message_entity, access_message_entity_role = :access_message_entity_role, access_group_permissions = :access_group_permissions WHERE id = :id', [
'id' => $row->id,
'user_password' => $encoder->encodePassword(new User(), $row->raw_password),
'raw_password' => $row->raw_password,
'levels' => $levels ? serialize($levels) : null,
'colors' => $colors ? serialize($colors) : null,
'phones' => $phones ? serialize($phones) : null,
'networks' => $networks ? serialize($networks) : null,
'access_all_users' => (int) \in_array('*', $users),
'access_all_groups' => (int) \in_array('*', $groups),
'access_chat_all_users' => (int) \in_array('*', $chatUsers),
'access_chat_all_groups' => (int) \in_array('*', $chatGroups),
'access_all_reports' => (int) \in_array('*', $reports),
'access_all_widgets' => (int) \in_array('*', $widgets),
'access_customer_entity' => (int) (\array_key_exists('*', $permissions) || \array_key_exists('customers', $permissions)),
'access_customer_entity_role' => $accessCustomerEntityRoles ? serialize($accessCustomerEntityRoles) : null,
'access_lead_entity' => (int) (\array_key_exists('*', $permissions) || \array_key_exists('leads', $permissions)),
'access_lead_entity_role' => $accessLeadEntityRoles ? serialize($accessLeadEntityRoles) : null,
'access_event_entity' => (int) (\array_key_exists('*', $permissions) || \array_key_exists('events', $permissions)),
'access_event_entity_role' => $accessEventEntityRoles ? serialize($accessEventEntityRoles) : null,
'access_feed_entity' => (int) (1 == $row->view_profile_feeds),
'access_feed_entity_role' => 1 == $row->view_profile_feeds
? serialize([
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
])
: null,
'access_issue_entity' => (int) (1 == $row->view_profile_issues),
'access_issue_entity_role' => 1 == $row->view_profile_issues
? serialize([
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
])
: null,
'access_message_entity' => (int) (1 == $row->view_profile_messages),
'access_message_entity_role' => 1 == $row->view_profile_messages
? serialize([
AccessRoleType::CREATE,
AccessRoleType::EDIT,
AccessRoleType::DELETE,
])
: null,
'access_group_permissions' => (int) (1 == $row->group_permissions),
]);
if ($row->administrators_groups) {
$adminGroups = explode(',', $row->administrators_groups);
$adminGroups = array_unique($adminGroups);
foreach ($adminGroups as $group) {
if ($group && '*' !== $group) {
$this->addSql('INSERT INTO user_join_group (user_id, group_id) values (:user_id, :group_id)', [
'user_id' => $row->id,
'group_id' => $group,
]);
}
}
}
if ($row->administrators_teams) {
$adminTeams = explode(',', $row->administrators_teams);
$adminTeams = array_unique($adminTeams);
foreach ($adminTeams as $team) {
if ($team && '*' !== $team) {
$this->addSql('INSERT INTO user_join_team (user_id, team_id) values (:user_id, :team_id)', [
'user_id' => $row->id,
'team_id' => $team,
]);
}
}
}
if (!empty($users)) {
$users = array_unique($users);
foreach ($users as $user) {
if ($user && '*' !== $user) {
$this->addSql('INSERT INTO user_join_access_user (user_id, access_user_id) values (:user_id, :access_user_id)', [
'user_id' => $row->id,
'access_user_id' => $user,
]);
}
}
}
if (!empty($groups)) {
$groups = array_unique($groups);
foreach ($groups as $group) {
if ($group && '*' !== $group) {
$this->addSql('INSERT INTO user_join_access_group (user_id, access_group_id) values (:user_id, :access_group_id)', [
'user_id' => $row->id,
'access_group_id' => $group,
]);
}
}
}
if (!empty($chatUsers)) {
$users = array_unique($chatUsers);
foreach ($users as $user) {
if ($user && '*' !== $user) {
$this->addSql('INSERT INTO user_join_access_chat_user (user_id, access_user_id) values (:user_id, :access_user_id)', [
'user_id' => $row->id,
'access_user_id' => $user,
]);
}
}
}
if (!empty($chatGroups)) {
$groups = array_unique($chatGroups);
foreach ($groups as $group) {
if ($group && '*' !== $group) {
$this->addSql('INSERT INTO user_join_access_chat_group (user_id, access_group_id) values (:user_id, :access_group_id)', [
'user_id' => $row->id,
'access_group_id' => $group,
]);
}
}
}
if (!empty($reports)) {
$reports = array_unique($reports);
foreach ($reports as $report) {
if ($report && '*' !== $report && \array_key_exists($report, $this->getReports())) {
$report = (int) (array_search($report, array_keys($this->getReports()))) + 1;
$this->addSql('INSERT INTO user_report (object_id, report_id) values (:object_id, :report_id)', [
'object_id' => $row->id,
'report_id' => $report,
]);
}
}
}
if (!empty($widgets)) {
$widgets = array_unique($widgets);
foreach ($widgets as $widget) {
if ($widget && '*' !== $widget) {
$tmp = [];
if (\array_key_exists($widget, $this->getWidgets())) {
$tmp[] = $widget;
} else {
foreach ($this->getWidgets() as $key => $value) {
$legacy = $value['legacy'] ?? [];
if (!\is_array($legacy)) {
$legacy = [$legacy];
}
if (\in_array($widget, $legacy)) {
$tmp[] = $key;
}
}
}
foreach ($tmp as $widget) {
$widget = (int) (array_search($widget, array_keys($this->getWidgets()))) + 1;
$this->addSql('INSERT IGNORE INTO user_widget (object_id, widget_id) values (:object_id, :widget_id)', [
'object_id' => $row->id,
'widget_id' => $widget,
]);
}
}
}
}
}
$this->addSql('RENAME TABLE administrators TO user');
$this->addSql('ALTER TABLE user ENGINE = InnoDB');
$this->addSql('ALTER TABLE user CHARACTER SET = utf8mb4');
$this->addSql('UPDATE user SET status = 0 WHERE status IS NULL');
$this->addSql('UPDATE user SET view_export_button = 0 WHERE view_export_button IS NULL');
$this->addSql('UPDATE user SET view_service_notes = 0 WHERE view_service_notes IS NULL');
$this->addSql('UPDATE user SET view_sales_notes = 0 WHERE view_sales_notes IS NULL');
$this->addSql('UPDATE user SET view_stage_reset = 0 WHERE view_stage_reset IS NULL');
$this->addSql('UPDATE user SET view_issue_send_to_field = 0 WHERE view_issue_send_to_field IS NULL');
$this->addSql('UPDATE user SET view_feed_permission_fields = 0 WHERE view_feed_permission_fields IS NULL');
$this->addSql('UPDATE user SET view_events = 0 WHERE view_events IS NULL');
$this->addSql('UPDATE user SET view_all_customers = 0 WHERE view_all_customers IS NULL');
$this->addSql('UPDATE user SET view_private_files = 0 WHERE view_private_files IS NULL');
$this->addSql('UPDATE user SET view_source = 0 WHERE view_source IS NULL');
$this->addSql('UPDATE user SET view_widgets_as_admin = 0 WHERE view_widgets_as_admin IS NULL');
$this->addSql('UPDATE user SET payments = 0 WHERE payments IS NULL');
$this->addSql('
ALTER TABLE user
DROP administrators_groups,
DROP administrators_teams,
DROP group_permissions,
DROP permissions,
DROP reports,
DROP dashboard,
DROP owner_administrators,
DROP owner_administrators_groups,
DROP chats_administrators,
DROP chats_administrators_groups,
DROP view_event_notifications,
DROP view_lead_notifications,
DROP view_fee,
DROP view_pdf_form,
DROP view_document_type,
DROP view_message_type,
DROP view_profile_messages,
DROP view_profile_feeds,
DROP view_profile_issues,
ADD name VARCHAR(255) DEFAULT NULL,
ADD username_canonical VARCHAR(255) NOT NULL,
ADD email_canonical VARCHAR(255) NOT NULL,
ADD salt VARCHAR(255) DEFAULT NULL,
ADD password_requested_at DATETIME DEFAULT NULL,
ADD confirmation_token VARCHAR(255) DEFAULT NULL,
ADD roles LONGTEXT NOT NULL COMMENT \'(DC2Type:array)\',
ADD middle_name VARCHAR(255) DEFAULT NULL,
ADD city VARCHAR(255) DEFAULT NULL,
ADD state VARCHAR(255) DEFAULT NULL,
ADD zip VARCHAR(255) DEFAULT NULL,
ADD first_phone VARCHAR(255) DEFAULT NULL,
ADD first_fax VARCHAR(255) DEFAULT NULL,
ADD first_social_media_account VARCHAR(255) DEFAULT NULL,
CHANGE firstname first_name VARCHAR(255) DEFAULT NULL,
CHANGE lastname last_name VARCHAR(255) DEFAULT NULL,
CHANGE photo photo VARCHAR(255) DEFAULT NULL,
CHANGE signature signature LONGTEXT DEFAULT NULL,
CHANGE levels levels LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
CHANGE colors colors LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
CHANGE rating rating INT DEFAULT NULL,
CHANGE ga_secret google_authenticator_secret VARCHAR(255) DEFAULT NULL,
CHANGE address street VARCHAR(255) DEFAULT NULL,
CHANGE phones phones LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
CHANGE networks social_media_accounts LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
CHANGE user_name username VARCHAR(255) NOT NULL,
CHANGE email_address email VARCHAR(255) NOT NULL,
CHANGE status enabled TINYINT(1) NOT NULL,
CHANGE user_password password VARCHAR(255) NOT NULL,
CHANGE raw_password plain_password VARCHAR(255) DEFAULT NULL,
CHANGE view_export_button allow_data_export TINYINT(1) NOT NULL,
CHANGE view_service_notes allow_service_items TINYINT(1) NOT NULL,
CHANGE view_sales_notes allow_sales_items TINYINT(1) NOT NULL,
CHANGE view_stage_reset allow_stage_reset TINYINT(1) NOT NULL,
CHANGE view_issue_send_to_field allow_select_issue_target_user TINYINT(1) NOT NULL,
CHANGE view_feed_permission_fields allow_select_feed_target_users TINYINT(1) NOT NULL,
CHANGE view_events allow_view_all_events TINYINT(1) NOT NULL,
CHANGE view_all_customers allow_view_all_customers TINYINT(1) NOT NULL,
CHANGE view_private_files allow_view_private_files TINYINT(1) NOT NULL,
CHANGE view_source allow_view_source_value TINYINT(1) NOT NULL,
CHANGE view_widgets_as_admin allow_view_widgets_as_admin TINYINT(1) NOT NULL,
CHANGE payments allow_invoice_actions TINYINT(1) NOT NULL,
CHANGE date_added created_at DATETIME NOT NULL,
CHANGE last_modified modified_at DATETIME NOT NULL
');
$this->addSql('UPDATE user SET allow_service_items = 0 WHERE allow_service_items != 1');
$this->addSql('UPDATE user SET allow_sales_items = 0 WHERE allow_sales_items != 1');
$this->addSql('UPDATE user SET roles = \'a:0:{}\'');
$this->addSql('UPDATE user SET roles = \'a:1:{i:0;s:10:"ROLE_ADMIN";}\' WHERE id = 9999');
$this->addSql('UPDATE user SET street = NULL WHERE street = \'\'');
$this->addSql('UPDATE user SET name = TRIM(CONCAT_WS(\' \', first_name, last_name))');
$this->addSql('UPDATE user SET username_canonical = username, email_canonical = email');
$this->addSql('DELETE FROM user WHERE username_canonical = \'\' OR username_canonical IS NULL OR email_canonical = \'\' OR email_canonical IS NULL');
$this->addSql('DELETE u1 FROM user u1 INNER JOIN user u2 WHERE u1.id > u2.id AND u1.username_canonical = u2.username_canonical');
$this->addSql('DELETE u1 FROM user u1 INNER JOIN user u2 WHERE u1.id > u2.id AND u1.email_canonical = u2.email_canonical');
$this->addSql('CREATE INDEX idx_name ON user (name)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_8D93D64992FC23A8 ON user (username_canonical)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_8D93D649A0D96FBF ON user (email_canonical)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_8D93D649C05FB297 ON user (confirmation_token)');
$this->addSql('ALTER TABLE user CHARACTER SET = utf8mb4');
$this->addSql('DELETE FROM user_join_group WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM user_join_group WHERE group_id NOT IN (SELECT id FROM user_group)');
$this->addSql('DELETE FROM user_join_team WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM user_join_team WHERE team_id NOT IN (SELECT id FROM user_team)');
$this->addSql('DELETE FROM user_join_access_user WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM user_join_access_user WHERE access_user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM user_join_access_group WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM user_join_access_group WHERE access_group_id NOT IN (SELECT id FROM user_group)');
$this->addSql('DELETE FROM user_join_access_chat_user WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM user_join_access_chat_user WHERE access_user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM user_join_access_chat_group WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM user_join_access_chat_group WHERE access_group_id NOT IN (SELECT id FROM user_group)');
$this->addSql('DELETE FROM user_report WHERE object_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM user_report WHERE report_id NOT IN (SELECT id FROM report)');
$this->addSql('DELETE FROM group_report WHERE object_id NOT IN (SELECT id FROM user_group)');
$this->addSql('DELETE FROM group_report WHERE report_id NOT IN (SELECT id FROM report)');
$this->addSql('DELETE FROM user_widget WHERE object_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM user_widget WHERE widget_id NOT IN (SELECT id FROM widget)');
$this->addSql('DELETE FROM group_widget WHERE object_id NOT IN (SELECT id FROM user_group)');
$this->addSql('DELETE FROM group_widget WHERE widget_id NOT IN (SELECT id FROM widget)');
$this->addSql('ALTER TABLE user_join_group ADD CONSTRAINT FK_43E5F184A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_join_group ADD CONSTRAINT FK_43E5F184FE54D947 FOREIGN KEY (group_id) REFERENCES user_group (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_join_team ADD CONSTRAINT FK_55586662A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_join_team ADD CONSTRAINT FK_55586662296CD8AE FOREIGN KEY (team_id) REFERENCES user_team (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_join_access_user ADD CONSTRAINT FK_C256DA04A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_join_access_user ADD CONSTRAINT FK_C256DA046F4B0980 FOREIGN KEY (access_user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_join_access_group ADD CONSTRAINT FK_65E2BCE4A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_join_access_group ADD CONSTRAINT FK_65E2BCE493411876 FOREIGN KEY (access_group_id) REFERENCES user_group (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_join_access_chat_user ADD CONSTRAINT FK_213F6F29A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_join_access_chat_user ADD CONSTRAINT FK_213F6F296F4B0980 FOREIGN KEY (access_user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_join_access_chat_group ADD CONSTRAINT FK_20DE8924A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_join_access_chat_group ADD CONSTRAINT FK_20DE892493411876 FOREIGN KEY (access_group_id) REFERENCES user_group (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_report ADD CONSTRAINT FK_A17D6CB9232D562B FOREIGN KEY (object_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_report ADD CONSTRAINT FK_A17D6CB94BD2A4C0 FOREIGN KEY (report_id) REFERENCES report (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE group_report ADD CONSTRAINT FK_17A9AF54232D562B FOREIGN KEY (object_id) REFERENCES user_group (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE group_report ADD CONSTRAINT FK_17A9AF544BD2A4C0 FOREIGN KEY (report_id) REFERENCES report (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_widget ADD CONSTRAINT FK_E0AB05ED232D562B FOREIGN KEY (object_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user_widget ADD CONSTRAINT FK_E0AB05EDFBE885E2 FOREIGN KEY (widget_id) REFERENCES widget (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE group_widget ADD CONSTRAINT FK_567FC600232D562B FOREIGN KEY (object_id) REFERENCES user_group (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE group_widget ADD CONSTRAINT FK_567FC600FBE885E2 FOREIGN KEY (widget_id) REFERENCES widget (id) ON DELETE CASCADE');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf('mysql' !== $this->connection->getDatabasePlatform()->getName(), 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE group_widget DROP FOREIGN KEY FK_567FC600FBE885E2');
$this->addSql('ALTER TABLE group_widget DROP FOREIGN KEY FK_567FC600232D562B');
$this->addSql('ALTER TABLE user_widget DROP FOREIGN KEY FK_E0AB05EDFBE885E2');
$this->addSql('ALTER TABLE user_widget DROP FOREIGN KEY FK_E0AB05ED232D562B');
$this->addSql('ALTER TABLE group_report DROP FOREIGN KEY FK_17A9AF544BD2A4C0');
$this->addSql('ALTER TABLE group_report DROP FOREIGN KEY FK_17A9AF54232D562B');
$this->addSql('ALTER TABLE user_report DROP FOREIGN KEY FK_A17D6CB94BD2A4C0');
$this->addSql('ALTER TABLE user_report DROP FOREIGN KEY FK_A17D6CB9232D562B');
$this->addSql('ALTER TABLE user_join_access_chat_group DROP FOREIGN KEY FK_20DE892493411876');
$this->addSql('ALTER TABLE user_join_access_chat_group DROP FOREIGN KEY FK_20DE8924A76ED395');
$this->addSql('ALTER TABLE user_join_access_chat_user DROP FOREIGN KEY FK_213F6F296F4B0980');
$this->addSql('ALTER TABLE user_join_access_chat_user DROP FOREIGN KEY FK_213F6F29A76ED395');
$this->addSql('ALTER TABLE user_join_access_group DROP FOREIGN KEY FK_65E2BCE493411876');
$this->addSql('ALTER TABLE user_join_access_group DROP FOREIGN KEY FK_65E2BCE4A76ED395');
$this->addSql('ALTER TABLE user_join_access_user DROP FOREIGN KEY FK_C256DA046F4B0980');
$this->addSql('ALTER TABLE user_join_access_user DROP FOREIGN KEY FK_C256DA04A76ED395');
$this->addSql('ALTER TABLE user_join_team DROP FOREIGN KEY FK_55586662296CD8AE');
$this->addSql('ALTER TABLE user_join_team DROP FOREIGN KEY FK_55586662A76ED395');
$this->addSql('ALTER TABLE user_join_group DROP FOREIGN KEY FK_43E5F184FE54D947');
$this->addSql('ALTER TABLE user_join_group DROP FOREIGN KEY FK_43E5F184A76ED395');
$this->addSql('RENAME TABLE user_team TO administrators_teams');
$this->addSql('ALTER TABLE administrators_teams ENGINE = MyISAM');
$this->addSql('ALTER TABLE administrators_teams CHARACTER SET = latin1');
$this->addSql('
ALTER TABLE administrators_teams
ADD type TINYINT(1) DEFAULT \'0\' AFTER name,
CHANGE name name VARCHAR(32) NOT NULL
');
$this->addSql('UPDATE administrators_teams SET type = \'1\'');
$this->addSql('RENAME TABLE user_group TO administrators_groups');
$this->addSql('ALTER TABLE administrators_groups ENGINE = MyISAM');
$this->addSql('ALTER TABLE administrators_groups CHARACTER SET = latin1');
$this->addSql('
ALTER TABLE administrators_groups
DROP access_customer_entity,
DROP access_customer_entity_role,
DROP access_lead_entity,
DROP access_lead_entity_role,
DROP access_event_entity,
DROP access_event_entity_role,
DROP access_feed_entity,
DROP access_feed_entity_role,
DROP access_issue_entity,
DROP access_issue_entity_role,
DROP access_message_entity,
DROP access_message_entity_role,
DROP access_all_reports,
DROP access_all_widgets,
ADD permissions TEXT DEFAULT NULL AFTER name,
ADD reports TEXT DEFAULT NULL AFTER permissions,
ADD dashboard TEXT DEFAULT NULL AFTER reports,
CHANGE name name VARCHAR(32) NOT NULL
');
$stmt = $this->connection->prepare('SELECT id, levels, colors, phones, social_media_accounts, plain_password FROM user');
$stmt->execute();
while ($row = $stmt->fetch(\PDO::FETCH_OBJ)) {
$levels = $row->levels ? unserialize($row->levels) : [];
$colors = $row->colors ? unserialize($row->colors) : [];
$phones = $row->phones ? unserialize($row->phones) : [];
$networks = $row->social_media_accounts ? unserialize($row->social_media_accounts) : [];
$tmp = [];
foreach ($levels as $level) {
switch ($level) {
case 'red': $tmp[] = 1; break;
case 'copper': $tmp[] = 2; break;
case 'bronze': $tmp[] = 3; break;
case 'silver': $tmp[] = 4; break;
case 'gold': $tmp[] = 5; break;
case 'platinum': $tmp[] = 6; break;
case 'diamond': $tmp[] = 7; break;
}
}
$levels = !empty($tmp) ? $tmp : null;
$tmp = [];
foreach ($colors as $color) {
if (\in_array($color, [
'006400', // green
'eeee00', // yellow
'ffa500', // orange
'ff0000', // red
'ffc0cb', // pink
'0000ff', // blue
'a020f0', // purple
'00ffff', // aqua
'00ff00', // lime
'999999', // grey
])) {
$tmp[] = $color;
}
}
$colors = !empty($tmp) ? $tmp : null;
$tmp = [];
foreach ($phones as $phone) {
$tmp[$phone['key']] = $phone['value'];
}
$phones = !empty($tmp) ? $tmp : null;
$tmp = [];
foreach ($networks as $network) {
$tmp[$network['key']] = $network['value'];
}
$networks = !empty($tmp) ? $tmp : null;
$this->addSql('UPDATE user SET password = :password, levels = :levels, phones = :phones, social_media_accounts = :networks WHERE id = :id', [
'id' => $row->id,
'password' => $row->plain_password ? sha1($row->plain_password) : null,
'levels' => $levels ? implode(',', $levels) : null,
'phones' => $phones ? serialize($phones) : null,
'networks' => $networks ? serialize($networks) : null,
]);
}
$this->addSql('RENAME TABLE user TO administrators');
$this->addSql('ALTER TABLE administrators ENGINE = MyISAM');
$this->addSql('ALTER TABLE administrators CHARACTER SET = latin1');
$this->addSql('DROP INDEX idx_name ON administrators');
$this->addSql('DROP INDEX UNIQ_8D93D64992FC23A8 ON administrators');
$this->addSql('DROP INDEX UNIQ_8D93D649A0D96FBF ON administrators');
$this->addSql('DROP INDEX UNIQ_8D93D649C05FB297 ON administrators');
$this->addSql('
ALTER TABLE administrators
DROP name,
DROP username_canonical,
DROP email_canonical,
DROP salt,
DROP password_requested_at,
DROP confirmation_token,
DROP roles,
DROP first_phone,
DROP first_fax,
DROP first_social_media_account,
DROP access_all_users,
DROP access_all_groups,
DROP access_chat_all_users,
DROP access_chat_all_groups,
DROP access_customer_entity,
DROP access_customer_entity_role,
DROP access_lead_entity,
DROP access_lead_entity_role,
DROP access_event_entity,
DROP access_event_entity_role,
DROP access_feed_entity,
DROP access_feed_entity_role,
DROP access_issue_entity,
DROP access_issue_entity_role,
DROP access_message_entity,
DROP access_message_entity_role,
DROP access_all_reports,
DROP access_all_widgets,
ADD administrators_groups TEXT NOT NULL AFTER id,
ADD administrators_teams TEXT DEFAULT NULL AFTER administrators_groups,
ADD group_permissions TINYINT(1) DEFAULT \'0\' AFTER status,
ADD permissions TEXT DEFAULT NULL AFTER group_permissions,
ADD reports TEXT DEFAULT NULL AFTER payments,
ADD dashboard TEXT DEFAULT NULL AFTER reports,
ADD owner_administrators TEXT DEFAULT NULL AFTER colors,
ADD owner_administrators_groups TEXT DEFAULT NULL AFTER owner_administrators,
ADD chats_administrators TEXT DEFAULT NULL AFTER owner_administrators_groups,
ADD chats_administrators_groups TEXT DEFAULT NULL AFTER chats_administrators,
ADD view_event_notifications TINYINT(1) DEFAULT \'0\' AFTER view_events,
ADD view_lead_notifications TINYINT(1) DEFAULT \'0\' AFTER view_event_notifications,
ADD view_fee TINYINT(1) DEFAULT \'0\' AFTER view_lead_notifications,
ADD view_pdf_form TINYINT(1) DEFAULT \'0\' AFTER view_widgets_as_admin,
ADD view_document_type TINYINT(1) DEFAULT \'0\' AFTER view_pdf_form,
ADD view_message_type TINYINT(1) DEFAULT \'0\' AFTER view_document_type,
ADD view_profile_messages TINYINT(1) DEFAULT \'0\' AFTER view_export_button,
ADD view_profile_feeds TINYINT(1) DEFAULT \'0\' AFTER view_profile_messages,
ADD view_profile_issues TINYINT(1) DEFAULT \'0\' AFTER view_profile_feeds,
CHANGE first_name firstname VARCHAR(32) DEFAULT NULL,
CHANGE last_name lastname VARCHAR(32) DEFAULT NULL,
CHANGE photo photo VARCHAR(255) DEFAULT NULL,
CHANGE signature signature TEXT DEFAULT NULL,
CHANGE levels levels TEXT DEFAULT NULL,
CHANGE colors colors TEXT DEFAULT NULL,
CHANGE rating rating TINYINT(1) DEFAULT \'0\',
CHANGE google_authenticator_secret ga_secret VARCHAR(40) DEFAULT NULL,
CHANGE street address TEXT DEFAULT NULL,
CHANGE phones phones LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
CHANGE social_media_accounts networks LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
CHANGE username user_name VARCHAR(32) NOT NULL DEFAULT \'\',
CHANGE email email_address VARCHAR(96) DEFAULT NULL,
CHANGE enabled status TINYINT(1) DEFAULT \'0\',
CHANGE password user_password VARCHAR(40) NOT NULL,
CHANGE plain_password raw_password VARCHAR(40) DEFAULT NULL,
CHANGE allow_data_export view_export_button TINYINT(1) DEFAULT \'0\',
CHANGE allow_service_items view_service_notes TINYINT(1) DEFAULT \'0\',
CHANGE allow_sales_items view_sales_notes TINYINT(1) DEFAULT \'0\',
CHANGE allow_stage_reset view_stage_reset TINYINT(1) DEFAULT \'0\',
CHANGE allow_select_issue_target_user view_issue_send_to_field TINYINT(1) DEFAULT \'0\',
CHANGE allow_select_feed_target_users view_feed_permission_fields TINYINT(1) DEFAULT \'0\',
CHANGE allow_view_all_events view_events TINYINT(1) DEFAULT \'0\',
CHANGE allow_view_all_customers view_all_customers TINYINT(1) DEFAULT \'0\',
CHANGE allow_view_private_files view_private_files TINYINT(1) DEFAULT \'0\',
CHANGE allow_view_source_value view_source TINYINT(1) DEFAULT \'0\',
CHANGE allow_view_widgets_as_admin view_widgets_as_admin TINYINT(1) DEFAULT \'0\',
CHANGE allow_invoice_actions payments TINYINT(1) DEFAULT \'0\',
CHANGE created_at date_added DATETIME DEFAULT NULL,
CHANGE modified_at last_modified DATETIME DEFAULT NULL
');
$this->addSql('UPDATE administrators SET firstname = TRIM(CONCAT_WS(\' \', firstname, middle_name))');
$this->addSql('UPDATE administrators SET address = TRIM(CONCAT_WS("\n", address, city, state, zip))');
$this->addSql('
ALTER TABLE administrators
DROP middle_name,
DROP city,
DROP state,
DROP zip
');
$stmt = $this->connection->prepare('SELECT * FROM user_join_group');
$stmt->execute();
$users = [];
while ($row = $stmt->fetch(\PDO::FETCH_OBJ)) {
$users[$row->user_id][] = $row->group_id;
}
foreach ($users as $key => $value) {
$this->addSql('UPDATE administrators SET administrators_groups = :administrators_groups WHERE id = :id', [
'id' => $key,
'administrators_groups' => implode(',', $value),
]);
}
$this->addSql('DROP TABLE user_join_group');
$stmt = $this->connection->prepare('SELECT * FROM user_join_team');
$stmt->execute();
$users = [];
while ($row = $stmt->fetch(\PDO::FETCH_OBJ)) {
$users[$row->user_id][] = $row->team_id;
}
foreach ($users as $key => $value) {
$this->addSql('UPDATE administrators SET administrators_teams = :administrators_teams WHERE id = :id', [
'id' => $key,
'administrators_teams' => implode(',', $value),
]);
}
$this->addSql('DROP TABLE user_join_team');
// @todo: import permissions manually
$this->addSql('DROP TABLE user_report');
$this->addSql('DROP TABLE group_report');
$this->addSql('DROP TABLE report');
$this->addSql('DROP TABLE user_widget');
$this->addSql('DROP TABLE group_widget');
$this->addSql('DROP TABLE widget');
$this->addSql('DROP TABLE user_join_access_user');
$this->addSql('DROP TABLE user_join_access_group');
$this->addSql('DROP TABLE user_join_access_chat_user');
$this->addSql('DROP TABLE user_join_access_chat_group');
// @todo: backup table data
$this->addSql('
CREATE TABLE administrators_favorites (
id INT AUTO_INCREMENT NOT NULL,
administrators_id INT NOT NULL,
title VARCHAR(255) NOT NULL COLLATE latin1_swedish_ci,
url VARCHAR(255) NOT NULL COLLATE latin1_swedish_ci,
params LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\',
INDEX idx_administrators_id (administrators_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ENGINE = MyISAM
');
}
/**
* @return array
*/
private function getReports(): array
{
return [
// Collection
'report_collection' => ['name' => 'Collection', 'category' => 'Collection'],
'report_collection_reps' => ['name' => 'Collection Reps', 'category' => 'Collection'],
'report_collection_colors' => ['name' => 'Collection Colors', 'category' => 'Collection'],
'report_collectors' => ['name' => 'Collectors', 'category' => 'Collection'],
// Service
'report_resolution' => ['name' => 'Resolution', 'category' => 'Service'],
'report_complaints' => ['name' => 'Complaints', 'category' => 'Service'],
'report_tax_returns' => ['name' => 'Tax Returns', 'category' => 'Service'],
'report_upsell_request' => ['name' => 'Upsell Request', 'category' => 'Service'],
'report_worktime' => ['name' => 'Work Time', 'category' => 'Service'],
'report_contacts' => ['name' => 'Contacts', 'category' => 'Service'],
'report_last_contact' => ['name' => 'Last Contact', 'category' => 'Service'],
'report_employee_tracker' => ['name' => 'Employee Tracker', 'category' => 'Service'],
'report_time_summary' => ['name' => 'Time Summary', 'category' => 'Service'],
'report_closed' => ['name' => 'Closed Cases', 'category' => 'Service'],
'report_last_qa' => ['name' => 'Last QA', 'category' => 'Service'],
'report_notes' => ['name' => 'Notes', 'category' => 'Service'],
'report_stages' => ['name' => 'Stages', 'category' => 'Service'],
'report_stage_items' => ['name' => 'Stage Items', 'category' => 'Service'],
'report_completed_stage_items' => ['name' => 'Completed Stage Items', 'category' => 'Service'],
'report_service_reps' => ['name' => 'Service Reps', 'category' => 'Service'],
'report_star_rating' => ['name' => 'Star Rating', 'category' => 'Service'],
'report_faxes' => ['name' => 'Faxes', 'category' => 'Service'],
// Sales
'report_sales_overview' => ['name' => 'Overview', 'category' => 'Sales'],
'report_sales_payments' => ['name' => 'Payments', 'category' => 'Sales'],
'report_sales_scheduled' => ['name' => 'Scheduled', 'category' => 'Sales'],
'report_sales_balances' => ['name' => 'Open Balances', 'category' => 'Sales'],
'report_sales_payroll' => ['name' => 'Payroll', 'category' => 'Sales'],
'report_sales' => ['name' => 'Cash & Fees', 'category' => 'Sales'],
'report_sales_mini' => ['name' => 'Leaderboard', 'category' => 'Sales'],
'report_upsell' => ['name' => 'Upsell Search', 'category' => 'Sales'],
'report_interviews' => ['name' => 'Interviews', 'category' => 'Sales'],
'report_sales_fees' => ['name' => 'Fees', 'category' => 'Sales'],
// Marketing
'report_source_tiers' => ['name' => 'Source Tiers', 'category' => 'Marketing'],
'report_summary' => ['name' => 'Summary', 'category' => 'Marketing'],
'report_revenue_sources' => ['name' => 'Revenue Sources', 'category' => 'Marketing'],
'report_google_keywords' => ['name' => 'Google Keywords', 'category' => 'Marketing'],
'report_bing_keywords' => ['name' => 'Bing Keywords', 'category' => 'Marketing'],
'report_lead_dispositions' => ['name' => 'Lead Dispositions', 'category' => 'Marketing'],
'report_lead_tax_debt' => ['name' => 'Lead Tax Debt', 'category' => 'Marketing'],
'report_sources_campaign' => ['name' => 'Sources: Campaign', 'category' => 'Marketing'],
'report_sources_parent' => ['name' => 'Sources: Parent', 'category' => 'Marketing'],
'report_documents_log' => ['name' => 'Group Emails/Docs', 'category' => 'Marketing'],
// Administrator
'report_outbounds' => ['name' => 'Outbounds', 'category' => 'Administrator'],
'report_revenue_reps' => ['name' => 'Revenue Reps', 'category' => 'Administrator'],
'report_revenue_tiers' => ['name' => 'Revenue Tiers', 'category' => 'Administrator'],
'report_last_login' => ['name' => 'Last Login', 'category' => 'Administrator'],
'report_chat_messages' => ['name' => 'Chat Messages', 'category' => 'Administrator'],
'report_sales_goals' => ['name' => 'Goals', 'category' => 'Administrator'],
// Dialers
'report_transfer' => ['name' => 'Transfer', 'category' => 'Dialers'],
'report_transfer_reps' => ['name' => 'Transfer Reps', 'category' => 'Dialers'],
'report_transfer_dialers' => ['name' => 'Transfer Dialers', 'category' => 'Dialers'],
'report_transfer_tiers' => ['name' => 'Transfer Tiers', 'category' => 'Dialers'],
];
}
/**
* @return array
*/
private function getWidgets(): array
{
return [
// Administrator
'widget_activity' => ['name' => 'Activity', 'category' => 'Administrator'],
// Collection
'widget_collection_percent' => ['name' => 'Collection Percent', 'category' => 'Collection', 'legacy' => ['widget_collection']],
'widget_collection_past_due' => ['name' => 'Collection Past Due', 'category' => 'Collection', 'legacy' => ['widget_collection']],
'widget_collection_paid' => ['name' => 'Collection Paid', 'category' => 'Collection', 'legacy' => ['widget_collection']],
'widget_collection_late_fees' => ['name' => 'Collection Late Fees', 'category' => 'Collection'],
'widget_transactions' => ['name' => 'Transactions', 'category' => 'Collection', 'legacy' => ['widget_collectors']],
'widget_late_customers' => ['name' => 'Late Customers', 'category' => 'Collection'],
// Service
'widget_stage_stats' => ['name' => 'Stage Stats', 'category' => 'Service'],
'widget_completed_stages' => ['name' => 'Completed Stages', 'category' => 'Service', 'legacy' => ['widget_stages']],
'widget_completed_stage_items' => ['name' => 'Completed Stage Items', 'category' => 'Service', 'legacy' => ['widget_stages']],
'widget_closed' => ['name' => 'Closed Cases', 'category' => 'Service'],
'widget_closed_avg_hours_worked' => ['name' => 'Closed Cases Avg. Hours Worked', 'category' => 'Service'],
'widget_closed_avg_aging' => ['name' => 'Closed Cases Avg. Aging', 'category' => 'Service'],
'widget_stop_work' => ['name' => 'Stop Work', 'category' => 'Service'],
'widget_tax_returns' => ['name' => 'Completed Tax Returns', 'category' => 'Service'],
'widget_completed_qa' => ['name' => 'Completed QA', 'category' => 'Service'],
'widget_star_rating_avg' => ['name' => 'Star Rating Avg.', 'category' => 'Service'],
// Revenue
'widget_scheduled' => ['name' => 'Scheduled', 'category' => 'Revenue'],
'widget_paid' => ['name' => 'Paid', 'category' => 'Revenue'],
'widget_revenue' => ['name' => 'Revenue', 'category' => 'Revenue'],
'widget_stats_1' => ['name' => 'Stats #1', 'category' => 'Revenue'],
'widget_stats_2' => ['name' => 'Stats #2', 'category' => 'Revenue'],
// Sales
'widget_leaderboard' => ['name' => 'Leaderboard', 'category' => 'Sales'],
'widget_leads' => ['name' => 'Leads', 'category' => 'Sales', 'legacy' => ['widget_totals']],
'widget_interviews' => ['name' => 'Interviews', 'category' => 'Sales', 'legacy' => ['widget_totals']],
'widget_interviews_time' => ['name' => 'Interviews Time', 'category' => 'Sales', 'legacy' => ['widget_totals']],
'widget_customers' => ['name' => 'Customers', 'category' => 'Sales', 'legacy' => ['widget_totals']],
'widget_conversion' => ['name' => 'Conversion', 'category' => 'Sales', 'legacy' => ['widget_totals']],
// Transfer
'widget_transfer_total' => ['name' => 'Total', 'category' => 'Transfer', 'legacy' => ['widget_totals']],
'widget_transfer_percent' => ['name' => 'Percent', 'category' => 'Transfer'],
'widget_transfer_avg_per_hour' => ['name' => 'Avg. Per Hour', 'category' => 'Transfer'],
'widget_transfer_avg_per_user' => ['name' => 'Avg. Per User', 'category' => 'Transfer'],
// Outbound
'widget_outbound_sales' => ['name' => 'Sales', 'category' => 'Outbound', 'legacy' => ['widget_outbound']],
'widget_outbound_service' => ['name' => 'Service', 'category' => 'Outbound', 'legacy' => ['widget_outbound_service']],
];
}
}