feat(130): erli shipments and labels

This commit is contained in:
2026-05-16 00:58:14 +02:00
parent 4258751e80
commit 13f570e5af
21 changed files with 1451 additions and 58 deletions

View File

@@ -867,6 +867,7 @@ return [
'label' => 'Zakladki integracji Erli',
'integration' => 'Integracja',
'statuses' => 'Statusy',
'delivery' => 'Dostawy',
'settings' => 'Ustawienia',
],
'config' => [
@@ -925,6 +926,29 @@ return [
'save_failed' => 'Nie udalo sie zapisac mapowan statusow Erli.',
],
],
'delivery' => [
'title' => 'Mapowanie dostaw Erli',
'description' => 'Przypisz metody dostawy z zamowien Erli do lokalnych providerow etykiet oraz vendora Erli uzywanego przy rejestracji paczki zewnetrznej.',
'metadata_not_connected' => 'Zapisz aktywna konfiguracje Erli, aby pobrac slowniki dostaw i vendorow.',
'empty_methods' => 'Brak metod dostawy Erli z zaimportowanych zamowien.',
'shipping_methods_title' => 'Slownik metod wysylki Erli',
'fields' => [
'order_method' => 'Metoda z zamowienia',
'erli_vendor' => 'Vendor Erli',
'provider_service' => 'Lokalna usluga etykiety',
'no_vendor' => '-- wybierz vendora --',
'no_provider' => '-- nie generuj etykiety --',
'shipping_method' => 'Metoda Erli',
'shipping_vendor' => 'Vendor',
],
'actions' => [
'save' => 'Zapisz mapowanie dostaw',
],
'flash' => [
'saved' => 'Mapowanie dostaw Erli zostalo zapisane.',
'save_failed' => 'Nie udalo sie zapisac mapowania dostaw Erli.',
],
],
'status' => [
'secret' => 'Sekret API',
'active' => 'Aktywna',

View File

@@ -15,6 +15,20 @@ $statusSyncIntervalMinutes = (int) ($statusSyncIntervalMinutes ?? 15);
$orderproStatuses = is_array($orderproStatuses ?? null) ? $orderproStatuses : [];
$erliStatusMappings = is_array($erliStatusMappings ?? null) ? $erliStatusMappings : [];
$erliPullStatusMappings = is_array($erliPullStatusMappings ?? null) ? $erliPullStatusMappings : [];
$erliDeliveryOrderMethods = is_array($erliDeliveryOrderMethods ?? null) ? $erliDeliveryOrderMethods : [];
$erliDeliveryMappings = is_array($erliDeliveryMappings ?? null) ? $erliDeliveryMappings : [];
$erliShippingMethods = is_array($erliShippingMethods ?? null) ? $erliShippingMethods : [];
$erliDeliveryVendors = is_array($erliDeliveryVendors ?? null) ? $erliDeliveryVendors : [];
$inpostDeliveryServices = is_array($inpostDeliveryServices ?? null) ? $inpostDeliveryServices : [];
$apaczkaDeliveryServices = is_array($apaczkaDeliveryServices ?? null) ? $apaczkaDeliveryServices : [];
$erliDeliveryMetadataError = trim((string) ($erliDeliveryMetadataError ?? ''));
$erliDeliveryMappingsByMethod = [];
foreach ($erliDeliveryMappings as $mappingRow) {
$methodKey = trim((string) ($mappingRow['order_delivery_method'] ?? ''));
if ($methodKey !== '') {
$erliDeliveryMappingsByMethod[$methodKey] = $mappingRow;
}
}
$activeTab = (string) ($activeTab ?? 'integration');
?>
@@ -47,6 +61,9 @@ $activeTab = (string) ($activeTab ?? 'integration');
<button type="button" class="content-tab-btn<?= $activeTab === 'statuses' ? ' is-active' : '' ?>" data-tab-target="erli-tab-statuses">
<?= $e($t('settings.erli.tabs.statuses')) ?>
</button>
<button type="button" class="content-tab-btn<?= $activeTab === 'delivery' ? ' is-active' : '' ?>" data-tab-target="erli-tab-delivery">
<?= $e($t('settings.erli.tabs.delivery')) ?>
</button>
<button type="button" class="content-tab-btn<?= $activeTab === 'settings' ? ' is-active' : '' ?>" data-tab-target="erli-tab-settings">
<?= $e($t('settings.erli.tabs.settings')) ?>
</button>
@@ -261,6 +278,149 @@ $activeTab = (string) ($activeTab ?? 'integration');
</div>
<div class="content-tab-panel<?= $activeTab === 'delivery' ? ' is-active' : '' ?>" data-tab-panel="erli-tab-delivery">
<section class="mt-16">
<h3 class="section-title"><?= $e($t('settings.erli.delivery.title')) ?></h3>
<p class="muted mt-12"><?= $e($t('settings.erli.delivery.description')) ?></p>
<?php if ($erliDeliveryMetadataError !== ''): ?>
<div class="mt-12"><?php $type='warning'; $message=(string) $erliDeliveryMetadataError; $dismissible=true; include dirname(__DIR__) . '/components/alert.php'; ?></div>
<?php endif; ?>
<form action="/settings/integrations/erli/delivery/save" method="post" class="mt-12">
<input type="hidden" name="_token" value="<?= $e($csrfToken ?? '') ?>">
<div class="table-wrap mt-12">
<table class="table">
<thead>
<tr>
<th><?= $e($t('settings.erli.delivery.fields.order_method')) ?></th>
<th><?= $e($t('settings.erli.delivery.fields.erli_vendor')) ?></th>
<th><?= $e($t('settings.erli.delivery.fields.provider_service')) ?></th>
</tr>
</thead>
<tbody>
<?php if ($erliDeliveryOrderMethods === []): ?>
<tr>
<td colspan="3" class="muted"><?= $e($t('settings.erli.delivery.empty_methods')) ?></td>
</tr>
<?php else: ?>
<?php foreach ($erliDeliveryOrderMethods as $orderMethod): ?>
<?php
$orderMethod = trim((string) $orderMethod);
if ($orderMethod === '') continue;
$mappingRow = is_array($erliDeliveryMappingsByMethod[$orderMethod] ?? null) ? $erliDeliveryMappingsByMethod[$orderMethod] : [];
$selectedVendor = trim((string) ($mappingRow['source_vendor_code'] ?? ''));
$selectedProvider = trim((string) ($mappingRow['provider'] ?? ''));
$selectedProviderServiceId = trim((string) ($mappingRow['provider_service_id'] ?? ''));
$selectedProviderCarrierId = trim((string) ($mappingRow['provider_carrier_id'] ?? ''));
?>
<tr>
<td>
<strong><?= $e($orderMethod) ?></strong>
<input type="hidden" name="order_delivery_method[]" value="<?= $e($orderMethod) ?>">
<input type="hidden" name="source_service_id[]" value="<?= $e((string) ($mappingRow['source_service_id'] ?? '')) ?>">
</td>
<td>
<select class="form-control" name="source_vendor_code[]">
<option value=""><?= $e($t('settings.erli.delivery.fields.no_vendor')) ?></option>
<?php foreach ($erliDeliveryVendors as $vendor): ?>
<?php
$vendorCode = trim((string) ($vendor['id'] ?? $vendor['code'] ?? $vendor['vendor'] ?? ''));
if ($vendorCode === '') continue;
$vendorName = trim((string) ($vendor['name'] ?? $vendorCode));
?>
<option value="<?= $e($vendorCode) ?>"<?= $selectedVendor === $vendorCode ? ' selected' : '' ?>>
<?= $e($vendorName) ?> (<?= $e($vendorCode) ?>)
</option>
<?php endforeach; ?>
</select>
</td>
<td>
<select class="form-control" name="provider_service_choice[]">
<option value=""><?= $e($t('settings.erli.delivery.fields.no_provider')) ?></option>
<?php if ($inpostDeliveryServices !== []): ?>
<optgroup label="InPost">
<?php foreach ($inpostDeliveryServices as $service): ?>
<?php
$serviceId = trim((string) ($service['id'] ?? ''));
if ($serviceId === '') continue;
$serviceName = trim((string) ($service['name'] ?? $serviceId));
$carrierId = 'inpost';
$choice = 'inpost|' . $serviceId . '|' . $carrierId . '|' . $serviceName;
$isSelected = $selectedProvider === 'inpost' && $selectedProviderServiceId === $serviceId;
?>
<option value="<?= $e($choice) ?>"<?= $isSelected ? ' selected' : '' ?>>
<?= $e($serviceName) ?>
</option>
<?php endforeach; ?>
</optgroup>
<?php endif; ?>
<?php if ($apaczkaDeliveryServices !== []): ?>
<optgroup label="Apaczka">
<?php foreach ($apaczkaDeliveryServices as $service): ?>
<?php
if (!is_array($service)) continue;
$serviceId = trim((string) ($service['service_id'] ?? $service['id'] ?? ''));
if ($serviceId === '') continue;
$serviceName = trim((string) ($service['name'] ?? ('ID ' . $serviceId)));
$carrierId = trim((string) ($service['carrier_code'] ?? ''));
$choice = 'apaczka|' . $serviceId . '|' . $carrierId . '|' . $serviceName;
$isSelected = $selectedProvider === 'apaczka'
&& $selectedProviderServiceId === $serviceId
&& ($selectedProviderCarrierId === '' || $selectedProviderCarrierId === $carrierId);
?>
<option value="<?= $e($choice) ?>"<?= $isSelected ? ' selected' : '' ?>>
<?= $e($serviceName) ?><?= $carrierId !== '' ? ' [' . $e($carrierId) . ']' : '' ?>
</option>
<?php endforeach; ?>
</optgroup>
<?php endif; ?>
</select>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
<?php if ($erliDeliveryOrderMethods !== []): ?>
<div class="form-actions mt-12">
<button type="submit" class="btn btn--primary"><?= $e($t('settings.erli.delivery.actions.save')) ?></button>
</div>
<?php endif; ?>
</form>
<?php if ($erliShippingMethods !== []): ?>
<h3 class="section-title mt-16"><?= $e($t('settings.erli.delivery.shipping_methods_title')) ?></h3>
<div class="table-wrap mt-12">
<table class="table">
<thead>
<tr>
<th><?= $e($t('settings.erli.delivery.fields.shipping_method')) ?></th>
<th><?= $e($t('settings.erli.delivery.fields.shipping_vendor')) ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($erliShippingMethods as $method): ?>
<?php
$methodId = trim((string) ($method['id'] ?? $method['typeId'] ?? ''));
$methodName = trim((string) ($method['name'] ?? $methodId));
$methodVendor = trim((string) ($method['vendor'] ?? ''));
if ($methodId === '' && $methodName === '') continue;
?>
<tr>
<td><?= $e($methodName) ?><?= $methodId !== '' ? ' <code class="muted">' . $e($methodId) . '</code>' : '' ?></td>
<td><?= $e($methodVendor !== '' ? $methodVendor : '-') ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
</section>
</div>
<div class="content-tab-panel<?= $activeTab === 'settings' ? ' is-active' : '' ?>" data-tab-panel="erli-tab-settings">
<section class="mt-16">
<h3 class="section-title"><?= $e($t('settings.erli.import.title')) ?></h3>
@@ -315,6 +475,7 @@ $activeTab = (string) ($activeTab ?? 'integration');
var tabNameMap = {
'erli-tab-integration': 'integration',
'erli-tab-statuses': 'statuses',
'erli-tab-delivery': 'delivery',
'erli-tab-settings': 'settings'
};

View File

@@ -19,7 +19,11 @@ $mappedCredentialsId = trim((string) ($mapping['provider_account_id'] ?? ''));
$mappedCarrierId = trim((string) ($mapping['provider_carrier_id'] ?? ''));
$mappedProvider = trim((string) ($mapping['provider'] ?? ''));
$mappedServiceName = trim((string) ($mapping['provider_service_name'] ?? ''));
$mappedCarrier = $mappedProvider === 'apaczka' ? 'apaczka' : 'allegro';
$mappedCarrier = match ($mappedProvider) {
'apaczka' => 'apaczka',
'inpost' => 'inpost',
default => 'allegro',
};
if ($mappedCarrier !== 'apaczka' && stripos($mappedCarrierId, 'inpost') !== false) {
$mappedCarrier = 'inpost';
}
@@ -144,16 +148,16 @@ $defaultCodAmount = $isCod ? number_format($totalWithTax, 2, '.', '') : '0';
<div id="shipment-inpost-panel" style="<?= $preselectedCarrier !== 'inpost' ? 'display:none' : '' ?>">
<?php if ($inpostSvcList === []): ?>
<div class="muted">Brak uslug InPost (sprawdz polaczenie z Allegro).</div>
<div class="muted">Brak uslug InPost (sprawdz konfiguracje InPost).</div>
<?php else: ?>
<select class="form-control" id="shipment-inpost-select">
<option value="">-- Wybierz usluge InPost --</option>
<?php foreach ($inpostSvcList as $inSvc): ?>
<?php
$inSvcId = is_array($inSvc['id'] ?? null) ? $inSvc['id'] : [];
$inSvcMethodId = trim((string) ($inSvcId['deliveryMethodId'] ?? ''));
$inSvcMethodId = trim((string) ($inSvcId['deliveryMethodId'] ?? ($inSvc['id'] ?? '')));
$inSvcCredentialsId = trim((string) ($inSvcId['credentialsId'] ?? ''));
$inSvcCarrierId = trim((string) ($inSvc['carrierId'] ?? ''));
$inSvcCarrierId = trim((string) ($inSvc['carrierId'] ?? 'inpost'));
$inSvcName = trim((string) ($inSvc['name'] ?? ''));
$inSvcSelected = $mappedCarrier === 'inpost' && $mappedMethodId === $inSvcMethodId;
?>
@@ -214,7 +218,7 @@ $defaultCodAmount = $isCod ? number_format($totalWithTax, 2, '.', '') : '0';
<input type="hidden" name="credentials_id" id="shipment-credentials-id" value="">
<input type="hidden" name="carrier_id" id="shipment-carrier-id" value="">
<input type="hidden" name="provider_code" id="shipment-provider-code" value="<?= $e($preselectedCarrier === 'apaczka' ? 'apaczka' : 'allegro_wza') ?>">
<input type="hidden" name="provider_code" id="shipment-provider-code" value="<?= $e($preselectedCarrier === 'apaczka' ? 'apaczka' : ($preselectedCarrier === 'inpost' ? 'inpost' : 'allegro_wza')) ?>">
<label class="form-field">
<span class="field-label">Typ paczki</span>
@@ -615,7 +619,7 @@ $defaultCodAmount = $isCod ? number_format($totalWithTax, 2, '.', '') : '0';
if (inpostPanel) inpostPanel.style.display = carrier === 'inpost' ? '' : 'none';
if (apaczkaPanel) apaczkaPanel.style.display = carrier === 'apaczka' ? '' : 'none';
if (emptyPanel) emptyPanel.style.display = carrier === '' ? '' : 'none';
if (providerInput) providerInput.value = carrier === 'apaczka' ? 'apaczka' : 'allegro_wza';
if (providerInput) providerInput.value = carrier === 'apaczka' ? 'apaczka' : (carrier === 'inpost' ? 'inpost' : 'allegro_wza');
}
var weekendWrap = document.getElementById('shipment-apaczka-weekend-wrap');
@@ -655,7 +659,7 @@ $defaultCodAmount = $isCod ? number_format($totalWithTax, 2, '.', '') : '0';
hiddenInput.value = inpostSelect.value;
credentialsInput.value = opt ? (opt.getAttribute('data-credentials-id') || '') : '';
carrierInput.value = opt ? (opt.getAttribute('data-carrier-id') || '') : '';
if (providerInput) providerInput.value = 'allegro_wza';
if (providerInput) providerInput.value = 'inpost';
}
inpostSelect.addEventListener('change', syncInpostFields);
if (carrierSelect.value === 'inpost' && inpostSelect.value !== '') {