99 lines
3.5 KiB
PHP
99 lines
3.5 KiB
PHP
<?php
|
|
require_once 'db/config.php';
|
|
|
|
function get_journal_entries() {
|
|
$db = db();
|
|
$stmt = $db->query("SELECT j.*, SUM(e.debit) as total_debit, SUM(e.credit) as total_credit
|
|
FROM accounting_journal j
|
|
LEFT JOIN accounting_entries e ON j.id = e.journal_id
|
|
GROUP BY j.id ORDER BY j.date DESC");
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
function get_full_ledger() {
|
|
$db = db();
|
|
$stmt = $db->query("SELECT j.date, j.description, j.reference, e.account_name, e.debit, e.credit
|
|
FROM accounting_journal j
|
|
JOIN accounting_entries e ON j.id = e.journal_id
|
|
ORDER BY j.date DESC, j.id DESC");
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
function get_full_ledger_filtered($search = '', $date_from = '', $date_to = '') {
|
|
$db = db();
|
|
$sql = "SELECT j.date, j.description, j.reference, e.account_name, e.debit, e.credit
|
|
FROM accounting_journal j
|
|
JOIN accounting_entries e ON j.id = e.journal_id
|
|
WHERE 1=1";
|
|
$params = [];
|
|
|
|
if ($search) {
|
|
$sql .= " AND (j.description LIKE ? OR j.reference LIKE ? OR e.account_name LIKE ?)";
|
|
$params[] = "%$search%";
|
|
$params[] = "%$search%";
|
|
$params[] = "%$search%";
|
|
}
|
|
if ($date_from) {
|
|
$sql .= " AND j.date >= ?";
|
|
$params[] = $date_from;
|
|
}
|
|
if ($date_to) {
|
|
$sql .= " AND j.date <= ?";
|
|
$params[] = $date_to;
|
|
}
|
|
|
|
$sql .= " ORDER BY j.date DESC, j.id DESC";
|
|
|
|
$stmt = $db->prepare($sql);
|
|
$stmt->execute($params);
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
function get_trial_balance() {
|
|
$db = db();
|
|
$stmt = $db->query("SELECT account_name, SUM(debit) as total_debit, SUM(credit) as total_credit
|
|
FROM accounting_entries
|
|
GROUP BY account_name");
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
function get_balance_sheet() {
|
|
$db = db();
|
|
$stmt = $db->query("SELECT a.name, a.type, SUM(e.debit - e.credit) as balance
|
|
FROM accounting_accounts a
|
|
LEFT JOIN accounting_entries e ON a.name = e.account_name
|
|
GROUP BY a.name, a.type");
|
|
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
$sheet = ['أصول' => 0, 'خصوم' => 0, 'حقوق ملكية' => 0, 'إيرادات' => 0, 'مصروفات' => 0];
|
|
foreach($data as $row) {
|
|
if (isset($sheet[$row['type']])) {
|
|
$sheet[$row['type']] += $row['balance'];
|
|
}
|
|
}
|
|
return $sheet;
|
|
}
|
|
|
|
function get_all_accounts() {
|
|
return db()->query("SELECT * FROM accounting_accounts ORDER BY type, name")->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
function add_journal_entry($date, $description, $reference, $entries) {
|
|
$db = db();
|
|
$db->beginTransaction();
|
|
try {
|
|
$stmt = $db->prepare("INSERT INTO accounting_journal (date, description, reference) VALUES (?, ?, ?)");
|
|
$stmt->execute([$date, $description, $reference]);
|
|
$journal_id = $db->lastInsertId();
|
|
|
|
$stmt = $db->prepare("INSERT INTO accounting_entries (journal_id, account_name, debit, credit) VALUES (?, ?, ?, ?)");
|
|
foreach ($entries as $entry) {
|
|
$stmt->execute([$journal_id, $entry['account'], $entry['debit'], $entry['credit']]);
|
|
}
|
|
$db->commit();
|
|
return true;
|
|
} catch (Exception $e) {
|
|
$db->rollBack();
|
|
return false;
|
|
}
|
|
}
|
|
?>
|