sendSuccess([ 'shipping_zones' => ShippingZoneFilter::fromRequest($request)->paginate() ]); } public function store(ShippingZoneRequest $request) { $data = $request->getSafe($request->sanitize()); if (empty($data['shipping_class_id'])) { $data['shipping_class_id'] = null; } $shippingZone = ShippingZone::query()->create($data); return $this->sendSuccess([ 'shipping_zone' => $shippingZone, 'message' => __('Shipping zone has been created successfully', 'fluent-cart') ]); } public function show($id) { $shippingZone = ShippingZone::with('methods')->findOrFail($id); return $this->sendSuccess([ 'shipping_zone' => $shippingZone ]); } public function update(ShippingZoneRequest $request, $id) { // When the client omits shipping_class_id, ShippingZoneRequest:: // beforeValidation resolves the zone's stored class into the request // (its return is merged in), so validation checks the effective class // and this write preserves it — getSafe would otherwise emit the // mapped key as null and wipe the stored link. $data = $request->getSafe($request->sanitize()); $shippingZone = ShippingZone::query()->findOrFail($id); if (Arr::get($data, 'region') !== $shippingZone->region) { ShippingMethod::where('zone_id', $id)->update(['states' => []]); } $shippingZone->update($data); return $this->sendSuccess([ 'shipping_zone' => $shippingZone, 'message' => __('Shipping zone has been updated successfully', 'fluent-cart'), ]); } public function destroy($id) { $shippingZone = ShippingZone::findOrFail($id); $DB = App::db(); $DB->beginTransaction(); try { // Delete associated shipping methods ShippingMethod::where('zone_id', $id)->delete(); // Delete the shipping zone $shippingZone->delete(); $DB->commit(); } catch (\Exception $e) { $DB->rollBack(); return $this->sendError([ 'message' => __('Failed to delete shipping zone', 'fluent-cart') ]); } return $this->sendSuccess([ 'message' => __('Shipping zone has been deleted successfully', 'fluent-cart') ]); } public function updateOrder(Request $request) { $zones = $request->get('zones', []); if (!$zones || !is_array($zones)) { return $this->sendError([ 'message' => __('Invalid data provided', 'fluent-cart') ]); } $zones = array_slice($zones, 0, 200); $DB = App::db(); $DB->beginTransaction(); try { foreach ($zones as $index => $zoneId) { ShippingZone::where('id', intval($zoneId))->update(['order' => $index]); } $DB->commit(); } catch (\Exception $e) { $DB->rollBack(); return $this->sendError([ 'message' => __('Failed to update zone order', 'fluent-cart') ]); } return $this->sendSuccess([ 'message' => __('Shipping zones order has been updated', 'fluent-cart') ]); } public function getZoneStates(Request $request) { $country_code = sanitize_text_field(Arr::get($request->all(), 'country_code', '')); $countryInfo = LocalizationManager::getCountryInfoFromRequest(null, $country_code); return $this->sendSuccess([ 'data' => $countryInfo ]); } public function getCountriesByContinent() { $continents = LocalizationManager::getContinents(); $allCountries = LocalizationManager::getCountries(); $grouped = []; foreach ($continents as $code => $continent) { $countryCodes = Arr::get($continent, 'countries', []); $countries = []; foreach ($countryCodes as $countryCode) { if (isset($allCountries[$countryCode])) { $countries[] = [ 'code' => $countryCode, 'name' => $allCountries[$countryCode], ]; } } if (!empty($countries)) { $grouped[] = [ 'code' => $code, 'name' => Arr::get($continent, 'name', $code), 'countries' => $countries, ]; } } return $this->sendSuccess([ 'continents' => $grouped, ]); } }