103 lines
3.0 KiB
PHP
103 lines
3.0 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Kimai time-tracking app.
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace App\Importer;
|
|
|
|
use App\Customer\CustomerService;
|
|
use App\Entity\Customer;
|
|
use App\Entity\Project;
|
|
use App\Project\ProjectService;
|
|
|
|
class ImporterService
|
|
{
|
|
private $customers;
|
|
private $projects;
|
|
/**
|
|
* @var ProjectImporterInterface[]
|
|
*/
|
|
private $projectImporter = [];
|
|
/**
|
|
* @var CustomerImporterInterface[]
|
|
*/
|
|
private $customerImporter = [];
|
|
|
|
public function __construct(CustomerService $customers, ProjectService $projects)
|
|
{
|
|
$this->customers = $customers;
|
|
$this->projects = $projects;
|
|
}
|
|
|
|
public function registerProjectImporter(string $name, ProjectImporterInterface $importer): void
|
|
{
|
|
$this->projectImporter[$name] = $importer;
|
|
}
|
|
|
|
public function registerCustomerImporter(string $name, CustomerImporterInterface $importer): void
|
|
{
|
|
$this->customerImporter[$name] = $importer;
|
|
}
|
|
|
|
public function getProjectImporter(string $name): ProjectImporterInterface
|
|
{
|
|
if (!\array_key_exists('default', $this->projectImporter)) {
|
|
$this->registerProjectImporter('default', new DefaultProjectImporter($this->projects, $this->customers));
|
|
}
|
|
|
|
if (!\array_key_exists($name, $this->projectImporter)) {
|
|
throw new \InvalidArgumentException('Unknown project importer: ' . $name);
|
|
}
|
|
|
|
return $this->projectImporter[$name];
|
|
}
|
|
|
|
public function getCustomerImporter(string $name): CustomerImporterInterface
|
|
{
|
|
if (!\array_key_exists('default', $this->customerImporter)) {
|
|
$this->registerCustomerImporter('default', new DefaultCustomerImporter($this->customers));
|
|
$this->registerCustomerImporter('grandtotal', new GrandtotalCustomerImporter($this->customers));
|
|
}
|
|
|
|
if (!\array_key_exists($name, $this->customerImporter)) {
|
|
throw new \InvalidArgumentException('Unknown customer importer: ' . $name);
|
|
}
|
|
|
|
return $this->customerImporter[$name];
|
|
}
|
|
|
|
public function importProject(Project $project): void
|
|
{
|
|
if ($project->getId() === null) {
|
|
$this->projects->saveNewProject($project);
|
|
} else {
|
|
$this->projects->updateProject($project);
|
|
}
|
|
}
|
|
|
|
public function getReader(string $name): ImportReaderInterface
|
|
{
|
|
switch ($name) {
|
|
case 'csv':
|
|
return new CsvReader(',');
|
|
case 'csv-semicolon':
|
|
return new CsvReader(';');
|
|
}
|
|
|
|
throw new \InvalidArgumentException('Unknown import reader: ' . $name);
|
|
}
|
|
|
|
public function importCustomer(Customer $customer): void
|
|
{
|
|
if ($customer->getId() === null) {
|
|
$this->customers->saveNewCustomer($customer);
|
|
} else {
|
|
$this->customers->updateCustomer($customer);
|
|
}
|
|
}
|
|
}
|