<?php

namespace App\Controller;

use App\Controller\Component\SessionComponent;
use App\Service\Api;
use App\Service\Config;
use App\Service\Soap\DTO\DajNowyWniosekKadrowyResponse;
use App\Service\Soap\DTO\DajWniosekKadrowyOdpowiedz;
use App\Service\Soap\DTO\DajWnioskiKadroweZadanie;
use App\Service\Soap\DTO\DodajWniosekKadrowy;
use App\Service\Soap\DTO\DodajWniosekKadrowyResponse;
use App\Service\Soap\DTO\EdytujWniosekKadrowy;
use App\Service\Soap\DTO\EdytujWniosekKadrowyResponse;
use App\Service\Soap\DTO\ElementWnioskuKadrowego;
use App\Service\Soap\DTO\ElementyWnioskuKadrowego;
use App\Service\Soap\DTO\OdpowiedzUslugi;
use App\Service\Soap\DTO\WeryfikujWniosekKadrowy;
use App\Service\Soap\DTO\WeryfikujWniosekKadrowyResponse;
use App\Service\Soap\DTO\WeryfikujWniosekKadrowyZadanie;
use App\Service\Soap\DTO\WniosekKadrowy;
use App\Service\Soap\DTO\WniosekKadrowyZadanie;
use App\Service\Soap\DTO\Adres;
use App\Service\Soap\DTO\WnioskiKadrowe;
use App\Service\Soap\DTO\ZaakceptujWniosekKadrowyResponse;
use App\Service\Soap\DTO\ZaakceptujWniosekZNotkaResponse;
use Cake\Cache\Cache;
use Cake\Controller\Component\AuthComponent;
use Cake\Controller\Component\PaginatorComponent;
use Cake\Core\App;
use Cake\Core\Configure;
use Cake\Core\Configure\Engine\IniConfig;
use Cake\Event\EventInterface;
use Cake\Filesystem\File;
use Cake\Routing\Router;
use DateTime;
use Laminas\Diactoros\Stream;
use Laminas\Diactoros\UploadedFile;

/**
 * Application level Controller
 *
 * This file is application-wide controller file. You can put all
 * application-wide controller-related methods here.
 *
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org CakePHP(tm) Project
 * @package       app.Controller
 * @since         CakePHP(tm) v 0.2.9
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */

App::className('AppController', 'Controller');
App::className('File', 'Utility');
App::className('Api', 'Service');
App::className('Config', 'Service');
App::className('IniReader', 'Configure');

include "Component/RtfToHtml.php";
include "Component/HtmlToRtf/HtmlToRtf.php";


/**
 * APIController Controller
 *
 * @property Api $Api
 * @property PaginatorComponent $Paginator
 * @property SessionComponent $Session
 * @property AuthComponent $Auth
 * @property Config $Config
 */
#[\AllowDynamicProperties]
class ApiController extends AppController
{
    // Stałe dla kodów
    const KOD_RODZAJ = 301;
    const KOD_DLUGOSC = 302;
    const KOD_NOSNOSC = 303;
    const KOD_MATERIAL = 304;
    const KOD_GNIAZDO = 305;
    const KOD_RODZAJ_DOKUMENTOW_ZGLOSZENIE_SZKOLENIA = 306;

    /**
     * _handle_response method
     * @param array $response
     * @return bool
     */
    protected function _handle_response($response)
    {
        if (isset($response['bKomunikaty'])) {
            $response = $response['bKomunikaty']['bKomunikat'];
            $opis = '';

            if (isset($response[0]['bTytul']) && !empty($response[0]['bTytul'])) {
                foreach ($response as $r) {
                    if (!empty($r['bTytul'])) {
                        $opis .= '<b>' . $r['bTytul'] . '</b>';
                        if (!empty($r['bOpis'])) {
                            $opis .= ' - ' . $r['bOpis'] . '. ';
                        } else {
                            $opis .= '. ';
                        }
                        $opis .= '<br />';
                    }
                }
                $this->Flash->error($opis);
            } else {
                if (!empty($response['bOpis'])) $opis = $response['bOpis'];

                if ($response['bRodzaj'] == 'Ok') {
                    $this->Flash->success($response['bTytul'] . '. ' . $opis);
                    return true;
                } else {
                    $this->Flash->error($response['bTytul'] . '. ' . $opis);
                    return false;
                }
            }
        } else {
            if (isset($response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Opis'])) {
                $this->Flash->error(
                    'Kod błędu: ' .
                    $response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Kod'] .
                    '. ' .
                    $response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Opis']
                );

                if (isset($response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Kod']) && $response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Kod'] == 100) {
                    $this->loadModel('Config');
                    $appConfig = $this->Config->getConfig();
                    $this->redirect($appConfig['local_url'] . 'login');
                }

                return false;
            }
        }
    }

    /**
     * _handle_response_json method
     *
     * @param $response
     * @return object|mixed|array
     */
    protected function _handle_response_json($response)
    {
        $_response = array();

        if (isset($response['bKomunikaty']) and !empty($response['bKomunikaty'])) {
            $response = $response['bKomunikaty']['bKomunikat'];
            $opis = '';

            if (isset($response[0]['bTytul']) && !empty($response[0]['bTytul'])) {
                foreach ($response as $r) {
                    if (!empty($r['bTytul'])) {
                        $opis .= '<b>' . $r['bTytul'] . '</b>';
                        if (!empty($r['bOpis'])) {
                            $opis .= ' - ' . $r['bOpis'] . '. ';
                        } else {
                            $opis .= '. ';
                        }
                        $opis .= '<br />';
                    }
                }
                $_response['error'] = $opis;
            } else {
                if (!empty($response['bOpis'])) $opis = $response['bOpis'];

                if ($response['bRodzaj'] == 'Ok') {
                    $_response['message'] = $response['bTytul'] . '. ' . $opis;
                    return $_response;
                } else {
                    $_response['error'] = $response['bTytul'] . '. ' . $opis;
                    return $_response;
                }
            }
        } else {
            if (isset($response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Opis'])) {
                $_response['error'] = 'Kod błędu: ' .
                    $response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Kod'] .
                    '. ' .
                    $response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Opis'];

                if (isset($response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Kod']) && $response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Kod'] == 100) {
                    $_response['login'] = true;
                    return $_response;
                }

                return $_response;
            }
        }


        return $_response;
    }

    protected function _handle_response_json2($response)
    {
        $_response = array();

        if (isset($response['Komunikaty'])) {
            $response = $response['Komunikaty']['Komunikat'];
            $opis = '';

            if (isset($response[0]['Tytul']) && !empty($response[0]['Tytul'])) {
                foreach ($response as $r) {
                    if (!empty($r['Tytul'])) {
                        $opis .= '<b>' . $r['Tytul'] . '</b>';
                        if (!empty($r['Opis'])) {
                            $opis .= ' - ' . $r['Opis'] . '. ';
                        } else {
                            $opis .= '. ';
                        }
                        $opis .= '<br />';
                    }
                }
                $_response['error'] = $opis;
            } else {
                if (!empty($response['Opis'])) $opis = $response['Opis'];

                if ($response['Rodzaj'] == 'Ok') {
                    $_response['message'] = $response['Tytul'] . '. ' . $opis;
                    return $_response;
                } else {
                    $_response['error'] = $response['Tytul'] . '. ' . $opis;
                    return $_response;
                }
            }
        } else {
            if (isset($response['Body']['Fault']['Detail']['SzczegolyBleduUslugi']['Opis'])) {
                $_response['error'] = 'Kod błędu: ' .
                    $response['Body']['Fault']['Detail']['SzczegolyBleduUslugi']['Kod'] .
                    '. ' .
                    $response['Body']['Fault']['Detail']['SzczegolyBleduUslugi']['Opis'];

                if (isset($response['Body']['Fault']['Detail']['SzczegolyBleduUslugi']['Kod']) && $response['Body']['Fault']['Detail']['SzczegolyBleduUslugi']['Kod'] == 100) {
                    $_response['login'] = true;
                    return $_response;
                }

                return $_response;
            }
        }

        return $_response;
    }

    /**
     * Handle response object (DTO) and convert to array with 'b' prefix keys
     * @param object $response
     * @return array
     */
    protected function _handle_response_object_json($response)
    {
        $_response = array();

        // Handle error response (bKomunikaty)
        if (isset($response->bKomunikaty) && !empty($response->bKomunikaty)) {
            $komunikaty = $response->bKomunikaty->bKomunikat;
            $opis = '';

            if (isset($komunikaty[0]->bTytul) && !empty($komunikaty[0]->bTytul)) {
                foreach ($komunikaty as $r) {
                    if (!empty($r->bTytul)) {
                        $opis .= '<b>' . $r->bTytul . '</b>';
                        if (!empty($r->bOpis)) {
                            $opis .= ' - ' . $r->bOpis . '. ';
                        } else {
                            $opis .= '. ';
                        }
                        $opis .= '<br />';
                    }
                }
                $_response['error'] = $opis;
            } else {
                $opis = $komunikaty->bOpis ?? '';

                if ($komunikaty->bRodzaj == 'Ok') {
                    $_response['message'] = $komunikaty->bTytul . '. ' . $opis;
                    return $_response;
                } else {
                    $_response['error'] = $komunikaty->bTytul . '. ' . $opis;
                    return $_response;
                }
            }
        }

        return $_response;
    }

    /**
     * mime_type based on file name
     * @param $filename
     * @return mixed|string
     */
    protected function mime_type($filename)
    {
        $mime_types = array(
            'txt' => 'text/plain',
            'htm' => 'text/html',
            'html' => 'text/html',
            'php' => 'text/html',
            'css' => 'text/css',
            'js' => 'application/javascript',
            'json' => 'application/json',
            'xml' => 'application/xml',
            'swf' => 'application/x-shockwave-flash',
            'flv' => 'video/x-flv',
            // images
            'png' => 'image/png',
            'jpe' => 'image/jpeg',
            'jpeg' => 'image/jpeg',
            'jpg' => 'image/jpeg',
            'gif' => 'image/gif',
            'bmp' => 'image/bmp',
            'ico' => 'image/vnd.microsoft.icon',
            'tiff' => 'image/tiff',
            'tif' => 'image/tiff',
            'svg' => 'image/svg+xml',
            'svgz' => 'image/svg+xml',
            // archives
            'zip' => 'application/zip',
            'rar' => 'application/x-rar-compressed',
            'exe' => 'application/x-msdownload',
            'msi' => 'application/x-msdownload',
            'cab' => 'application/vnd.ms-cab-compressed',
            // audio/video
            'mp3' => 'audio/mpeg',
            'qt' => 'video/quicktime',
            'mov' => 'video/quicktime',
            // adobe
            'pdf' => 'application/pdf',
            'psd' => 'image/vnd.adobe.photoshop',
            'ai' => 'application/postscript',
            'eps' => 'application/postscript',
            'ps' => 'application/postscript',
            // ms office
            'doc' => 'application/msword',
            'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'rtf' => 'application/rtf',
            'xls' => 'application/vnd.ms-excel',
            'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'ppt' => 'application/vnd.ms-powerpoint',
            'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            // open office
            'odt' => 'application/vnd.oasis.opendocument.text',
            'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
        );

        $ext = explode('.', (string)$filename);
        $ext = strtolower(array_pop($ext));
        if (array_key_exists($ext, $mime_types)) {
            return $mime_types[$ext];
        } elseif (function_exists('finfo_open')) {
            $finfo = finfo_open(FILEINFO_MIME);
            $mimetype = finfo_file($finfo, $filename);
            finfo_close($finfo);
            return $mimetype;
        } else {
            return 'application/octet-stream';
        }
    }

    /**
     * @param $rtf string
     * @return string
     */
    protected function _rtf2html(&$rtf)
    {
        $rtf = str_replace("\\par&#xD;", "", $rtf);
        $rtf = preg_replace('/&#xD;/', '', $rtf);
        $rtf = preg_replace('/&#x0;/', '', $rtf);
        $reader = new \RtfReader();
        $reader->Parse($rtf);
        $formatter = new \RtfHtml();
        return $rtf = $formatter->Format($reader->root);
    }

    /**
     * @param $html string
     * @return string
     */
    protected function _html2rtf($html)
    {
        $formatter = new \HtmlToRtf\HtmlToRtf($html);
        return $formatter->getRTF();
    }

    /**
     * @param array $array
     * @param string $key_name
     * @return array
     */
    protected function _convert_list_response(&$array = array(), ?string $key_name = null)
    {
        if (!isset($array[$key_name][0]) && !empty($array[$key_name])) {
            $new_array = array();
            $new_array[$key_name][0] = $array[$key_name];
            $array = $new_array;
        }
        return $array;
    }


    /**
     * @param $date
     * @param bool $datetime
     * @param bool $seconds
     * @return string $date
     */
    protected function _convert_to_date(&$date, $datetime = false, $seconds = false)
    {
        if ($date != null && !empty($date)) {
            $date = preg_replace('/T/', " ", $date);
            $date = new \DateTime($date);
            if ($datetime) {
                if (!$seconds) {
                    $date = $date->format('Y-m-d H:i');
                } else {
                    $date = $date->format('Y-m-d H:i:s');
                }
            } else {
                $date = $date->format('Y-m-d');
            }
        } else {
            $date = null;
        }
        return $date;
    }

    /**
     * @param $array array
     * @param $keys array
     * @param bool $datetime
     * @param bool $seconds
     * @return array $array
     */
    protected function _convert_to_date_array(&$array, $keys, $datetime = false, $seconds = false)
    {
        if (!empty($array)) {
            foreach ($keys as $key) {
                if (isset($array[$key]) && $array[$key] != null && !empty($array[$key]) && !is_array($array[$key])) {
                    $array[$key] = $this->_convert_to_date($array[$key], $datetime, $seconds);
                } else if (isset($array[$key]) && (empty($array[$key]) || $array[$key] == null || $array[$key] == 'null')) {
                    $array[$key] = null;
                }
            }
        }
        return $array;
    }


    /**
     * @param string $date
     * @return string
     */
    protected function _date_for_request($date = null)
    {
        if ($date == null) {
            $date = new \DateTime();
        } else {
            $date = new \DateTime($date);
        }
        return $date->format('Y-m-d\TH:i:s');
    }


    /**
     * @param array $array
     * @return string
     */
    protected function _array_2_string($array = array())
    {
        return base64_encode(json_encode($array));
    }

    /**
     * @param $string string
     * @return array
     */
    protected function _string_2_array($string)
    {
        return json_decode(base64_decode($string), true);
    }

    /**
     * @param $array array
     * @param $from string
     * @param $to string
     * @return array $renamed
     */
    protected function _rename_array_key_prefixes($array, $from, $to)
    {
        $renamed = array();
        foreach ($array as $key => $value) {
            $key = preg_replace('/' . $from . '/', $to, $key, 1);
            $renamed[$key] = $value;
        }
        return $renamed;
    }

    /**
     * @param $input_array array
     * @param $from string|array
     * @param $to string|array
     * @param $output_array array
     * @return array
     */
    protected function _rename_array_key_prefixes_recursive($input_array, $from, $to, &$output_array = array())
    {
        foreach ($input_array as $key => &$value) {
            if (is_array($from)) {
                foreach ($from as $k => $v) {
                    if (preg_match('/' . $v . '/', $key)) {
                        $key = preg_replace('/' . $v . '/', $to[$k], $key, 1);
                        break;
                    }
                }
            } else {
                $key = preg_replace('/' . $from . '/', $to, $key, 1);
            }
            if (is_array($value)) {
                $output_array[$key] = $this->_rename_array_key_prefixes_recursive($value, $from, $to, $output_array[$key]);
            } else {
                $output_array[$key] = $value;
            }
        }
//        debug($output_array);
//        die();
        return $output_array;
    }

    /**
     * @param $array
     * return array
     */
    protected function _unset_empty_values(&$array)
    {
        if (!is_array($array)) {
            return $array;
        }
        if (!empty($array)) {
            foreach ($array as $key => &$value) {
                if (is_array($value)) {
                    $this->_unset_empty_values($value);
                } else if ($value == '') {
                    unset($array[$key]);
                }
            }
        }
        return $array;
    }

    /**
     * changes empty array values and empty string values to passed replacement string
     * @param array<mixed> $array
     * return array<mixed>
     */
    protected function _replace_empty_values(array &$array, ?string $replacement = ''): array
    {
        if (!empty($array)) {
            foreach ($array as $key => &$value) {
                if (is_array($value)) {
                    if (empty($value)) {
                        $value = $replacement;
                    } else {
                        $this->_replace_empty_values($value, $replacement);
                    }
                }
                if ($value == '' || is_null($value)) {
                    $value = $replacement;
                }
            }
        }
        return $array;
    }

    /**
     * @param $value string
     * @return string
     */
    protected function _checkbox_int_2_string($value)
    {
        if ($value == '0') {
            return 'false';
        } else if ($value == '1') {
            return 'true';
        }
    }

    /**
     * @param $value string
     * @return bool
     */
    protected function _checkbox_string_2_bool($value)
    {
        if ($value == 'true') {
            return true;
        } else if ($value == 'false') {
            return false;
        }
    }

    /**
     * @param $value string
     * @return int
     */
    protected function _checkbox_string_2_int($value)
    {
        if ($value == 'true') {
            return 1;
        } else if ($value == 'false') {
            return 0;
        }
    }

    /**
     * @param $array
     * @return string
     */
    protected function _complex_array2xml($array)
    {
        $xml = '';
        foreach ($array as $key => $value) {
            if (is_int($key) || is_integer($key)) {
                $xml .= $this->_complex_array2xml($value);
            } else {
                $xml .= '<' . $key . '>';
                if (is_array($value)) {
                    $xml .= $this->_complex_array2xml($value);
                } else {
                    $xml .= $value;
                }
                $xml .= '</' . $key . '>';
            }
        }
        return $xml;
    }

    /**
     * @return mixed
     */
    protected function _getUserContexts()
    {
        if ($this->request->getSession()->check('userContexts')) {
            return $this->request->getSession()->read('userContexts');
        }
    }

    /**
     * _generujUprawnienia method
     * @param $zaloguj
     */
    protected function _generujUprawnienia($zaloguj)
    {
        $_modules = array(
            'ModulZFS', 'ModulBhp', 'ModulKadry', 'ModulRejestruBezpieczenstwa', 'ModulRoot', 'ModulWiadomosci',
            'ModulRejestruWnioskow', 'ModulRejestruBadanLekarskich', 'ModulRejestruCzlonkowRodziny',
            'ModulRejestruDokumentow', 'ModulAdministracja', 'ModulPlace', 'ModulInformacjiDoWyplatyMiesiacami',
            'ModulInformacjiOstatniaWyplata', 'ModulInformacjiOstatniMiesiac', 'ModulInformacjiOstatniRok',
            'ModulInformacjiPrzychodMiesiacami', 'ModulRejestruJezykow', 'ModulRejestruKar',
            'ModulRejestruKwalifikacji', 'ModulRejestruNieobecnosci', 'ModulRejestruOcenyPracownika',
            'ModulRejestruPlanuUrlopow', 'ModulRejestruDanychOsobowych', 'ModulRejestruPrzebieguPracy',
            'ModulRejestruSzkolen', 'ModulRejestruUmowOPrace', 'ModulRejestruKar', 'ModulRejestruCzasuPracy',
            'ModulRejestruWyksztalcen', 'ModulRejestruZastepstw', 'ModulRejestruSciezekAkceptacji',
            'ModulInne', 'ModulPaskiWyplat', 'ModulPIT', 'ModulRMUA', 'ModulRejestruImportow'
        );
        $modules = array();

        if (isset($zaloguj['bUprawnienia']) and isset($zaloguj['bUprawnienia']['cModul']) and !empty($zaloguj['bUprawnienia']['cModul'])) {
            foreach ($zaloguj['bUprawnienia']['cModul'] as $item) {
                $newItem = array();
                foreach ($item as $k => $value) {
                    $newKey = preg_replace('/^c/', 'b', $k);
                    $newItem[$newKey] = $value;
                }
                $modules[$item['cNazwaTypu']] = $newItem;
            }
        }
//        foreach ($_modules as $m)
//        {
//            $mm = $this->Api->DajUprawnieniaPoNazwie($this->_getGid(), $m);
//            $modules[$m] = $mm;
//        }

        $this->request->getSession()->write('uprawnienia', $modules);
    }

    /**
     * @return array|mixed
     */
    protected function _uprawnienia()
    {
        $uprawnienia = array();
        if ($this->request->getSession()->check('uprawnienia')) {
            $uprawnienia = $this->request->getSession()->read('uprawnienia');
        }
        $this->set(compact('uprawnienia'));
        return $uprawnienia;
    }

    /**
     * @return string current user gid
     */
    protected function _getGid()
    {
        $gid = '';
        if ($this->request->getSession()->check('gid')) {
            $gid = $this->request->getSession()->read('gid');
        }
        return $gid;
    }

    /**
     * @return mixed|string
     */
    protected function _getUserGid()
    {
        $userGid = '';
        if ($this->request->getSession()->check('userGid')) {
            $userGid = $this->request->getSession()->read('userGid');
        }
        return $userGid;
    }

    /**
     * @return mixed|string
     */
    protected function _getRoleGid()
    {
        $roleGid = '';
        if ($this->request->getSession()->check('roleGid')) {
            $roleGid = $this->request->getSession()->read('roleGid');
        }
        return $roleGid;
    }

    /**
     * @param null $gidRoli
     * @return array
     */
    protected function _daj_uzytkownikow($gidRoli = null)
    {
//        $this->Api->setDebug(true);
        if ($gidRoli == null) {
            return $this->Api->DajUzytkownikow($this->_getGid());
        } else {
            return $this->Api->DajUzytkownikow($this->_getGid(), array(
                'dat:GidRoli' => $gidRoli
            ));
        }
    }

    /**
     * @param $gid
     * @return array
     */
    protected function _daj_uzytkownika($gid)
    {
        return $this->Api->DajUzytkownika($this->_getGid(), $gid);
    }

    /**
     * @param array $data
     * @return array
     */
    private function _dodaj_uzytkownika($data = array())
    {
        return $this->Api->DodajUzytkownika($this->_getGid(), $data);
    }

    /**
     * @param array $data
     * @return array
     */
    private function _edytuj_uzytkownika($data = array())
    {
        return $this->Api->EdytujUzytkownika($this->_getGid(), $data);
    }

    /**
     * @param $gid
     * @return array
     */
    private function _usun_uzytkownika($gid)
    {
        return $this->Api->UsunUzytkownika($this->_getGid(), $gid);
    }

    /**
     * _set_message method
     * sets single message
     * @param array $message
     * @return array
     */
    protected function _set_message(&$message = array())
    {
        if (!empty($message)) {
            $this->_convert_to_date($message['bWiadomosc']['bDataPublikacji']);
            $this->_convert_to_date($message['bWiadomosc']['bDataUtworzenia']);
            $this->_convert_list_response($message['bWiadomosc']['bOdbiorcy'], 'bAdres');
            $this->_convert_list_response($message['bWiadomosc']['bOdebrali'], 'bAdres');
            if ($message['bWiadomosc']['bTresc'] != null && !empty($message['bWiadomosc']['bTresc']) && strpos($message['bWiadomosc']['bTresc'], "{\\rtf1\\") !== false) {
                $this->_rtf2html($message['bWiadomosc']['bTresc']);
            }
            if ($message['bWiadomosc']['bTrescRTF'] != null && !empty($message['bWiadomosc']['bTrescRTF']) && strpos($message['bWiadomosc']['bTrescRTF'], "{\\rtf1\\") !== false) {
                $this->_rtf2html($message['bWiadomosc']['bTrescRTF']);
            }
            $this->_convert_to_date($message['bWiadomosc']['bNadawca']['bData'], true);
            if (!empty($message['bWiadomosc']['bOdebrali'])) {
                foreach ($message['bWiadomosc']['bOdbiorcy']['bAdres'] as &$odbiorcy) {
                    $odbiorcy = $this->_convert_to_date_array($odbiorcy, array('bData'), true);
                }
            }
            if (!empty($message['bWiadomosc']['bOdebrali'])) {
                foreach ($message['bWiadomosc']['bOdbiorcy']['bAdres'] as &$odebrali) {
                    $odebrali = $this->_convert_to_date_array($odebrali, array('bData'), true);
                }
            }
            $message['bWiadomosc']['bTrescHTML'] = html_entity_decode($message['bWiadomosc']['bTrescHTML']);
        }
        return $message;
    }

    /**
     * _set_messages method
     * sets multiple messages
     * @param array $messages
     * @return array $messages
     */
    protected function _set_messages(&$messages = array())
    {
        if (isset($messages['bWiadomosci']) && !empty($messages['bWiadomosci']['bWiadomosc'])) {
            $this->_convert_list_response($messages['bWiadomosci'], 'bWiadomosc');
            $dateKeys = array('bDataPublikacji', 'bDataUtworzenia', 'bDataOdebrania', 'bDataUkrycia');
            foreach ($messages['bWiadomosci']['bWiadomosc'] as &$message) {
                $message = $this->_convert_to_date_array($message, $dateKeys, true);
                $this->_convert_list_response($message['bOdbiorcy'], 'bAdres');
                $this->_convert_list_response($message['bOdebrali'], 'bAdres');
                if ($message['bTresc'] != null && !empty($message['bTresc']) && strpos($message['bTresc'], "{\\rtf1\\") !== false) {
                    $this->_rtf2html($message['bTresc']);
                }
                if ($message['bTrescRTF'] != null && !empty($message['bTrescRTF']) && strpos($message['bTrescRTF'], "{\\rtf1\\") !== false) {
                    $this->_rtf2html($message['bTrescRTF']);
                }
                $this->_convert_to_date($message['bNadawca']['bData'], true);
                if (!empty($message['bOdbiorcy']['bAdres'])) {
                    foreach ($message['bOdbiorcy']['bAdres'] as &$odbiorca) {
                        $odbiorca = $this->_convert_to_date_array($odbiorca, array('bData'), true);
                    }
                }
                if (!empty($message['bOdebrali'])) {
                    foreach ($message['bOdebrali']['bAdres'] as &$odebrali) {
                        $odebrali = $this->_convert_to_date_array($odebrali, array('bData'), true);
                    }
                }

                if (isset($message['bWiadomosc']['bTrescHTML'])) {
                    $message['bWiadomosc']['bTrescHTML'] = html_entity_decode($message['bWiadomosc']['bTrescHTML']);
                }
            }
        }
        return $messages;
    }

    /**
     * @param $gidMsg -id wiadomosci
     * @return array message
     */
    private function _daj_wiadomosc($gidMsg)
    {
        $message = $this->Api->DajWiadomosc($this->_getGid(), $gidMsg);

        if (!is_array($message['bWiadomosc']['bTrescHTML'])) {
            $message['bWiadomosc']['bTrescHTML'] = html_entity_decode($message['bWiadomosc']['bTrescHTML']);
        } else {
            $message['bWiadomosc']['bTrescHTML'] = '';
        }

        return $this->_set_message($message);
    }

    /**
     * @param $options array
     * @return array
     */
    private function _daj_wiadomosci($options = array())
    {
        if (empty($options)) {
            $messages = $this->Api->DajListeWiadomosci($this->_getGid());
        } else {
            $messages = $this->Api->DajListeWiadomosci($this->_getGid(), $options);
        }
        return $this->_set_messages($messages);
    }

    /**
     * _profil method
     * @param string $gid
     * @param int|string $ne
     * @return null|string
     */
    private function _profil($gid, $ne)
    {
        $options = array(
            'dat:Gid' => $gid,
            'dat:Nrewid' => $ne,
        );
        $employee = $this->Api->OpiszPracownika($this->_getGid(), $options);
        return $employee;
    }

    /**
     * _umowy_o_prace method
     * _umowy_o_prace method
     *
     * @param $id
     * @return array
     */
    private function _umowy_o_prace($id, $currentYear = false): array
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $contracts = $this->Api->DajUmowyOPrace($this->_getGid(), $options);

        if (!isset($contracts['bUmowyOPrace']['bUmowaOPrace']['bStanowiskoKod'])) {
            foreach ($contracts['bUmowyOPrace']['bUmowaOPrace'] as &$contract) {
                if (is_array($contract)) {
                    $contract['bPlik'] = false;
                    $karta = $this->Api->DajKarteStanowiskowa($this->_getGid(), ['dat:StanowiskoKod' => $contract['bStanowiskoKod']]);
                    if (isset($karta['bKarta']['bPlik']) and !empty($karta['bKarta']['bPlik'])) {
                        $contract['bPlik'] = true;
                    }
                }
            }
        } else {
            foreach ($contracts['bUmowyOPrace'] as &$contract) {
                if (is_array($contract)) {
                    $contract['bPlik'] = false;
                    $karta = $this->Api->DajKarteStanowiskowa($this->_getGid(), ['dat:StanowiskoKod' => $contract['bStanowiskoKod']]);
                    if (isset($karta['bKarta']['bPlik']) and !empty($karta['bKarta']['bPlik'])) {
                        $contract['bPlik'] = true;
                    }
                }
            }
        }

        return $contracts;
    }

    /**
     * @param $contracts
     * @return mixed
     */
    private function _umowy_o_prace_convert($contracts, $currentYear = false)
    {
        $this->_convert_list_response($contracts['bUmowyOPrace'], 'bUmowaOPrace');
        $dateKeys = array('bDataOd', 'bDataDo', 'bDataDoUmowy', 'bDataOdUmowy');
        if (!empty($contracts) && isset($contracts['bUmowyOPrace']['bUmowaOPrace'])) {
            foreach ($contracts['bUmowyOPrace']['bUmowaOPrace'] as &$contract) {
                $contract = $this->_convert_to_date_array($contract, $dateKeys);
            }
            if ($currentYear) {
                $contactArray = $contracts['bUmowyOPrace']['bUmowaOPrace'];
                $contracts['bUmowyOPrace']['bUmowaOPrace'] = array();
                foreach ($contactArray as $cc) {
                    if (date('Y', strtotime((string)$cc['bDataOd'])) == date('Y') || (date('Y', strtotime((string)$cc['bDataDo'])) >= date('Y') || empty($cc['bDataDo']))) $contracts['bUmowyOPrace']['bUmowaOPrace'][] = $cc;
                }
            }
        }
        return $contracts;
    }


    /**
     * _nieobecnosci method
     * @param $id
     * @return null|string
     */
    private function _nieobecnosci($id, $currentYear = false)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $absents = $this->Api->DajNieobecnosci($this->_getGid(), $options);

        return $absents;
    }

    /**
     * @param array $absents
     * @return mixed|array
     */
    private function _nieobecnosci_convert($absents, $currentYear = null)
    {
        $this->_convert_list_response($absents['bNieobecnosci'], 'bNieobecnosc');
        $dateKeys = array('bDataDo', 'bDataOd', 'bOkres');
        if (!empty($absents) && isset($absents['bNieobecnosci']['bNieobecnosc'])) {
            foreach ($absents['bNieobecnosci']['bNieobecnosc'] as &$absent) {
                $absent = $this->_convert_to_date_array($absent, $dateKeys);
            }

            if ($currentYear) {
                $absentsArray = $absents['bNieobecnosci']['bNieobecnosc'];
                $absents['bNieobecnosci']['bNieobecnosc'] = array();
                foreach ($absentsArray as $aa) {
                    if (date('Y', strtotime($aa['bDataOd'])) == date('Y')) $absents['bNieobecnosci']['bNieobecnosc'][] = $aa;
                }
            }
        }

        return $absents;
    }

    /**
     * _przebiegi_pracy method
     * @param $id
     * @return null|string
     */
    private function _przebiegi_pracy($id)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $workflows = $this->Api->DajPrzebiegiPracy($this->_getGid(), $options);

        return $workflows;
    }

    /**
     * @param $workflows
     * @return mixed
     */
    private function _przebiegi_pracy_convert($workflows)
    {
        $dateKeys = array('bDataDo', 'bDataOd');
        $this->_convert_list_response($workflows['bPrzebiegiPracy'], 'bPrzebiegPracy');
        if (!empty($workflows) && isset($workflows['bPrzebiegiPracy']['bPrzebiegPracy'])) {
            foreach ($workflows['bPrzebiegiPracy']['bPrzebiegPracy'] as &$workflow) {
                $workflow = $this->_convert_to_date_array($workflow, $dateKeys);
            }
        }

        return $workflows;
    }

    /**
     * _wyksztalcenia method
     * @param $id
     * @return null|string
     */
    private function _wyksztalcenia($id)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $educations = $this->Api->DajWyksztalcenia($this->_getGid(), $options);

        return $educations;
    }

    /**
     * @param $educations
     * @return mixed
     */
    private function _wyksztalcenia_convert($educations)
    {
        $this->_convert_list_response($educations['bWyksztalcenia'], 'bWyksztalcenie');
        $dateKeys = array('bDataDo', 'bDataOd', 'bDataUkonczenia');
        if (!empty($educations) && isset($educations['bWyksztalcenia']['bWyksztalcenie'])) {
            foreach ($educations['bWyksztalcenia']['bWyksztalcenie'] as &$education) {
                $education = $this->_convert_to_date_array($education, $dateKeys);
            }
        }

        return $educations;
    }

    /**
     * _badania method
     * @param $id
     * @return null|string
     */
    private function _badania($id, $currentYear = false)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $badania = $this->Api->DajBadaniaLekarskie($this->_getGid(), $options);

        return $badania;
    }

    /**
     * @param $badania
     * @param bool $currentYear
     * @return mixed
     */
    private function _badania_convert($badania, $currentYear = false)
    {
        $this->_convert_list_response($badania['bBadaniaLekarskie'], 'bBadanieLekarskie');
        $this->_convert_list_response($badania['bInformacjeDodatkowe'], 'bInformacjaDodatkowa');
        if (!empty($badania) && isset($badania['bBadaniaLekarskie']['bBadanieLekarskie'])) {
            foreach ($badania['bBadaniaLekarskie']['bBadanieLekarskie'] as &$badanie) {
                $badanie = $this->_convert_to_date_array($badanie, array('bDataBadania', 'bDataWaznosci'));
            }

            if ($currentYear) {
                $badaniaArray = $badania['bBadaniaLekarskie']['bBadanieLekarskie'];
                $badania['bBadaniaLekarskie']['bBadanieLekarskie'] = array();
                foreach ($badaniaArray as $bb) {
                    if (date('Y', strtotime($bb['bDataBadania'])) == date('Y')) $badania['bBadaniaLekarskie']['bBadanieLekarskie'][] = $bb;
                }
            }
        }

        return $badania;
    }

    /**
     * _szkolenia method
     * @param $id
     * @return null|string
     */
    private function _szkolenia($id, $currentYear = false)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $trainings = $this->Api->DajSzkolenia($this->_getGid(), $options);
        $this->_convert_list_response($trainings['bSzkolenia'], 'bSzkolenie');
        if (!empty($trainings) && isset($trainings['bSzkolenia']['bSzkolenie'])) {
            foreach ($trainings['bSzkolenia']['bSzkolenie'] as &$training) {
                $training = $this->_convert_to_date_array($training, array('bDataOd', 'bDataDo', 'bDataWaznosci'));
            }

            if ($currentYear) {
                $trainingArray = $trainings['bSzkolenia']['bSzkolenie'];
                $trainings['bSzkolenia']['bSzkolenie'] = array();
                foreach ($trainingArray as $tt) {
                    if (date('Y', strtotime($tt['bDataOd'])) == date('Y')) $trainings['bSzkolenia']['bSzkolenie'][] = $tt;
                }
            }
        }
        return $trainings;
    }

    /**
     * _kary method
     * @param $id
     * @return null|string
     */
    private function _kary($id)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $punishes = $this->Api->DajKary($this->_getGid(), $options);
        $this->_convert_list_response($punishes['bKary'], 'bKara');
        if (!empty($punishes) && isset($punishes['bKary']['bKara'])) {
            foreach ($punishes['bKary']['bKara'] as &$punish) {
                $punish = $this->_convert_to_date_array($punish, array('bDataOd', 'bDataDo'));
            }
        }
        return $punishes;
    }

    /**
     * _jezyki method
     * @param $id
     * @return null|string
     */
    private function _jezyki($id)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $langs = $this->Api->DajJezyki($this->_getGid(), $options);
        $this->_convert_list_response($langs['bJezyki'], 'bJezyk');
        return $langs;
    }

    /**
     * _kwalifikacje method
     * @param $id
     * @return null|string
     */
    private function _kwalifikacje($id)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $skills = $this->Api->DajKwalifikacje($this->_getGid(), $options);
        $this->_convert_list_response($skills['bKwalifikacje'], 'bKwalifikacja');
        if (!empty($skills) && isset($skills['bKwalifikacje']['bKwalifikacja'])) {
            foreach ($skills['bKwalifikacje']['bKwalifikacja'] as &$skill) {
                $skill = $this->_convert_to_date_array($skill, array('bDataUzyskania', 'bDataWaznosci'));
            }
        }
        return $skills;
    }

    /**
     * _rodzina method
     * @param $id
     * @return null|string
     */
    private function _rodzina($id)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $family = $this->Api->DajCzlonkowRodziny($this->_getGid(), $options);
        $this->_convert_list_response($family['bCzlonkowieRodziny'], 'bCzlonekRodziny');
        if (!empty($family) && isset($family['bCzlonkowieRodziny']['bCzlonekRodziny'])) {
            foreach ($family['bCzlonkowieRodziny']['bCzlonekRodziny'] as &$fam) {
                $fam = $this->_convert_to_date_array($fam, array('bDataUrodzenia'));
            }
        }
        return $family;
    }

    /**
     * _ocena method
     * @param $id
     * @return null|string
     */
    private function _ocena($id)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $ratings = $this->Api->DajOceny($this->_getGid(), $options);

        $rjson = $this->_handle_response_json($ratings);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->_convert_list_response($ratings['bOceny'], 'bOcena');
        if (!empty($ratings) && isset($ratings['bOceny']['bOcena'])) {
            foreach ($ratings['bOceny']['bOcena'] as &$rating) {
                $rating = $this->_convert_to_date_array($rating, array('bDataOd', 'bDataDo'));
            }
        }
        return $ratings;
    }

    /**
     * _plan_urlopu method
     * @param $id
     * @return null|string
     */
    private function _plan_urlopu($id)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        $free_days = $this->Api->DajPlanyUrlopu($this->_getGid(), $options);
        $this->_convert_list_response($free_days['bPlanyUrlopu'], 'bPlanUrlopu');
        if (!empty($free_days) && isset($free_days['bPlanyUrlopu']['bPlanUrlopu'])) {
            foreach ($free_days['bPlanyUrlopu']['bPlanUrlopu'] as &$free_day) {
                $free_day = $this->_convert_to_date_array($free_day, array('bDataOd', 'bDataDo'));
            }
        }
        return $free_days;
    }

    private function _akceptacja_planu_urlopu($id, $accept, $year)
    {
        $options = array(
            'dat:CzyTylkoDoAkceptacji' => $accept,
            'dat:NumerEwidencyjny' => $id,
            'dat:Rok' => $year
        );
        $free_days = $this->Api->DajPlanyUrlopuPodleglych($this->_getGid(), $options);
        $this->_convert_list_response($free_days['bPlanyUrlopu'], 'bPlanUrlopu');
        if (!empty($free_days) && isset($free_days['bPlanyUrlopu']['bPlanUrlopu'])) {
            foreach ($free_days['bPlanyUrlopu']['bPlanUrlopu'] as &$free_day) {
                $free_day = $this->_convert_to_date_array($free_day, array('bDataOd', 'bDataDo'));
            }
        }
        return $free_days;
    }


    /**
     * _dokumenty method
     * @param $id
     * @params string $rodzaj
     * @return null|string
     */
    private function _dokumenty($id, $rodzaj = null)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        if ($rodzaj != null) {
            $options['dat:Rodzaj'] = $rodzaj;
        }

        $documents = $this->Api->DajDokumenty($this->_getGid(), $options);
        $this->_convert_list_response($documents['bDokumenty'], 'bDokument');
        if (!empty($documents) && isset($documents['bDokumenty']['bDokument'])) {
            foreach ($documents['bDokumenty']['bDokument'] as &$document) {
                $document = $this->_convert_to_date_array($document, array('bDataPublikacji'), true, true);
            }
        }
        return $documents;
    }

    /**
     * _dokumenty_kadrowe method
     * @param $id
     * @params string $rodzaj
     * @return null|string
     */
    private function _dokumenty_kadrowe($id, $rodzaj = null)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        if ($rodzaj != null) {
            $options['dat:Rodzaj'] = $rodzaj;
        }

        $options['dat:Zakres'] = 'Kadrowe';

        $documents = $this->Api->DajDokumenty($this->_getGid(), $options);
        $this->_convert_list_response($documents['bDokumenty'], 'bDokument');
        if (!empty($documents) && isset($documents['bDokumenty']['bDokument'])) {
            foreach ($documents['bDokumenty']['bDokument'] as &$document) {
                $document = $this->_convert_to_date_array($document, array('bDataPublikacji'), true, true);
            }
        }
        return $documents;
    }

    /**
     * _dokumenty_placowe method
     * @param $id
     * @param string $rodzaj
     * @return null|array
     */
    private function _dokumenty_placowe($id, $rodzaj = null, $numer_pracownika = null)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        if ($rodzaj != null) {
            $options['dat:Rodzaj'] = $rodzaj;
        }

        if ($numer_pracownika !== null) {
            $options['dat:NumerEwidencyjny'] = $numer_pracownika;
        }

        $options['dat:Zakres'] = 'Placowe';

        $documents = $this->Api->DajDokumenty($this->_getGid(), $options);
        $this->_convert_list_response($documents['bDokumenty'], 'bDokument');
        if (!empty($documents) && isset($documents['bDokumenty']['bDokument'])) {
            foreach ($documents['bDokumenty']['bDokument'] as &$document) {
                $document = $this->_convert_to_date_array($document, array('bDataPublikacji'), true, true);
            }
        }
        return $documents;
    }

    /**
     * _adresy_email method
     * @param $id
     * @param null|string $rodzaj
     * @param null|string $numer_pracownika
     * @return array
     */
    private function _adresy_email($id, $rodzaj = null, $numer_pracownika = null)
    {
        $options = array(
            'dat:NumerEwidencyjny' => $id
        );
        if ($rodzaj != null) {
            $options['dat:Rodzaj'] = $rodzaj;
        }

        if ($numer_pracownika !== null) {
            $options['dat:NumerEwidencyjny'] = $numer_pracownika;
        }

        $options['dat:Zakres'] = 'Placowe';

        $emails = $this->Api->DajAdresyEmail($this->_getGid(), $options);

        $list = [];
        switch ($rodzaj) {
            case 'PaskiWyplat':
                if (!empty($emails['bEmailOdcinki'])) {
                    $list[] = $emails['bEmailOdcinki'];
                }
                break;
            case 'DeklaracjePIT':
                if (!empty($emails['bEmailPIT'])) {
                    $list[] = $emails['bEmailPIT'];
                }
                break;
        }
        if (!empty($emails['bEmailOgolny'])) {
            $list[] = $emails['bEmailOgolny'];
        }

        if (!empty($emails['bEmail'])) {
            $list[] = $emails['bEmail'];
        }

        $emails['emails'] = $list;

        return $emails;
    }

    /**
     * @param ?string $bGid
     */
    public function dokumentHistoria($bGid = null)
    {
        $this->viewBuilder()->setLayout('ajax');
        $options = array(
            'bGid' => $bGid
        );

        $document = $this->Api->DajHistoriePrzetwarzaniaDokumentu($this->_getGid(), $options);

        if (isset($document['bDokument']['bHistoriaPrzetwarzania']['cZapisHistoriiPrzetwarzania']) && isset($document['bDokument']['bHistoriaPrzetwarzania']['cZapisHistoriiPrzetwarzania'][0]) == false) {
            $document['bDokument']['bHistoriaPrzetwarzania']['cZapisHistoriiPrzetwarzania'] = [0 => $document['bDokument']['bHistoriaPrzetwarzania']['cZapisHistoriiPrzetwarzania']];
        }

        $resp = $this->_handle_response_json($document);
        if (isset($resp['login'])) {
            $this->redirect('/');
        }

        $this->set(compact('document'));
    }

    public function dokumentEmail($bGid = null, $rodzaj = null)
    {
        $options = array(
            'bGid' => $bGid
        );

        $options['bEmail'] = $this->request->getQuery('email') !== null ? $this->request->getQuery('email') : null;

        if ($rodzaj == 'DeklaracjePIT') {
            $options['bRodzaj'] = 'Pit';
        } elseif ($rodzaj == 'PaskiWyplat') {
            $options['bRodzaj'] = 'Odcinek';
        } elseif ($rodzaj == 'RMUA') {
            $options['bRodzaj'] = 'Rmua';
        } else {
            $options['bRodzaj'] = 'NieOkreslony';
        }

        $response = $this->Api->WyslijDokumentEmail($this->_getGid(), $options);

        echo json_encode($this->_handle_response_json2($response));
        die();
    }

    public function dokumentRemoveDoc($bGid = null)
    {
        $options = array(
            'bGid' => $bGid
        );

        $options['bUsunTresc'] = 'false';
        $options['bUsunCalyDokument'] = 'true';

        $response = $this->Api->UsunDokument($this->_getGid(), $options);

        echo json_encode($this->_handle_response_json2($response));
    }

    public function dokumentRemove($bGid = null)
    {
        $options = array(
            'bGid' => $bGid
        );

        $options['bUsunTresc'] = 'true';
        $options['bUsunCalyDokument'] = 'false';

        $response = $this->Api->UsunDokument($this->_getGid(), $options);

        echo json_encode($this->_handle_response_json2($response));
    }

    public function dokument($bGid = null, $action = 'open')
    {
        if ($bGid == NULL) $this->redirect('/');

        $this->viewBuilder()->setLayout('ajax');
        $options = array(
            'bGid' => $bGid
        );

        $rodzaj = $this->request->getQuery('rodzaj') !== null ? $this->request->getQuery('rodzaj') : null;

        if ($this->request->getQuery('format') !== null && !empty($this->request->getQuery('format'))) {
            $format = $this->request->getQuery('format');

            $options['bRodzajeTresci'] = 'Tresc' . strtoupper($format);

            if ($rodzaj !== null) {
                if ($rodzaj == 'DeklaracjePIT') {
                    switch ($format) {
                        case 'upo':
                            $options['bRodzaj'] = 'PitUpo';
                            break;
                        case 'xades':
                            $options['bRodzaj'] = 'PitXades';
                            break;
                        case 'xml':
                            $options['bRodzaj'] = 'PitXml';
                            break;
                        default:
                            $options['bRodzaj'] = 'Pit';
                    }
                } elseif ($rodzaj == 'PaskiWyplat') {
                    $options['bRodzaj'] = 'Odcinek';
                } elseif ($rodzaj == 'RMUA') {
                    $options['bRodzaj'] = 'Rmua';
                } else {
                    $options['bRodzaj'] = 'NieOkreslony';
                }
                $document = $this->Api->DajDokumentZWybranaTrescia1($this->_getGid(), $options);
            } else {
                $document = $this->Api->DajDokumentZWybranaTrescia($this->_getGid(), $options);
            }

            $resp = $this->_handle_response_json($document);
            if (isset($resp['login'])) {
                $this->redirect('/');
            } else {
                $cDisposition = 'attachment';
                $cFileName = $document['bDokument']['bNazwaPlikuDoPobierania'];
                if ($action == 'open') $cDisposition = 'inline';

                header('Content-Description: ' . $cFileName);
                header('Content-Type: ' . $this->Api->getMimeType($cFileName));
                header('Content-Disposition: ' . $cDisposition . '; filename="' . $cFileName . '"');
                header('Expires: 0');
                header('Cache-Control: must-revalidate');
                header('Pragma: public');
                header('Content-Length: ' . strlen(base64_decode($document['bDokument']['bTresc' . strtoupper($format)])));

                echo base64_decode($document['bDokument']['bTresc' . strtoupper($format)]);
            }
        } else {
            if ($rodzaj !== null) {
                if ($rodzaj == 'DeklaracjePIT') {
                    $options['bRodzaj'] = 'Pit';
                } elseif ($rodzaj == 'PaskiWyplat') {
                    $options['bRodzaj'] = 'Odcinek';
                } elseif ($rodzaj == 'RMUA') {
                    $options['bRodzaj'] = 'Rmua';
                } else {
                    $options['bRodzaj'] = 'NieOkreslony';
                }
                $document = $this->Api->DajDokument1($this->_getGid(), $options);
            } else {
                $document = $this->Api->DajDokument($this->_getGid(), $options);
            }
            $resp = $this->_handle_response_json($document);
            if (isset($resp['login'])) {
                $this->redirect('/');
            } else {
                $cDisposition = ($action != 'download') ? 'inline' : 'attachment';
                $cFileName = $document['bDokument']['bNazwaPlikuDoPobierania'];

                header('Content-Description: ' . $cFileName);
                header('Content-Type: ' . $this->Api->getMimeType($cFileName));
                header('Content-Disposition: ' . $cDisposition . '; filename="' . $cFileName . '"');
                header('Expires: 0');
                header('Cache-Control: must-revalidate');
                header('Pragma: public');
                header('Content-Length: ' . strlen(base64_decode($document['bDokument']['bTresc'])));

                echo base64_decode($document['bDokument']['bTresc']);
            }
        }

        exit;
    }

    /**
     * @param string $skrzynka
     * @return array
     */
    private function _daj_wnioski($skrzynka = "Wszystkie", $start = false)
    {
        $options = array(
//            'dat:CzyOdrzucone' => '',
//            'dat:CzyZaakceptowane' => ''
        );
        if ($skrzynka != null) {
            $options = array(
                'dat:Skrzynka' => $skrzynka
            );
        }
        if ($start) {
            $wnioski = $this->Api->DajListeWnioskowStart($this->_getGid(), $options);
        } else {
            $wnioski = $this->Api->DajListeWnioskow($this->_getGid(), $options);
        }
        $this->_convert_list_response($wnioski['bWnioski'], 'bWniosek');
        if (!empty($wnioski) && isset($wnioski['bWnioski']['bWniosek'])) {
            foreach ($wnioski['bWnioski']['bWniosek'] as $wniosek) {
                $this->_convert_list_response($wniosek['bAkceptujacy'], 'cAdres');
            }
            foreach ($wnioski['bWnioski']['bWniosek'] as &$wnios) {
                $wnios = $this->_convert_to_date_array($wnios, array('bDataOd', 'bDataDo', 'bDataUtworzenia'), true, false);
            }
        }
        return $wnioski;
    }

    /**
     * @return array
     */
    private function _daj_mozliwe_kody_wniosku($type = null)
    {
        $codes = $this->Api->DajListeMozliwychKodowWniosku($this->_getGid(), $type);

        $codes['bKody'] = $this->_convert_list_response($codes['bKody'], 'bKod');
        return $codes;
    }

    /**
     * @return array
     */
    private function _daj_mozliwe_kody_wniosku_dla_podwladnego($nrewid, $type = null)
    {
        $codes = $this->Api->DajListeMozliwychKodowWnioskuZaPodwladnego($this->_getGid(), $nrewid, $type);
        $codes['bKody'] = $this->_convert_list_response($codes['bKody'], 'bKod');

        return $codes;
    }

    private function _daj_mozliwych_podwladnych_do_wniosku()
    {
        return $this->Api->DajPodwladnychDlaKtorychMogeSkladacWnioski($this->_getGid());
    }

    /**
     * _daj_dane_osobowe method
     * @param string $gid
     * @param int|string $ne
     * @return null|string
     */
    private function _daj_dane_osobowe($gid, $ne)
    {
        $options = array(
//            'dat:Gid' => $gid,
            'dat:Nrewid' => $ne
        );
        $result = $this->Api->DajDaneOsobowe($this->_getGid(), $options);

        return $result;
    }

    /**
     * @param $gid string
     * @param $options array
     * @return array
     */
    private function _daj_informacje_o_saldach($gid, $options = array())
    {
        return $this->Api->DajInformacjeOSaldach($gid, $options);
    }

    /**
     * @param array $options
     * @return array
     */
    private function _zapisz_wniosek($options = array())
    {
        return $this->Api->ZapiszWniosek($this->_getGid(), $options);
    }


    /**
     * @param array $options
     * @return array
     */
    private function _dodaj_urlop($options = array())
    {
        return $this->Api->DodajUrlop($this->_getGid(), $options);
    }

    /**
     * @param array $options
     * @return array
     */
    private function _edytuj_urlop($options = array())
    {
        return $this->Api->EdytujUrlop($this->_getGid(), $options);
    }

    /**
     * @return array
     */
    private function _lista_pracownikow()
    {
        $employees = $this->Api->DajListePracownikow($this->_getGid());
        $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');
        return $employees;
    }

    /**
     * _daj_wnioski_kadrowe method
     * @param string|null $zMetody
     * @param int $miesiecyWstecz
     * @param string|null $skrzynka - Moje/Wplywajace/Wszystkie
     * @param string|null $status - Oczekuje/Zaakceptowany/Odrzucony
     * @return array<WniosekKadrowy>
     */
    private function _daj_wnioski_kadrowe($zMetody = null, $skrzynka = null, $status = null): array
    {
        $zadanie = new DajWnioskiKadroweZadanie();
        $zadanie->ZMetody = $zMetody;
        $zadanie->Skrzynka = $skrzynka;

        match ($status) {
            'Start' => ($zadanie->CzyZaakceptowane = false) || ($zadanie->CzyOdrzucone = false),
            'Zaakceptowany' => $zadanie->CzyZaakceptowane = true,
            'Odrzucony' => $zadanie->CzyOdrzucone = true,
            'Oczekuje' => $zadanie->CzyOczekujace = true,
            'Zaimportowane' => $zadanie->CzyZaimportowane = true,
            default => null,
        };

        $response = $this->Api->DajListeWnioskowKadrowych($this->_getGid(), $zadanie);

        // Check for errors using handleServiceResponse
        $errorCheck = $this->Api->handleServiceResponse($response);
        if (!empty($errorCheck['error'])) {
            return ['error' => $errorCheck['error']];
        }

        if (is_null($response->WnioskiKadrowe) and !empty($response->Komunikaty)) {
            return ['error' => 'Błąd'];
        }

        // Extract the result from response
        return (array)$response->WnioskiKadrowe->WniosekKadrowy ?? [];
    }

    /**
     * _daj_rodzaje_wnioskow_kadrowych method
     * @return array
     */
    private function _daj_rodzaje_wnioskow_kadrowych()
    {
        $wnioskuKadrowego = $this->Api->DajMozliweRodzajeWnioskuKadrowego($this->_getGid());
        $rodzaje = [];
        if (isset($wnioskuKadrowego['bNazwyRodzajuWniosku']) && isset($wnioskuKadrowego['bNazwyRodzajuWniosku']['cstring'])) {
            if (is_array($wnioskuKadrowego['bNazwyRodzajuWniosku']['cstring'])) {
                foreach ($wnioskuKadrowego['bNazwyRodzajuWniosku']['cstring'] as $key => $value) {
                    if (!empty($value)) {
                        $rodzaje[] = [
                            'bGid' => $wnioskuKadrowego['bIdentyfikatoryRodzajuWniosku']['cguid'][$key],
                            'bNazwa' => $value,
                        ];
                    }
                }
            }
        }
        return $rodzaje;
    }

    /**
     * _daj_uprawnienia_wnioskow_kadrowych method
     * @return array
     */
    private function _daj_uprawnienia_wnioskow_kadrowych()
    {
        $uprawnienia = $this->Api->DajUprawnieniaPoNazwie($this->_getGid(), 'ModulRejestruWnioskowKadrowych');
        return $uprawnienia;
    }

    /**
     * _daj_nowy_wniosek_kadrowy method
     * @param string|null $gidRodzajuWniosku
     *
     * @return DajWniosekKadrowyOdpowiedz|null
     */
    private function _daj_nowy_wniosek_kadrowy(?string $gidRodzajuWniosku = null): ?DajWniosekKadrowyOdpowiedz
    {
        return $this->Api->DajNowyWniosekKadrowy($this->_getGid(), $gidRodzajuWniosku);
    }

    /**
     * _daj_wniosek_kadrowy method
     * @param string $gidWniosku
     * @return DajWniosekKadrowyOdpowiedz|null
     */
    private function _daj_wniosek_kadrowy(string $gidWniosku): ?DajWniosekKadrowyOdpowiedz
    {
        return $this->Api->DajWniosekKadrowy($this->_getGid(), $gidWniosku);
    }

    /**
     * _weryfikuj_wniosek_kadrowy method
     * @param array $options
     * @return WeryfikujWniosekKadrowyResponse
     */
    private function _weryfikuj_wniosek_kadrowy(array $options = []): WeryfikujWniosekKadrowyResponse
    {
        // Dekoduj base64 zakodowany obiekt $nowyWniosek
        $nowyWniosek = null;
        if (!empty($options['nowyWniosekBase64'])) {
            $json = base64_decode($options['nowyWniosekBase64']);
            if ($json !== false) {
                $nowyWniosek = json_decode($json);
            }
        }

        // Jeśli nie ma base64, pobierz standardowo z API
        if (empty($nowyWniosek)) {
            $nowyWniosek = $this->_daj_nowy_wniosek_kadrowy($options['GidRodzaju'] ?? null)->WniosekKadrowy;
        }

        $request = new WeryfikujWniosekKadrowy();
        $zadanie = new WeryfikujWniosekKadrowyZadanie();
        $zadanie->CzyDokladnie = true;

        $wniosek = $nowyWniosek;

        // Aktualizuj pola główne wniosku z formularza
        if (!empty($options['Gid'])) {
            $wniosek->Gid = $options['Gid'];
        }
        if (!empty($options['Numer'])) {
            $wniosek->Numer = (int)$options['Numer'];
        }
        if (!empty($options['Opis'])) {
            $wniosek->Opis = $options['Opis'];
        }

        // Aktualizuj elementy wniosku z formularza
        // Struktura $options['ElementyWnioskuKadrowego']: {Gid: wartość, Gid2: wartość2, ...}
        if (!empty($options['ElementyWnioskuKadrowego']) && !empty($nowyWniosek->Elementy->ElementWnioskuKadrowego)) {
            // Rekurencyjna funkcja do aktualizacji elementów
            $updateElementsRecursive = function ($elements) use ($options, &$updateElementsRecursive) {
                foreach ($elements as $element) {
                    $elGid = $element->Gid ?? null;
                    if ($elGid && isset($options['ElementyWnioskuKadrowego'][$elGid])) {
                        $wartoscFromForm = $options['ElementyWnioskuKadrowego'][$elGid];
                        // Aktualizuj WartoscPHPX tylko jeśli wartość nie jest pusta
                        if ($wartoscFromForm !== null && $wartoscFromForm !== '') {
                            $element->WartoscPHPX = $wartoscFromForm;
                        }
                        $rodzaj = $element->Rodzaj ?? '';

                        if ($rodzaj === 'Adres') {
                            $zmetody = null;
                            $gidRodzajuWniosku = $options['GidRodzaju'] ?? '';
                            $nazwaPola = $element->Nazwa ?? '';
                            if (!empty($gidRodzajuWniosku) && !empty($nazwaPola)) {
                                $zmetody = 'WnioskiKadrowe.' . $gidRodzajuWniosku . '.' . $nazwaPola;
                            }

                            try {
                                $adresyResponse = $this->Api->DajAdresy($this->_getGid(), ['ZMetody' => $zmetody]);
                                if (!empty($adresyResponse['bAdresy']['bAdres'])) {
                                    $adresy = $adresyResponse['bAdresy']['bAdres'];

                                    $adresyList = isset($adresy['bGid']) ? [$adresy] : $adresy;
                                    foreach ($adresyList as $adr) {
                                        if ($wartoscFromForm === $adr['bGid']) {
                                            // Koduj w formacie: [GID|EMAIL|NAZWA|NAZWA_WYSWIETLANA|DATA|DATA_AKCEPACJI|...]
                                            // Dodajemy NAZWA_WYSWIETLANA na pozycji 3 dla łatwego wyświetlania
                                            $encoded = '['
                                                . ($adr['bGid'] ?? '') . '|'
                                                . ($adr['bEmail'] ?? '') . '|'
                                                . ($adr['bNazwa'] ?? '') . '|'
                                                . '|'
                                                . '|'
                                                . '|'
                                                . ($adr['bCzyMozeZaakceptowacZaPozostalych'] ?? '') . '|'
                                                . ($adr['bCzyMusiZaakceptowac'] ?? '') . '|'
                                                . ($adr['bNazwisko'] ?? '') . '|'
                                                . ($adr['bImie'] ?? '')
                                                . ']';
                                            $element->WartoscPHPX = $encoded;
                                        }
                                    }

                                }
                            } catch (\Exception $e) {
                                error_log('Error fetching addresses for wniosek kadrowy: ' . $e->getMessage());
                            }
                        }
                    }

                    // Rekurencyjnie przetwarzaj pod-elementy (dla Grup)
                    if (!empty($element->Elementy->ElementWnioskuKadrowego)) {
                        $updateElementsRecursive($element->Elementy->ElementWnioskuKadrowego);
                    }
                }
            };

            $updateElementsRecursive($nowyWniosek->Elementy->ElementWnioskuKadrowego);
            $wniosek->Elementy = $nowyWniosek->Elementy;
        }

        $zadanie->WniosekKadrowy = $wniosek;
        $request->pZadanie = $zadanie;
        $request->pGidSesji = $this->_getGid();

        return $this->Api->WeryfikujWniosekKadrowy($request);
    }

    /**
     * _zapisz_wniosek_kadrowy method
     */
    private function _zapisz_wniosek_kadrowy(EdytujWniosekKadrowy|DodajWniosekKadrowy $request, $czyEdycja = false): EdytujWniosekKadrowyResponse|DodajWniosekKadrowyResponse
    {
        if ($czyEdycja) {
            return $this->Api->EdytujWniosekKadrowy($request);
        }
        return $this->Api->DodajWniosekKadrowy($request);
    }

    /**
     * _zaakceptuj_wniosek_kadrowy method
     * @param string $gidWniosku
     * @param string|null $notka
     * @return ZaakceptujWniosekKadrowyResponse|ZaakceptujWniosekZNotkaResponse
     */
    private function _zaakceptuj_wniosek_kadrowy($gidWniosku, $notka = null): object
    {
        return $this->Api->ZaakceptujWniosekKadrowy($this->_getGid(), $gidWniosku, $notka);
    }

    /**
     * _odrzuc_wniosek_kadrowy method
     * @param string $gidWniosku
     * @param string|null $notka
     * @return array
     */
    private function _odrzuc_wniosek_kadrowy($gidWniosku, $notka = null)
    {
        return $this->Api->OdrzucWniosekKadrowy($this->_getGid(), $gidWniosku, $notka);
    }

    /**
     * _usun_wniosek_kadrowy method
     * @param string $gidWniosku
     * @return OdpowiedzUslugi|null
     */
    private function _usun_wniosek_kadrowy($gidWniosku): OdpowiedzUslugi|null
    {
        return $this->Api->UsunWniosekKadrowy($this->_getGid(), $gidWniosku);
    }

    /**
     * _drukuj_wniosek_kadrowy method
     * @param string $gidWniosku
     * @return array
     */
    private function _drukuj_wniosek_kadrowy($gidWniosku)
    {
        return $this->Api->DrukujWniosekKadrowy($this->_getGid(), $gidWniosku);
    }

    /**
     * _daj_informacje_placowe method
     * @param string $rodzaj
     * @return array
     */
    private function _daj_informacje_placowe($rodzaj, $numer_pracownika = null)
    {
        $options = array(
            'dat:Rodzaj' => $rodzaj,
        );

        $options['dat:Nrewid'] = $numer_pracownika;

        $cash = $this->Api->DajInformacjePlacowe($this->_getGid(), $options);
        return $cash;
    }

    /**
     * @param UploadedFile $fileArray
     * @param string $key default "b:"
     * @param string $key2 default "b:"
     * @return array|bool
     */
    private function _zalaczniki(UploadedFile $fileArray, $key = "b:", $key2 = "b:")
    {
        $responseArray = array();
        $upload = WWW_ROOT . "uploads/" . basename($fileArray->getClientFilename());
        if (file_exists($upload)) {
            $file = new File($upload);
            $fileInfo = $file->info();
            $fileContent = base64_encode(fread(fopen($upload, "r"), filesize($upload)));
            $responseArray[$key . 'Zalaczniki'][$key2 . 'Zalacznik'] = array(
//                        $key.'Gid' => '',
//                        $key.'GidRodzica' => '',
                $key2 . 'Nazwa' => $fileInfo['filename'],
                $key2 . 'Plik' => $fileInfo['basename'],
//                        $key.'StronaKodowa' => '',
                $key2 . 'Tresc' => $fileContent,
            );
            $file->delete();
            return $responseArray;
        } else {
            return false;
        }
    }

    /**
     * @param $fileArray
     * @param string $key default "b:"
     * @param string $key2 default "b:"
     * @return array|bool
     */
    private function _zalaczniki_edycja($fileArray, $key = "b:", $key2 = "b:")
    {
        $responseArray = array();
        $responseArray[$key . 'Zalaczniki'][$key2 . 'Zalacznik'] = array(
//            $key.'Gid' => $fileArray['bGid'],
//            $key.'GidRodzica' => $fileArray['bGidRodzica'],
            $key2 . 'Nazwa' => $fileArray['bNazwa'],
            $key2 . 'Plik' => $fileArray['bPlik'],
//            $key.'StronaKodowa' => $fileArray['bStronaKodowa'],
            $key2 . 'Tresc' => $fileArray['bTresc'],
        );
        return $responseArray;
    }

    /**
     * @return array
     */
    private function _daj_liste_zastepstw()
    {
        return $this->Api->DajListeZastepstw($this->_getGid());
    }

    /**
     * @param $gid string
     * @return array
     */
    private function _daj_zastepstwo($gid)
    {
        return $this->Api->DajZastepstwo($this->_getGid(), $gid);
    }

    /**
     * @param $data array
     * @return array
     */
    private function _edytuj_zastepstwo($data)
    {
        return $this->Api->EdytujZastepstwo($this->_getGid(), $data);
    }

    /**
     * @param $data array
     * @return array
     */
    private function _dodaj_zastepstwo($data)
    {
        return $this->Api->DodajZastepstwo($this->_getGid(), $data);
    }


    /**
     * @param $roleGid string
     * @return array
     */
    private function _daj_role_pojedyncza($roleGid)
    {
        return $this->Api->DajRolePojedyncza($this->_getGid(), $roleGid);
    }

    /**
     * @param $data array
     * @return array
     */
    private function _dodaj_role($data)
    {
        return $this->Api->DodajRole($this->_getGid(), $data);
    }

    /**
     * @param $data array
     * @return array
     */
    private function _edytuj_role($data)
    {
        return $this->Api->EdytujRole($this->_getGid(), $data);
    }

    /**
     * @param $data array
     * @return array
     */
    private function _uprawnienia_roli($data)
    {
        return $this->Api->AktualizujACLRoli($this->_getGid(), $data);
    }

    /**
     * @param $data array
     * @return array
     */
    private function _uzytkownicy_roli($data)
    {
        return $this->Api->AktualizujPrzynaleznoscUzytkownikowDoRoli($this->_getGid(), $data);
    }

    /**
     * @param $gid string
     * @return array
     */
    private function _usun_role($gid)
    {
        return $this->Api->UsunRole($this->_getGid(), $gid);
    }

    /**
     * @param $ne
     * @return array
     */
    private function _zmien_kontekst($ne)
    {
        return $this->Api->ZmienKontekstPracownika($this->_getGid(), $ne);
    }

    /**
     * @param $gid string | null
     * jesli podany $gid to pobiera dana sciezke akceptacji, jesli nie to cala liste
     * @return array
     */
    private function _daj_sciezki_akceptacji($gid = null)
    {
        if (is_null($gid)) {
            $paths = $this->Api->DajListeSciezekAkceptacji($this->_getGid());
            return $paths;
        } else {
            $path = $this->Api->DajSciezkeAkceptacji($this->_getGid(), $gid);
            return $path;
        }
    }

    /**
     * @param $data array
     * @return array
     */
    private function _dodaj_sciezke_akceptacji($data)
    {
        return $this->Api->DodajSciezkeAkceptacji($this->_getGid(), $data);
    }

    /**
     * @param $data array
     * @return array
     */
    private function _edytuj_sciezke_akceptacji($data)
    {
        return $this->Api->EdytujSciezkeAkceptacji($this->_getGid(), $data);
    }

    /**
     * _daj_moduly method
     * @param $roleGid string
     * @param $userGid string
     * @return array
     */
    private function _daj_moduly($roleGid = null, $userGid = null)
    {
        return $this->Api->DajModuly($this->_getGid(), $roleGid, $userGid);
    }


    /**
     * Numery list kodów:
     * 2 - komórki
     * 5 - stanowiska
     * 52 - płatnicy
     * 53 - piony
     * 54 - regiony
     * 125 - miejsca
     * 24 - charaktery pracy
     * @param null $code
     * @return array
     */
    private function _daj_liste_kodow($code = null)
    {
        if ($code == null) $code = '';
        $options = array(
            'dat:Numer' => $code
        );
        $codes = $this->Api->DajListeKodow($this->_getGid(), $options);
        return $codes;
    }

    /** PRIVATE METHODS - END */

    /** PUBLIC METHODS - START */

    public function beforeFilter(EventInterface $event)
    {
        ini_set('max_input_vars', 5000);
        ini_set('suhosin.request.max_vars', 5000);
        ini_set('suhosin.post.max_vars', 5000);
        ini_set('post_max_size', '128M');

        parent::beforeFilter($event);

        if ((isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] != "on") && $_SERVER['SERVER_NAME'] != 'dev-datacomp.180c.pl' && $_SERVER['SERVER_NAME'] != 'datacomp.dev' && $_SERVER['SERVER_NAME'] != 'datacomp.develop' && $_SERVER['SERVER_NAME'] != 'localhost') {
            header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
            exit();
        }

        $p = 'http';
        if ($_SERVER['SERVER_NAME'] != 'dev-datacomp.180c.pl' && $_SERVER['SERVER_NAME'] != 'datacomp.dev' && $_SERVER['SERVER_NAME'] != 'datacomp.develop') {
            $p = 'https';
        }
        $this->set('url_prefix', $p . '://' . $_SERVER['SERVER_NAME']);

        if ($this->request->getParam('action') != 'przetwarzanieDanych' && $this->request->getParam('action') != 'nieZgodaNaPrzetwarzanieDanych' && $this->request->getParam('action') != 'zgodaNaPrzetwarzanieDanych' && $this->request->getSession()->read('bCzyZadanieZgodyNaPrzetwarzanieDanych') == 'true') {
            return $this->redirect('/przetwarzanie_danych');
        }

        //get main configuration
        Configure::load('app', 'default', false);
        $this->set('local_url', Configure::read('App')['local_url']);

        $corePath = __DIR__ . '/../Config/core.php';
        $refreshPath = __DIR__ . '/../../refresh.txt';

        if (file_exists($refreshPath)) {
            $ifRefresh = file_get_contents($refreshPath);
            if ($ifRefresh == "1") {
                Configure::write('debug', 2);
                Cache::clear();
                file_put_contents($corePath, str_replace("Configure::write('debug', 0);", "Configure::write('debug', 2);", file_get_contents($corePath)));
                file_put_contents($refreshPath, -1);
                $this->redirect($this->referer() . '?v=' . time());
            } elseif ($ifRefresh == "-1") {
                Configure::write('debug', 0);
                file_put_contents($corePath, str_replace("Configure::write('debug', 2);", "Configure::write('debug', 0);", file_get_contents($corePath)));
                file_put_contents($refreshPath, 0);
                $ref = $this->referer();
                $ref = explode('?', (string)$ref);
                $this->redirect($ref[0]);
            }
        }

        $this->Auth->allow(['login', 'zmianaHasla', 'przetwarzanieDanych', 'zgodaNaPrzetwarzanieDanych', 'nieZgodaNaPrzetwarzanieDanych']);
        if (strpos($this->request->getParam('action'), 'test') !== false) {
            $this->Auth->allow($this->request->getParam('action'));
            $this->Api->setDebug(true);
        }
        if (strpos($this->request->getParam('action'), '_ac') !== false || strpos($this->request->getParam('action'), '_ajax') !== false) {
            $this->autoRender = false;
        }

        if ($this->request->getParam('prefix') == 'ajax') {
            $this->viewBuilder()->setLayout('ajax');
        }
//        $this->Auth->allow();

        $this->setPageName();
        $this->set('current_user', $this->Auth->user());
        $this->set('user_contexts', $this->_getUserContexts());

        $this->_uprawnienia();
        $this->_appconfig();

