Working example of report command.
parent
c833741939
commit
270d58124e
|
@ -1 +1,2 @@
|
|||
/app/vendor
|
||||
/resources/data
|
|
@ -18,6 +18,7 @@
|
|||
- hourly wage
|
||||
- folder for reports
|
||||
|
||||
|
||||
** Components
|
||||
- report service - provides a csv of a report
|
||||
- local csv file read (provided via argument)
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
"repositories": [
|
||||
{
|
||||
"type": "vcs",
|
||||
"url": "https://git.nixnet.xyz/l3/rprt"
|
||||
"url": "https://git.nixnet.services/l3n/RprtCli.git"
|
||||
}
|
||||
],
|
||||
"autoload": {
|
||||
|
|
|
@ -4,8 +4,13 @@ use function DI\create;
|
|||
use function DI\get;
|
||||
|
||||
use RprtCli\Commands\RprtCommand;
|
||||
use RprtCli\Utils\CsvReport\CsvReport;
|
||||
use RprtCli\Utils\CsvReport\CsvReportInterface;
|
||||
|
||||
return [
|
||||
RprtCommand::class => DI\create(
|
||||
\GuzzleHttp\ClientInterface::class => DI\get(\GuzzleHttp\Client::class),
|
||||
CsvReportInterface::class => DI\get(CsvReport::class),
|
||||
RprtCommand::class => DI\create()->constructor(
|
||||
DI\get(CsvReportInterface::class)
|
||||
)
|
||||
];
|
||||
|
|
|
@ -4,17 +4,22 @@
|
|||
|
||||
namespace RprtCli\Commands;
|
||||
|
||||
use RprtCli\Utils\CsvReport\CsvReportInterface;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Helper\Table;
|
||||
use Symfony\Component\Console\Helper\TableSeparator;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
||||
class RprtCommand extends Command {
|
||||
|
||||
protected $csv;
|
||||
|
||||
//public function __construct() {
|
||||
// }
|
||||
public function __construct(CsvReportInterface $csv) {
|
||||
$this->csv = $csv;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get configuration.
|
||||
|
@ -22,14 +27,43 @@ class RprtCommand extends Command {
|
|||
protected function configure(): void {
|
||||
$this->setName('rprt');
|
||||
$this->setDescription('Generate monthly report');
|
||||
// @TODO $this->addUsage('');
|
||||
$this->addOption('file', 'f', InputOption::VALUE_REQUIRED, 'Specify the input csv file to generate report from.');
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int {
|
||||
|
||||
|
||||
if ($file = $input->getOption('file')) {
|
||||
$data = $this->csv->getReportData($file);
|
||||
$table = $this->generateTable($output, $data);
|
||||
$table->render();
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
$this->dummyOutput($input, $output);
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
protected function generateTable($output, $data) {
|
||||
// @TODO - get configuration
|
||||
$table = new Table($output);
|
||||
$table->setHeaders(['Project', 'Hours']);
|
||||
$rows = [];
|
||||
$together = 0;
|
||||
foreach ($data as $project => $hours) {
|
||||
$row = [$project, $hours/60];
|
||||
$together += $hours / 60;
|
||||
$rows[] = $row;
|
||||
}
|
||||
$rows[] = new TableSeparator();
|
||||
$rows[] = ['Zusamen', $together];
|
||||
$table->setRows($rows);
|
||||
return $table;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dummy output for testing.
|
||||
*/
|
||||
protected function dummyOutput(InputInterface $input, OutputInterface $output): void {
|
||||
$output->writeln('I will output a nice table.');
|
||||
$table = New Table($output);
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
// src/Utils/Configuration/ConfigurationInterface.php
|
||||
|
||||
namespace RprtCli\Utils\Configuration;
|
||||
|
||||
interface PonsapiConfigInterface
|
||||
{
|
||||
/**
|
||||
* Checks for config file.
|
||||
*
|
||||
* @return string|bool
|
||||
* Full path to config file or FALSE if it doesn't exist.
|
||||
*/
|
||||
// function findConfig($file);
|
||||
|
||||
/**
|
||||
* Get and read the configuration from file.
|
||||
*/
|
||||
function getConfig();
|
||||
|
||||
/**
|
||||
* Get a specific configuration for key.
|
||||
*
|
||||
* @param string $key
|
||||
* Config key.
|
||||
* @param mixed $default
|
||||
* Default value if config for key is not yet specified.
|
||||
*
|
||||
* @return mixed
|
||||
* Data.
|
||||
*/
|
||||
public function get($key, $default = null);
|
||||
|
||||
/**
|
||||
* Checks if key exists in the configuration file.
|
||||
*
|
||||
* @param string $key
|
||||
* Key to check for.
|
||||
*/
|
||||
public function exists($key);
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
<?php
|
||||
|
||||
namespace RprtCli\Utils\CsvReport;
|
||||
|
||||
use RprtCli\Utils\CsvReport\CsvReportInterface;
|
||||
|
||||
class CsvReport implements CsvReportInterface {
|
||||
|
||||
public function getReportData(string $file_path): array {
|
||||
$output = [];
|
||||
// @TODO replace with config service.
|
||||
$config = $this->dummyConfig();
|
||||
foreach (array_keys($config['projects']) as $key) {
|
||||
$output[$key] = 0;
|
||||
}
|
||||
if ($file = fopen($file_path, 'r')) {
|
||||
while (($line = fgetcsv($file)) !== FALSE) {
|
||||
$parsed = $this->parseCsvFile($line);
|
||||
// $key = reset(array_keys($parsed));
|
||||
$key = array_key_first($parsed);
|
||||
if (isset($output[$key])) {
|
||||
$output[$key] += (int) reset($parsed);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
protected function parseCsvFile(array $raw_data): array {
|
||||
$config = $this->dummyConfig();
|
||||
// var_dump($raw_data);
|
||||
foreach ($config['projects'] as $key => $project) {
|
||||
if (preg_match('/'.$project['pattern'].'/', $raw_data[1])) {
|
||||
return [$key => $raw_data[4]];
|
||||
}
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
protected function dummyConfig(): array {
|
||||
$config = [
|
||||
'projects' => [
|
||||
'LDP' => [
|
||||
'name' => 'lupus.digital',
|
||||
'pattern' => 'LDP-[0-9]+',
|
||||
'price' => 26,
|
||||
// optional specify columns
|
||||
],
|
||||
'WV' => [
|
||||
'name' => 'Wirtschaftsverlag',
|
||||
'pattern' => 'WV-[0-9]+',
|
||||
'price' => 26,
|
||||
// optional specify columns
|
||||
],
|
||||
'Other' => [
|
||||
'name' => 'Other projects',
|
||||
'pattern' => '(?!.\bLDP\b)(?!.\bWV\b)',
|
||||
'price' => 26,
|
||||
// optional specify columns
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
return $config;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
namespace RprtCli\Utils\CsvReport;
|
||||
|
||||
|
||||
/**
|
||||
* Handles creating report data from csv file downloaded from youtrack service.
|
||||
*/
|
||||
interface CsvReportInterface {
|
||||
|
||||
/**
|
||||
* Gets project configuration and parses the data.
|
||||
*
|
||||
* Calculate number of hours per project.
|
||||
*/
|
||||
// protected function parseCsvFile(array $data): array;
|
||||
|
||||
/**
|
||||
* Returns array of hours per configured projects.
|
||||
*/
|
||||
public function getReportData(string $file_path): array;
|
||||
}
|
Loading…
Reference in New Issue