115 lines
3.7 KiB
PHP
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);
|
|
}
|
|
}
|