#peacyclingloblaw_1mpbmcomvid25
#peacyclinglobalegislation_signatures_stepbystep
Some code examples:
'https://next.docutopia.de/46ad5bc1-5ca6-4f32-ab3f-44b068c9a3dc',
'apiEndpoint' => 'https://next.docutopia.de/api/profile/'
));
}
add_action('wp_enqueue_scripts', 'docutopia_enqueue_scripts');
// Shortcode for the contract widget
function docutopia_contract_shortcode() {
ob_start(); ?>
.qrcode-wrapper { margin: 20px auto; text-align: center; }
.docutopia-details { text-align: center; margin-top: 30px; }
.docutopia-signature { font-weight: bold; color: #1a5fb4; }
.docutopia-buttons { display: flex; flex-direction: column; gap: 15px; margin-top: 20px; }
.docutopia-btn {
background: #1a5fb4;
color: white;
border: none;
padding: 12px 20px;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
transition: background 0.3s;
}
.docutopia-btn:hover { background: #0d4a9b; }
.docutopia-message {
margin-top: 20px;
padding: 15px;
border-radius: 4px;
text-align: center;
display: none;
}
';
}
add_action('wp_head', 'docutopia_styles');
?>
// docutopia-contract.js
document.addEventListener('DOMContentLoaded', function() {
// Configuration from WordPress
const signingUrl = docutopiaData.signingUrl;
const apiEndpoint = docutopiaData.apiEndpoint;
// Generate QR Code
new QRCode(document.getElementById("qrcode-container"), {
text: signingUrl,
width: 220,
height: 220,
colorDark: "#1a5fb4",
colorLight: "#ffffff",
correctLevel: QRCode.CorrectLevel.H
});
// Check for signed contract
const urlParams = new URLSearchParams(window.location.search);
const contractId = urlParams.get('contract_id');
if(contractId) {
fetchUserData(contractId);
}
async function fetchUserData(userId) {
try {
const response = await fetch(`${apiEndpoint}${userId}`);
if(!response.ok) throw new Error('Profile not found');
const user = await response.json();
showUserDetails(user);
} catch (error) {
showMessage(`Error: ${error.message}`, 'error');
}
}
function showUserDetails(user) {
document.getElementById("signature").textContent =
`${user.firstName} ${user.lastName} | ${user.birthDate}`;
document.getElementById("user-details").style.display = "block";
// Set up PDF downloads
document.getElementById("download-certificate").addEventListener('click', () => {
generateCertificate(user);
});
document.getElementById("download-honour").addEventListener('click', () => {
generateHonour(user);
});
}
function generateCertificate(user) {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
// Certificate design
doc.setFillColor(240, 240, 255);
doc.rect(0, 0, 220, 280, 'F');
doc.addImage('https://docutopia.de/cert-bg.jpg', 'JPEG', 0, 0, 210, 297);
doc.setFontSize(24);
doc.setTextColor(26, 95, 180);
doc.text("ONE-OF-A-KIND ARTIST CERTIFICATE", 105, 40, null, null, 'center');
doc.setFontSize(18);
doc.setTextColor(0, 0, 0);
doc.text(`This certifies that ${user.firstName} ${user.lastName}`, 105, 80, null, null, 'center');
doc.text(`born on ${user.birthDate} has been registered`, 105, 95, null, null, 'center');
doc.text("as a verified artist on DOCUTOPIA", 105, 110, null, null, 'center');
// QR Code placement
const qrSize = 50;
const qrX = 105 - qrSize/2;
new QRCode(doc, {
text: `https://next.docutopia.de/${user.id}`,
x: qrX,
y: 140,
width: qrSize,
height: qrSize
});
doc.setFontSize(12);
doc.text(`Profile: https://next.docutopia.de/${user.id}`, 105, 210, null, null, 'center');
doc.text(`Issued: ${new Date().toLocaleDateString('de-DE')}`, 105, 220, null, null, 'center');
doc.save(`${user.id}-docutopia-certificate.pdf`);
}
function generateHonour(user) {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
// Honour design
doc.setFillColor(230, 255, 240);
doc.rect(0, 0, 220, 280, 'F');
doc.addImage('https://docutopia.de/honour-bg.jpg', 'JPEG', 0, 0, 210, 297);
doc.setFontSize(24);
doc.setTextColor(26, 95, 180);
doc.text("SUBNATURALISTIC PEACYCYLING", 105, 40, null, null, 'center');
doc.setFontSize(28);
doc.text("ARTIST'S HONOUR", 105, 60, null, null, 'center');
doc.setFontSize(20);
doc.setTextColor(0, 0, 0);
doc.text(`${user.firstName} ${user.lastName}`, 105, 100, null, null, 'center');
doc.setFontSize(16);
doc.text("is recognized for contributions to", 105, 130, null, null, 'center');
doc.text("digital sustainability and transformative", 105, 145, null, null, 'center');
doc.text("art ecosystems within the Docutopia network", 105, 160, null, null, 'center');
// QR Code
new QRCode(doc, {
text: `https://next.docutopia.de/${user.id}`,
x: 85,
y: 180,
width: 40,
height: 40
});
doc.setFontSize(12);
doc.text(`Profile: https://next.docutopia.de/${user.id}`, 105, 240, null, null, 'center');
doc.text(`Awarded: ${new Date().toLocaleDateString('de-DE')}`, 105, 250, null, null, 'center');
doc.save(`${user.id}-artists-honour.pdf`);
}
function showMessage(text, type) {
const msgEl = document.getElementById('docutopia-message');
msgEl.textContent = text;
msgEl.style.display = 'block';
msgEl.style.background = type === 'error' ? '#ffe7e6' : '#e6f7ff';
msgEl.style.color = type === 'error' ? '#d32f2f' : '#1a5fb4';
}
});
{
"id": "006d0ee2-d0a0-4a5f-94c3-8eabeb37671d",
"firstName": "Marcel",
"lastName": "Klein",
"birthDate": "10/06/1982"
}