SCHOOL ERP

Invoice Detailed View

Invoice Number: ${data.invoice_no || 'N/A'}
Student Basic Details
Student Name${data.student_name || 'N/A'}
Admission No${data.admission_no || 'N/A'}
Class Applying${data.class_applying || 'N/A'}
Father Name${data.father_name || 'N/A'}
Mobile No${data.mobile_no || 'N/A'}
Fee Particulars
Fee Head/Title${data.fee_type || 'N/A'}
Month / Year${data.month_year || 'N/A'}
Amount Payable₹${parseFloat(data.amount).toFixed(2)}
Status ${data.status || 'N/A'}
Payment Mode${data.payment_mode || '-'}
Transaction ID${data.transaction_id || '-'}
Official Remark${data.payment_remark || '-'}
Date Issued${data.created_at || '-'}
`; var detailsWindow = window.open('', '_blank', 'width=850,height=700,scrollbars=yes'); detailsWindow.document.open(); detailsWindow.document.write(printHtml); detailsWindow.document.close(); } // ========================================================================= // UNIFIED DOSSIER ENGINE (Optimized for 3-Column / 6-td Layout) // ========================================================================= const hiddenFields = ['doc_photo', 'doc_aadhaar', 'doc_birth', 'doc_marksheet', 'doc_tc', 'doc_mig', 'doc_caste', 'doc_income', 'doc_addr', 'doc_disability', 'status', 'id', 'admission_no', 'class_applying', 'applied_date', 'kyc_status', 'remark', 'admin_action', 'user_id']; function buildDossierHTML(dataObj, mode) { let html = ''; let processedKeys = []; const titleWeight = (mode === 'print') ? 'normal' : 'bold'; const formatKey = (k) => k.replace(/_/g, ' ').toUpperCase(); // DROPDOWN MAPPING - Updated with dynamic SQL fetched data const dropdownOptions = { 'class_applying': dynamicClasses.length > 0 ? dynamicClasses : ['Pre-Nursery', 'Nursery', 'LKG', 'UKG', 'Class 1', 'Class 2', 'Class 3', 'Class 4', 'Class 5', 'Class 6', 'Class 7', 'Class 8', 'Class 9', 'Class 10', 'Class 11', 'Class 12'], 'section': dynamicSections.length > 0 ? dynamicSections : ['A', 'B', 'C', 'D', 'E'], 'gender': ['Male', 'Female', 'Other'], 'religion': ['Hindu', 'Muslim', 'Christian', 'Sikh', 'Jain', 'Buddhist', 'Other'], 'blood_group': ['A+', 'A-', 'B+', 'B-', 'O+', 'O-', 'AB+', 'AB-'], 'category': ['General', 'OBC', 'SC', 'ST', 'Other'], 'caste': ['General', 'OBC', 'SC', 'ST', 'Other'] }; // Dynamically add session if data exists if (dynamicSessions.length > 0) { dropdownOptions['academic_session'] = dynamicSessions; } const renderVal = (k, v) => { // Do not allow free-text edit for assigned subjects if (mode === 'edit' && k === 'assigned_subjects') return `${v || 'N/A'}
(Manage via Subject Module)
`; if (mode === 'edit') { // Check if the current column should be a dropdown if (dropdownOptions[k.toLowerCase()]) { let opts = dropdownOptions[k.toLowerCase()]; let selectHtml = ``; return selectHtml; } // Regular Text Input for everything else return ``; } // View and Print Mode return `${(v === undefined || v === null || v === '') ? 'N/A' : v}`; }; const markProcessed = (keys) => keys.forEach(k => processedKeys.push(k)); const buildRow = (items) => { let rowHtml = ''; let validItems = items.filter(i => i); if(validItems.length === 0) return ''; if (validItems.length === 1) { rowHtml += `${formatKey(validItems[0])}`; rowHtml += `${renderVal(validItems[0], dataObj[validItems[0]])}`; } else if (validItems.length === 2) { rowHtml += `${formatKey(validItems[0])}`; rowHtml += `${renderVal(validItems[0], dataObj[validItems[0]])}`; rowHtml += `${formatKey(validItems[1])}`; rowHtml += `${renderVal(validItems[1], dataObj[validItems[1]])}`; } else if (validItems.length === 3) { rowHtml += `${formatKey(validItems[0])}`; rowHtml += `${renderVal(validItems[0], dataObj[validItems[0]])}`; rowHtml += `${formatKey(validItems[1])}`; rowHtml += `${renderVal(validItems[1], dataObj[validItems[1]])}`; rowHtml += `${formatKey(validItems[2])}`; rowHtml += `${renderVal(validItems[2], dataObj[validItems[2]])}`; } rowHtml += ''; markProcessed(validItems); return rowHtml; }; let photoSrc = dataObj.doc_photo && dataObj.doc_photo.trim() !== '' ? dataObj.doc_photo : 'https://via.placeholder.com/110x140?text=No+Photo'; let currentDate = new Date().toLocaleString('en-IN', { timeZone: 'Asia/Kolkata' }); if (mode === 'print') { html += `
Logo
OFFICE OF THE PRINCIPAL OFFICIAL SCHOOL MANAGEMENT SYSTEM STUDENT ADMISSION RECORDS
COMPLETE ADMISSION DOSSIER
`; } html += `
ADMISSION & SYSTEM INFO
ADMISSION NO ${dataObj.admission_no || 'N/A'}
SYSTEM QR
CLASS APPLYING ${renderVal('class_applying', dataObj.class_applying)}
ADMISSION STATUS ${dataObj.status || 'PENDING'}
KYC STATUS ${dataObj.kyc_status || 'PENDING'}
`; markProcessed(['admission_no', 'class_applying', 'status', 'kyc_status']); // ========================================================= // SHOW ASSIGNED SUBJECTS IN DOSSIER // ========================================================= html += ``; html += buildRow(['registration_no', 'academic_session', 'section']); html += buildRow(['assigned_subjects']); // Subject injection html += `
ACADEMIC REGISTRATION & SUBJECTS DETAILS
`; html += ``; html += buildRow(['student_name']); html += buildRow(['dob', 'mobile_no', 'gender']); html += buildRow(['email']); let currAddrKey = dataObj.hasOwnProperty('curr_addr') ? 'curr_addr' : 'address'; html += buildRow([currAddrKey]); html += buildRow(['religion', 'blood_group', 'nationality']); html += buildRow(['permanent_address']); html += `
STUDENT BASIC DETAILS
`; markProcessed(['student_name', 'dob', 'mobile_no', 'gender', 'email', currAddrKey, 'religion', 'blood_group', 'nationality', 'permanent_address']); html += `
AGE ${renderVal('age', dataObj.age)} CATEGORY ${renderVal('category', dataObj.category || dataObj.caste)} PLACE OF BIRTH ${renderVal('place_of_birth', dataObj.place_of_birth)} BIRTH CERT NO ${renderVal('birth_cert_no', dataObj.birth_cert_no)}
`; markProcessed(['age', 'category', 'caste', 'place_of_birth', 'birth_cert_no']); html += ``; html += buildRow(['father_name', 'mother_name', 'guardian_name']); html += buildRow(['father_occupation', 'mother_occupation']); html += `
PARENTS & GUARDIAN DETAILS
`; html += ``; html += buildRow(['previous_school']); html += buildRow(['last_class_passed', 'marks_obtained', 'passing_year']); html += `
PREVIOUS ACADEMIC DETAILS
`; let otherKeys = Object.keys(dataObj).filter(k => !processedKeys.includes(k) && !hiddenFields.includes(k.toLowerCase()) && !(typeof dataObj[k] === 'string' && dataObj[k].indexOf('data:image') === 0)); if(otherKeys.length > 0) { html += ``; for(let i = 0; i < otherKeys.length; i += 3) { let chunk = otherKeys.slice(i, i + 3); html += buildRow(chunk); } html += `
OTHER DETAILS
`; } if (mode === 'print') { html += `
PARENT/GUARDIAN SIGNATURE
Signature valid
Digitally verified by
ADMISSION OFFICER
Date: ${currentDate} Reason: Admission Approval Process
AUTHORISED SIGNATORY
Computer Generated Dossier | Official Management System | Printed on: ${currentDate}
`; } return html; } function openUnifiedDossier(elem, mode) { let data; try { data = JSON.parse(elem.getAttribute('data-json')); } catch(e) { alert("Data parse error"); return; } if(mode === 'print') { let printWin = window.open('', '_blank'); let html = `Admission Dossier - ${data.admission_no}
${buildDossierHTML(data, 'print')}