`); printWindow.document.close(); }; const generateCertificateHTML = () => { const today = new Date().toLocaleDateString(); return `
CERTIFICATE OF LIABILITY INSURANCE
DATE (MM/DD/YYYY): ${today}
PRODUCER INSURED
${formData.producerName}
${formData.producerAddress}
Phone: ${formData.producerPhone}
Email: ${formData.producerEmail}
${formData.companyName}
${formData.companyAddress}
${formData.companyCity}, ${formData.companyState} ${formData.companyZip}
Phone: ${formData.companyPhone}
CERTIFICATE HOLDER
${formData.holderName}
${formData.holderAddress}
${formData.holderCity}, ${formData.holderState} ${formData.holderZip}
TYPE OF INSURANCE ADDL INSRD SUBR WVD POLICY NUMBER POLICY EFF DATE POLICY EXP DATE LIMITS
GENERAL LIABILITY
Commercial General Liability
Claims-Made ☐ Occur ☑
${formData.additionalInsured ? '☑' : '☐'} ${formData.waiverOfSubrogation ? '☑' : '☐'} ${formData.glPolicyNumber} ${formData.glEffectiveDate} ${formData.glExpirationDate} EACH OCCURRENCE: $${parseInt(formData.glLimitPerOccurrence).toLocaleString()}
GENERAL AGGREGATE: $${parseInt(formData.glLimitAggregate).toLocaleString()}
AUTOMOBILE LIABILITY
Any Auto ☑
Owned Autos Only ☐
Hired Autos Only ☐
Non-Owned Autos Only ☐
${formData.additionalInsured ? '☑' : '☐'} ${formData.waiverOfSubrogation ? '☑' : '☐'} ${formData.autoPolicyNumber} ${formData.autoEffectiveDate} ${formData.autoExpirationDate} COMBINED SINGLE LIMIT: $${parseInt(formData.autoLiabilityLimit).toLocaleString()}
UMBRELLA LIAB
EXCESS LIAB
☐ DED ☐ RETENTION
${formData.additionalInsured ? '☑' : '☐'} ${formData.waiverOfSubrogation ? '☑' : '☐'} ${formData.umbrellaPolicyNumber} ${formData.umbrellaEffectiveDate} ${formData.umbrellaExpirationDate} EACH OCCURRENCE: $${parseInt(formData.umbrellaLimit).toLocaleString()}
WORKERS COMPENSATION
AND EMPLOYERS' LIABILITY
Y/N: Y
N/A ${formData.waiverOfSubrogation ? '☑' : '☐'} ${formData.wcPolicyNumber} ${formData.wcEffectiveDate} ${formData.wcExpirationDate} E.L. EACH ACCIDENT: $${parseInt(formData.wcLimitEL).toLocaleString()}
E.L. DISEASE-EA EMPLOYEE: $${parseInt(formData.wcLimitEL).toLocaleString()}
E.L. DISEASE-POLICY LIMIT: $${parseInt(formData.wcLimitEL).toLocaleString()}
CARGO INSURANCE ${formData.cargoPolicyNumber} ${formData.cargoEffectiveDate} ${formData.cargoExpirationDate} LIMIT: $${parseInt(formData.cargoLimit).toLocaleString()}
DESCRIPTION OF OPERATIONS / LOCATIONS / VEHICLES
Moving services at ${formData.propertyAddress}, ${formData.propertyCity}, ${formData.propertyState} ${formData.propertyZip}
Move Date: ${formData.moveDate}
${formData.additionalInsured ? 'Certificate Holder is included as Additional Insured.' : ''}
${formData.primaryNonContributory ? 'Insurance is Primary and Non-Contributory.' : ''}
${formData.additionalRemarks}
CERTIFICATE HOLDER AUTHORIZED REPRESENTATIVE
${formData.holderName}
${formData.holderAddress}
${formData.holderCity}, ${formData.holderState} ${formData.holderZip}
SIGNATURE

