Φόρτωση εκτίμησης…
`); W.document.close(); /* ------------------------------------------------------- Εικόνες σε Base64 ------------------------------------------------------- */ const [ logo64, banner64 ] = await Promise.all([ imageToDataURL( CONFIG.logo ), imageToDataURL( CONFIG.banner ) ]); /* ------------------------------------------------------- DATA ------------------------------------------------------- */ const e = d.epifaneia || {}; const imerom = d.dimiourgia?.toDate ? d.dimiourgia .toDate() .toLocaleDateString( "el-GR" ) : new Date() .toLocaleDateString( "el-GR" ); /* ------------------------------------------------------- CUSTOMER INFO ------------------------------------------------------- */ let customerInfo = ""; if( d.pelatis?.tilefono ){ customerInfo += esc( d.pelatis.tilefono ); } if( d.pelatis?.email ){ if(customerInfo){ customerInfo += " · "; } customerInfo += esc( d.pelatis.email ); } if( d.pelatis?.poli ){ customerInfo += "
" + esc( d.pelatis.poli ); } /* ------------------------------------------------------- AREA ------------------------------------------------------- */ let area = ""; if( e.synolo_me_fyra ){ area += "Επιφάνεια πλακιδίων " + m2( e.synolo_me_fyra ) + " (με φύρα)"; } if( e.dapedo ){ area += "
" + "Δάπεδο " + m2( e.dapedo ) + " · Τοίχοι " + m2( e.toixoi ); } /* ------------------------------------------------------- ROWS ------------------------------------------------------- */ let rows = ""; (d.grammes || []) .forEach(g => { rows += ` ${esc( g.onoma )} · ${esc( g.epipedo )} ${ g.leptomereia ? ` ${esc( g.leptomereia )} ` : "" } ${evro( g.synolo )} `; }); /* ======================================================= ΤΕΛΙΚΟ PRINT HTML ======================================================= */ const PRINT_HTML = ` Εκτίμηση ${esc(kodikos)}

Ενδεικτική εκτίμηση ανακαίνισης μπάνιου

Ημερομηνία ${esc(imerom)}   ·   Αρ. εκτίμησης ${esc(kodikos)}
ΣΤΟΙΧΕΙΑ ΠΕΛΑΤΗ
${esc( d.pelatis?.onoma || "" )}
${customerInfo}
${area}
${rows}
ΠΕΡΙΓΡΑΦΗ ΕΝΔΕΙΚΤΙΚΗ ΑΞΙΑ
Συνολική ενδεικτική αξία ${evro( d.synolo )}
${ d.pelatis?.sxolia ? `

${esc( d.pelatis.sxolia )}

` : "" }

Το επόμενο βήμα

Ελάτε στον εκθεσιακό μας χώρο στη Σίνδο να δείτε τα υλικά από κοντά. Η διακοσμήτριά μας σχεδιάζει τον χώρο σας σε πρόγραμμα προσομοίωσης, ώστε να δείτε το αποτέλεσμα πριν παραγγείλετε και να αποφύγετε περιττές αγορές υλικού.

`; /* ======================================================= WRITE DOCUMENT ======================================================= */ W.document.open(); W.document.write( PRINT_HTML ); W.document.close(); /* ======================================================= ΠΕΡΙΜΕΝΟΥΜΕ ΕΙΚΟΝΕΣ ======================================================= */ async function waitImages(){ const images = Array.from( W.document.images || [] ); await Promise.all( images.map( img => { if( img.complete ){ return Promise.resolve(); } return new Promise( resolve => { const done = () => resolve(); img.addEventListener( "load", done, {once:true} ); img.addEventListener( "error", done, {once:true} ); /* Δεν κολλάμε ποτέ πάνω από 2 sec. */ setTimeout( done, 2000 ); } ); } ) ); } await waitImages(); /* ------------------------------------------------------- DECODE ------------------------------------------------------- */ const printImages = Array.from( W.document.images || [] ); await Promise.all( printImages.map( async img => { try{ if( img.naturalWidth > 0 && typeof img.decode === "function" ){ await Promise.race([ img.decode(), new Promise( resolve => setTimeout( resolve, 1000 ) ) ]); } } catch(e){} } ) ); /* ------------------------------------------------------- DEBUG ------------------------------------------------------- */ console.log( "PRINT IMAGES:", printImages.map( img => ({ width: img.naturalWidth, height: img.naturalHeight, complete: img.complete }) ) ); /* ------------------------------------------------------- WAIT FOR PAINT ------------------------------------------------------- */ await new Promise( resolve => setTimeout( resolve, 350 ) ); /* ======================================================= PRINT ======================================================= */ W.focus(); W.print(); /* Δεν το κλείνουμε πριν τελειώσει η εκτύπωση. */ W.addEventListener( "afterprint", () => { setTimeout( () => { try{ W.close(); } catch(e){} }, 300 ); }, {once:true} ); } /* ========================================================= PRINT BUTTON ========================================================= */ BTN_PRINT.addEventListener( "click", async function(){ if( !CURRENT_DATA || !CURRENT_CODE ){ alert( "Η εκτίμηση δεν έχει φορτωθεί ακόμη." ); return; } await printEstimate( CURRENT_DATA, CURRENT_CODE ); } ); /* ========================================================= LOAD FIREBASE ========================================================= */ async function loadEstimate(){ if(!id){ CARD.innerHTML = `
Λείπει ο κωδικός της εκτίμησης από τον σύνδεσμο.
`; return; } try{ const app = initializeApp( CONFIG.firebase ); const db = getFirestore( app ); const snap = await getDoc( doc( db, "ektimiseis", id ) ); if( !snap.exists() ){ CARD.innerHTML = `
Η εκτίμηση δεν βρέθηκε.
`; return; } const data = snap.data(); /* Αν έχεις αποθηκευμένο kodikos ή arithmos στο Firestore, χρησιμοποιείται αυτό. Διαφορετικά: EST- + τελευταίοι χαρακτήρες ID. */ const kodikos = data.kodikos || data.arithmos || ( "EST-" + id .slice(-6) .toUpperCase() ); CURRENT_DATA = data; CURRENT_CODE = kodikos; renderScreen( data, kodikos ); document.title = "Εκτίμηση " + kodikos + " — Οικεία Οικία"; } catch(error){ console.error( "FIREBASE ERROR:", error ); CARD.innerHTML = `
Η εκτίμηση δεν φορτώθηκε. Δοκιμάστε ξανά.
`; } } /* ========================================================= START ========================================================= */ loadEstimate();