webrteu / dpd
DPD Romania API v1 driver for webrteu/shipping (Laravel)
Requires
- php: ^8.2
- illuminate/console: ^12.0|^13.0
- illuminate/database: ^12.0|^13.0
- illuminate/http: ^12.0|^13.0
- illuminate/support: ^12.0|^13.0
- webrteu/shipping: ^1.0
Requires (Dev)
- larastan/larastan: ^3.13
- laravel/pint: ^1.32
- orchestra/testbench: ^10.0|^11.0
- peckphp/peck: ^0.3
- pestphp/pest: ^3.8|^4.7
- pestphp/pest-plugin-laravel: ^3.2|^4.1
- pestphp/pest-plugin-type-coverage: ^3.6|^4.0.4
- phpstan/phpstan: ^2.3.3,!=2.3.4
- rector/rector: ^2.8
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Integrare Laravel pentru DPD România, API REST v1 (https://api.dpd.ro/v1/): expediții, etichete per colet,
tracking multiplu, oficii și DPD Box, comenzi de ridicare. Implementează contractele din webrteu/shipping.
Nu este un pachet oficial DPD.
Cerințe
- PHP
^8.2, Laravel 12–13 - contract DPD România cu acces API (utilizator + parolă)
webrteu/shipping
Instalare
composer require webrteu/dpd php artisan vendor:publish --tag=dpd-config php artisan vendor:publish --tag=dpd-migrations php artisan migrate php artisan dpd:contract php artisan dpd:sync-locations
Configurare
DPD_USERNAME= DPD_PASSWORD= DPD_LANGUAGE=RO DPD_CLIENT_SYSTEM_ID= # opțional, dacă îl primești de la DPD DPD_SENDER_CLIENT_ID= # vezi php artisan dpd:contract DPD_SERVICE_ID= DPD_COD_PROCESSING=CASH DPD_PAYER=SENDER DPD_TIMEOUT=20
Nu există token: userName/password/language se adaugă în corpul fiecărei cereri. Corpurile se loghează doar
mascate (redact()): parola și utilizatorul nu apar niciodată în loguri.
⚠️ Căile și câmpurile (additionalServices.cod, obpd, pickup/, CSV-ul location/site/csv/642) se confirmă pe
services.dpd.ro/api.
Utilizare
$awb = Shipping::carrier('dpd')->createShipment($data); // AWB = id-ul expediției Shipment::recordFrom($awb, $data, $order); // păstrează id-urile coletelor pentru etichete $pdf = Shipping::carrier('dpd')->label($awb->awb); // print/ cu toate coletele
| Metodă | DPD |
|---|---|
services() |
services/ |
quote($data) |
calculate/ |
createShipment($data) |
shipment/ → id expediție + parcels[].id; eroare → ShipmentValidationException; timeout → ShipmentStateUnknownException |
label($awb, $format) |
print/ per colet (A4/A6 PDF sau ZPL) |
track / trackMany |
track/ |
cancel($awb) |
shipment/cancel/ |
pickupPoints() |
oficii + DPD Box (dpd_offices sau location/office/) |
orderPickup($request) |
pickup/ ⚠️ |
Erorile din câmpul error sunt tratate și când vin cu HTTP 200. România = countryId 642; localitatea se trimite
prin siteId când nomenclatorul e sincronizat, altfel prin siteName. DPD Box: pickupPointId → pickupOfficeId.
Comenzi Artisan
| Comandă | Ce face |
|---|---|
dpd:sync-locations |
localitățile RO în dpd_sites |
dpd:sync-offices |
oficii + DPD Box în dpd_offices |
dpd:contract |
clientId-urile contului |
Statusuri
⚠️ DpdStatusMap conține doar -14 (livrat). Restul se deduce din descriere. Fără webhook → shipping:sync.
Ce nu face pachetul
- nu suportă expeditori diferiți de clientul din contract
- nu face retry pe crearea expedițiilor
Testare
composer test
DPD_SANDBOX_USERNAME=... DPD_SANDBOX_PASSWORD=... DPD_SANDBOX_SENDER_CLIENT_ID=... DPD_SANDBOX_SERVICE_ID=... vendor/bin/pest --group=sandbox
Fixture-urile sunt după documentație. De înlocuit cu răspunsuri reale.
Changelog
Vezi CHANGELOG.md.
Autor
Licență
MIT. Vezi LICENSE.md.