//        if($this->request->getParam('action') == 'index') {
//            $liczbaPracownikow = $this->dajLiczbePracownikow();
//            $liczbaPracownikowZastepstwa = $this->dajLiczbePracownikowZastepstwa();
//            $this->request->getSession()->write('liczbaPracownikow', $liczbaPracownikow);
//            $this->request->getSession()->write('liczbaPracownikowZastepstwa', $liczbaPracownikowZastepstwa);
//        }

        if ($this->request->getParam('action') != 'login' && $this->request->getParam('action') != 'zgodaNaPrzetwarzanieDanych' && $this->request->getParam('action') != 'nieZgodaNaPrzetwarzanieDanych' && $this->request->getParam('action') != 'zmianaHasla' && $this->request->getParam('action') != 'przetwarzanieDanych') {
            if ($this->request->getSession()->check('liczbaPracownikow')) {
                $liczbaPracownikow = $this->request->getSession()->read('liczbaPracownikow');
                $liczbaPracownikowZastepstwa = $this->request->getSession()->read('liczbaPracownikowZastepstwa');
            } else {
                $liczbaPracownikow = $this->dajLiczbePracownikow();
                $liczbaPracownikowZastepstwa = $this->dajLiczbePracownikowZastepstwa();
            }

            $this->request->getSession()->write('liczbaPracownikow', $liczbaPracownikow);
            $this->request->getSession()->write('liczbaPracownikowZastepstwa', $liczbaPracownikowZastepstwa);

            $this->set(compact('liczbaPracownikow', 'liczbaPracownikowZastepstwa'));
        }
    }

    /**
     * @param $user
     * @return bool
     */
    public function isAuthorized($user)
    {
        return true;
    }

    /**
     *
     */
    public function setPageName()
    {
        $action = mb_strtolower(strval($this->request->getParam('action')));
        $pageName = '';
        switch ($action) {
            case 'index':
                $pageName = 'Witaj w Portalu Pracownika';
                if (!empty($this->request->getSession()->read('bTytulNaPaskuPortalu'))) {
                    $pageName = $this->request->getSession()->read('bTytulNaPaskuPortalu');
                }
                break;
            case 'profil':
                $pageName = 'Twoje podstawowe dane';
                break;
            case 'umowyoprace':
                $pageName = 'Twoje umowy o pracę';
                break;
            case 'zawiesia':
                $pageName = 'Twoje zawiesia';
                break;
            case 'zfs':
                $pageName = 'Twoje wnioski ZFS';
                break;
            case 'nieobecnosci':
                $pageName = 'Twoje nieobecności';
                break;
            case 'przebiegipracy':
                $pageName = 'Twój przebieg pracy';
                break;
            case 'wyksztalcenia':
                $pageName = 'Twoje wykształcenia';
                break;
            case 'badania':
                $pageName = 'Twoje badania lekarskie';
                break;
            case 'szkolenia':
                $pageName = 'Twoje szkolenia';
                break;
            case 'kary':
                $pageName = 'Twoje kary';
                break;
            case 'jezyki':
                $pageName = 'Twoja znajomość języków';
                break;
            case 'kwalifikacje':
                $pageName = 'Twoje kwalifikacje zawodowe';
                break;
            case 'rodzina':
                $pageName = 'Członkowie Twojej rodziny';
                break;
            case 'ocenapracownika':
                $pageName = 'Twoja ocena';
                break;
            case 'planurlopu':
                $pageName = 'Twój plan urlopu';
                break;
            case 'akceptacjaplanuurlopu':
                $pageName = "Twój panel akceptacji";
                break;
            case 'dokumenty':
                $pageName = 'Twoje dokumenty';
                break;
            case 'place':
                $pageName = 'Twoja ostatnia wypłata';
                break;
            case 'grafik':
                $pageName = 'Twój grafik pracy';
                break;
            case 'wnioski':
                $pageName = 'Twoje wnioski';
                break;
            case 'administracjarole':
                $pageName = 'Administracja - Role użytkowników';
                break;
            case 'administracjauzytkownicy':
                $pageName = 'Administracja - Użytkownicy';
                break;
            case 'sciezkiakceptacji':
                $pageName = 'Administracja - Ścieżki akceptacji';
                break;
            case 'zastepstwa':
                $pageName = 'Administracja - Zastępstwa';
                break;
            case 'edytujuzytkownika':
                $pageName = 'Administracja - Edytuj użytkownika';
                break;
            case 'dodajuzytkownika':
                $pageName = 'Administracja - Dodaj użytkownika';
                break;
            case 'dodajrole':
                $pageName = 'Administracja - Dodaj rolę';
                break;
            case 'edytujrole':
                $pageName = 'Administracja - Edytuj rolę';
                break;
            case 'uprawnieniaroli':
                $pageName = 'Administracja - Uprawnienia roli';
                break;
            case 'sciezkaakceptacji':
                $pageName = 'Administracja - Dodaj ścieżkę akceptacji';
                break;
            case 'dodajzastepstwo':
                $pageName = 'Administracja - Dodaj zastępstwo';
                break;
            case 'zastepstwo':
                $pageName = 'Administracja - Edytuj zastępstwo';
                break;
            case 'pracownicy':
                $pageName = 'Pracownicy';
                break;
            case 'pracownicykadry':
                $pageName = 'Pracownicy - Dane kadrowe';
                break;
            case 'pracownicygrafik':
                $pageName = 'Pracownicy - Czas pracy';
                break;
            case 'wiadomosci':
                $pageName = 'Wiadomości';
                break;
            case 'saldourlopu':
                $pageName = 'Twoje salda urlopów';
                break;
            case 'dodajwniosek':
                $pageName = 'Dodaj wniosek';
                break;
            case 'edytujwniosek':
                $pageName = 'Edytuj wniosek';
                break;
            case 'dodajwiadomosc':
                $pageName = 'Dodaj wiadomość';
                break;
            case 'edytujwiadomosc':
                $pageName = 'Edytuj wiadomość';
                break;
            case 'dodajurlop':
                $pageName = 'Dodaj urlop planowany';
                break;
            case 'edytujplanurlopu':
                $pageName = 'Edytuj urlop planowany';
                break;
            case 'ocena':
                $pageName = 'Ocena pracownika';
                break;
            case 'pokazwniosek':
                $pageName = 'Przeglądanie wniosku';
                break;
            case 'pokazocene':
                $pageName = 'Przeglądanie oceny';
                break;
            case 'dodajocene':
                $pageName = 'Dodaj ocenę';
                break;
            case 'edytujocene':
                $pageName = 'Edytuj ocenę';
                break;
            case 'importy':
                $pageName = 'Importy';
                break;
            case 'dodajszablonoceny':
                $pageName = 'Dodaj szablon oceny pracownika';
                break;
            case 'pracownicybbhp':
                $pageName = 'Pracownicy - BHP';
                break;
            case 'szablonyocenypracownika':
            case 'ajaxdajszablonyoceny':
                $pageName = 'Ocena pracownika';
                break;
            case 'mojeraportyportalu':
                $pageName = 'Moje raporty portalu';
                break;

        }
        $this->set(compact('pageName'));
    }

    public function sesjaPlus()
    {
        $this->Api->SesjaPlus($this->_getGid());
        die();
    }

    /**
     *
     */
    public function login()
    {
        header("Access-Control-Allow-Origin: *");
        $this->request->getSession()->delete('SOAP');
        $this->viewBuilder()->setLayout('login');

        if ($this->Auth->user()) {
            return $this->redirect('/');
        }

        $this->Api = new Api();
        $hello = $this->Api->Hello();
        $helloLabel = $hello['bLogoNapis'] ?? '';
        $this->set(compact('helloLabel', 'hello'));
        $this->request->getSession()->clear();
        if (is_array($hello)) {
            $this->request->getSession()->write('pamietajHaslo', false);
            $this->request->getSession()->write('licencja', $hello['bLicencja'] ?? '');
            $this->request->getSession()->write('grupaLicencji', is_array($hello['bGrupaLicencji'] ?? null) ? '' : ($hello['bGrupaLicencji'] ?? ''));
            $this->request->getSession()->write('schematKolorystyczny', 'red');
            if (!empty($hello['bSchematKolorystyczny'])) {
                $schemat = match ($hello['bSchematKolorystyczny']) {
                    'niebieski' => 'blue',
                    'czerwony' => 'red',
                    'zielony' => 'green',
                    'czarny' => 'black',
                    'purpurowy' => 'purple',
                    'zółty' => 'yellow',
                    default => 'red',
                };
                $this->request->getSession()->write('schematKolorystyczny', $schemat);
            }


        }

        if ($this->request->is('post')) {
            $username = $this->request->getData('username');
            $password = $this->request->getData('password');

            if (empty($username) || empty($password)) {
                $this->Flash->error('Błędny login lub hasło.');
                return;
            }

            // Store NOT only username, password for security reasons
            $sessionData = array(
                'pUzytkownik' => $username
            );
            $this->request->getSession()->write('loggedData', $sessionData);

            $loginData = array(
                'pUzytkownik' => $username,
                'pHaslo' => $password
            );
            $zaloguj = $this->Api->Zaloguj($loginData);
            if (!is_array($zaloguj) || "00000000-0000-0000-0000-000000000000" == ($zaloguj['bGidUzytkownika'] ?? '')) {
                return $this->redirect('/login');
            }

            $this->request->getSession()->write('bCzyUdostepnicPrzegladaniePlacPodleglych', $zaloguj['bCzyUdostepnicPrzegladaniePlacPodleglych'] ?? false);
            $this->request->getSession()->write('bCzyZadanieZgodyNaPrzetwarzanieDanych', $zaloguj['bCzyZadanieZgodyNaPrzetwarzanieDanych'] ?? false);
            $this->request->getSession()->write('bTrescZgodyNaPrzetwarzanieDanych', $zaloguj['bTrescZgodyNaPrzetwarzanieDanych'] ?? '');
            $this->request->getSession()->write('bCzyUproszczonySystemOdbic', $zaloguj['bCzyUproszczonySystemOdbic'] ?? false);
            $this->request->getSession()->write('bCzyWylaczycWiadomosciNaStronieGlownej', $zaloguj['bCzyWylaczycWiadomosciNaStronieGlownej'] ?? false);
            $this->request->getSession()->write('bCzyWylaczycAkceptacjeZastepstwaNaStronieGlownej', $zaloguj['bCzyWylaczycAkceptacjeZastepstwaNaStronieGlownej'] ?? false);
            $this->request->getSession()->write('bCzyWylaczycAkceptacjeWnioskowNaStronieGlownej', $zaloguj['bCzyWylaczycAkceptacjeWnioskowNaStronieGlownej'] ?? false);
            $this->request->getSession()->write('bCzyDniNaWidokuListyWnioskow', $zaloguj['bCzyDniNaWidokuListyWnioskow'] ?? "false");
            $this->request->getSession()->write('bTytulNaPaskuPortalu', $zaloguj['bTytulNaPaskuPortalu'] ?? '');

            if (isset($zaloguj['bGidSesji'])) {
                $user = $zaloguj['bKontekstPracownika'];
                $user['bOpisUzytkownika'] = $zaloguj['bOpisUzytkownika'];
                $user = $this->_convert_to_date_array($user, array('cAngazOd', 'cAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
                $userContexts = $zaloguj['bPracownicyTozsamiZUzytkownikiem'];
                foreach ($userContexts as &$context) {
                    $context = $this->_convert_to_date_array($context, array('cAngazOd', 'cAngazDo', 'cDataPrzyjecia', 'cDataZwolnienia'));
                }
                $gid = $zaloguj['bGidSesji'];
                $userGid = $zaloguj['bGidUzytkownika'];

                //Pobierz userow, zeby miec gid usera !?!?
                //Działa tylko dla administratora?
                /*
                $users = $this->Api->DajUzytkownikow($gid);

                foreach ($users['bUzytkownicy']['bUzytkownik'] as $searchForMe) {
                    if ($searchForMe['bNazwa'] == $this->request->data['User']['username']) {
                        $user['userGid'] = $searchForMe['bGid'];
                        $user['username'] = $searchForMe['bNazwa'];
                        break;
                    }
                }
                */

                $this->request->getSession()->write('gid', $gid);
                $this->request->getSession()->write('userGid', $userGid);
                $this->request->getSession()->write('userContexts', $userContexts);

                $this->_generujUprawnienia($zaloguj);

                $user['bGidSesji'] = $gid;
                $user['bUzytkownik'] = strtolower($loginData['pUzytkownik']);

                $this->Auth->setUser($user);

                $liczbaPracownikow = count($zaloguj['bPracownicyTozsamiZUzytkownikiem']);

                if ($liczbaPracownikow == 0) {
                    $liczbaPracownikow = $this->dajLiczbePracownikow();
                }

                $liczbaPracownikowZastepstwa = $this->dajLiczbePracownikowZastepstwa();
                $this->request->getSession()->write('liczbaPracownikow', $liczbaPracownikow);
                $this->request->getSession()->write('liczbaPracownikowZastepstwa', $liczbaPracownikowZastepstwa);

                if ($this->request->getSession()->read('bCzyZadanieZgodyNaPrzetwarzanieDanych') == 'true') {
                    return $this->redirect('/przetwarzanie_danych');
                }

                return $this->redirect('/');
            } else if (isset($zaloguj['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Opis'])) {
                $this->Flash->error(
                    (!empty($zaloguj['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Tytul']) ? ($zaloguj['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Tytul'] . '. ') : '') .
                    (!empty($zaloguj['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Opis']) ? $zaloguj['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Opis'] : '')
                );
                if ($zaloguj['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Kod'] == 200) {
                    $this->request->getSession()->write('zmiana_hasla', '1');
                    return $this->redirect('/zmiana_hasla');
                }
            }
        }
    }

    public function przetwarzanieDanych()
    {
        $this->viewBuilder()->setLayout('login');
        $this->viewBuilder()->setTemplate(null);

        $hello = $this->Api->Hello();
        $helloLabel = $hello['bLogoNapis'];
        $przetwarzanie_danych = true;
        $this->set(compact('helloLabel', 'przetwarzanie_danych'));
        $this->set('bTrescZgodyNaPrzetwarzanieDanych', $this->request->getSession()->read('bTrescZgodyNaPrzetwarzanieDanych'));
    }

    public function zgodaNaPrzetwarzanieDanych()
    {
        $this->viewBuilder()->setLayout('ajax');
        if ($this->request->is(array('post', 'put'))) {
            $resp = $this->Api->ZgodaNaPrzetwarzanieDanych($this->_getGid());
            $this->request->getSession()->write('bCzyZadanieZgodyNaPrzetwarzanieDanych', 'false');
        }

        echo json_encode(array('result' => 'ok'));
        die();
    }

    public function nieZgodaNaPrzetwarzanieDanych()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->request->getSession()->write('bCzyZadanieZgodyNaPrzetwarzanieDanych', 'false');
        echo json_encode(array('result' => 'ok'));
        die();
    }

    /**
     *
     */
    public function zmianaHasla()
    {
        $this->viewBuilder()->setLayout('login');

        $isSystemEvent = true;

        if (isset($_GET['session'])) {
            $this->request->getSession()->write('zmiana_hasla', '1');
            $isSystemEvent = false;
        }

        $this->set(compact('isSystemEvent'));

        $hello = $this->Api->Hello();
        $helloLabel = $hello['bLogoNapis'];
        $passwordInfo = $hello['bHasloInfo'];
        $this->set(compact('helloLabel'));
        $this->set(compact('passwordInfo'));

        $this->set('backLink', $this->referer());

        if ($this->request->getSession()->check('zmiana_hasla')) {
            if ($this->request->is('post')) {
                $data = array(
                    'tem:pUzytkownik' => $this->request->getData('username'),
                    'tem:pHaslo' => $this->request->getData('password'),
                    'tem:pNoweHaslo' => $this->request->getData('new_password'),
                );

                $data['tem:pHaslo'] = htmlspecialchars($data['tem:pHaslo']);
                $data['tem:pNoweHaslo'] = htmlspecialchars($data['tem:pNoweHaslo']);

                $zaloguj = $this->Api->ZalogujIZmienHaslo($data);

                if (isset($zaloguj['bGidSesji'])) {
                    if ((isset($zaloguj['Komunikaty']) && isset($zaloguj['Komunikaty']['Komunikat']) && isset($zaloguj['Komunikaty']['Komunikat']['Rodzaj']) && $zaloguj['Komunikaty']['Komunikat']['Rodzaj'] == "Blad")) {
                        $this->Flash->error($zaloguj['Komunikaty']['Komunikat']['Tytul']);
                    } else {
                        $user = $zaloguj['bKontekstPracownika'];
                        $user = $this->_convert_to_date_array($user, array('cAngazOd', 'cAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
                        $userContexts = $zaloguj['bPracownicyTozsamiZUzytkownikiem'];
                        foreach ($userContexts as &$context) {
                            $context = $this->_convert_to_date_array($context, array('cAngazOd', 'cAngazDo', 'cDataPrzyjecia', 'cDataZwolnienia'));
                        }
                        $gid = $zaloguj['bGidSesji'];
                        $userGid = $zaloguj['bGidUzytkownika'];
                        $user['bGidSesji'] = $zaloguj['bGidSesji'];

                        //Pobierz userow, zeby miec gid usera !?!?
                        //Działa tylko dla administratora?
                        /*
                        $users = $this->Api->DajUzytkownikow($gid);

                        foreach ($users['bUzytkownicy']['bUzytkownik'] as $searchForMe) {
                            if ($searchForMe['bNazwa'] == $this->request->data['User']['username']) {
                                $user['userGid'] = $searchForMe['bGid'];
                                $user['username'] = $searchForMe['bNazwa'];
                                break;
                            }
                        }
                        */

                        $this->request->getSession()->write('gid', $gid);
                        $this->request->getSession()->write('userGid', $userGid);
                        $this->request->getSession()->write('userContexts', $userContexts);
                        $uprawnienia = $this->Api->DajListeUprawnien($this->_getGid(), $this->_getUserGid());
                        $this->request->getSession()->write('uprawnienia', $uprawnienia);
//                $this->Auth->login($user);
                        $this->Flash->success('Zmieniono hasło. Proszę się zalogować nowym hasłem.');
                        $this->request->getSession()->delete('zmiana_hasla');
                        // Destroy old session and redirect to login for new authentication
                        $this->request->getSession()->destroy();
                        return $this->redirect('/login');
                    }
                } else {
                    $this->_handle_response($zaloguj);
                }
            } else {
                // Only pre-fill username, password must be entered manually for security
                $loggedData = $this->request->getSession()->read('loggedData');
                $this->request = $this->request->withData('User', ['username' => $loggedData['pUzytkownik']]);
            }
        } else {
            $this->redirect('/');
        }
    }

    /**
     *
     */
    public function logout()
    {
        $this->Api->Wyloguj($this->_getGid());
        $this->Auth->logout();
        $this->request->getSession()->destroy();
        return $this->redirect('/');
    }

    /**
     * ajax_logout method
     */
    public function ajaxLogout()
    {
        $this->viewBuilder()->setTemplate(null);
        $this->viewBuilder()->setLayout('ajax');

        $this->Api->Wyloguj($this->_getGid());
        $this->Auth->logout();
        $this->request->getSession()->destroy();

        die();
    }

    /**
     * @param $ne int
     */
    public function zmienKontekst($ne)
    {
        $context = $this->_zmien_kontekst($ne);

        $username = $context['bOpisUzytkownika'];
        $context['bOpisUzytkownika'] = $username;
        $context['bAngazDo'] = $this->_convert_to_date($context['bAngazDo']);
        $context['bAngazOd'] = $this->_convert_to_date($context['bAngazOd']);
        $context = $this->_rename_array_key_prefixes($context, 'b', 'c');
        $bOpisUzytkownika = $context['cOpisUzytkownika'];
        $context = $context['cPracownik'];
        $context['bOpisUzytkownika'] = $bOpisUzytkownika;

        foreach ($context as $k => $value) {
            $newKey = preg_replace('/^b/', 'c', $k);
            $context[$newKey] = $value;
        }

//        $this->Auth->logout();
        $this->Auth->isAuthorized($context);
        return $this->redirect($this->referer());
    }


    /**
     *
     */
    public function index()
    {
//        $messages = $this->_daj_wiadomosci();
//        $this->set('messages', $messages);
        $typ_wniosku = 'Wplywajace';
        $wnioski = $this->_daj_wnioski($typ_wniosku, true);
        $rjson = $this->_handle_response_json($wnioski);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        // Pobierz wnioski kadrowe do akceptacji na stronie głównej
        $wnioskiKadrowe = $this->_daj_wnioski_kadrowe('WnioskiKadrowe.AkcepracjaStartowa', 'Wplywajace', 'Start');

        // Filtruj wnioski kadrowe - wyklucz własne wnioski
        $wnioskiKadroweDoAkceptacji = [];
        $currentUserGid = $this->_getUserGid();

        // Konwertuj do tablicy jeśli potrzeba
        if (!empty($wnioskiKadrowe)) {
            $wnioskiKadroweArray = is_array($wnioskiKadrowe) ? $wnioskiKadrowe : [$wnioskiKadrowe];

            foreach ($wnioskiKadroweArray as $wk) {
                // Sprawdź czy to nie własny wniosek
                if (is_array($wk)) {
                    $wnioskujacyGid = $wk['bWnioskujacy']['bGid'] ?? $wk['Wnioskujacy']['Gid'] ?? $wk['bWnioskujacy']['Gid'] ?? $wk['Wnioskujacy']['bGid'] ?? '';
                } else {
                    $wnioskujacyGid = $wk->Wnioskujacy->Gid ?? '';
                }

                if ($wnioskujacyGid != $currentUserGid) {
                    $wnioskiKadroweDoAkceptacji[] = $wk;
                }
            }
        }

        $pracownicy = $this->_daj_mozliwych_podwladnych_do_wniosku();

        if (isset($pracownicy['bAdresy']) and is_array($pracownicy['bAdresy'])) {
            if (count($pracownicy['bAdresy']) > 0) {
                $this->set('employees', [$pracownicy['bAdresy']]);
            }
        }

        $resp = $this->_handle_response_json($wnioski);
        $this->set(compact('resp'));

        if ($typ_wniosku == 'Wplywajace') {
            $wnioskiArray = isset($wnioski['bWnioski']['bWniosek']) ? $wnioski['bWnioski']['bWniosek'] : array();
            $wnioski['bWnioski']['bWniosek'] = array();
            foreach ($wnioskiArray as $wniosek) {
                if ($wniosek['bWnioskujacy']['cGid'] != $this->_getUserGid()) {
                    $wnioski['bWnioski']['bWniosek'][] = $wniosek;
                }
            }
        }
        $this->set(compact('wnioski', 'typ_wniosku', 'wnioskiKadroweDoAkceptacji'));
        $user_context = $this->request->getSession()->read('userContexts');
        $nrewid = '';
        if (isset($user_context['cPracownik']['cNumerEwidencyjny'])) {
            $nrewid = $user_context['cPracownik']['cNumerEwidencyjny'];
        }
        if (empty($nrewid) and ($this->request->getSession()->read('liczbaPracownikow') === null)) {
            return $this->logout();
        }
        $this->set(compact('nrewid'));
    }

    /**
     *
     */
    public function testComplexArray()
    {
        $data = new \DateTime();
        $data = $data->format('Y-m-d\TH:i:s.ms');
        $array = array(
            'dat:CzyNadawca' => 'true',
            'dat:CzyOdebrana' => 'false',
            'dat:CzyUkryta' => 'false',
            'dat:Nadawca' => array(
                'dat:Data' => $data,
                'dat:Email' => 'email@email.email',
                'dat:Gid' => '371723-1283848as-4123-sas'
            ),
            'dat:Odbiorcy' => array(
                0 => array(
                    'dat:Adres' => array(
                        'dat:Data' => $data,
                        'dat:Email' => 'emailodbiorcy@email.com',
                        'dat:Gid' => 'f8as9df3-1f8as8df-13sdf-1fass'
                    )
                ),
                1 => array(
                    'dat:Adres' => array(
                        'dat:Data' => $data,
                        'dat:Email' => 'emailodb2@email.com',
                        'dat:Gid' => 'das8df9123-12380f-1239gnjasdf-f123'
                    )
                )
            )
        );
        debug($this->_complex_array2xml($array));
        die();
    }

    public function dajAdresyAc()
    {
        $response = $this->Api->DajAdresy($this->_getGid());
        $response = $response['bAdresy']['bAdres'];

        $term = strtoupper($this->request->getQuery('term'));

        $resp = array();

        foreach ($response as $key => &$r) {
            if ((!empty($r['bImie']) && strpos(strtoupper($r['bImie']), $term) !== false) || (!empty($r['bNazwisko']) && strpos(strtoupper($r['bNazwisko']), $term) !== false) || (!empty($r['bNazwa']) && strpos(strtoupper($r['bNazwa']), $term) !== false) || (!empty($r['bEmail']) && strpos(strtoupper($r['bEmail']), $term) !== false)) {
                $r['label'] = $r['bNazwaWyswietlana'];
                $r['value'] = $r['bNazwaWyswietlana'];
//                $r['value'] = $r['bNazwa'];
                $resp[] = $r;
            } else {
                unset($response[$key]);
            }
        }

        echo json_encode($resp);
        die();
    }

    /**
     * dodaj_wiadomosc method
     */
    public function dodajWiadomosc($action_return = 'index')
    {
        $this->set(compact('action_return'));
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is('post')) {
            $data = $this->request->getData();
            $action = $data['data']['action'];
            unset($data['data']['action']);
            if ($action == 'Zapisz') {
                $data['pWiadomosc']['pCzyOpublikowac'] = 'false';
            }

            $filesCounter = 0;

            if (isset($_FILES['data']['tmp_name']['file'])) {
                $filesCounter = $this->_getZalaczniki($data['data']['pWiadomosc'], 'dat:');
                unset($data['data']['file']);
            }

            $data = $data['data'];
            $data['pWiadomosc']['b:IloscDodanychZalacznikow'] = $filesCounter;
            $data['pWiadomosc']['b:TrescRTF'] = '';
            if ($data['pWiadomosc']['b:Tresc'] != '') {
                $data['pWiadomosc']['b:TrescRTF'] = $this->_html2rtf(htmlspecialchars($data['pWiadomosc']['b:Tresc']));
                $data['pWiadomosc']['b:TrescHTML'] = $data['pWiadomosc']['b:Tresc'];
                $data['pWiadomosc']['b:Tresc'] = strip_tags($data['pWiadomosc']['b:Tresc']);
            }

            $listaOdbiorcow = array();
            if (!empty($data['pWiadomosc']['b:Odbiorcy']) && !is_null($data['pWiadomosc']['b:Odbiorcy'])) {
                foreach ($data['pWiadomosc']['b:Odbiorcy'] as &$odbiorca) {
                    $odbiorca['b:Adres']['b:Data'] = $this->_date_for_request();

                    $_odbiorca = array(
                        'b:Adres' => array(
                            'b:Data' => $odbiorca['b:Adres']['b:Data'],
                            'b:Email' => $odbiorca['b:Adres']['b:Email'],
                            'b:Gid' => $odbiorca['b:Adres']['b:Gid'],
                            'b:Nazwa' => $odbiorca['b:Adres']['b:Nazwa'],
                        )
                    );
                    $listaOdbiorcow[] = $_odbiorca;
                }
            }

            $data['pWiadomosc']['b:Odbiorcy'] = $listaOdbiorcow;
            $data = $this->_rename_array_key_prefixes_recursive($data, array('b:'), array('dat:'));

            if ($action == 'Zapisz') {
                $save = $this->Api->ZapiszWiadomosc($this->_getGid(), $data);
            } else {
                $save = $this->Api->PublikujWiadomosc($this->_getGid(), $data);
            }

            echo json_encode($this->_handle_response_json($save));
            die();

            /*if (isset($save['bKomunikaty'])) {
                $komunikaty = array();
                if (!isset($save['bKomunikaty']['bKomunikat'][0])) {
                    $komunikaty[0] = $save['bKomunikaty']['bKomunikat'];
                }else{
                    $komunikaty = $save['bKomunikaty']['bKomunikat'];
                }
                foreach ($komunikaty as $komunikat) {
                    if ($komunikat['bRodzaj'] == 'Ok') {
                        $opis = isset($komunikat['bOpis']) && !empty($komunikat['bOpis']) ? $komunikat['bOpis'] : '';
                        $this->Flash->success($komunikat['bTytul'] . '. ' . $opis);
                        return $this->redirect(array('action' => 'wiadomosci'));
                    } else {
                        $this->Flash->error($komunikat['bTytul'] . '. ');
                    }
                }
            } else {
                if (isset($response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Opis'])) {
                    $this->Flash->error(
                        'Kod błędu: ' .
                        $response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Kod'] .
                        '. ' .
                        $response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Opis']
                    );
                }
            }*/
        } else {
            $priorytety = $this->Api->DajPriorytetyWiadomosci($this->_getGid());
            $this->set(compact('priorytety'));
        }
    }

    /**
     * edytuj_wiadomosc method
     * @param null|string $bGid
     */
    public function edytujWiadomosc($bGid = NULL)
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($bGid == NULL) $this->redirect(Router::url('wiadomosci'));

        if ($this->request->is(array('post', 'put'))) {
            $data = $this->request->getData();
            foreach ($data['data']['pWiadomosc'] as $key => $val) {
                $data['pWiadomosc'][$key] = $val;
            }
            unset($data['data']['pWiadomosc']);

            $action = $data['data']['action'];
            unset($data['data']);

            if ($action == 'Zapisz') {
                $data['pCzyOpublikowac'] = 'false';
            }

            if (isset($data['bZalacznik']) && !empty($data['bZalacznik'])) {
                foreach ($data['bZalacznik'] as $z) {
                    $file = $this->_zalaczniki_edycja($z, 'dat:', 'dat:');
                    $data['pWiadomosc']['dat:Zalaczniki'][] = $file['dat:Zalaczniki'];
                }
                unset($data['bZalacznik']);
            }

            $filesCounter = 0;

            if (isset($_FILES['data']['tmp_name']['file'])) {
                $filesCounter = $this->_getZalaczniki($data['pWiadomosc'], 'dat:');

                unset($data['data']['file']);
            }

            $data['pWiadomosc']['b:IloscDodanychZalacznikow'] = $filesCounter;
            $data['pWiadomosc']['b:TrescRTF'] = '';
            if ($data['pWiadomosc']['b:Tresc'] != '') {
                $data['pWiadomosc']['b:TrescRTF'] = $this->_html2rtf(htmlspecialchars($data['pWiadomosc']['b:Tresc']));
                $data['pWiadomosc']['b:TrescHTML'] = $data['pWiadomosc']['b:Tresc'];
                $data['pWiadomosc']['b:Tresc'] = strip_tags($data['pWiadomosc']['b:Tresc']);
            }

            $listaOdbiorcow = array();
            if (!empty($data['pWiadomosc']['b:Odbiorcy']) && !is_null($data['pWiadomosc']['b:Odbiorcy'])) {
                foreach ($data['pWiadomosc']['b:Odbiorcy'] as &$odbiorca) {
                    $odbiorca['b:Adres']['b:Data'] = $this->_date_for_request();

                    $_odbiorca = array(
                        'b:Adres' => array(
                            'b:Data' => $odbiorca['b:Adres']['b:Data'],
                            'b:Email' => $odbiorca['b:Adres']['b:Email'],
                            'b:Gid' => $odbiorca['b:Adres']['b:Gid'],
                            'b:Nazwa' => $odbiorca['b:Adres']['b:Nazwa'],
                        )
                    );
                    $listaOdbiorcow[] = $_odbiorca;
                }
            }

            $data['pWiadomosc']['b:Odbiorcy'] = $listaOdbiorcow;
            $data = $this->_rename_array_key_prefixes_recursive($data, array('b:'), array('dat:'));

            if ($action == 'Zapisz') {
                $save = $this->Api->ZapiszWiadomosc($this->_getGid(), $data);
            } else {
                $save = $this->Api->PublikujWiadomosc($this->_getGid(), $data);
            }

            /*if (isset($save['bKomunikaty'])) {
                $komunikaty = array();
                if (!isset($save['bKomunikaty']['bKomunikat'][0])) {
                    $komunikaty[0] = $save['bKomunikaty']['bKomunikat'];
                }else{
                    $komunikaty = $save['bKomunikaty']['bKomunikat'];
                }
                foreach ($komunikaty as $komunikat) {
                    if ($komunikat['bRodzaj'] == 'Ok') {
                        $this->Flash->success($komunikat['bTytul']);
                        return $this->redirect(array('action' => 'wiadomosci'));
                    } else {
                        $this->Flash->error($komunikat['bTytul']);
                    }
                }
            } else {
                if (isset($response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Opis'])) {
                    $this->Flash->error(
                        'Kod błędu: ' .
                        $response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Kod'] .
                        '. ' .
                        $response['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Opis']
                    );
                }
            }*/
            echo json_encode($this->_handle_response_json($save));
            die();
        } else {
            $priorytety = $this->Api->DajPriorytetyWiadomosci($this->_getGid());
            $this->set(compact('priorytety'));

            $message = $this->_daj_wiadomosc($bGid);
            $this->request = $this->request->withData('pWiadomosc', [
                'b:Tytul' => $message['bWiadomosc']['bTytul'],
                'b:Tresc' => html_entity_decode($message['bWiadomosc']['bTrescHTML']),
                'b:Gid' => $message['bWiadomosc']['bGid'],
                'b:Priorytet' => $message['bWiadomosc']['bPriorytet'],
            ]);

            $zalaczniki = [];

            if (isset($message['bWiadomosc']['bZalaczniki']['bZalacznik'])) {
                $zalaczniki = $message['bWiadomosc']['bZalaczniki']['bZalacznik'];
            }

            $this->set(compact('message', 'zalaczniki'));
        }
    }

    /**
     * profil method
     */
    public function profil($nrEwid = null)
    {
        $this->viewBuilder()->setLayout('ajax');

        $gid = $this->Auth->user('cGid');
        $ne = $this->Auth->user('cNumerEwidencyjny');

        $profile = $this->_profil($gid, $ne);
        $resp = $this->_handle_response_json($profile);
        $this->set(compact('resp'));

        $rjson = $this->_handle_response_json($profile);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $profile['bPracownik'] = $this->_convert_to_date_array($profile['bPracownik'], array('bAngazDo', 'bAngazOd', 'bDataPrzyjecia', 'bDataZwolnienia'));
        $data = $this->_daj_dane_osobowe($gid, $ne);
        $this->_replace_empty_values($data);
        $data['bDaneOsobowe'] = $this->_convert_to_date_array($data['bDaneOsobowe'], array('AngazOd', 'AngazDo', 'DataPrzyjecia', 'DataZwolnienia', 'UmowaOd', 'UmowaDo', 'bDataUrodzenia'));
        $this->set(compact('profile', 'data'));
    }

    /**
     * @param $date
     */
    public function ajaxDajNieobecnychWspolpracownikow($date)
    {
        $response = $this->Api->DajNieobecnychWspolpracownikowWDniu($this->_getGid(), $date);
        ddebug($response);
    }

    /**
     *
     */
    public function sciezkiAkceptacji()
    {
        $this->viewBuilder()->setLayout('ajax');

        $paths = $this->_daj_sciezki_akceptacji();

        $resp = $this->_handle_response_json($paths);
        $this->set(compact('resp'));

        $paths = $this->_convert_list_response($paths['bSciezki'], 'bSciezkaAkceptacji');
        $paths = $paths['bSciezkaAkceptacji'] ?? [];
        $paths = $this->_replace_empty_values($paths, '');
        $this->set(compact('paths'));
    }

    /**
     * @param null $gid
     */
    public function sciezkaAkceptacji($gid = null)
    {
        $this->viewBuilder()->setLayout('ajax');

        $this->set(compact('gid'));
        if ($this->request->is('post')) {
            $this->viewBuilder()->setTemplate(null);

            $data = array();
            $rData = $this->request->getData()['data'];

            foreach ($rData['pSciezkaAkceptacji']['dat:Sciezka']['dat:ElementSciezkiAkceptacji'] as &$element) {
                if (!isset($element['dat:CzyMusiZaakceptowac']) || $element['dat:CzyMusiZaakceptowac'] == '0') {
                    $element['dat:CzyMusiZaakceptowac'] = 'false';
                } else {
                    $element['dat:CzyMusiZaakceptowac'] = 'true';
                }
                if (!isset($element['dat:CzyMozeAkceptowacZaPozostalych']) || $element['dat:CzyMozeAkceptowacZaPozostalych'] == '0') {
                    $element['dat:CzyMozeAkceptowacZaPozostalych'] = 'false';
                } else {
                    $element['dat:CzyMozeAkceptowacZaPozostalych'] = 'true';
                }
            }
            $data['tem:pSciezkaAkceptacji'] = array();
            $data['tem:pSciezkaAkceptacji']['dat:CharakteryPracy'] = $rData['pSciezkaAkceptacji']['dat:CharakteryPracy'];
            $data['tem:pSciezkaAkceptacji']['dat:CzyDotyczyWszystkich'] = $this->_checkbox_int_2_string($rData['pSciezkaAkceptacji']['dat:CzyDotyczyWszystkich']);
            $data['tem:pSciezkaAkceptacji']['dat:DodatkoweOpisy'] = $rData['pSciezkaAkceptacji']['dat:DodatkoweOpisy'];
            if (!is_null($gid)) {
                $data['tem:pSciezkaAkceptacji']['dat:Gid'] = $rData['pSciezkaAkceptacji']['dat:Gid'];
            }
            $data['tem:pSciezkaAkceptacji']['dat:Komorki'] = $rData['pSciezkaAkceptacji']['dat:Komorki'];
            $data['tem:pSciezkaAkceptacji']['dat:MiejscaWykonywaniaPracy'] = $rData['pSciezkaAkceptacji']['dat:MiejscaWykonywaniaPracy'];
            $data['tem:pSciezkaAkceptacji']['dat:NumeryEwidencyjne'] = $rData['pSciezkaAkceptacji']['dat:NumeryEwidencyjne'];
            $data['tem:pSciezkaAkceptacji']['dat:NumeryEwidencyjneWykluczone'] = $rData['pSciezkaAkceptacji']['dat:NumeryEwidencyjneWykluczone'];
            $data['tem:pSciezkaAkceptacji']['dat:Opis'] = $rData['pSciezkaAkceptacji']['dat:Opis'];

            $data['tem:pSciezkaAkceptacji']['dat:Piony'] = $rData['pSciezkaAkceptacji']['dat:Piony'];
            $data['tem:pSciezkaAkceptacji']['dat:Platnicy'] = $rData['pSciezkaAkceptacji']['dat:Platnicy'];
            $data['tem:pSciezkaAkceptacji']['dat:Regiony'] = $rData['pSciezkaAkceptacji']['dat:Regiony'];
            foreach ($rData['pSciezkaAkceptacji']['dat:Sciezka']['dat:ElementSciezkiAkceptacji'] as $pathElement) {
                $tempElement = array(
                    'dat:Akceptujacy' => $pathElement['dat:Akceptujacy'],
                    'dat:CzyMozeAkceptowacZaPozostalych' => $pathElement['dat:CzyMozeAkceptowacZaPozostalych'],
                    'dat:CzyMusiZaakceptowac' => $pathElement['dat:CzyMusiZaakceptowac'],
                    'dat:Indeks' => $pathElement['dat:Indeks']
                );
                $data['tem:pSciezkaAkceptacji']['dat:Sciezka'][]['dat:ElementSciezkiAkceptacji'] = $tempElement;
            }
            $data['tem:pSciezkaAkceptacji']['dat:Stanowiska'] = $rData['pSciezkaAkceptacji']['dat:Stanowiska'];
            $data['tem:pSciezkaAkceptacji']['dat:Symbol'] = $rData['pSciezkaAkceptacji']['dat:Symbol'];

            if (is_null($gid)) {
                $request = $this->_dodaj_sciezke_akceptacji($data);
            } else {
                $request = $this->_edytuj_sciezke_akceptacji($data);
            }
            /*if($this->_handle_response($request))
            {
                return $this->redirect('/sciezki_akceptacji');
            }*/

            echo json_encode($this->_handle_response_json($request));
            die();
        }
        if (!is_null($gid)) {
            $path = $this->_daj_sciezki_akceptacji($gid);
            $resp = $this->_handle_response_json($path);
            $this->set(compact('resp'));

            $path = $path['bSciezkaAkceptacji'];

            $path['bCzyDotyczyWszystkich'] = $this->_checkbox_string_2_bool($path['bCzyDotyczyWszystkich']);

            $path['bSciezka']['bElementSciezkiAkceptacji'] = $this->_convert_list_response($path['bSciezka']['bElementSciezkiAkceptacji'], 'bElementSciezkiAkceptacji');
            $path = $this->_rename_array_key_prefixes($path, 'b', 'dat:');
            $path['dat:Sciezka'] = $this->_rename_array_key_prefixes($path['dat:Sciezka'], 'b', 'dat:');
            $this->_convert_list_response($path['dat:Sciezka'], 'dat:ElementSciezkiAkceptacji');
            foreach ($path['dat:Sciezka']['dat:ElementSciezkiAkceptacji'] as &$element) {
                $element = $this->_rename_array_key_prefixes($element, 'b', 'dat:');
                $element['dat:Akceptujacy'] = $this->_rename_array_key_prefixes($element['dat:Akceptujacy'], 'c', 'dat1:');
            }
            $this->request = $this->request->withData('pSciezkaAkceptacji', $path);
            $this->set('pageName', 'Administracja - Edytuj ścieżkę akceptacji');
        }
    }


    public function usunSciezkeAkceptacji($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);
        $response = $this->Api->UsunSciezkeAkceptacji($this->_getGid(), $gid);
        echo json_encode($this->_handle_response_json($response));
        die();
    }

    /**
     *
     */
    public function dajModuly()
    {
        $roleGid = null;
        $userGid = $this->_getUserGid();
        $modules = $this->_daj_moduly($roleGid, $userGid);
        debug($modules);
        die();
    }

    /**
     * umowy_o_prace method
     */
    public function umowyOPrace()
    {
        $this->viewBuilder()->setLayout('ajax');
        $currentYear = ($this->request->getQuery('tylko-ten-rok') !== null);
        $contracts = $this->_umowy_o_prace($this->Auth->user('cNumerEwidencyjny'), $currentYear);

        $rjson = $this->_handle_response_json($contracts);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }
        $contracts = $this->_umowy_o_prace_convert($contracts, $currentYear);

        $this->set(compact('contracts'));
    }

    /**
     * nieobecnosci method
     */
    public function nieobecnosci()
    {
        $this->viewBuilder()->setLayout('ajax');
        $currentYear = ($this->request->getQuery('tylko-ten-rok') !== null);
        $absents = $this->_nieobecnosci($this->Auth->user('cNumerEwidencyjny'), $currentYear);

        $rjson = $this->_handle_response_json($absents);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $absents = $this->_nieobecnosci_convert($absents, $currentYear);

        $this->set(compact('absents'));
    }

    /**
     * zawiesia method
     */
    public function zawiesia()
    {
        // Pobranie kodów za pomocą wyodrębnionej funkcji
        $rodzaj = $this->generujKodyMap(self::KOD_RODZAJ);
        $gniazdo = $this->generujKodyMap(self::KOD_GNIAZDO);
        $dlugosc = $this->generujKodyMap(self::KOD_DLUGOSC);
        $nosnosc = $this->generujKodyMap(self::KOD_NOSNOSC);
        $material = $this->generujKodyMap(self::KOD_MATERIAL);

        // Ustawienia widoku i przetwarzanie danych
        $this->viewBuilder()->setLayout('ajax');
        $zawiesia = $this->Api->dajListeZawiesi($this->_getGid());
        $listaZawiesi = [];
        $oneElement = false;
        foreach ($zawiesia['bZawiesia']['bZawiesie'] as $zawiesie) {
            if (is_array($zawiesie) and !empty($zawiesie)) {
                $listaZawiesi[] = $zawiesie;
            } else {
                $oneElement = true;
            }
        }
        if ($oneElement) {
            $listaZawiesi[] = $zawiesia['bZawiesia']['bZawiesie'];
        }
        $rjson = $this->_handle_response_json($listaZawiesi);

        // Obsługa odpowiedzi
        if (!empty($rjson['login'])) {
            echo 'login';
            die();
        }

        // Przekazanie danych do widoku
        $this->set(compact('listaZawiesi', 'rodzaj', 'gniazdo', 'dlugosc', 'nosnosc', 'material'));
    }

    /**
     * ajax_odziez_robocza method
     */
    public function ajaxOdziezRobocza($numer)
    {
        $this->odziezRobocza('ListaOdziezy', $numer);
    }

    /**
     * odziez_robocza method
     */
    public function odziezRobocza($type = 'ListaOdziezy', $numer = null)
    {
        if (0 !== (int)$type) {
            $numer = $type;
            $type = 'ListaOdziezy.Podlegli';
        }
        // Ustawienia widoku i przetwarzanie danych
        $this->viewBuilder()->setLayout('ajax');
        if ('Podlegli' == $type) {
            $type = 'ListaOdziezy.Podlegli';
        }

        $options = ['type' => $type];

        if (null !== $numer) {
            $options['numer'] = $numer;
            $this->set('nrewid', $numer);
        } else {
            $this->set('nrewid', $this->Auth->user('cNumerEwidencyjny'));
        }

        $odziez = $this->Api->dajListeOdziezyRoboczej($this->_getGid(), $options);

        $listaOdziezy = [];
        $oneElement = false;
        if (!empty($odziez['bZapisyOdziezyRoboczej'])) {
            foreach ($odziez['bZapisyOdziezyRoboczej']['bZapisOdziezyRoboczej'] as $ubranie) {
                if (is_array($ubranie) and !empty($ubranie)) {
                    $listaOdziezy[] = $ubranie;
                } else {
                    $oneElement = true;
                }
            }
            if ($oneElement) {
                $listaOdziezy[] = $odziez['bZapisyOdziezyRoboczej']['bZapisOdziezyRoboczej'];
            }
        }
        $rjson = $this->_handle_response_json($listaOdziezy);

        // Obsługa odpowiedzi
        if (!empty($rjson['login'])) {
            echo 'login';
            die();
        }

        // Flagi dla opcjonalnych kolumn
        $bCzyKolumnaWartosc = $odziez['bCzyKolumnaDataLikwidacji'] == 'true';
        $bCzyKolumnaDataZwrotu = $odziez['bCzyKolumnaDataZwrotu'] == 'true';
        $bCzyKolumnaDataLikwidacji = $odziez['bCzyKolumnaWartosc'] == 'true';

        // Przygotowanie danych raportów
        $identyfikatoryRaportow = [];
        $nazwyRaportow = [];

        // Sprawdzenie czy istnieją dane raportów
        if (isset($odziez['bIdentyfikatoryRaportow']) && (isset($odziez['bIdentyfikatoryRaportow']['cguid']) and !empty($odziez['bIdentyfikatoryRaportow']['cguid']))) {
            $identyfikatoryRaportow = $odziez['bIdentyfikatoryRaportow']['cguid'];
        }

        if (isset($odziez['bNazwyRaportow']) && (isset($odziez['bNazwyRaportow']['cstring']) and !empty($odziez['bNazwyRaportow']['cstring']))) {
            $nazwyRaportow = $odziez['bNazwyRaportow']['cstring'];
        }

        // Połączenie identyfikatorów i nazw raportów w jedną tablicę
        $raporty = [];
        if (is_array($identyfikatoryRaportow) && is_array($nazwyRaportow)) {
            $count = min(count($identyfikatoryRaportow), count($nazwyRaportow));
            for ($i = 0; $i < $count; $i++) {
                $raporty[] = [
                    'id' => $identyfikatoryRaportow[$i],
                    'nazwa' => $nazwyRaportow[$i]
                ];
            }
        } elseif (is_string($identyfikatoryRaportow) && is_string($nazwyRaportow)) {
            $raporty[] = [
                'id' => $identyfikatoryRaportow,
                'nazwa' => $nazwyRaportow
            ];
        }

        $reportList = $this->Api->dajMozliweRaportyOdziezyRoboczej($this->_getGid(), $options);

        // Przygotowanie danych raportów
        $identyfikatoryRaportowGlobalnych = [];
        $nazwyRaportowGlobalnych = [];

        // Sprawdzenie czy istnieją dane raportów
        if (isset($reportList['bIdentyfikatory']) && (isset($reportList['bIdentyfikatory']['cguid']) and !empty($reportList['bIdentyfikatory']['cguid']))) {
            $identyfikatoryRaportowGlobalnych = $reportList['bIdentyfikatory']['cguid'];
        }

        if (isset($reportList['bNazwy']) && (isset($reportList['bNazwy']['cstring']) and !empty($reportList['bNazwy']['cstring']))) {
            $nazwyRaportowGlobalnych = $reportList['bNazwy']['cstring'];
        }

        // Połączenie identyfikatorów i nazw raportów w jedną tablicę
        $raportyGlobalne = [];
        if (is_array($identyfikatoryRaportowGlobalnych) && is_array($nazwyRaportowGlobalnych)) {
            $count = min(count($identyfikatoryRaportowGlobalnych), count($nazwyRaportowGlobalnych));
            for ($i = 0; $i < $count; $i++) {
                $raportyGlobalne[] = [
                    'id' => $identyfikatoryRaportowGlobalnych[$i],
                    'nazwa' => $nazwyRaportowGlobalnych[$i]
                ];
            }
        } elseif (is_string($identyfikatoryRaportowGlobalnych) && is_string($nazwyRaportowGlobalnych)) {
            $raportyGlobalne[] = [
                'id' => $identyfikatoryRaportowGlobalnych,
                'nazwa' => $nazwyRaportowGlobalnych
            ];
        }

        // Przekazanie danych do widoku
        $this->set(compact('listaOdziezy', 'bCzyKolumnaWartosc', 'bCzyKolumnaDataZwrotu', 'bCzyKolumnaDataLikwidacji', 'raporty', 'raportyGlobalne'));
    }

    public function odziezRoboczaDrukujRaport($numer = null)
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is(array('post', 'put'))) {
            $form = $this->request->getData();

            $options = [];
            $options['zMetody'] = $form['ZMetody'];  //DrukujRaportOdziezyRoboczejZadanie.ZMetody = patrz dalej
            $options['identyfikator'] = $form['Identyfikator'];  //DrukujRaportOdziezyRoboczejZadanie.Identyfikator = identyfikator raportu z DajZapisyOdziezyRoboczejOdpowiedz.IdentyfikatoryRaportow
            $options['gidDokumentu'] = $form['GidDokumentu'];  //DrukujRaportOdziezyRoboczejZadanie.GidDokumentu = Gid zapisu odzieży roboczej tego wiersza: ZapisOdziezyRoboczej.Gid lub null
            $options['okresOd'] = $form['DataOd'] ?? null;
            $options['okresDo'] = $form['DataDo'] ?? null;
            $numer = $form['numer'] ?? $numer;
            if (null !== $numer) {
                $options['numer'] = $numer;
            } else {
                $options['numer'] = $this->Auth->user('cNumerEwidencyjny');
            }

            $response = $this->Api->drukujRaportOdziezyRoboczej($this->_getGid(), $options);

            $resp = $this->_handle_response_json($response);
            if (isset($resp['login'])) {
                $this->redirect('/');
            } else {
                if (!empty($response['bRaport'])) {
                    $content = base64_decode($response['bRaport']);
                    $filename = 'odziez_robocza_' . $form['ZMetody'] . '.pdf';
                    $extension = 'pdf';

                    header('Content-Type: application/' . $extension);
                    header('Content-Length: ' . strlen($content));
                    header('Content-Disposition: inline; filename="' . $filename . '"');
                    header('Cache-Control: private, max-age=0, must-revalidate');
                    header('Pragma: public');
                    ini_set('zlib.output_compression', '0');

                    echo $content;
                }
            }
            die();
        }
    }

    private function generujKodyMap($kod)
    {
        $kody = [];
        foreach (($this->_daj_liste_kodow($kod)['bKody']['bKod'] ?? []) as $value) {
            $kody[$value['bSymbol']] = ['opis' => $value['bOpis'], 'symbolZewnetrzny' => $value['bSymbolZewnetrzny']];
        }
        return $kody;
    }

    public function dajZawiesie($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $zawiesie = $this->Api->dajZawiesie($this->_getGid(), $gid);
        echo json_encode($zawiesie['bZawiesie'] ?? []);

        die();
    }

    public function usunZawiesie($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $zawiesie = $this->Api->usunZawiesie($this->_getGid(), $gid);
        echo json_encode($this->_handle_response_json($zawiesie));

        die();
    }

    public function dajNoweZawiesie()
    {
        $this->viewBuilder()->setLayout('ajax');
        $zawiesie = $this->Api->dajNoweZawiesie($this->_getGid());
        echo json_encode($zawiesie['bZawiesie'] ?? []);

        die();
    }

    public function dodajZawiesie()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        if ($this->request->is(array('post', 'put'))) {
            $zawiesie = $this->Api->dajNoweZawiesie($this->_getGid())['bZawiesie'] ?? [];
            if (!empty($zawiesie)) {
                $form = $this->request->getData();
                $zawiesie = array_merge($zawiesie, $form);
                $data = [];
                foreach ($zawiesie as $key => $value) {
                    if (strpos($key, 'b') === 0) {
                        $newKey = 'dat:' . substr($key, 1);
                    } else {
                        $newKey = $key;
                    }
                    if (!empty($value)) {
                        $data[$newKey] = $value;
                    }
                }

                $response = $this->Api->kontrolujZawiesie($this->_getGid(), $data);

                $ok = $this->_handle_response($response);
                if ($ok) {
                    if ($form['bRodzajEdycji'] === 'Dodawanie') {
                        $response = $this->Api->dodajZawiesie($this->_getGid(), $data);
                    } else {
                        $response = $this->Api->edytujZawiesie($this->_getGid(), $data);
                    }
                }

                $this->set('response', $this->_handle_response_json($response));

                echo json_encode($this->_handle_response_json($response));
            } else {
                echo json_encode('Nie można pobrać danych.');
            }
        }
        die();
    }

    /**
     * zfs method
     */
    public function zfsWnioski()
    {
        // Ustawienia widoku i przetwarzanie danych
        $this->viewBuilder()->setLayout('ajax');
        $wnioski = $this->Api->dajListeWnioskowZFS($this->_getGid());
        $listaWnioskowZFS = [];
        $oneElement = false;
        foreach ($wnioski['bWnioskiZFS']['bWniosekZFS'] as $wniosekZFS) {
            if (is_array($wniosekZFS) and !empty($wniosekZFS)) {
                $listaWnioskowZFS[] = $wniosekZFS;
            } else {
                $oneElement = true;
            }
        }
        if ($oneElement) {
            $listaWnioskowZFS[] = $wnioski['bWnioskiZFS']['bWniosekZFS'];
        }
        $rjson = $this->_handle_response_json($listaWnioskowZFS);

        // Obsługa odpowiedzi
        if (!empty($rjson['login'])) {
            echo 'login';
            die();
        }

        // Przekazanie danych do widoku
        $this->set(compact('listaWnioskowZFS'));
    }

    public function dajMozliweRodzajeWnioskuZFS()
    {
        $this->viewBuilder()->setLayout('ajax');
        $dajMozliweRodzajeWniosku = $this->Api->dajMozliweRodzajeWnioskuZFS($this->_getGid());
        if (is_string($dajMozliweRodzajeWniosku['bRodzaje']['bRodzajeWnioskuZFS'] ?? [])) {
            echo json_encode([$dajMozliweRodzajeWniosku['bRodzaje']['bRodzajeWnioskuZFS']]);
        }
        echo json_encode($dajMozliweRodzajeWniosku['bRodzaje']['bRodzajeWnioskuZFS'] ?? []);

        die();
    }

    public function dajWniosekZFS($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $dajWniosekZFS = $this->Api->dajWniosekZFS($this->_getGid(), $gid);
        echo json_encode($dajWniosekZFS['bWniosekZFS'] ?? []);

        die();
    }

    public function dajNowyWniosekZFS($rodzaj)
    {
        $this->viewBuilder()->setLayout('ajax');
        $dajNowyWniosekZFS = $this->Api->dajNowyWniosekZFS($this->_getGid(), $rodzaj);
        echo json_encode($dajNowyWniosekZFS['bWniosekZFS'] ?? []);

        die();
    }

    public function usunWniosekZFS($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $usunWniosekZFS = $this->Api->usunWniosekZFS($this->_getGid(), $gid);
        echo json_encode($this->_handle_response_json($usunWniosekZFS));

        die();
    }

    public function dodajWniosekZFS()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        if ($this->request->is(array('post', 'put'))) {
            $form = $this->request->getData();
            $wniosekZFS = $this->Api->dajNowyWniosekZFS($this->_getGid(), $form['bRodzaj'])['bWniosekZFS'] ?? [];
            if (!empty($wniosekZFS)) {
                $wniosekZFS = array_merge($wniosekZFS, $form);
                $data = [];
                foreach ($wniosekZFS as $key => $value) {
                    if (strpos($key, 'b') === 0) {
                        $newKey = 'dat:' . substr($key, 1);
                    } else {
                        $newKey = $key;
                    }
                    if (!empty($value)) {
                        $data[$newKey] = $value;
                    }
                }

                $response = $this->Api->kontrolujWniosekZFS($this->_getGid(), $data);

                $ok = $this->_handle_response($response);
                if ($ok) {
                    if ($form['bRodzajEdycji'] === 'Dodawanie') {
                        $response = $this->Api->dodajWniosekZFS($this->_getGid(), $data);
                    } else {
                        $response = $this->Api->edytujWniosekZFS($this->_getGid(), $data);
                    }
                }

                $this->set('response', $this->_handle_response_json($response));

                echo json_encode($this->_handle_response_json($response));
            } else {
                echo json_encode('Nie można pobrać danych.');
            }
        }
        die();
    }

    /**
     * @return string
     */
    public function przebiegiPracy()
    {
        $this->viewBuilder()->setLayout('ajax');
        $workflows = $this->_przebiegi_pracy($this->Auth->user('cNumerEwidencyjny'));

        $rjson = $this->_handle_response_json($workflows);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $workflows = $this->_przebiegi_pracy_convert($workflows);

        $this->set(compact('workflows'));
    }

    /**
     * wyksztalcenia method
     */
    public function wyksztalcenia()
    {
        $this->viewBuilder()->setLayout('ajax');
        $educations = $this->_wyksztalcenia($this->Auth->user('cNumerEwidencyjny'));

        $rjson = $this->_handle_response_json($educations);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $educations = $this->_wyksztalcenia_convert($educations);

        $this->set(compact('educations'));
    }

    /**
     * badania method
     */
    public function badania()
    {
        $this->viewBuilder()->setLayout('ajax');
        $currentYear = ($this->request->getQuery('tylko-ten-rok') !== null);
        $badania = $this->_badania($this->Auth->user('cNumerEwidencyjny'), $currentYear);

        $rjson = $this->_handle_response_json($badania);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $badania = $this->_badania_convert($badania, $currentYear);

        $this->set(compact('badania'));
    }

    /**
     * szkolenia method
     */
    public function szkoleniaZgloszenia()
    {
        $this->viewBuilder()->setLayout('ajax');
        $options = [
            'dat:NumerEwidencyjny' => $this->Auth->user('cNumerEwidencyjny'),
        ];
        $trainings = $this->Api->dajListeZgloszeniaSzkolenia($this->_getGid(), $options);
        $rodzajDokumentu = $this->generujKodyMap(self::KOD_RODZAJ_DOKUMENTOW_ZGLOSZENIE_SZKOLENIA);

        $listaSzkolen = [];
        $oneElement = false;
        foreach ($trainings['bZgloszeniaSzkolen']['bZgloszenieSzkolenia'] as $training) {
            if (is_array($training) and !empty($training)) {
                $listaSzkolen[] = $training;
            } else {
                $oneElement = true;
            }
        }
        if ($oneElement) {
            $listaSzkolen[] = $trainings['bZgloszeniaSzkolen']['bZgloszenieSzkolenia'];
        }
        $rjson = $this->_handle_response_json($listaSzkolen);

        // Obsługa odpowiedzi
        if (!empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('listaSzkolen', 'rodzajDokumentu'));
    }

    public function dodajZgloszenieSzkolenia()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        if ($this->request->is(array('post', 'put'))) {
            $zgloszenie = $this->Api->dajNoweZgloszenieSzkolenia($this->_getGid())['bZgloszenieSzkolenia'] ?? [];
            if (!empty($zgloszenie)) {
                if (is_array($zgloszenie['bAkceptujacyOdrzucajacy']) and empty($zgloszenie['bAkceptujacyOdrzucajacy'])) {
                    $zgloszenie['bAkceptujacyOdrzucajacy'] = ' ';
                }
                $form = $this->request->getData();
                if (empty($form['bGid'])) {
                    unset($form['bGid']);
                }
                $zgloszenie = array_merge($zgloszenie, $form);
                $data = [];
                foreach ($zgloszenie as $key => $value) {
                    if (strpos($key, 'b') === 0) {
                        $newKey = 'dat:' . substr($key, 1);
                    } else {
                        $newKey = $key;
                    }
                    if (!empty($value) or 'bAkceptujacyOdrzucajacy' === $key) {
                        $data[$newKey] = $value;
                    }
                }

                $response = $this->Api->kontrolujZgloszenieSzkolenia($this->_getGid(), $data);

                $ok = $this->_handle_response($response);
                if ($ok) {
                    if ($form['bRodzajEdycji'] === 'Dodawanie') {
                        $response = $this->Api->dodajZgloszenieSzkolenia($this->_getGid(), $data);
                    } else {
                        $response = $this->Api->edytujZgloszenieSzkolenia($this->_getGid(), $data);
                    }
                }

                $this->set('response', $this->_handle_response_json($response));

                echo json_encode($this->_handle_response_json($response));
            } else {
                echo json_encode('Nie można pobrać danych.');
            }
        }
        die();
    }


    public function dajZgloszenieSzkolenia($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $zgloszenieSzkolenia = $this->Api->dajZgloszenieSzkolenia($this->_getGid(), $gid);
        $zgloszenieSzkolenia = $this->changeEmptyArrayToString($zgloszenieSzkolenia, 'bZgloszenieSzkolenia');
        echo json_encode($zgloszenieSzkolenia);

        die();
    }

    public function usunZgloszenieSzkolenia($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $usunZgloszenieSzkolenia = $this->Api->usunZgloszenieSzkolenia($this->_getGid(), $gid);
        echo json_encode($this->_handle_response_json($usunZgloszenieSzkolenia));

        die();
    }

    /**
     * szkolenia method
     */
    public function szkolenia()
    {
        $this->viewBuilder()->setLayout('ajax');
        $currentYear = ($this->request->getQuery('tylko-ten-rok') !== null);
        $trainings = $this->_szkolenia($this->Auth->user('cNumerEwidencyjny'), $currentYear);
        $this->set(compact('trainings'));
    }

    /**
     * kary method
     */
    public function kary()
    {
        $this->viewBuilder()->setLayout('ajax');
        $punishes = $this->_kary($this->Auth->user('cNumerEwidencyjny'));
        $this->set(compact('punishes'));
    }

    /**
     * jezyki method
     */
    public function jezyki()
    {
        $this->viewBuilder()->setLayout('ajax');
        $langs = $this->_jezyki($this->Auth->user('cNumerEwidencyjny'));
        $this->set(compact('langs'));
    }

    /**
     * kwalifikacje method
     */
    public function kwalifikacje()
    {
        $this->viewBuilder()->setLayout('ajax');
        $skills = $this->_kwalifikacje($this->Auth->user('cNumerEwidencyjny'));
        $this->set(compact('skills'));
    }

    /**
     * rodzina method
     */
    public function rodzina()
    {
        $this->viewBuilder()->setLayout('ajax');
        $family = $this->_rodzina($this->Auth->user('cNumerEwidencyjny'));
        $this->set(compact('family'));
    }

    /**
     * ocena method
     */
    public function ocena()
    {
        $this->viewBuilder()->setLayout('ajax');
        $ratings = $this->_ocena($this->Auth->user('cNumerEwidencyjny'));
        $this->set(compact('ratings'));
    }

    /**
     * plan_urlopu method
     */
    public function planUrlopu()
    {
        $this->viewBuilder()->setLayout('ajax');
        $free_days = $this->_plan_urlopu($this->Auth->user('cNumerEwidencyjny'));
        $this->set(compact('free_days'));
    }

    /**
     * _akceptacja_planu_urlopu method
     */
    public function akceptacjaPlanuUrlopu()
    {
        $this->viewBuilder()->setLayout('ajax');
        $accept = $this->request->getQuery('tylko-akceptacja') > 0 ? 'true' : 'false';
        $year = $this->request->getQuery('rok-akceptacja') ?: date('Y');
        $free_days = $this->_akceptacja_planu_urlopu($this->Auth->user('cNumerEwidencyjny'), $accept, $year);
        $this->set(compact('free_days'));
    }

    /**
     * @param $bGid
     */
    public function usunPlanUrlopu($bGid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        $response = $this->Api->UsunPlanUrlopu($this->_getGid(), $bGid);

        echo json_encode($this->_handle_response_json($response));
        die();
    }

    /**
     * dodaj_urlopu method
     */
    public function dodajUrlop()
    {
        $this->viewBuilder()->setLayout('ajax');

        $codes = $this->_daj_mozliwe_kody_wniosku('PlanUrlopu');

        $resp = $this->_handle_response_json($codes);
        $this->set(compact('resp'));

        $codeList = array();
        foreach ($codes['bKody']['bKod'] as $code) {
            $nrAndGid = array(
                'dat2:Gid' => $code['bGid'],
                'dat2:Numer' => $code['bNumer'],
                'dat2:Opis' => $code['bOpis'],
                'dat2:Symbol' => $code['bSymbol'],
                'dat2:CzyPracaZdalna' => $code['bCzyPracaZdalna'],
                'dat2:CzyPracaZdalnaSaldo' => $code['bCzyPracaZdalnaSaldo'],
            );
            $codeList[$this->_array_2_string($nrAndGid)] = $code['bOpis'];
        }
        $this->set('codes', $codeList);
        $thisYear = new \DateTime();
        $thisYear = (int)$thisYear->format('Y');
        $saldoOptions = array(
            'dat:Lata' => array(
                0 => array(
                    'arr:int' => $thisYear
                )
            ),
            'dat:NumerPracownika' => $this->Auth->user('cNumerEwidencyjny')
        );

        if ($this->request->is(array('post', 'put'))) {
            $data = $this->request->getData()['pPlanUrlopu'];
            $data['dat:Kod'] = $this->_string_2_array($data['dat:Kod']['dat2:NumerIGid']);
            $data['dat:DataDo'] = $this->_date_for_request($data['dat:DataDo']);
            $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
//            $data['dat:Gid'] = $this->_getUserGid();
            $data['dat:NumerEwidencyjny'] = $this->Auth->user('cNumerEwidencyjny');
            $response = $this->_dodaj_urlop($data);
            $this->set('response', $response);

            $resp = $this->_handle_response_json($response);
            echo json_encode($resp);
            die();
        }

        $saldo5 = $this->_saldo_urlopu_5(null, 'PlanUrlopu');
        $this->set(compact('saldo5'));
    }

    /**
     * dodaj_urlopu method
     */
    public function sprawdzUrlop()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('dodaj_urlop');
        $this->viewBuilder()->setTemplate(null);

        if ($this->request->is(array('post', 'put'))) {
            $data = $this->request->getData()['pPlanUrlopu'];
            $data['dat:Kod'] = $this->_string_2_array($data['dat:Kod']['dat2:NumerIGid']);
            $data['dat:DataDo'] = $this->_date_for_request($data['dat:DataDo']);
            $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
            $data['dat:Gid'] = $this->_getUserGid();
            $data['dat:NumerEwidencyjny'] = $this->Auth->user('cNumerEwidencyjny');
            $response = $this->Api->TestujUrlop($this->_getGid(), $data);

            $this->set('response', $response);
            echo json_encode($response);
        }
        die();
    }

    public function sprawdzUrlopEdycja()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('edytuj_wniosek');
        $this->viewBuilder()->setTemplate(null);

        if ($this->request->is(array('post', 'put'))) {
            $data = $this->request->getData()['pPlanUrlopu'];
            $data['dat:Kod'] = $this->_string_2_array($data['dat:Kod']['dat2:NumerIGid']);
            $data['dat:DataDo'] = $this->_date_for_request($data['dat:DataDo']);
            $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
            $data['dat:NumerEwidencyjny'] = $this->Auth->user('cNumerEwidencyjny');
            $response = $this->Api->TestujUrlop($this->_getGid(), $data);

            $this->set('response', $response);
            echo json_encode($response);
        }
        die();
    }

    public function ajaxSprawdzUrlopEdycja()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('edytuj_wniosek');
        $this->viewBuilder()->setTemplate(null);

        if ($this->request->is(array('post', 'put'))) {
            $data = $this->request->getData()['pPlanUrlopu'];
            $data['dat:Kod'] = $this->_string_2_array($data['dat:Kod']['dat2:NumerIGid']);
            $data['dat:DataDo'] = $this->_date_for_request($data['dat:DataDo']);
            $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
            $data['dat:NumerEwidencyjny'] = $this->Auth->user('cNumerEwidencyjny');
            $response = $this->Api->TestujUrlop($this->_getGid(), $data);

            $this->set('response', $response);
            echo json_encode($response);
        }
        die();
    }

    /**
     * @param $bGid
     */
    public function edytujPlanUrlopu($bGid = NULL)
    {
        $this->viewBuilder()->setLayout('ajax');

        $codes = $this->_daj_mozliwe_kody_wniosku();

        $resp = $this->_handle_response_json($codes);
        $this->set(compact('resp'));

        $codeList = array();
        foreach ($codes['bKody']['bKod'] as $code) {
            $nrAndGid = array(
                'dat2:Gid' => $code['bGid'],
                'dat2:Numer' => $code['bNumer'],
                'dat2:Opis' => $code['bOpis'],
                'dat2:Symbol' => $code['bSymbol'],
                'dat2:CzyPracaZdalna' => $code['bCzyPracaZdalna'],
                'dat2:CzyPracaZdalnaSaldo' => $code['bCzyPracaZdalnaSaldo'],
            );
            $codeList[$this->_array_2_string($nrAndGid)] = $code['bOpis'];
        }
        $this->set('codes', $codeList);
        $thisYear = new \DateTime();
        $thisYear = (int)$thisYear->format('Y');
        $saldoOptions = array(
            'dat:Lata' => array(
                0 => array(
                    'arr:int' => $thisYear
                )
            ),
            'dat:NumerPracownika' => $this->Auth->user('cNumerEwidencyjny')
        );

        $planUrlopu = $this->Api->DajPlanUrlopu($this->_getGid(), $bGid);
        if ($this->request->is(array('post', 'put'))) {
            $data = $this->request->getData()['pPlanUrlopu'];
            $data['dat:Kod'] = $this->_string_2_array($data['dat:Kod']['dat2:NumerIGid']);
            $data['dat:DataDo'] = $this->_date_for_request($data['dat:DataDo']);
            $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
            $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
            $data['dat:Gid'] = $bGid;
            $data['dat:NumerEwidencyjny'] = $this->Auth->user('cNumerEwidencyjny');
            $response = $this->_edytuj_urlop($data);
            $this->set('response', $response);

            echo json_encode($this->_handle_response_json($response));
            die();
        } else {
            $nrAndGid = array(
                'dat2:Gid' => $planUrlopu['bPlanUrlopu']['bKod']['cGid'],
                'dat2:Numer' => $planUrlopu['bPlanUrlopu']['bKod']['cNumer'],
                'dat2:Opis' => $planUrlopu['bPlanUrlopu']['bKod']['cOpis'],
                'dat2:Symbol' => $planUrlopu['bPlanUrlopu']['bKod']['cSymbol']
            );
            $value['dat:Kod']['dat2:NumerIGid'] = $this->_array_2_string($nrAndGid);
            $value['dat:DataOd'] = $planUrlopu['bPlanUrlopu']['bDataOd'];
            $value['dat:DataDo'] = $planUrlopu['bPlanUrlopu']['bDataDo'];
            $value['dat:Gid'] = $bGid;
            $value['dat:Opis'] = $planUrlopu['bPlanUrlopu']['bOpis'];
            $value['dat:InformacjeDodatkowe'] = $planUrlopu['bPlanUrlopu']['bInformacjeDodatkowe'];
            $this->request = $this->request->withData('pPlanUrlopu', $value);
        }

        $saldo5 = $saldo = $this->_saldo_urlopu_5(null, 'PlanUrlopu');
        $this->set(compact('saldo', 'saldo5'));
    }

    /**
     * dokuemnty method
     */
    public function dokumenty()
    {
        $this->viewBuilder()->setLayout('ajax');
        $documents = $this->_dokumenty_kadrowe($this->Auth->user('cNumerEwidencyjny'));
        $this->set(compact('documents'));
    }

    /**
     *
     */
    public function listaZastepstw()
    {
        $replacements = $this->Api->DajListeZastepstw($this->_getGid());
        $this->_convert_list_response($replacements['bZastepstwa'], 'bZastepstwo');
        debug($replacements);
        die();
    }

    /**
     *
     */
    public function noweZastepstwo()
    {
        $replacement = $this->Api->DajNoweZastepstwo($this->_getGid());
        debug($replacement);
        die();
    }


    /**
     * place method
     */
    public function place()
    {
        $this->viewBuilder()->setLayout('ajax');
    }

    public function grafik()
    {
        $this->viewBuilder()->setLayout('ajax');
    }

    public function kalendarzUrlopu($nrewid = NULL)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->set(compact('nrewid'));
    }

    /**
     * @return string
     */
    public function calendarHolidayFeedAjax($nrewid = NULL, $coworkers = false): string
    {
        if ($this->request->is('ajax')) {
            if ($this->request->is(array('post'))) {
                $options = array();
                if ($nrewid != NULL) {
                    $options['dat:NumeryEwidencyjne'] = array(
                        'dat1:int' => $nrewid
                    );
                }
                //ważna jest data początkowa - wyciągany jest miesiąc i na jej podstawie zwracane są dane
                $newTime = strtotime($this->request->getData()['start']) + (2 * 60 * 60 * 24 * 7);
                $options['dat:OkresDo'] = ($this->request->getData()['end'] . 'T00:00:00');
                $options['dat:OkresOd'] = (date('Y-m-', $newTime) . '01T00:00:00');
                if ($coworkers == true) {
                    $options['dat:CzasPracyWspolpracownika'] = true;
                }
                $this->request->getSession()->write('calendar_holiday_feed_ajax', $options);
                $_events = $this->Api->DajKalendarzUrlopow($this->_getGid(), $options);
                $print = isset($_events['bCzyMoznaDrukowac']) && $_events['bCzyMoznaDrukowac'] === 'true' ? 1 : 0;

                if (!isset($_events['bZdarzeniaRCP']['bZdarzenieRCP'][0])) {
                    $_events['bZdarzeniaRCP']['bZdarzenieRCP'] = [$_events['bZdarzeniaRCP']['bZdarzenieRCP']];
                }

                foreach ($_events['bZdarzeniaRCP']['bZdarzenieRCP'] as $k => $e) {
                    if ($e['bRodzaj'] != 'ParametryDnia') {
                        if ($e['bRodzaj'] != 'ParametryDnia') {
                            $end = (isset($e['bGodzinaZakonczenia']) && !empty($e['bGodzinaZakonczenia'])) ? str_replace('T', ' ', $e['bGodzinaZakonczenia']) : str_replace('T', ' ', $e['bDzien']);

                            $index = $e['bIndex'];

                            $dzien = date('Y-m-d', strtotime($e['bDzien']));
                            $parametryDnia = $this->_dajParametryDnia($_events['bZdarzeniaRCP']['bZdarzenieRCP'], $dzien);
                            $czySwieto = (!empty($parametryDnia)) ? $parametryDnia['bCzySwieto'] : $e['bCzySwieto'];

                            $singleEvent = array(
                                'id' => ($k + 1),
                                'czySwieto' => $czySwieto,
                                'czyUmowa' => (!empty($parametryDnia)) ? $parametryDnia['bCzyUmowa'] : $e['bCzyUmowa'],
                                'title' => $e['bNazwa'],
                                'allDay' => true,
                                'start' => $dzien,
                                'end' => $end,
                                'index' => (int)$index,
                                'print' => $print
                            );
                            if (!empty($e['bKolorTlaHTML'])) $singleEvent['color'] = $e['bKolorTlaHTML'];
                            if (!empty($e['bKolorPierwszegoPlanuHTML'])) $singleEvent['textColor'] = $e['bKolorPierwszegoPlanuHTML'];
                            $events[] = $singleEvent;
                        }
                    } else {
                        if ($e['bCzySwieto'] && !empty($e['bSwietoOpis'])) {
                            $singleEvent = array();
                            $singleEvent['start'] = date('Y-m-d', strtotime($e['bDzien']));
                            $singleEvent['title'] = $e['bSwietoOpis'];
                            $singleEvent['czySwieto'] = true;
                            $singleEvent['color'] = 'red';
                            $singleEvent['index'] = 1;
                            $singleEvent['print'] = $print;
                            $events[] = $singleEvent;
                        }
                    }
                }

                //weekend days in date (start/end) range
//                $start = new \DateTime($this->request->data['start']);
//                $end = new \DateTime($this->request->data['end']);
//                $oneday = new DateInterval("P1D");
//                foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day)
//                {
//                    $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */
//                    if($day_num >= 6)
//                    {
//                        $events[] = array(
//                            'id' => ($k+1),
//                            'title' => '',
//                            'weekendColor' => $day_num == 6 ? 'blue' : 'red',
//                            'allDay' => true,
//                            'start' => $day->format('Y-m-d'),
//                            'color' => 'transparent'
//                        );
//                    }
//                }

                echo json_encode($events);
            } else {
                echo json_encode(array());
            }
            die();
        }
        return '';
    }

    public function kalendarzUrlopowWspolpracownikow($nrewid = NULL)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->set(compact('nrewid'));
    }

    /**
     * calendar_holiday_feed_ajax_employee method
     */
    public function calendarHolidayFeedAjaxEmployee($nrEwid = null)
    {
        set_time_limit(240);
        $options = array();

        if ($nrEwid === NULL) {
            $user_context = $this->request->getSession()->read('userContexts');
            if (isset($user_context['cPracownik']['cNumerEwidencyjny'])) {
                $options['dat:NumeryEwidencyjne']['dat1:int'] = $user_context['cPracownik']['cNumerEwidencyjny'];
            }
        }

        if ($nrEwid != NULL) {
            $options['dat:NumeryEwidencyjne']['dat1:int'] = (int)$nrEwid;
        }

        if ($this->request->is(['post', 'get'])) {
            if (!empty($this->request->getData('nrEwid'))) {
                $options['dat:NumeryEwidencyjne']['dat1:int'] = $nrEwid = $this->request->getData('nrEwid');
            }

            if (empty($this->request->getData('start'))) {
                $this->request = $this->request->withData('start', date('Y-m-') . '01');
                $this->request = $this->request->withData('end', date('Y-m-') . '31');
            }

            if (!empty($this->request->getData('direction'))) {
                $direction = $this->request->getData('direction');
                if ($direction == 'current') {
                    $this->request = $this->request->withData('start', date('Y-m-') . '01');
                    $this->request = $this->request->withData('end', date('Y-m-') . '31');
                } elseif ($direction == 'prev') {
                    $this->request = $this->request->withData('start', date('Y-m-', strtotime($this->request->getData('start') . ' - 1 month')) . '01');
                    $this->request = $this->request->withData('end', date('Y-m-', strtotime($this->request->getData('start'))) . '31');
                } else {
                    $this->request = $this->request->withData('start', date('Y-m-', strtotime($this->request->getData('start') . ' + 1 month')) . '01');
                    $this->request = $this->request->withData('end', date('Y-m-', strtotime($this->request->getData('start'))) . '31');
                }
            } else {
                $this->request = $this->request->withData('start', date('Y-m-') . '01');
                $this->request = $this->request->withData('end', date('Y-m-') . '31');
            }

            $newTime = strtotime($this->request->getData('start')) + (2 * 60 * 60 * 24 * 7);
            $options['dat:OkresDo'] = (date('Y-m-t', strtotime($this->request->getData('end'))) . 'T00:00:00');
            $options['dat:OkresOd'] = (date('Y-m-', $newTime) . '01T00:00:00');
            $options['dat:CzasPracyWspolpracownika'] = true;
        }

        $this->set('initDate', $this->request->getData('start'));

        $days = array();
        $lastDay = date('t', strtotime($this->request->getData('start')));
        for ($i = 1; $i <= $lastDay; $i++) {
            $currentDate = date('Y-m-', strtotime($this->request->getData('start'))) . ($i < 10 ? '0' . $i : $i);
            $dayName = date('D', strtotime($currentDate));

            switch ($dayName) {
                case 'Tue':
                    $dayNamePl = 'Wt';
                    break;
                case 'Wed':
                    $dayNamePl = 'Śr';
                    break;
                case 'Thu':
                    $dayNamePl = 'Cz';
                    break;
                case 'Fri':
                    $dayNamePl = 'Pt';
                    break;
                case 'Sat':
                    $dayNamePl = 'So';
                    break;
                case 'Sun':
                    $dayNamePl = 'Ni';
                    break;
                case 'Mon':
                    $dayNamePl = 'Pn';
                    break;
            }

            $days[$currentDate] = array(
                'title' => $dayNamePl,
                'day' => $i,
                'current_date' => $currentDate,
                'events' => array()
            );
        }
        $this->request->getSession()->write('calendar_holiday_feed_ajax_employee', $options);
        $_events = $this->Api->DajKalendarzUrlopowWspolpracownikow($this->_getGid(), $options);
        $this->_replace_empty_values($_events);

        $resp = $this->_handle_response_json($_events);
        $this->set(compact('resp'));

        $events = array();
        $ifLogged = array();
        $hourFromTo = isset($_events['bCzyPokazywacGodzinyOdDo']) && $_events['bCzyPokazywacGodzinyOdDo'] == "true" ? true : false;
        $print = isset($_events['bCzyMoznaDrukowac']) && $_events['bCzyMoznaDrukowac'] === 'true' ? 1 : 1;

        if (isset($_events['bZdarzeniaRCP']['bZdarzenieRCP'])) {
            foreach ($_events['bZdarzeniaRCP']['bZdarzenieRCP'] as $e) {
                $keyname = $e['bNazwisko'] . ' ' . $e['bImie'] . ' (' . $e['bNumerEwidencyjny'] . ')';
                if (!isset($events[$keyname])) {
                    $events[$keyname] = array();
                    $ifLogged[$keyname] = $e['bCzyZalogowany'];
                }

                $start = (isset($e['bGodzinaRozpoczecia']) && !empty($e['bGodzinaRozpoczecia'])) ? str_replace('T', ' ', $e['bGodzinaRozpoczecia']) : str_replace('T', ' ', $e['bDzien']);
                $end = (isset($e['bGodzinaZakonczenia']) && !empty($e['bGodzinaZakonczenia'])) ? str_replace('T', ' ', $e['bGodzinaZakonczenia']) : str_replace('T', ' ', $e['bDzien']);

                $titleSuffix = ' ';

                $hours = $e['bGodzinString'];
                if (!empty($hours)) $titleSuffix .= ' ' . $hours . ' ';

                $timeStart = '00:00';
                $timeEnd = '00:00';

                if (isset($e['bGodzinaRozpoczecia']) && !empty($e['bGodzinaRozpoczecia'])) {
                    $timeStart = date('H:i', strtotime($e['bGodzinaRozpoczecia']));
                }
                if (isset($e['bGodzinaZakonczenia']) && !empty($e['bGodzinaZakonczenia'])) {
                    $timeEnd = date('H:i', strtotime($e['bGodzinaZakonczenia']));
                }

                $timeString = '';
                if ($timeStart != '00:00') {
                    $timeString .= 'od ' . $timeStart;
                }

                if ($timeEnd != '00:00') {
                    if ($timeStart != '00:00') $timeString .= ' ';
                    $timeString .= 'do ' . $timeEnd;
                }

                if (strlen($timeString) > 0) $titleSuffix .= '(' . $timeString . ')';

                $dzien = date('Y-m-d', strtotime($e['bDzien']));
                $parametryDnia = $this->_dajParametryDnia($_events['bZdarzeniaRCP']['bZdarzenieRCP'], $dzien);
                $czySwieto = (!empty($parametryDnia)) ? $parametryDnia['bCzySwieto'] : $e['bCzySwieto'];

                $e['czySwieto'] = $czySwieto;
                $e['title'] = $titleSuffix;
                if (!is_array($e['bNazwa'])) {
                    $e['title'] = $e['bNazwa'] . $titleSuffix;
                }
                $e['allDay'] = (!isset($e['bGodzinaRozpoczecia']) || empty($e['bGodzinaRozpoczecia'])) ? true : false;
                $e['start'] = $dzien;
                $e['end'] = $end;
                $e['pracownik'] = $keyname;
                $e['czyZalogowany'] = $e['bCzyZalogowany'];

                if (!empty($e['bKolorTlaHTML'])) $e['color'] = $e['bKolorTlaHTML'];
                if (!empty($e['bKolorPierwszegoPlanuHTML'])) $e['textColor'] = $e['bKolorPierwszegoPlanuHTML'];

                $days[$dzien]['events'][] = $e;
            }
        }

        $this->set(compact('events', 'days', 'ifLogged', 'hourFromTo', 'nrEwid', 'print'));

        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('calendar_holiday_feed_ajax_employee');
    }

    /**
     * administracja_role method
     */
    public function administracjaRole()
    {
        $this->viewBuilder()->setLayout('ajax');

        $roles = $this->Api->DajRole($this->_getGid());
        $resp = $this->_handle_response_json($roles);
        $this->set(compact('resp'));

        $this->set(compact('roles'));
    }

    /**
     * administracja_uzytkownicy method
     */
    public function administracjaUzytkownicy()
    {
        $this->viewBuilder()->setLayout('ajax');
        $options = [];

        $filter = $this->request->getQuery('filter');
        if ($filter) {
            $options['dat:FiltryUzytkownika'] = $filter;
        }

        $users = $this->Api->DajUzytkownikow($this->_getGid(), $options);
        $resp = $this->_handle_response_json($users);
        $this->set(compact('resp', 'filter'));

//        if(isset($users['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Kod']) && $users['sBody']['sFault']['sDetail']['SzczegolyBleduUslugi']['Kod'] == 100) {
//            $this->redirect('/login');
//        }

        if (isset($users['bUzytkownicy']['bUzytkownik']['bNazwa'])) {
            $user = $users['bUzytkownicy']['bUzytkownik'];
            $users['bUzytkownicy']['bUzytkownik'] = array();
            $users['bUzytkownicy']['bUzytkownik'][] = $user;

        }
        $this->set(compact('users'));
    }

    /**
     *
     */
    public function dodajUzytkownika()
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is('post')) {

            $this->viewBuilder()->setTemplate(null);

            $form = $this->request->getData()['tem:pUzytkownik'];
            $data = [
                'tem:pUzytkownik' => [
                    'dat:CharakteryPracy' => $form['dat:CharakteryPracy'],
                    'dat:CzyAdministrator' => $this->_checkbox_int_2_string($form['dat:CzyAdministrator']),
                    'dat:CzyDostepDoDanychPlacowych' => $this->_checkbox_int_2_string($form['dat:CzyDostepDoDanychPlacowych']),
                    'dat:CzyDostepDoWszystkich' => $this->_checkbox_int_2_string($form['dat:CzyDostepDoWszystkich']),
                    'dat:CzyMusiZmienicHaslo' => $this->_checkbox_int_2_string($form['dat:CzyMusiZmienicHaslo']),
                    'dat:CzyWylaczony' => $this->_checkbox_int_2_string($form['dat:CzyWylaczony']),
                    'dat:CzyWbudowana' => $this->_checkbox_int_2_string($form['dat:CzyWbudowana']),
                    'dat:CzyZaznaczenie' => $this->_checkbox_int_2_string($form['dat:CzyZaznaczenie']),
                    'dat:DodatkoweOpisy' => $form['dat:DodatkoweOpisy'],
                    'dat:Email' => $form['dat:Email'],
//                    'dat:Gid' => $form['dat:Gid'],
                    'dat:GrupaPracownikowPortalu0' => $form['dat:GrupaPracownikowPortalu0'],
                    'dat:GrupaPracownikowPortalu1' => $form['dat:GrupaPracownikowPortalu1'],
                    'dat:GrupaPracownikowPortalu2' => $form['dat:GrupaPracownikowPortalu2'],
                    'dat:Haslo' => $form['dat:Haslo'],
                    'dat:Imie' => $form['dat:Imie'],
                    'dat:Komorki' => $form['dat:Komorki'],
                    'dat:MiejscaWykonywaniaPracy' => $form['dat:MiejscaWykonywaniaPracy'],
                    'dat:Nazwa' => $form['dat:Nazwa'],
                    'dat:Nazwisko' => $form['dat:Nazwisko'],
                    'dat:NumeryEwidencyjne' => $form['dat:NumeryEwidencyjne'],
                    'dat:NumeryEwidencyjneWykluczone' => $form['dat:NumeryEwidencyjneWykluczone'],
                    'dat:Opis' => $form['dat:Opis'],
                    'dat:Piony' => $form['dat:Piony'],
                    'dat:Platnicy' => $form['dat:Platnicy'],
                    'dat:PowiazaneNumeryEwidencyjne' => $form['dat:PowiazaneNumeryEwidencyjne'],
                    'dat:PowiazanyNumerEwidencyjny' => $form['dat:PowiazanyNumerEwidencyjny'],
                    'dat:Regiony' => $form['dat:Regiony'],
                    'dat:Stanowiska' => $form['dat:Stanowiska'],
                ],
            ];
            $response = $this->_dodaj_uzytkownika($data);
            echo json_encode($this->_handle_response_json($response));
            die();
            /*if($this->_handle_response())
            {
                return $this->redirect(array('action' => 'administracja_uzytkownicy'));
            }*/
        }
    }

    /**
     * @param $userGid
     */
    public function edytujUzytkownika($userGid)
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is('post')) {

            $this->viewBuilder()->setTemplate(null);

            $form = $this->request->getData('tem:pUzytkownik');
            $czyWylaczony = 'false';
            if (isset($form['dat:CzyWylaczony'])) {
                $czyWylaczony = ($this->_checkbox_int_2_string($form['dat:CzyWylaczony']) == NULL) ? false : $this->_checkbox_int_2_string($form['dat:CzyWylaczony']);
            }
            $data = array(
                'tem:pUzytkownik' => array(
                    'dat:CharakteryPracy' => $form['dat:CharakteryPracy'],
                    'dat:CzyAdministrator' => $this->_checkbox_int_2_string($form['dat:CzyAdministrator']),
                    'dat:CzyDostepDoDanychPlacowych' => $this->_checkbox_int_2_string($form['dat:CzyDostepDoDanychPlacowych']),
                    'dat:CzyDostepDoWszystkich' => $this->_checkbox_int_2_string($form['dat:CzyDostepDoWszystkich']),
                    'dat:CzyMusiZmienicHaslo' => $this->_checkbox_int_2_string($form['dat:CzyMusiZmienicHaslo']),
                    'dat:CzyWylaczony' => $czyWylaczony,
                    'dat:CzyWbudowana' => $this->_checkbox_int_2_string($form['dat:CzyWbudowana']),
                    'dat:CzyZaznaczenie' => $this->_checkbox_int_2_string($form['dat:CzyZaznaczenie']),
                    'dat:DodatkoweOpisy' => $form['dat:DodatkoweOpisy'],
                    'dat:Email' => $form['dat:Email'],
                    'dat:Gid' => $form['dat:Gid'],
                    'dat:GrupaPracownikowPortalu0' => $form['dat:GrupaPracownikowPortalu0'],
                    'dat:GrupaPracownikowPortalu1' => $form['dat:GrupaPracownikowPortalu1'],
                    'dat:GrupaPracownikowPortalu2' => $form['dat:GrupaPracownikowPortalu2'],
                    'dat:Haslo' => $form['dat:Haslo'],
                    'dat:Imie' => $form['dat:Imie'],
                    'dat:Komorki' => $form['dat:Komorki'],
                    'dat:MiejscaWykonywaniaPracy' => $form['dat:MiejscaWykonywaniaPracy'],
                    'dat:Nazwa' => $form['dat:Nazwa'],
                    'dat:Nazwisko' => $form['dat:Nazwisko'],
                    'dat:NumeryEwidencyjne' => $form['dat:NumeryEwidencyjne'],
                    'dat:NumeryEwidencyjneWykluczone' => $form['dat:NumeryEwidencyjneWykluczone'],
                    'dat:Opis' => $form['dat:Opis'],
                    'dat:Piony' => $form['dat:Piony'],
                    'dat:Platnicy' => $form['dat:Platnicy'],
                    'dat:PowiazaneNumeryEwidencyjne' => $form['dat:PowiazaneNumeryEwidencyjne'],
                    'dat:PowiazanyNumerEwidencyjny' => $form['dat:PowiazanyNumerEwidencyjny'],
                    'dat:Regiony' => $form['dat:Regiony'],
                    'dat:Stanowiska' => $form['dat:Stanowiska'],
                )
            );
            /*if($this->_handle_response())
            {
                return $this->redirect(array('action' => 'administracja_uzytkownicy'));
            }*/

            $response = $this->_edytuj_uzytkownika($data);
            echo json_encode($this->_handle_response_json($response));
            die();
        }
        $userGet = $this->_daj_uzytkownika($userGid);

        $resp = $this->_handle_response_json($userGet);
        $this->set(compact('resp'));

        $userGet = $this->_rename_array_key_prefixes($userGet['bUzytkownik'], 'b', 'dat:');
        $userGet = $this->_replace_empty_values($userGet);
        $userGet['dat:CzyAdministrator'] = $this->_checkbox_string_2_bool($userGet['dat:CzyAdministrator']);
        $userGet['dat:CzyMusiZmienicHaslo'] = $this->_checkbox_string_2_bool($userGet['dat:CzyMusiZmienicHaslo']);
        $userGet['dat:CzyWylaczony'] = $this->_checkbox_string_2_bool($userGet['dat:CzyWylaczony']);
        $userGet['dat:CzyWbudowana'] = $this->_checkbox_string_2_bool($userGet['dat:CzyWbudowana']);
        $userGet['dat:CzyZaznaczenie'] = $this->_checkbox_string_2_bool($userGet['dat:CzyZaznaczenie']);
        $userGet['dat:CzyDostepDoWszystkich'] = $this->_checkbox_string_2_bool($userGet['dat:CzyDostepDoWszystkich']);
        $userGet['dat:CzyDostepDoDanychPlacowych'] = $this->_checkbox_string_2_bool($userGet['dat:CzyDostepDoDanychPlacowych']);
        $this->request = $this->request->withData('tem:pUzytkownik', $userGet);
    }

    /**
     * @param $userGid
     */
    public function usunUzytkownika($userGid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);
        $resp = $this->_handle_response_json($this->_usun_uzytkownika($userGid));
        echo json_encode($resp);
    }

    /**
     * @param $evens
     * @param $date
     * @return array
     */
    private function _dajParametryDnia($evens, $date)
    {
        foreach ($evens as $event) {
            if ($event['bRodzaj'] == 'ParametryDnia' && $date == date('Y-m-d', strtotime($event['bDzien']))) {
                return $event;
            }
        }

        return array();
    }

    /**
     * calendar_feed_ajax_employee method
     */
    public function calendarFeedAjaxEmployee($nrEwid = null)
    {
        set_time_limit(240);
        $options = array();

        if ($nrEwid === NULL) {
            $user_context = $this->request->getSession()->read('userContexts');
            if (isset($user_context['cPracownik']['cNumerEwidencyjny'])) {
                $options['dat:NumeryEwidencyjne']['dat1:int'] = $user_context['cPracownik']['cNumerEwidencyjny'];
            }
        }

        if ($nrEwid != NULL) {
            $options['dat:NumeryEwidencyjne']['dat1:int'] = (int)$nrEwid;
        }

        if ($this->request->is(['post', 'get'])) {
            if (!empty($this->request->getData('nrEwid'))) {
                $options['dat:NumeryEwidencyjne']['dat1:int'] = $nrEwid = $this->request->getData('nrEwid');
            }

            if (empty($this->request->getData('start'))) {
                $this->request = $this->request->withData('start', date('Y-m-') . '01');
                $this->request = $this->request->withData('end', date('Y-m-') . '31');
            }

            if (!empty($this->request->getData('direction'))) {
                $direction = $this->request->getData('direction');
                if ($direction == 'current') {
                    $this->request = $this->request->withData('start', date('Y-m-') . '01');
                    $this->request = $this->request->withData('end', date('Y-m-') . '31');
                } elseif ($direction == 'prev') {
                    $this->request = $this->request->withData('start', date('Y-m-', strtotime($this->request->getData('start') . ' - 1 month')) . '01');
                    $this->request = $this->request->withData('end', date('Y-m-', strtotime($this->request->getData('start'))) . '31');
                } else {
                    $this->request = $this->request->withData('start', date('Y-m-', strtotime($this->request->getData('start') . ' + 1 month')) . '01');
                    $this->request = $this->request->withData('end', date('Y-m-', strtotime($this->request->getData('start'))) . '31');
                }
            } else {
                $this->request = $this->request->withData('start', date('Y-m-') . '01');
                $this->request = $this->request->withData('end', date('Y-m-') . '31');
            }

            $newTime = strtotime($this->request->getData('start')) + (2 * 60 * 60 * 24 * 7);
            $options['dat:OkresDo'] = (date('Y-m-t', strtotime($this->request->getData('end'))) . 'T00:00:00');
            $options['dat:OkresOd'] = (date('Y-m-', $newTime) . '01T00:00:00');
            $options['dat:CzasPracyWspolpracownika'] = true;
        }

        $this->set('initDate', $this->request->getData('start'));

        $days = array();
        $lastDay = date('t', strtotime($this->request->getData('start')));
        for ($i = 1; $i <= $lastDay; $i++) {
            $currentDate = date('Y-m-', strtotime($this->request->getData('start'))) . ($i < 10 ? '0' . $i : $i);
            $dayName = date('D', strtotime($currentDate));

            switch ($dayName) {
                case 'Tue':
                    $dayNamePl = 'Wt';
                    break;
                case 'Wed':
                    $dayNamePl = 'Śr';
                    break;
                case 'Thu':
                    $dayNamePl = 'Cz';
                    break;
                case 'Fri':
                    $dayNamePl = 'Pt';
                    break;
                case 'Sat':
                    $dayNamePl = 'So';
                    break;
                case 'Sun':
                    $dayNamePl = 'Ni';
                    break;
                case 'Mon':
                    $dayNamePl = 'Pn';
                    break;
            }

            $days[$currentDate] = array(
                'title' => $dayNamePl,
                'day' => $i,
                'current_date' => $currentDate,
                'events' => array()
            );
        }
        $this->request->getSession()->write('calendar_feed_ajax_employee', $options);
        $_events = $this->Api->DajZdarzeniaRCPWspolpracownikow($this->_getGid(), $options);
        $this->_replace_empty_values($_events);

        $resp = $this->_handle_response_json($_events);
        $this->set(compact('resp'));

        $events = array();
        $ifLogged = array();
        $hourFromTo = isset($_events['bCzyPokazywacGodzinyOdDo']) && $_events['bCzyPokazywacGodzinyOdDo'] == "true" ? true : false;
        $print = isset($_events['bCzyMoznaDrukowac']) && $_events['bCzyMoznaDrukowac'] === 'true' ? 1 : 1;

        if (isset($_events['bZdarzeniaRCP']['bZdarzenieRCP'])) {
            foreach ($_events['bZdarzeniaRCP']['bZdarzenieRCP'] as $e) {
                $keyname = $e['bNazwisko'] . ' ' . $e['bImie'] . ' (' . $e['bNumerEwidencyjny'] . ')';
                if (!isset($events[$keyname])) {
                    $events[$keyname] = array();
                    $ifLogged[$keyname] = $e['bCzyZalogowany'];
                }

                $start = (isset($e['bGodzinaRozpoczecia']) && !empty($e['bGodzinaRozpoczecia'])) ? str_replace('T', ' ', $e['bGodzinaRozpoczecia']) : str_replace('T', ' ', $e['bDzien']);
                $end = (isset($e['bGodzinaZakonczenia']) && !empty($e['bGodzinaZakonczenia'])) ? str_replace('T', ' ', $e['bGodzinaZakonczenia']) : str_replace('T', ' ', $e['bDzien']);

                $titleSuffix = ' ';

                $hours = $e['bGodzinString'];
                if (!empty($hours)) $titleSuffix .= ' ' . $hours . ' ';

                $timeStart = '00:00';
                $timeEnd = '00:00';

                if (isset($e['bGodzinaRozpoczecia']) && !empty($e['bGodzinaRozpoczecia'])) {
                    $timeStart = date('H:i', strtotime($e['bGodzinaRozpoczecia']));
                }
                if (isset($e['bGodzinaZakonczenia']) && !empty($e['bGodzinaZakonczenia'])) {
                    $timeEnd = date('H:i', strtotime($e['bGodzinaZakonczenia']));
                }

                $timeString = '';
                if ($timeStart != '00:00') {
                    $timeString .= 'od ' . $timeStart;
                }

                if ($timeEnd != '00:00') {
                    if ($timeStart != '00:00') $timeString .= ' ';
                    $timeString .= 'do ' . $timeEnd;
                }

                if (strlen($timeString) > 0) $titleSuffix .= '(' . $timeString . ')';

                $dzien = date('Y-m-d', strtotime($e['bDzien']));
                $parametryDnia = $this->_dajParametryDnia($_events['bZdarzeniaRCP']['bZdarzenieRCP'], $dzien);
                $czySwieto = (!empty($parametryDnia)) ? $parametryDnia['bCzySwieto'] : $e['bCzySwieto'];

                $e['czySwieto'] = $czySwieto;
                $e['title'] = $titleSuffix;
                if (!is_array($e['bNazwa'])) {
                    $e['title'] = $e['bNazwa'] . $titleSuffix;
                }
                $e['allDay'] = (!isset($e['bGodzinaRozpoczecia']) || empty($e['bGodzinaRozpoczecia'])) ? true : false;
                $e['start'] = $dzien;
                $e['end'] = $end;
                $e['pracownik'] = $keyname;
                $e['czyZalogowany'] = $e['bCzyZalogowany'];

                if (!empty($e['bKolorTlaHTML'])) $e['color'] = $e['bKolorTlaHTML'];
                if (!empty($e['bKolorPierwszegoPlanuHTML'])) $e['textColor'] = $e['bKolorPierwszegoPlanuHTML'];

                $days[$dzien]['events'][] = $e;
            }
        }

        $this->set(compact('events', 'days', 'ifLogged', 'hourFromTo', 'nrEwid', 'print'));

        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('calendar_feed_ajax_employee');
    }

    /**
     * @return string
     */
    public function calendarFeedAjax($nrewid = NULL, $coworkers = false)
    {
        if ($this->request->is('ajax')) {
            if ($this->request->is(array('post'))) {
                $options = array();
                if ($nrewid != NULL) {
                    $options['dat:NumeryEwidencyjne'] = array(
                        'dat1:int' => $nrewid
                    );
                }
                //ważna jest data początkowa - wyciągany jest miesiąc i na jej podstawie zwracane są dane
                $newTime = strtotime($this->request->getData()['start']) + (2 * 60 * 60 * 24 * 7);
                $options['dat:OkresDo'] = ($this->request->getData()['end'] . 'T00:00:00');
                $options['dat:OkresOd'] = (date('Y-m-', $newTime) . '01T00:00:00');
                if ($coworkers == true) {
                    $options['dat:CzasPracyWspolpracownika'] = true;
                }
                $this->request->getSession()->write('calendar_feed_ajax', $options);
                $_events = $this->Api->DajZdarzeniaRCP($this->_getGid(), $options);
                $print = isset($_events['bCzyMoznaDrukowac']) && $_events['bCzyMoznaDrukowac'] === 'true' ? 1 : 0;
                $informacjaDodatkowa = htmlspecialchars_decode($_events['bInformacjaDodatkowa'] ?? '');

                if (!isset($_events['bZdarzeniaRCP']['bZdarzenieRCP'][0])) {
                    $_events['bZdarzeniaRCP']['bZdarzenieRCP'] = [$_events['bZdarzeniaRCP']['bZdarzenieRCP']];
                }

                foreach ($_events['bZdarzeniaRCP']['bZdarzenieRCP'] as $k => $e) {
                    $singleEvent = array();
                    if ($e['bRodzaj'] != 'ParametryDnia') {
                        if ($e['bRodzaj'] != 'ParametryDnia') {
                            $start = (isset($e['bGodzinaRozpoczecia']) && !empty($e['bGodzinaRozpoczecia'])) ? str_replace('T', ' ', $e['bGodzinaRozpoczecia']) : str_replace('T', ' ', $e['bDzien']);
                            $end = (isset($e['bGodzinaZakonczenia']) && !empty($e['bGodzinaZakonczenia'])) ? str_replace('T', ' ', $e['bGodzinaZakonczenia']) : str_replace('T', ' ', $e['bDzien']);

                            $titleSuffix = ' ';

                            $hours = $e['bGodzinString'];
                            if (!empty($hours) && $hours !== "00:00") $titleSuffix .= ' ' . $hours . ' ';

                            $timeStart = '00:00';
                            $timeEnd = '00:00';

                            if (isset($e['bGodzinaRozpoczecia']) && !empty($e['bGodzinaRozpoczecia'])) {
                                $timeStart = date('H:i', strtotime($e['bGodzinaRozpoczecia']));
                            }
                            if (isset($e['bGodzinaZakonczenia']) && !empty($e['bGodzinaZakonczenia'])) {
                                $timeEnd = date('H:i', strtotime($e['bGodzinaZakonczenia']));
                            }

                            $timeString = '';
                            if ($timeStart != '00:00') {
                                $timeString .= 'od ' . $timeStart;
                            }

                            if ($timeEnd != '00:00') {
                                if ($timeStart != '00:00') $timeString .= ' ';
                                $timeString .= 'do ' . $timeEnd;
                            }

                            if (strlen($timeString) > 0) $titleSuffix .= '(' . $timeString . ')';

                            $index = $e['bIndex'];

                            $dzien = date('Y-m-d', strtotime($e['bDzien']));
                            $parametryDnia = $this->_dajParametryDnia($_events['bZdarzeniaRCP']['bZdarzenieRCP'], $dzien);
                            $czySwieto = (!empty($parametryDnia)) ? $parametryDnia['bCzySwieto'] : $e['bCzySwieto'];

                            $singleEvent = array(
                                'id' => ($k + 1),
                                'czySwieto' => $czySwieto,
                                'czyUmowa' => (!empty($parametryDnia)) ? $parametryDnia['bCzyUmowa'] : $e['bCzyUmowa'],
                                'title' => $e['bNazwa'] . $titleSuffix,
                                'allDay' => (!isset($e['bGodzinaRozpoczecia']) || empty($e['bGodzinaRozpoczecia'])) ? true : false,
                                'start' => $dzien,
                                'end' => $end,
                                'index' => (int)$index,
                                'informacjaDodatkowa' => $informacjaDodatkowa,
                                'print' => $print
                            );
                            if (!empty($e['bKolorTlaHTML'])) $singleEvent['color'] = $e['bKolorTlaHTML'];
                            if (!empty($e['bKolorPierwszegoPlanuHTML'])) $singleEvent['textColor'] = $e['bKolorPierwszegoPlanuHTML'];
                            $events[] = $singleEvent;
                        }
                    } else {
                        if ($e['bCzySwieto'] && !empty($e['bSwietoOpis'])) {
                            $singleEvent = array();
                            $singleEvent['start'] = date('Y-m-d', strtotime($e['bDzien']));
                            $singleEvent['title'] = $e['bSwietoOpis'];
                            $singleEvent['czySwieto'] = true;
                            $singleEvent['color'] = 'red';
                            $singleEvent['index'] = 1;
                            $singleEvent['print'] = $print;
                            $singleEvent['informacjaDodatkowa'] = $informacjaDodatkowa;
                            $events[] = $singleEvent;
                        }
                    }
                }

                //weekend days in date (start/end) range
//                $start = new \DateTime($this->request->data['start']);
//                $end = new \DateTime($this->request->data['end']);
//                $oneday = new DateInterval("P1D");
//                foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day)
//                {
//                    $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */
//                    if($day_num >= 6)
//                    {
//                        $events[] = array(
//                            'id' => ($k+1),
//                            'title' => '',
//                            'weekendColor' => $day_num == 6 ? 'blue' : 'red',
//                            'allDay' => true,
//                            'start' => $day->format('Y-m-d'),
//                            'color' => 'transparent'
//                        );
//                    }
//                }

                echo json_encode($events);
            } else {
                echo json_encode(array());
            }
            die();
        }
    }

    /**
     * ajax_wniosek_remove method
     * @param null|string $gid
     */
    public function ajaxWniosekRemove($gid = NULL)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        $response = $this->Api->UsunWniosek($this->_getGid(), $gid);
        echo json_encode($response);
        die();
    }

    /**
     * pokaz_wniosek method
     * @param null|string $bGid
     */
    public function pokazWniosek($bGid = NULL, $returnAction = null)
    {
        $this->viewBuilder()->setLayout('ajax');

//        if($bGid == NULL) $this->redirect('/wnioski');

        $wniosek = $this->Api->DajWniosek($this->_getGid(), $bGid);

        $resp = $this->_handle_response_json($wniosek);

        $this->_replace_empty_values($wniosek);

        $this->set(compact('resp'));

        $this->set(compact('wniosek'));

        $codes = $this->_daj_mozliwe_kody_wniosku();
        $codeList = array();
        $kody = $codes['bKody']['bKod'] ?? [];
        if (is_array($kody)) {
            foreach ($kody as $code) {
                $nrAndGid = array(
                    'dat2:Gid' => $code['bGid'] ?? '',
                    'dat2:Numer' => $code['bNumer'] ?? '',
                    'dat2:Opis' => $code['bOpis'] ?? '',
                    'dat2:Symbol' => $code['bSymbol'] ?? '',
                    'dat2:CzyPracaZdalna' => $code['bCzyPracaZdalna'] ?? '',
                    'dat2:CzyPracaZdalnaSaldo' => $code['bCzyPracaZdalnaSaldo'] ?? '',
                );
                $codeList[$this->_array_2_string($nrAndGid)] = $code['bOpis'] ?? '';
            }
        }

        $this->set('codes', $codeList);

        $numerPracownika = '';
        if (isset($wniosek['bWniosek']['bNumerPracownika']) && is_array($wniosek['bWniosek'])) {
            $numerPracownika = $wniosek['bWniosek']['bNumerPracownika'];
        }
        $saldo = $this->_saldo_urlopu_5($numerPracownika);
        $this->set(compact('saldo', 'returnAction'));
    }

    /**
     * przekaz_wniosek method
     * @param null|string $bGid
     */
    public function przekazWniosek($bGid = null)
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is('post')) {

            $data = $this->request->getData('pSciezkaAkceptacji');

            $options = [
                'pGidWniosku' => $bGid,
                'pAdresy' => []
            ];

            if (isset($data['dat:Sciezka']['dat:ElementSciezkiAkceptacji'])) {
                foreach ($data['dat:Sciezka']['dat:ElementSciezkiAkceptacji'] as $item) {
                    $options['pAdresy'][] = [
                        'Email' => $item['dat:Akceptujacy']['dat1:Email'],
                        'Gid' => $item['dat:Akceptujacy']['dat1:Gid'],
                        'Nazwa' => $item['dat:Akceptujacy']['dat1:Nazwa']
                    ];
                }
            }

            $response = $this->Api->PrzekazWniosek($this->_getGid(), $options);

            echo json_encode($this->_handle_response_json($response));
            die();
        }

    }

    /**
     * @param null $bGid
     */
    public function drukujWniosek($bGid = NULL)
    {
        if ($bGid == NULL) $this->redirect('/');

        $this->viewBuilder()->setLayout('ajax');

        $response = $this->Api->DrukujWniosek($this->_getGid(), $bGid);

        $resp = $this->_handle_response_json($response);
        if (isset($resp['login'])) {
            $this->redirect('/');
        } elseif (!isset($response['bDokument'])) {
            $this->Flash->error('Nie znaleziono dokumentu do wydruku.');
            $this->redirect('/');
        } else {
            $content = base64_decode($response['bDokument']['bTresc']);
            $filename = $response['bDokument']['bNazwaPliku'];
            $extension = $response['bDokument']['bRozszerzenie'];

            header('Content-Type: application/' . $extension);
            header('Content-Length: ' . strlen($content));
            header('Content-Disposition: inline; filename="' . $filename . '"');
            header('Cache-Control: private, max-age=0, must-revalidate');
            header('Pragma: public');
            ini_set('zlib.output_compression', '0');

            die($content);
        }
    }

    /**
     * edytuj_wniosek method
     * @param string|null $bGid
     */
    public function edytujWniosek($bGid = NULL)
    {
        $this->viewBuilder()->setTemplate('edytuj_wniosek');
        $this->viewBuilder()->setLayout('ajax');

        if ($bGid == NULL) $this->redirect('/wnioski');

        $codes = $this->_daj_mozliwe_kody_wniosku();

        $pracaZdalna = [];
        $pracaZdalnaSaldo = [];
        $extensionCode = [];
        $codeList = [];
        $czyZastepca = [];
        foreach ($codes['bKody']['bKod'] as $key => $code) {
            $nrAndGid = [
                'dat2:Gid' => $code['bGid'],
                'dat2:Numer' => $code['bNumer'],
                'dat2:Opis' => $code['bOpis'],
                'dat2:Symbol' => $code['bSymbol'],
                'dat2:CzyPotrzebnyPowod' => $code['bCzyPotrzebnyPowod'],
                'dat2:CzyPracaZdalna' => $code['bCzyPracaZdalna'],
                'dat2:CzyPracaZdalnaSaldo' => $code['bCzyPracaZdalnaSaldo'],
            ];

            $codeList[$this->_array_2_string($nrAndGid)] = $code['bOpis'];
            if ($code['bCzyBezZastepcy'] === 'false') {
                $czyZastepca[] = $this->_array_2_string($nrAndGid);
            }
            if ($code['bCzyPracaZdalna'] === 'true') {
                $pracaZdalna[] = $this->_array_2_string($nrAndGid);
            }
            if ($code['bCzyPracaZdalnaSaldo'] === 'true') {
                $pracaZdalnaSaldo[] = $this->_array_2_string($nrAndGid);
            }

            // Definicja typów dodatkowych pól do przetworzenia
            // UWAGA: 'labelPrefix' to tylko prefiks, pełny klucz to 'labelPrefix' + indeks + 'Tekst'
            $fieldTypes = [
                'wartosc' => [
                    'name' => 'dodatkowaWartosc',
                    'labelPrefix' => 'bDodatkowaWartosc',
                    'type' => 'text'
                ],
                'wartoscWyboru' => [
                    'name' => 'dodatkowaWartoscWyboru',
                    'labelPrefix' => 'bDodatkowaWartoscWyboru',
                    'optionsPrefix' => 'bDodatkowaWartoscWyboru', // bez 'Mozliwe' na końcu!
                    'type' => 'select'
                ],
                'data' => [
                    'name' => 'dodatkowaData',
                    'labelPrefix' => 'bDodatkowaData',
                    'type' => 'date'
                ],
                'dataOd' => [
                    'name' => 'dodatkowaDataOd',
                    'labelPrefix' => 'bDodatkowaDataOdDo',
                    'type' => 'date'
                ],
                'dataDo' => [
                    'name' => 'dodatkowaDataDo',
                    'labelPrefix' => 'bDodatkowaDataOdDo',
                    'type' => 'date'
                ],
                'wartoscBool' => [
                    'name' => 'dodatkowaWartoscBool',
                    'labelPrefix' => 'bDodatkowaWartoscBool',
                    'type' => 'checkbox'
                ],
                'dodatkowyNapis' => [
                    'name' => 'dodatkowyNapis',
                    'labelPrefix' => 'bDodatkowyNapis',
                    'type' => 'textField'
                ]
            ];

            foreach (range(0, 6) as $i) {
                $hasAnyField = false;

                // Sprawdzenie czy istnieje jakiekolwiek pole dla tego indeksu
                foreach ($fieldTypes as $fieldType => $config) {
                    $prefix = match ($config['name']) {
                        'dodatkowaDataOd' => 'bDodatkowaDataOd',
                        'dodatkowaDataDo' => 'bDodatkowaDataDo',
                        default => $config['labelPrefix'],
                    };

                    $suffix = ($prefix === 'bDodatkowyNapis') ? 'Text' : 'Tekst';
                    $labelKey = $prefix . $i . $suffix;

                    if (!empty($code[$labelKey])) {
                        $hasAnyField = true;
                        break;
                    }
                }

                if (!$hasAnyField) {
                    continue;
                }

                // Przetwarzanie każdego typu pola
                foreach ($fieldTypes as $fieldType => $config) {
                    $prefix = match ($config['name']) {
                        'dodatkowaDataOd' => 'bDodatkowaDataOd',
                        'dodatkowaDataDo' => 'bDodatkowaDataDo',
                        default => $config['labelPrefix'],
                    };

                    $suffix = ($prefix === 'bDodatkowyNapis') ? 'Text' : 'Tekst';
                    $labelKey = $prefix . $i . $suffix;

                    if (empty($code[$labelKey])) {
                        continue;
                    }

                    $fieldData = [
                        'typ' => $config['type'],
                        'czyWymagany' => $code[$config['labelPrefix'] . $i . 'CzyWymagana'] ?? 'false',
                        'readonly' => $code[$config['labelPrefix'] . $i . 'CzyTylkoDoOdczytu'] ?? 'false',
                        'label' => $code[$labelKey],
                        'indeks' => $code[$config['labelPrefix'] . $i . 'Indeks'] ?? 0,
                        'codeKey' => $key,
                        'code' => $this->_array_2_string($nrAndGid),
                        'inputName' => $config['name'] . $i,
                    ];

                    // Dodanie opcji dla pól select
                    if ($config['type'] === 'select') {
                        $optionsKey = $config['optionsPrefix'] . $i . 'Mozliwe';
                        $mozliweWartosci = [];
                        if (!empty($code[$optionsKey]['cstring'])) {
                            foreach ($code[$optionsKey]['cstring'] as $string) {
                                $mozliweWartosci[$string] = $string;
                            }
                        }
                        $fieldData['opcje'] = $mozliweWartosci;
                    }

                    $extensionCode[] = $fieldData;
                }
            }
        }

        // Sortowanie pól dodatkowych według indeksu
        usort($extensionCode, function ($a, $b) {
            return ($a['indeks'] ?? 0) <=> ($b['indeks'] ?? 0);
        });

        $this->set('codes', $codeList);
        $this->set(compact('pracaZdalna', 'pracaZdalnaSaldo', 'extensionCode', 'czyZastepca'));

        if (!$this->request->is(array('post', 'put'))) {
            $thisYear = new \DateTime();
            $thisYear = (int)$thisYear->format('Y');
            $saldoOptions = array(
                'dat:Lata' => array(
                    0 => array(
                        'arr:int' => $thisYear
                    )
                ),
                'dat:NumerPracownika' => $this->Auth->user('cNumerEwidencyjny')
            );
            $saldo = $this->_saldo_urlopu_5();
            $this->set(compact('saldo'));

            $resp = $this->_handle_response_json($saldo);
            $this->set(compact('resp'));
        }

        if ($this->request->is(array('post', 'put'))) {
            $data = $this->request->getData()['pWniosek'];

            foreach (range(0, 6) as $i) {
                if (isset($data['dat:dodatkowaWartoscWyboru' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaWartoscWyboru' . $i] = $data['dat:dodatkowaWartoscWyboru' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaWartosc' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaWartosc' . $i] = $data['dat:dodatkowaWartosc' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaWartoscBool' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaWartoscBool' . $i] = $data['dat:dodatkowaWartoscBool' . $i . '_' . $data['Code']] ? 'true' : 'false';
                }
                if (isset($data['dat:dodatkowaData' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaData' . $i] = $data['dat:dodatkowaData' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaDataDo' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaDataDo' . $i] = $data['dat:dodatkowaDataDo' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaDataOd' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaDataOd' . $i] = $data['dat:dodatkowaDataOd' . $i . '_' . $data['Code']];
                }
            }

            unset($data['Code']);

            $data['dat:Kod'] = $this->_string_2_array($data['dat:Kod']['dat2:NumerIGid']);

            if (isset($this->request->getData()['bZalacznik']) && !empty($this->request->getData()['bZalacznik'])) {
                foreach ($this->request->getData()['bZalacznik'] as $z) {
                    $file = $this->_zalaczniki_edycja($z, 'dat:', 'dat1:');
                    $data['dat:Zalaczniki'][] = $file['dat:Zalaczniki'];
                }
                unset($this->request->getData()['bZalacznik']);
            }

            $filesCounter = 0;
            if (isset($_FILES['data']['tmp_name']['file'])) {
                $filesCounter = $this->_getZalaczniki($data);

                unset($this->request->getData()['file']);
            }

            $data['dat:IloscDodanychZalacznikow'] = $filesCounter;
            $data['dat:DataDo'] = $this->_date_for_request($data['dat:DataDo']);
            $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
            $data['dat:Godziny'] = $this->_time_for_request($data['dat:Godziny']);

            $response = $this->_zapisz_wniosek($data);
            $this->set('response', $response);
            /*if($this->_handle_response($response))
            {
                return $this->redirect(array('action' => 'wnioski'));
            }*/
            echo json_encode($this->_handle_response_json($response));
            die();
        } else {
            $wniosek = $this->Api->DajWniosek($this->_getGid(), $bGid);
            $knG = empty($wniosek['bKodyNieobecnosciGodzinowych']['cstring']) ? array() : explode("-", (string)$wniosek['bKodyNieobecnosciGodzinowych']['cstring']);
            //$mozliwePowody = empty($wniosek['bWniosek']['bMozliwePowody']['cstring']) ? array() : array_combine(array_values($wniosek['bWniosek']['bMozliwePowody']['cstring']),$wniosek['bWniosek']['bMozliwePowody']['cstring']);
            $mozliwePowody = empty($wniosek['bWniosek']['bMozliwePowody']['cstring']) ? array() : $wniosek['bWniosek']['bMozliwePowody']['cstring'];
            if (empty($this->request->getData())) {
                $nrAndGid = array(
                    'dat2:Gid' => $wniosek['bWniosek']['bKod']['cGid'],
                    'dat2:Numer' => $wniosek['bWniosek']['bKod']['cNumer'],
                    'dat2:Opis' => $wniosek['bWniosek']['bKod']['cOpis'],
                    'dat2:Symbol' => $wniosek['bWniosek']['bKod']['cSymbol'],
                    'dat2:CzyPotrzebnyPowod' => $wniosek['bWniosek']['bKod']['cCzyPotrzebnyPowod'],
                    'dat2:CzyPracaZdalna' => $wniosek['bWniosek']['bKod']['cCzyPracaZdalna'],
                    'dat2:CzyPracaZdalnaSaldo' => $wniosek['bWniosek']['bKod']['cCzyPracaZdalnaSaldo'],
                );
                $value = [];
                $value['dat:Kod']['dat2:NumerIGid'] = $this->_array_2_string($nrAndGid);
                $value['dat:DataOd'] = $wniosek['bWniosek']['bDataOd'];
                $value['dat:DataDo'] = $wniosek['bWniosek']['bDataDo'];
                $value['dat:GodzinaOd'] = $this->_time_for_respons($wniosek['bWniosek']['bGodzinaOd'], ':');
                $value['dat:GodzinaDo'] = $this->_time_for_respons($wniosek['bWniosek']['bGodzinaDo'], ':');
                $value['dat:Godziny'] = $this->_time_for_respons($wniosek['bWniosek']['bGodziny']);
                $value['dat:DataUtworzenia'] = $wniosek['bWniosek']['bDataUtworzenia'];
                $value['dat:Gid'] = $wniosek['bWniosek']['bGid'];
                $value['dat:Opis'] = $wniosek['bWniosek']['bOpis'];
                $value['dat:Powod'] = $wniosek['bWniosek']['bPowod'];
                $value['dat:Numer'] = $wniosek['bWniosek']['bNumer'];

                $value['dat:Zastepca']['dat1:Email'] = $wniosek['bWniosek']['bZastepca']['cEmail'];
                $value['dat:Zastepca']['dat1:Gid'] = $wniosek['bWniosek']['bZastepca']['cGid'];
                $value['dat:Zastepca']['dat1:Nazwa'] = $wniosek['bWniosek']['bZastepca']['cNazwa'];
                $value['dat:Zastepca']['dat1:NazwaWyswietlana'] = $wniosek['bWniosek']['bZastepca']['cNazwaWyswietlana'];

                $this->request = $this->request->withData('pWniosek', $value);
            }
            ini_set('memory_limit', '-1');
            $zalaczniki = (!empty($wniosek['bWniosek']['bZalaczniki'])) ? $wniosek['bWniosek']['bZalaczniki']['cZalacznik'] : [];
            if (isset($wniosek['bWniosek']['bZalaczniki'])) {
                unset($wniosek['bWniosek']['bZalaczniki']);
            }
            $this->set(compact('zalaczniki', 'wniosek', 'knG', 'mozliwePowody'));
        }
    }

    /**
     *
     */
    public function wnioski()
    {
        $this->viewBuilder()->setLayout('ajax');

        $pracownicy = $this->_daj_mozliwych_podwladnych_do_wniosku();

        if (count($pracownicy['bAdresy']) > 0) {
            $this->set('employees', [$pracownicy['bAdresy']]);
        }

        if ($this->request->getSession()->check('view_enter_after_add')) {
            $this->set('view_enter_after_add', true);
            $this->request->getSession()->delete('view_enter_after_add');
        } else {
            $this->set('view_enter', true);
        }
    }

    public function sprawdzWniosekEdycja()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('edytuj_wniosek');

        if ($this->request->is(array('post', 'put'))) {
            $data = $this->request->getData()['pWniosek'];
            $data['dat:Kod'] = $this->_string_2_array($data['dat:Kod']['dat2:NumerIGid']);

            if (isset($this->request->getData()['bZalacznik']) && !empty($this->request->getData()['bZalacznik'])) {
                foreach ($this->request->getData()['bZalacznik'] as $z) {
                    $file = $this->_zalaczniki_edycja($z, 'dat:', 'dat1:');
                    $data['dat:Zalaczniki'][] = $file['dat:Zalaczniki'];
                }
                unset($this->request->getData()['bZalacznik']);
            }

            if (isset($_FILES['data']['tmp_name']['file'])) {
                $this->_getZalaczniki($data['pWiadomosc']);

                unset($this->request->getData()['file']);
            }

            $data['dat:DataDo'] = $this->_date_for_request($data['dat:DataDo']);
            $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
            $data['dat:Godziny'] = $this->_time_for_request($data['dat:Godziny']);

            foreach (range(0, 6) as $i) {
                if (isset($data['dat:dodatkowaWartoscWyboru' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaWartoscWyboru' . $i] = $data['dat:dodatkowaWartoscWyboru' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaWartosc' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaWartosc' . $i] = $data['dat:dodatkowaWartosc' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaWartoscBool' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaWartoscBool' . $i] = $data['dat:dodatkowaWartoscBool' . $i . '_' . $data['Code']] ? 'true' : 'false';
                }
                if (isset($data['dat:dodatkowaData' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaData' . $i] = $data['dat:dodatkowaData' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaDataDo' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaDataDo' . $i] = $data['dat:dodatkowaDataDo' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaDataOd' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaDataOd' . $i] = $data['dat:dodatkowaDataOd' . $i . '_' . $data['Code']];
                }
            }

            unset($data['Code']);

            $response = $this->Api->TestujWniosek($this->_getGid(), $data);
            $this->set('response', $response);
            echo json_encode($response);
        }

        die();
    }

    public function sprawdzWniosek($nrEwid = null)
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is('post')) {
            if (empty($nrEwid)) {
                $nowyWniosekResponse = $this->Api->DajNowyWniosek($this->_getGid());
            } else {
                $nowyWniosekResponse = $this->Api->DajNowyWniosekDlaPodwladnego($this->_getGid(), (int)$nrEwid);
            }

            $jsonResp = $this->_handle_response_json($nowyWniosekResponse);
            if (isset($jsonResp['login'])) {
                echo json_encode($jsonResp);
            } else {
                $nowyWniosek = $nowyWniosekResponse['bWniosek'];
                $data = $this->request->getData('pWniosek');
                $data['dat:Kod'] = $this->_string_2_array($data['dat:Kod']['dat2:NumerIGid']);

                if (isset($_FILES['data']['tmp_name']['file'])) {
                    $this->_getZalaczniki($data);

                    unset($this->request->getData()['file']);
                }

                $data['dat:DataDo'] = $this->_date_for_request($data['dat:DataDo']);
                $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
                $data['dat:Gid'] = $nowyWniosek['bGid'];
                $data['dat:Godziny'] = $this->_time_for_request($data['dat:Godziny']);
                $data['dat:NumerEwidencyjny'] = (int)$nrEwid;

                foreach (range(0, 6) as $i) {
                    if (isset($data['dat:dodatkowaWartoscWyboru' . $i . '_' . $data['Code']])) {
                        $data['dat:dodatkowaWartoscWyboru' . $i] = $data['dat:dodatkowaWartoscWyboru' . $i . '_' . $data['Code']];
                    }
                    if (isset($data['dat:dodatkowaWartosc' . $i . '_' . $data['Code']])) {
                        $data['dat:dodatkowaWartosc' . $i] = $data['dat:dodatkowaWartosc' . $i . '_' . $data['Code']];
                    }
                    if (isset($data['dat:dodatkowaWartoscBool' . $i . '_' . $data['Code']])) {
                        $data['dat:dodatkowaWartoscBool' . $i] = $data['dat:dodatkowaWartoscBool' . $i . '_' . $data['Code']] ? 'true' : 'false';
                    }
                    if (isset($data['dat:dodatkowaData' . $i . '_' . $data['Code']])) {
                        $data['dat:dodatkowaData' . $i] = $data['dat:dodatkowaData' . $i . '_' . $data['Code']];
                    }
                    if (isset($data['dat:dodatkowaDataDo' . $i . '_' . $data['Code']])) {
                        $data['dat:dodatkowaDataDo' . $i] = $data['dat:dodatkowaDataDo' . $i . '_' . $data['Code']];
                    }
                    if (isset($data['dat:dodatkowaDataOd' . $i . '_' . $data['Code']])) {
                        $data['dat:dodatkowaDataOd' . $i] = $data['dat:dodatkowaDataOd' . $i . '_' . $data['Code']];
                    }
                }

                unset($data['Code']);

                $response = $this->Api->TestujWniosek($this->_getGid(), $data);
                $this->set('response', $response);

                echo json_encode($response);
            }
            die();
        }
        die();
    }

    /**
     * dodaj_wniosek method
     * @param string $start_location
     */
    public function dodajWniosek($start_location = null, $nrEwid = null)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('dodaj_wniosek');

        if (empty($nrEwid)) {
            $codes = $this->_daj_mozliwe_kody_wniosku();
        } else {
            $codes = $this->_daj_mozliwe_kody_wniosku_dla_podwladnego($nrEwid);
        }

        $pracaZdalna = [];
        $pracaZdalnaSaldo = [];
        $extensionCode = [];
        $codeList = [];
        $czyZastepca = [];
        $kody = $codes['bKody']['bKod'] ?? [];
        foreach ($kody as $key => $code) {
            $nrAndGid = array(
                'dat2:Gid' => $code['bGid'],
                'dat2:Numer' => $code['bNumer'],
                'dat2:Opis' => $code['bOpis'],
                'dat2:Symbol' => $code['bSymbol'],
                'dat2:CzyPotrzebnyPowod' => $code['bCzyPotrzebnyPowod'],
                'dat2:CzyPracaZdalna' => $code['bCzyPracaZdalna'],
                'dat2:CzyPracaZdalnaSaldo' => $code['bCzyPracaZdalnaSaldo'],
            );

            $codeList[$this->_array_2_string($nrAndGid)] = $code['bOpis'];
            if ($code['bCzyBezZastepcy'] === 'false') {
                $czyZastepca[] = $this->_array_2_string($nrAndGid);
            }
            if ($code['bCzyPracaZdalna'] === 'true') {
                $pracaZdalna[] = $this->_array_2_string($nrAndGid);
            }
            if ($code['bCzyPracaZdalnaSaldo'] === 'true') {
                $pracaZdalnaSaldo[] = $this->_array_2_string($nrAndGid);
            }

            // Definicja typów dodatkowych pól do przetworzenia
            // UWAGA: 'labelPrefix' to tylko prefiks, pełny klucz to 'labelPrefix' + indeks + 'Tekst'
            $fieldTypes = [
                'wartosc' => [
                    'name' => 'dodatkowaWartosc',
                    'labelPrefix' => 'bDodatkowaWartosc',
                    'type' => 'text'
                ],
                'wartoscWyboru' => [
                    'name' => 'dodatkowaWartoscWyboru',
                    'labelPrefix' => 'bDodatkowaWartoscWyboru',
                    'optionsPrefix' => 'bDodatkowaWartoscWyboru', // bez 'Mozliwe' na końcu!
                    'type' => 'select'
                ],
                'data' => [
                    'name' => 'dodatkowaData',
                    'labelPrefix' => 'bDodatkowaData',
                    'type' => 'date'
                ],
                'dataOd' => [
                    'name' => 'dodatkowaDataOd',
                    'labelPrefix' => 'bDodatkowaDataOdDo',
                    'type' => 'date'
                ],
                'dataDo' => [
                    'name' => 'dodatkowaDataDo',
                    'labelPrefix' => 'bDodatkowaDataOdDo',
                    'type' => 'date'
                ],
                'wartoscBool' => [
                    'name' => 'dodatkowaWartoscBool',
                    'labelPrefix' => 'bDodatkowaWartoscBool',
                    'type' => 'checkbox'
                ],
                'dodatkowyNapis' => [
                    'name' => 'dodatkowyNapis',
                    'labelPrefix' => 'bDodatkowyNapis',
                    'type' => 'textField'
                ]
            ];

            foreach (range(0, 6) as $i) {
                $hasAnyField = false;

                // Sprawdzenie czy istnieje jakiekolwiek pole dla tego indeksu
                foreach ($fieldTypes as $fieldType => $config) {
                    $prefix = match ($config['name']) {
                        'dodatkowaDataOd' => 'bDodatkowaDataOd',
                        'dodatkowaDataDo' => 'bDodatkowaDataDo',
                        default => $config['labelPrefix'],
                    };

                    $suffix = ($prefix === 'bDodatkowyNapis') ? 'Text' : 'Tekst';
                    $labelKey = $prefix . $i . $suffix;

                    if (!empty($code[$labelKey])) {
                        $hasAnyField = true;
                        break;
                    }
                }

                if (!$hasAnyField) {
                    continue;
                }

                // Przetwarzanie każdego typu pola
                foreach ($fieldTypes as $fieldType => $config) {
                    $prefix = match ($config['name']) {
                        'dodatkowaDataOd' => 'bDodatkowaDataOd',
                        'dodatkowaDataDo' => 'bDodatkowaDataDo',
                        default => $config['labelPrefix'],
                    };

                    $suffix = ($prefix === 'bDodatkowyNapis') ? 'Text' : 'Tekst';
                    $labelKey = $prefix . $i . $suffix;

                    if (empty($code[$labelKey])) {
                        continue;
                    }

                    $fieldData = [
                        'typ' => $config['type'],
                        'czyWymagany' => $code[$config['labelPrefix'] . $i . 'CzyWymagana'] ?? 'false',
                        'readonly' => $code[$config['labelPrefix'] . $i . 'CzyTylkoDoOdczytu'] ?? 'false',
                        'label' => $code[$labelKey],
                        'indeks' => $code[$config['labelPrefix'] . $i . 'Indeks'] ?? 0,
                        'codeKey' => $key,
                        'code' => $this->_array_2_string($nrAndGid),
                        'inputName' => $config['name'] . $i,
                    ];

                    // Dodanie opcji dla pól select
                    if ($config['type'] === 'select') {
                        $optionsKey = $config['optionsPrefix'] . $i . 'Mozliwe';
                        $mozliweWartosci = [];
                        if (!empty($code[$optionsKey]['cstring'])) {
                            foreach ($code[$optionsKey]['cstring'] as $string) {
                                $mozliweWartosci[$string] = $string;
                            }
                        }
                        $fieldData['opcje'] = $mozliweWartosci;
                    }

                    $extensionCode[] = $fieldData;
                }
            }
        }

        // Sortowanie pól dodatkowych według indeksu
        usort($extensionCode, function ($a, $b) {
            return ($a['indeks'] ?? 0) <=> ($b['indeks'] ?? 0);
        });

        $this->set('codes', $codeList);
        $this->set('czyZastepca', $czyZastepca);
        $this->set(compact('pracaZdalna', 'pracaZdalnaSaldo', 'extensionCode'));

        // Initialize $saldo to avoid undefined variable warning
        $saldo = null;

        if (!$this->request->is(array('post', 'put'))) {
            $thisYear = new \DateTime();
            $thisYear = (int)$thisYear->format('Y');
            $userNrEwId = $this->Auth->user('cNumerEwidencyjny');
            if (!empty($nrEwid)) {
                $userNrEwId = $nrEwid;
            }

            $saldoOptions = array(
                'dat:Lata' => array(
                    0 => array(
                        'arr:int' => $thisYear
                    )
                ),
                'dat:NumerPracownika' => $userNrEwId
            );
            $saldo = $this->_saldo_urlopu_5($nrEwid);
            $this->set('nrEwid', $nrEwid);
//			$this->set('eplo', $this->Api->DajDaneOsobowe($nrEwid));
            $this->set(compact('saldo'));
        }

        $resp = $this->_handle_response_json($saldo);
        $this->set(compact('resp'));
        $this->set(compact('start_location'));

        if (empty($nrEwid)) {
            $nowyWniosekResponse = $this->Api->DajNowyWniosek($this->_getGid());
        } else {
            $nowyWniosekResponse = $this->Api->DajNowyWniosekDlaPodwladnego($this->_getGid(), (int)$nrEwid);
        }

        $jsonResp = $this->_handle_response_json($nowyWniosekResponse);
        if (isset($jsonResp['login']) && !empty($jsonResp['login'])) {
            echo 'login';
            die();
        }

        $nowyWniosek = $nowyWniosekResponse['bWniosek'] ?? [];
        $knG = empty($nowyWniosekResponse['bKodyNieobecnosciGodzinowych']['cstring']) ? array() : explode("-", (string)$nowyWniosekResponse['bKodyNieobecnosciGodzinowych']['cstring']);
        //$mozliwePowody = empty($nowyWniosek['bMozliwePowody']['cstring']) ? array() : array_combine(array_values($nowyWniosek['bMozliwePowody']['cstring']),$nowyWniosek['bMozliwePowody']['cstring']);
        $mozliwePowody = empty($nowyWniosek['bMozliwePowody']['cstring']) ? array() : $nowyWniosek['bMozliwePowody']['cstring'];
        $mozliwePodlegli = ($nowyWniosekResponse['bCzyMozeSkladacZaPodleglego'] ?? '') === 'true' ? 1 : 0;
        $this->set(compact('nowyWniosek', 'knG', 'mozliwePowody', 'mozliwePodlegli'));

        if ($this->request->is('post')) {
            $data = $this->request->getData('pWniosek');

            foreach (range(0, 6) as $i) {
                if (isset($data['dat:dodatkowaWartoscWyboru' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaWartoscWyboru' . $i] = $data['dat:dodatkowaWartoscWyboru' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaWartosc' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaWartosc' . $i] = $data['dat:dodatkowaWartosc' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaWartoscBool' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaWartoscBool' . $i] = $data['dat:dodatkowaWartoscBool' . $i . '_' . $data['Code']] ? 'true' : 'false';
                }
                if (isset($data['dat:dodatkowaData' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaData' . $i] = $data['dat:dodatkowaData' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaDataDo' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaDataDo' . $i] = $data['dat:dodatkowaDataDo' . $i . '_' . $data['Code']];
                }
                if (isset($data['dat:dodatkowaDataOd' . $i . '_' . $data['Code']])) {
                    $data['dat:dodatkowaDataOd' . $i] = $data['dat:dodatkowaDataOd' . $i . '_' . $data['Code']];
                }
            }

            unset($data['Code']);

            $data['dat:Kod'] = $this->_string_2_array($data['dat:Kod']['dat2:NumerIGid']);

            $filesCounter = 0;
            if (isset($_FILES['data']['tmp_name']['file'])) {
                $filesCounter = $this->_getZalaczniki($data);

                unset($this->request->getData()['file']);
            }
            $data['dat:IloscDodanychZalacznikow'] = $filesCounter;
            $data['dat:DataDo'] = $this->_date_for_request($data['dat:DataDo']);
            $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
            $data['dat:Gid'] = $nowyWniosek['bGid'];
            $data['dat:Godziny'] = $this->_time_for_request($data['dat:Godziny']);
            $data['dat:NumerEwidencyjny'] = (int)$nrEwid;

            $response = $this->_zapisz_wniosek($data);

            $this->request->getSession()->write('view_enter_after_add', true);

            $this->set('response', $response);

            /*if($this->_handle_response($response))
            {
                return $this->redirect(array('action' => 'wnioski'));
            }*/

            echo json_encode($this->_handle_response_json($response));
            die();
        }
    }

    public function zmienHaslo($bGid = NULL)
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is(array('post', 'put'))) {
            $data['dat:CzyHasloPakowaniaPlikow'] = true;
            $data['dat:HasloPakowaniaPlikow'] = $this->request->getData('password');
            $response = $this->Api->AktualizujAdresyEmailIHaslo($this->_getGid(), $data);
            $this->set('response', $response);
            echo json_encode($this->_handle_response_json($response));
            die();
        }

    }

    public function zmienAdresyEmail($bGid = NULL)
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is(array('post', 'put'))) {
            $req = $this->request->getData();
            $data = [];
            $data['dat:CzyAktualizacjaAdresowEmail'] = true;
            $data['dat:EmailOgolny'] = $req['bEmailOgolny'];
            $data['dat:EmailOdcinki'] = $req['bEmailOdcinki'];
            $data['dat:EmailPIT'] = $req['bEmailPIT'];
            $response = $this->Api->AktualizujAdresyEmailIHaslo($this->_getGid(), $data);
            $this->set('response', $response);
            echo json_encode($this->_handle_response_json($response));
            die();
        }
    }

    /**
     * pracownicy method
     */
    public function pracownicy()
    {
        $this->viewBuilder()->setLayout('ajax');

        $employees = $this->Api->DajListePracownikow($this->_getGid(), true);
        $resp = $this->_handle_response_json($employees);
        $this->set(compact('resp'));

        $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');

        if (isset($employees['bPracownicy']['bPracownik']) && !empty($employees['bPracownicy']['bPracownik'])) {
            foreach ($employees['bPracownicy']['bPracownik'] as &$employee) {
                $employee = $this->_convert_to_date_array($employee, array('bAngazDo', 'bAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
            }
        }
        $this->set(compact('employees'));
    }

    /**
     * pracownicy_zastepstwa method
     */
    public function pracownicyZastepstwa()
    {
        $this->viewBuilder()->setLayout('ajax');

        $employees = $this->Api->DajListePracownikow($this->_getGid(), true, true);
        $resp = $this->_handle_response_json($employees);
        $this->set(compact('resp'));

        $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');

        if (isset($employees['bPracownicy']['bPracownik']) && !empty($employees['bPracownicy']['bPracownik'])) {
            foreach ($employees['bPracownicy']['bPracownik'] as &$employee) {
                $employee = $this->_convert_to_date_array($employee, array('bAngazDo', 'bAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
            }
        }
        $this->set(compact('employees'));
        $this->viewBuilder()->setTemplate('pracownicy');
    }


    public function dajLiczbePracownikow()
    {
        $employees = $this->Api->DajListePracownikow($this->_getGid(), true);
        if (isset($employees['bPracownicy']) and $employees['bPracownicy']) {
            $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');
        }
        if (isset($employees['bPracownicy']['bPracownik']) && !empty($employees['bPracownicy']['bPracownik'])) {
            foreach ($employees['bPracownicy']['bPracownik'] as &$employee) {
                $employee = $this->_convert_to_date_array($employee, array('bAngazDo', 'bAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
            }
        }

        return isset($employees['bPracownicy']['bPracownik']) ? count($employees['bPracownicy']['bPracownik']) : 0;
    }

    public function dajLiczbePracownikowZastepstwa()
    {
        $employees = $this->Api->DajListePracownikow($this->_getGid(), true, true);
        $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');

        if (isset($employees['bPracownicy']['bPracownik']) && !empty($employees['bPracownicy']['bPracownik'])) {
            foreach ($employees['bPracownicy']['bPracownik'] as &$employee) {
                $employee = $this->_convert_to_date_array($employee, array('bAngazDo', 'bAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
            }
        }

        return isset($employees['bPracownicy']['bPracownik']) ? count($employees['bPracownicy']['bPracownik']) : 0;
    }

    /**
     *
     */
    public function pracownicyKadry()
    {
        $this->viewBuilder()->setLayout('ajax');

        $employees = $this->Api->DajListePracownikow($this->_getGid(), true);

        $resp = $this->_handle_response_json($employees);
        $this->set(compact('resp'));

        $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');

        if (isset($employees['bPracownicy']['bPracownik']) && !empty($employees['bPracownicy']['bPracownik'])) {
            foreach ($employees['bPracownicy']['bPracownik'] as &$employee) {
                $employee = $this->_convert_to_date_array($employee, array('bAngazDo', 'bAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
            }
        }

        $this->set(compact('employees'));

        $xpl = explode('?', (string)$this->request->getQuery('a'));
        $this->set('a_action', $xpl[0]);
    }

    public function pracownicyKadryZastepstwa()
    {
        $this->viewBuilder()->setLayout('ajax');

        $employees = $this->Api->DajListePracownikow($this->_getGid(), true, true);

        $resp = $this->_handle_response_json($employees);
        $this->set(compact('resp'));

        $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');

        if (isset($employees['bPracownicy']['bPracownik']) && !empty($employees['bPracownicy']['bPracownik'])) {
            foreach ($employees['bPracownicy']['bPracownik'] as &$employee) {
                $employee = $this->_convert_to_date_array($employee, array('bAngazDo', 'bAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
            }
        }

        $this->set(compact('employees'));
        $this->viewBuilder()->setTemplate('pracownicy_kadry');
    }

    /**
     *
     */
    public function pracownicyPlace()
    {
        $this->viewBuilder()->setLayout('ajax');

        $employees = $this->Api->DajListePracownikow($this->_getGid(), true);

        $resp = $this->_handle_response_json($employees);
        $this->set(compact('resp'));

        $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');

        if (isset($employees['bPracownicy']['bPracownik']) && !empty($employees['bPracownicy']['bPracownik'])) {
            foreach ($employees['bPracownicy']['bPracownik'] as &$employee) {
                $employee = $this->_convert_to_date_array($employee, array('bAngazDo', 'bAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
            }
        }

        $this->set(compact('employees'));
    }

    /**
     *
     */
    public function pracownicyGrafik()
    {
        $this->viewBuilder()->setLayout('ajax');

        $employees = $this->Api->DajListePracownikow($this->_getGid(), true);

        $resp = $this->_handle_response_json($employees);
        $this->set(compact('resp'));

        $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');

        if (isset($employees['bPracownicy']['bPracownik']) && !empty($employees['bPracownicy']['bPracownik'])) {
            foreach ($employees['bPracownicy']['bPracownik'] as &$employee) {
                $employee = $this->_convert_to_date_array($employee, array('bAngazDo', 'bAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
            }
        }

        $this->set(compact('employees'));
    }

    /**
     *
     */
    public function pracownicyOdbicia()
    {
        $this->viewBuilder()->setLayout('ajax');

        $employees = $this->Api->DajListePracownikow($this->_getGid(), true);

        $resp = $this->_handle_response_json($employees);
        $this->set(compact('resp'));

        $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');

        if (isset($employees['bPracownicy']['bPracownik']) && !empty($employees['bPracownicy']['bPracownik'])) {
            foreach ($employees['bPracownicy']['bPracownik'] as &$employee) {
                $employee = $this->_convert_to_date_array($employee, array('bAngazDo', 'bAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
            }
        }

        $this->set(compact('employees'));
    }

    public function pracownicyGrafikZastepstwa()
    {
        $this->viewBuilder()->setLayout('ajax');

        $employees = $this->Api->DajListePracownikow($this->_getGid(), true, true);

        $resp = $this->_handle_response_json($employees);
        $this->set(compact('resp'));

        $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');

        if (isset($employees['bPracownicy']['bPracownik']) && !empty($employees['bPracownicy']['bPracownik'])) {
            foreach ($employees['bPracownicy']['bPracownik'] as &$employee) {
                $employee = $this->_convert_to_date_array($employee, array('bAngazDo', 'bAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
            }
        }

        $this->set(compact('employees'));
        $this->viewBuilder()->setTemplate('pracownicy_grafik');
    }

    /**
     *
     */
    public function pracownicyWnioski()
    {
        $this->viewBuilder()->setLayout('ajax');
    }

    /**
     * pracownicyWnioskiKadrowe method
     * Displays list of employee HR requests for manager approval
     */
    public function pracownicyWnioskiKadrowe()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('wnioski_kadrowe');

        $uprawnienia = $this->_daj_uprawnienia_wnioskow_kadrowych();
        $uprawnienia['bCzyTrybPodleglych'] = true;
        $this->set(compact('uprawnienia'));
    }

    /**
     * pracownicy_bhp method
     * Displays BHP information for employees
     */
    public function pracownicyBhp()
    {
        $this->viewBuilder()->setLayout('ajax');

        $options['ZMetody'] = 'ListaOdziezy.Podlegli';

        $employees = $this->Api->DajListePracownikow($this->_getGid(), true, false, $options);
        $resp = $this->_handle_response_json($employees);
        $this->set(compact('resp'));

        $employees['bPracownicy'] = $this->_convert_list_response($employees['bPracownicy'], 'bPracownik');

        if (isset($employees['bPracownicy']['bPracownik']) && !empty($employees['bPracownicy']['bPracownik'])) {
            foreach ($employees['bPracownicy']['bPracownik'] as &$employee) {
                $employee = $this->_convert_to_date_array($employee, array('bAngazDo', 'bAngazDo', 'bDataPrzyjecia', 'bDataZwolnienia'));
            }
        }
        $this->set(compact('employees'));
    }

    /**
     * zastepstwa method
     *
     */
    public function zastepstwa()
    {
        $this->viewBuilder()->setLayout('ajax');

        $replacements = $this->_daj_liste_zastepstw();

        $resp = $this->_handle_response_json($replacements);
        $this->set(compact('resp'));

        if (!empty($replacements['bZastepstwa'])) {
            $this->_convert_list_response($replacements['bZastepstwa'], 'bZastepstwo');
            foreach ($replacements['bZastepstwa']['bZastepstwo'] as &$replacement) {
                unset($replacement['bUprawnienia']);
                unset($replacement['bUprawnieniaMaska']);
                $replacement = $this->_convert_to_date_array($replacement, array('bDataOd', 'bDataDo'));
            }
            $replacements = $this->_replace_empty_values($replacements);
            $this->set('replacements', $replacements['bZastepstwa']['bZastepstwo']);
        }
    }

    /**
     *
     */
    public function dodajZastepstwo()
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is('post')) {

            $this->viewBuilder()->setTemplate(null);

            $data = array();
            $data['tem:pZastepstwo']['dat:DataDo'] = $this->request->getData('tem:pZastepstwo')['dat:DataDo'];
            $data['tem:pZastepstwo']['dat:DataOd'] = $this->request->getData('tem:pZastepstwo')['dat:DataOd'];
            $data['tem:pZastepstwo']['dat:GidZastepowanego'] = $this->request->getData('tem:pZastepstwo')['dat:GidZastepowanego'];
            $data['tem:pZastepstwo']['dat:GidZastepujacego'] = $this->request->getData('tem:pZastepstwo')['dat:GidZastepujacego'];
            foreach ($this->request->getData('tem:pZastepstwo')['dat:Uprawnienia']['dat1:Modul'] as $key => &$module) {
                if (isset($module['dat1:CzyUruchamianieZastepstwo'])) {
                    if ($module['dat1:CzyUruchamianieZastepstwo'] == '0') {
                        $module['dat1:CzyUruchamianieZastepstwo'] = 'false';
                    } else if ($module['dat1:CzyUruchamianieZastepstwo'] == '1') {
                        $module['dat1:CzyUruchamianieZastepstwo'] = 'true';
                    }
                    if ($module['dat1:CzyDodawanieZastepstwo'] == '0') {
                        $module['dat1:CzyDodawanieZastepstwo'] = 'false';
                    } else if ($module['dat1:CzyDodawanieZastepstwo'] == '1') {
                        $module['dat1:CzyDodawanieZastepstwo'] = 'true';
                    }
                    if ($module['dat1:CzyUsuwanieZastepstwo'] == '0') {
                        $module['dat1:CzyUsuwanieZastepstwo'] = 'false';
                    } else if ($module['dat1:CzyUsuwanieZastepstwo'] == '1') {
                        $module['dat1:CzyUsuwanieZastepstwo'] = 'true';
                    }
                    if ($module['dat1:CzyEdycjaZastepstwo'] == '0') {
                        $module['dat1:CzyEdycjaZastepstwo'] = 'false';
                    } else if ($module['dat1:CzyEdycjaZastepstwo'] == '1') {
                        $module['dat1:CzyEdycjaZastepstwo'] = 'true';
                    }
                }
                if (empty($module['dat1:Gid'])) {
                    continue;
                }
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyDodawanie'] = $module['dat1:CzyDodawanie'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyDodawanieDotyczy'] = $module['dat1:CzyDodawanieDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyDodawanieGrupa'] = $module['dat1:CzyDodawanieGrupa'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyDodawanieGrupaDotyczy'] = $module['dat1:CzyDodawanieGrupaDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyDodawanieZastepstwo'] = $module['dat1:CzyDodawanieZastepstwo'];

                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyEdycja'] = $module['dat1:CzyEdycja'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyEdycjaDotyczy'] = $module['dat1:CzyEdycjaDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyEdycjaGrupa'] = $module['dat1:CzyEdycjaGrupa'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyEdycjaGrupaDotyczy'] = $module['dat1:CzyEdycjaGrupaDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyEdycjaZastepstwo'] = $module['dat1:CzyEdycjaZastepstwo'];

                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyModulAdministracyjny'] = $module['dat1:CzyModulAdministracyjny'];

                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUruchamianie'] = $module['dat1:CzyUruchamianie'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUruchamianieDotyczy'] = $module['dat1:CzyUruchamianieDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUruchamianieGrupa'] = $module['dat1:CzyUruchamianieGrupa'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUruchamianieGrupaDotyczy'] = $module['dat1:CzyUruchamianieGrupaDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUruchamianieZastepstwo'] = $module['dat1:CzyUruchamianieZastepstwo'];

                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUsuwanie'] = $module['dat1:CzyUsuwanie'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUsuwanieDotyczy'] = $module['dat1:CzyUsuwanieDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUsuwanieGrupa'] = $module['dat1:CzyUsuwanieGrupa'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUsuwanieGrupaDotyczy'] = $module['dat1:CzyUsuwanieGrupaDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUsuwanieZastepstwo'] = $module['dat1:CzyUsuwanieZastepstwo'];

                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:Gid'] = $module['dat1:Gid'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:MozliweUprawnienia'] = $module['dat1:MozliweUprawnienia'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:Nazwa'] = $module['dat1:Nazwa'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:Opis'] = $module['dat1:Opis'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:SciezkaGid'] = $module['dat1:SciezkaGid'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:SciezkaNazw'] = $module['dat1:SciezkaNazw'];
                if ($module['dat1:Wciecie'] !== null) {
                    $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:Wciecie'] = $module['dat1:Wciecie'];
                }
            }
            $data['tem:pZastepstwo']['dat:Zastepowany'] = $this->request->getData()['tem:pZastepstwo']['dat:Zastepowany'];
            $data['tem:pZastepstwo']['dat:Zastepujacy'] = $this->request->getData()['tem:pZastepstwo']['dat:Zastepujacy'];
            $data = $this->_replace_empty_values($data, '');
            /*if($this->_handle_response())
            {
                $this->redirect(array('action' => 'zastepstwa'));
            } else {

            }*/

            $response = $this->_dodaj_zastepstwo($data);
            echo json_encode($this->_handle_response_json($response));
            die();
        }

        $modules = $this->_daj_moduly(null, $this->_getUserGid());
        $replacement = $this->Api->DajNoweZastepstwo($this->_getGid());

        $resp = $this->_handle_response_json($modules);
        $this->set(compact('resp'));

        $modules['bModuly'] = $this->_convert_list_response($modules['bModuly'], 'bModul');
        $modules = $this->_rename_array_key_prefixes_recursive($modules, array('b'), array('dat1:'));
        $this->set('modules', $modules);
        $this->set('czyMozeWybracZastepujacego', $replacement['bCzyMozeWybracZastepujacego']);
        $this->set('czyOdebranaMozliwoscWyboruUprawnien', $replacement['bCzyOdebranaMozliwoscWyboruUprawnien']);

        $value['dat:Gid'] = $replacement['bZastepstwo']['bGid'];
        $value['dat:GidZastepowanego'] = $replacement['bZastepstwo']['bGidZastepowanego'];
        $value['dat:GidZastepujacego'] = $replacement['bZastepstwo']['bGidZastepujacego'];
        $value['dat:Uprawnienia']['dat1:Modul'] = $modules['dat1:Moduly']['dat1:Modul'];

        $this->request = $this->request->withData('tem:pZastepstwo', $value);
    }

    /**
     * zastepstwo method
     * @param $gid string|null
     * @return null
     */
    public function zastepstwo($gid)
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is('post')) {

            $this->viewBuilder()->setTemplate(null);

            $data = array();

            $data['tem:pZastepstwo']['dat:DataDo'] = $this->request->getData('tem:pZastepstwo')['dat:DataDo'];
            $data['tem:pZastepstwo']['dat:DataOd'] = $this->request->getData('tem:pZastepstwo')['dat:DataOd'];
            $data['tem:pZastepstwo']['dat:Gid'] = $this->request->getData('tem:pZastepstwo')['dat:Gid'];
            $data['tem:pZastepstwo']['dat:GidZastepowanego'] = $this->request->getData('tem:pZastepstwo')['dat:GidZastepowanego'];
            $data['tem:pZastepstwo']['dat:GidZastepujacego'] = $this->request->getData('tem:pZastepstwo')['dat:GidZastepujacego'];
            foreach ($this->request->getData('tem:pZastepstwo')['dat:Uprawnienia']['dat1:Modul'] as $key => &$module) {
                if (isset($module['dat1:CzyUruchamianieZastepstwo'])) {
                    if ($module['dat1:CzyUruchamianieZastepstwo'] == '0') {
                        $module['dat1:CzyUruchamianieZastepstwo'] = 'false';
                    } else if ($module['dat1:CzyUruchamianieZastepstwo'] == '1') {
                        $module['dat1:CzyUruchamianieZastepstwo'] = 'true';
                    }
                }
                if (empty($module['dat1:Gid'])) {
                    continue;
                }
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyDodawanie'] = $module['dat1:CzyDodawanie'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyDodawanieDotyczy'] = $module['dat1:CzyDodawanieDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyDodawanieGrupa'] = $module['dat1:CzyDodawanieGrupa'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyDodawanieGrupaDotyczy'] = $module['dat1:CzyDodawanieGrupaDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyDodawanieZastepstwo'] = $module['dat1:CzyDodawanieZastepstwo'];

                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyEdycja'] = $module['dat1:CzyEdycja'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyEdycjaDotyczy'] = $module['dat1:CzyEdycjaDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyEdycjaGrupa'] = $module['dat1:CzyEdycjaGrupa'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyEdycjaGrupaDotyczy'] = $module['dat1:CzyEdycjaGrupaDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyEdycjaZastepstwo'] = $module['dat1:CzyEdycjaZastepstwo'];

                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyModulAdministracyjny'] = $module['dat1:CzyModulAdministracyjny'];

                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUruchamianie'] = $module['dat1:CzyUruchamianie'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUruchamianieDotyczy'] = $module['dat1:CzyUruchamianieDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUruchamianieGrupa'] = $module['dat1:CzyUruchamianieGrupa'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUruchamianieGrupaDotyczy'] = $module['dat1:CzyUruchamianieGrupaDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUruchamianieZastepstwo'] = $module['dat1:CzyUruchamianieZastepstwo'];

                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUsuwanie'] = $module['dat1:CzyUsuwanie'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUsuwanieDotyczy'] = $module['dat1:CzyUsuwanieDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUsuwanieGrupa'] = $module['dat1:CzyUsuwanieGrupa'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUsuwanieGrupaDotyczy'] = $module['dat1:CzyUsuwanieGrupaDotyczy'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:CzyUsuwanieZastepstwo'] = $module['dat1:CzyUsuwanieZastepstwo'];

                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:Gid'] = $module['dat1:Gid'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:MozliweUprawnienia'] = $module['dat1:MozliweUprawnienia'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:Nazwa'] = $module['dat1:Nazwa'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:Opis'] = $module['dat1:Opis'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:SciezkaGid'] = $module['dat1:SciezkaGid'];
                $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:SciezkaNazw'] = $module['dat1:SciezkaNazw'];
                if ($module['dat1:Wciecie'] !== null) {
                    $data['tem:pZastepstwo']['dat:Uprawnienia'][$key]['dat1:Modul']['dat1:Wciecie'] = $module['dat1:Wciecie'];
                }
            }
            $data['tem:pZastepstwo']['dat:Zastepowany'] = $this->request->getData('tem:pZastepstwo')['dat:Zastepowany'];
            $data['tem:pZastepstwo']['dat:Zastepujacy'] = $this->request->getData('tem:pZastepstwo')['dat:Zastepujacy'];
            $data = $this->_unset_empty_values($data);

            $response = $this->_edytuj_zastepstwo($data);

            echo json_encode($this->_handle_response_json($response));
            die();
        }

        $replacement = $this->_daj_zastepstwo($gid);
        $resp = $this->_handle_response_json($replacement);
        $this->set(compact('resp'));

        $this->set('czyMozeWybracZastepujacego', $replacement['bCzyMozeWybracZastepujacego']);

        $replacement['bZastepstwo'] = $this->_convert_to_date_array($replacement['bZastepstwo'], array('bDataOd', 'bDataDo'));
        $replacement_keys_renamed = $this->_rename_array_key_prefixes_recursive($replacement['bZastepstwo'], array('b', 'c'), array('dat:', 'dat1:'));
        $replacement_keys_renamed['dat:Zastepowany'] = $this->_rename_array_key_prefixes_recursive($replacement['bZastepstwo']['bZastepowany'], array('c'), array('dat2:'));
        $replacement_keys_renamed['dat:Zastepujacy'] = $this->_rename_array_key_prefixes_recursive($replacement['bZastepstwo']['bZastepujacy'], array('c'), array('dat2:'));
        $this->request = $this->request->withData('tem:pZastepstwo', $replacement_keys_renamed);
    }


    /**
     * @param $gid
     */
    public function usunZastepstwo($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);
        if ($this->request->is(array('post', 'put'))) {
            $response = $this->Api->UsunZastepstwo($this->_getGid(), $gid);
            echo json_encode($this->_handle_response_json($response));
        }
        die();
    }

    /**
     *
     */
    public function dodajRole()
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is('post')) {
            $this->viewBuilder()->setTemplate(null);

            $value = [];
            ($this->request->getData()['tem:pRola']['dat:CzyUkryta'] == '0') ? $value['dat:CzyUkryta'] = 'false' : $value['dat:CzyUkryta'] = 'true';
            ($this->request->getData()['tem:pRola']['dat:CzyWbudowana'] == '0') ? $value['dat:CzyWbudowana'] = 'false' : $value['dat:CzyWbudowana'] = 'true';
            ($this->request->getData()['tem:pRola']['dat:CzyZaznaczenie'] == '0') ? $value['dat:CzyZaznaczenie'] = 'false' : $value['dat:CzyZaznaczenie'] = 'true';

            $this->request = $this->request->withData('tem:pRola', array_merge($this->request->getData('tem:pRola'), $value));

            $response = $this->_dodaj_role($this->request->getData());
            if ($this->_handle_response($response)) {
                echo json_encode($this->_handle_response_json($response));
            } else {
                echo json_encode($this->_handle_response_json($response));
            }
            die;
        }
    }

    /**
     * @param $gid string
     */
    public function edytujRole($gid)
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is('post')) {
            $this->viewBuilder()->setTemplate(null);

            $value = [];

            ($this->request->getData('tem:pRola')['dat:CzyUkryta'] == '0') ? $value['dat:CzyUkryta'] = 'false' : $value['dat:CzyUkryta'] = 'true';
            ($this->request->getData('tem:pRola')['dat:CzyWbudowana'] == '0') ? $value['dat:CzyWbudowana'] = 'false' : $value['dat:CzyWbudowana'] = 'true';
            ($this->request->getData('tem:pRola')['dat:CzyZaznaczenie'] == '0') ? $value['dat:CzyZaznaczenie'] = 'false' : $value['dat:CzyZaznaczenie'] = 'true';

            $this->request = $this->request->withData('tem:pRola', array_merge($this->request->getData('tem:pRola'), $value));

            $response = $this->_edytuj_role($this->request->getData());
            echo json_encode($this->_handle_response_json($response));
            die;
        } else {
            $getRole = $this->_daj_role_pojedyncza($gid);

            $resp = $this->_handle_response_json($getRole);
            $this->set(compact('resp'));

            $role['tem:pRola'] = $this->_rename_array_key_prefixes($getRole['bRola'], 'b', 'dat:');
            $role = $this->_replace_empty_values($role, '');
            $this->request = $this->request->withData('tem:pRola', $role['tem:pRola']);
        }
    }

    /**
     * @param $gid string
     */
    public function uprawnieniaRoli($gid)
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is('post')) {

            $data = array();
            $dataJson = json_decode($this->request->getData()['content'], true);

            foreach ($dataJson as $key => $val) {
                $str = '&' . $val['name'] . '=' . $val['value'];
                parse_str($str, $arr);

//                // Check if arrays are suitable for array_intersect_assoc (no nested arrays)
//                $isFlatData = $this->_is_flat_array($data);
//                $isFlatArr = $this->_is_flat_array($arr);
//
//                if ($isFlatData && $isFlatArr) {
                $diff = array_intersect_assoc($data, $arr);
//                } else {
//                    $diff = [];
//                }

                $a = $this->_show_keys($arr);

                if (isset($diff[$a[3]][$a[2]][$a[1]])) {
                    $data[$a[3]][$a[2]][$a[1]][$a[0]] = $val['value'];
                } else {
                    $data = array_merge_recursive($data, $arr);
                }
            }

            $this->viewBuilder()->setTemplate(null);

            $newData = [
                'tem:pZadanie' => [],
            ];

            if ($dataJson[0]['name'] === 'dat:GidRoli') {
                $newData['tem:pZadanie'] = [
                    'dat:GidRoli' => $dataJson[0]['value'],
                ];
            }

            foreach ($data['dat:Moduly']['dat:Modul'] as $key => &$module) {
                if (!empty($module['dat:Gid'])) {
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyDodawanie'] = $module['dat:CzyDodawanie'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyDodawanieDotyczy'] = $module['dat:CzyDodawanieDotyczy'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyDodawanieGrupa'] = $module['dat:CzyDodawanieGrupa'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyDodawanieGrupaDotyczy'] = $module['dat:CzyDodawanieGrupaDotyczy'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyDodawanieZastepstwo'] = $module['dat:CzyDodawanieZastepstwo'];

                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyEdycja'] = $module['dat:CzyEdycja'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyEdycjaDotyczy'] = $module['dat:CzyEdycjaDotyczy'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyEdycjaGrupa'] = $module['dat:CzyEdycjaGrupa'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyEdycjaGrupaDotyczy'] = $module['dat:CzyEdycjaGrupaDotyczy'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyEdycjaZastepstwo'] = $module['dat:CzyEdycjaZastepstwo'];

                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyModulAdministracyjny'] = $module['dat:CzyModulAdministracyjny'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyNiedostepny'] = $module['dat:CzyNiedostepny'];

                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyUruchamianie'] = $module['dat:CzyUruchamianie'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyUruchamianieDotyczy'] = $module['dat:CzyUruchamianieDotyczy'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyUruchamianieGrupa'] = $module['dat:CzyUruchamianieGrupa'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyUruchamianieGrupaDotyczy'] = $module['dat:CzyUruchamianieGrupaDotyczy'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyUruchamianieZastepstwo'] = $module['dat:CzyUruchamianieZastepstwo'];

                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyUsuwanie'] = $module['dat:CzyUsuwanie'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyUsuwanieDotyczy'] = $module['dat:CzyUsuwanieDotyczy'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyUsuwanieGrupa'] = $module['dat:CzyUsuwanieGrupa'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyUsuwanieGrupaDotyczy'] = $module['dat:CzyUsuwanieGrupaDotyczy'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:CzyUsuwanieZastepstwo'] = $module['dat:CzyUsuwanieZastepstwo'];

                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:Gid'] = $module['dat:Gid'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:MozliweUprawnienia'] = $module['dat:MozliweUprawnienia'];
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:Nazwa'] = $module['dat:Nazwa'] ?? null;
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:Opis'] = $module['dat:Opis'] ?? null;
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:SciezkaGid'] = $module['dat:SciezkaGid'] ?? null;
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:SciezkaNazw'] = $module['dat:SciezkaNazw'] ?? null;
                    $newData['tem:pZadanie']['dat:Moduly'][$key]['dat:Modul']['dat:Wciecie'] = $module['dat:Wciecie'] ?? null;
                }

            }

            $response = $this->_uprawnienia_roli($newData);

            echo json_encode($this->_handle_response_json($response));

            die();
        }

        $modules = $this->_daj_moduly($gid);

        $modules['bModuly'] = $this->_convert_list_response($modules['bModuly'], 'bModul');
        $modules = $this->_rename_array_key_prefixes_recursive($modules, array('b'), array('dat:'));
        $pZadanie = [
            'dat:GidRoli' => $gid,
            'dat:Moduly' => $modules['dat:Moduly'],
        ];
        $role = $this->Api->DajRole($this->_getGid());

        $resp = $this->_handle_response_json($role);
        $this->set(compact('resp', 'pZadanie'));

        $rola = null;
        foreach ($role['bRole']['bRola'] as $r) {
            if ($r['bGid'] == $gid) {
                $rola = $r;
            }
        }
        $this->set('pageName', 'Administracja - Edytuj rolę: ' . $rola['bNazwa']);
    }

    /**
     * @param $gid string
     */
    public function uzytkownicyRoli($gid)
    {
        $this->viewBuilder()->setLayout('ajax');

        $users = $this->_daj_uzytkownikow($gid);
        $users['bUzytkownicy'] = $this->_convert_list_response($users['bUzytkownicy'], 'bUzytkownik');
        $users = $this->_rename_array_key_prefixes_recursive($users, array('b'), array('dat:'));
        $users = $this->_replace_empty_values($users, '');

        if ($this->request->is('post')) {

            $this->viewBuilder()->setTemplate(null);

            $dataJson = json_decode($this->request->getData()['content'], true);

            $data = [];
            foreach ($dataJson as $key => $val) {
                $str = '&' . $val['name'] . '=' . $val['value'];
                parse_str($str, $arr);

                $diff = array_intersect_assoc($data, $arr);
                $a = $this->_show_keys($arr);

                if (isset($diff[$a[4]][$a[3]][$a[2]][$a[1]])) {
                    $data[$a[4]][$a[3]][$a[2]][$a[1]][$a[0]] = $val['value'];
                } else {
                    $data = array_merge_recursive($data, $arr);
                }
            }

            foreach ($data['tem:pZadanie']['dat:Uzytkownicy'] as $userKey => &$user) {
                if ((int)$user['dat:Uzytkownik']['dat:CzyZaznaczenie'] == 1) {
                    $user['dat:Uzytkownik']['dat:CzyZaznaczenie'] = 'true';
                } elseif ((int)$user['dat:Uzytkownik']['dat:CzyZaznaczenie'] == 0) {
                    $user['dat:Uzytkownik']['dat:CzyZaznaczenie'] = 'false';
                }
            }

            $postUsers = array();
            $_postUsers = $data['tem:pZadanie']['dat:Uzytkownicy'];
            $_getUsers = $users['dat:Uzytkownicy']['dat:Uzytkownik'];

            foreach ($_postUsers as $u) {
                $userGid = $u['dat:Uzytkownik']['dat:Gid'];
                foreach ($_getUsers as $gu) {
                    $userGetGid = $gu['dat:Gid'];
                    if ($userGid == $userGetGid) {
                        if ($u['dat:Uzytkownik']['dat:CzyZaznaczenie'] != $gu['dat:CzyZaznaczenie']) {
                            $postUsers[] = $u;
                        }
                    }
                }
            }

            $data['tem:pZadanie']['dat:Uzytkownicy'] = $postUsers;

            $response = $this->_uzytkownicy_roli($data);
            echo json_encode($this->_handle_response_json($response));

            die();
            /*if($this->_handle_response($this->_uzytkownicy_roli($data)))
            {
                return $this->redirect(array('action' => 'administracja_role'));
            }*/
        }

        $this->request = $this->request->withData('tem:pZadanie', ['dat:GidRoli' => $gid, 'dat:Uzytkownicy' => $users['dat:Uzytkownicy']]);

        $role = $this->Api->DajRole($this->_getGid());

        $resp = $this->_handle_response_json($role);
        $this->set(compact('resp'));

        $rola = null;
        foreach ($role['bRole']['bRola'] as $r) {
            if ($r['bGid'] == $gid) {
                $rola = $r;
            }
        }
        $this->set('pageName', 'Administracja - Użytkownicy roli: ' . $rola['bNazwa']);
    }

    /**
     * @param $gid string
     */
    public function usunRole($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        $response = $this->_usun_role($gid);
        echo json_encode($this->_handle_response_json($response));
        die();
    }

    /**
     * @param $attachmentGid
     * @param $messageGid
     * @param string $disposition
     */
    public function otworzZalacznik($attachmentGid, $messageGid, $disposition = 'inline')
    {
        $message = $this->_daj_wiadomosc($messageGid);
        $attachment = $message['bWiadomosc']['bZalaczniki']['bZalacznik'];

        $_attachment = null;
        if (!array_key_exists('bGid', $attachment)) {
            foreach ($attachment as $file) {
                if ($file['bGid'] == $attachmentGid) {
                    $_attachment = $file;
                }
            }
            $attachment = $_attachment;
        }

        $fileName = $attachment['bPlik'];
        $content = $attachment['bTresc'];

        if ($disposition != 'inline') $disposition = 'attachment';

        if ($content != '') {
            header("Content-Description: Attachment");
            header('Content-Type: ' . $this->mime_type($fileName));
            header('Content-Length: ' . strlen(base64_decode($content)));
            header('Content-Disposition: ' . $disposition . '; filename="' . $fileName . '"');
            header('Cache-Control: private, max-age=0, must-revalidate');
            header('Pragma: public');
//            ini_set('zlib.output_compression','0');
            die(base64_decode($content));
        }
    }

    /**
     * @param $attachmentGid
     * @param $bGid
     * @param string $disposition
     */
    public function wniosekOtworzZalacznik($bGid, $attachmentGid, $disposition = 'inline')
    {
        $wniosek = $this->Api->DajWniosek($this->_getGid(), $bGid);
        $attachment = $wniosek['bWniosek']['bZalaczniki']['cZalacznik'];

        $_attachment = null;
        if (!array_key_exists('cGid', $attachment)) {
            foreach ($attachment as $file) {
                if ($file['cGid'] == $attachmentGid) {
                    $_attachment = $file;
                }
            }
            $attachment = $_attachment;
        }

        $fileName = $attachment['cPlik'];
        $content = base64_decode($attachment['cTresc']);

        if ($disposition != 'inline') $disposition = 'attachment';

        if ($content != '') {
            header("Content-Description: Attachment");
            header('Content-Type: ' . $this->mime_type($fileName));
            header('Content-Length: ' . strlen(($content)));
            header('Content-Disposition: ' . $disposition . '; filename="' . $fileName . '"');
            header('Cache-Control: private, max-age=0, must-revalidate');
            header('Pragma: public');
            die(($content));
        }
    }

    /**
     * wiadomosci method
     * tylko render
     */
    public function wiadomosci()
    {
        $this->viewBuilder()->setLayout('ajax');

        $priorytety = $this->Api->DajPriorytetyWiadomosci($this->_getGid());
        $this->set(compact('priorytety'));

        $resp = $this->_handle_response_json($priorytety);
        $this->set(compact('resp'));

        $rjson = $this->_handle_response_json($priorytety);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }
    }

    /**
     *
     */
    public function testAktualizujAclRoli()
    {
        $options = array(
            'GidRoli' => 'testowyGid',
            'Moduly' => array(
                0 => array(
                    'CzyArchiwizacja' => 'Moze',
                    'CzyDodawanie' => 'Chyba tak',
                ),
                1 => array(
                    'CzyArchiwizacja' => 'Na pewno',
                    'CzyDodawanie' => 'Zdecydowanie nie'
                )
            )
        );
        $test = $this->Api->AktualizujACLRoli($this->_getGid(), $options);
        debug($test);
        die();
    }

    /** PUBLIC METHODS - END*/


    /** AJAX METHODS - START*/

    /**
     * ajax_daj_wnioski method
     */
    public function dajWnioski($typ_wniosku = NULL, $status = NULL)
    {
        $wnioski = $this->_daj_wnioski($typ_wniosku);
        $this->viewBuilder()->setTemplate('ajax_daj_wnioski');

        $rjson = $this->_handle_response_json($wnioski);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            $this->redirect('/');
            die();
        }

        if ($status != NULL) {
            if (isset($wnioski['bWnioski']['bWniosek']) && !empty($wnioski['bWnioski']['bWniosek'])) {
                $wnioskiArray = $wnioski['bWnioski']['bWniosek'];
                $wnioski['bWnioski']['bWniosek'] = array();
                foreach ($wnioskiArray as $w) {
                    if ($status == 'Oczekuje' && $w['bStatus'] == 'Oczekuje') $wnioski['bWnioski']['bWniosek'][] = $w;
                    if ($status == 'Odrzucony' && $w['bStatus'] == 'Odrzucony') $wnioski['bWnioski']['bWniosek'][] = $w;
                    if ($status == 'Zaakceptowany' && ($w['bStatus'] == 'Zaakceptowany' || $w['bStatus'] == 'Zaimportowany')) $wnioski['bWnioski']['bWniosek'][] = $w;
                    if ($status == 'Wszystkie') $wnioski['bWnioski']['bWniosek'] = $wnioskiArray;
                }
            }
        }

        if ($typ_wniosku == 'Wplywajace') {
            $wnioskiArray = $wnioski['bWnioski']['bWniosek'];
            $wnioski['bWnioski']['bWniosek'] = array();
            foreach ($wnioskiArray as $wniosek) {
                foreach ($wniosek as $key => $value) {
                    if (is_array($value) && empty($value)) {
                        $wniosek[$key] = '';
                    }
                }
                if ($wniosek['bWnioskujacy']['cGid'] != $this->_getUserGid()) {
                    $wnioski['bWnioski']['bWniosek'][] = $wniosek;
                }
            }
        }

        $this->set(compact('wnioski', 'typ_wniosku'));
    }

    /**
     * ajax_daj_umowy method
     * @param $numer
     */
    public function ajaxDajUmowy($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_umowy');
        $contracts = $this->_umowy_o_prace($numer);

        $rjson = $this->_handle_response_json($contracts);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $contracts = $this->_umowy_o_prace_convert($contracts);

        $this->set(compact('contracts'));
    }

    /**
     * daj_umowy method
     * @param $numer
     */
    public function dajUmowy($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_umowy');
        $contracts = $this->_umowy_o_prace($numer);

        $rjson = $this->_handle_response_json($contracts);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $contracts = $this->_umowy_o_prace_convert($contracts);

        $this->set(compact('contracts'));
    }

    public function umowaOtworzZalacznik($stanowiskoKod, $disposition = 'inline')
    {
        $karta = $this->Api->DajKarteStanowiskowa($this->_getGid(), ['dat:StanowiskoKod' => $stanowiskoKod]);
        if (isset($karta['bKarta']['bPlik'])) {
            $fileName = $karta['bKarta']['bNazwaPliku'];
            $content = $karta['bKarta']['bPlik'];

            if ($disposition != 'inline') $disposition = 'attachment';

            if ($content != '') {
                header("Content-Description: Attachment");
                header('Content-Type: ' . $this->mime_type($fileName));
                header('Content-Length: ' . strlen(base64_decode($content)));
                header('Content-Disposition: ' . $disposition . '; filename="' . $fileName . '"');
                header('Cache-Control: private, max-age=0, must-revalidate');
                header('Pragma: public');
                die(base64_decode($content));
            }
        }

        die();
    }

    /**
     * ajax_daj_nieobecnosci method
     * @param $numer
     */
    public function ajaxDajNieobecnosci($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_nieobecnosci');
        $absents = $this->_nieobecnosci($numer);

        $rjson = $this->_handle_response_json($absents);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $absents = $this->_nieobecnosci_convert($absents);

        $this->set(compact('absents'));
    }

    /**
     * daj_nieobecnosci method
     * @param $numer
     */
    public function dajNieobecnosci($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_nieobecnosci');
        $absents = $this->_nieobecnosci($numer);

        $rjson = $this->_handle_response_json($absents);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $absents = $this->_nieobecnosci_convert($absents);

        $this->set(compact('absents'));
    }

    /**
     * ajax_daj_przebiegi_pracy method
     * @param $numer
     */
    public function ajaxDajPrzebiegiPracy($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $workflows = $this->_przebiegi_pracy($numer);

        $rjson = $this->_handle_response_json($workflows);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $workflows = $this->_przebiegi_pracy_convert($workflows);

        $this->set(compact('workflows'));
    }

    /**
     * daj_przebiegi_pracy method
     * @param $numer
     */
    public function dajPrzebiegiPracy($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_przebiegi_pracy');
        $workflows = $this->_przebiegi_pracy($numer);

        $rjson = $this->_handle_response_json($workflows);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $workflows = $this->_przebiegi_pracy_convert($workflows);

        $this->set(compact('workflows'));
    }

    /**
     * ajax_daj_wyksztalcenia method
     * @param $numer
     */
    public function ajaxDajWyksztalcenia($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $educations = $this->_wyksztalcenia($numer);

        $rjson = $this->_handle_response_json($educations);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $educations = $this->_wyksztalcenia_convert($educations);

        $this->set(compact('educations'));
    }

    /**
     * daj_wyksztalcenia method
     * @param $numer
     */
    public function dajWyksztalcenia($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_wyksztalcenia');
        $educations = $this->_wyksztalcenia($numer);

        $rjson = $this->_handle_response_json($educations);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $educations = $this->_wyksztalcenia_convert($educations);

        $this->set(compact('educations'));
    }

    /**
     * ajax_daj_badania method
     * @param $numer
     */
    public function ajaxDajBadania($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $badania = $this->_badania($numer);

        $rjson = $this->_handle_response_json($badania);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $badania = $this->_badania_convert($badania);

        $this->set(compact('badania'));
    }

    /**
     * daj_badania method
     * @param $numer
     */
    public function dajBadania($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_badania');
        $badania = $this->_badania($numer);

        $rjson = $this->_handle_response_json($badania);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $badania = $this->_badania_convert($badania);

        $this->set(compact('badania'));
    }

    /**
     * ajax_daj_szkolenia method
     * @param $numer
     */
    public function ajaxDajSzkolenia($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $trainings = $this->_szkolenia($numer);

        $rjson = $this->_handle_response_json($trainings);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('trainings'));
    }

    /**
     * daj_szkolenia method
     * @param $numer
     */
    public function dajSzkolenia($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_szkolenia');
        $trainings = $this->_szkolenia($numer);

        $rjson = $this->_handle_response_json($trainings);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('trainings'));
    }

    /**
     * ajax_daj_kary method
     * @param $numer
     */
    public function ajaxDajKary($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $punishes = $this->_kary($numer);

        $rjson = $this->_handle_response_json($punishes);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('punishes'));
    }

    /**
     * daj_kary method
     * @param $numer
     */
    public function dajKary($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_kary');
        $punishes = $this->_kary($numer);

        $rjson = $this->_handle_response_json($punishes);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('punishes'));
    }

    /**
     * ajax_daj_jezyki method
     * @param $numer
     */
    public function ajaxDajJezyki($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $langs = $this->_jezyki($numer);

        $rjson = $this->_handle_response_json($langs);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('langs'));
    }

    /**
     * daj_jezyki method
     * @param $numer
     */
    public function dajJezyki($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_jezyki');
        $langs = $this->_jezyki($numer);

        $rjson = $this->_handle_response_json($langs);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('langs'));
    }

    /**
     * ajax_daj_kwalifikacje method
     * @param $numer
     */
    public function ajaxDajKwalifikacje($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $skills = $this->_kwalifikacje($numer);

        $rjson = $this->_handle_response_json($skills);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('skills'));
    }

    /**
     * daj_kwalifikacje method
     * @param $numer
     */
    public function dajKwalifikacje($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_kwalifikacje');
        $skills = $this->_kwalifikacje($numer);

        $rjson = $this->_handle_response_json($skills);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('skills'));
    }

    /**
     * ajax_daj_rodzine method
     * @param $numer
     */
    public function ajaxDajRodzine($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $family = $this->_rodzina($numer);

        $rjson = $this->_handle_response_json($family);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('family'));
    }

    /**
     * daj_rodzine method
     * @param $numer
     */
    public function dajRodzine($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_rodzine');
        $family = $this->_rodzina($numer);

        $rjson = $this->_handle_response_json($family);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('family'));
    }

    /**
     * ajax_daj_oceny method
     * @param $numer
     */
    public function ajaxDajOceny($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $ratings = $this->_ocena($numer);
        $rjson = $this->_handle_response_json($ratings);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('ratings'));
    }

    /**
     * daj_oceny method
     * @param $numer
     */
    public function dajOceny($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_oceny');
        $ratings = $this->_ocena($numer);
        $rjson = $this->_handle_response_json($ratings);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('ratings'));
    }

    /**
     * ajax_daj_plan_urlopu method
     * @param $numer
     */
    public function ajaxDajPlanUrlopu($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $free_days = $this->_plan_urlopu($numer);

        $rjson = $this->_handle_response_json($free_days);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('free_days'));
    }

    /**
     * daj_plan_urlopu method
     * @param $numer
     */
    public function dajPlanUrlopu($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_plan_urlopu');
        $free_days = $this->_plan_urlopu($numer);

        $rjson = $this->_handle_response_json($free_days);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('free_days'));
    }

    /**
     * ajax_daj_dokumenty method
     * @param $numer
     */
    public function ajaxDajDokumenty($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $documents = $this->_dokumenty($numer);

        $rjson = $this->_handle_response_json($documents);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('documents'));
    }

    /**
     * ajax_daj_dokumenty method
     * @param $numer
     */
    public function ajaxDajDokumentyKadrowe($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $documents = $this->_dokumenty_kadrowe($numer);

        $rjson = $this->_handle_response_json($documents);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('documents'));
        $this->viewBuilder()->setTemplate('ajax_daj_dokumenty');
    }

    /**
     * ajax_daj_profil method
     * @param $numer
     */
    public function dajProfil($numer)
    {
        $ids = explode(',', (string)$numer);
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_profil');
        $profile = $this->_profil($ids[0], $ids[1]);
        $data = $this->_daj_dane_osobowe($ids[0], $ids[1]);

        $rjson = $this->_handle_response_json($profile);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('profile', 'data'));
    }

    /**
     * ajax_daj_profil method
     * @param $numer
     */
    public function ajaxDajProfil($numer)
    {
        $ids = explode(',', (string)$numer);
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_profil');
        $profile = $this->_profil($ids[0], $ids[1]);
        $data = $this->_daj_dane_osobowe($ids[0], $ids[1]);

        $rjson = $this->_handle_response_json($profile);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('profile', 'data'));
    }

    /**
     * ajax_daj_zdarzenia method
     * @param string $numer
     */
    public function ajaxDajZdarzenia($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_zdarzenia');
        $ids = explode(',', (string)$numer);
        $_gid = $ids[0];
        $_nrewid = $ids[1];
        $this->set(compact('_gid', '_nrewid'));
    }

    /**
     * daj_zdarzenia method
     * @param string $numer
     */
    public function dajZdarzenia($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_zdarzenia');
        $ids = explode(',', (string)$numer);
        $_gid = $ids[0];
        $_nrewid = $ids[1];
        $this->set(compact('_gid', '_nrewid'));
    }

    /**
     * ajax_daj_zdarzenia method
     * @param string $numer
     */
    public function ajaxDajZdarzeniaOdbicia($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_zdarzenia_odbicia');
        $ids = explode(',', (string)$numer);
        $_gid = $ids[0];
        $_nrewid = $ids[1];
        $this->set(compact('_gid', '_nrewid'));
    }

    /**
     * daj_zdarzenia method
     * @param string $numer
     */
    public function dajZdarzeniaOdbicia($numer)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_zdarzenia_odbicia');
        $ids = explode(',', (string)$numer);
        $_gid = $ids[0];
        $_nrewid = $ids[1];
        $this->set(compact('_gid', '_nrewid'));
    }

    /**
     * ajax_daj_informacje_placowe method
     * @param string $rodzaj
     */
    public function dajInformacjePlacowe($rodzaj, $numer_pracownika = null)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_informacje_placowe');
        $cash = $this->_daj_informacje_placowe($rodzaj, $numer_pracownika);

        $rjson = $this->_handle_response_json($cash);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('cash', 'rodzaj'));
    }

    /**
     * ajax_daj_dokuemnty method
     * @param $rodzaj
     */
    public function dajDokumentyPlace($rodzaj, $numer_pracownika = null)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_dokumenty_place');
        $ne = $this->Auth->user('cNumerEwidencyjny');
        $emails = $this->_adresy_email($ne, $rodzaj, $numer_pracownika);
        $documents = $this->_dokumenty_placowe($ne, $rodzaj, $numer_pracownika);

        $rjson = $this->_handle_response_json($documents);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('documents', 'rodzaj', 'emails'));
    }

    /**
     * @param $gidMsg
     * @return string
     */
    public function ajaxDajWiadomosc($gidMsg)
    {
        $message = $this->_daj_wiadomosc($gidMsg);

        $rjson = $this->_handle_response_json($message);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->_set_message($message);
        echo json_encode($message);

        die;
    }

    /**
     * ajax_ukryj_wiadomosc method
     * @param $wiadomosc_gid
     */
    public function ajaxUkryjWiadomosc($wiadomosc_gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_ukryj_wiadomosc');
        $response = $this->Api->UstawJakoUkryta($this->_getGid(), $wiadomosc_gid);

        $rjson = $this->_handle_response_json($response);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        echo json_encode($response);
        die();
    }

    /**
     * ajax_wiadomosci method
     */
    public function ajaxDajWiadomosci()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_wiadomosci');
        if ($this->request->is('get')) {
            $q = $this->request->getQuery();
        }
        $options = array(
            'dat:CzyUkryte' => $q['hidden']
        );

        $options['dat:Skrzynki'] = $q['type'];

        if ($q['prior'] != 'x') $options['dat:Priorytety'] = $q['prior'];

        $messages = $this->_daj_wiadomosci($options);

        $rjson = $this->_handle_response_json($messages);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

