Převod ze starého admina na nového

Postup při změně administrace na novou verzi

  • Nakopírovat js soubory a scss soubory (založit složku sass a do ní vložit nové sass soubory pro admin z dema), změnit kompilaci v webpack.mix.js
  • Přehrát bootstrap - je potřeba přehrát i JS soubory ve složce resources! staré můžeme přejmenovat na neco_old (pozor na FRONT! kdyžtak udělat duplicitně)
  • Doplnit proměnné
  • Hromadná změna sloupcových tříd - col-xs-12 na col-12 hidden na d-none, tlačítka apod. - viz. http://upgrade-bootstrap.bootply.com/ (vše ve složce fencee/app/presenters/Admin)
  • Úprava layout podle demowebu
    • Úprava logo
    • Úprava navigace.latte
      nahradit: 'btn btn-default selected' : 'btn btn-default' =>  'selected' : ' '
      přidat do n:class: 'jmeno-ikony ico-before'
      odstranit <i> ikony a col-12 z navigace
    • Úprava pravé menu - viz demo
  • Postupný přepis container tříd, změna struktury chybně zanořených row a col.
  • Úprava app.js - viz demoweb
  • Úprava router + přidání funkcí do presenterů
    • $adminRoutes[] = new Route('/admin/menu/labeled[/<checkbox_id [0-9]+>]', 'Menu:labeled') + renderLabeled
  • Nahradit tabulky - zde příklad - viz. demo - přes regexy viz. níže, provézt kontrolu jestli se vše opravdu změnilo (rádo to háže stack overflow error), například statelist
    <div class="custom-table">
                <div class="table-head">
                    <div class="table-row">
    
                        <div class="table-caption">{_admin.table.name}</div>
                        <div class="table-caption">{_admin.table.note}</div>
                        <div class="table-caption"></div>
                    </div>
                </div>
    
    
                <div class="table-body">
                    <div class="table-row" n:foreach="$files as $file" >
                        <div class="table-cell ">
                            {$file->name|upper}
                        </div>
    
                        <div class="table-cell">
                            {$file->note}
                        </div>
    
    
                        <div class="table-cell buttons-on-end no-margins">
                            <a n:href="rescue! file_id => $file->id" class="btn btn-ghost ">{_admin.button.recovery}</a>
                        </div>
                    </div>
                </div>
            </div>
  • Přepis checkboxů a radio
    • vyhledat toto $form["hidden"]->items,$form["menu_id"]->items, $form["vat"]->items a postupně po kontrole vložit toto
      <label class="formLabel radio--fake" n:name="hidden:$key">
      	<input n:name="hidden:$key">
      	<div class="fake"></div>
      	<span>{_$label}</span>
      </label>
    • vyhledat toto $form["supplementCheckbox"]->items, <label class="formLabel" n:name="virtual"> a postupně po kontrole vložit toto + form
      <label class="formLabel check--fake" n:name="supplementCheckbox:$key">
      	<input n:name="supplementCheckbox:$key">
      	<span class="fake"></span>
      	<span>{$label}</span>
      </label>​
  • Nakopírovat bottom bar do potřebných šablon - vyhledat toto btn btn-success saveFormButton
  • Postupná změna horní části - menu/item product/item atd.
  • Postupně přepsat tree.latte soubory
  • Předělat dashboard (většina věcí jde jen nakopírovat, přesto je lepší zkontrolovat, že sedí - app/components/Dashboard - dashboard.latte, php a potom jednotlivé podsložky)
  • Doplnění nových věcí (posuvná lišta atd.)
  • fa fa-pencil-square-o, fa fa-pencil-square-o - výběr edit tlačítek - umazat ikonu a změnit na btn btn-edit - viz demo (popřípadě zanechat ajax)

  • fa fa-trash, fa fa-trash-o - výběr trash tlačítek - umazat ikonu a změnit na btn btn-trash - viz demo (popřípadě zanechat ajax)

  • btn-trash - odstranit text uvnitř - povětšinou {_admin.button.to_bin}
  • class="ajax btn btn-success btn-sm" - kde je hide nebo show funkce,dát pryč ikonu  a změnit na class="ajax btn btn-isVisible"
    class="ajax btn btn-danger btn-sm" kde je hide nebo show funkce,dát pryč ikonu a změnit na class="ajax btn btn-isVisible notVisible"
    class="ajax btn btn-default btn-sm disabled"
    kde je up funkce,dát pryč ikonu a změnit na class="ajax btn btn-up disabled"
    class="ajax btn btn-default btn-sm"
    kde je up funkce,dát pryč ikonu a změnit na class="ajax btn btn-up"
    class="ajax btn btn-default btn-sm disabled"
    kde je down funkce,dát pryč ikonu a změnit na class="ajax btn btn-down disabled"
    class="ajax btn btn-default btn-sm" kde je down funkce,dát pryč ikonu a změnit na class="ajax btn btn-down "
    - poté vymazat všude kde je
    <i class="fa fa-eye"></i>,

    <i class="fa fa-eye-slash"></i>,
    <i class="fa fa-arrow-circle-up"></i>,
    <i class="fa fa-arrow-circle-down"></i>,
    <i class="fa fa-file-image-o"></i>
    <i class="fa fa-envelope-o"></i>

    <i class="fa fa-level-up"></i>
    <i class="fa fa-user"></i> (pozor na jstree)
  • přepsat třídu controlTd na left-part, dodat třídu left-part kde se vyskytují tlačítka jako btn-up, btn-isVisible atd.
  • sortableTable - nahradit za data-table-sortable, odmazat class="sortable" data-sort="string" a <i class="fa fa-sort"></i>
  • Přepsat assets/admin - primárně libs a jstree
  • Přepsat {first} na {if $iterator->isFirst()} a {/first} na {/if}  postupně - vyhledat v projektu
  • Přepsat {last} na {if $iterator->isLast()} a {/last} na {/if}  postupně - vyhledat v projektu
  • Vyhledat form-group a tam kde je pod ním sloupec, doplnit do něj nejdřív <div class="row"> a uzavřít před koncem

