403Webshell
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/backend-accounting.sk/app/modules/gDriveWatchDog/code/EvidenceVehicleTaxModeValue.php
<?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, ',', ' ') . ' €';
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit