Files
erp_naurua/modules/erp/kontakte/service.php
T

106 lines
4.0 KiB
PHP

<?php
declare(strict_types=1);
function payload_first_non_empty(array $data, array $keys, string $default = ''): string
{
foreach ($keys as $key) {
$value = trim((string) ($data[$key] ?? ''));
if ($value !== '') {
return $value;
}
}
return $default;
}
function find_or_create_party(PDO $pdo, array $data): int
{
$email = payload_first_non_empty($data, ['E-Mail', 'email', 'EmailKunde']);
if ($email !== '') {
$stmt = $pdo->prepare('SELECT id FROM party WHERE email = :email LIMIT 1');
$stmt->execute([':email' => $email]);
$existing = $stmt->fetchColumn();
if ($existing !== false) {
return (int) $existing;
}
}
$name = trim(
payload_first_non_empty($data, ['Vorname', 'firstName', 'Vorname_RgAdr', 'Vorname_LfAdr']) . ' ' .
payload_first_non_empty($data, ['Nachname', 'lastName', 'Nachname_RgAdr', 'Nachname_LfAdr'])
);
$name = trim($name);
if ($name === '') {
$name = payload_first_non_empty($data, ['Firmenname', 'company']);
}
if ($name === '') {
$name = 'Unbekannter Kontakt';
}
$stmt = $pdo->prepare(
"INSERT INTO party (type, name, email, status, created_at, updated_at)
VALUES ('customer', :name, :email, 'active', NOW(), NOW())
RETURNING id"
);
$stmt->execute([
':name' => $name,
':email' => $email !== '' ? $email : null,
]);
$id = $stmt->fetchColumn();
if ($id === false) {
throw new RuntimeException('Could not create party');
}
return (int) $id;
}
function upsert_addresses(PDO $pdo, int $partyId, array $data): void
{
$addressData = [
'billing' => [
'first_name' => payload_first_non_empty($data, ['Vorname', 'firstName', 'Vorname_RgAdr']),
'last_name' => payload_first_non_empty($data, ['Nachname', 'lastName', 'Nachname_RgAdr']),
'street' => payload_first_non_empty($data, ['Strasse', 'street', 'Strasse_RgAdr']),
'house_number' => payload_first_non_empty($data, ['Hausnummer', 'houseNumber', 'Hausnummer_RgAdr']),
'zip' => payload_first_non_empty($data, ['PLZ', 'zip', 'PLZ_RgAdr']),
'city' => payload_first_non_empty($data, ['Ort', 'city', 'Stadt_RgAdr']),
'country_name' => payload_first_non_empty($data, ['Land', 'country', 'Land_RgAdr'], 'Switzerland'),
],
'shipping' => [
'first_name' => payload_first_non_empty($data, ['Vorname_LfAdr']),
'last_name' => payload_first_non_empty($data, ['Nachname_LfAdr']),
'street' => payload_first_non_empty($data, ['Strasse_LfAdr']),
'house_number' => payload_first_non_empty($data, ['Hausnummer_LfAdr']),
'zip' => payload_first_non_empty($data, ['PLZ_LfAdr']),
'city' => payload_first_non_empty($data, ['Stadt_LfAdr', 'Ort_LfAdr']),
'country_name' => payload_first_non_empty($data, ['Land_LfAdr'], 'Switzerland'),
],
];
foreach ($addressData as $type => $address) {
if ($address['street'] === '' && $address['city'] === '' && $address['zip'] === '') {
continue;
}
$stmt = $pdo->prepare(
"INSERT INTO address (
party_id, type, first_name, last_name, street, house_number, zip, city, country_name, created_at, updated_at
) VALUES (
:party_id, :type, :first_name, :last_name, :street, :house_number, :zip, :city, :country_name, NOW(), NOW()
)"
);
$stmt->execute([
':party_id' => $partyId,
':type' => $type,
':first_name' => $address['first_name'],
':last_name' => $address['last_name'],
':street' => $address['street'],
':house_number' => $address['house_number'],
':zip' => $address['zip'],
':city' => $address['city'],
':country_name' => $address['country_name'] !== '' ? $address['country_name'] : 'Switzerland',
]);
}
}