ساخت یک سیستم صورتحساب ساده با 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 ایجاد کردیم که شامل مراحل ایجاد فرم، ذخیره‌سازی و نمایش صورتحساب بود. این پروژه می‌تواند به عنوان پایه‌ای برای ساخت نرم‌افزارهای مالی پیشرفته‌تر مورد استفاده قرار گیرد.