| Server IP : 37.9.174.138 / Your IP : 216.73.216.117 Web Server : Apache System : Linux vps6.backend.sk 6.12.100+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.100-1 (2026-07-30) x86_64 User : ftpuser ( 1001) PHP Version : 8.4.24 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/html/backend-accounting.sk/app/modules/gDriveWatchDog/code/ |
Upload File : |
<?php
namespace modules\gDriveWatchDog\code;
use app\constants\Config;
/**
* Composite tax mode stored in entity_modes.mode_name as 5 parts joined by DB_ITEMS_SEPARATOR.
*
* Order: DPH, Podnikanie, PHM, Nepeňažný príjem, DPH z odpisu (percent, percent, percent, €, €).
*/
class EvidenceVehicleTaxModeValue {
public const PART_DPH = 'dph';
public const PART_PODNIKANIE = 'podnikanie';
public const PART_PHM = 'phm';
public const PART_NON_CASH = 'non_cash';
public const PART_ALLOCATION = 'allocation';
/** @var list<string> */
private const PART_ORDER = [
self::PART_DPH,
self::PART_PODNIKANIE,
self::PART_PHM,
self::PART_NON_CASH,
self::PART_ALLOCATION,
];
/** @var list<string> */
private const REQUIRED_PERCENT_PARTS = [
self::PART_DPH,
self::PART_PODNIKANIE,
self::PART_PHM,
];
/**
* @return array<string, list<string>>
*/
public static function getDefaultPercentOptions(): array {
return [
self::PART_DPH => ['100', '50'],
self::PART_PODNIKANIE => ['100'],
self::PART_PHM => ['100', '80'],
];
}
/**
* @return array<string, string>
*/
public static function emptyParts(): array {
$parts = [];
foreach (self::PART_ORDER as $key) {
$parts[$key] = '';
}
return $parts;
}
/**
* @return array<string, string>
*/
public static function split(string $modeName): array {
$parts = self::emptyParts();
$raw = trim($modeName);
if ($raw === '') {
return $parts;
}
if (strpos($raw, Config::DB_ITEMS_SEPARATOR) === false) {
$parts[self::PART_DPH] = $raw;
return $parts;
}
$segments = explode(Config::DB_ITEMS_SEPARATOR, $raw);
foreach (self::PART_ORDER as $index => $key) {
$parts[$key] = trim((string) ($segments[$index] ?? ''));
}
return $parts;
}
/**
* @param array<string, mixed> $parts
*/
public static function join(array $parts): string {
$values = [];
foreach (self::PART_ORDER as $key) {
$values[] = trim((string) ($parts[$key] ?? ''));
}
return implode(Config::DB_ITEMS_SEPARATOR, $values);
}
/**
* @param array<string, mixed> $input
*/
public static function buildFromInput(array $input): string {
$parts = self::emptyParts();
foreach (self::PART_ORDER as $key) {
$parts[$key] = trim((string) ($input[$key] ?? ''));
}
foreach (self::REQUIRED_PERCENT_PARTS as $key) {
if ($parts[$key] === '') {
throw new \InvalidArgumentException('Missing required tax mode part: ' . $key);
}
$parts[$key] = self::normalizePercentPart($parts[$key]);
}
foreach ([self::PART_NON_CASH, self::PART_ALLOCATION] as $key) {
if ($parts[$key] === '') {
continue;
}
$parts[$key] = self::normalizeEuroPart($parts[$key]);
}
return self::join($parts);
}
public static function formatLabel(string $modeName): string {
$raw = trim($modeName);
if ($raw === '') {
return '';
}
if (strpos($raw, Config::DB_ITEMS_SEPARATOR) === false) {
return self::formatPercentDisplay($raw);
}
$t = \app\classes\Translator::getInstance();
$parts = self::split($raw);
$chunks = [];
if ($parts[self::PART_DPH] !== '') {
$chunks[] = $t->_get('DPH') . ' ' . self::formatPercentDisplay($parts[self::PART_DPH]);
}
if ($parts[self::PART_PODNIKANIE] !== '') {
$chunks[] = $t->_get('Podnikanie') . ' ' . self::formatPercentDisplay($parts[self::PART_PODNIKANIE]);
}
if ($parts[self::PART_PHM] !== '') {
$chunks[] = $t->_get('PHM') . ' ' . self::formatPercentDisplay($parts[self::PART_PHM]);
}
if ($parts[self::PART_NON_CASH] !== '') {
$chunks[] = 'NP ' . self::formatEuroDisplay($parts[self::PART_NON_CASH]);
}
if ($parts[self::PART_ALLOCATION] !== '') {
$chunks[] = 'DPHzO ' . self::formatEuroDisplay($parts[self::PART_ALLOCATION]);
}
return implode('; ', $chunks);
}
/**
* Formatted cell values for table columns (empty string when part is missing).
*
* @return array<string, string>
*/
public static function getFormattedParts(string $modeName): array {
$parts = self::split($modeName);
$formatted = self::emptyParts();
if ($parts[self::PART_DPH] !== '') {
$formatted[self::PART_DPH] = self::formatPercentDisplay($parts[self::PART_DPH]);
}
if ($parts[self::PART_PODNIKANIE] !== '') {
$formatted[self::PART_PODNIKANIE] = self::formatPercentDisplay($parts[self::PART_PODNIKANIE]);
}
if ($parts[self::PART_PHM] !== '') {
$formatted[self::PART_PHM] = self::formatPercentDisplay($parts[self::PART_PHM]);
}
if ($parts[self::PART_NON_CASH] !== '') {
$formatted[self::PART_NON_CASH] = self::formatEuroDisplay($parts[self::PART_NON_CASH]);
}
if ($parts[self::PART_ALLOCATION] !== '') {
$formatted[self::PART_ALLOCATION] = self::formatEuroDisplay($parts[self::PART_ALLOCATION]);
}
return $formatted;
}
private static function normalizePercentPart(string $value): string {
$value = str_replace(',', '.', trim($value));
if ($value === '' || !is_numeric($value)) {
throw new \InvalidArgumentException('Invalid percent value.');
}
$number = (float) $value;
if ($number < 0 || $number > 100) {
throw new \InvalidArgumentException('Percent must be between 0 and 100.');
}
if (abs($number - round($number)) < 0.00001) {
return (string) (int) round($number);
}
return rtrim(rtrim(number_format($number, 2, '.', ''), '0'), '.');
}
private static function normalizeEuroPart(string $value): string {
$value = str_replace(',', '.', trim($value));
if ($value === '' || !is_numeric($value)) {
throw new \InvalidArgumentException('Invalid amount value.');
}
$number = (float) $value;
if ($number < 0) {
throw new \InvalidArgumentException('Amount must be zero or positive.');
}
return number_format($number, 2, '.', '');
}
public static function formatPercentDisplay(string $value): string {
$number = (float) str_replace(',', '.', $value);
if (abs($number - round($number)) < 0.00001) {
return (string) (int) round($number) . '%';
}
return rtrim(rtrim(number_format($number, 2, '.', ''), '0'), '.') . '%';
}
public static function formatEuroDisplay(string $value): string {
return number_format((float) str_replace(',', '.', $value), 2, ',', ' ') . ' €';
}
}