diff --git a/index.js b/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..4faedfbc8bb72a25fe5710be601357949ce62351
--- /dev/null
+++ b/index.js
@@ -0,0 +1,150 @@
+require('dotenv').config();
+const express = require('express');
+const mysql = require('mysql2/promise');
+const fs = require('fs');
+const path = require('path');
+const qr = require('qr-image');
+const promptpay = require('promptpay-qr');
+
+const app = express();
+app.use(express.json());
+app.use(express.urlencoded({ extended: true }));
+
+// Database configuration
+const pool = mysql.createPool({
+  host: process.env.DB_HOST || "10.104.22.26",
+  port: process.env.DB_PORT || "3306",
+  user: process.env.DB_USER || "root",
+  password: process.env.DB_PASSWORD || "KGIvmp55659",
+  database: process.env.DB_NAME || "qr_code",
+  waitForConnections: true,
+  connectionLimit: 10,
+  queueLimit: 0
+});
+
+// Check database connection
+async function testConnection() {
+  try {
+    const connection = await pool.getConnection();
+    await connection.ping();
+    console.log('Database connection succeeded.');
+    connection.release();
+  } catch (err) {
+    console.error('Database connection failed:', err);
+    process.exit(1);
+  }
+}
+testConnection();
+
+// Initialize database
+async function initDB() {
+  const createTableQuery = `
+    CREATE TABLE IF NOT EXISTS qr_code (
+      id INT AUTO_INCREMENT PRIMARY KEY,
+      promptpay_id VARCHAR(50) NOT NULL,
+      amount DECIMAL(10,2) NOT NULL,
+      image_path TEXT NOT NULL
+    )
+  `;
+  try {
+    await pool.query(createTableQuery);
+    console.log("Database initialized.");
+  } catch (err) {
+    console.error('Failed to create table:', err);
+  }
+}
+initDB().catch(console.error);
+
+// Serve static QR images
+const imageDir = path.join(__dirname, 'data');
+if (!fs.existsSync(imageDir)) fs.mkdirSync(imageDir);
+app.use('/qr-images', express.static(imageDir));
+
+// Main page route
+app.get('/', (req, res) => {
+  res.send(`
+    <h1>Generate PromptPay QR Code</h1>
+    <form method="POST" action="/generate">
+      <label>PromptPay ID:</label><br/>
+      <input type="text" name="promptpayId" required /><br/><br/>
+      <label>Amount:</label><br/>
+      <input type="number" name="amount" step="0.01" required /><br/><br/>
+      <button type="submit">Generate QR</button>
+    </form>
+    <br/>
+    <a href="/list">View QR List</a>
+  `);
+});
+
+// Route to generate QR code
+app.post('/generate', async (req, res) => {
+  const { promptpayId, amount } = req.body;
+  if (!promptpayId || !amount) {
+    return res.status(400).send('Missing promptpayId or amount');
+  }
+
+  try {
+    const qrData = promptpay(promptpayId, parseFloat(amount));
+    const qrPng = qr.imageSync(qrData, { type: 'png' });
+
+    const fileName = `qr_${Date.now()}.png`;
+    const savePath = path.join(imageDir, fileName);
+
+    fs.writeFileSync(savePath, qrPng);
+
+    const insertQuery = `
+      INSERT INTO qr_code (promptpay_id, amount, image_path)
+      VALUES (?, ?, ?)
+    `;
+    const [result] = await pool.execute(insertQuery, [promptpayId, amount, fileName]);
+
+    res.send(`
+      <h2>QR Generated Successfully</h2>
+      <p>ID: ${result.insertId}</p>
+      <p>PromptPay ID: ${promptpayId}</p>
+      <p>Amount: ${amount}</p>
+      <p>Image: <a href="/qr-images/${fileName}" target="_blank">View QR Code</a></p>
+      <br/>
+      <a href="/">Go Back</a> | <a href="/list">View All QR Codes</a>
+    `);
+  } catch (err) {
+    console.error('Error during QR generation:', err);
+    res.status(500).send('Internal Server Error');
+  }
+});
+
+// Route to list generated QR codes
+app.get('/list', async (req, res) => {
+  try {
+    const [rows] = await pool.query('SELECT * FROM qr_code ORDER BY id DESC');
+    let html = `<h1>List of Generated QR Codes</h1>`;
+    html += `<table border="1" cellpadding="5" cellspacing="0">
+              <tr>
+                <th>ID</th>
+                <th>PromptPay ID</th>
+                <th>Amount</th>
+                <th>QR Code Image</th>
+              </tr>`;
+
+    rows.forEach(row => {
+      html += `<tr>
+                <td>${row.id}</td>
+                <td>${row.promptpay_id}</td>
+                <td>${row.amount}</td>
+                <td><a href="/qr-images/${row.image_path}" target="_blank">View Image</a></td>
+              </tr>`;
+    });
+
+    html += `</table><br/><a href="/">Go Back</a>`;
+    res.send(html);
+  } catch (err) {
+    console.error('Error fetching QR list:', err);
+    res.status(500).send('Internal Server Error');
+  }
+});
+
+// Start the server
+const port = process.env.PORT || 3000;
+app.listen(port, () => {
+  console.log(`Server started on port ${port}`);
+});