added global activity support in importer (#402)
This commit is contained in:
@@ -81,15 +81,14 @@ class KimaiImporterCommand extends Command
|
|||||||
* @var Activity[]
|
* @var Activity[]
|
||||||
*/
|
*/
|
||||||
protected $activities = [];
|
protected $activities = [];
|
||||||
/**
|
|
||||||
* activityId => activity[]
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $unassignedActivities = [];
|
|
||||||
/**
|
/**
|
||||||
* @var bool
|
* @var bool
|
||||||
*/
|
*/
|
||||||
protected $debug = false;
|
protected $debug = false;
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $oldActivities = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param UserPasswordEncoderInterface $encoder
|
* @param UserPasswordEncoderInterface $encoder
|
||||||
@@ -704,16 +703,32 @@ class KimaiImporterCommand extends Command
|
|||||||
{
|
{
|
||||||
$counter = 0;
|
$counter = 0;
|
||||||
$entityManager = $this->getDoctrine()->getManager();
|
$entityManager = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
|
// remember which activity has at least one assigned project
|
||||||
$oldActivityMapping = [];
|
$oldActivityMapping = [];
|
||||||
foreach ($activityToProject as $mapping) {
|
foreach ($activityToProject as $mapping) {
|
||||||
$oldActivityMapping[$mapping['activityID']] = $mapping['projectID'];
|
$oldActivityMapping[$mapping['activityID']][] = $mapping['projectID'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create global activities
|
||||||
foreach ($activities as $oldActivity) {
|
foreach ($activities as $oldActivity) {
|
||||||
|
$this->oldActivities[$oldActivity['activityID']] = $oldActivity;
|
||||||
if (isset($oldActivityMapping[$oldActivity['activityID']])) {
|
if (isset($oldActivityMapping[$oldActivity['activityID']])) {
|
||||||
$projectId = $oldActivityMapping[$oldActivity['activityID']];
|
continue;
|
||||||
$project = null;
|
}
|
||||||
|
|
||||||
|
$this->createActivity($io, $entityManager, $oldActivity, $fixedRates, $rates, null);
|
||||||
|
++$counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
$io->success('Created global activities: ' . $counter);
|
||||||
|
|
||||||
|
// create project specific activities
|
||||||
|
foreach ($activities as $oldActivity) {
|
||||||
|
if (!isset($oldActivityMapping[$oldActivity['activityID']])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
foreach ($oldActivityMapping[$oldActivity['activityID']] as $projectId) {
|
||||||
if (!isset($this->projects[$projectId])) {
|
if (!isset($this->projects[$projectId])) {
|
||||||
throw new \Exception(
|
throw new \Exception(
|
||||||
'Invalid project linked to activity ' . $oldActivity['name'] . ': ' . $projectId
|
'Invalid project linked to activity ' . $oldActivity['name'] . ': ' . $projectId
|
||||||
@@ -722,11 +737,8 @@ class KimaiImporterCommand extends Command
|
|||||||
|
|
||||||
$project = $this->projects[$projectId];
|
$project = $this->projects[$projectId];
|
||||||
|
|
||||||
$this->unassignedActivities[$oldActivity['activityID']] = $oldActivity;
|
$this->createActivity($io, $entityManager, $oldActivity, $fixedRates, $rates, $project);
|
||||||
$this->createActivity($io, $entityManager, $project, $oldActivity, $fixedRates, $rates);
|
|
||||||
++$counter;
|
++$counter;
|
||||||
} else {
|
|
||||||
$this->unassignedActivities[$oldActivity['activityID']] = $oldActivity;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -736,24 +748,27 @@ class KimaiImporterCommand extends Command
|
|||||||
/**
|
/**
|
||||||
* @param SymfonyStyle $io
|
* @param SymfonyStyle $io
|
||||||
* @param ObjectManager $entityManager
|
* @param ObjectManager $entityManager
|
||||||
* @param Project $project
|
|
||||||
* @param array $oldActivity
|
* @param array $oldActivity
|
||||||
* @param array $fixedRates
|
* @param array $fixedRates
|
||||||
* @param array $rates
|
* @param array $rates
|
||||||
|
* @param Project $project
|
||||||
* @return Activity
|
* @return Activity
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
protected function createActivity(
|
protected function createActivity(
|
||||||
SymfonyStyle $io,
|
SymfonyStyle $io,
|
||||||
ObjectManager $entityManager,
|
ObjectManager $entityManager,
|
||||||
Project $project,
|
|
||||||
array $oldActivity,
|
array $oldActivity,
|
||||||
array $fixedRates,
|
array $fixedRates,
|
||||||
array $rates
|
array $rates,
|
||||||
|
?Project $project
|
||||||
) {
|
) {
|
||||||
|
|
||||||
$activityId = $oldActivity['activityID'];
|
$activityId = $oldActivity['activityID'];
|
||||||
if (isset($this->activities[$activityId][$project->getId()])) {
|
$projectId = null !== $project ? $project->getId() : null;
|
||||||
return $this->activities[$activityId][$project->getId()];
|
|
||||||
|
if (isset($this->activities[$activityId][$projectId])) {
|
||||||
|
return $this->activities[$activityId][$projectId];
|
||||||
}
|
}
|
||||||
|
|
||||||
$isActive = (bool) $oldActivity['visible'] && !(bool) $oldActivity['trash'];
|
$isActive = (bool) $oldActivity['visible'] && !(bool) $oldActivity['trash'];
|
||||||
@@ -775,7 +790,7 @@ class KimaiImporterCommand extends Command
|
|||||||
if ($fixedRow['activityID'] === null) {
|
if ($fixedRow['activityID'] === null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($fixedRow['projectID'] !== null && $fixedRow['projectID'] !== $project->getId()) {
|
if ($fixedRow['projectID'] !== null && $fixedRow['projectID'] !== $projectId) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -788,7 +803,7 @@ class KimaiImporterCommand extends Command
|
|||||||
if ($ratesRow['userID'] !== null || $ratesRow['activityID'] === null) {
|
if ($ratesRow['userID'] !== null || $ratesRow['activityID'] === null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($ratesRow['projectID'] !== null && $ratesRow['projectID'] !== $project->getId()) {
|
if ($ratesRow['projectID'] !== null && $ratesRow['projectID'] !== $projectId) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -815,7 +830,7 @@ class KimaiImporterCommand extends Command
|
|||||||
if (!isset($this->activities[$activityId])) {
|
if (!isset($this->activities[$activityId])) {
|
||||||
$this->activities[$activityId] = [];
|
$this->activities[$activityId] = [];
|
||||||
}
|
}
|
||||||
$this->activities[$activityId][$project->getId()] = $activity;
|
$this->activities[$activityId][$projectId] = $activity;
|
||||||
|
|
||||||
return $activity;
|
return $activity;
|
||||||
}
|
}
|
||||||
@@ -872,18 +887,22 @@ class KimaiImporterCommand extends Command
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$customerId = $project->getCustomer()->getId();
|
||||||
|
|
||||||
if (isset($this->activities[$activityId][$projectId])) {
|
if (isset($this->activities[$activityId][$projectId])) {
|
||||||
$activity = $this->activities[$activityId][$projectId];
|
$activity = $this->activities[$activityId][$projectId];
|
||||||
|
} elseif (isset($this->activities[$activityId][null])) {
|
||||||
|
$activity = $this->activities[$activityId][null];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $activity && isset($this->unassignedActivities[$activityId])) {
|
if (null === $activity && isset($this->oldActivities[$activityId])) {
|
||||||
$oldActivity = $this->unassignedActivities[$activityId];
|
$oldActivity = $this->oldActivities[$activityId];
|
||||||
$activity = $this->createActivity($io, $entityManager, $project, $oldActivity, $fixedRates, $rates);
|
$activity = $this->createActivity($io, $entityManager, $oldActivity, $fixedRates, $rates, $project);
|
||||||
++$activityCounter;
|
++$activityCounter;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $activity) {
|
if (null === $activity) {
|
||||||
$io->error('Could not create timesheet record, missing activity with ID: ' . $activityId);
|
$io->error('Could not create timesheet record, missing activity with ID: ' . $activityId . '/' . $projectId . '/' . $customerId);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -904,7 +923,7 @@ class KimaiImporterCommand extends Command
|
|||||||
if ($timesheet->getFixedRate() !== null) {
|
if ($timesheet->getFixedRate() !== null) {
|
||||||
$timesheet->setRate($timesheet->getFixedRate());
|
$timesheet->setRate($timesheet->getFixedRate());
|
||||||
} elseif ($timesheet->getHourlyRate() !== null) {
|
} elseif ($timesheet->getHourlyRate() !== null) {
|
||||||
$rate = $timesheet->getHourlyRate();
|
$hourlyRate = $timesheet->getHourlyRate();
|
||||||
$rate = (float) $hourlyRate * ($duration / 3600);
|
$rate = (float) $hourlyRate * ($duration / 3600);
|
||||||
$timesheet->setRate(round($rate, 2));
|
$timesheet->setRate(round($rate, 2));
|
||||||
}
|
}
|
||||||
@@ -916,6 +935,7 @@ class KimaiImporterCommand extends Command
|
|||||||
->setEnd(new \DateTime('@' . $oldRecord['end']))
|
->setEnd(new \DateTime('@' . $oldRecord['end']))
|
||||||
->setDuration($duration)
|
->setDuration($duration)
|
||||||
->setActivity($activity)
|
->setActivity($activity)
|
||||||
|
->setProject($project)
|
||||||
;
|
;
|
||||||
|
|
||||||
if (!$this->validateImport($io, $timesheet)) {
|
if (!$this->validateImport($io, $timesheet)) {
|
||||||
@@ -947,7 +967,7 @@ class KimaiImporterCommand extends Command
|
|||||||
$io->writeln(' (' . $counter . '/' . $total . ')');
|
$io->writeln(' (' . $counter . '/' . $total . ')');
|
||||||
|
|
||||||
if ($activityCounter > 0) {
|
if ($activityCounter > 0) {
|
||||||
$io->success('Created new (previously global) activities during timesheet import: ' . $activityCounter);
|
$io->success('Created new activities during timesheet import: ' . $activityCounter);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $counter;
|
return $counter;
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ trait RendererTrait
|
|||||||
}
|
}
|
||||||
|
|
||||||
$activity = $timesheet->getActivity();
|
$activity = $timesheet->getActivity();
|
||||||
$project = $activity->getProject();
|
$project = $timesheet->getProject();
|
||||||
$customer = $project->getCustomer();
|
$customer = $project->getCustomer();
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -210,6 +210,7 @@ abstract class AbstractRendererTest extends KernelTestCase
|
|||||||
->setRate(293.27)
|
->setRate(293.27)
|
||||||
->setUser($user1)
|
->setUser($user1)
|
||||||
->setActivity($activity)
|
->setActivity($activity)
|
||||||
|
->setProject($project)
|
||||||
->setBegin(new \DateTime())
|
->setBegin(new \DateTime())
|
||||||
->setEnd(new \DateTime())
|
->setEnd(new \DateTime())
|
||||||
;
|
;
|
||||||
|
|||||||
Reference in New Issue
Block a user