Budget graph in project details (#3406)
* do not copy description if restarting via calendar * added support to display negative durations * fix charts for larger numbers
This commit is contained in:
@@ -35,7 +35,6 @@ class TimesheetEntryTest extends TestCase
|
||||
$timesheet->addTag((new Tag())->setName('action test'));
|
||||
|
||||
$expectedData = [
|
||||
'description' => 'hello foo bar',
|
||||
'activity' => null,
|
||||
'project' => null,
|
||||
'tags' => 'bulb,action test',
|
||||
@@ -56,10 +55,9 @@ class TimesheetEntryTest extends TestCase
|
||||
$timesheet = new Timesheet();
|
||||
|
||||
$expectedData = [
|
||||
'description' => null,
|
||||
'activity' => null,
|
||||
'project' => null,
|
||||
'tags' => '',
|
||||
'tags' => null,
|
||||
];
|
||||
|
||||
$sut = new TimesheetEntry($timesheet, '#ddd');
|
||||
|
||||
@@ -32,6 +32,7 @@ abstract class AbstractTimesheetCountedStatisticTest extends TestCase
|
||||
self::assertSame(0, $sut->getDurationExported());
|
||||
self::assertSame(0.0, $sut->getRateExported());
|
||||
self::assertSame(0.0, $sut->getInternalRateExported());
|
||||
self::assertSame(0, $sut->getCounterExported());
|
||||
|
||||
$json = $sut->jsonSerialize();
|
||||
|
||||
@@ -61,12 +62,13 @@ abstract class AbstractTimesheetCountedStatisticTest extends TestCase
|
||||
self::assertInstanceOf(TimesheetCountedStatistic::class, $sut->setRecordDuration(21));
|
||||
self::assertInstanceOf(TimesheetCountedStatistic::class, $sut->setRecordAmount(5));
|
||||
$sut->setRecordAmountBillable(15);
|
||||
self::assertInstanceOf(TimesheetCountedStatistic::class, $sut->setRecordInternalRate(99.09));
|
||||
$sut->setInternalRate(99.09);
|
||||
|
||||
$sut->setDurationBillableExported(199);
|
||||
$sut->setDurationExported(299);
|
||||
$sut->setRateExported(456.48);
|
||||
$sut->setInternalRateExported(27.15);
|
||||
$sut->setCounterExported(538);
|
||||
|
||||
self::assertSame(23.97, $sut->getRecordRate());
|
||||
self::assertSame(21, $sut->getRecordDuration());
|
||||
@@ -78,6 +80,7 @@ abstract class AbstractTimesheetCountedStatisticTest extends TestCase
|
||||
self::assertSame(299, $sut->getDurationExported());
|
||||
self::assertSame(456.48, $sut->getRateExported());
|
||||
self::assertSame(27.15, $sut->getInternalRateExported());
|
||||
self::assertSame(538, $sut->getCounterExported());
|
||||
|
||||
self::assertSame(21, $sut->getValue());
|
||||
|
||||
@@ -106,10 +109,11 @@ abstract class AbstractTimesheetCountedStatisticTest extends TestCase
|
||||
$sut->setRecordRate(23.97);
|
||||
$sut->setRecordDuration(21);
|
||||
$sut->setRecordAmount(5);
|
||||
$sut->setRecordInternalRate(99.09);
|
||||
$sut->setInternalRate(99.09);
|
||||
$sut->setRateBillable(123.456);
|
||||
$sut->setDurationBillable(1234);
|
||||
$sut->setRecordAmountBillable(4321);
|
||||
$sut->setCounterExported(538);
|
||||
|
||||
$sut->setDurationBillableExported(199);
|
||||
$sut->setRateBillableExported(654.23);
|
||||
@@ -132,5 +136,6 @@ abstract class AbstractTimesheetCountedStatisticTest extends TestCase
|
||||
self::assertSame(99.09, $json['rate_internal']);
|
||||
self::assertSame(5, $json['amount']);
|
||||
self::assertSame(4321, $json['amount_billable']);
|
||||
self::assertSame(538, $json['amount_exported']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,8 @@ class YearTest extends AbstractTimesheetTest
|
||||
self::assertEmpty($sut->getMonths());
|
||||
self::assertIsArray($sut->getMonths());
|
||||
self::assertEquals('1999', $sut->getYear());
|
||||
self::assertSame(0, $sut->getBillableDuration());
|
||||
self::assertSame(0.0, $sut->getBillableRate());
|
||||
}
|
||||
|
||||
public function testSetter()
|
||||
@@ -46,5 +48,10 @@ class YearTest extends AbstractTimesheetTest
|
||||
self::assertInstanceOf(Month::class, $sut->getMonth(2));
|
||||
self::assertInstanceOf(Month::class, $sut->getMonth(3));
|
||||
self::assertNull($sut->getMonth(4));
|
||||
|
||||
$sut->setBillableDuration(123456);
|
||||
$sut->setBillableRate(123.456789);
|
||||
self::assertSame(123456, $sut->getBillableDuration());
|
||||
self::assertSame(123.456789, $sut->getBillableRate());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace App\Tests\Reporting\ProjectDetails;
|
||||
|
||||
use App\Entity\Project;
|
||||
use App\Entity\User;
|
||||
use App\Model\Statistic\Year;
|
||||
use App\Reporting\ProjectDetails\ProjectDetailsModel;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
@@ -33,4 +34,34 @@ class ProjectDetailsModelTest extends TestCase
|
||||
self::assertNull($sut->getYear('2999'));
|
||||
self::assertNull($sut->getUserYear('2999', new User()));
|
||||
}
|
||||
|
||||
public function testGetYearsSorted()
|
||||
{
|
||||
$project = new Project();
|
||||
$sut = new ProjectDetailsModel($project);
|
||||
|
||||
$y2022 = new Year('2022');
|
||||
$y1999 = new Year('1999');
|
||||
$y2001 = new Year('2001');
|
||||
$y1997 = new Year('1997');
|
||||
$y2015 = new Year('2015');
|
||||
|
||||
$sut->setYears([
|
||||
$y2022,
|
||||
$y1999,
|
||||
$y2001,
|
||||
$y1997,
|
||||
$y2015,
|
||||
]);
|
||||
|
||||
$expected = [
|
||||
$y1997,
|
||||
$y1999,
|
||||
$y2001,
|
||||
$y2015,
|
||||
$y2022,
|
||||
];
|
||||
|
||||
self::assertEquals($expected, $sut->getYears());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ class LocaleFormatExtensionsTest extends TestCase
|
||||
private $localeEn = ['en' => ['date' => 'Y-m-d', 'duration' => '%h:%m h', 'date_type' => 'yyyy-MM-dd']];
|
||||
private $localeDe = ['de' => ['date' => 'd.m.Y', 'duration' => '%h:%m h', 'date_type' => 'yyyy-MM-dd']];
|
||||
private $localeRu = ['ru' => ['date' => 'd.m.Y', 'duration' => '%h:%m h', 'date_type' => 'yyyy-MM-dd']];
|
||||
private $localeFake = ['XX' => ['date' => 'd.m.Y', 'duration' => '%h - %m - %s Zeit', 'date_type' => 'yyyy-MM-dd']];
|
||||
private $localeFake = ['XX' => ['date' => 'd.m.Y', 'duration' => '%h - %m Zeit', 'date_type' => 'yyyy-MM-dd']];
|
||||
|
||||
/**
|
||||
* @param string|array $locale
|
||||
@@ -62,7 +62,7 @@ class LocaleFormatExtensionsTest extends TestCase
|
||||
{
|
||||
$filters = [
|
||||
'month_name', 'day_name', 'date_short', 'date_time', 'date_full', 'date_format', 'date_weekday', 'time', 'hour24',
|
||||
'duration', 'chart_duration', 'duration_decimal', 'money', 'currency', 'country', 'language', 'amount'
|
||||
'duration', 'chart_duration', 'chart_money', 'duration_decimal', 'money', 'currency', 'country', 'language', 'amount'
|
||||
];
|
||||
$i = 0;
|
||||
|
||||
@@ -458,11 +458,15 @@ class LocaleFormatExtensionsTest extends TestCase
|
||||
|
||||
// test extended format
|
||||
$sut = $this->getSut($this->localeFake, 'XX');
|
||||
$this->assertEquals('02 - 37 - 17 Zeit', $sut->duration($record->getDuration()));
|
||||
$this->assertEquals('02 - 37 Zeit', $sut->duration($record->getDuration()));
|
||||
|
||||
// test negative duration
|
||||
$sut = $this->getSut($this->localeEn, 'en');
|
||||
$this->assertEquals('?', $sut->duration(-1));
|
||||
$this->assertEquals('00:00 h', $sut->duration(0));
|
||||
$this->assertEquals('00:00 h', $sut->duration(-1));
|
||||
$this->assertEquals('00:00 h', $sut->duration(-59));
|
||||
$this->assertEquals('-00:01 h', $sut->duration(-60));
|
||||
$this->assertEquals('-01:36 h', $sut->duration(-5786));
|
||||
|
||||
// test zero duration
|
||||
$sut = $this->getSut($this->localeEn, 'en');
|
||||
@@ -584,4 +588,20 @@ class LocaleFormatExtensionsTest extends TestCase
|
||||
|
||||
return $record;
|
||||
}
|
||||
|
||||
public function testChartMoney()
|
||||
{
|
||||
$sut = $this->getSut('en', $this->localeEn, false);
|
||||
$this->assertEquals('-123456.78', $sut->moneyChart(-123456.78));
|
||||
$this->assertEquals('123456.78', $sut->moneyChart(123456.78));
|
||||
$this->assertEquals('123456.00', $sut->moneyChart(123456));
|
||||
$this->assertEquals('456.00', $sut->moneyChart(456));
|
||||
}
|
||||
|
||||
public function testCharDuration()
|
||||
{
|
||||
$sut = $this->getSut('en', $this->localeEn, false);
|
||||
$this->assertEquals('34.29', $sut->durationChart(123456.78));
|
||||
$this->assertEquals('-34.29', $sut->durationChart(-123456.78));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@ class DurationTest extends TestCase
|
||||
|
||||
$this->assertNull($sut->format(null));
|
||||
$this->assertEquals('02:38', $sut->format(9494));
|
||||
$this->assertEquals('02:38:14', $sut->format(9494, Duration::FORMAT_WITH_SECONDS));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user