//        debug($messages);
//        die();
        $this->set(compact('messages'));
        $this->set('boxType', $q['type']);
    }

    /**
     * @return string
     */
    public function ajaxDajAdresy($zmetody = null)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_adresy');

        $zmetody = $zmetody !== 'undefined' ? $zmetody : null;

        $options = array(
            'ZMetody' => $zmetody
        );

        $addresses = $this->Api->DajAdresy($this->_getGid(), $options);

        $rjson = $this->_handle_response_json($addresses);
        $this->set('resp', $rjson);

        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $addresses = $addresses['bAdresy']['bAdres'];

        foreach ($addresses as &$address) {
            foreach ($address as &$value) {
                if (is_array($value) && empty($value)) {
                    $value = '';
                }
            }
        }
        $this->set('addresses', $addresses);
//        return json_encode($response);
    }

    /**
     * @return string
     */
    public function dajAdresy($zmetody = null)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_adresy');

        $zmetody = $zmetody !== 'undefined' ? $zmetody : null;

        $options = array(
            'ZMetody' => $zmetody
        );

        $addresses = $this->Api->DajAdresy($this->_getGid(), $options);

        $rjson = $this->_handle_response_json($addresses);
        $this->set('resp', $rjson);

        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $addresses = $addresses['bAdresy']['bAdres'];

        foreach ($addresses as &$address) {
            foreach ($address as &$value) {
                if (is_array($value) && empty($value)) {
                    $value = '';
                }
            }
        }
        $this->set('addresses', $addresses);
