feat: Enhance InPost service selection and handling in Allegro settings

- Added a check for available InPost services and display a message if none are found.
- Updated the InPost service selection dropdown to include additional data attributes for better handling in JavaScript.
- Improved JavaScript event handling for InPost service selection to correctly populate hidden fields with selected service data.

feat: Introduce Cash on Delivery (COD) functionality in shipment preparation

- Added a new input field for specifying the COD amount and currency in the shipment preparation view.
- Updated the shipment creation logic to handle COD amounts correctly when creating shipments.

refactor: Update OrdersController to include shipment package repository

- Modified the OrdersController to accept a ShipmentPackageRepository for better management of shipment-related data.
- Enhanced order details to include shipment package information.

fix: Ensure internal order numbers are generated upon order creation

- Updated the OrderImportRepository to generate and store internal order numbers when a new order is created.

feat: Implement status synchronization for Allegro orders

- Introduced a new service for syncing order statuses from Allegro to the internal system.
- Added logic to fetch and process orders needing status updates, handling errors gracefully.

chore: Clean up InPost service definitions in AllegroIntegrationController

- Removed hardcoded InPost service definitions and replaced them with dynamic fetching based on available services.

feat: Add activity logging for shipment actions

- Implemented activity logging for various shipment actions, including creation, label downloads, and errors, to improve traceability and auditing.
This commit is contained in:
2026-03-06 20:09:59 +01:00
parent 1b5e403c31
commit 3ba6202770
21 changed files with 1888 additions and 226 deletions

View File

@@ -23,32 +23,85 @@ a {
.app-shell {
min-height: 100vh;
display: grid;
grid-template-columns: 260px 1fr;
display: flex;
}
.sidebar {
border-right: 1px solid var(--c-border);
border-right-color: #243041;
width: 260px;
min-width: 260px;
flex-shrink: 0;
overflow: hidden;
transition: width 0.22s ease, min-width 0.22s ease;
border-right: 1px solid #243041;
background: #111a28;
padding: 18px 14px;
padding: 18px 10px;
display: flex;
flex-direction: column;
}
.sidebar.is-collapsed {
width: 52px;
min-width: 52px;
}
.sidebar__brand {
margin: 4px 10px 16px;
display: flex;
align-items: center;
justify-content: space-between;
margin: 4px 4px 16px;
gap: 6px;
min-width: 0;
}
.sidebar__brand-text {
color: #e9f0ff;
font-size: 24px;
font-weight: 300;
letter-spacing: -0.02em;
white-space: nowrap;
overflow: hidden;
flex: 1;
min-width: 0;
strong {
font-weight: 700;
}
}
.sidebar__brand strong {
font-weight: 700;
.sidebar__collapse-btn {
flex-shrink: 0;
width: 28px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: 1px solid #2a3a54;
border-radius: 6px;
color: #64748b;
cursor: pointer;
padding: 0;
transition: background 0.15s, color 0.15s;
&:hover {
background: #1b2a3f;
color: #cbd5e1;
}
}
.sidebar__collapse-icon {
display: block;
transition: transform 0.22s ease;
flex-shrink: 0;
}
.sidebar.is-collapsed .sidebar__collapse-icon {
transform: rotate(180deg);
}
.sidebar__nav {
display: grid;
gap: 6px;
gap: 4px;
}
.sidebar__link {
@@ -71,23 +124,29 @@ a {
.sidebar__group {
display: grid;
gap: 6px;
gap: 2px;
}
.sidebar__group-toggle {
list-style: none;
border-radius: 8px;
padding: 10px 12px;
padding: 9px 10px;
color: #cbd5e1;
font-weight: 600;
cursor: pointer;
display: flex;
align-items: center;
gap: 9px;
white-space: nowrap;
user-select: none;
}
.sidebar__group-toggle::-webkit-details-marker {
display: none;
}
.sidebar__group:hover .sidebar__group-toggle {
.sidebar__group:hover .sidebar__group-toggle,
.sidebar__group-toggle:hover {
color: #f8fafc;
background: #1b2a3f;
}
@@ -97,32 +156,83 @@ a {
background: #2e4f93;
}
.sidebar__icon {
flex-shrink: 0;
width: 18px;
height: 18px;
display: flex;
align-items: center;
justify-content: center;
opacity: 0.85;
}
.sidebar__label {
flex: 1;
min-width: 0;
overflow: hidden;
}
.sidebar__toggle-arrow {
flex-shrink: 0;
margin-left: auto;
opacity: 0.5;
transition: transform 0.18s ease;
}
details[open] > .sidebar__group-toggle .sidebar__toggle-arrow {
transform: rotate(180deg);
}
.sidebar__group-links {
display: grid;
gap: 4px;
padding-left: 8px;
gap: 2px;
padding-left: 12px;
overflow: hidden;
}
.sidebar__sublink {
border-radius: 8px;
padding: 8px 10px;
border-radius: 6px;
padding: 7px 10px 7px 8px;
text-decoration: none;
color: #cbd5e1;
font-size: 13px;
color: #94a3b8;
font-size: 12.5px;
font-weight: 500;
}
display: flex;
align-items: center;
gap: 8px;
white-space: nowrap;
.sidebar__sublink:hover {
color: #f8fafc;
background: #1b2a3f;
}
&::before {
content: '';
flex-shrink: 0;
width: 5px;
height: 5px;
border-radius: 50%;
background: rgba(148, 163, 184, 0.3);
transition: background 0.15s;
}
.sidebar__sublink.is-active {
color: #ffffff;
background: #2e4f93;
&:hover {
color: #e2e8f0;
background: #1b2a3f;
&::before {
background: rgba(148, 163, 184, 0.65);
}
}
&.is-active {
color: #ffffff;
background: rgba(46, 79, 147, 0.55);
&::before {
background: #93c5fd;
}
}
}
.app-main {
flex: 1;
min-width: 0;
}
@@ -944,6 +1054,18 @@ a {
background: #fffbeb;
color: #92400e;
}
&.is-cod {
border-color: #f9a8d4;
background: #fdf2f8;
color: #9d174d;
}
&.is-unpaid {
border-color: #fca5a5;
background: #fef2f2;
color: #b91c1c;
}
}
.orders-mini {
@@ -1316,6 +1438,30 @@ a {
font-size: 12px;
}
.payment-summary {
display: grid;
gap: 6px;
max-width: 420px;
}
.payment-summary__row {
display: flex;
align-items: center;
gap: 10px;
font-size: 12px;
}
.payment-summary__label {
width: 150px;
flex-shrink: 0;
color: #64748b;
}
.payment-summary__value {
font-weight: 600;
color: #0f172a;
}
.order-kv dt {
color: #64748b;
}
@@ -1853,13 +1999,16 @@ a {
@media (max-width: 768px) {
.app-shell {
grid-template-columns: 1fr;
flex-direction: column;
}
.sidebar {
width: 100% !important;
min-width: 0 !important;
border-right: 0;
border-bottom: 1px solid #243041;
padding: 14px;
overflow-x: auto;
}
.sidebar__brand {
@@ -1867,6 +2016,10 @@ a {
font-size: 22px;
}
.sidebar__collapse-btn {
display: none;
}
.sidebar__nav {
display: flex;
gap: 8px;