Dohoda o provedení práce: vzor 2024

Pokud plánujete zaměstnat jednoho či více brigádníků, pravděpodobně se vám bude hodit vzor dohody o provedení práce. My jsme pro vás jeden takový pro inspiraci připravili. Tento typ pracovního vztahu je ideálním řešením pro zaměstnavatele, jež poskytují občasnou práci lidem, kteří si potřebují přivydělat. Nejčastěji se tak s brigádami na DPP setkáte u sezónních aktivit, které se provádí jen po určitou část roku, stejně tak se ale tento typ dohody využívá také pro nárazovou či nepravidelnou výpomoc.

Dohoda o provedení práce – vzor ke stažení

Stejně jako každá jiná smlouva musí mít také dohoda o provedení práce vždy písemnou podobu, aby byl pracovní vztah mezi zaměstnancem a zaměstnavatelem platný. Využít k tomuto účelu můžete náš vzor, ale také je možné sepsat vlastní dohodu na základě níže uvedených informací. Náležitosti dohody o provedení práce, které musí být v písemném dokumentu vždy uvedeny, jsou následující:

  • název dokumentu,
  • identifikace zaměstnavatele (jméno a příjmení nebo název společnosti, IČO, adresa sídla, případně jméno zastupující osoby),
  • identifikace zaměstnance (jméno a příjmení, datum narození nebo rodné číslo, adresa trvalého bydliště),
  • druh vykonávané práce,
  • místo a doba výkonu práce,
  • rozsah práce a výše odměny,
  • závěrečná ujednání (např. informace o nakládání s osobními údaji),
  • datum a místo podpisu zaměstnance a zaměstnavatele,
  • podpis zaměstnance a zaměstnavatele.

Co je dohoda o provedení práce

Dohoda o provedení práce neboli DPP je forma pracovněprávního vztahu mezi zaměstnavatelem a zaměstnancem založená na písemném ujednání, které tento poměr definuje a upřesňuje. Problematiku DPP upravuje zákon č. 262/2006 Sb., zákoník práce, kde jsou stanoveny veškeré podmínky a pravidla spojená s výkonem práce tohoto typu.

Dle § 75 zákoníku práce nesmí rozsah vykonávané činnosti přesáhnout 300 hodin za kalendářní rok. Zároveň je však možný souběh více dohod u jednoho zaměstnavatele, avšak pod podmínkou, že se bude jednat vždy o jiný druh práce. Stejně tak může mít zaměstnanec sjednaných více DPP u různých zaměstnavatelů a obvykle se sjednává dohoda o provedení práce na dobu neurčitou.

Dohoda o provedení práce: zdravotní a sociální pojištění

Zálohy na zdravotní a sociální pojištění odvádí zaměstnavatel pouze ve chvíli, kdy měsíční výdělek zaměstnance na DPP činí více než 25 % průměrné mzdy (tj. 10 500 Kč zaokrouhleno na 50 Kč dolů) . Pokud ale pracuje na DPP pro více zaměstnavatelů, odvody hradí v případě, že celkový souhrn jeho příjmů z DPP překročí 40 % z částky průměrné mzdy. 

Pakliže je odměna nižší nebo dosahuje zmíněné hranice, a zaměstnanec nepracuje nikde jinde nebo za něj neplatí pojištění stát, má povinnost hradit si zdravotní pojištění sám. V takovém případě se jedná o takzvanou osobu bez zdanitelných příjmů neboli OBZP.

Ve chvíli, kdy dosahuje měsíční hrubá mzda u DPP částky vyšší než je uvedený limit, vzniká zaměstnavateli povinnost odvádět za pracovníka zdravotní a sociální pojištění. Zaměstnavatel tak zaplatí 33,7 % a zaměstnanec 11,6 % z hrubé mzdy. 

Dohoda o provedení práce a daně

Zdanění příjmů z dohody o provedení práce se různí podle toho, na jak vysoké výdělky za vykonávanou práci zaměstnanec dosahuje a zda podepsal u zaměstnavatele prohlášení k dani. Stejně jako je tomu v případě odvodů záloh na pojištění, platí i v rámci daní výše uvedená hranice výdělku, která udává, kolik peněz z odměny pracovníka bude strženo. To, jestli zaměstnanec podepsal u daného zaměstnavatele prohlášení k dani, zase určuje, zda se bude z jeho příjmů odvádět daň srážková, nebo daň zálohová a zda mohou být uplatněny slevy na dani.

DPP s příjmy do 10 500 Kč za měsíc

Pokud si zaměstnanec na dohodu o provedení práce vydělává měsíčně 10 500 korun a méně a zároveň nemá u daného zaměstnavatele podepsané prohlášení k dani, bude mu z odměny strhávána srážková daň ve výši 15 %. Zároveň není v takovém případě možné uplatnit žádnou slevu na dani (ani slevu na poplatníka). Výhodou je, že odvedením srážkové daně jsou pro zaměstnance daňové povinnosti v rámci této dohody vyřešeny a již se nemusí uvádět v daňovém přiznání.

