PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.6.4
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.6.4
1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 1.3.20 1.3.19 trunk 1.2.0 All 47 releases
fluent-cart / app / Modules / Shipping / Http / Controllers / ShippingClassController.php

ShippingClassController.php in FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler 1.6.4, at app/Modules/Shipping/Http/Controllers/ShippingClassController.php

153 lines 5.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCart\App\Modules\Shipping\Http\Controllers;
4
5 use FluentCart\App\Http\Controllers\Controller;
6 use FluentCart\App\Models\ShippingClass;
7 use FluentCart\App\Modules\Shipping\Http\Requests\ShippingClassRequest;
8 use FluentCart\Framework\Http\Request\Request;
9 use FluentCart\Framework\Support\Arr;
10 use FluentCart\App\Modules\Shipping\Services\Filter\ShippingClassFilter;
11
12 class ShippingClassController extends Controller
13 {
14 public function index(Request $request)
15 {
16 return $this->sendSuccess([
17 'shipping_classes' => ShippingClassFilter::fromRequest($request)->paginate()
18 ]);
19 }
20
21 public function store(ShippingClassRequest $request)
22 {
23 $data = $request->getSafe($request->sanitize());
24
25 $shippingClass = ShippingClass::create($data);
26
27 return $this->sendSuccess([
28 'shipping_class' => $shippingClass,
29 'message' => __('Shipping class has been created successfully', 'fluent-cart')
30 ]);
31 }
32
33 public function show($id)
34 {
35 $shippingClass = ShippingClass::findOrFail($id);
36
37 return $this->sendSuccess([
38 'shipping_class' => $shippingClass
39 ]);
40 }
41
42 public function update(ShippingClassRequest $request, $id)
43 {
44 $data = $request->getSafe($request->sanitize());
45
46 $shippingClass = ShippingClass::findOrFail($id);
47 $shippingClass->update($data);
48
49 return $this->sendSuccess([
50 'shipping_class' => $shippingClass,
51 'message' => __('Shipping class has been updated successfully', 'fluent-cart')
52 ]);
53 }
54
55 public function destroy($id)
56 {
57 $shippingClass = ShippingClass::findOrFail($id);
58
59 $DB = \FluentCart\App\App::db();
60 $DB->beginTransaction();
61 try {
62 // Cascade delete class-specific zones and their methods
63 $zoneIds = \FluentCart\App\Models\ShippingZone::where('shipping_class_id', $id)->pluck('id')->toArray();
64 if ($zoneIds) {
65 \FluentCart\App\Models\ShippingMethod::whereIn('zone_id', $zoneIds)->delete();
66 \FluentCart\App\Models\ShippingZone::whereIn('id', $zoneIds)->delete();
67 }
68
69 $shippingClass->delete();
70 $DB->commit();
71 } catch (\Exception $e) {
72 $DB->rollBack();
73 return $this->sendError([
74 'message' => __('Failed to delete shipping class', 'fluent-cart')
75 ]);
76 }
77
78 return $this->sendSuccess([
79 'message' => __('Shipping class has been deleted successfully', 'fluent-cart')
80 ]);
81 }
82
83 public function getProfile($id)
84 {
85 $shippingClass = ShippingClass::with('zones.methods')->findOrFail($id);
86
87 return $this->sendSuccess([
88 'shipping_class' => $shippingClass
89 ]);
90 }
91
92 public function getPackages()
93 {
94 $packages = fluent_cart_get_option('shipping_packages', []);
95
96 return $this->sendSuccess([
97 'packages' => $packages ?: []
98 ]);
99 }
100
101 public function savePackages(Request $request)
102 {
103 $packages = $request->get('packages', []);
104
105 if (!is_array($packages)) {
106 $packages = [];
107 }
108
109 $packages = array_slice($packages, 0, 50);
110
111 $validTypes = ['box', 'envelope', 'soft_package'];
112 $validDimUnits = ['cm', 'mm', 'in', 'm'];
113 $validWeightUnits = ['kg', 'g', 'lbs', 'oz'];
114
115 $sanitized = [];
116 foreach ($packages as $package) {
117 $type = Arr::get($package, 'type', 'box');
118 $sanitized[] = [
119 'slug' => sanitize_title(Arr::get($package, 'slug', Arr::get($package, 'name', ''))) ?: ('package-' . wp_generate_uuid4()),
120 'name' => sanitize_text_field(Arr::get($package, 'name', '')),
121 'type' => in_array($type, $validTypes) ? $type : 'box',
122 'length' => max(0, floatval(Arr::get($package, 'length', 0))),
123 'width' => max(0, floatval(Arr::get($package, 'width', 0))),
124 'height' => $type === 'envelope' ? null : max(0, floatval(Arr::get($package, 'height', 0))),
125 'dimension_unit' => in_array(Arr::get($package, 'dimension_unit'), $validDimUnits) ? Arr::get($package, 'dimension_unit') : 'cm',
126 'weight' => max(0, floatval(Arr::get($package, 'weight', 0))),
127 'weight_unit' => in_array(Arr::get($package, 'weight_unit'), $validWeightUnits) ? Arr::get($package, 'weight_unit') : 'kg',
128 'is_default' => (bool) Arr::get($package, 'is_default', false),
129 ];
130 }
131
132 // Deduplicate slugs server-side
133 $usedSlugs = [];
134 foreach ($sanitized as &$pkg) {
135 $base = $pkg['slug'];
136 $counter = 1;
137 while (in_array($pkg['slug'], $usedSlugs, true)) {
138 $pkg['slug'] = $base . '-' . $counter;
139 $counter++;
140 }
141 $usedSlugs[] = $pkg['slug'];
142 }
143 unset($pkg);
144
145 fluent_cart_update_option('shipping_packages', $sanitized);
146
147 return $this->sendSuccess([
148 'packages' => $sanitized,
149 'message' => __('Packages have been saved successfully', 'fluent-cart')
150 ]);
151 }
152 }
153