Menu Zavřít

Aby účetnictví byla konečně opravdová pohoda. Na český trh vstupuje nový účetní software, Evalu v brněnském Seyforu vyvíjeli čtyři roky

1. 3. 2024
Doba čtení: 3 minuty
Autor: Seyfor
  • Počínaje 1. březnem mají čeští účetní k dispozici zbrusu nový účetní software. Jmenuje se Evala a stojí za ním brněnská společnost Seyfor podnikatele Martina Cíglera
  • Evala vznikala dlouhé čtyři roky, na jejím vývoji se přitom podíleli i ti, jimž je určena především – tedy samostatní účetní a účetní kanceláře
  • Hlavní předností nového programu je, že funguje z cloudu, tudíž na něm účetní může pracovat de facto odkudkoliv, kde má přístup k internetu. A protože disponuje technologií strojového učení, poradí si i s nestrukturovanými daty z vyfocených dokladů

Vyvinout zbrusu nový účetní systém pro 21. století. Přesně takový cíl si před časem dali vývojáři z brněnské společnosti Seyfor pod vedením podnikatele a vizionáře Martina Cíglera.

Cesta od původního prototypu k plnohodnotné a komerčně využitelné verzi sice trvala celý jeden olympijský cyklus (čtyři roky), během něhož na ní pracovala přibližně třicítka lidí, ale vyplatilo se. Právě v pátek 1. března vstupuje Evala, jak je tento program pojmenován, na tuzemský trh. A jeho ambice? Nic jiného než nahradit stávající účetní systémy, které zdejší účetní kanceláře a samostatní účetní využívají.

„Většina účetních programů na českém trhu vznikla jako obecná sada nástrojů pro malé a střední firmy. My jsme se s Evalou naopak zaměřili na podnikání účetních kanceláří a snažili jsme se vytvořit program tak, aby řešil problémy, se kterými se externí účetní potýkají. Ať už to jsou složité integrace dalších nástrojů, nebo problematická komunikace se zákazníkem,“ objasnil zakladatel dotčeného programu Jan Štacha.

Účtovat odkudkoliv, kde je internet

Ve snaze vytvořit takový software, který profesionálním účetním jejich práci co možná nejvíce usnadní a zároveň bude i uživatelsky přívětivý, vznikala jeho značná část přímo v terénu u potenciálních zákazníků. „Navštívili jsme asi třicet kanceláří po celé republice, kde nás zajímalo především to, co účetní v dnešní době trápí a jak by podle nich měl vypadat ideální účetní program,“ přiblížil Štacha. 

Má dáti, ale nedá, neboť nestíhá. Česko trápí nedostatek samostatných účetních, polovina z nich odmítá nové klienty, ukazuje průzkum
Přečtěte si také:

Má dáti, ale nedá, neboť nestíhá. Česko trápí nedostatek samostatných účetních, polovina z nich odmítá nové klienty, ukazuje průzkum

Několik z nich si pak v Seyforu po vzájemně domluvě vybrali a systém dále zdokonalovali. Pochopitelně za reálného provozu, kdy účetní svoji agendu vedli jak ve stávajících softwarech, tak paralelně i v Evale. „Za účetními jsme jezdili prakticky každý týden, porovnávali jsme jejich zkušenosti a získávali cennou zpětnou vazbu. Především díky nim jsme Evalu dokázali dotáhnout do uživatelsky příjemné podoby, kterou po nás lidé z praxe požadovali,“ dodal.

A v čem že konkrétně vězí přednosti ,brněnského‘ účetního softwaru? Tak například v tom, že je provozován z cloudu, tudíž se do něj účetní dostanou z kterékoliv počítače s přístupem na internet. „Neřeší se tak žádné pravidelné aktualizace a poplatky za licence, je stále aktuální dle platné legislativy a průběžně aktualizován bez nutnosti cokoliv instalovat nebo stahovat. Celá správa infrastruktury je plně na straně Seyforu, uživatel se pouze přihlásí a pracuje,“ vysvětlil Štacha na dotaz redakce Euro.cz.

Oproti konkurenci také podle něj Evala obsahuje řadu nástrojů, které jiné systémy musejí integrovat – včetně technologie strojového učení, pomocí níž umí načíst i nestrukturovaná data z vyfocených dokladů. Sama navíc dokáže vytvářet časové rozlišení dle nastavených podmínek a odepisovat majetek.

Digitální účetnictví Digitoo získalo významnou investici. Přes 50 milionů korun má umožnit expanzi do zahraničí i další inovace
Přečtěte si také:

Digitální účetnictví Digitoo získalo významnou investici. Přes 50 milionů korun má umožnit expanzi do zahraničí i další inovace

„Disponuje také funkcí pro takzvané párování dokladů s bankovními pohyby – na základě vytvořeného pravidla (třeba shodná částka a variabilní symbol) dokáže Evala spárovat platby s fakturami a dle toho navrhnout jejich zaúčtování. Účetní pak jen navržená zaúčtování vizuálně zkontroluje a jedním tlačítkem je může schválit,“ doplnil Štacha.  

Návratnost projektu do tří let

Jak již bylo nastíněno, Evala je určena především pro samostatné účetní na volné noze, kteří mají na starost typicky nižší desítky klientů, nebo malé účetní kanceláře. „To jsou dva hlavní proudy, kam směřujeme a které byly zařazeny do skupiny testovacích uživatelů,“ prozradil šéf Seyforu Cígler.

WT100_25

Jestli program skutečně uspěje, se ale podle něj pochopitelně teprve ukáže: „Pro Evalu bude kritické období prvních tří až šesti měsíců. Přestože máme hromadu pilotních zákazníků, tento trh je v dnešní době trochu pískoviště. Snad jsme naši cílovou skupinu odhadli správně.“

„Podle prvotního zájmu soudíme, že lidé na novinku na trhu nejen čekají, ale že budou i spokojení, protože kdo Evalu do dnešního dne vyzkoušel, ten o ní mluví v superlativech,“ uzavřel Cígler s tím, že co se finančního hlediska týče, bude spolu se svým týmem rád, když se nemalé náklady na projekt vrátí jejich firmě zpět „v horizontu dvou, maximálně tří let“.

  • Našli jste v článku chybu?
'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }