CO
Casa Oasis
Corporate Home Stay

Guest Payment Authorization

Secure · Confidential · Electronically Signed

Complete all sections of this form to confirm your reservation and authorize payment. Use Download PDF to save a copy at any time, or Submit & Send to email a signed copy to yourself and Casa Oasis.
01 Personal Information
02 Reservation Details
03 Transaction Summary
Description Rate Total
Nightly Rate × 0 nights
Guest Property Maintenance Management Fee
Pet Surcharge
Guest Amenities Fee
Tax / ST / TR
Total Amount Due

Nightly total = rate × nights (auto). All other fees are flat amounts. Grand total updates automatically.

04 Payment Authorization
VisaMC AmexDiscover ACH
🔒 Card details are transmitted securely and used only for authorized charges per your reservation agreement.
05 Guest Authorizations
06 Use of Premises

1. Guest will be held liable for any loss or damage of the contents in the Property and any damage done to the House.

2. Guest will maintain the Property in its clean and good condition. Guest shall notify Casa Oasis if repairs other than general maintenance are required.

3. Guest shall comply with all the requirements, ordinances, applicable laws, and regulations of any federal or state law.

4. Casa Oasis will not be held liable for any loss or damages of valuables. Casa Oasis reserves the right to discontinue any accommodations and services for non-compliance with agreement/credit requirements.

5. Check Out is 10:00 AM. This agreement does not create a tenancy or residence. You must depart at the appropriate time.

6. Standard check-in is at 3:00 PM. Early check-in or late check-out may be accommodated upon request and is subject to availability and additional fees.

7. All Casa Oasis properties are strictly non-smoking (including e-cigarettes and cannabis). Events, parties, or gatherings exceeding registered occupancy are prohibited.

8. Quiet hours are observed from 10:00 PM to 8:00 AM. Guests are expected to be respectful of neighbors at all times.

9. Cancellations made 14+ days prior to check-in receive a full refund minus platform fees. Cancellations within 14 days of check-in are non-refundable.

07 Electronic Signature

Type your full legal name below. By signing, you confirm this is your legally binding electronic signature authorizing all charges and agreeing to all terms in this document.

Signature Preview
 

Your name renders in signature style on the PDF

Guest Notes

Submitting emails a signed PDF to you and to Casa Oasis.
Questions? 605-630-5695  ·  [email protected]  ·  casaoasis.org

