Spaces:
Running
Running
| // Version: v5 | |
| const invoiceDateInput = document.getElementById('invoiceDate'); | |
| const invoiceNumberInput = document.getElementById('invoiceNumber'); | |
| const courseTopicSelect = document.getElementById('courseTopicSelect'); // New dropdown | |
| const displayInvoiceDate = document.getElementById('displayInvoiceDate'); | |
| const displayTopic = document.getElementById('displayTopic'); | |
| const displayInvoiceNo = document.getElementById('displayInvoiceNo'); | |
| const displayBaseAmount = document.getElementById('displayBaseAmount'); | |
| const subTotalSpan = document.getElementById('subTotal'); | |
| const cgstAmountSpan = document.getElementById('cgstAmount'); | |
| const sgstAmountSpan = document.getElementById('sgstAmount'); | |
| const igstAmountSpan = document.getElementById('igstAmount'); | |
| const totalAmountSpan = document.getElementById('totalAmount'); | |
| const amountInWordsSpan = document.getElementById('amountInWords'); | |
| const taxableValueSpan = document.getElementById('taxableValue'); | |
| const centralTaxSpan = document.getElementById('centralTax'); | |
| const stateTaxSpan = document.getElementById('stateTax'); | |
| const interstateTaxSpan = document.getElementById('interstateTax'); | |
| const totalTaxableValueSpan = document.getElementById('totalTaxableValue'); | |
| const totalCentralTaxSpan = document.getElementById('totalCentralTax'); | |
| const totalStateTaxSpan = document.getElementById('totalStateTax'); | |
| const totalInterstateTaxSpan = document.getElementById('totalInterstateTax'); | |
| const taxAmountInWordsSpan = document.getElementById('taxAmountInWords'); | |
| function populateTopicsDropdown() { | |
| const courseTopicSelect = document.getElementById('courseTopicSelect'); | |
| // Check if msftCourseTopics exists (for MSFT invoice) | |
| const topicsData = typeof msftCourseTopics !== 'undefined' ? msftCourseTopics : courseTopics; | |
| if (!topicsData) { | |
| console.error('No course topics data found'); | |
| return; | |
| } | |
| topicsData.forEach(category => { | |
| const optgroup = document.createElement('optgroup'); | |
| optgroup.label = category.category; | |
| category.topics.forEach(topic => { | |
| const option = document.createElement('option'); | |
| option.value = topic.amount; // Store the amount in the value | |
| option.textContent = topic.name; // Display the topic name | |
| optgroup.appendChild(option); | |
| }); | |
| courseTopicSelect.appendChild(optgroup); | |
| }); | |
| } | |
| function convertNumberToWords(num) { | |
| const a = ['', 'one ', 'two ', 'three ', 'four ', 'five ', 'six ', 'seven ', 'eight ', 'nine ', 'ten ', 'eleven ', 'twelve ', 'thirteen ', 'fourteen ', 'fifteen ', 'sixteen ', 'seventeen ', 'eighteen ', 'nineteen ']; | |
| const b = ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']; | |
| if ((num = num.toString()).length > 9) return 'overflow'; | |
| const n = ('000000000' + num).substr(-9).match(/^(\d{2})(\d{2})(\d{2})(\d{1})(\d{2})$/); | |
| if (!n) return 'Zero'; | |
| let str = ''; | |
| str += (n[1] != 0) ? (a[Number(n[1])] || b[n[1][0]] + ' ' + a[n[1][1]]) + 'crore ' : ''; | |
| str += (n[2] != 0) ? (a[Number(n[2])] || b[n[2][0]] + ' ' + a[n[2][1]]) + 'lakh ' : ''; | |
| str += (n[3] != 0) ? (a[Number(n[3])] || b[n[3][0]] + ' ' + a[n[3][1]]) + 'thousand ' : ''; | |
| str += (n[4] != 0) ? (a[Number(n[4])] || b[n[4][0]] + ' ' + a[n[4][1]]) + 'hundred ' : ''; | |
| str += (n[5] != 0) ? ((str != '') ? 'and ' : '') + (a[Number(n[5])] || b[n[5][0]] + ' ' + a[n[5][1]]) : ''; | |
| return str.trim().charAt(0).toUpperCase() + str.trim().slice(1) + ' Rupees Only'; | |
| } | |
| function generateInvoiceNumber() { | |
| const date = new Date(); | |
| const month = String(date.getMonth() + 1).padStart(2, '0'); // Get month (0-11) + 1, pad with 0 | |
| const year = date.getFullYear(); | |
| const prefix = "INV"; // Example prefix, can be customized | |
| return `${prefix}/${month}/${year}`; | |
| } | |
| function updateInvoice() { | |
| // Get selected values | |
| const selectedDate = invoiceDateInput.value; | |
| const seq = invoiceNumberInput.value; | |
| // Get selected topic name and its associated amount | |
| const selectedOption = courseTopicSelect.options[courseTopicSelect.selectedIndex]; | |
| const selectedTopic = selectedOption ? selectedOption.textContent : 'INV_TOPIC'; | |
| const baseAmount = parseFloat(selectedOption ? selectedOption.value : 0) || 0; | |
| // Generate full invoice number | |
| let fullInvoiceNo = 'INV_NUMBER'; | |
| if (selectedDate && seq) { | |
| const date = new Date(selectedDate); | |
| const month = String(date.getMonth() + 1).padStart(2, '0'); | |
| const year = date.getFullYear(); | |
| fullInvoiceNo = `${seq}/${month}/${year}`; | |
| } | |
| // Update display elements | |
| displayInvoiceDate.textContent = selectedDate ? new Date(selectedDate).toLocaleDateString('en-GB') : 'INV_DATE'; | |
| displayTopic.textContent = 'Education Services : ' + selectedTopic; | |
| displayInvoiceNo.textContent = fullInvoiceNo; | |
| displayBaseAmount.textContent = baseAmount.toFixed(2); | |
| // --- Calculations for GST at 18% --- | |
| const gstRate = 0.18; | |
| const igstAmount = baseAmount * gstRate; // Full 18% IGST for interstate supply | |
| // Set CGST and SGST to 0 for IGST calculation | |
| const cgstAmount = 0; | |
| const sgstAmount = 0; | |
| const totalAmount = baseAmount + igstAmount; | |
| const taxAmount = igstAmount; | |
| // Update total amounts | |
| subTotalSpan.textContent = baseAmount.toFixed(2); | |
| cgstAmountSpan.textContent = cgstAmount.toFixed(2); | |
| sgstAmountSpan.textContent = sgstAmount.toFixed(2); | |
| igstAmountSpan.textContent = igstAmount.toFixed(2); | |
| totalAmountSpan.textContent = totalAmount.toFixed(2); | |
| amountInWordsSpan.textContent = convertNumberToWords(totalAmount.toFixed(0)); // Convert to integer for words | |
| // Update tax summary table | |
| taxableValueSpan.textContent = baseAmount.toFixed(2); | |
| centralTaxSpan.textContent = cgstAmount.toFixed(2); | |
| stateTaxSpan.textContent = sgstAmount.toFixed(2); | |
| interstateTaxSpan.textContent = igstAmount.toFixed(2); | |
| totalTaxableValueSpan.textContent = baseAmount.toFixed(2); | |
| totalCentralTaxSpan.textContent = cgstAmount.toFixed(2); | |
| totalStateTaxSpan.textContent = sgstAmount.toFixed(2); | |
| totalInterstateTaxSpan.textContent = igstAmount.toFixed(2); | |
| taxAmountInWordsSpan.textContent = convertNumberToWords(taxAmount.toFixed(0)); | |
| } | |