handle deleted user during import from v1 (#569)

This commit is contained in:
Kevin Papst
2019-02-14 00:26:54 +01:00
committed by GitHub
parent 8005679e60
commit 17856e0b96
3 changed files with 62 additions and 12 deletions

View File

@@ -127,6 +127,7 @@ class KimaiImporterCommand extends Command
->addArgument('prefix', InputArgument::REQUIRED, 'The database prefix for the old Kimai v1 tables')
->addArgument('password', InputArgument::REQUIRED, 'The new password for all imported user')
->addArgument('country', InputArgument::OPTIONAL, 'The default country for customer (2-character uppercase)', 'DE')
->addArgument('currency', InputArgument::OPTIONAL, 'The default currency for customer (code like EUR, CHF, GBP or USD)', 'EUR')
;
}
@@ -158,7 +159,14 @@ class KimaiImporterCommand extends Command
$country = $input->getArgument('country');
if (2 != trim(strlen($country))) {
$io->error('Country length needs to be exactly 2 character');
$io->error('Country code needs to be exactly 2 character');
return;
}
$currency = $input->getArgument('currency');
if (3 != trim(strlen($currency))) {
$io->error('Currency code needs to be exactly 3 character');
return;
}
@@ -260,7 +268,7 @@ class KimaiImporterCommand extends Command
}
try {
$counter = $this->importCustomers($io, $customer, $country);
$counter = $this->importCustomers($io, $customer, $country, $currency);
$allImports += $counter;
$io->success('Imported customers: ' . $counter);
} catch (\Exception $ex) {
@@ -576,10 +584,11 @@ class KimaiImporterCommand extends Command
* @param SymfonyStyle $io
* @param array $customers
* @param string $country
* @param string $currency
* @return int
* @throws \Exception
*/
protected function importCustomers(SymfonyStyle $io, $customers, $country)
protected function importCustomers(SymfonyStyle $io, $customers, $country, $currency)
{
$counter = 0;
$entityManager = $this->getDoctrine()->getManager();
@@ -607,6 +616,7 @@ class KimaiImporterCommand extends Command
->setTimezone($oldCustomer['timezone'])
->setVisible($isActive)
->setCountry(strtoupper($country))
->setCurrency(strtoupper($currency))
;
if (!$this->validateImport($io, $customer)) {
@@ -910,6 +920,7 @@ class KimaiImporterCommand extends Command
{
$counter = 0;
$activityCounter = 0;
$userCounter = 0;
$entityManager = $this->getDoctrine()->getManager();
$total = count($records);
@@ -949,11 +960,45 @@ class KimaiImporterCommand extends Command
$duration = $oldRecord['end'] - $oldRecord['start'];
// FIXME create user on the fly
// ----------------------- unknown user, damned missing data integrity in Kimai v1 -----------------------
if (!isset($this->users[$oldRecord['userID']])) {
$io->error('Could not import timesheet record, unknown user: ' . $oldRecord['userID']);
continue;
$tempUserName = uniqid();
$tempPassword = uniqid() . uniqid();
$user = new User();
$user->setUsername($tempUserName)
->setAlias('Import: ' . $tempUserName)
->setEmail($tempUserName . '@example.com')
->setPlainPassword($tempPassword)
->setEnabled(false)
->setRoles([USER::ROLE_USER])
;
$pwd = $this->encoder->encodePassword($user, $user->getPlainPassword());
$user->setPassword($pwd);
if (!$this->validateImport($io, $user)) {
$io->error('Found timesheet record for unknown user and failed to create user, skipping timesheet: ' . $oldRecord['timeEntryID']);
continue;
}
try {
$entityManager->persist($user);
$entityManager->flush();
if ($this->debug) {
$io->success('Created deactivated user: ' . $user->getUsername());
}
$userCounter++;
} catch (\Exception $ex) {
$io->error('Failed to create user: ' . $user->getUsername());
$io->error('Reason: ' . $ex->getMessage());
continue;
}
$this->users[$oldRecord['userID']] = $user;
}
// ----------------------- unknown user end -----------------------
$timesheet = new Timesheet();
@@ -1028,6 +1073,9 @@ class KimaiImporterCommand extends Command
}
$io->writeln(' (' . $counter . '/' . $total . ')');
if ($userCounter > 0) {
$io->success('Created new users during timesheet import: ' . $userCounter);
}
if ($activityCounter > 0) {
$io->success('Created new activities during timesheet import: ' . $activityCounter);
}

View File

@@ -75,9 +75,9 @@ For available roles, please refer to the [user documentation](users.md).
> **NOTE**
>
> If you want to use a fully-featured web server (like Nginx or Apache) to run
> Kimai, configure it to point at the `public/` directory of the project.
> Kimai, configure it to point its DocumentRoot at the `public/` directory.
> For more details, see:
> http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html
> https://symfony.com/doc/current/setup/web_server_configuration.html
Installation complete: enjoy time-tracking :-)

View File

@@ -9,19 +9,21 @@ Before importing your data from a Kimai v1 installation, please read the followi
- fixed-rates and hourly-rates and total rate for timesheet entries are imported
- Customers in Kimai 2 are only used for recording
- they cannot login and no user accounts will be created for them
- country has to be manually assigned afterwards to customers, as there is no field in Kimai v1 for that
- they have a country code, which can be set during import or edited afterwards (Kimai v1 doesn't know the country)
- they have a currency code, which can be set during import or edited afterwards (Kimai v1 only knows one global currency)
- You have to supply the default password that is used for every imported user, as their password will be resetted
- Data that was deleted in Kimai v1 (user, customer, projects, activities) will be imported and set to `invisible` (if you don't want that, you have to delete all entries that have the value `1` in the `trash` column before importing)
A possible full command for import:
```bash
bin/console kimai:import-v1 "mysql://user:password@127.0.0.1:3306/database?charset=utf8" "db_prefix" "password" "country"
bin/console kimai:import-v1 "mysql://user:password@127.0.0.1:3306/database?charset=utf8" "db_prefix" "password" "country" "currency"
```
The fields "country" and "currency" are optional and will be set to DE and EUR if not given.
It is recommended to test the import in a fresh database. You can test your import as often as you like and fix possible problems in your installation.
A sample command could look like that:
```bash
bin/console doctrine:schema:drop --force && bin/console doctrine:schema:create && bin/console kimai:import-v1 "mysql://kimai:test@127.0.0.1:3306/kimai?charset=latin1" "kimai_" "test123" "de"
bin/console doctrine:schema:drop --force && bin/console doctrine:schema:create && bin/console kimai:import-v1 "mysql://kimai:test@127.0.0.1:3306/kimai?charset=latin1" "kimai_" "test123" "CH" "CHF"
```
That will drop the configured Kimai v2 database schema and re-create it, before importing the data from the `mysql` database at `127.0.0.1` on port `3306` authenticating the user `kimai` with the password `test` for import.
The connection will use the charset `latin1` and the default table prefix `kimai_` for reading data. Imported users can login with the password `test123` and all customer will have the country `de` assigned.
The connection will use the charset `latin1` and the default table prefix `kimai_` for reading data. Imported users can login with the password `test123` and all customer will have the country `CH` and the currency `CHF` assigned.