#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"
}