Položky menu a produkt

Nejdříve upravíme BasePresenter.php podle dema

Menufactory - zkopírovat od tohoto řádku $form->addCheckbox('c_addToGallery', 'Přidat obrázky do galerie') - cca řádek 239 z dema až po $addToFiles->addUpload('file_input', 'Soubor:')
->addConditionOn($form['c_addToFiles'], $form::EQUAL, true) - cca 326
->setRequired('Přidejte soubor, který chcete nahrát.');
a přidat do projektu.

Poznatky k optimalizaci

Regexy

col-(xs|sm|md|lg)-offset-(\d+) - všechny sloupcové offsety (nahrazení je potom takto offset-$1-$2)

col-xs-(\d+) - všechny xs sloupce (nahrazení je potom takto col-$1) v $1 je potom celý match

( *?<section class=".*?center-panel.*?".*?>) - vybere centerPanel začátek sekce, konec rightPanel sekce bohužel musíme vybrat ručně a vložit tam konec dvou divů (je potřeba zkontrolovat i stránky kde je pouze centerPanel, osvědčilo se mi vyhledání </section> v administraci) </div></div> v $1 je potom celý match, dále je potřeba zanořit {form neco} až do sloupce

- nahrazení <div class="col-12 col-md-12 col-lg-10 right-part-wrapper">
<div class="row">\n $1

^(<div class="row">(?:(\n|\r|\s)*)?<section class="(?:.*)?center-panel(?:.*)?"(?:.*)?>)$ - vybrání centerpanelu a row před

col-(?!(?:12))(\d+) col - výběr tříd kde není responzivita - col-1-11, můžeme replacenout podobně jako v demu, replace "col-12 col"

"col-(?!(?:12))(\d+)" - výběr tříd kde není responzivita a ani jiná třída - col-1-11, můžeme replacenout podobně jako v demu - šikový replace "col-12 col-md-$1"

col-12 col-md-2 col-lg-(\d+) right-panel přepsat na col-12 col-md-3 right-panel

( *?<section class=".*?right-panel.*?".*?>) - vybere rightPanel začátek sekce a vložíme <div class="right-panel-content">, konec rightPanel sekce bohužel musíme vybrat ručně a vložit tam konec divu

Tabulkové regexy

<table([^>]*?)class="table table-striped((?:.|\s)*?)">((?:.|\s)*?)<\/table> - vybere všechny tabulky - nahradit za <div$1class="custom-table $2">$3</div>

(<div(?:[^>]*?)class="custom-table(?:.|\s)*?">(?:.|\s)*?)<thead>((?:.|\s)*?)<\/thead>((?:.|\s)*?<\/div>) - thead změna $1<div class="table-head">$2</div>$3

(<div(?:[^>]*?)class="custom-table(?:.|\s)*?">(?:.|\s)*?)<tbody>((?:.|\s)*?)<\/tbody>((?:.|\s)*?<\/div>) - tbody změna $1<div class="table-body">$2</div>$3

(<div class="table-body(?:.|\s)*?">(?:.|\s)*?)<tr((?:.|\s)*?)>((?:.|\s)*?)<\/tr> - table-row změna $1<div class="table-row" $2>$3</div> - zkusit vícekrát

