diff --git a/uafrica/Customshipping/Model/Carrier/Customshipping.php b/uafrica/Customshipping/Model/Carrier/Customshipping.php index 8761d928c59805ccb6a436aa0eb6627df0f15084..0b0e1efa91f29d36d9c29d0a39097363d7dad037 100644 --- a/uafrica/Customshipping/Model/Carrier/Customshipping.php +++ b/uafrica/Customshipping/Model/Carrier/Customshipping.php @@ -26,6 +26,7 @@ use Magento\Shipping\Model\Rate\Result; use Magento\Shipping\Model\Rate\ResultFactory; use Magento\Shipping\Model\Simplexml\ElementFactory; use Magento\Shipping\Model\Tracking\Result\StatusFactory; +use Magento\Store\Model\ScopeInterface; use Magento\Store\Model\StoreManagerInterface; use Psr\Log\LoggerInterface; @@ -51,23 +52,9 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ /** Tracking Endpoint */ const TRACKING = 'https://api.dev.ship.uafrica.com/tracking?channel=localhost&tracking_reference='; /*** RATES API Endpoint*/ - const RATES_ENDPOINT = 'https://8390956f-c00b-497d-8742-87b1d6305bd2.mock.pstmn.io/putrates'; + const RATES_ENDPOINT = 'https://api.dev.ship.uafrica.com/rates-at-checkout/woocommerce'; - /** - * Purpose of rate request - * - * @var string - */ - public const RATE_REQUEST_GENERAL = 'general'; - - /** - * Purpose of rate request - * - * @var string - */ - public const RATE_REQUEST_SMARTPOST = 'SMART_POST'; - /** * Code of the carrier * @@ -247,6 +234,19 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ return $response; } + /** + * Store Base Url + * @var \Magento\Store\Model\StoreManagerInterface $this->_storeManager + * @return string + */ + public function getBaseUrl(): string + { + $storeBase = $this->_storeManager->getStore()->getBaseUrl(); + // Strip slashes and http:// or https:// and wwww. from the url leaving just "example.com" + $storeBase = preg_replace('/(http:\/\/|https:\/\/|www\.)/', '', $storeBase); + $storeBase = preg_replace('/(\/)/', '', $storeBase); + return $storeBase; + } /** * Collect and get rates @@ -256,15 +256,20 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ */ public function collectRates(RateRequest $request) { - /*** Make sure that Shipping method is enabled*/ + if (!$this->isActive()) { return false; } + if (!$this->canCollectRates()) { + return $this->getErrorMessage(); + } + /** @var \Magento\Shipping\Model\Rate\Result $result */ $result = $this->_rateFactory->create(); + /** Destination Information */ $destination = $request->getDestPostcode(); $destCountry = $request->getDestCountryId(); $destRegion = $request->getDestRegionCode(); @@ -273,22 +278,15 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ $destStreet1 = $destStreet; $destStreet2 = $destStreet; - //Get all the origin data from the request - $origin = $this->getConfigData('origin_postcode'); - $originCountry = $this->getConfigData('origin_country_id'); - $originRegion = $this->getConfigData('origin_region_id'); - $originCity = $this->getConfigData('origin_city'); - $originStreet = $this->getConfigData('origin_street'); - //URL to get the rates from - $url = $this->getConfigData('rates_endpoint'); - $originStreet1 = $originStreet; - $originStreet2 = $originStreet; + /** Origin Information */ + list($originStreet, $originRegion, $originCity, $originStreet1, $originStreet2, $storeName, $storeEmail, $storePhoneNumber, $baseIdentifier) = $this->storeInformation(); + /** All Items In The Cart */ $items = $request->getAllItems(); $itemsArray = []; - + /** Get each item's information and add it to the items array */ foreach ($items as $item) { $itemsArray[] = [ 'name' => $item->getName(), @@ -300,29 +298,29 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ 'taxable' => true, 'fulfillment_service' => 'manual', 'properties' => [], - 'vendor' => $item->getStoreId(), + 'vendor' => $item->getName(), 'product_id' => $item->getProductId(), 'variant_id' => $item->getProduct()->getId() ]; } $payload = [ - 'identifier' => "https://bobgomagento.test/", + 'identifier' => $baseIdentifier, 'rate' => [ 'origin' => [ - 'country' => $originCountry, - 'postal_code' => $origin, + 'country' => "ZA", + 'postal_code' => $originStreet, 'province' => $originRegion, 'city' => $originCity, - 'name' => $url, + 'name' => $storeName, 'address1' => $originStreet1, 'address2' => $originStreet2, 'address3' => '', - 'phone' => '+27313039670', + 'phone' => $storePhoneNumber, 'fax' => '', - 'email' => '', + 'email' => $storeEmail, 'address_type' => '', - 'company_name' => 'Jam Clothing' + 'company_name' => $storeName ], 'destination' => [ 'country' => $destCountry, @@ -333,15 +331,13 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ 'address1' => $destStreet1, 'address2' => $destStreet2, 'address3' => '', - 'phone' => '081 346 5923', + 'phone' => '', 'fax' => '', 'email' => '', 'address_type' => '', 'company_name' => '' ], - 'items' => $itemsArray, - 'currency' => 'ZAR', - 'locale' => 'en-PT' + 'items' => $itemsArray ] ]; @@ -364,6 +360,56 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ return $this->_result; } + /** + * @return array + */ + public function storeInformation(): array + { + /** Store Origin details */ + + $originRegion = $this->_scopeConfig->getValue( + 'general/store_information/region_id', + ScopeInterface::SCOPE_STORE + ); + $originCity = $this->_scopeConfig->getValue( + 'general/store_information/city', + ScopeInterface::SCOPE_STORE + ); + + $originStreet = $this->_scopeConfig->getValue( + 'general/store_information/postcode', + ScopeInterface::SCOPE_STORE + ); + + $originStreet1 = $this->_scopeConfig->getValue( + 'general/store_information/street_line1', + ScopeInterface::SCOPE_STORE + ); + + $originStreet2 = $this->_scopeConfig->getValue( + 'general/store_information/street_line2', + ScopeInterface::SCOPE_STORE + ); + + $storeName = $this->_scopeConfig->getValue( + 'general/store_information/name', + ScopeInterface::SCOPE_STORE + ); + + $storeEmail = $this->_scopeConfig->getValue( + 'general/store_information/email', + ScopeInterface::SCOPE_STORE + ); + + $storePhoneNumber = $this->_scopeConfig->getValue( + 'general/store_information/phone', + ScopeInterface::SCOPE_STORE + ); + + $baseIdentifier = $this->getBaseUrl(); + return array($originStreet, $originRegion, $originCity, $originStreet1, $originStreet2, $storeName, $storeEmail, $storePhoneNumber, $baseIdentifier); + } + /** * Get final price for shipping method with handling fee per package * @@ -439,7 +485,7 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ /** - * Get tracking + * Get tracking (Without this method, the tracking pop will show up with an error) * * @param string|string[] $trackings * @return Result|null @@ -511,8 +557,7 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ $result->append($tracking); $counter ++; } - - // no available tracking details + // No tracking information received from carrier if (!$counter) { $this->appendTrackingError( $trackingValue, @@ -601,7 +646,6 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ */ public function getContainerTypes(\Magento\Framework\DataObject $params = null) { - //return null $result = []; $allowedContainers = $this->getConfigData('containers'); if ($allowedContainers) { @@ -671,7 +715,7 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ } /** - * Append error message to rate result instance + * Append error message to rate result instance and set it as error in result * * @param string $trackingValue * @param string $errorMessage @@ -714,7 +758,7 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ } /** - * Perfom API Request to uAfrica API and return response + * Perform API Request to uAfrica API and return response * @param array $payload * @param Result $result * @return void @@ -729,7 +773,7 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ } /** - * Perfom API Request for Shipment Tracking to uAfrica API and return response + * Perform API Request for Shipment Tracking to uAfrica API and return response * @param $trackInfo * @param array $result * @return array @@ -751,18 +795,14 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ */ private function prepareActivity($response, array $result): array { - $result['shippeddate'] = $this->formatDate($response['shipment_time_created']); - $result['deliverydate'] = $this->formatDate('2022-12-14 09:40:41+00:00'); - $result['deliverytime'] = $this->formatTime('2022-12-14 09:40:41+00:00'); - $result['deliverylocation'] = 'Johannesburg'; foreach ($response['checkpoints'] as $checkpoint) { $result['progressdetail'][] = [ 'activity' => $checkpoint['status'], 'deliverydate' => $this->formatDate($checkpoint['time']), 'deliverytime' => $this->formatTime($checkpoint['time']), - //Not Receiving Checkpoint location from the sample body of response so, this is temp - 'deliverylocation' => 'Pretoria', + //TODO: Add location or Find a way to get location from uAfrica API or remove it + 'deliverylocation' => 'Unavailable', ]; } return $result; @@ -807,24 +847,11 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ } /** - * @param string $min_delivery_date - * @param string $max_delivery_date - * @return string - */ - public function getDay(string $min_delivery_date, string $max_delivery_date): string - { - $min = date('d', strtotime($min_delivery_date)); - $max = date('d', strtotime($max_delivery_date)); - - return $min . ' - ' . $max; - } - ///Write function fo get business days - /** + * Get Working Days between time of checkout and delivery date (min and max) * @param string $startDate * @param string $endDate * @return int */ - public function getWorkingDays(string $startDate, string $endDate): int { $begin = strtotime($startDate); @@ -867,10 +894,10 @@ class Customshipping extends AbstractCarrierOnline implements \Magento\Shipping\ * @param array $payload * @return mixed */ - protected function uRates(array $payload): mixed + private function uRates(array $payload): mixed { - $this->curl->post($this->getApiUrl(), $payload); - + $this->curl->addHeader('Content-Type', 'application/json'); + $this->curl->post($this->getApiUrl(), json_encode($payload)); $rates = $this->curl->getBody(); $rates = json_decode($rates, true);