Files
orderPRO/src/Modules/Settings/CompanySettingsRepository.php
Jacek Pyziak 2b12fde248 feat(shipments): add ShipmentProviderInterface and ShipmentProviderRegistry
- Introduced ShipmentProviderInterface to define the contract for shipment providers.
- Implemented ShipmentProviderRegistry to manage and retrieve shipment providers.
- Added a new tool for probing Apaczka order_send payload variants, enhancing debugging capabilities.
2026-03-08 23:45:10 +01:00

167 lines
6.9 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Modules\Settings;
use PDO;
use Throwable;
final class CompanySettingsRepository
{
public function __construct(
private readonly PDO $pdo
) {
}
/**
* @return array<string, mixed>
*/
public function getSettings(): array
{
try {
$statement = $this->pdo->prepare('SELECT * FROM company_settings WHERE id = 1 LIMIT 1');
$statement->execute();
$row = $statement->fetch(PDO::FETCH_ASSOC);
} catch (Throwable) {
return $this->defaults();
}
if (!is_array($row)) {
return $this->defaults();
}
return [
'company_name' => trim((string) ($row['company_name'] ?? '')),
'person_name' => trim((string) ($row['person_name'] ?? '')),
'sender_contact_person' => trim((string) ($row['sender_contact_person'] ?? '')),
'street' => trim((string) ($row['street'] ?? '')),
'city' => trim((string) ($row['city'] ?? '')),
'postal_code' => trim((string) ($row['postal_code'] ?? '')),
'country_code' => trim((string) ($row['country_code'] ?? 'PL')),
'phone' => trim((string) ($row['phone'] ?? '')),
'email' => trim((string) ($row['email'] ?? '')),
'tax_number' => trim((string) ($row['tax_number'] ?? '')),
'bank_account' => trim((string) ($row['bank_account'] ?? '')),
'bank_owner_name' => trim((string) ($row['bank_owner_name'] ?? '')),
'default_package_length_cm' => (float) ($row['default_package_length_cm'] ?? 25.0),
'default_package_width_cm' => (float) ($row['default_package_width_cm'] ?? 20.0),
'default_package_height_cm' => (float) ($row['default_package_height_cm'] ?? 8.0),
'default_package_weight_kg' => (float) ($row['default_package_weight_kg'] ?? 1.0),
'default_label_format' => trim((string) ($row['default_label_format'] ?? 'PDF')),
];
}
/**
* @param array<string, mixed> $data
*/
public function saveSettings(array $data): void
{
$this->ensureRow();
$statement = $this->pdo->prepare(
'UPDATE company_settings SET
company_name = :company_name,
person_name = :person_name,
sender_contact_person = :sender_contact_person,
street = :street,
city = :city,
postal_code = :postal_code,
country_code = :country_code,
phone = :phone,
email = :email,
tax_number = :tax_number,
bank_account = :bank_account,
bank_owner_name = :bank_owner_name,
default_package_length_cm = :length,
default_package_width_cm = :width,
default_package_height_cm = :height,
default_package_weight_kg = :weight,
default_label_format = :label_format,
updated_at = NOW()
WHERE id = 1'
);
$statement->execute([
'company_name' => $this->nullableString((string) ($data['company_name'] ?? '')),
'person_name' => $this->nullableString((string) ($data['person_name'] ?? '')),
'sender_contact_person' => $this->nullableString((string) ($data['sender_contact_person'] ?? '')),
'street' => $this->nullableString((string) ($data['street'] ?? '')),
'city' => $this->nullableString((string) ($data['city'] ?? '')),
'postal_code' => $this->nullableString((string) ($data['postal_code'] ?? '')),
'country_code' => strtoupper(trim((string) ($data['country_code'] ?? 'PL'))) ?: 'PL',
'phone' => $this->nullableString((string) ($data['phone'] ?? '')),
'email' => $this->nullableString((string) ($data['email'] ?? '')),
'tax_number' => $this->nullableString((string) ($data['tax_number'] ?? '')),
'bank_account' => $this->nullableString((string) ($data['bank_account'] ?? '')),
'bank_owner_name' => $this->nullableString((string) ($data['bank_owner_name'] ?? '')),
'length' => max(0.1, (float) ($data['default_package_length_cm'] ?? 25.0)),
'width' => max(0.1, (float) ($data['default_package_width_cm'] ?? 20.0)),
'height' => max(0.1, (float) ($data['default_package_height_cm'] ?? 8.0)),
'weight' => max(0.001, (float) ($data['default_package_weight_kg'] ?? 1.0)),
'label_format' => in_array(strtoupper(trim((string) ($data['default_label_format'] ?? ''))), ['PDF', 'ZPL'], true)
? strtoupper(trim((string) $data['default_label_format']))
: 'PDF',
]);
}
/**
* @return array<string, mixed>
*/
public function getSenderAddress(): array
{
$settings = $this->getSettings();
return [
'name' => $settings['person_name'] !== '' ? $settings['person_name'] : ($settings['company_name'] !== '' ? $settings['company_name'] : null),
'contactPerson' => $settings['sender_contact_person'] !== ''
? $settings['sender_contact_person']
: ($settings['person_name'] !== '' ? $settings['person_name'] : null),
'company' => $settings['company_name'] !== '' ? $settings['company_name'] : null,
'street' => $settings['street'] !== '' ? $settings['street'] : null,
'city' => $settings['city'] !== '' ? $settings['city'] : null,
'postalCode' => $settings['postal_code'] !== '' ? $settings['postal_code'] : null,
'countryCode' => $settings['country_code'] !== '' ? $settings['country_code'] : 'PL',
'phone' => $settings['phone'] !== '' ? $settings['phone'] : null,
'email' => $settings['email'] !== '' ? $settings['email'] : null,
];
}
private function ensureRow(): void
{
$this->pdo->exec(
'INSERT INTO company_settings (id) VALUES (1) ON DUPLICATE KEY UPDATE updated_at = updated_at'
);
}
private function nullableString(string $value): ?string
{
$trimmed = trim($value);
return $trimmed === '' ? null : $trimmed;
}
/**
* @return array<string, mixed>
*/
private function defaults(): array
{
return [
'company_name' => '',
'person_name' => '',
'sender_contact_person' => '',
'street' => '',
'city' => '',
'postal_code' => '',
'country_code' => 'PL',
'phone' => '',
'email' => '',
'tax_number' => '',
'bank_account' => '',
'bank_owner_name' => '',
'default_package_length_cm' => 25.0,
'default_package_width_cm' => 20.0,
'default_package_height_cm' => 8.0,
'default_package_weight_kg' => 1.0,
'default_label_format' => 'PDF',
];
}
}