DATE
IMPORTANT: If the certificate holder is an ADDITIONAL INSURED, the policy(ies) must have ADDITIONAL INSURED provisions or be endorsed. If SUBROGATION IS WAIVED, subject to the terms and conditions of the policy, certain policies may require an endorsement. A statement on this certificate does not confer rights to the certificate holder in lieu of such endorsement(s).
`; }; const steps = [ { title: 'Company Info', icon: Building2 }, { title: 'Certificate Holder', icon: FileText }, { title: 'Property Details', icon: Building2 }, { title: 'Insurance Provider', icon: Shield }, { title: 'Coverage Details', icon: CheckCircle }, { title: 'Review & Generate', icon: Eye } ]; const renderStepIndicator = () => (
{steps.map((step, index) => { const StepIcon = step.icon; const stepNumber = index + 1; const isActive = stepNumber === currentStep; const isCompleted = stepNumber < currentStep; return (
{step.title}
{stepNumber < steps.length && (
)}
); })}
); const renderFormStep = () => { switch(currentStep) { case 1: return (

Company Information

Enter your moving company's details

handleInputChange('companyName', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="ABC Moving Company" />
handleInputChange('companyPhone', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="(555) 123-4567" />
handleInputChange('companyAddress', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="123 Main Street" />
handleInputChange('companyCity', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="New York" />
handleInputChange('companyZip', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="10001" />
handleInputChange('companyEmail', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="info@abcmoving.com" />
); case 2: return (

Certificate Holder

Building management or property owner requiring the COI

handleInputChange('holderName', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="XYZ Property Management LLC" />
handleInputChange('holderAddress', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="456 Property Ave" />
handleInputChange('holderCity', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="New York" />
handleInputChange('holderZip', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="10001" />
); case 3: return (

Property & Move Details

Information about the property and move date

handleInputChange('propertyAddress', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="789 Apartment Building St, Apt 4B" />
handleInputChange('propertyCity', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="New York" />
handleInputChange('propertyZip', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="10001" />
handleInputChange('moveDate', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
); case 4: return (

Insurance Provider

Details about your insurance company and agent

handleInputChange('insuranceCompany', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="ABC Insurance Co." />
handleInputChange('producerName', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="John Smith Insurance Agency" />
handleInputChange('producerAddress', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="123 Insurance Blvd, New York, NY 10001" />
handleInputChange('producerPhone', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="(555) 987-6543" />
handleInputChange('producerEmail', e.target.value)} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="agent@insurance.com" />
); case 5: return (

Insurance Coverage Details

Enter policy numbers, dates, and coverage limits

{/* General Liability */}

General Liability

handleInputChange('glPolicyNumber', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="GL123456789" />
handleInputChange('glEffectiveDate', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
handleInputChange('glExpirationDate', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Auto Liability */}

Automobile Liability

handleInputChange('autoPolicyNumber', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="AUTO123456789" />
handleInputChange('autoEffectiveDate', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
handleInputChange('autoExpirationDate', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Workers Compensation */}

Workers Compensation

handleInputChange('wcPolicyNumber', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="WC123456789" />
handleInputChange('wcEffectiveDate', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
handleInputChange('wcExpirationDate', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Umbrella Liability */}

Umbrella Liability

handleInputChange('umbrellaPolicyNumber', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="UMB123456789" />
handleInputChange('umbrellaEffectiveDate', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
handleInputChange('umbrellaExpirationDate', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Cargo Insurance */}

Cargo Insurance

handleInputChange('cargoPolicyNumber', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="CARGO123456789" />
handleInputChange('cargoEffectiveDate', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
handleInputChange('cargoExpirationDate', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Additional Options */}

Additional Insurance Options

handleInputChange('additionalInsured', e.target.checked)} className="w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500" />
handleInputChange('waiverOfSubrogation', e.target.checked)} className="w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500" />
handleInputChange('primaryNonContributory', e.target.checked)} className="w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500" />