//        return json_encode($response);
    }

    /**
     * Numery list kodów:
     * 2 - komórki
     * 5 - stanowiska
     * 52 - płatnicy
     * 53 - piony
     * 54 - regiony
     * 125 - miejsca
     * 24 - charaktery pracy
     */
    public function ajaxDajListeKodow()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_liste_kodow');
        $data = $this->request->getData();
        if (isset($data['code'])) {
            $codes = $this->_daj_liste_kodow($data['code']);
        } else {
            $codes = $this->_daj_liste_kodow();
        }

        $rjson = $this->_handle_response_json($codes);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $codes['bKody'] = $this->_convert_list_response($codes['bKody'], 'bKod');
//        debug($codes);
        $this->set('codes', $codes);
    }

    /**
     *
     */
    public function ajaxDajListePracownikow($all = null)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_liste_pracownikow');
        $workers = $this->Api->DajListePracownikow($this->_getGid(), ($all === 'yes' ? false : true));

        $rjson = $this->_handle_response_json($workers);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $workers = $this->_replace_empty_values($workers);

//        $workers['bPracownicy'] = $this->_convert_list_response($workers['bPracownicy'], 'bPracownik');

        if (isset($workers['bPracownicy']['bPracownik']['bNazwisko'])) {
            $worker = $workers['bPracownicy']['bPracownik'];
            $workers['bPracownicy']['bPracownik'] = array();
            $workers['bPracownicy']['bPracownik'][] = $worker;

        }

        $this->set('workers', $workers);
    }

    /**
     * @param $gidMsg string
     * @return string
     */
    public function dajWiadomoscAjax($gidMsg)
    {
        $message = $this->_daj_wiadomosc($gidMsg);
        return json_encode($message);
    }

    /**
     * akceptuj_wniosek method
     * @param $gid
     */
    public function akceptujWniosek($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        $options = array(
            'gidWniosku' => $gid,
            'Notka' => $this->request->getData('wniosek_notatka')
        );

        $response = $this->Api->ZaakceptujWniosek($this->_getGid(), $options);

        $rjson = $this->_handle_response_json($response);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        echo json_encode($this->_handle_response_json($response));
        die();
    }

    /**
     * odrzuc_wniosek method
     * @param $gid
     */
    public function odrzucWniosek($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        $options = array(
            'gidWniosku' => $gid,
            'Notka' => $this->request->getData('wniosek_notatka')
        );

        $response = $this->Api->OdrzucWniosek($this->_getGid(), $options);

        $rjson = $this->_handle_response_json($response);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        echo json_encode($this->_handle_response_json($response));
        die();
    }

    /**
     * wnioskiKadrowe method - główny widok listy wniosków kadrowych
     */
    public function wnioskiKadrowe()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('wnioski_kadrowe');

        $uprawnienia = $this->_daj_uprawnienia_wnioskow_kadrowych();
        $this->set(compact('uprawnienia'));
    }

    /**
     * dajWnioskiKadrowe method - AJAX do DataTables
     */
    public function dajWnioskiKadrowe($skrzynka = null, $status = null)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_wnioski_kadrowe');

        $wnioski = $this->_daj_wnioski_kadrowe('WnioskiKadrowe', $skrzynka, $status);
        $uprawnienia = $this->_daj_uprawnienia_wnioskow_kadrowych();

        $this->set(compact('wnioski', 'uprawnienia'));
    }

    /**
     * wyborRodzajuWnioskuKadrowego method - modal wyboru rodzaju wniosku
     */
    public function wyborRodzajuWnioskuKadrowego()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('wybor_rodzaju_wniosku_kadrowego');

        $rodzaje = $this->_daj_rodzaje_wnioskow_kadrowych();
        $this->set(compact('rodzaje'));
    }

    /**
     * dodajWniosekKadrowy method - formularz dodawania wniosku kadrowego
     */
    public function dodajWniosekKadrowy($gidRodzajuWniosku = null)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('dodaj_wniosek_kadrowy');

        if ($this->request->is('post')) {
            $data = $this->request->getData();
            $req = $this->_prepare_wniosek_kadrowy_data($data, false);

            $response = $this->_zapisz_wniosek_kadrowy($req, false);
            $rjson = $this->Api->handleServiceResponse($response->DodajWniosekKadrowyResult);

            if (isset($rjson['login'])) {
                echo json_encode(['login' => true]);
            } else {
                echo json_encode($rjson);
            }
            die();
        }

        $nowyWniosekResponse = $this->_daj_nowy_wniosek_kadrowy($gidRodzajuWniosku);
        $rodzaje = $this->_daj_rodzaje_wnioskow_kadrowych();

        $resp = $this->_handle_response_object_json($nowyWniosekResponse);
        if (isset($resp['login'])) {
            $this->redirect('/');
        }

        // Pass DTO object directly to view
        $nowyWniosek = $nowyWniosekResponse->WniosekKadrowy ?? null;
        $uprawnienia = $this->_daj_uprawnienia_wnioskow_kadrowych();

        $this->set(compact('nowyWniosek', 'rodzaje', 'uprawnienia'));
    }

    /**
     * edytujWniosekKadrowy method - formularz edycji wniosku kadrowego
     * @param string $gid
     */
    public function edytujWniosekKadrowy($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('edytuj_wniosek_kadrowy');

        if ($this->request->is('post')) {
            $data = $this->request->getData();
            $req = $this->_prepare_wniosek_kadrowy_data($data, true);

            $response = $this->_zapisz_wniosek_kadrowy($req, true);
            $rjson = $this->Api->handleServiceResponse($response->EdytujWniosekKadrowyResult);

            if (isset($rjson['login'])) {
                echo json_encode(['login' => true]);
            } else {
                echo json_encode($rjson);
            }

            die();
        }

        $wniosekResponse = $this->_daj_wniosek_kadrowy($gid);
        $rodzaje = $this->_daj_rodzaje_wnioskow_kadrowych();

        $resp = $this->_handle_response_object_json($wniosekResponse);
        if (isset($resp['login'])) {
            $this->redirect('/');
        }

        // Pass DTO object directly to view
        $wniosek = $wniosekResponse->WniosekKadrowy ?? null;
        $uprawnienia = $this->_daj_uprawnienia_wnioskow_kadrowych();

        $this->set(compact('wniosek', 'rodzaje', 'uprawnienia', 'gid'));
    }

    /**
     * pokazWniosekKadrowy method - podgląd wniosku kadrowego
     * @param string $gid
     */
    public function pokazWniosekKadrowy($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('pokaz_wniosek_kadrowy');

        $wniosekResponse = $this->_daj_wniosek_kadrowy($gid);

        $resp = $this->_handle_response_object_json($wniosekResponse);
        if (isset($resp['login'])) {
            $this->redirect('/');
        }

        // Pass DTO object directly to view
        $wniosek = $wniosekResponse->WniosekKadrowy ?? null;
        $uprawnienia = $this->_daj_uprawnienia_wnioskow_kadrowych();

        $this->set(compact('wniosek', 'uprawnienia', 'gid'));
    }

    /**
     * sprawdzWniosekKadrowy method - walidacja wniosku kadrowego (AJAX)
     */
    public function sprawdzWniosekKadrowy()
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        if ($this->request->is('post')) {
            $data = $this->request->getData();

            $response = $this->_weryfikuj_wniosek_kadrowy($data);
            $rjson = $this->Api->handleServiceResponse($response->WeryfikujWniosekKadrowyResult);

            if (isset($rjson['login'])) {
                echo json_encode(['login' => true]);
            } else {
                echo json_encode($rjson);
            }
        }
        die();
    }

    /**
     * akceptujWniosekKadrowy method - akceptacja wniosku kadrowego (AJAX)
     * @param string $gid
     */
    public function akceptujWniosekKadrowy($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        $notka = $this->request->getData('wniosek_notatka') ?? null;
        $response = $this->_zaakceptuj_wniosek_kadrowy($gid, $notka);

        // Handle response based on whether notka was provided
        $result = $notka !== null
            ? $response->ZaakceptujWniosekZNotkaResult
            : $response->ZaakceptujWniosekKadrowyResult;

        $rjson = $this->Api->handleServiceResponse($result);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        echo json_encode($rjson);
        die();
    }

    /**
     * odrzucWniosekKadrowy method - odrzucenie wniosku kadrowego (AJAX)
     * @param string $gid
     */
    public function odrzucWniosekKadrowy($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        $notka = $this->request->getData('wniosek_notatka') ?? null;
        $response = $this->_odrzuc_wniosek_kadrowy($gid, $notka);

        $rjson = $this->Api->handleServiceResponse($response);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        echo json_encode($rjson);
        die();
    }

    /**
     * usunWniosekKadrowy method - usunięcie wniosku kadrowego (AJAX)
     * @param string $gid
     */
    public function usunWniosekKadrowy($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        $response = $this->_usun_wniosek_kadrowy($gid);

        $rjson = $this->Api->handleServiceResponse($response);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        echo json_encode($rjson);
        die();
    }

    /**
     * drukujWniosekKadrowy method - drukowanie wniosku kadrowego
     * @param string $bGid
     */
    public function drukujWniosekKadrowy($bGid, $rodzajWniosku = '')
    {
        $this->viewBuilder()->setLayout('ajax');

        $response = $this->_drukuj_wniosek_kadrowy($bGid);

        $resp = $this->_handle_response_json($response);
        if (isset($resp['login'])) {
            $this->redirect('/');
        } elseif (isset($resp['error'])) {
            // Return error as JSON instead of treating it as PDF
            header('Content-Type: application/json');
            echo json_encode(['success' => false, 'error' => $resp['error']]);
        } else {
            if (!empty($response['bPDF'])) {
                $content = base64_decode($response['bPDF']);

                // Create filename from request type (rodzaj wniosku)
                $rodzaj = urldecode($rodzajWniosku);
                if (!empty($rodzaj)) {
                    // Convert to ASCII-friendly filename: "Wniosek_urlop_wypoczynkowy.pdf"
                    $filename = 'Wniosek_' . strtolower(iconv('UTF-8', 'ASCII//TRANSLIT', $rodzaj));
                    $filename = preg_replace('/[^a-z0-9_-]/i', '_', $filename);
                    $filename .= '.pdf';
                } else {
                    $filename = 'wniosek_kadrowy.pdf';
                }
                $extension = 'pdf';

                header('Content-Type: application/' . $extension);
                header('Content-Length: ' . strlen($content));
                header('Content-Disposition: inline; filename="' . $filename . '"');
                header('Cache-Control: private, max-age=0, must-revalidate');
                header('Pragma: public');
                ini_set('zlib.output_compression', '0');

                echo $content;
            } else {
                // No PDF and no error message - return generic error
                header('Content-Type: application/json');
                echo json_encode(['success' => false, 'error' => 'Nie udało się wygenerować raportu.']);
            }
        }
        die();
    }

    /**
     * _prepare_wniosek_kadrowy_data method - przygotowanie danych wniosku kadrowego do zapisu
     * @param array $data
     * @return DodajWniosekKadrowy|EdytujWniosekKadrowy
     */
    private function _prepare_wniosek_kadrowy_data($data, bool $isEdycja = false)
    {
        // Dekoduj base64 zakodowany obiekt $nowyWniosek
        $nowyWniosek = null;
        if (!empty($data['nowyWniosekBase64'])) {
            $json = base64_decode($data['nowyWniosekBase64']);
            if ($json !== false) {
                $nowyWniosek = json_decode($json);
            }
        }

        // Jeśli nie ma base64, pobierz standardowo z API
        if (empty($nowyWniosek) && isset($data['bGidRodzaju']) && !empty($data['bGidRodzaju'])) {
            $nowyWniosek = $this->_daj_nowy_wniosek_kadrowy($data['bGidRodzaju'])->WniosekKadrowy;
        }

        // Jeśli nadal brak wniosku, spróbuj pobrać istniejący (dla edycji)
        if (empty($nowyWniosek) && $isEdycja && isset($data['bGid']) && !empty($data['bGid'])) {
            $wniosekResponse = $this->Api->DajWniosekKadrowy($this->_getGid(), $data['bGid']);
            $wniosekArray = $this->_handle_response_object_json($wniosekResponse);
            if (isset($wniosekArray['bWniosek'])) {
                $nowyWniosek = (object)$wniosekArray['bWniosek'];
            }
        }

        // Utwórz odpowiedni obiekt żądania
        if ($isEdycja) {
            $request = new EdytujWniosekKadrowy();
        } else {
            $request = new DodajWniosekKadrowy();
        }

        $zadanie = new WniosekKadrowyZadanie();
        $wniosek = $nowyWniosek ?? new \stdClass();

        // Aktualizuj pola główne wniosku z formularza
        if (!empty($data['bGid'])) {
            $wniosek->Gid = $data['bGid'];
        }
        if (!empty($data['bGidRodzaju'])) {
            $wniosek->RodzajWnioskuGid = $data['bGidRodzaju'];
        }
        if (!empty($data['bDataOd'])) {
            $wniosek->DataOd = $this->_date_for_request($data['bDataOd']);
        }
        if (!empty($data['bDataDo'])) {
            $wniosek->DataDo = $this->_date_for_request($data['bDataDo']);
        }
        if (!empty($data['bOpis'])) {
            $wniosek->Opis = $data['bOpis'];
        }

        // Aktualizuj elementy wniosku z formularza
        // Struktura $data['ElementyWnioskuKadrowego']: {Gid: wartość, Gid2: wartość2, ...}
        if (!empty($data['ElementyWnioskuKadrowego']) && !empty($nowyWniosek->Elementy->ElementWnioskuKadrowego)) {
            // Rekurencyjna funkcja do aktualizacji elementów
            $updateElementsRecursive = function ($elements) use ($data, &$updateElementsRecursive) {
                foreach ($elements as $element) {
                    $elGid = $element->Gid ?? null;
                    if ($elGid && isset($data['ElementyWnioskuKadrowego'][$elGid])) {
                        $wartoscFromForm = $data['ElementyWnioskuKadrowego'][$elGid];
                        // Aktualizuj WartoscPHPX tylko jeśli wartość nie jest pusta
                        if ($wartoscFromForm !== null && $wartoscFromForm !== '') {
                            $element->WartoscPHPX = $wartoscFromForm;
                        }
                        $rodzaj = $element->Rodzaj ?? '';

                        if ($rodzaj === 'Adres') {
                            $zmetody = null;
                            $gidRodzajuWniosku = $data['bGidRodzaju'] ?? '';
                            $nazwaPola = $element->Nazwa ?? '';
                            if (!empty($gidRodzajuWniosku) && !empty($nazwaPola)) {
                                $zmetody = 'WnioskiKadrowe.' . $gidRodzajuWniosku . '.' . $nazwaPola;
                            }

                            try {
                                $adresyResponse = $this->Api->DajAdresy($this->_getGid(), ['ZMetody' => $zmetody]);
                                if (!empty($adresyResponse['bAdresy']['bAdres'])) {
                                    $adresy = $adresyResponse['bAdresy']['bAdres'];

                                    $adresyList = isset($adresy['bGid']) ? [$adresy] : $adresy;
                                    foreach ($adresyList as $adr) {
                                        if ($wartoscFromForm === $adr['bGid']) {
                                            // Koduj w formacie: [GID|EMAIL|NAZWA|NAZWA_WYSWIETLANA|DATA|DATA_AKCEPACJI|...]
                                            // Dodajemy NAZWA_WYSWIETLANA na pozycji 3 dla łatwego wyświetlania
                                            $encoded = '['
                                                . ($adr['bGid'] ?? '') . '|'
                                                . ($adr['bEmail'] ?? '') . '|'
                                                . ($adr['bNazwa'] ?? '') . '|'
                                                . '|'
                                                . '|'
                                                . '|'
                                                . ($adr['bCzyMozeZaakceptowacZaPozostalych'] ?? '') . '|'
                                                . ($adr['bCzyMusiZaakceptowac'] ?? '') . '|'
                                                . ($adr['bNazwisko'] ?? '') . '|'
                                                . ($adr['bImie'] ?? '')
                                                . ']';
                                            $element->WartoscPHPX = $encoded;
                                        }
                                    }

                                }
                            } catch (\Exception $e) {
                                error_log('Error fetching addresses for wniosek kadrowy: ' . $e->getMessage());
                            }
                        }
                    }

                    // Rekurencyjnie przetwarzaj pod-elementy (dla Grup)
                    if (!empty($element->Elementy->ElementWnioskuKadrowego)) {
                        $updateElementsRecursive($element->Elementy->ElementWnioskuKadrowego);
                    }
                }
            };

            $updateElementsRecursive($nowyWniosek->Elementy->ElementWnioskuKadrowego);
            $wniosek->Elementy = $nowyWniosek->Elementy;
        }

        $zadanie->WniosekKadrowy = $wniosek;
        $request->pZadanie = $zadanie;
        $request->pGidSesji = $this->_getGid();

        return $request;
    }

    /**
     * _prepare_elementy_wniosku_kadrowego method - przygotowanie elementów wniosku kadrowego
     * @param array $elementy
     * @return array
     */
    private function _prepare_elementy_wniosku_kadrowego($elementy)
    {
        $result = [];
        foreach ($elementy as $element) {
            $el = [];
            if (isset($element['bNazwa'])) {
                $el['dat:Nazwa'] = $element['bNazwa'];
            }
            if (isset($element['bWartoscPHPX'])) {
                $el['dat:WartoscPHPX'] = $element['bWartoscPHPX'];
            }
            if (isset($element['bWartoscPHPY'])) {
                $el['dat:WartoscPHPY'] = $element['bWartoscPHPY'];
            }
            if (isset($element['bWartoscPHPZ'])) {
                $el['dat:WartoscPHPZ'] = $element['bWartoscPHPZ'];
            }
            if (isset($element['bRodzajElementu'])) {
                $el['dat:RodzajElementu'] = $element['bRodzajElementu'];
            }
            if (isset($element['bCzyWymagany'])) {
                $el['dat:CzyWymagany'] = $element['bCzyWymagany'] ? 'true' : 'false';
            }
            if (!empty($el)) {
                $result[] = $el;
            }
        }
        return $result;
    }

    public function akceptujOdrzucWniosek($gid, $czyAdmin, $czyOdrzucony)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        if ($gid == 'post') {
            $gid = (array)$this->request->getData('gid');
        } else {
            $gid = [$gid];
        }


        $options = array(
            'gidDokumentu' => $gid,
            'czyAdmin' => $czyAdmin,
            'czyOdrzucenie' => $czyOdrzucony

        );

        $accept = (isset($this->request->getQueryParams()['tylko-akceptacja']));
        $response = $this->Api->ZaakceptujOdrzucWniosek($this->_getGid(), $options, $accept);
        $rjson = $this->_handle_response_json($response);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }


        echo json_encode($this->_handle_response_json($response));
        die();
    }

    public function saldoUrlopu($numerEwidencyjny = null, $zmetody = null)
    {
        $this->viewBuilder()->setLayout('ajax');

//        $thisYear = new \DateTime();
//        $thisYear = (int)$thisYear->format('Y');
//        $saldoOptions = array(
//            'dat:Lata' => array(),
//            'dat:NumerPracownika' => $this->Auth->user('cNumerEwidencyjny')
//        );
//
//        $startYear = (int)date('Y', strtotime($this->Auth->user('cDataPrzyjecia')));
//        for($i=$thisYear; $i>=$startYear; $i--) {
//            $saldoOptions['dat:Lata'][] = array('dat1:int' => $i);
//        }
//
//        $saldo = $this->Api->DajSaldoUrlopu($this->_getGid(), $saldoOptions);

        $saldo = $this->_saldo_urlopu_5($numerEwidencyjny, $zmetody);

        $resp = $this->_handle_response_json($saldo);
        $this->set(compact('resp'));

        $this->set(compact('saldo'));
    }

    /**
     * @param string|int $numerEwidencyjny
     * @return array
     */
    private function _saldo_urlopu_5($numerEwidencyjny = null, $zmetody = null)
    {
        $thisYear = new \DateTime();
        $thisYear = (int)$thisYear->format('Y');
        $saldoOptions = array(
            'dat:Lata' => array(),
            'dat:NumerPracownika' => $numerEwidencyjny != null ? $numerEwidencyjny : $this->Auth->user('cNumerEwidencyjny')
        );

        $startYear = $thisYear - 4;
        for ($i = $thisYear; $i >= $startYear; $i--) {
            $saldoOptions['dat:Lata'][] = array('dat1:int' => $i);
        }

        if ($zmetody) {
            $saldoOptions['ZMetody'] = $zmetody;
        }

        $saldo = $this->Api->DajSaldoUrlopu($this->_getGid(), $saldoOptions);

        if (!empty($saldo['bInformacjeOSaldach']['bInformacjaOSaldach'])) {
            if (!isset($saldo['bInformacjeOSaldach']['bInformacjaOSaldach'][0])) {
                $content = [$saldo['bInformacjeOSaldach']['bInformacjaOSaldach']];
            } else {
                $content = $saldo['bInformacjeOSaldach']['bInformacjaOSaldach'];
            }
            $dodatkowy = false;
            foreach ($content as $s) {
                if ($s['bUrlopDodatkowyDni'] > 0 || $s['bUrlopDodatkowyGodziny'] > 0) {
                    $dodatkowy = true;
                }
            }
            $saldo['bDodatkowy'] = $dodatkowy;
        }

        return $saldo;
    }

    /**
     * ajax_lista_wspolpracownikow method
     */
    public function ajaxListaWspolpracownikow()
    {
        $wspolpracownicy = $this->Api->DajListeWspolpracownikow($this->_getGid());

        $rjson = $this->_handle_response_json($wspolpracownicy);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        echo json_encode(array('response' => 'ok', 'wspolpracownicy' => $wspolpracownicy));
        die();
    }

    /**
     * pokaz_ocene method
     *
     * @param null|string $bGid
     */
    public function pokazOcene($bGid = NULL)
    {
        if ($bGid == null) $this->redirect(Router::url('ocena'));

        $ocena = $this->Api->DajOcene($this->_getGid(), $bGid);

        $rjson = $this->_handle_response_json($ocena);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('ocena'));
    }

    /**
     * dodaj_ocene method
     *
     * @param integere|null $employeeIdd
     */
    public function dodajOcene($employeeIdd = null)
    {
        $this->viewBuilder()->setLayout('ajax');

        $codes = $this->Api->DajListeKodow($this->_getGid(), array('dat:Numer' => 94));
        $codeList = array();
        foreach ($codes['bKody']['bKod'] as $code) {
            $nrAndGid = array(
                'dat2:Gid' => $code['bGid'],
                'dat2:Numer' => $code['bNumer'],
                'dat2:Opis' => $code['bOpis'],
                'dat2:Symbol' => $code['bSymbol']
            );
            $codeList[$this->_array_2_string($nrAndGid)] = $code['bOpis'];
        }
        $this->set('codes', $codeList);

        if ($this->request->is(array('post', 'put'))) {
            $data = $this->request->getData()['pOcena'];
            $data['dat2:Kod'] = $this->_string_2_array($data['dat:Kod']['dat2:NumerIGid']);
            $data['dat:DataDo'] = $this->_date_for_request($data['dat:DataDo']);
            $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
//            $data['dat:Gid'] = $this->_getUserGid();
//            $data['dat:NumerEwidencyjny'] = $this->Auth->user('cNumerEwidencyjny');
            $data['dat:NumerEwidencyjny'] = $employeeIdd;

            if ($employeeIdd !== null) {
                $data['dat:NumerEwidencyjny'] = $employeeIdd;
            }

            $response = $this->Api->DodajOcene($this->_getGid(), $data);
            $this->set('response', $response);

            $rjson = $this->_handle_response_json($response);
            if (isset($rjson['login']) && !empty($rjson['login'])) {
                echo 'login';
                die();
            }

            echo json_encode($this->_handle_response_json($response));
            die();
            /*if($this->_handle_response($response))
            {
                if($employeeIdd !== null) {
                    return $this->redirect(Router::url('pracownicy_kadry?a=daj_oceny'));
                }
            }*/
        }
    }

    public function edytujOcene($bGid = null)
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($bGid == null) $this->redirect($this->referer());

        if ($this->request->is(array('post', 'put'))) {
            $data = $this->request->getData()['pOcena'];
            $data['dat2:Kod'] = $this->_string_2_array($data['dat:Kod']['dat2:NumerIGid']);
            $data['dat:DataDo'] = $this->_date_for_request($data['dat:DataDo']);
            $data['dat:DataOd'] = $this->_date_for_request($data['dat:DataOd']);
            $data['dat:DataNastepnej'] = $this->_date_for_request($data['dat:DataNastepnej']);
            $data['dat:Gid'] = $bGid;
            $response = $this->Api->EdytujOcene($this->_getGid(), $data);
            $this->set('response', $response);
//            if($this->_handle_response($response))
//            {
//                return $this->redirect(array('action' => 'ocena'));
//            }

            $rjson = $this->_handle_response_json($response);
            if (isset($rjson['login']) && !empty($rjson['login'])) {
                echo 'login';
                die();
            }

            echo json_encode($this->_handle_response_json($response));
            die();
        } else {
            $ocena = $this->Api->DajOcene($this->_getGid(), $bGid);
            $rjson = $this->_handle_response_json($ocena);
            if (isset($rjson['login']) && !empty($rjson['login'])) {
                echo 'login';
                die();
            }

            if (empty($this->request->getData())) {
                $nrAndGid = array(
                    'dat2:Gid' => $ocena['bOcena']['bKod']['cGid'],
                    'dat2:Numer' => $ocena['bOcena']['bKod']['cNumer'],
                    'dat2:Opis' => $ocena['bOcena']['bKod']['cOpis'],
                    'dat2:Symbol' => $ocena['bOcena']['bKod']['cSymbol']
                );
                $value = [];
                $value['dat:Kod']['dat2:NumerIGid'] = $this->_array_2_string($nrAndGid);
                $value['dat:DataOd'] = $ocena['bOcena']['bDataOd'];
                $value['dat:DataDo'] = $ocena['bOcena']['bDataDo'];
                $value['dat:DataNastepnej'] = $ocena['bOcena']['bDataNastepnej'];
                $value['dat:Gid'] = $ocena['bOcena']['bGid'];
                $value['dat:NumerEwidencyjny'] = $ocena['bOcena']['bNumerEwidencyjny'];
                $value['dat:Punktow1'] = (int)$ocena['bOcena']['bPunktow1'];

                $this->request = $this->request->withData('pOcena', $value);
            }
            $this->set(compact('ocena'));
        }

        $codes = $this->Api->DajListeKodow($this->_getGid(), array('dat:Numer' => 94));
        $codeList = array();
        foreach ($codes['bKody']['bKod'] as $code) {
            $nrAndGid = array(
                'dat2:Gid' => $code['bGid'],
                'dat2:Numer' => $code['bNumer'],
                'dat2:Opis' => $code['bOpis'],
                'dat2:Symbol' => $code['bSymbol']
            );
            $codeList[$this->_array_2_string($nrAndGid)] = $code['bOpis'];
        }
        $this->set('codes', $codeList);
    }

    /**
     * usun_ocene method
     *
     * @param string|null $bGid
     */
    public function usunOcene($bGid = null)
    {
        $this->viewBuilder()->setTemplate(null);
        $this->viewBuilder()->setLayout('ajax');

        if ($bGid == null) $this->redirect($this->referer());

        $response = $this->Api->UsunOcene($this->_getGid(), $bGid);

        $rjson = $this->_handle_response_json($response);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        echo json_encode($this->_handle_response_json($response));
        die();
//        $this->redirect($this->referer());
    }

    public function kadry()
    {
        $this->viewBuilder()->setLayout('ajax');
    }

    public function bhp()
    {
        $this->viewBuilder()->setLayout('ajax');
    }

    public function zfs()
    {
        $this->viewBuilder()->setLayout('ajax');
    }

    public function home()
    {
        $this->viewBuilder()->setLayout('default');
    }

    /**
     * importy method
     */
    public function importy()
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is(array('post', 'put'))) {
            $this->viewBuilder()->setTemplate(null);

            $data = $this->request->getData()['tem:pImportuj'];

            $data['dat:Rodzaj'] = $data['dat:Nazwa'];

            for ($i = 0; $i <= 4; $i++) {
                if (isset($data['dat:Plik' . $i]) && !empty($data['dat:Plik' . $i])) {
                    if (@!empty($data['dat:Plik' . $i]['tmp_name'])) {
                        $data['dat:NazwaPliku' . $i] = $data['dat:Plik' . $i]['name'];
                        $data['dat:Plik' . $i] = base64_encode(file_get_contents($data['dat:Plik' . $i]['tmp_name']));
                        if ($data['dat:Zaznaczenie' . $i] === "1") {
                            $data['dat:Zaznaczenie' . $i] = 'true';
                        } else {
                            $data['dat:Zaznaczenie' . $i] = 'false';
                        }
                    }
                } else {
                    $data['dat:Zaznaczenie' . $i] = 'false';
                }
            }
            unset($data['dat:Nazwa']);
            ksort($data);

            $response = $this->Api->Importuj($this->_getGid(), $data);
            $rjson = $this->_handle_response_json($response);
            if (isset($rjson['login']) && !empty($rjson['login'])) {
                echo 'login';
                die();
            }

            $json = array();
            if ($response['Komunikaty']['Komunikat']['Rodzaj'] != 'Ok') {
                $json['error'] = $response['Komunikaty']['Komunikat']['Tytul'];
            } else {
                $json['message'] = $response['Komunikaty']['Komunikat']['Tytul'];
            }
            echo json_encode($json);
            return;
        }

        $mozliweImporty = $this->Api->DajMozliweImporty($this->_getGid());

        $rodzaje = array();
        $rodzaje['undefined'] = 'Wybierz';
        $tytul = isset($mozliweImporty['bTytul']) ? $mozliweImporty['bTytul'] : "Importuj";

        if (isset($mozliweImporty['bMozliweImporty']['bMozliwyImport'][0])) {
            foreach ($mozliweImporty['bMozliweImporty']['bMozliwyImport'] as $import) {
                $rodzaje[$import['bRodzaj']] = $import['bNazwa'];
            }
        } elseif (isset($mozliweImporty['bMozliweImporty']['bMozliwyImport'])) {
            $import = $mozliweImporty['bMozliweImporty']['bMozliwyImport'];
            $rodzaje[$import['bRodzaj']] = $import['bNazwa'];
        }

        $this->set(compact('mozliweImporty', 'rodzaje', 'tytul'));

        return;
    }

    /**
     * importuj_formularz
     * @param string $rodzaj
     */
    public function importujFormularz($rodzaj)
    {
        $this->viewBuilder()->setLayout('ajax');

        $mozliweImporty = $this->Api->DajMozliweImporty($this->_getGid());

        $rodzaje = array();
        $rodzaje['undefined'] = 'Wybierz';
        $tytul = isset($mozliweImporty['bTytul']) ? $mozliweImporty['bTytul'] : "Importuj";

        if (isset($mozliweImporty['bMozliweImporty']['bMozliwyImport'][0])) {
            foreach ($mozliweImporty['bMozliweImporty']['bMozliwyImport'] as $import) {
                $rodzaje[$import['bRodzaj']] = $import['bNazwa'];
            }
        } elseif (isset($mozliweImporty['bMozliweImporty']['bMozliwyImport'])) {
            $import = $mozliweImporty['bMozliweImporty']['bMozliwyImport'];
            $rodzaje[$import['bRodzaj']] = $import['bNazwa'];
            $mozliweImporty['bMozliweImporty']['bMozliwyImport'][0] = $mozliweImporty['bMozliweImporty']['bMozliwyImport'];
        }

        $this->set(compact('rodzaj', 'mozliweImporty', 'rodzaje', 'tytul'));
    }

    public function srvinfo()
    {
        $this->viewBuilder()->setLayout('ajax');
        $tmpPath = TMP;
        // Pobranie uprawnień katalogu
        $permissions = fileperms($tmpPath);

        // Sformatowanie uprawnień do formatu octal (np. 0755)
        $tmpPermissions = substr(sprintf('%o', $permissions), -4);

        $logPath = LOGS;
        // Pobranie uprawnień katalogu
        $permissions = fileperms($logPath);

        // Sformatowanie uprawnień do formatu octal (np. 0755)
        $logPermissions = substr(sprintf('%o', $permissions), -4);


        $this->set(compact('logPath', 'logPermissions', 'tmpPath', 'tmpPermissions'));
    }

    public function ajaxWnioskiZastepca()
    {
        $this->viewBuilder()->setLayout('ajax');

        $wnioski = $this->Api->DajListeWnioskowZWskazaniemNaZastepce($this->_getGid());

        $this->set(compact('wnioski'));
    }

    public function akceptujWniosekZastepca($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        $options = array(
            'gidWniosku' => $gid
        );

        $response = $this->Api->AkceptujZastepstwo($this->_getGid(), $options);

        $rjson = $this->_handle_response_json($response);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        echo json_encode($rjson);
        $this->redirect('/js/zastepca.js');
        die();
    }

    public function odrzucWniosekZastepca($gid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        $options = array(
            'gidWniosku' => $gid
        );

        $response = $this->Api->OdrzucZastepstwo($this->_getGid(), $options);

        $rjson = $this->_handle_response_json($response);
        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        echo json_encode($rjson);
        $this->redirect('/js/zastepca.js');
        die();
    }

    /**
     * @param string $time
     * @return float
     */
    protected function _time_for_request($time = null)
    {
        $hour = 0;

        if (!empty($time)) {
            if (strpos($time, ":") !== false) {

                $vals = explode(":", (string)$time);

                if (count($vals) >= 2) {
                    $h = (int)$vals[0];
                    $m = (int)$vals[1];

                    $hour = $h + ($m * 1 / 100);
                }
            }
        }

        return round($hour, 2);
    }

    protected function _time_for_respons($time = null, $delimiter = '.')
    {
        $hour = "00:00";

        if (!empty($time)) {
            $vals = explode($delimiter, (string)$time);

            if (count($vals) >= 2) {

                $h = $vals[0];
                $m = $vals[1];

                if (strlen($h) == 1) {
                    $vals[0] = "0" . $h;
                }

                if (strlen($m) == 1) {
                    $vals[1] = "0" . $m;
                }

                $hour = $vals[0] . ":" . $vals[1];
            }
        }

        return $hour;
    }

    public function ajaxSaldoUrlopu($numer)
    {

        $this->viewBuilder()->setLayout('ajax');

        $saldo = $this->_saldo_urlopu_5($numer);

        $resp = $this->_handle_response_json($saldo);
        $this->set(compact('resp'));

        $this->set(compact('saldo'));
    }

    /**
     * @return array|mixed
     */
    protected function _appconfig()
    {
        $config = new IniConfig(ROOT . DS . 'config' . DS);
        $appconfig = $config->read('appconfig');

        $this->set(compact('appconfig'));
        return $appconfig;
    }

    public function dajKartyRcp($nrEwid)
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('ajax_daj_karty_rcp');

        if ($this->request->is(array('post'))) {

            $data = $this->request->getData();

            $options = array();

            if (!empty($data['filtrOd'])) {
                $options['OkresOd'] = $data['filtrOd'] . 'T00:00:00';
            }

            if (!empty($data['filtrDo'])) {
                $options['OkresDo'] = $data['filtrDo'] . 'T23:59:59';
            }

            if ($nrEwid) {
                $options['Nrewid'] = $nrEwid;
            }

        } else {
            $options = array();
        }

        $resp = $this->Api->DajListeKartRCP($this->_getGid(), $options);

        if (isset($resp['bKartyRCP']['bElementListyKartRCP'][0])) {
            $items = $resp['bKartyRCP']['bElementListyKartRCP'];
        } elseif (isset($resp['bKartyRCP']['bElementListyKartRCP'])) {
            $items = [$resp['bKartyRCP']['bElementListyKartRCP']];
        } else {
            $items = [];
        }

        $rjson = $this->_handle_response_json($resp);

        if (isset($rjson['login']) && !empty($rjson['login'])) {
            echo 'login';
            die();
        }

        $this->set(compact('items'));
    }

    public function pobierzCzas()
    {
        $response = $this->Api->DajDateICzasWygasnieciaSesji($this->_getGid());

        if (!empty($response['bDataICzasWygasnieciaSesji']) && !empty($response['bDataNaSerwerze'])) {
            $t = strtotime($response['bDataICzasWygasnieciaSesji']);
            $n = strtotime($response['bDataNaSerwerze']);
            echo json_encode(['time' => round(($t - $n) / 60, 2), 'show' => $response['bCzyZegarWlaczony']]);
        } else {
            echo json_encode(['time' => '0', 'show' => 'false']);
        }

        die();
    }

    /**
     * przedluzSesje - odświeża czas sesji na serwerze zewnętrznym
     */
    public function przedluzSesje(): void
    {
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate(null);

        $gid = $this->_getGid();
        if (!empty($gid)) {
            $this->Api->DajDateICzasWygasnieciaSesji($gid);
        }

        echo json_encode(['status' => 'ok']);
        die();
    }

    public function mojeRaportyPortalu(): void
    {
        $this->viewBuilder()->setLayout('ajax');

        $raporty = $this->Api->dajListeRaportowPortalu($this->_getGid());

        // Check for errors in the API response first
        $rjson = $this->_handle_response_json($raporty);

        // Obsługa odpowiedzi
        if (!empty($rjson['login'])) {
            $this->redirect(['controller' => 'Users', 'action' => 'login']);
            return;
        }

        if (!empty($rjson['error'])) {
            // Set error message and empty list
            $this->Flash->error($rjson['error']);
            $listaRaportow = [];
            $this->set(compact('listaRaportow'));
            return;
        }

        // Process report list if no errors
        $listaRaportow = [];
        $oneElement = false;
        if (isset($raporty['bModuly']['bModul'])) {
            foreach ($raporty['bModuly']['bModul'] as $raport) {
                if (is_array($raport) and !empty($raport)) {
                    $listaRaportow[] = $raport;
                } else {
                    $oneElement = true;
                }
            }
            if ($oneElement) {
                $listaWnioskowZFS[] = $raporty['bWnioskiZFS']['bWniosekZFS'];
            }
        }

        $this->set(compact('listaRaportow'));
    }

    public function raportPortaluDrukuj(): void
    {
        set_time_limit(900);
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is(array('post', 'put'))) {
            $form = $this->request->getData();

            $options = [];
            $options['identyfikator'] = $form['identyfikator'] ?? null;
            $options['gidDokumentu'] = $form['gidDokumentu'] ?? null;
            $options['numer'] = $form['numer'] ?? $this->Auth->user('cNumerEwidencyjny');

            // Build ParametryRaportuPortalu if provided
            if (!empty($form['parametryRaportuPortalu'])) {
                $params = $form['parametryRaportuPortalu'];
                $parametry = [];

                if (isset($params['RodzajOkresu'])) {
                    $parametry['RodzajOkresu'] = $params['RodzajOkresu'];
                }

                if (isset($params['CzyNumeryEwidencyjne'])) {
                    $parametry['CzyNumeryEwidencyjne'] = (bool)$params['CzyNumeryEwidencyjne'];
                }

                if (!empty($params['NumeryEwidencyjne']) && is_array($params['NumeryEwidencyjne'])) {
                    $parametry['NumeryEwidencyjne'] = $params['NumeryEwidencyjne'];
                }

                if (!empty($params['OkresOd'])) {
                    // Convert date to ISO 8601 format for SOAP
                    $parametry['OkresOd'] = date('Y-m-d\TH:i:s', strtotime($params['OkresOd']));
                }

                if (!empty($params['OkresDo'])) {
                    // Convert date to ISO 8601 format for SOAP
                    $parametry['OkresDo'] = date('Y-m-d\TH:i:s', strtotime($params['OkresDo']));
                }

                $options['parametryRaportuPortalu'] = $parametry;
            }

            $response = $this->Api->drukujRaportPortalu($this->_getGid(), $options);

            $resp = $this->_handle_response_json($response);
            if (isset($resp['login'])) {
                $this->redirect('/');
            } elseif (isset($resp['error'])) {
                // Return error as JSON instead of treating it as PDF
                header('Content-Type: application/json');
                echo json_encode(['success' => false, 'error' => $resp['error']]);
            } else {
                if (!empty($response['bPDF'])) {
                    $content = base64_decode($response['bPDF']);
                    $filename = 'raport_portalu_' . ($options['identyfikator'] ?? 'report') . '.pdf';
                    $extension = 'pdf';

                    header('Content-Type: application/' . $extension);
                    header('Content-Length: ' . strlen($content));
                    header('Content-Disposition: inline; filename="' . $filename . '"');
                    header('Cache-Control: private, max-age=0, must-revalidate');
                    header('Pragma: public');
                    ini_set('zlib.output_compression', '0');

                    echo $content;
                } else {
                    // No PDF and no error message - return generic error
                    header('Content-Type: application/json');
                    echo json_encode(['success' => false, 'error' => 'Nie udało się wygenerować raportu.']);
                }
            }
            die();
        }
    }

    public function raportPortaluKonfiguruj(): void
    {
        $this->viewBuilder()->setLayout('ajax');

        if ($this->request->is(array('post', 'put'))) {
            $form = $this->request->getData();
            $reportGid = $form['reportGid'] ?? null;

            if (!$reportGid) {
                echo json_encode(['success' => false, 'message' => 'Brak identyfikatora raportu']);
                die();
            }

            $response = $this->Api->konfigurujRaportPortalu($this->_getGid(), $reportGid);
            $resp = $this->_handle_response_json($response);

            if (isset($resp['login'])) {
                echo json_encode(['success' => false, 'login' => true]);
            } elseif (isset($resp['error'])) {
                echo json_encode(['success' => false, 'message' => $resp['error']]);
            } else {
                echo json_encode(['success' => true, 'data' => $response]);
            }
            die();
        }
    }

    protected function mergeData($master, $arr, $allowKey = array(), $format = array())
    {
        foreach ($arr as $key => $val) {
            if ((is_array($master[$key]) && !empty($master[$key])) && (is_array($val) && !empty($val))) {
                $master[$key] = $this->mergeData($master[$key], $val);
            } else if (key_exists($key, $master)) {
                if (empty($allowKey)) {
                    $master[$key] = $val;
                } else if (in_array($key, $allowKey)) {
                    $master[$key] = $val;
                }
                if (key_exists($key, $format)) {
                    switch ($format[$key]) {
                        case 'AddTime':
                            if ($val) {
                                $master[$key] = $val . 'T00:00:00';
                            }
                            break;
                        case 'CutMicroTime':
                            if ($pos = strpos($val, ".")) {
                                $master[$key] = substr($val, 0, $pos);
                            }
                            break;
                        case 'Br':
                            $master[$key] = str_replace("<br>", "\n", $val);
                            break;
                        case 'FormatTime':
                            if ($pos = strpos($val, ":")) {
                                $time = explode(":", (string)$val);
                                $time[0] = strlen($time[0]) == 1 ? '0' . $time[0] : $time[0];
                                $time[1] = strlen($time[1]) == 1 ? '0' . $time[1] : $time[1];
                                $master[$key] = $time[0] . ':' . $time[1];
                            } else if (is_numeric($val)) {
                                $time = strpos($val, ".") >= 1 ? explode(".", (string)$val) : [$val, "0"];
                                $time[0] = strlen($time[0]) == 1 ? '0' . $time[0] : $time[0];
                                $time[1] = strlen($time[1]) == 1 ? '0' . $time[1] : $time[1];
                                $master[$key] = $time[0] . ':' . $time[1];
                            }
                            break;
                    }
                }
            }
        }

        return $master;
    }

    protected function _show_keys($arr)
    {
        $temp = array();
        foreach ($arr as $k => $v) {
            $temp[] = $k;
            if (is_array($arr[$k])) {
                $temp = array_merge($this->_show_keys($arr[$k]), $temp);
            }
        }

        return $temp;
    }

    /**
     * Check if array contains only scalar values (no nested arrays)
     * @param array $arr
     * @return bool
     */
    protected function _is_flat_array($arr)
    {
        if (!is_array($arr)) {
            return true;
        }
        foreach ($arr as $value) {
            if (is_array($value)) {
                return false;
            }
        }
        return true;
    }

    /**
     * @param array $data
     */
    private function _getZalaczniki(&$data, string $key2 = 'dat1:'): int
    {
        $filesCounter = 0;
        if (count($_FILES['data']['tmp_name']['file']) > 0) {
            for ($i = 0; $i < count($_FILES['data']['tmp_name']['file']); $i++) {
                $uploadFile = WWW_ROOT . 'uploads/' . $_FILES['data']['name']['file'][$i];
                move_uploaded_file($_FILES['data']['tmp_name']['file'][$i], $uploadFile);
                /** @var UploadedFile $fileObject */
                $fileObject = new UploadedFile(
                    new Stream($uploadFile),
                    (int)$_FILES['data']['size']['file'][$i],
                    (int)$_FILES['data']['error']['file'][$i],
                    $_FILES['data']['name']['file'][$i]);
                if ((int)$fileObject->getSize() > 0) {
                    $file = $this->_zalaczniki($fileObject, 'dat:', $key2);
                    if ($file) {
                        $data['dat:Zalaczniki'][] = $file['dat:Zalaczniki'];
                        $filesCounter++;
                    } else {
                        $this->Flash->error('Nie udało się przesłać pliku. Spróbuj ponownie');
                    }
                }
            }
        }

        return $filesCounter;
    }

    private function changeEmptyArrayToString(array $zgloszenieSzkolenia, string $string): array
    {
        $array = $zgloszenieSzkolenia[$string] ?? [];
        if (empty($array)) {
            return [];
        }

        foreach ($array as $key => $value) {
            if (is_array($value) and empty($value)) {
                $array[$key] = '';
            }
        }

        return $array;
    }
}

if (!function_exists('ddebug')) {
    /**
     * ddebug method
     * @param mixed $data
     */
    function ddebug($data)
    {
        echo '<pre>';
        var_dump($data);
        echo '</pre>';
        die();
    }
}
