feat(127): erli integration foundation
Phase 127 complete: - add global Erli settings schema and encrypted API key repository - add real read-only Erli API connection test and settings UI - expose Erli in integrations hub and update PAUL/docs state
This commit is contained in:
@@ -586,6 +586,7 @@ return [
|
||||
'shoppro' => 'shopPRO',
|
||||
'hostedsms' => 'HostedSMS',
|
||||
'smsplanet' => 'SMSPLANET',
|
||||
'erli' => 'Erli',
|
||||
'shoppro_instances' => ':count instancji',
|
||||
],
|
||||
'status' => [
|
||||
@@ -859,6 +860,47 @@ return [
|
||||
'test_failed' => 'Nie udalo sie wyslac testowego SMS.',
|
||||
],
|
||||
],
|
||||
'erli' => [
|
||||
'title' => 'Integracja Erli',
|
||||
'description' => 'Konfiguracja globalnego polaczenia z marketplace Erli.',
|
||||
'config' => [
|
||||
'title' => 'Konfiguracja API',
|
||||
],
|
||||
'test' => [
|
||||
'title' => 'Test polaczenia',
|
||||
'description' => 'Test wykonuje realne, bezpieczne zapytanie GET do API Erli.',
|
||||
],
|
||||
'fields' => [
|
||||
'account_label' => 'Nazwa konta',
|
||||
'api_key' => 'Klucz API',
|
||||
'options' => 'Opcje',
|
||||
'is_active' => 'Integracja aktywna',
|
||||
],
|
||||
'api_key' => [
|
||||
'saved' => 'Klucz API jest zapisany. Pozostaw pole puste, aby nie zmieniac.',
|
||||
'missing' => 'Brak zapisanego klucza API Erli.',
|
||||
],
|
||||
'hints' => [
|
||||
'account_label' => 'Opcjonalna nazwa widoczna w hubie integracji.',
|
||||
],
|
||||
'status' => [
|
||||
'secret' => 'Sekret API',
|
||||
'active' => 'Aktywna',
|
||||
'saved' => 'zapisany',
|
||||
'missing' => 'brak',
|
||||
'last_test' => 'Ostatni test',
|
||||
],
|
||||
'actions' => [
|
||||
'save' => 'Zapisz ustawienia Erli',
|
||||
'test' => 'Test polaczenia',
|
||||
],
|
||||
'flash' => [
|
||||
'saved' => 'Ustawienia Erli zostaly zapisane.',
|
||||
'save_failed' => 'Nie udalo sie zapisac ustawien Erli.',
|
||||
'test_success' => 'Polaczenie z API Erli dziala.',
|
||||
'test_failed' => 'Nie udalo sie polaczyc z API Erli.',
|
||||
],
|
||||
],
|
||||
'inpost' => [
|
||||
'title' => 'Integracja InPost',
|
||||
'description' => 'Konfiguracja polaczenia z API InPost ShipX do obslugi przesylek.',
|
||||
|
||||
95
resources/views/settings/erli.php
Normal file
95
resources/views/settings/erli.php
Normal file
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
$settings = is_array($settings ?? null) ? $settings : [];
|
||||
$accountLabel = trim((string) ($settings['account_label'] ?? ''));
|
||||
$hasApiKey = (bool) ($settings['has_api_key'] ?? false);
|
||||
$isActive = (bool) ($settings['is_active'] ?? true);
|
||||
$lastTestAt = trim((string) ($settings['last_test_at'] ?? ''));
|
||||
$lastTestStatus = trim((string) ($settings['last_test_status'] ?? ''));
|
||||
$lastTestMessage = trim((string) ($settings['last_test_message'] ?? ''));
|
||||
$lastTestHttpCode = $settings['last_test_http_code'] ?? null;
|
||||
?>
|
||||
|
||||
<section class="card">
|
||||
<h2 class="section-title"><?= $e($t('settings.erli.title')) ?></h2>
|
||||
<p class="muted mt-12"><?= $e($t('settings.erli.description')) ?></p>
|
||||
|
||||
<?php if (!empty($errorMessage)): ?>
|
||||
<div class="mt-12"><?php $type='danger'; $message=(string) $errorMessage; $dismissible=true; include dirname(__DIR__) . '/components/alert.php'; ?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($successMessage)): ?>
|
||||
<div class="mt-12"><?php $type='success'; $message=(string) $successMessage; $dismissible=true; include dirname(__DIR__) . '/components/alert.php'; ?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($testMessage)): ?>
|
||||
<div class="mt-12"><?php $type='info'; $message=(string) $testMessage; $dismissible=true; include dirname(__DIR__) . '/components/alert.php'; ?></div>
|
||||
<?php endif; ?>
|
||||
</section>
|
||||
|
||||
<section class="card mt-16">
|
||||
<h3 class="section-title"><?= $e($t('settings.erli.config.title')) ?></h3>
|
||||
|
||||
<div class="muted mt-12">
|
||||
<?= $e($t('settings.erli.status.secret')) ?>:
|
||||
<strong><?= $e($hasApiKey ? $t('settings.erli.status.saved') : $t('settings.erli.status.missing')) ?></strong>
|
||||
|
|
||||
<?= $e($t('settings.erli.status.active')) ?>:
|
||||
<strong><?= $e($isActive ? $t('settings.integrations_hub.active.yes') : $t('settings.integrations_hub.active.no')) ?></strong>
|
||||
</div>
|
||||
|
||||
<form class="statuses-form mt-16" action="/settings/integrations/erli/save" method="post" novalidate>
|
||||
<input type="hidden" name="_token" value="<?= $e($csrfToken ?? '') ?>">
|
||||
|
||||
<label class="form-field">
|
||||
<span class="field-label"><?= $e($t('settings.erli.fields.account_label')) ?></span>
|
||||
<input class="form-control" type="text" name="account_label" maxlength="128" value="<?= $e($accountLabel) ?>">
|
||||
<span class="muted"><?= $e($t('settings.erli.hints.account_label')) ?></span>
|
||||
</label>
|
||||
|
||||
<label class="form-field">
|
||||
<span class="field-label"><?= $e($t('settings.erli.fields.api_key')) ?></span>
|
||||
<input class="form-control" type="password" name="api_key" autocomplete="new-password" placeholder="<?= $hasApiKey ? '********' : '' ?>">
|
||||
<span class="muted"><?= $e($hasApiKey ? $t('settings.erli.api_key.saved') : $t('settings.erli.api_key.missing')) ?></span>
|
||||
</label>
|
||||
|
||||
<fieldset class="integration-settings-checkboxes">
|
||||
<legend class="field-label"><?= $e($t('settings.erli.fields.options')) ?></legend>
|
||||
<div class="integration-settings-checkboxes__list">
|
||||
<label class="integration-settings-checkboxes__item">
|
||||
<input type="checkbox" name="is_active" value="1"<?= $isActive ? ' checked' : '' ?>>
|
||||
<span><?= $e($t('settings.erli.fields.is_active')) ?></span>
|
||||
</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div class="form-actions mt-16">
|
||||
<button type="submit" class="btn btn--primary"><?= $e($t('settings.erli.actions.save')) ?></button>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="card mt-16">
|
||||
<h3 class="section-title"><?= $e($t('settings.erli.test.title')) ?></h3>
|
||||
<p class="muted mt-12"><?= $e($t('settings.erli.test.description')) ?></p>
|
||||
|
||||
<form class="statuses-form mt-16" action="/settings/integrations/erli/test" method="post">
|
||||
<input type="hidden" name="_token" value="<?= $e($csrfToken ?? '') ?>">
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn--secondary"><?= $e($t('settings.erli.actions.test')) ?></button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<?php if ($lastTestAt !== ''): ?>
|
||||
<div class="mt-16"><?php
|
||||
$type = $lastTestStatus === 'ok' ? 'success' : 'danger';
|
||||
$messageHtml = '<strong>' . $e($t('settings.erli.status.last_test')) . ':</strong> '
|
||||
. $e($lastTestAt)
|
||||
. ($lastTestStatus !== '' ? ' <span class="badge badge--' . ($lastTestStatus === 'ok' ? 'success' : 'muted') . '">' . $e(strtoupper($lastTestStatus)) . '</span>' : '')
|
||||
. ($lastTestHttpCode !== null ? ' <span class="badge badge--muted">HTTP ' . $e((string) $lastTestHttpCode) . '</span>' : '')
|
||||
. ($lastTestMessage !== '' ? '<div class="mt-12">' . $e($lastTestMessage) . '</div>' : '');
|
||||
$dismissible = false;
|
||||
include dirname(__DIR__) . '/components/alert.php';
|
||||
unset($messageHtml);
|
||||
?></div>
|
||||
<?php endif; ?>
|
||||
</section>
|
||||
Reference in New Issue
Block a user