Skip to content

 #166

@semskgcphs-afk

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions