- 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.
167 lines
6.9 KiB
PHP
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',
|
|
];
|
|
}
|
|
}
|