ساخت یک سیستم صورتحساب ساده با PHP
مقدمه
در دنیای تجارت امروزی، مدیریت صورتحسابها و فاکتورها یکی از نیازهای اساسی کسبوکارها است. در این مقاله، نحوه ایجاد یک سیستم صورتحساب ساده با استفاده از PHP و MySQL را بررسی خواهیم کرد. این سیستم امکان ایجاد، ذخیره و نمایش صورتحسابها را فراهم میکند.
پیشنیازها
- نصب XAMPP یا WAMP (شامل Apache, PHP, MySQL)
- دانش پایه از HTML و PHP
- ویرایشگر کد مانند VS Code یا PHPStorm
گام ۱: راهاندازی پایگاه داده
ابتدا یک پایگاه داده MySQL با نام billing_system
ایجاد میکنیم:
CREATE DATABASE billing_system;
USE billing_system;
CREATE TABLE invoices (
id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(255) NOT NULL,
invoice_date DATE NOT NULL,
due_date DATE NOT NULL,
amount DECIMAL(10,2) NOT NULL,
tax DECIMAL(10,2) DEFAULT 0,
discount DECIMAL(10,2) DEFAULT 0,
total_amount DECIMAL(10,2) NOT NULL,
status ENUM('پرداخت شده', 'در انتظار پرداخت', 'لغو شده') DEFAULT 'در انتظار پرداخت',
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE invoice_items (
id INT AUTO_INCREMENT PRIMARY KEY,
invoice_id INT NOT NULL,
item_name VARCHAR(255) NOT NULL,
quantity INT NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
total_price DECIMAL(10,2) NOT NULL,
FOREIGN KEY (invoice_id) REFERENCES invoices(id) ON DELETE CASCADE
);
گام ۲: ایجاد فرم صورتحساب
در این گام یک فرم HTML ایجاد میکنیم تا اطلاعات صورتحساب را از کاربر دریافت کنیم. این فرم در فایلی به نام create_invoice.php
قرار دارد.
(کد کامل HTML و JavaScript در پیام قبلی ارائه شده است. در صورت نیاز مجدد ارسال میشود.)
گام ۳: ذخیره صورتحساب در پایگاه داده
زمانی که فرم ارسال میشود، اطلاعات آن توسط فایل save_invoice.php
پردازش و ذخیره میشود. این فایل شامل کدی است که فاکتور اصلی و آیتمهای آن را در جدولهای invoices
و invoice_items
ذخیره میکند.
<?php
// اتصال به پایگاه داده
$conn = new mysqli('localhost', 'root', '', 'billing_system');
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$conn->set_charset("utf8");
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$customer_name = $conn->real_escape_string($_POST['customer_name']);
$invoice_date = $conn->real_escape_string($_POST['invoice_date']);
$due_date = $conn->real_escape_string($_POST['due_date']);
$tax = floatval($_POST['tax']);
$discount = floatval($_POST['discount']);
$description = $conn->real_escape_string($_POST['description']);
```
$subtotal = 0;
foreach ($_POST['item_name'] as $index => $item_name) {
$quantity = floatval($_POST['quantity'][$index]);
$unit_price = floatval($_POST['unit_price'][$index]);
$subtotal += $quantity * $unit_price;
}
$tax_amount = $subtotal * $tax / 100;
$total_amount = $subtotal + $tax_amount - $discount;
$stmt = $conn->prepare("INSERT INTO invoices(customer_name, invoice_date, due_date, amount, tax, discount, total_amount, description) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("sssdddds", $customer_name, $invoice_date, $due_date, $subtotal, $tax_amount, $discount, $total_amount, $description);
if ($stmt->execute()) {
$invoice_id = $stmt->insert_id;
$item_stmt = $conn->prepare("INSERT INTO invoice_items (invoice_id, item_name, quantity, unit_price, total_price) VALUES (?, ?, ?, ?, ?)");
foreach ($_POST['item_name'] as $index => $item_name) {
$item_name = $conn->real_escape_string($item_name);
$quantity = floatval($_POST['quantity'][$index]);
$unit_price = floatval($_POST['unit_price'][$index]);
$total_price = $quantity * $unit_price;
$item_stmt->bind_param("isidd", $invoice_id, $item_name, $quantity, $unit_price, $total_price);
$item_stmt->execute();
}
$item_stmt->close();
header("Location: view_invoice.php?id=" . $invoice_id);
exit();
} else {
echo "خطا در ذخیره صورتحساب: " . $conn->error;
}
$stmt->close();
```
}
$conn->close();
?>
گام ۴: نمایش صورتحساب
در فایل view_invoice.php
، اطلاعات صورتحساب را بر اساس invoice_id
بازیابی و نمایش میدهیم.
<?php
$conn = new mysqli('localhost', 'root', '', 'billing_system');
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$conn->set_charset("utf8");
$id = intval($_GET['id']);
$invoice = $conn->query("SELECT * FROM invoices WHERE id = $id")->fetch_assoc();
$items = $conn->query("SELECT * FROM invoice_items WHERE invoice_id = $id");
?>
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<title>نمایش صورتحساب</title>
<style>
body { font-family: Tahoma; }
.container { width: 800px; margin: auto; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #ccc; padding: 8px; text-align: center; }
</style>
</head>
<body>
<div class="container">
<h1>صورتحساب مشتری: <?= htmlspecialchars($invoice['customer_name']) ?></h1>
<p>تاریخ: <?= $invoice['invoice_date'] ?> | سررسید: <?= $invoice['due_date'] ?></p>
<table>
<thead>
<tr>
<th>نام آیتم</th>
<th>تعداد</th>
<th>قیمت واحد</th>
<th>جمع</th>
</tr>
</thead>
<tbody>
<?php while ($row = $items->fetch_assoc()): ?>
<tr>
<td><?= htmlspecialchars($row['item_name']) ?></td>
<td><?= $row['quantity'] ?></td>
<td><?= $row['unit_price'] ?></td>
<td><?= $row['total_price'] ?></td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
<p>مالیات: <?= $invoice['tax'] ?> ریال</p>
<p>تخفیف: <?= $invoice['discount'] ?> ریال</p>
<p><strong>مبلغ نهایی: <?= $invoice['total_amount'] ?> ریال</strong></p>
<p>توضیحات: <?= nl2br(htmlspecialchars($invoice['description'])) ?></p>
</div>
</body>
</html>
نتیجهگیری
در این مقاله یک سیستم صورتحساب ساده ولی کاربردی با استفاده از PHP و MySQL ایجاد کردیم که شامل مراحل ایجاد فرم، ذخیرهسازی و نمایش صورتحساب بود. این پروژه میتواند به عنوان پایهای برای ساخت نرمافزارهای مالی پیشرفتهتر مورد استفاده قرار گیرد.