// Auto-fill today's date document.getElementById('sig-date').valueAsDate = new Date(); // Email sync document.getElementById('guest-email').addEventListener('input', function() { document.getElementById('reply-to-field').value = this.value; }); // Auto-calc nights — defined on window so inline onchange can reach it window.calcNights = function() { const a = document.getElementById('arrival').value; const d = document.getElementById('depart').value; if (!a || !d) return; const diff = Math.round((new Date(d) - new Date(a)) / 86400000); const nights = diff > 0 ? diff : 0; document.getElementById('num-nights').value = nights > 0 ? nights : ''; document.getElementById('nights-label').textContent = nights; calcNightlyTotal(); } document.getElementById('arrival').addEventListener('change', calcNights); document.getElementById('arrival').addEventListener('input', calcNights); document.getElementById('depart').addEventListener('change', calcNights); document.getElementById('depart').addEventListener('input', calcNights); // Helpers function parseDollar(v) { return parseFloat(String(v).replace(/[$,\s]/g,'')) || 0; } function fmt(n) { return n > 0 ? '$' + n.toFixed(2) : ''; } // Nightly total = rate × nights function calcNightlyTotal() { const rate = parseDollar(document.getElementById('nightly-rate').value); const nights = parseFloat(document.getElementById('num-nights').value) || 0; document.getElementById('nightly-total').value = fmt(rate * nights); calcGrandTotal(); } document.getElementById('nightly-rate').addEventListener('input', calcNightlyTotal); // Grand total = nightly + all flat fees const feeIds = ['mgmt-fee','pet-surcharge','amenities-fee','tax','misc-amount']; feeIds.forEach(id => document.getElementById(id).addEventListener('input', calcGrandTotal)); function calcGrandTotal() { const nightly = parseDollar(document.getElementById('nightly-total').value); const fees = feeIds.reduce((s, id) => s + parseDollar(document.getElementById(id).value), 0); document.getElementById('grand-total').value = fmt(nightly + fees); } // Card formatting document.getElementById('card-num').addEventListener('input', function() { this.value = this.value.replace(/\D/g,'').replace(/(.{4})/g,'$1 ').trim().slice(0,19); }); document.getElementById('card-exp').addEventListener('input', function() { let v = this.value.replace(/\D/g,''); if (v.length >= 2) v = v.slice(0,2) + ' / ' + v.slice(2,4); this.value = v; }); // Collect form data function collectData() { const fd = new FormData(document.getElementById('reg-form')); const data = Object.fromEntries(fd.entries()); data.typed_signature = sigTyped.value.trim(); return data; } // Generate PDF function generatePDF(data) { const { jsPDF } = window.jspdf; const doc = new jsPDF('p','mm','a4'); const W = 210, M = 18, CW = W - M*2; let y = 0; const newPage = () => { doc.addPage(); y = 22; }; const check = (h=20) => { if (y+h > 278) newPage(); }; const fill = (r,g,b) => doc.setFillColor(r,g,b); const draw = (r,g,b) => doc.setDrawColor(r,g,b); const color = (r,g,b) => doc.setTextColor(r,g,b); const size = s => doc.setFontSize(s); const font = (st='normal') => doc.setFont('helvetica',st); const lw = w => doc.setLineWidth(w); const val = v => (v && String(v).trim()) ? String(v).trim() : '—'; // Header bar fill(10,10,10); doc.rect(0,0,W,38,'F'); color(201,168,76); size(17); font('bold'); doc.text('CASA OASIS', M, 14); color(150,140,120); size(7.5); font('normal'); doc.text('Corporate Home Stay · casaoasis.org · 605-630-5695', M, 21); color(240,234,214); size(12); font('bold'); doc.text('GUEST PAYMENT AUTHORIZATION', M, 31); color(120,115,105); size(7); font('normal'); doc.text('Submitted: ' + new Date().toLocaleString(), W-M, 31, {align:'right'}); y = 48; function sec(title) { check(14); fill(25,22,18); draw(201,168,76); lw(0.3); doc.rect(M, y, CW, 10, 'F'); doc.line(M, y+10, M+CW, y+10); color(201,168,76); size(9); font('bold'); doc.text(title.toUpperCase(), M+3, y+7); y += 14; } function row2(a, b) { check(12); color(130,125,118); size(7.5); font('normal'); doc.text(a.label, M, y); if (b && b.label) doc.text(b.label, M+CW/2+4, y); y += 4; color(240,234,214); size(9.5); font('normal'); doc.text(val(a.value), M, y); if (b && b.value !== undefined) doc.text(val(b.value), M+CW/2+4, y); draw(80,75,68); lw(0.3); doc.line(M, y+2, M+CW/2-2, y+2); if (b) doc.line(M+CW/2+4, y+2, M+CW, y+2); y += 8; } function rowFull(label, value) { check(12); color(130,125,118); size(7.5); font('normal'); doc.text(label, M, y); y += 4; color(240,234,214); size(9.5); font('normal'); doc.text(val(value), M, y); draw(80,75,68); lw(0.3); doc.line(M, y+2, M+CW, y+2); y += 8; } // 01 Personal sec('Personal Information'); row2({label:'Full Name', value:data.full_name}, {label:'Date of Birth', value:data.dob}); rowFull('Present Address', data.address); row2({label:'City', value:data.city}, {label:'Zip Code', value:data.zip}); row2({label:'Phone', value:data.phone}, {label:'Email', value:data.email}); row2({label:'Company / Employer', value:data.company}, {label:'Vehicle Make / Model', value:data.vehicle}); row2({label:'Vehicle Year', value:data.vehicle_year}, {label:'Payment Form', value:data.payment_form}); y += 3; // 02 Reservation sec('Reservation Details'); row2({label:'Property', value:data.property}, {label:'Property ID', value:data.property_id}); row2({label:'Booking / Confirmation #', value:data.confirmation_number}, {label:'Number in Party', value:data.num_party}); row2({label:'Date of Arrival', value:data.arrival_date}, {label:'Date to Depart', value:data.depart_date}); rowFull('# of Nights', data.num_nights); y += 3; // 03 Transaction sec('Transaction Summary'); check(65); // Table header fill(30,26,20); draw(201,168,76); lw(0.3); doc.rect(M, y, CW, 8, 'F'); color(201,168,76); size(8); font('bold'); doc.text('DESCRIPTION', M+2, y+5.5); doc.text('AMOUNT', M+CW-2, y+5.5, {align:'right'}); y += 8; const txnRows = [ ['Nightly Rate (' + val(data.nightly_price) + ' × ' + val(data.num_nights) + ' nights)', val(data.nightly_total)], ['Guest Property Maintenance Management Fee', val(data.mgmt_fee)], ['Pet Surcharge', val(data.pet_surcharge)], ['Guest Amenities Fee', val(data.amenities_fee)], ['Tax / ST / TR', val(data.tax)], ]; if (data.misc_desc && data.misc_desc.trim()) { txnRows.push([data.misc_desc.trim(), val(data.misc_amount)]); } txnRows.forEach((row, i) => { check(8); if (i % 2 === 1) { fill(22,20,16); doc.rect(M, y, CW, 7.5, 'F'); } draw(50,46,40); lw(0.2); doc.line(M, y+7.5, M+CW, y+7.5); color(200,195,185); size(8.5); font('normal'); doc.text(row[0], M+2, y+5); color(240,234,214); font('bold'); doc.text(row[1], M+CW-2, y+5, {align:'right'}); y += 7.5; }); // Total row check(10); fill(40,32,10); draw(201,168,76); lw(0.5); doc.rect(M, y, CW, 10, 'F'); color(201,168,76); size(10); font('bold'); doc.text('TOTAL AMOUNT DUE', M+2, y+7); doc.text(val(data.grand_total), M+CW-2, y+7, {align:'right'}); y += 14; // 04 Payment sec('Payment Authorization'); row2( {label:'Name on Card / Account', value:data.card_name}, {label:'Card / Account Number', value:data.card_number || '—'} ); row2( {label:'Expiration Date', value:data.card_expiry}, {label:'CVV / Security Code', value:data.card_cvv || '—'} ); rowFull('Billing Address', data.billing_address); y += 3; // 05 Authorizations sec('Guest Authorizations'); const auths = [ [data.auth_security_deposit === 'on', 'Authorized security deposit hold'], [data.auth_damages === 'on', 'Liable for loss or damage to property'], [data.auth_late_checkout === 'on', 'Authorized late check-out charges'], [data.auth_extra_guests === 'on', 'Understands unapproved guest fees'], [data.auth_smoking_pets === 'on', 'Understands smoking/pet remediation fees'], ]; auths.forEach(([checked, label]) => { check(8); color(checked ? 90 : 140, checked ? 158 : 135, checked ? 122 : 128); size(9); font('normal'); doc.text((checked ? '☑ ' : '☐ ') + label, M+2, y); y += 7; }); y += 3; // 06 Terms sec('Use of Premises'); const terms = [ 'Guest is liable for any loss or damage to property contents and any damage to the House.', 'Guest will maintain the property in clean, good condition and notify Casa Oasis of repairs needed.', 'Guest shall comply with all applicable laws and regulations of any federal or state law.', 'Casa Oasis will not be held liable for loss of valuables and reserves the right to discontinue service for non-compliance.', 'Check-out is 10:00 AM. This agreement does not create a tenancy. Guest must depart at the appropriate time.', ]; terms.forEach((t, i) => { const lines = doc.splitTextToSize(`${i+1}. ${t}`, CW-4); check(lines.length * 5.5 + 2); color(160,155,145); size(8.5); font('normal'); doc.text(lines, M+2, y); y += lines.length*5.5+3; }); y += 3; // 07 Guest notes if (data.guest_notes && data.guest_notes.trim()) { sec('Guest Notes'); const nl = doc.splitTextToSize(data.guest_notes, CW-4); check(nl.length*5.5+4); color(180,175,165); size(9); font('normal'); doc.text(nl, M+2, y); y += nl.length*5.5+6; } // 08 Signature check(55); sec('Electronic Signature'); row2( {label:'Printed Name', value: data.print_name}, {label:'Signature Date', value: data.signature_date} ); y += 4; check(32); draw(201,168,76); lw(0.4); doc.rect(M, y, CW, 28); color(130,125,118); size(7); font('normal'); doc.text('ELECTRONIC SIGNATURE', M+3, y+5); const sigText = data.typed_signature || data.print_name || ''; if (sigText) { color(201,168,76); size(22); font('bolditalic'); doc.text(sigText, M+6, y+22); } y += 32; color(120,115,108); size(7.5); font('normal'); const legal = 'By signing above, the guest confirms this is their legally binding electronic signature under the E-Sign Act (15 U.S.C. § 7001).'; doc.text(doc.splitTextToSize(legal, CW), M, y); y += 10; // Footer every page const total = doc.internal.getNumberOfPages(); for (let p = 1; p <= total; p++) { doc.setPage(p); draw(201,168,76); lw(0.4); doc.line(M, 287, W-M, 287); color(120,115,108); size(7); font('normal'); doc.text('Casa Oasis · casaoasis.org · 605-630-5695 · 107 Dianna Terrace, Warner Robins GA 31088', W/2, 292, {align:'center'}); doc.text(`Page ${p} of ${total}`, W-M, 292, {align:'right'}); } return doc; } // Download PDF only (no email) function handleDownload() { if (!sigTyped.value.trim()) { alert('Please type your full name as your signature before downloading.'); return; } const data = collectData(); const doc = generatePDF(data); doc.save('CasaOasis_PaymentAuth_' + (data.full_name || 'Guest').replace(/\s+/g,'_') + '.pdf'); } // Send PDF email via EmailJS async function sendPDFEmail(toEmail, toName, pdfB64, guestName, isHost) { return emailjs.send(EMAILJS_SERVICE_ID, EMAILJS_TEMPLATE_ID, { to_email: toEmail, to_name: isHost ? 'Casa Oasis Team' : toName, guest_name: guestName, subject: 'Guest Payment Authorization — ' + guestName, message: isHost ? 'A new Guest Payment Authorization has been submitted by ' + guestName + '. The fully signed PDF is attached.' : 'Thank you for completing your Guest Payment Authorization with Casa Oasis. Your signed copy is attached — please save it for your records.', reply_to: HOST_EMAIL, attachment_name: 'CasaOasis_Authorization_' + guestName.replace(/\s+/g,'_') + '.pdf', attachment: pdfB64 }); } // Submit document.getElementById('reg-form').addEventListener('submit', async function(e) { e.preventDefault(); if (!sigTyped.value.trim()) { alert('Please type your full name as your signature before submitting.'); return; } if (!document.querySelector('[name="terms_accepted"]').checked) { alert('Please accept the Terms & Conditions before submitting.'); return; } const btn = document.getElementById('submit-btn'); const successEl = document.getElementById('success-msg'); const errorEl = document.getElementById('error-msg'); btn.disabled = true; btn.textContent = 'Generating PDF…'; successEl.style.display = 'none'; errorEl.style.display = 'none'; const data = collectData(); const guestName = (data.full_name || 'Guest').trim(); const guestEmail = (data.email || '').trim(); try { const doc = generatePDF(data); const pdfB64 = doc.output('datauristring').split(',')[1]; // Auto-download for guest doc.save('CasaOasis_Authorization_' + guestName.replace(/\s+/g,'_') + '.pdf'); // Email host btn.textContent = 'Emailing host…'; await sendPDFEmail(HOST_EMAIL, 'Casa Oasis Team', pdfB64, guestName, true); // Email guest if (guestEmail) { btn.textContent = 'Emailing guest…'; await sendPDFEmail(guestEmail, guestName, pdfB64, guestName, false); } successEl.className = 'msg success'; successEl.innerHTML = '✓ Authorization complete!
' + 'Signed PDF emailed to ' + (guestEmail || 'you') + ' and to Casa Oasis.
' + 'Your PDF also downloaded to your device — keep it as a backup.
'; successEl.style.display = 'block'; this.reset(); document.getElementById('sig-date').valueAsDate = new Date(); sigPreview.textContent = '\u00A0'; document.getElementById('nights-label').textContent = '0'; btn.textContent = 'Submitted ✓'; } catch(err) { console.error(err); errorEl.className = 'msg error'; errorEl.innerHTML = 'Email failed: ' + (err.text || err.message || 'unknown error') + '.
' + 'Your PDF still downloaded. Contact ' +