Pakliže výdělek činí méně než 10 500 korun (včetně) a zaměstnanec má podepsané prohlášení k dani u daného zaměstnavatele, bude za něj odváděna takzvaná zálohová daň. Poplatník může navíc v rámci tohoto zaměstnání uplatnit také odpovídající slevy na dani, jako je sleva na poplatníka, sleva na studenta, daňové zvýhodnění na vyživované děti a podobně. Může tak však učinit jen za předpokladu, že prohlášení k dani nemá už podepsané u jiného zaměstnavatele.

DPP s příjmy nad 10 500 Kč za měsíc

Pakliže si zaměstnanec měsíčně vydělává více než 10 500 korun v rámci dohody o provedení práce, opět je potřeba zohlednit dvě situace, a to zda má, nebo naopak nemá podepsané prohlášení k dani. Tento fakt určuje stejně jako u výdělků do 10 500 korun za měsíc, zda bude poplatník moci využít v daném zaměstnání slevy na dani. Pokud podepsané prohlášení má, tak to možné je, pokud ne, žádné slevy uplatnit nemůže.

V každém případě vždy platí, že má-li zaměstnanec již podepsané prohlášení k dani u jiného zaměstnavatele, není možné uplatňovat slevy na dani u zaměstnavatele dalšího, a to ani ve chvíli, kdy vydělává v rámci DPP více než 10 500 korun za měsíc. 

Potřebujete správně sepsat Dohodu o provedení práce a mít vše 100% správně? Využijte naši konzultaci s právníkem a získejte Dohodu o provedení práce na míru vašemu případu

Hlavní rozdíl mezi tím, zda odměna za vykonanou práci přesahuje výdělek 10 500 korun za měsíc, nebo jej nedosahuje, spočívá v tom, že u příjmů nad tuto hranici se vždy odvádí 15% zálohová daň. Děje se tak v každém případě bez ohledu na to, zda má, nebo nemá poplatník podepsané v rámci této dohody prohlášení k dani. Srážková daň se u takto vysokých výdělků neuplatňuje.

Pro lepší přehled, jak je to s odvody v rámci DPP, je možné využít následující tabulku:

Příjmy do 10 500 Kč za měsíc

Příjmy nad 10 500 Kč za měsíc

S prohlášením

Bez prohlášení

S prohlášením

Bez prohlášení

Druh daně

Zálohová

Srážková

Zálohová

Zálohová

Slevy na dani

Ano

Ne

Ano

Ne

Odvody pojištění

Ne

Ne

Ano

Ano

Ukončení dohody o provedení práce

Co se týká zrušení dohody o provedení práce, jedná se o poměrně jednoduchou záležitost. Jelikož je tento pracovní vztah omezen limitem 300 odpracovaných hodin za kalendářní rok, je možné, aby tyto hodiny zaměstnanec vyčerpal a dále novou dohodu se zaměstnavatelem již neuzavíral. V případě, že chce zaměstnanec skončit ještě před vyčerpáním stanoveného limitu, může tak učinit několika způsoby:

  1. výpověď z dohody o provedení práce – podává se buď odůvodněně, nebo bez udání důvodu a je nutné dodržet zákonem stanovenou výpovědní lhůtu, která trvá 15 dní a začíná běžet ode dne doručení výpovědi zaměstnavateli,
  2. dohoda o ukončení dohody o provedení práce – v ideálním případě se zaměstnanec se zaměstnavatelem domluví na konkrétním termínu ukončení poměru. Je potřeba tak učinit písemně a se souhlasem obou stran,
  3. okamžité zrušení dohody o provedení práce – je možné uplatnit v momentě, kdy zaměstnavatel ani do 15 dnů po splatnosti nevyplatil zaměstnanci mzdu nebo její část. 
Co musí obsahovat dohoda o provedení práce?
Každá dohoda o provedení práce musí obsahovat údaje, které stanovuje česká legislativa. Mezi tyto informace patří identifikace smluvních stran, tedy jak zaměstnavatele tak zaměstnance, druh vykonávané práce, informace o místu výkonu práce a o pracovní době, stanovení rozsahu práce a výše odměny, závěrečná ujednání, datum a místo podpisu dohody a podpis zaměstnavatele i zaměstnance.
Odvádí se z DPP zálohy na pojištění?
Z příjmů plynoucích z dohody o provedení práce se hradí zdravotní a sociální pojištění jen v momentě, pokud měsíční odměna zaměstnance přesahuje částku 10 500 korun. Pakliže měsíční výdělek této částky nedosahuje, je zaměstnanec povinen hradit si zdravotní pojištění sám, pokud ho za něj neodvádí jiný zaměstnavatel nebo stát.
Má zaměstnanec na DPP nárok na nemocenské dávky?
Ano, ale pouze za předpokladu, že za něj zaměstnavatel v rámci DPP platí nemocenské pojištění. To se děje, pokud zaměstnanec vydělává měsíčně 10 501 korun a více. V případě, že pracovník takového výdělku dosahuje a lékař mu uzná pracovní neschopnost, vzniká mu ze zákona nárok na náhradu mzdy během prvních 14 dnů nemoci a od 15. dne pak také na nemocenské dávky.
Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).
'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.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:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { 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(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream 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 = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ 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(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ 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(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }