Skip to content

 #166

Description

@semskgcphs-afk
<title>একীভূত পরীক্ষা ব্যবস্থাপনা সিস্টেম ২০২৬</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; }
 body {
font-family: Arial, sans-serif;
background: #f5f5f5;
padding: 20px;
}
.container {
max-width: 1200px;
margin: 0 auto;
background: white;
border-radius: 10px;
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}
.header {
background: #2196F3;
color: white;
padding: 20px;
text-align: center;
border-radius: 10px 10px 0 0;
}
.nav-menu {
background: #1976D2;
padding: 10px;
display: flex;
gap: 10px;
flex-wrap: wrap;
justify-content: center;
}
.nav-btn {
background: transparent;
color: white;
border: 2px solid white;
padding: 10px 15px;
border-radius: 5px;
cursor: pointer;
font-weight: bold;
}
.nav-btn:hover,
.nav-btn.active {
background: white;
color: #1976D2;
}
.content {
padding: 20px;
}
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
.form-section {
background: #f8f9fa;
padding: 20px;
border-radius: 8px;
margin-bottom: 20px;
border: 2px solid #2196F3;
}
.form-section h3 {
color: #2196F3;
margin-bottom: 15px;
}
.form-group {
margin-bottom: 15px;
}
.form-group label {
display: block;
margin-bottom: 5px;
font-weight: bold;
color: #555;
}
.form-row {
display: grid;
grid-template-columns: 2fr 1fr 1fr 80px 50px;
gap: 10px;
align-items: center;
margin-bottom: 10px;
padding: 10px;
background: white;
border-radius: 5px;
}
.form-row select,
.form-row input {
padding: 8px;
border: 2px solid #ddd;
border-radius: 5px;
}
.student-count {
background: #28a745;
color: white;
text-align: center;
border-radius: 5px;
font-weight: bold;
padding: 8px 5px;
}
.btn {
background: #2196F3;
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
font-weight: bold;
margin: 5px;
}
.btn:hover {
background: #1976D2;
}
.btn-success {
background: #28a745;
}
.btn-success:hover {
background: #218838;
}
.btn-danger {
background: #dc3545;
}
.btn-danger:hover {
background: #c82333;
}
.remove-btn {
background: #dc3545;
color: white;
border: none;
padding: 5px 8px;
border-radius: 3px;
cursor: pointer;
}
.seat-table {
width: 100%;
border-collapse: collapse;
margin: 20px 0;
}
.seat-table th,
.seat-table td {
border: 1px solid #ddd;
padding: 8px;
text-align: center;
}
.seat-table th {
background: #2196F3;
color: white;
}
.seat-table tr:nth-child(even) {
background: #f8f9fa;
}
.alert {
padding: 10px;
margin: 10px 0;
border-radius: 5px;
display: none;
}
.alert-success {
background: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
}
.alert-error {
background: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
}
.total-students {
background: #dc3545;
color: white;
padding: 15px;
border-radius: 5px;
text-align: center;
margin: 20px 0;
font-weight: bold;
font-size: 18px;
}
.column-input {
background: #f8f9fa;
padding: 15px;
border-radius: 8px;
margin-bottom: 15px;
border: 2px solid #ddd;
}
.column-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.range-item {
display: flex;
gap: 10px;
align-items: center;
margin-bottom: 10px;
padding: 10px;
background: white;
border-radius: 5px;
}
.range-item input {
width: 80px;
padding: 5px;
border: 1px solid #ddd;
border-radius: 3px;
text-align: center;
}
@media (max-width: 768px) {
.form-row {
grid-template-columns: 1fr;
gap: 10px;
}
.nav-menu {
flex-direction: column;
}
.range-item {
flex-direction: column;
align-items: stretch;
}
}
</style>

একীভূত পরীক্ষা ব্যবস্থাপনা সিস্টেম ২০২৬

সিট প্ল্যান ও কক্ষ তথ্য ব্যবস্থাপনা

 <div class="nav-menu">
<button class="nav-btn active" onclick="showTab('room-info')">কক্ষের তথ্য</button>
<button class="nav-btn" onclick="showTab('seat-generator')">সিট প্ল্যান জেনারেটর</button>
<button class="nav-btn" onclick="showTab('view-results')">ফলাফল দেখুন</button>
<button class="nav-btn" onclick="showTab('export')">এক্সপোর্ট</button>
</div>
<div class="content">
<!-- Room Info Tab -->
<div id="room-info" class="tab-content active">
<div class="form-section">
<h3>কক্ষের তথ্য</h3>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 20px;">
<div>
<label>কক্ষ নং:</label>
<select id="roomSelect">
<option value="1-boys">কক্ষ ১ (বালক)</option>
<option value="1-girls">কক্ষ ১ (বালিকা)</option>
<option value="1-mixed">কক্ষ ১ (বালক ও বালিকা)</option>
<option value="2-boys">কক্ষ ২ (বালক)</option>
<option value="2-girls">কক্ষ ২ (বালিকা)</option>
<option value="2-mixed">কক্ষ ২ (বালক ও বালিকা)</option>
<option value="3-boys">কক্ষ ৩ (বালক)</option>
<option value="3-girls">কক্ষ ৩ (বালিকা)</option>
<option value="3-mixed">কক্ষ ৩ (বালক ও বালিকা)</option>
</select>
</div>
<div>
<label>বিভাগ:</label>
<select id="departmentSelect">
<option value="বিজ্ঞান">বিজ্ঞান</option>
<option value="মানবিক">মানবিক</option>
<option value="ব্যবসায় শিক্ষা">ব্যবসায় শিক্ষা</option>
</select>
</div>
<div>
<label>ভবন:</label>
<select id="buildingSelect">
<option value="পশ্চিম পার্শ্বের ভবন">পশ্চিম পার্শ্বের ভবন</option>
<option value="পূর্ব পার্শ্বের ভবন">পূর্ব পার্শ্বের ভবন</option>
<option value="প্রধান ভবন">প্রধান ভবন</option>
</select>
</div>
<div>
<label>তলা:</label>
<select id="floorSelect">
<option value="১ম তলা">১ম তলা</option>
<option value="২য় তলা" selected>২য় তলা</option>
<option value="৩য় তলা">৩য় তলা</option>
</select>
</div>
</div>
</div>
<div class="form-section">
<h3>বিদ্যালয়ের তথ্য</h3>
<div id="schoolForms">
<div class="form-row">
<select class="school-select">
<option value="">বিদ্যালয় নির্বাচন করুন</option>
<option value="এম.এ.খালেক সরকারি বালিকা উচ্চ বিদ্যালয়">এম.এ.খালেক সরকারি বালিকা উচ্চ বিদ্যালয়</option>
<option value="ঢাকা কলেজিয়েট স্কুল">ঢাকা কলেজিয়েট স্কুল</option>
<option value="হলি ক্রস স্কুল">হলি ক্রস স্কুল</option>
<option value="ভিকারুননিসা নূন স্কুল">ভিকারুননিসা নূন স্কুল</option>
</select>
<input type="number" placeholder="শুরুর রোল" class="start-roll" min="1">
<input type="number" placeholder="শেষের রোল" class="end-roll" min="1">
<div class="student-count">০</div>
<button type="button" class="remove-btn" onclick="removeSchoolRow(this)">×</button>
</div>
</div>
<button type="button" class="btn btn-success" onclick="addSchoolRow()">+ নতুন বিদ্যালয় যোগ করুন</button>
<div class="total-students" id="totalStudents">মোট পরীক্ষার্থী: ০ জন</div>
</div>
</div>
<!-- Seat Generator Tab -->
<div id="seat-generator" class="tab-content">
<div class="alert alert-success" id="successAlert"></div>
<div class="alert alert-error" id="errorAlert"></div>
<div class="form-section">
<h3>সিট প্ল্যান জেনারেটর</h3>
<div id="columnInputs"></div>
<button type="button" class="btn" onclick="generateSeatPlan()">সিট প্ল্যান তৈরি করুন</button>
<button type="button" class="btn btn-danger" onclick="clearSeatPlan()">ক্লিয়ার করুন</button>
</div>
</div>
<!-- View Results Tab -->
<div id="view-results" class="tab-content">
<div id="resultsDisplay">
<p style="text-align: center; padding: 50px; color: #666;">এখনো কোন ফলাফল তৈরি হয়নি।</p>
</div>
</div>
<!-- Export Tab -->
<div id="export" class="tab-content">
<div class="form-section">
<h3>এক্সপোর্ট অপশন</h3>
<div style="text-align: center; margin-bottom: 20px;">
<button type="button" class="btn btn-success" onclick="exportToCSV()">CSV ডাউনলোড</button>
<button type="button" class="btn" onclick="openGoogleSheets()">Google Sheets খুলুন</button>
<button type="button" class="btn" onclick="copyRoomInfoForD10()">D10 এর জন্য তথ্য কপি</button>
<button type="button" class="btn" onclick="copyData()">সিট প্ল্যান কপি</button>
<button type="button" class="btn btn-success" id="submitToSheetsBtn" onclick="submitToGoogleSheets()" disabled>
API লোড হচ্ছে...
</button>
<button type="button" class="btn" onclick="testSheetsConnection()">সংযোগ টেস্ট</button>
</div>
<div style="background: #ffebee; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #f44336;">
<h4 style="color: #c62828;">⚠️ Google Sheets API সেটআপ প্রয়োজন:</h4>
<ol style="margin-left: 20px; line-height: 1.8; color: #d32f2f;">
<li><strong>Google Cloud Console এ যান:</strong> <a href="https://console.cloud.google.com/" target="_blank">console.cloud.google.com</a></li>
<li><strong>নতুন প্রজেক্ট তৈরি করুন</strong> অথবা বিদ্যমান সিলেক্ট করুন</li>
<li><strong>Google Sheets API Enable করুন:</strong> APIs & Services → Library → Google Sheets API → Enable</li>
<li><strong>API Key তৈরি করুন:</strong> Credentials → Create Credentials → API Key</li>
<li><strong>API Key কোডে প্রবেশ করান:</strong> <code>const API_KEY = 'YOUR_API_KEY_HERE';</code> লাইনে</li>
<li><strong>OAuth 2.0 সেটআপ করুন</strong> (write access এর জন্য)</li>
</ol>
<p style="margin-top: 15px; padding: 10px; background: #fff; border-radius: 5px; color: #666;">
<strong>বিকল্প:</strong> আপাতত manual copy/paste পদ্ধতি ব্যবহার করুন যা 100% কার্যকর।
</p>
</div>
<div style="background: #e8f5e8; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #4CAF50;">
<h4>সরাসরি জমা দেওয়ার অপশন:</h4>
<p style="margin: 10px 0;">
<strong>Google Form Link:</strong>
<a href="#" id="googleFormLink" target="_blank">Data Submission Form</a>
</p>
<div id="formSubmissionStatus" style="margin-top: 10px; padding: 10px; display: none;"></div>
</div>
<div style="background: #e3f2fd; padding: 15px; border-radius: 8px; margin-bottom: 15px;">
<h4>Google Sheets Integration (Data_Input শিট):</h4>
<p style="margin: 10px 0;">
<strong>Main Link:</strong> <a href="https://docs.google.com/spreadsheets/d/1rms0WqhePNopnWLLo5dbrJpoY92zVQh_0Q4Nycn5XWA/edit?usp=sharing" target="_blank">
Google Sheets Document
</a>
</p>
<p style="margin: 10px 0;">
<strong>Data_Input শিট সরাসরি:</strong>
<a href="https://docs.google.com/spreadsheets/d/1rms0WqhePNopnWLLo5dbrJpoY92zVQh_0Q4Nycn5XWA/edit#gid=0" target="_blank">
Data_Input Sheet
</a>
</p>
</div>
<div style="background: #fff3e0; padding: 15px; border-radius: 8px; border-left: 4px solid #FF9800;">
<h4>তিনটি জমা দেওয়ার পদ্ধতি:</h4>
<div style="margin: 15px 0; padding: 10px; background: white; border-radius: 5px;">
<h5 style="color: #4CAF50;">পদ্ধতি ১: Google Form (সুপারিশকৃত)</h5>
<ol style="margin-left: 20px; line-height: 1.6;">
<li>"Google Form এ জমা দিন" বাটনে ক্লিক করুন</li>
<li>ফর্মটি অটোমেটিক পূরণ হয়ে যাবে</li>
<li>"Submit" বাটনে ক্লিক করুন</li>
<li>ডেটা সরাসরি Google Sheets এ চলে যাবে</li>
</ol>
</div>
<div style="margin: 15px 0; padding: 10px; background: white; border-radius: 5px;">
<h5 style="color: #2196F3;">পদ্ধতি ২: Manual Copy (D10 সেল)</h5>
<ol style="margin-left: 20px; line-height: 1.6;">
<li>"D10 এর জন্য তথ্য কপি" বাটনে ক্লিক করুন</li>
<li>"Data_Input Sheet" লিংকে ক্লিক করুন</li>
<li>D10 সেল সিলেক্ট করুন</li>
<li>Ctrl+V দিয়ে পেস্ট করুন</li>
</ol>
</div>
<div style="margin: 15px 0; padding: 10px; background: white; border-radius: 5px;">
<h5 style="color: #FF9800;">পদ্ধতি ৩: CSV Import</h5>
<ol style="margin-left: 20px; line-height: 1.6;">
<li>CSV ডাউনলোড করুন</li>
<li>Google Sheets এ নতুন শিট তৈরি করুন</li>
<li>File → Import → Upload দিয়ে CSV ইমপোর্ট করুন</li>
</ol>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://apis.google.com/js/api.js"></script>
<script>
let rangeCounters = {};
let seatPlanData = null;
// Google Sheets API Configuration
const API_KEY = 'YOUR_API_KEY_HERE'; // Replace with your actual API key
const SHEET_ID = '1rms0WqhePNopnWLLo5dbrJpoY92zVQh_0Q4Nycn5XWA';
const DISCOVERY_DOC = 'https://sheets.googleapis.com/$discovery/rest?version=v4';
const SCOPES = 'https://www.googleapis.com/auth/spreadsheets';
let gapi_loaded = false;
let gis_loaded = false;
// Initialize Google API
function gapiLoaded() {
gapi.load('client', initializeGapiClient);
}
async function initializeGapiClient() {
try {
await gapi.client.init({
apiKey: API_KEY,
discoveryDocs: [DISCOVERY_DOC],
});
gapi_loaded = true;
maybeEnableButtons();
} catch (error) {
console.log('GAPI initialization error:', error);
}
}
function gisLoaded() {
gis_loaded = true;
maybeEnableButtons();
}
function maybeEnableButtons() {
if (gapi_loaded && gis_loaded) {
document.getElementById('submitToSheetsBtn').disabled = false;
document.getElementById('submitToSheetsBtn').textContent = 'Google Sheets এ জমা দিন';
}
}
// Initialize
document.addEventListener('DOMContentLoaded', function() {
initializeSeatGenerator();
setupEventListeners();
// Load Google API
if (typeof gapi !== 'undefined') {
gapiLoaded();
}
});
async function submitToGoogleSheets() {
if (!gapi_loaded) {
alert('Google API লোড হয়নি। দয়া করে পেজ রিফ্রেশ করুন।');
return;
}
try {
// Get room info
const roomSelect = document.getElementById('roomSelect').value;
const department = document.getElementById('departmentSelect').value;
const building = document.getElementById('buildingSelect').value;
const floor = document.getElementById('floorSelect').value;
// Format room info
const roomNumber = roomSelect.split('-')[0];
const roomType = roomSelect.split('-')[1];
const roomTypeInBangla = roomType === 'boys' ? 'বালক' : roomType === 'girls' ? 'বালিকা' : 'বালক ও বালিকা';
// Get total students
let totalStudents = 0;
document.querySelectorAll('#schoolForms .form-row').forEach(row => {
const school = row.querySelector('.school-select').value;
const start = parseInt(row.querySelector('.start-roll').value) || 0;
const end = parseInt(row.querySelector('.end-roll').value) || 0;
if (school && start > 0 && end >= start) {
totalStudents += end - start + 1;
}
});
const roomInfo = `কক্ষ ${roomNumber} (${roomTypeInBangla}) - ${department} - ${building} - ${floor} - ${totalStudents} জন`;
// Submit room info to D10
await submitRoomInfoToD10(roomInfo);
// Submit seat plan if available
if (seatPlanData && seatPlanData.length > 0) {
await submitSeatPlanToNewSheet(roomSelect, seatPlanData);
}
showAlert('সফলভাবে Google Sheets এ জমা দেওয়া হয়েছে!', 'success');
} catch (error) {
console.error('Submission error:', error);
showAlert('জমা দিতে ত্রুটি হয়েছে: ' + error.message, 'error');
}
}
async function submitRoomInfoToD10(roomInfo) {
const values = [[roomInfo]];
const range = 'Data_Input!D10';
const request = {
spreadsheetId: SHEET_ID,
range: range,
valueInputOption: 'USER_ENTERED',
resource: {
values: values
}
};
const response = await gapi.client.sheets.spreadsheets.values.update(request);
console.log('Room info submitted to D10:', response);
}
async function submitSeatPlanToNewSheet(roomSelect, seatData) {
const sheetName = `Room_${roomSelect}`;
// Try to create new sheet (ignore error if sheet already exists)
try {
await createNewSheet(sheetName);
} catch (error) {
console.log('Sheet might already exist, continuing...');
}
// Prepare data for the sheet
const allColumns = ['C', 'D', 'F', 'G', 'I', 'J'];
const maxRows = Math.max(...seatData.map(col => col.rolls.length));
const sheetData = [];
// Header row
sheetData.push(['Row', 'কলাম C', 'কলাম D', 'কলাম F', 'কলাম G', 'কলাম I', 'কলাম J']);
// Row 24 with column headers
sheetData.push([24, 'কলাম C', 'কলাম D', 'কলাম F', 'কলাম G', 'কলাম I', 'কলাম J']);
// Data rows
for (let row = 0; row < maxRows; row++) {
const rowData = [25 + row];
allColumns.forEach(col => {
const colData = seatData.find(c => c.column === col);
const value = colData && row < colData.rolls.length ? colData.rolls[row] : '';
rowData.push(value);
});
sheetData.push(rowData);
}
// Submit data to the sheet
const range = `${sheetName}!A1`;
const request = {
spreadsheetId: SHEET_ID,
range: range,
valueInputOption: 'USER_ENTERED',
resource: {
values: sheetData
}
};
const response = await gapi.client.sheets.spreadsheets.values.update(request);
console.log('Seat plan submitted to new sheet:', response);
}
async function createNewSheet(sheetName) {
const request = {
spreadsheetId: SHEET_ID,
resource: {
requests: [{
addSheet: {
properties: {
title: sheetName
}
}
}]
}
};
const response = await gapi.client.sheets.spreadsheets.batchUpdate(request);
console.log('New sheet created:', response);
}
// Test connection function
async function testSheetsConnection() {
try {
const response = await gapi.client.sheets.spreadsheets.get({
spreadsheetId: SHEET_ID
});
showAlert('Google Sheets সংযোগ সফল!', 'success');
console.log('Sheets connection successful:', response);
} catch (error) {
showAlert('Google Sheets সংযোগ ব্যর্থ: ' + error.message, 'error');
console.error('Sheets connection failed:', error);
}
}
// Initialize
document.addEventListener('DOMContentLoaded', function() {
initializeSeatGenerator();
setupEventListeners();
});
function showTab(tabName) {
// Hide all tabs
document.querySelectorAll('.tab-content').forEach(tab => {
tab.classList.remove('active');
});
// Remove active from buttons
document.querySelectorAll('.nav-btn').forEach(btn => {
btn.classList.remove('active');
});
// Show selected tab
document.getElementById(tabName).classList.add('active');
event.target.classList.add('active');
}
function setupEventListeners() {
document.querySelectorAll('.start-roll, .end-roll').forEach(input => {
input.addEventListener('input', updateStudentCounts);
});
document.querySelectorAll('.school-select').forEach(select => {
select.addEventListener('change', updateStudentCounts);
});
}
function addSchoolRow() {
const container = document.getElementById('schoolForms');
const newRow = document.createElement('div');
newRow.className = 'form-row';
newRow.innerHTML = `
<select class="school-select">
<option value="">বিদ্যালয় নির্বাচন করুন</option>
<option value="এম.এ.খালেক সরকারি বালিকা উচ্চ বিদ্যালয়">এম.এ.খালেক সরকারি বালিকা উচ্চ বিদ্যালয়</option>
<option value="ঢাকা কলেজিয়েট স্কুল">ঢাকা কলেজিয়েট স্কুল</option>
<option value="হলি ক্রস স্কুল">হলি ক্রস স্কুল</option>
<option value="ভিকারুননিসা নূন স্কুল">ভিকারুননিসা নূন স্কুল</option>
</select>
<input type="number" placeholder="শুরুর রোল" class="start-roll" min="1">
<input type="number" placeholder="শেষের রোল" class="end-roll" min="1">
<div class="student-count">০</div>
<button type="button" class="remove-btn" onclick="removeSchoolRow(this)">×</button>
`;
container.appendChild(newRow);
// Add event listeners to new elements
newRow.querySelector('.start-roll').addEventListener('input', updateStudentCounts);
newRow.querySelector('.end-roll').addEventListener('input', updateStudentCounts);
newRow.querySelector('.school-select').addEventListener('change', updateStudentCounts);
}
function removeSchoolRow(button) {
button.parentElement.remove();
updateStudentCounts();
}
function updateStudentCounts() {
let total = 0;
document.querySelectorAll('#schoolForms .form-row').forEach(row => {
const school = row.querySelector('.school-select').value;
const start = parseInt(row.querySelector('.start-roll').value) || 0;
const end = parseInt(row.querySelector('.end-roll').value) || 0;
let count = 0;
if (school && start > 0 && end >= start) {
count = end - start + 1;
}
row.querySelector('.student-count').textContent = count;
total += count;
});
document.getElementById('totalStudents').textContent = `মোট পরীক্ষার্থী: ${total} জন`;
}
function initializeSeatGenerator() {
const columns = ['C', 'D', 'F', 'G', 'I', 'J'];
const container = document.getElementById('columnInputs');
columns.forEach(col => {
rangeCounters[col] = 1;
const div = document.createElement('div');
div.className = 'column-input';
div.innerHTML = `
<div class="column-header">
<strong>কলাম ${col}</strong>
<button type="button" class="btn" onclick="addRange('${col}')">+ রেঞ্জ যোগ করুন</button>
</div>
<div id="ranges_${col}"></div>
`;
container.appendChild(div);
addRange(col);
});
}
function addRange(col) {
const container = document.getElementById('ranges_' + col);
const rangeDiv = document.createElement('div');
rangeDiv.className = 'range-item';
rangeDiv.id = 'range_' + col + '_' + rangeCounters[col];
rangeDiv.innerHTML = `
<span>রেঞ্জ ${container.children.length + 1}:</span>
<span>শুরু:</span>
<input type="number" value="1" min="0" />
<span>সংখ্যা:</span>
<input type="number" value="0" min="0" />
<button type="button" class="remove-btn" onclick="removeRange('${col}', '${rangeCounters[col]}')">×</button>
`;
container.appendChild(rangeDiv);
rangeCounters[col]++;
}
function removeRange(col, id) {
const container = document.getElementById('ranges_' + col);
if (container.children.length > 1) {
document.getElementById('range_' + col + '_' + id).remove();
}
}
function generateSeatPlan() {
const columns = ['C', 'D', 'F', 'G', 'I', 'J'];
const seatData = [];
columns.forEach(col => {
const ranges = document.querySelectorAll('#ranges_' + col + ' .range-item');
const colRolls = [];
ranges.forEach(range => {
const inputs = range.querySelectorAll('input');
const start = parseInt(inputs[0].value) || 0;
const count = parseInt(inputs[1].value) || 0;
for (let i = 0; i < count; i++) {
colRolls.push(start + i);
}
});
if (colRolls.length > 0) {
colRolls.sort((a, b) => a - b);
seatData.push({ column: col, rolls: colRolls });
}
});
if (seatData.length === 0) {
showAlert('কোন ডেটা পাওয়া যায়নি!', 'error');
return;
}
seatPlanData = seatData;
displayResults(seatData);
showAlert('সিট প্ল্যান তৈরি হয়েছে!', 'success');
}
function displayResults(data) {
const maxRows = Math.max(...data.map(col => col.rolls.length));
const allColumns = ['C', 'D', 'F', 'G', 'I', 'J'];
let html = `
<h3>সিট প্ল্যান ফলাফল</h3>
<table class="seat-table">
<thead>
<tr>
<th>Row</th>
${allColumns.map(col => `<th>কলাম ${col}</th>`).join('')}
</tr>
</thead>
<tbody>
<tr>
<td><strong>24</strong></td>
${allColumns.map(col => `<td><strong>কলাম ${col}</strong></td>`).join('')}
</tr>
`;
for (let row = 0; row < maxRows; row++) {
html += `<tr><td><strong>${25 + row}</strong></td>`;
allColumns.forEach(col => {
const colData = data.find(c => c.column === col);
const value = colData && row < colData.rolls.length ? colData.rolls[row] : '';
html += `<td>${value}</td>`;
});
html += '</tr>';
}
html += '</tbody></table>';
document.getElementById('resultsDisplay').innerHTML = html;
}
function clearSeatPlan() {
if (confirm('সব ডেটা মুছে ফেলবেন?')) {
document.getElementById('columnInputs').innerHTML = '';
initializeSeatGenerator();
document.getElementById('resultsDisplay').innerHTML = '<p style="text-align: center; padding: 50px; color: #666;">এখনো কোন ফলাফল তৈরি হয়নি।</p>';
seatPlanData = null;
showAlert('ডেটা মুছে ফেলা হয়েছে।', 'success');
}
}
function exportToCSV() {
if (!seatPlanData) {
alert('প্রথমে সিট প্ল্যান তৈরি করুন!');
return;
}
const roomInfo = document.getElementById('roomSelect').value;
const allColumns = ['C', 'D', 'F', 'G', 'I', 'J'];
const maxRows = Math.max(...seatPlanData.map(col => col.rolls.length));
// CSV content with exact format: Row 24, কলাম C, কলাম D, কলাম F, কলাম G, কলাম I, কলাম J
let csvContent = '';
// Header row
csvContent += 'Row,কলাম C,কলাম D,কলাম F,কলাম G,কলাম I,কলাম J\n';
// Row 24 with column headers
csvContent += '24,কলাম C,কলাম D,কলাম F,কলাম G,কলাম I,কলাম J\n';
// Data rows starting from 25
for (let row = 0; row < maxRows; row++) {
const rowData = [25 + row];
allColumns.forEach(col => {
const colData = seatPlanData.find(c => c.column === col);
const value = colData && row < colData.rolls.length ? colData.rolls[row] : '';
rowData.push(value);
});
csvContent += rowData.join(',') + '\n';
}
const blob = new Blob(['\uFEFF' + csvContent], { type: 'text/csv;charset=utf-8;' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `Room_${roomInfo}_seat_plan.csv`;
a.click();
URL.revokeObjectURL(url);
showAlert('CSV ফাইল ডাউনলোড হয়েছে!', 'success');
}
function submitToGoogleForm() {
const roomSelect = document.getElementById('roomSelect').value;
const department = document.getElementById('departmentSelect').value;
const building = document.getElementById('buildingSelect').value;
const floor = document.getElementById('floorSelect').value;
// Get school information
const schoolData = [];
let totalStudents = 0;
document.querySelectorAll('#schoolForms .form-row').forEach(row => {
const school = row.querySelector('.school-select').value;
const start = parseInt(row.querySelector('.start-roll').value) || 0;
const end = parseInt(row.querySelector('.end-roll').value) || 0;
if (school && start > 0 && end >= start) {
const count = end - start + 1;
totalStudents += count;
schoolData.push(`${school}: ${start}-${end} (${count} জন)`);
}
});
// Format room info
const roomNumber = roomSelect.split('-')[0];
const roomType = roomSelect.split('-')[1];
const roomTypeInBangla = roomType === 'boys' ? 'বালক' : roomType === 'girls' ? 'বালিকা' : 'বালক ও বালিকা';
const roomInfo = `কক্ষ ${roomNumber} (${roomTypeInBangla}) - ${department} - ${building} - ${floor} - ${totalStudents} জন`;
// Create Google Form URL with pre-filled data
// Note: You need to create a Google Form and get the actual form ID and field IDs
const formBaseURL = 'https://docs.google.com/forms/d/e/YOUR_FORM_ID/viewform';
// For demonstration, create a mailto link or show instructions
const formData = {
roomInfo: roomInfo,
schools: schoolData.join('\n'),
seatPlan: seatPlanData ? 'সিট প্ল্যান তৈরি হয়েছে' : 'সিট প্ল্যান তৈরি হয়নি',
timestamp: new Date().toLocaleString('bn-BD')
};
// Show submission modal/instructions
showSubmissionModal(formData);
}
function showSubmissionModal(data) {
const modal = document.createElement('div');
modal.style.cssText = `
position: fixed; top: 0; left: 0; width: 100%; height: 100%;
background: rgba(0,0,0,0.5); display: flex; justify-content: center;
align-items: center; z-index: 1000;
`;
modal.innerHTML = `
<div style="background: white; padding: 30px; border-radius: 10px; max-width: 600px; max-height: 80%; overflow-y: auto;">
<h3 style="color: #2196F3; margin-bottom: 20px;">ডেটা জমা দেওয়ার জন্য প্রস্তুত</h3>
<div style="background: #f8f9fa; padding: 15px; border-radius: 8px; margin-bottom: 20px;">
<h4>কক্ষের তথ্য:</h4>
<p style="margin: 10px 0; font-weight: bold;">${data.roomInfo}</p>
<h4>বিদ্যালয়ের তথ্য:</h4>
<pre style="background: white; padding: 10px; border-radius: 5px; font-family: inherit;">${data.schools}</pre>
<h4>সিট প্ল্যান স্ট্যাটাস:</h4>
<p>${data.seatPlan}</p>
<p style="margin-top: 15px; color: #666; font-size: 14px;">তৈরি: ${data.timestamp}</p>
</div>
<div style="background: #e8f5e8; padding: 15px; border-radius: 8px; margin-bottom: 20px;">
<h4 style="color: #2e7d32;">জমা দেওয়ার অপশন:</h4>
<button onclick="copyAllDataForSubmission('${btoa(JSON.stringify(data))}')" class="btn btn-success" style="margin: 5px;">সব তথ্য কপি করুন</button>
<button onclick="emailSubmission('${btoa(JSON.stringify(data))}')" class="btn" style="margin: 5px;">ইমেইল করুন</button>
<button onclick="createGoogleForm()" class="btn" style="margin: 5px;">Google Form তৈরি করুন</button>
</div>
<div style="text-align: center;">
<button onclick="this.parentElement.parentElement.parentElement.remove()" class="btn btn-danger">বন্ধ করুন</button>
</div>
</div>
`;
document.body.appendChild(modal);
}
function copyAllDataForSubmission(encodedData) {
const data = JSON.parse(atob(encodedData));
const submissionText = `

একীভূত পরীক্ষা ব্যবস্থাপনা সিস্টেম - ডেটা জমা

কক্ষের তথ্য:
${data.roomInfo}

বিদ্যালয়ের বিস্তারিত তথ্য:
${data.schools}

সিট প্ল্যান:
${data.seatPlan}

জমা দেওয়ার সময়:
${data.timestamp}

===========================================
এই তথ্য Google Sheets এর Data_Input শিটের D10 সেলে পেস্ট করুন।
`;

 navigator.clipboard.writeText(submissionText).then(() => {
alert('সম্পূর্ণ তথ্য কপি করা হয়েছে! এখন Google Sheets এ পেস্ট করুন।');
}).catch(() => {
const textArea = document.createElement('textarea');
textArea.value = submissionText;
document.body.appendChild(textArea);
textArea.select();
document.execCommand('copy');
document.body.removeChild(textArea);
alert('সম্পূর্ণ তথ্য কপি করা হয়েছে!');
});
}
function emailSubmission(encodedData) {
const data = JSON.parse(atob(encodedData));
const subject = `পরীক্ষা কক্ষের তথ্য - ${data.roomInfo.split(' - ')[0]}`;
const body = `একীভূত পরীক্ষা ব্যবস্থাপনা সিস্টেম - ডেটা জমা

কক্ষের তথ্য:
${data.roomInfo}

বিদ্যালয়ের তথ্য:
${data.schools}

সিট প্ল্যান: ${data.seatPlan}
জমা দেওয়ার সময়: ${data.timestamp}`;

 const mailtoLink = `mailto:?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;
window.open(mailtoLink);
}
function createGoogleForm() {
alert(`Google Form তৈরি করতে:
  1. https://forms.google.com এ যান

  2. নতুন ফর্ম তৈরি করুন

  3. এই ফিল্ডগুলো যোগ করুন:

    • কক্ষের তথ্য (Short answer)
    • বিদ্যালয়ের তথ্য (Paragraph)
    • সিট প্ল্যান স্ট্যাটাস (Short answer)
    • জমা দেওয়ার সময় (Short answer)
  4. Form responses কে আপনার Google Sheets এর সাথে connect করুন

  5. Form এর ID দিয়ে কোডে আপডেট করুন`);
    }

     function copyRoomInfoForD10() {
    const roomSelect = document.getElementById('roomSelect').value;
    const department = document.getElementById('departmentSelect').value;
    const building = document.getElementById('buildingSelect').value;
    const floor = document.getElementById('floorSelect').value;
    // Get total students count
    let totalStudents = 0;
    document.querySelectorAll('#schoolForms .form-row').forEach(row => {
    const school = row.querySelector('.school-select').value;
    const start = parseInt(row.querySelector('.start-roll').value) || 0;
    const end = parseInt(row.querySelector('.end-roll').value) || 0;
    if (school && start > 0 && end >= start) {
    totalStudents += end - start + 1;
    }
    });
    // Format room info for D10 cell
    const roomNumber = roomSelect.split('-')[0];
    const roomType = roomSelect.split('-')[1];
    const roomTypeInBangla = roomType === 'boys' ? 'বালক' : roomType === 'girls' ? 'বালিকা' : 'বালক ও বালিকা';
    const roomInfo = `কক্ষ ${roomNumber} (${roomTypeInBangla}) - ${department} - ${building} - ${floor} - ${totalStudents} জন`;
    // Copy to clipboard
    navigator.clipboard.writeText(roomInfo).then(() => {
    alert('কক্ষের তথ্য কপি করা হয়েছে! এখন Google Sheets এর Data_Input শিটে গিয়ে D10 সেলে পেস্ট করুন।');
    }).catch(() => {
    // Fallback for older browsers
    const textArea = document.createElement('textarea');
    textArea.value = roomInfo;
    document.body.appendChild(textArea);
    textArea.select();
    document.execCommand('copy');
    document.body.removeChild(textArea);
    alert('কক্ষের তথ্য কপি করা হয়েছে! এখন Google Sheets এর Data_Input শিটে গিয়ে D10 সেলে পেস্ট করুন।');
    });
    }
    function openGoogleSheets() {
    window.open('https://docs.google.com/spreadsheets/d/1rms0WqhePNopnWLLo5dbrJpoY92zVQh_0Q4Nycn5XWA/edit?usp=sharing', '_blank');
    }
    function copyData() {
    if (!seatPlanData) {
    alert('প্রথমে সিট প্ল্যান তৈরি করুন!');
    return;
    }
    const allColumns = ['C', 'D', 'F', 'G', 'I', 'J'];
    const maxRows = Math.max(...seatPlanData.map(col => col.rolls.length));
    // Create tab-separated text for easy pasting into Google Sheets
    let textContent = '';
    // Header row textContent += 'Row\tকলাম C\tকলাম D\tকলাম F\tকলাম G\tকলাম I\tকলাম J\n';
    // Row 24 with headers
    textContent += '24\tকলাম C\tকলাম D\tকলাম F\tকলাম G\tকলাম I\tকলাম J\n';
    // Data rows
    for (let row = 0; row < maxRows; row++) {
    const rowData = [25 + row];
    allColumns.forEach(col => {
    const colData = seatPlanData.find(c => c.column === col);
    const value = colData && row < colData.rolls.length ? colData.rolls[row] : '';
    rowData.push(value);
    });
    textContent += rowData.join('\t') + '\n';
    }
    navigator.clipboard.writeText(textContent).then(() => {
    alert('সিট প্ল্যান কপি করা হয়েছে! Google Sheets এ পেস্ট করুন।');
    }).catch(() => {
    // Fallback for older browsers
    const textArea = document.createElement('textarea');
    textArea.value = textContent;
    document.body.appendChild(textArea);
    textArea.select();
    document.execCommand('copy');
    document.body.removeChild(textArea);
    alert('সিট প্ল্যান কপি করা হয়েছে!');
    });
    }
    function showAlert(message, type) {
    const alertDiv = document.getElementById(type + 'Alert');
    alertDiv.textContent = message;
    alertDiv.style.display = 'block';
    setTimeout(() => {
    alertDiv.style.display = 'none';
    }, 3000);
    }
    
    </script>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions