Steuerkram/src/Models/Customer.php
2026-03-25 00:19:33 +01:00

115 lines
3.7 KiB
PHP

<?php
declare(strict_types=1);
namespace Steuerkram\Models;
use Steuerkram\Database;
class Customer
{
public static function all(array $filter = []): array
{
$where = ['1=1'];
$params = [];
$archived = $filter['archived'] ?? 0;
$where[] = 'archived = ?';
$params[] = (int)$archived;
if (!empty($filter['search'])) {
$where[] = '(kundennummer LIKE ? OR firma LIKE ? OR nachname LIKE ? OR email LIKE ?)';
$s = '%' . $filter['search'] . '%';
$params = array_merge($params, [$s, $s, $s, $s]);
}
return Database::fetchAll(
'SELECT * FROM customers WHERE ' . implode(' AND ', $where) . ' ORDER BY kundennummer',
$params
);
}
public static function find(int $id): array|false
{
return Database::fetchOne('SELECT * FROM customers WHERE id = ?', [$id]);
}
public static function create(array $data): int
{
$nr = self::generateKundennummer();
Database::execute(
'INSERT INTO customers (kundennummer, firma, anrede, vorname, nachname, strasse, plz, ort, land,
email, telefon, ust_id, steuernummer, payment_days, notes)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
[
$data['kundennummer'] ?? $nr,
$data['firma'] ?? null,
$data['anrede'] ?? null,
$data['vorname'] ?? null,
$data['nachname'],
$data['strasse'],
$data['plz'],
$data['ort'],
$data['land'] ?? 'DE',
$data['email'] ?? null,
$data['telefon'] ?? null,
$data['ust_id'] ?? null,
$data['steuernummer'] ?? null,
(int)($data['payment_days'] ?? 14),
$data['notes'] ?? null,
]
);
return (int)Database::lastInsertId();
}
public static function update(int $id, array $data): void
{
Database::execute(
'UPDATE customers SET firma=?, anrede=?, vorname=?, nachname=?, strasse=?, plz=?, ort=?, land=?,
email=?, telefon=?, ust_id=?, steuernummer=?, payment_days=?, notes=?, updated_at=NOW()
WHERE id=?',
[
$data['firma'] ?? null,
$data['anrede'] ?? null,
$data['vorname'] ?? null,
$data['nachname'],
$data['strasse'],
$data['plz'],
$data['ort'],
$data['land'] ?? 'DE',
$data['email'] ?? null,
$data['telefon'] ?? null,
$data['ust_id'] ?? null,
$data['steuernummer'] ?? null,
(int)($data['payment_days'] ?? 14),
$data['notes'] ?? null,
$id,
]
);
}
public static function archive(int $id): void
{
Database::execute('UPDATE customers SET archived=1, updated_at=NOW() WHERE id=?', [$id]);
}
public static function displayName(array $customer): string
{
if (!empty($customer['firma'])) {
return $customer['firma'];
}
$parts = array_filter([
$customer['anrede'] ?? null,
$customer['vorname'] ?? null,
$customer['nachname'],
]);
return implode(' ', $parts);
}
public static function generateKundennummer(): string
{
$result = Database::fetchOne('SELECT MAX(CAST(SUBSTRING(kundennummer, 3) AS UNSIGNED)) as max_nr FROM customers WHERE kundennummer REGEXP \'^KD[0-9]+$\'');
$next = (int)($result['max_nr'] ?? 0) + 1;
return sprintf('KD%04d', $next);
}
}