(<div class="table-head(?:.|\s)*?">(?:.|\s)*?)<tr((?:.|\s)*?)>((?:.|\s)*?)<\/tr> - table-row změna $1<div class="table-row" $2>$3</div> - zkusit vícekrát

(<div class="table-body(?:.|\s)*?">(?:.|\s)*?)<td((?:.|\s)*?)>((?:.|\s)*?)<\/td> - table-cell změna $1<div class="table-cell" $2>$3</div> - zkusit vícekrát

(<div class="table-head(?:.|\s)*?">(?:.|\s)*?)<th((?:.|\s)*?)>((?:.|\s)*?)<\/th> - table-caption změna $1<div class="table-caption" $2>$3</div> - zkusit vícekrát

class="table-cell" class="lastTd" - změna na class="table-cell lastTd"

class="table-cell" class="controlTd" + vyhledat controlTd - změna na class="table-cell left-part"

Vyhledání

<(?:[^>]*?)class="(?:[^>]*?)"(?:[^>]*?)n:class="(?:[^>]*?)"(?:[^>]*?)> - class a n:class - duplicitně

Chyby

class="partialForm" {if $galleries || $files}style='display:block;'{/if}" - zde je pravděpodobně navíc uvozovka, rozbije to formátování a layout

Replace bootstrap třídy (mimo regex - pouze latte zatím!)

.hidden .d-none (pouze latte! a postupně! - chceme pouze třídy, jiné třídy jsem nenalezl)
.hidden-xs .d-none
.hidden-sm .d-sm-none
.hidden-md .d-md-none
.hidden-lg .d-lg-none
.visible-xs .d-block.d-sm-none
.visible-sm .d-none.d-sm-block.d-md-none
.visible-md .d-none.d-md-block.d-lg-none
.visible-lg .d-none.d-lg-block.d-xl-none

 

Doplnění translation - podle dema

Přehrát a zkontrolovat zda nedošlo ke smazání nějaké translation v git, lepší postupně a pak popřípadě doházet pokud omylem dojde ke smazání

SQL

nové konfigy

INSERT INTO settings_config (id, name, value, hidden, type, note, visible)
VALUES ('ADMIN_ACTIONS_PER_PAGE', 'Počet akcí na stránku', '20', 0, 'input', '', 0),
('ENABLE_MENU_STRUCTURE_DUPLICATION',	'Zapnout možnost duplikace struktury ',	'0',	0,	'input',	'',	0),
('ADMIN_INSTAGRAM', 'Přidat tlačítko instagramu do adminu pro přihlášení', '0', 0, 'input',
'Přidá tlačítko přihlásit se přes instagram do nastavení webu, po přihlášení se zobrazí instagram příspěvky na webu.', 0),
('ADMIN_LOGO_SRC', 'Admin - cesta k logu', '/assets/logo.png', 0, 'input', '', 0),
('ADMIN_MODULE_ORDER_DISTRIBUTOR', 'ADMIN_MODULE_ORDER_DISTRIBUTOR', 'ADMIN_MODULE_ORDER_DISTRIBUTOR ', 0, 'input', '', 0),
('ADMIN_SUPPLIERS', 'Aktivovat funkcionalitu dodavatelů', '1', 0, 'input',
'Zobrazí v treemenu moznosti s dodavatelem (vytvorení, editace, seznam) a přidá položku do tvorby a úpravy produktu.', 0),
('ADMIN_TAB_ACTIONS', 'ADMIN_TAB_ACTIONS', 'ADMIN_TAB_ACTIONS ', 0, 'input', '', 0),
('ADMIN_TAB_CRM', 'ADMIN_TAB_CRM', 'ADMIN_TAB_CRM ', 1, 'input', '', 0),
('ADMIN_TAB_DEALER', 'ADMIN_TAB_DEALER', 'ADMIN_TAB_DEALER ', 0, 'input', '', 0),
('ADMIN_TAB_ESHOP', 'ADMIN_TAB_ESHOP', 'ADMIN_TAB_ESHOP ', 0, 'input', '', 0),
('ADMIN_TAB_FILES', 'ADMIN_TAB_FILES', 'ADMIN_TAB_FILES ', 0, 'input', '', 0),
('ADMIN_TAB_GALLERY', 'ADMIN_TAB_GALLERY', 'ADMIN_TAB_GALLERY ', 0, 'input', '', 0),
('ADMIN_TAB_NEWSLETTER', 'ADMIN_TAB_NEWSLETTER', 'ADMIN_TAB_NEWSLETTER ', 0, 'input', '', 0),
('ADMIN_TAB_SETTINGS', 'ADMIN_TAB_SETTINGS', 'ADMIN_TAB_SETTINGS ', 0, 'input', '', 0),
('ADMIN_TAB_STATISTIC', 'Statistiky', '1', 0, 'input', '', 0),
('ADMIN_TAB_USERS', 'ADMIN_TAB_USERS', 'ADMIN_TAB_USERS ', 0, 'input', '', 0),
('BANNED_DOMAINS', 'Vyřazené e-mailové domény', 'verizon.net\nssemarketing.net\ncomcast.net\npobox.com\ncharter.net\nfrontier.com\ncox.net', 0,
'textarea', '', 0),
('BANNED_PHONES', 'Zakázané telefony', '+1 213 425 1453\n12134251453', 0, 'textarea', '', 0),
('CURRENCY_SYMBOLS', 'Symboly měn', 'CZK::Kč\nEUR::€', 0, 'textarea', 'CURRENCY::SYMBOL\nCURRENCY::SYMBOL\nCURRENCY::SYMBOL', 0),
('IS_ESHOP', 'IS_ESHOP', 'IS_ESHOP', 0, 'input', '', 0),
('SUPPLIER_MENU_ID', 'ID menu dodavatelů', '4', 0, 'input', '', 0);

