Initialer commit
Datumsformat angepasst InvoiceCalculator für ABG erstellt: Sortierung nach Projekt, Schlagwort, Datum
This commit is contained in:
1610
config/locales.php
Normal file
1610
config/locales.php
Normal file
File diff suppressed because it is too large
Load Diff
BIN
public/bilder/logo/martin_rattensberger.png
Normal file
BIN
public/bilder/logo/martin_rattensberger.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 111 KiB |
BIN
public/bilder/logo/martin_rattensberger_gr.png
Normal file
BIN
public/bilder/logo/martin_rattensberger_gr.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 110 KiB |
BIN
public/bilder/logo/martin_rattensberger_hell.png
Normal file
BIN
public/bilder/logo/martin_rattensberger_hell.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 120 KiB |
BIN
public/bilder/logo/qrcode.png
Normal file
BIN
public/bilder/logo/qrcode.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 665 B |
99
src/Invoice/Calculator/ABGCalculator.php
Normal file
99
src/Invoice/Calculator/ABGCalculator.php
Normal file
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is derived from the DefaultCalculator which 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\Invoice\Calculator;
|
||||
|
||||
use App\Invoice\CalculatorInterface;
|
||||
use App\Invoice\InvoiceItem;
|
||||
|
||||
/**
|
||||
* Class DefaultCalculator works on all given entries using:
|
||||
* - the customer currency
|
||||
* - the invoice template vat rate
|
||||
* - the entries rate
|
||||
*/
|
||||
final class ABGCalculator extends AbstractMergedCalculator implements CalculatorInterface
|
||||
{
|
||||
/**
|
||||
* @return InvoiceItem[]
|
||||
*/
|
||||
public function getEntries(): array
|
||||
{
|
||||
$entries = [];
|
||||
|
||||
foreach ($this->model->getEntries() as $entry) {
|
||||
$item = new InvoiceItem();
|
||||
$this->mergeInvoiceItems($item, $entry);
|
||||
foreach ($entry->getMetaFields() as $field) {
|
||||
if ($field->getName() === null) {
|
||||
continue;
|
||||
}
|
||||
$item->addAdditionalField($field->getName(), $field->getValue());
|
||||
}
|
||||
$entries[] = $item;
|
||||
}
|
||||
|
||||
// sort by project and tags
|
||||
$sorted_entries = array_values($entries);
|
||||
usort($sorted_entries, function ($a, $b){
|
||||
|
||||
$comp_a = $a->getProject() . implode(',', $a->getTags());
|
||||
$comp_b = $b->getProject() . implode(',', $b->getTags());
|
||||
|
||||
if($comp_a == $comp_b) {
|
||||
return 0;
|
||||
}
|
||||
return ($comp_a < $comp_b) ? -1 : 1;
|
||||
});
|
||||
|
||||
// merge entries from same day and ticketnumber
|
||||
$merged_entries = [];
|
||||
$i = 0;
|
||||
$sorted_entries_len = count($sorted_entries);
|
||||
|
||||
while ($i < $sorted_entries_len) {
|
||||
if ($i + 1 == $sorted_entries_len){
|
||||
$merged_entries[] = $sorted_entries[$i];
|
||||
break;
|
||||
}
|
||||
else {
|
||||
$current = $sorted_entries[$i];
|
||||
$next = $sorted_entries[$i + 1];
|
||||
|
||||
$date_curr = date_format($current->getBegin(),"Ymd");
|
||||
$date_next = date_format($next->getBegin(),"Ymd");
|
||||
$project_curr = $current->getProject();
|
||||
$project_next = $next->getProject();
|
||||
$ticket_curr = trim($current->getAdditionalField("ticketnummer"));
|
||||
$ticket_next = trim($next->getAdditionalField("ticketnummer"));
|
||||
|
||||
if ($date_curr == $date_next &&
|
||||
$project_curr == $project_next &&
|
||||
$ticket_curr == $ticket_next) {
|
||||
$next->setDuration($next->getDuration() + $current->getDuration());
|
||||
$next->setRate($next->getRate() + $current->getRate());
|
||||
}
|
||||
else {
|
||||
$merged_entries[] = $current;
|
||||
}
|
||||
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
|
||||
return $merged_entries;
|
||||
//return $entries;
|
||||
|
||||
}
|
||||
|
||||
public function getId(): string
|
||||
{
|
||||
return 'ABG';
|
||||
}
|
||||
}
|
||||
47
translations/daterangepicker.de.xlf
Normal file
47
translations/daterangepicker.de.xlf
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="de" datatype="plaintext" original="daterangepicker.en.xlf">
|
||||
<body>
|
||||
<trans-unit id="s9Hdo7E" resname="daterangepicker.today">
|
||||
<source>daterangepicker.today</source>
|
||||
<target>Heute</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="gkQA1YG" resname="daterangepicker.yesterday">
|
||||
<source>daterangepicker.yesterday</source>
|
||||
<target>Gestern</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="CAvVEbc" resname="daterangepicker.lastWeek">
|
||||
<source>daterangepicker.lastWeek</source>
|
||||
<target>Letzte Woche</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="HfcD1_y" resname="daterangepicker.thisWeek">
|
||||
<source>daterangepicker.thisWeek</source>
|
||||
<target>Diese Woche</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AdEC6w4" resname="daterangepicker.lastMonth">
|
||||
<source>daterangepicker.lastMonth</source>
|
||||
<target>Letzter Monat</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="8f61k.L" resname="daterangepicker.thisMonth">
|
||||
<source>daterangepicker.thisMonth</source>
|
||||
<target>Dieser Monat</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="_9rEFED" resname="daterangepicker.lastYear">
|
||||
<source>daterangepicker.lastYear</source>
|
||||
<target>Letztes Jahr</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="XgIrZS3" resname="daterangepicker.thisYear">
|
||||
<source>daterangepicker.thisYear</source>
|
||||
<target>Dieses Jahr</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AY_E9UR" resname="daterangepicker.thisYearUntilNow">
|
||||
<source>daterangepicker.thisYearUntilNow</source>
|
||||
<target>Dieses Jahr - bis heute</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="m0lJOke" resname="daterangepicker.allTime">
|
||||
<source>daterangepicker.allTime</source>
|
||||
<target>Gesamter Zeitraum</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
47
translations/invoice-calculator.de.xlf
Normal file
47
translations/invoice-calculator.de.xlf
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
|
||||
<file source-language="en" target-language="de" datatype="plaintext" original="invoice-calculator.en.xlf">
|
||||
<body>
|
||||
<trans-unit id="MviRJeB" resname="invoice_calculator">
|
||||
<source>invoice_calculator</source>
|
||||
<target>Summen Berechnung</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="N6juwc4" resname="default">
|
||||
<source>default</source>
|
||||
<target>Standard: ein Eintrag pro Zeitmessung</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="_bAHi13" resname="short">
|
||||
<source>short</source>
|
||||
<target>Stunden: Einträge aufsummiert, nur ein Eintrag</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="BPiZbad" resname="user">
|
||||
<source>user</source>
|
||||
<target>Benutzer: ein Eintrag pro Benutzer</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="BlGGO.X" resname="activity">
|
||||
<source>activity</source>
|
||||
<target>Aktivität: ein Eintrag pro Aktivität</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="JEIQ5IQ" resname="project">
|
||||
<source>project</source>
|
||||
<target>Projekt: ein Eintrag pro Projekt</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="DodjLNR" resname="date">
|
||||
<source>date</source>
|
||||
<target>Datum: ein Eintrag pro Tag (verwendet Startdatum)</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="iFDs7Zh" resname="weekly">
|
||||
<source>weekly</source>
|
||||
<target>Wöchentlich: ein Eintrag pro Woche (verwendet Startdatum)</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="aDtTH0H" resname="price">
|
||||
<source>price</source>
|
||||
<target>Preis: ein Eintrag je Preis</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="N6Kuwc5" resname="ABG">
|
||||
<source>default</source>
|
||||
<target>ABG: ein Eintrag pro Zeitmessung sortiert nach Schlagwort</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
Reference in New Issue
Block a user