feature: Update database schema to separate payees from payments

This commit is contained in:
Keith Solomon
2025-02-09 12:02:00 -06:00
parent 2740050965
commit 62071c6645
6 changed files with 74 additions and 47 deletions

View File

@@ -18,15 +18,27 @@ try {
switch($action) {
case 'add':
$data = [
'date' => (new DateTime($_POST['date']))->format('Y-m-d'), // Normalize to YYYY-MM-DD
'billName' => $_POST['billName'],
'amount' => (float)$_POST['amount'],
'date' => (new DateTime($_POST['date']))->format('Y-m-d'),
'payeeId' => $_POST['payeeId'], // Payee ID instead of name
'amount' => (float)$_POST['amount'],
'paymentId' => $_POST['paymentId'],
'year' => (int)explode('-', $_POST['date'])[0],
'comment' => $_POST['comment']
'comment' => $_POST['comment'] ?? '',
'year' => (int)explode('-', $_POST['date'])[0]
];
$result = Bill::add($data);
$stmt = DB::connect()->prepare("
INSERT INTO bills (billDate, payeeId, amount, paymentId, comment, year)
VALUES (?, ?, ?, ?, ?, ?)
");
$result = $stmt->execute([
$data['date'],
$data['payeeId'],
$data['amount'],
$data['paymentId'],
$data['comment'],
$data['year']
]);
echo json_encode(['success' => $result]);
break;
@@ -75,17 +87,6 @@ try {
}
break;
case 'getPayees':
$stmt = DB::connect()->query("SELECT DISTINCT billName FROM bills ORDER BY billName ASC");
echo json_encode($stmt->fetchAll(PDO::FETCH_COLUMN));
break;
case 'addPayee':
$stmt = DB::connect()->prepare("INSERT INTO bills (billName) VALUES (?)");
$result = $stmt->execute([$_POST['billName']]);
echo json_encode(['success' => $result]);
break;
case 'getAll':
echo json_encode(Bill::getAll()->fetchAll(PDO::FETCH_ASSOC));
break;
@@ -97,30 +98,56 @@ try {
echo json_encode($stmt->fetch(PDO::FETCH_ASSOC));
break;
case 'getTotals':
case 'getTotals':
echo json_encode(Bill::getYearlyTotals()->fetchAll(PDO::FETCH_ASSOC));
break;
case 'getByYear':
$year = $_GET['year'] ?? date('Y');
$sort = $_GET['sort'] ?? 'date_asc'; // Default sorting
$sort = $_GET['sort'] ?? 'date_desc';
$sortOptions = [
'date_asc' => 'billDate ASC',
'date_desc' => 'billDate DESC',
'payee' => 'billName ASC, billDate ASC',
'date_asc' => 'bills.billDate ASC',
'date_desc' => 'bills.billDate DESC',
'payee' => 'payees.name ASC, bills.billDate ASC'
];
$orderBy = $sortOptions[$sort] ?? $sortOptions['date_asc'];
$stmt = DB::connect()->prepare("SELECT * FROM bills WHERE year = ? ORDER BY $orderBy");
$stmt = DB::connect()->prepare("
SELECT bills.*, payees.name AS payeeName
FROM bills
JOIN payees ON bills.payeeId = payees.id
WHERE bills.year = ?
ORDER BY $orderBy
");
$stmt->execute([$year]);
echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC));
break;
case 'addPayee':
$stmt = DB::connect()->prepare("INSERT INTO payees (name) VALUES (?)");
$result = $stmt->execute([$_POST['payeeName']]);
echo json_encode(['success' => $result]);
break;
case 'getPayees':
try {
$stmt = DB::connect()->query("SELECT id, name FROM payees ORDER BY name ASC");
$payees = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($payees);
} catch (Exception $e) {
echo json_encode(['error' => $e->getMessage()]);
}
break;
case 'getYears':
$stmt = DB::connect()->query("SELECT DISTINCT year FROM bills ORDER BY year DESC");
echo json_encode($stmt->fetchAll(PDO::FETCH_COLUMN));
try {
$stmt = DB::connect()->query("SELECT DISTINCT year FROM bills ORDER BY year DESC");
$years = $stmt->fetchAll(PDO::FETCH_COLUMN);
echo json_encode($years);
} catch (Exception $e) {
echo json_encode(['error' => $e->getMessage()]);
}
break;
default:

View File

@@ -3,15 +3,22 @@ class DB {
public static function connect() {
$db = new PDO('sqlite:'.__DIR__.'/../data/bills.db');
$db->exec("CREATE TABLE IF NOT EXISTS payees (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
createdAt TEXT DEFAULT CURRENT_TIMESTAMP
)");
$db->exec("CREATE TABLE IF NOT EXISTS bills (
id INTEGER PRIMARY KEY,
billDate TEXT NOT NULL,
billName TEXT NOT NULL,
amount REAL NOT NULL,
paymentId TEXT,
year INTEGER NOT NULL,
comment TEXT
)");
id INTEGER PRIMARY KEY AUTOINCREMENT,
billDate TEXT NOT NULL,
payeeId INTEGER NOT NULL,
amount REAL NOT NULL,
paymentId TEXT,
comment TEXT,
year INTEGER NOT NULL,
FOREIGN KEY (payeeId) REFERENCES payees(id) ON DELETE CASCADE
)");
return $db;
}