Kończy Ci się OC? Chcesz wygodnie złożyć wypowiedzenie OC? Nie chce Ci się pisać po papierze? Uzupełnij formularz swoimi danymi i wygeneruj PDF, który wystarczy tylko wydrukować i podpisać.
',
'',
'',
''
].join('');
container.appendChild(wrapper);
}
function renumberCoOwners(container) {
container.querySelectorAll('.oc-termination-generator__coowner').forEach(function (block, index) {
const title = block.querySelector('.oc-termination-generator__coowner-title');
if (title) {
title.textContent = 'Współwłaściciel ' + (index + 1);
}
});
}
function syncLegalBasisUI(root) {
const selected = root.querySelector('input[name="legalBasis"]:checked');
const currentPolicyNumberField = getField(root, 'currentPolicyNumber');
const field28a = root.querySelector('[data-role="field-28a"]');
const warning31 = root.querySelector('[data-role="warning-31"]');
const value = selected ? selected.value : '';
field28a.hidden = value !== 'art. 28a';
warning31.hidden = value !== 'art. 31';
currentPolicyNumberField.required = value === 'art. 28a';
if (value !== 'art. 28a') {
currentPolicyNumberField.value = '';
currentPolicyNumberField.setCustomValidity('');
}
}
function setStatus(statusBox, message) {
statusBox.textContent = message;
statusBox.classList.toggle('is-visible', Boolean(message));
}
function validate(root) {
const form = root.querySelector('.oc-termination-generator__form');
const statusBox = root.querySelector('[data-role="status"]');
const legalBasis = root.querySelector('input[name="legalBasis"]:checked');
const currentPolicyNumberField = getField(root, 'currentPolicyNumber');
currentPolicyNumberField.setCustomValidity('');
if (!form.checkValidity()) {
form.reportValidity();
setStatus(statusBox, 'Uzupełnij wszystkie wymagane pola przed wygenerowaniem dokumentu.');
return false;
}
if (!legalBasis) {
setStatus(statusBox, 'Wybierz podstawę prawną wypowiedzenia.');
return false;
}
if (legalBasis.value === 'art. 28a' && !currentPolicyNumberField.value.trim()) {
currentPolicyNumberField.setCustomValidity('Wpisz numer polisy automatycznie wznowionej.');
currentPolicyNumberField.reportValidity();
setStatus(statusBox, 'Dla art. 28a wpisz numer polisy automatycznie wznowionej.');
return false;
}
const coOwnerBlocks = root.querySelectorAll('.oc-termination-generator__coowner');
for (let i = 0; i < coOwnerBlocks.length; i += 1) {
const block = coOwnerBlocks[i];
const inputs = block.querySelectorAll('input');
for (let j = 0; j < inputs.length; j += 1) {
const input = inputs[j];
if (!input.value.trim()) {
input.reportValidity();
setStatus(statusBox, 'Uzupełnij dane wszystkich dodanych współwłaścicieli.');
return false;
}
}
}
setStatus(statusBox, '');
return true;
}
function collectData(root) {
const legalBasis = root.querySelector('input[name="legalBasis"]:checked').value;
const coOwners = Array.from(root.querySelectorAll('.oc-termination-generator__coowner')).map(function (block) {
return {
name: block.querySelector('[data-field="coOwnerName"]').value.trim(),
peselNip: block.querySelector('[data-field="coOwnerPeselNip"]').value.trim(),
address: block.querySelector('[data-field="coOwnerAddress"]').value.trim()
};
});
return {
ownerName: getField(root, 'ownerName').value.trim(),
ownerPeselNip: getField(root, 'ownerPeselNip').value.trim(),
ownerAddress: getField(root, 'ownerAddress').value.trim(),
policyNumber: getField(root, 'policyNumber').value.trim(),
insuranceCompany: getField(root, 'insuranceCompany').value.trim(),
policyEndDate: getField(root, 'policyEndDate').value.trim(),
currentPolicyNumber: getField(root, 'currentPolicyNumber').value.trim(),
legalBasis: legalBasis,
year: getField(root, 'year').value.trim(),
brand: getField(root, 'brand').value.trim(),
model: getField(root, 'model').value.trim(),
registrationNumber: getField(root, 'registrationNumber').value.trim(),
vin: getField(root, 'vin').value.trim(),
coOwners: coOwners
};
}
function formatIsoDateToPolish(dateValue) {
const parts = dateValue.split('-');
if (parts.length !== 3) {
return dateValue;
}
return [parts[2], parts[1], parts[0]].join('.');
}
function getTodayInPolishFormat() {
const now = new Date();
const day = String(now.getDate()).padStart(2, '0');
const month = String(now.getMonth() + 1).padStart(2, '0');
const year = String(now.getFullYear());
return [day, month, year].join('.');
}
function escapeHtml(value) {
return String(value)
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
function buildMainText(data) {
const formattedPolicyEndDate = formatIsoDateToPolish(data.policyEndDate);
if (data.legalBasis === 'art. 28') {
return 'Niniejszym wypowiadam umowę ubezpieczenia OC posiadacza pojazdu o numerze ' +
escapeHtml(data.policyNumber) +
' zgodnie z art. 28 ustawy o ubezpieczeniach obowiązkowych. Umowa wygaśnie z dniem ' +
escapeHtml(formattedPolicyEndDate) +
'.';
}
if (data.legalBasis === 'art. 28a') {
return 'Niniejszym wypowiadam umowę ubezpieczenia OC posiadacza pojazdu o numerze ' +
escapeHtml(data.currentPolicyNumber) +
', która została automatycznie wznowiona, zgodnie z art. 28a ustawy o ubezpieczeniach obowiązkowych. Poprzednia umowa posiadała numer ' +
escapeHtml(data.policyNumber) +
'.';
}
return 'Niniejszym wypowiadam umowę ubezpieczenia OC posiadacza pojazdu o numerze ' +
escapeHtml(data.policyNumber) +
' zgodnie z art. 31 ustawy o ubezpieczeniach obowiązkowych, w związku z zawarciem nowej umowy ubezpieczenia OC dla tego pojazdu w innym zakładzie ubezpieczeń.';
}
function buildDocumentHtml(data) {
const coOwnersHtml = data.coOwners.length
? [
'
Numer rejestracyjny: ' + escapeHtml(data.registrationNumber) + '
',
'
Numer VIN: ' + escapeHtml(data.vin) + '
',
'
',
coOwnersHtml,
'
',
'
Z poważaniem,
',
'
(podpis)
',
'
',
'
',
'',
''
].join('');
}
function createHiddenRenderContainer(documentHtml) {
const wrapper = document.createElement('div');
wrapper.setAttribute('aria-hidden', 'true');
wrapper.style.position = 'fixed';
wrapper.style.left = '-99999px';
wrapper.style.top = '0';
wrapper.style.width = '210mm';
wrapper.style.background = '#fff';
wrapper.innerHTML = documentHtml;
document.body.appendChild(wrapper);
return wrapper;
}
function sanitizeFilenamePart(value) {
return value
.toLowerCase()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '')
.replace(/-{2,}/g, '-');
}
function buildFilename(data) {
const company = sanitizeFilenamePart(data.insuranceCompany) || 'firma';
const vehicle = sanitizeFilenamePart(data.brand + '-' + data.model) || 'pojazd';
const registration = sanitizeFilenamePart(data.registrationNumber) || 'rejestracja';
return 'wypowiedzenie-oc-' + company + '-' + vehicle + '-' + registration + '.pdf';
}
function getConfiguredPdfLibraryUrl(root) {
const configuredPath = root.getAttribute('data-html2pdf-src') || window.OC_TERMINATION_GENERATOR_PDF_SRC || '';
if (!configuredPath) {
return '';
}
try {
const url = new URL(configuredPath, window.location.href);
if (url.origin !== window.location.origin) {
return '';
}
return url.toString();
} catch (error) {
return '';
}
}
function ensurePdfLibrary(root) {
if (typeof window.html2pdf === 'function') {
return Promise.resolve();
}
if (window.__ocTerminationPdfLibraryPromise) {
return window.__ocTerminationPdfLibraryPromise;
}
const scriptUrl = getConfiguredPdfLibraryUrl(root);
if (!scriptUrl) {
return Promise.reject(new Error('Brak poprawnej lokalnej ścieżki do biblioteki PDF.'));
}
window.__ocTerminationPdfLibraryPromise = new Promise(function (resolve, reject) {
const existingScript = Array.from(document.querySelectorAll('script')).find(function (script) {
return script.src === scriptUrl;
});
if (existingScript) {
existingScript.addEventListener('load', function () {
resolve();
}, { once: true });
existingScript.addEventListener('error', function () {
reject(new Error('Nie udało się wczytać lokalnej biblioteki PDF.'));
}, { once: true });
return;
}
const script = document.createElement('script');
script.src = scriptUrl;
script.async = true;
script.onload = function () {
resolve();
};
script.onerror = function () {
reject(new Error('Nie udało się wczytać lokalnej biblioteki PDF.'));
};
document.head.appendChild(script);
}).then(function () {
if (typeof window.html2pdf !== 'function') {
throw new Error('Lokalna biblioteka PDF została wczytana, ale funkcja html2pdf jest niedostępna.');
}
}).catch(function (error) {
window.__ocTerminationPdfLibraryPromise = null;
throw error;
});
return window.__ocTerminationPdfLibraryPromise;
}
async function handleDownloadPdf(root) {
const statusBox = root.querySelector('[data-role="status"]');
if (!validate(root)) {
return;
}
const data = collectData(root);
const documentHtml = buildDocumentHtml(data);
const filename = buildFilename(data);
const renderContainer = createHiddenRenderContainer(documentHtml);
setStatus(statusBox, 'Przygotowuję PDF...');
try {
await ensurePdfLibrary(root);
await window.html2pdf().set({
margin: [0, 0, 0, 0],
filename: filename,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 2, useCORS: false, logging: false, backgroundColor: '#ffffff' },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: ['css', 'legacy'] }
}).from(renderContainer.querySelector('.oc-letter')).save();
setStatus(statusBox, '');
} catch (error) {
setStatus(
statusBox,
'Nie udało się wygenerować PDF. Upewnij się, że lokalna biblioteka html2pdf.js jest dostępna w WordPressie pod ścieżką z atrybutu data-html2pdf-src, albo użyj opcji "Drukuj / Zapisz jako PDF".'
);
} finally {
renderContainer.remove();
}
}
function handlePrint(root) {
const statusBox = root.querySelector('[data-role="status"]');
if (!validate(root)) {
return;
}
const data = collectData(root);
const documentHtml = buildDocumentHtml(data);
const iframe = document.createElement('iframe');
let printTriggered = false;
iframe.style.position = 'fixed';
iframe.style.right = '0';
iframe.style.bottom = '0';
iframe.style.width = '0';
iframe.style.height = '0';
iframe.style.border = '0';
iframe.setAttribute('aria-hidden', 'true');
document.body.appendChild(iframe);
const printWindow = iframe.contentWindow;
if (!printWindow) {
iframe.remove();
setStatus(statusBox, 'Nie udało się otworzyć widoku do druku.');
return;
}
function runPrint() {
if (printTriggered) {
return;
}
printTriggered = true;
printWindow.focus();
printWindow.print();
setTimeout(function () {
iframe.remove();
}, 1000);
}
iframe.onload = runPrint;
printWindow.document.open();
printWindow.document.write(documentHtml);
printWindow.document.close();
setTimeout(function () {
if (document.body.contains(iframe)) {
runPrint();
}
}, 350);
setStatus(statusBox, '');
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initializeGenerators);
} else {
initializeGenerators();
}
}());
Jak wypowiedzieć OC za pomocą generatora?
Wypowiedzenie OC to proces, który przeprowadzisz szybko i sprawnie za pomocą specjalnego generatora online. Generator dokumentów wypowiedzenia OC tworzy dla Ciebie gotowy dokument, zgodny z wymogami prawnymi i akceptowany przez wszystkie towarzystwa ubezpieczeniowe.
Jak działa generator wypowiedzenia OC?
Generator wypowiedzenia OC to narzędzie, które automatyzuje cały proces tworzenia dokumentu rezygnacji z polisy. Wprowadź wymagane dane, a system wygeneruje poprawnie sformułowane pismo. Dzięki temu zaoszczędzisz czas i zyskasz pewność, że dokument spełnia wszystkie wymogi formalne.
Co musisz wiedzieć przed wypowiedzeniem OC?
Zanim przystąpisz do wypełniania formularza, przygotuj następujące informacje:
Numer polisy OC.
Dane towarzystwa ubezpieczeniowego.
Dane pojazdu (numer rejestracyjny, marka, model).
Swoje dane osobowe i adresowe.
Przepisy wymagają, abyś złożył wypowiedzenie najpóźniej dzień przed końcem okresu ubezpieczenia. Pamiętaj o dotrzymaniu tego terminu – w przeciwnym razie umowa zostanie automatycznie przedłużona.
Jak krok po kroku wypełnić generator wypowiedzenia OC?
Proces wypełnienia generatora jest prosty i intuicyjny:
Wprowadź dane do formularza
Wypełnij wszystkie pola w formularzu. Dodaj prawidłowe dane osobowe oraz informacje dotyczące samochodu i polisy. Małe błędy mogą spowodować, że dokument nie zostanie uznany. Dokładnie sprawdź wszystkie wpisane informacje.
Wybierz podstawę prawną wypowiedzenia
Generator zaproponuje Ci odpowiednią podstawę prawną – najczęściej będzie to art. 28 lub art. 28a ustawy o ubezpieczeniach obowiązkowych. Opcje zależą od Twojej konkretnej sytuacji:
Art. 28 – wypowiedzenie z końcem okresu ochrony.
Art. 28a – wypowiedzenie automatycznie wznowionej umowy OC.
Art. 31 – wypowiedzenie OC przez nabywcę pojazdu.
Pobierz i wydrukuj dokument
Po wygenerowaniu dokumentu pobierz go i wydrukuj. Podpisz dokument własnoręcznie – bez tego nie będzie ważny. Własnoręczny podpis jest obowiązkowy.
Wyślij dokument do ubezpieczyciela
Doręcz dokument do towarzystwa ubezpieczeniowego. Zrobisz to na kilka sposobów:
Osobiście w oddziale (poproś o potwierdzenie złożenia pisma).