woocommerce
/
src
/
Admin
/
Features
/
Fulfillments
/
Providers
/
AmazonLogisticsShippingProvider.php
ACSCourierShippingProvider.php
3 months ago
AbstractShippingProvider.php
3 months ago
AmazonLogisticsShippingProvider.php
3 months ago
AnPostShippingProvider.php
3 months ago
ArasKargoShippingProvider.php
3 months ago
AustraliaPostShippingProvider.php
3 months ago
AzerpostShippingProvider.php
3 months ago
BartoliniBRTShippingProvider.php
3 months ago
BelpochtaShippingProvider.php
3 months ago
BpostShippingProvider.php
3 months ago
BulgarianPostsShippingProvider.php
3 months ago
CDEKShippingProvider.php
3 months ago
CTTShippingProvider.php
3 months ago
CanadaPostShippingProvider.php
3 months ago
CeskaPostaShippingProvider.php
3 months ago
ChronopostShippingProvider.php
3 months ago
CorreosShippingProvider.php
3 months ago
CustomShippingProvider.php
3 months ago
CyprusPostShippingProvider.php
3 months ago
DHLShippingProvider.php
3 months ago
DPDShippingProvider.php
3 months ago
DeutschePostShippingProvider.php
3 months ago
ELTAShippingProvider.php
3 months ago
EcontShippingProvider.php
3 months ago
EimskipShippingProvider.php
3 months ago
EvriHermesShippingProvider.php
3 months ago
FanCourierShippingProvider.php
3 months ago
FastwayShippingProvider.php
3 months ago
FedExShippingProvider.php
3 months ago
GLSShippingProvider.php
3 months ago
GenikiTaxydromikiShippingProvider.php
3 months ago
HayPostShippingProvider.php
3 months ago
HelthjemShippingProvider.php
3 months ago
HrvatskaPostaShippingProvider.php
3 months ago
InPostShippingProvider.php
3 months ago
IslandsposturShippingProvider.php
3 months ago
ItellaShippingProvider.php
3 months ago
KazpostShippingProvider.php
3 months ago
LaPosteColissimoShippingProvider.php
3 months ago
LasershipOntracShippingProvider.php
3 months ago
LatvijasPastsShippingProvider.php
3 months ago
LiechtensteinischePostShippingProvider.php
3 months ago
MPLShippingProvider.php
3 months ago
MRWShippingProvider.php
3 months ago
MagyarPostaShippingProvider.php
3 months ago
MakedonskaPostaShippingProvider.php
3 months ago
MaltaPostShippingProvider.php
3 months ago
MatkahuoltoShippingProvider.php
3 months ago
MondialRelayShippingProvider.php
3 months ago
NewZealandPostShippingProvider.php
3 months ago
NovaPoshtaShippingProvider.php
3 months ago
OmnivaShippingProvider.php
3 months ago
OsterreichischePostShippingProvider.php
3 months ago
ParcelForceShippingProvider.php
3 months ago
PocztaPolskaShippingProvider.php
3 months ago
PostLuxembourgShippingProvider.php
3 months ago
PostNLShippingProvider.php
3 months ago
PostNordShippingProvider.php
3 months ago
PostaMoldoveiShippingProvider.php
3 months ago
PostaRomanaShippingProvider.php
3 months ago
PosteItalianeShippingProvider.php
3 months ago
PosteSanMarinoShippingProvider.php
3 months ago
PostenNorgeBringShippingProvider.php
3 months ago
PurolatorShippingProvider.php
3 months ago
RoyalMailShippingProvider.php
3 months ago
RussianPostShippingProvider.php
3 months ago
SDAShippingProvider.php
3 months ago
SeurShippingProvider.php
3 months ago
SlovenskaPostaShippingProvider.php
3 months ago
SpeeDeeDeliveryShippingProvider.php
3 months ago
StarTrackShippingProvider.php
3 months ago
SwissPostShippingProvider.php
3 months ago
TollShippingProvider.php
3 months ago
UPSShippingProvider.php
3 months ago
USPSShippingProvider.php
3 months ago
UkrposhtaShippingProvider.php
3 months ago
UrgentCargusShippingProvider.php
3 months ago
YurticiKargoShippingProvider.php
3 months ago
ZasilkovnaShippingProvider.php
3 months ago
AmazonLogisticsShippingProvider.php
159 lines
| 1 | <?php declare(strict_types=1); |
| 2 | |
| 3 | namespace Automattic\WooCommerce\Admin\Features\Fulfillments\Providers; |
| 4 | |
| 5 | /** |
| 6 | * Amazon Logistics Shipping Provider implementation. |
| 7 | * |
| 8 | * Handles Amazon Logistics tracking number detection and validation. |
| 9 | */ |
| 10 | class AmazonLogisticsShippingProvider extends AbstractShippingProvider { |
| 11 | /** |
| 12 | * Countries where Amazon Logistics operates. |
| 13 | * |
| 14 | * @var array<string> |
| 15 | */ |
| 16 | private array $operating_countries = array( 'US', 'CA', 'GB', 'DE', 'FR', 'BE', 'NL', 'IT', 'IN', 'MX', 'JP', 'AU', 'ES', 'CN', 'HK', 'SG', 'GG', 'JE', 'IM', 'GI', 'AT', 'CH', 'PL', 'SE', 'DK', 'NO', 'FI', 'IE', 'PT', 'CZ', 'HU', 'RO', 'BG', 'HR', 'SK', 'SI', 'EE', 'LV', 'LT', 'CY', 'MT', 'LU', 'GR', 'BR', 'TR', 'AE', 'SA', 'EG', 'KW', 'IL', 'ZA', 'KR', 'TW', 'TH', 'MY', 'ID', 'PH', 'VN', 'NZ' ); |
| 17 | |
| 18 | /** |
| 19 | * Gets the unique provider key. |
| 20 | * |
| 21 | * @return string The provider key 'amazon-logistics'. |
| 22 | */ |
| 23 | public function get_key(): string { |
| 24 | return 'amazon-logistics'; |
| 25 | } |
| 26 | |
| 27 | /** |
| 28 | * Gets the display name of the provider. |
| 29 | * |
| 30 | * @return string The provider name 'Amazon Logistics'. |
| 31 | */ |
| 32 | public function get_name(): string { |
| 33 | return 'Amazon Logistics'; |
| 34 | } |
| 35 | |
| 36 | /** |
| 37 | * Gets the path to the provider's icon. |
| 38 | * |
| 39 | * @return string URL to the Amazon Logistics logo image. |
| 40 | */ |
| 41 | public function get_icon(): string { |
| 42 | return esc_url( WC()->plugin_url() ) . '/assets/images/shipping_providers/amazon-logistics.png'; |
| 43 | } |
| 44 | |
| 45 | /** |
| 46 | * Gets the list of origin countries supported by Amazon Logistics. |
| 47 | * |
| 48 | * @return array<string> Array of country codes. |
| 49 | */ |
| 50 | public function get_shipping_from_countries(): array { |
| 51 | return $this->operating_countries; |
| 52 | } |
| 53 | |
| 54 | /** |
| 55 | * Gets the list of destination countries supported by Amazon Logistics. |
| 56 | * |
| 57 | * @return array<string> Array of country codes. |
| 58 | */ |
| 59 | public function get_shipping_to_countries(): array { |
| 60 | return $this->operating_countries; |
| 61 | } |
| 62 | |
| 63 | /** |
| 64 | * Checks if Amazon Logistics can ship between two countries. |
| 65 | * |
| 66 | * @param string $shipping_from Origin country code. |
| 67 | * @param string $shipping_to Destination country code. |
| 68 | * @return bool True if shipping route is supported. |
| 69 | */ |
| 70 | public function can_ship_from_to( string $shipping_from, string $shipping_to ): bool { |
| 71 | return in_array( $shipping_from, $this->operating_countries, true ) && |
| 72 | in_array( $shipping_to, $this->operating_countries, true ); |
| 73 | } |
| 74 | |
| 75 | /** |
| 76 | * Generates the tracking URL for an Amazon Logistics tracking number. |
| 77 | * |
| 78 | * @param string $tracking_number The tracking number to generate URL for. |
| 79 | * @return string The complete tracking URL. |
| 80 | */ |
| 81 | public function get_tracking_url( string $tracking_number ): string { |
| 82 | return 'https://www.amazon.com/progress-tracker/package/ref=ppx_yo_dt_b_track_package_o0?_=' . |
| 83 | strtoupper( rawurlencode( $tracking_number ) ); |
| 84 | } |
| 85 | |
| 86 | /** |
| 87 | * Validates and parses an Amazon Logistics tracking number. |
| 88 | * |
| 89 | * @param string $tracking_number The tracking number to validate. |
| 90 | * @param string $shipping_from Origin country code. |
| 91 | * @param string $shipping_to Destination country code. |
| 92 | * @return array|null Array with tracking URL and score, or null if invalid. |
| 93 | */ |
| 94 | public function try_parse_tracking_number( |
| 95 | string $tracking_number, |
| 96 | string $shipping_from, |
| 97 | string $shipping_to |
| 98 | ): ?array { |
| 99 | if ( empty( $tracking_number ) || ! $this->can_ship_from_to( $shipping_from, $shipping_to ) ) { |
| 100 | return null; |
| 101 | } |
| 102 | |
| 103 | $tracking_number = strtoupper( preg_replace( '/\s+/', '', $tracking_number ) ); |
| 104 | |
| 105 | // Amazon Logistics tracking number patterns with region/service differentiation. |
| 106 | $patterns = array( |
| 107 | // North America patterns. |
| 108 | '/^TBA\d{12}$/' => fn() => 'US' === $shipping_from ? 100 : 95, // US standard format. |
| 109 | '/^TBC\d{12}$/' => fn() => 'CA' === $shipping_from ? 100 : 90, // Canada standard format. |
| 110 | '/^TBM\d{12}$/' => fn() => 'MX' === $shipping_from ? 100 : 85, // Mexico standard format. |
| 111 | |
| 112 | // European patterns. |
| 113 | '/^CC\d{12}$/' => fn() => in_array( $shipping_from, array( 'FR', 'BE', 'NL', 'DE' ), true ) ? 95 : 80, // Continental Europe. |
| 114 | '/^GBA\d{12}$/' => fn() => 'GB' === $shipping_from ? 100 : 85, // United Kingdom. |
| 115 | '/^UK\d{10}$/' => fn() => 'GB' === $shipping_from ? 100 : 85, // United Kingdom. |
| 116 | '/^W[A-Z]\d{9}GB$/' => fn() => 'GB' === $shipping_from ? 99 : 85, // Amazon UK specific pattern. |
| 117 | '/^[A-Z]{2}\d{9}GB$/' => fn() => 'GB' === $shipping_from ? 92 : 75, // United Kingdom. |
| 118 | '/^AM\d{12}$/' => fn() => in_array( $shipping_from, array( 'DE', 'FR', 'IT', 'ES' ), true ) ? 95 : 80, // Amazon Europe. |
| 119 | '/^D\d{13}$/' => fn() => 'DE' === $shipping_from ? 95 : 75, // Germany specific. |
| 120 | |
| 121 | // Asia-Pacific patterns. |
| 122 | '/^RB\d{12}$/' => fn() => in_array( $shipping_from, array( 'CN', 'HK' ), true ) ? 95 : 75, // China/Hong Kong. |
| 123 | '/^ZZ\d{12}$/' => fn() => 'AU' === $shipping_from ? 100 : 80, // Australia. |
| 124 | '/^ZX\d{12}$/' => fn() => 'IN' === $shipping_from ? 100 : 85, // India. |
| 125 | '/^JP\d{12}$/' => fn() => 'JP' === $shipping_from ? 100 : 85, // Japan. |
| 126 | '/^SG\d{12}$/' => fn() => 'SG' === $shipping_from ? 100 : 85, // Singapore. |
| 127 | |
| 128 | // Amazon Fresh/Whole Foods. |
| 129 | '/^AF\d{12}$/' => fn() => 'US' === $shipping_from ? 98 : 80, // Amazon Fresh US. |
| 130 | '/^WF\d{12}$/' => fn() => 'US' === $shipping_from ? 98 : 80, // Whole Foods US. |
| 131 | |
| 132 | // Amazon Business. |
| 133 | '/^AB\d{12}$/' => fn() => in_array( $shipping_from, array( 'US', 'GB', 'DE', 'FR' ), true ) ? 95 : 80, // Amazon Business. |
| 134 | |
| 135 | // Legacy and alternative formats. |
| 136 | '/^TB[A-Z]\d{11}$/' => fn() => in_array( $shipping_from, array( 'US', 'CA', 'MX' ), true ) ? 90 : 70, // Variable third character. |
| 137 | '/^AZ\d{12}$/' => fn() => in_array( $shipping_from, array( 'US', 'GB', 'DE' ), true ) ? 88 : 75, // Alternative format. |
| 138 | |
| 139 | // Amazon Pantry/Subscribe & Save. |
| 140 | '/^AP\d{12}$/' => fn() => 'US' === $shipping_from ? 90 : 75, // Pantry US. |
| 141 | '/^SS\d{12}$/' => fn() => 'US' === $shipping_from ? 90 : 75, // Subscribe & Save US. |
| 142 | |
| 143 | // Fallback: 15-20 character Amazon codes (future-proof, low confidence). |
| 144 | '/^[A-Z0-9]{15,20}$/' => fn() => 60, |
| 145 | ); |
| 146 | |
| 147 | foreach ( $patterns as $pattern => $score_callback ) { |
| 148 | if ( preg_match( $pattern, $tracking_number ) ) { |
| 149 | return array( |
| 150 | 'url' => $this->get_tracking_url( $tracking_number ), |
| 151 | 'ambiguity_score' => $score_callback(), |
| 152 | ); |
| 153 | } |
| 154 | } |
| 155 | |
| 156 | return null; |
| 157 | } |
| 158 | } |
| 159 |