Nové tabulky

CREATE TABLE admin_overwatch
(
	id          INT(11)                            NOT NULL AUTO_INCREMENT,
	lang        INT(2)                             NOT NULL,
	work_id     VARCHAR(255) COLLATE utf8_czech_ci NOT NULL,
	`desc`      VARCHAR(255) COLLATE utf8_czech_ci NOT NULL,
	date        DATETIME                           NOT NULL,
	user        INT(11)                            DEFAULT NULL,
	target_item VARCHAR(255) COLLATE utf8_czech_ci DEFAULT NULL,
	PRIMARY KEY (id)
) ENGINE = InnoDB
	DEFAULT CHARSET = utf8
	COLLATE = utf8_czech_ci;


CREATE TABLE `settings_video` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `module_id` int(10) unsigned NOT NULL,
  `menus` varchar(100) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `folder` varchar(255) NOT NULL,
  `mask` varchar(255) NOT NULL,
  `format` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;

CREATE TABLE `video_detail` (
  `id` varchar(20) NOT NULL,
  `lang` tinyint(4) unsigned NOT NULL,
  `name` varchar(255) NOT NULL,
  `alt` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;

CREATE TABLE `image_detail` (
  `id` varchar(20) NOT NULL,
  `lang` tinyint(4) unsigned NOT NULL,
  `name` varchar(255) NOT NULL,
  `alt` varchar(255) NOT NULL,
  PRIMARY KEY (`id`,`lang`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;



CREATE TABLE `comment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lang` int(10) unsigned NOT NULL,
  `module_id` int(10) unsigned NOT NULL,
  `item_id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL,
  `email` varchar(100) NOT NULL,
  `text` text NOT NULL,
  `date_inserted` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `hidden` tinyint(2) NOT NULL,
  `parent_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `module_id` (`module_id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `comment_ibfk_1` FOREIGN KEY (`module_id`) REFERENCES `module` (`id`) ON DELETE NO ACTION,
  CONSTRAINT `comment_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;


CREATE TABLE `help` (
  `id` varchar(30) NOT NULL,
  `modul` varchar(100) NOT NULL,
  `value` varchar(100) DEFAULT NULL,
  `lang` int(10) NOT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

CREATE TABLE `menu_item_x_user` (
  `menu_item_id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `lang` tinyint(2) NOT NULL,
  PRIMARY KEY (`menu_item_id`,`user_id`,`lang`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `menu_item_x_user_ibfk_1` FOREIGN KEY (`menu_item_id`) REFERENCES `menu_item` (`id`),
  CONSTRAINT `menu_item_x_user_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `user_x_supplement` (
  `user_id` int(10) unsigned NOT NULL,
  `supplement_id` int(10) unsigned NOT NULL,
  `lang` tinyint(4) unsigned NOT NULL,
  `value` text NOT NULL,
  `date` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`user_id`,`supplement_id`,`lang`),
  KEY `supplement_id` (`supplement_id`),
  CONSTRAINT `user_x_supplement_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
  CONSTRAINT `user_x_supplement_ibfk_2` FOREIGN KEY (`supplement_id`) REFERENCES `supplement` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

CREATE TABLE `orders` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `lang` tinyint(2) NOT NULL,
  `lang_second` tinyint(4) DEFAULT NULL,
  `user_id` int(10) unsigned DEFAULT NULL,
  `second_address_id` int(10) unsigned DEFAULT NULL,
  `transport_id` int(10) unsigned NOT NULL,
  `payment_id` int(10) unsigned NOT NULL,
  `state_id` int(10) unsigned NOT NULL,
  `vo` tinyint(2) NOT NULL,
  `discount` int(11) NOT NULL,
  `user_name` varchar(255) NOT NULL,
  `user_address` varchar(255) NOT NULL,
  `user_city` varchar(255) NOT NULL,
  `user_zip` varchar(255) NOT NULL,
  `user_country` tinyint(2) NOT NULL DEFAULT 1,
  `user_email` varchar(255) NOT NULL,
  `user_phone` varchar(255) NOT NULL,
  `firm_name` varchar(255) DEFAULT NULL,
  `firm_id_number` varchar(255) DEFAULT NULL,
  `firm_vat_number` varchar(255) DEFAULT NULL,
  `newsletter` tinyint(4) DEFAULT NULL,
  `gateway_id` float DEFAULT NULL,
  `gateway_status` varchar(20) DEFAULT NULL,
  `note` text DEFAULT NULL,
  `time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `pohoda_exported` tinyint(2) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  KEY `prefix_order_user_id_foreign` (`user_id`),
  KEY `prefix_order_second_address_id_foreign` (`second_address_id`),
  KEY `prefix_order_transport_id_foreign` (`transport_id`),
  KEY `prefix_order_payment_id_foreign` (`payment_id`),
  KEY `prefix_order_state_id_foreign` (`state_id`),
  KEY `prefix_order_user_name_index` (`user_name`),
  KEY `prefix_order_user_city_index` (`user_city`),
  KEY `prefix_order_user_zip_index` (`user_zip`),
  KEY `prefix_order_user_email_index` (`user_email`),
  CONSTRAINT `prefix_order_payment_id_foreign` FOREIGN KEY (`payment_id`) REFERENCES `settings_payment` (`id`),
  CONSTRAINT `prefix_order_second_address_id_foreign` FOREIGN KEY (`second_address_id`) REFERENCES `order_second_address` (`id`),
  CONSTRAINT `prefix_order_state_id_foreign` FOREIGN KEY (`state_id`) REFERENCES `order_state` (`id`),
  CONSTRAINT `prefix_order_transport_id_foreign` FOREIGN KEY (`transport_id`) REFERENCES `settings_transport` (`id`),
  CONSTRAINT `prefix_order_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;


CREATE TABLE product_supplier(
	id           INT(10) UNSIGNED                   NOT NULL,
	lang         TINYINT(2)                         NOT NULL,
	hidden       TINYINT(2)                         NOT NULL,
	name         VARCHAR(255) COLLATE utf8_czech_ci NOT NULL,
	position     INT(11)                            NOT NULL,
	note         TEXT COLLATE utf8_czech_ci         NOT NULL,
	menu_item_id INT(11) DEFAULT NULL,
	PRIMARY KEY (id, lang),
	KEY prefix_product_supplier_name_index (name)
) ENGINE = InnoDB
	DEFAULT CHARSET = utf8
	COLLATE = utf8_czech_ci;

CREATE TABLE product_supplier_x_supplement(
	supplier_id   INT(10) UNSIGNED                               NOT NULL,
	supplement_id INT(10) UNSIGNED                               NOT NULL,
	lang          TINYINT(2)                                     NOT NULL,
	value         TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
	date          TIMESTAMP                                      NOT NULL DEFAULT '0000-00-00 00:00:00',
	PRIMARY KEY (supplier_id, supplement_id, lang),
	KEY prefix_supplier_x_supply_supply_id_foreign (supplement_id),
	CONSTRAINT prefix_supplier_x_supply_supplier_id_foreign FOREIGN KEY (supplier_id) REFERENCES product_supplier (id),
	CONSTRAINT prefix_supplier_x_supply_supply_id_foreign FOREIGN KEY (supplement_id) REFERENCES supplement (id)
) ENGINE = InnoDB
	DEFAULT CHARSET = utf8
	COLLATE = utf8_czech_ci;

Pročištění

DELETE FROM menu_item_x_supplement WHERE value = '';

Nevíte si rady?
Neváhejte se zeptat

Nevíte si rady nebo potřebujete něco konzultovat? Nápovědu stále zdokonalujeme na základě vašich požadavků a postřehů. Uvádíme co nejvíce možných variant, které používáme na řešení jednotlivých částí webu, mějte ale na paměti, že projekty řešíme individuálně na základě konkrétních potřeb.

Nádražní 876
560 02 Česká Třebová

honza.cech@czechgroup.cz

+420 774 201 483

*
*