@lodashventure/medusa-parcel-shipping 0.4.22 → 0.4.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +391 -6
- package/.medusa/server/src/admin/index.mjs +394 -9
- package/.medusa/server/src/api/admin/base-shipping-prices/[id]/route.js +60 -0
- package/.medusa/server/src/api/admin/base-shipping-prices/route.js +74 -0
- package/.medusa/server/src/modules/parcel-shipping/migrations/Migration20251120093000.js +17 -0
- package/.medusa/server/src/modules/parcel-shipping/models/base-shipping-rate.js +42 -0
- package/.medusa/server/src/modules/parcel-shipping/models/index.js +4 -2
- package/.medusa/server/src/modules/parcel-shipping/service.js +113 -26
- package/package.json +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { defineWidgetConfig, defineRouteConfig } from "@medusajs/admin-sdk";
|
|
3
3
|
import { Container, Heading, Button, Text, Badge, Drawer, Label, Select, Input, Switch, toast, Table, Prompt, Textarea } from "@medusajs/ui";
|
|
4
|
-
import { useState, useEffect } from "react";
|
|
5
|
-
import { Package, AlertCircle, Truck, Clock, Plus, Edit, Trash } from "lucide-react";
|
|
6
|
-
import { MapPin, ArchiveBox, CurrencyDollarSolid, HandTruck } from "@medusajs/icons";
|
|
4
|
+
import { useState, useEffect, useMemo } from "react";
|
|
5
|
+
import { Package, AlertCircle, Truck, Clock, Plus, Edit, Trash, ExternalLink } from "lucide-react";
|
|
6
|
+
import { MapPin, Route, ArchiveBox, CurrencyDollarSolid, HandTruck } from "@medusajs/icons";
|
|
7
7
|
import "@medusajs/admin-shared";
|
|
8
8
|
const OrderShippingQuoteWidget = ({ data }) => {
|
|
9
9
|
const [quote, setQuote] = useState(null);
|
|
@@ -191,13 +191,31 @@ const OrderShippingQuoteWidget = ({ data }) => {
|
|
|
191
191
|
)
|
|
192
192
|
] })
|
|
193
193
|
] }),
|
|
194
|
+
option.price_breakdown.base_shipping_cost !== void 0 && /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-ui-fg-subtle", children: [
|
|
195
|
+
/* @__PURE__ */ jsx("span", { children: "ค่าฐานตามระยะทาง:" }),
|
|
196
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
197
|
+
"฿",
|
|
198
|
+
option.price_breakdown.base_shipping_cost.toFixed(2)
|
|
199
|
+
] })
|
|
200
|
+
] }),
|
|
194
201
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-ui-fg-subtle", children: [
|
|
195
|
-
/* @__PURE__ */
|
|
202
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
203
|
+
"ค่าจัดส่ง",
|
|
204
|
+
option.price_breakdown.base_shipping_cost !== void 0 ? " (รวมฐาน)" : "",
|
|
205
|
+
":"
|
|
206
|
+
] }),
|
|
196
207
|
/* @__PURE__ */ jsxs("span", { children: [
|
|
197
208
|
"฿",
|
|
198
209
|
option.price_breakdown.shipping_cost.toFixed(2)
|
|
199
210
|
] })
|
|
200
211
|
] }),
|
|
212
|
+
option.price_breakdown.distance_km !== void 0 && /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-ui-fg-subtle", children: [
|
|
213
|
+
/* @__PURE__ */ jsx("span", { children: "ระยะทางโดยประมาณ:" }),
|
|
214
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
215
|
+
option.price_breakdown.distance_km.toFixed(2),
|
|
216
|
+
" กม."
|
|
217
|
+
] })
|
|
218
|
+
] }),
|
|
201
219
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-between font-semibold pt-1 border-t", children: [
|
|
202
220
|
/* @__PURE__ */ jsx("span", { children: "รวมทั้งหมด:" }),
|
|
203
221
|
/* @__PURE__ */ jsxs("span", { children: [
|
|
@@ -652,10 +670,354 @@ const AreasPage = () => {
|
|
|
652
670
|
/* @__PURE__ */ jsx(ServiceAreasTable, {})
|
|
653
671
|
] }) });
|
|
654
672
|
};
|
|
655
|
-
const config$
|
|
673
|
+
const config$4 = defineRouteConfig({
|
|
656
674
|
icon: MapPin,
|
|
657
675
|
label: "พื้นที่บริการ"
|
|
658
676
|
});
|
|
677
|
+
const MessengerBaseRateModal = ({
|
|
678
|
+
rate,
|
|
679
|
+
onClose
|
|
680
|
+
}) => {
|
|
681
|
+
const [formData, setFormData] = useState({
|
|
682
|
+
min_distance_km: "0",
|
|
683
|
+
max_distance_km: "",
|
|
684
|
+
price: "",
|
|
685
|
+
priority: "0",
|
|
686
|
+
active: true
|
|
687
|
+
});
|
|
688
|
+
const [isSaving, setIsSaving] = useState(false);
|
|
689
|
+
useEffect(() => {
|
|
690
|
+
var _a, _b;
|
|
691
|
+
if (rate) {
|
|
692
|
+
setFormData({
|
|
693
|
+
min_distance_km: ((_a = rate.min_distance_km) == null ? void 0 : _a.toString()) ?? "0",
|
|
694
|
+
max_distance_km: ((_b = rate.max_distance_km) == null ? void 0 : _b.toString()) || "",
|
|
695
|
+
price: rate.price.toString(),
|
|
696
|
+
priority: (rate.priority ?? 0).toString(),
|
|
697
|
+
active: rate.active
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
}, [rate]);
|
|
701
|
+
const handleSubmit = async (e) => {
|
|
702
|
+
e.preventDefault();
|
|
703
|
+
const errors = [];
|
|
704
|
+
const minDistance = parseFloat(formData.min_distance_km || "0");
|
|
705
|
+
const hasMaxDistance = formData.max_distance_km !== "";
|
|
706
|
+
const maxDistance = hasMaxDistance ? parseFloat(formData.max_distance_km) : void 0;
|
|
707
|
+
const price = parseFloat(formData.price);
|
|
708
|
+
const priority = parseInt(formData.priority || "0", 10);
|
|
709
|
+
if (isNaN(minDistance) || minDistance < 0) {
|
|
710
|
+
errors.push("ระยะทางเริ่มต้นต้องไม่ติดลบ");
|
|
711
|
+
}
|
|
712
|
+
if (hasMaxDistance && (maxDistance === void 0 || isNaN(maxDistance) || (maxDistance ?? 0) < minDistance)) {
|
|
713
|
+
errors.push("ระยะทางสูงสุดต้องมากกว่าหรือเท่ากับระยะทางเริ่มต้น");
|
|
714
|
+
}
|
|
715
|
+
if (isNaN(price) || price < 0) {
|
|
716
|
+
errors.push("ราคาต้องเป็นตัวเลขไม่ติดลบ");
|
|
717
|
+
}
|
|
718
|
+
if (isNaN(priority)) {
|
|
719
|
+
errors.push("ลำดับความสำคัญต้องเป็นตัวเลข");
|
|
720
|
+
}
|
|
721
|
+
if (errors.length > 0) {
|
|
722
|
+
toast.error("ข้อมูลไม่ถูกต้อง", {
|
|
723
|
+
description: errors.join(", ")
|
|
724
|
+
});
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
setIsSaving(true);
|
|
728
|
+
try {
|
|
729
|
+
const payload = {
|
|
730
|
+
carrier_type: "COMPANY_FLEET",
|
|
731
|
+
carrier: "COMPANY_FLEET",
|
|
732
|
+
service_code: "MESSENGER_3H",
|
|
733
|
+
min_distance_km: minDistance,
|
|
734
|
+
max_distance_km: maxDistance === void 0 || isNaN(maxDistance) ? null : maxDistance,
|
|
735
|
+
price,
|
|
736
|
+
currency: "THB",
|
|
737
|
+
priority,
|
|
738
|
+
active: formData.active
|
|
739
|
+
};
|
|
740
|
+
const url = rate ? `/admin/base-shipping-prices/${rate.id}` : "/admin/base-shipping-prices";
|
|
741
|
+
const method = rate ? "PUT" : "POST";
|
|
742
|
+
const response = await fetch(url, {
|
|
743
|
+
method,
|
|
744
|
+
headers: { "Content-Type": "application/json" },
|
|
745
|
+
credentials: "include",
|
|
746
|
+
body: JSON.stringify(payload)
|
|
747
|
+
});
|
|
748
|
+
if (!response.ok) {
|
|
749
|
+
const error = await response.json().catch(() => ({}));
|
|
750
|
+
throw new Error(error.message || "ไม่สามารถบันทึกข้อมูลได้");
|
|
751
|
+
}
|
|
752
|
+
toast.success("สำเร็จ", {
|
|
753
|
+
description: rate ? "แก้ไขฐานราคาตามระยะทางแล้ว" : "สร้างฐานราคาตามระยะทางใหม่แล้ว"
|
|
754
|
+
});
|
|
755
|
+
onClose();
|
|
756
|
+
} catch (error) {
|
|
757
|
+
toast.error("ข้อผิดพลาด", {
|
|
758
|
+
description: error instanceof Error ? error.message : "ไม่สามารถบันทึกข้อมูลได้"
|
|
759
|
+
});
|
|
760
|
+
} finally {
|
|
761
|
+
setIsSaving(false);
|
|
762
|
+
}
|
|
763
|
+
};
|
|
764
|
+
return /* @__PURE__ */ jsx(Drawer, { open: true, onOpenChange: (open) => !open && onClose(), children: /* @__PURE__ */ jsxs(Drawer.Content, { children: [
|
|
765
|
+
/* @__PURE__ */ jsx(Drawer.Header, { children: /* @__PURE__ */ jsx(Drawer.Title, { children: rate ? "แก้ไขฐานราคาตามระยะทาง" : "สร้างฐานราคาตามระยะทาง" }) }),
|
|
766
|
+
/* @__PURE__ */ jsx(Drawer.Body, { children: /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "flex flex-col gap-y-4", children: [
|
|
767
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-x-4", children: [
|
|
768
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
769
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "min_distance_km", children: "ระยะทางเริ่มต้น (กม.) *" }),
|
|
770
|
+
/* @__PURE__ */ jsx(
|
|
771
|
+
Input,
|
|
772
|
+
{
|
|
773
|
+
id: "min_distance_km",
|
|
774
|
+
type: "number",
|
|
775
|
+
min: "0",
|
|
776
|
+
step: "0.1",
|
|
777
|
+
value: formData.min_distance_km,
|
|
778
|
+
onChange: (e) => setFormData({ ...formData, min_distance_km: e.target.value }),
|
|
779
|
+
required: true
|
|
780
|
+
}
|
|
781
|
+
)
|
|
782
|
+
] }),
|
|
783
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
784
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "max_distance_km", children: "ระยะทางสูงสุด (กม.)" }),
|
|
785
|
+
/* @__PURE__ */ jsx(
|
|
786
|
+
Input,
|
|
787
|
+
{
|
|
788
|
+
id: "max_distance_km",
|
|
789
|
+
type: "number",
|
|
790
|
+
min: "0",
|
|
791
|
+
step: "0.1",
|
|
792
|
+
placeholder: "ปล่อยว่างหากไม่มีที่สิ้นสุด",
|
|
793
|
+
value: formData.max_distance_km,
|
|
794
|
+
onChange: (e) => setFormData({ ...formData, max_distance_km: e.target.value })
|
|
795
|
+
}
|
|
796
|
+
),
|
|
797
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-ui-fg-subtle mt-1", children: "เว้นว่างเพื่อกำหนดช่วงราคาแบบ 30+ กม." })
|
|
798
|
+
] })
|
|
799
|
+
] }),
|
|
800
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
801
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "price", children: "ราคา (THB) *" }),
|
|
802
|
+
/* @__PURE__ */ jsx(
|
|
803
|
+
Input,
|
|
804
|
+
{
|
|
805
|
+
id: "price",
|
|
806
|
+
type: "number",
|
|
807
|
+
min: "0",
|
|
808
|
+
step: "0.01",
|
|
809
|
+
value: formData.price,
|
|
810
|
+
onChange: (e) => setFormData({ ...formData, price: e.target.value }),
|
|
811
|
+
required: true
|
|
812
|
+
}
|
|
813
|
+
)
|
|
814
|
+
] }),
|
|
815
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
816
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "priority", children: "ลำดับความสำคัญ" }),
|
|
817
|
+
/* @__PURE__ */ jsx(
|
|
818
|
+
Input,
|
|
819
|
+
{
|
|
820
|
+
id: "priority",
|
|
821
|
+
type: "number",
|
|
822
|
+
value: formData.priority,
|
|
823
|
+
onChange: (e) => setFormData({ ...formData, priority: e.target.value }),
|
|
824
|
+
placeholder: "0"
|
|
825
|
+
}
|
|
826
|
+
),
|
|
827
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-ui-fg-subtle mt-1", children: "ใช้สำหรับจัดลำดับเมื่อมีช่วงราคาทับกัน (ค่าเริ่มต้น 0)" })
|
|
828
|
+
] }),
|
|
829
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-x-2", children: [
|
|
830
|
+
/* @__PURE__ */ jsx(
|
|
831
|
+
Switch,
|
|
832
|
+
{
|
|
833
|
+
id: "active",
|
|
834
|
+
checked: formData.active,
|
|
835
|
+
onCheckedChange: (checked) => setFormData({ ...formData, active: checked })
|
|
836
|
+
}
|
|
837
|
+
),
|
|
838
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "active", children: "เปิดใช้งาน" })
|
|
839
|
+
] }),
|
|
840
|
+
/* @__PURE__ */ jsxs(Drawer.Footer, { children: [
|
|
841
|
+
/* @__PURE__ */ jsx(
|
|
842
|
+
Button,
|
|
843
|
+
{
|
|
844
|
+
type: "button",
|
|
845
|
+
variant: "secondary",
|
|
846
|
+
onClick: onClose,
|
|
847
|
+
disabled: isSaving,
|
|
848
|
+
children: "ยกเลิก"
|
|
849
|
+
}
|
|
850
|
+
),
|
|
851
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", disabled: isSaving, children: isSaving ? "กำลังบันทึก..." : "บันทึก" })
|
|
852
|
+
] })
|
|
853
|
+
] }) })
|
|
854
|
+
] }) });
|
|
855
|
+
};
|
|
856
|
+
const MessengerBasePricingTable = () => {
|
|
857
|
+
const [rates, setRates] = useState([]);
|
|
858
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
859
|
+
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
860
|
+
const [editingRate, setEditingRate] = useState(null);
|
|
861
|
+
const [deleteId, setDeleteId] = useState(null);
|
|
862
|
+
useEffect(() => {
|
|
863
|
+
fetchRates();
|
|
864
|
+
}, []);
|
|
865
|
+
const orderedRates = useMemo(() => {
|
|
866
|
+
return [...rates].sort((a, b) => {
|
|
867
|
+
if (a.min_distance_km !== b.min_distance_km) {
|
|
868
|
+
return a.min_distance_km - b.min_distance_km;
|
|
869
|
+
}
|
|
870
|
+
const aMax = a.max_distance_km ?? Number.POSITIVE_INFINITY;
|
|
871
|
+
const bMax = b.max_distance_km ?? Number.POSITIVE_INFINITY;
|
|
872
|
+
return aMax - bMax;
|
|
873
|
+
});
|
|
874
|
+
}, [rates]);
|
|
875
|
+
const fetchRates = async () => {
|
|
876
|
+
setIsLoading(true);
|
|
877
|
+
try {
|
|
878
|
+
const response = await fetch(
|
|
879
|
+
"/admin/base-shipping-prices?carrier_type=COMPANY_FLEET&service_code=MESSENGER_3H",
|
|
880
|
+
{
|
|
881
|
+
credentials: "include"
|
|
882
|
+
}
|
|
883
|
+
);
|
|
884
|
+
if (!response.ok) {
|
|
885
|
+
throw new Error("failed_to_load_base_rates");
|
|
886
|
+
}
|
|
887
|
+
const data = await response.json();
|
|
888
|
+
setRates(data.base_rates || []);
|
|
889
|
+
} catch (error) {
|
|
890
|
+
toast.error("ข้อผิดพลาด", {
|
|
891
|
+
description: "ไม่สามารถโหลดฐานราคาตามระยะทางได้"
|
|
892
|
+
});
|
|
893
|
+
} finally {
|
|
894
|
+
setIsLoading(false);
|
|
895
|
+
}
|
|
896
|
+
};
|
|
897
|
+
const handleDelete = async () => {
|
|
898
|
+
if (!deleteId) return;
|
|
899
|
+
try {
|
|
900
|
+
const response = await fetch(
|
|
901
|
+
`/admin/base-shipping-prices/${deleteId}`,
|
|
902
|
+
{
|
|
903
|
+
method: "DELETE",
|
|
904
|
+
credentials: "include"
|
|
905
|
+
}
|
|
906
|
+
);
|
|
907
|
+
if (!response.ok) {
|
|
908
|
+
throw new Error("failed_to_delete");
|
|
909
|
+
}
|
|
910
|
+
toast.success("สำเร็จ", {
|
|
911
|
+
description: "ลบฐานราคาสำเร็จ"
|
|
912
|
+
});
|
|
913
|
+
fetchRates();
|
|
914
|
+
} catch (error) {
|
|
915
|
+
toast.error("ข้อผิดพลาด", {
|
|
916
|
+
description: "ไม่สามารถลบฐานราคาได้"
|
|
917
|
+
});
|
|
918
|
+
} finally {
|
|
919
|
+
setDeleteId(null);
|
|
920
|
+
}
|
|
921
|
+
};
|
|
922
|
+
const handleModalClose = () => {
|
|
923
|
+
setIsModalOpen(false);
|
|
924
|
+
setEditingRate(null);
|
|
925
|
+
fetchRates();
|
|
926
|
+
};
|
|
927
|
+
const formatDistanceRange = (rate) => {
|
|
928
|
+
const min = rate.min_distance_km ?? 0;
|
|
929
|
+
const max = rate.max_distance_km;
|
|
930
|
+
if (max === void 0 || max === null) {
|
|
931
|
+
return `${min}+ กม.`;
|
|
932
|
+
}
|
|
933
|
+
return `${min}-${max} กม.`;
|
|
934
|
+
};
|
|
935
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
936
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-x-4", children: [
|
|
937
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
938
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-semibold", children: "ฐานราคาตามระยะทาง (Messenger 3H)" }),
|
|
939
|
+
/* @__PURE__ */ jsx("p", { className: "text-ui-fg-subtle text-sm", children: "กำหนดราคาเริ่มต้นตามระยะทาง เช่น 0-5, 5-20, 20-30, 30+ กม." })
|
|
940
|
+
] }),
|
|
941
|
+
/* @__PURE__ */ jsxs(Button, { onClick: () => setIsModalOpen(true), children: [
|
|
942
|
+
/* @__PURE__ */ jsx(Plus, {}),
|
|
943
|
+
"เพิ่มช่วงราคา"
|
|
944
|
+
] })
|
|
945
|
+
] }),
|
|
946
|
+
/* @__PURE__ */ jsxs(Table, { className: "mt-4", children: [
|
|
947
|
+
/* @__PURE__ */ jsx(Table.Header, { children: /* @__PURE__ */ jsxs(Table.Row, { children: [
|
|
948
|
+
/* @__PURE__ */ jsx(Table.HeaderCell, { children: "ช่วงระยะทาง" }),
|
|
949
|
+
/* @__PURE__ */ jsx(Table.HeaderCell, { children: "ราคา (THB)" }),
|
|
950
|
+
/* @__PURE__ */ jsx(Table.HeaderCell, { children: "ลำดับ" }),
|
|
951
|
+
/* @__PURE__ */ jsx(Table.HeaderCell, { children: "สถานะ" }),
|
|
952
|
+
/* @__PURE__ */ jsx(Table.HeaderCell, { className: "text-right", children: "การจัดการ" })
|
|
953
|
+
] }) }),
|
|
954
|
+
/* @__PURE__ */ jsx(Table.Body, { children: isLoading ? /* @__PURE__ */ jsx(Table.Row, { children: /* @__PURE__ */ jsx(Table.Cell, { className: "text-center", children: "กำลังโหลด..." }) }) : orderedRates.length === 0 ? /* @__PURE__ */ jsx(Table.Row, { children: /* @__PURE__ */ jsx(Table.Cell, { className: "text-center", children: "ยังไม่ได้ตั้งค่าฐานราคาตามระยะทาง" }) }) : orderedRates.map((rate) => /* @__PURE__ */ jsxs(Table.Row, { children: [
|
|
955
|
+
/* @__PURE__ */ jsx(Table.Cell, { children: formatDistanceRange(rate) }),
|
|
956
|
+
/* @__PURE__ */ jsxs(Table.Cell, { children: [
|
|
957
|
+
"฿",
|
|
958
|
+
rate.price.toFixed(2)
|
|
959
|
+
] }),
|
|
960
|
+
/* @__PURE__ */ jsx(Table.Cell, { children: rate.priority ?? 0 }),
|
|
961
|
+
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Badge, { color: rate.active ? "green" : "grey", children: rate.active ? "เปิดใช้งาน" : "ปิดใช้งาน" }) }),
|
|
962
|
+
/* @__PURE__ */ jsx(Table.Cell, { className: "text-right", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
|
|
963
|
+
/* @__PURE__ */ jsx(
|
|
964
|
+
Button,
|
|
965
|
+
{
|
|
966
|
+
variant: "transparent",
|
|
967
|
+
size: "small",
|
|
968
|
+
onClick: () => {
|
|
969
|
+
setEditingRate(rate);
|
|
970
|
+
setIsModalOpen(true);
|
|
971
|
+
},
|
|
972
|
+
children: /* @__PURE__ */ jsx(Edit, {})
|
|
973
|
+
}
|
|
974
|
+
),
|
|
975
|
+
/* @__PURE__ */ jsx(
|
|
976
|
+
Button,
|
|
977
|
+
{
|
|
978
|
+
variant: "transparent",
|
|
979
|
+
size: "small",
|
|
980
|
+
onClick: () => setDeleteId(rate.id),
|
|
981
|
+
children: /* @__PURE__ */ jsx(Trash, {})
|
|
982
|
+
}
|
|
983
|
+
)
|
|
984
|
+
] }) })
|
|
985
|
+
] }, rate.id)) })
|
|
986
|
+
] }),
|
|
987
|
+
isModalOpen && /* @__PURE__ */ jsx(MessengerBaseRateModal, { rate: editingRate, onClose: handleModalClose }),
|
|
988
|
+
/* @__PURE__ */ jsx(
|
|
989
|
+
Prompt,
|
|
990
|
+
{
|
|
991
|
+
variant: "confirmation",
|
|
992
|
+
open: !!deleteId,
|
|
993
|
+
onOpenChange: () => setDeleteId(null),
|
|
994
|
+
children: /* @__PURE__ */ jsxs(Prompt.Content, { children: [
|
|
995
|
+
/* @__PURE__ */ jsxs(Prompt.Header, { children: [
|
|
996
|
+
/* @__PURE__ */ jsx(Prompt.Title, { children: "ลบฐานราคา" }),
|
|
997
|
+
/* @__PURE__ */ jsx(Prompt.Description, { children: "คุณต้องการลบช่วงราคานี้ใช่หรือไม่? การดำเนินการนี้ไม่สามารถย้อนกลับได้" })
|
|
998
|
+
] }),
|
|
999
|
+
/* @__PURE__ */ jsxs(Prompt.Footer, { children: [
|
|
1000
|
+
/* @__PURE__ */ jsx(Prompt.Cancel, { children: "ยกเลิก" }),
|
|
1001
|
+
/* @__PURE__ */ jsx(Prompt.Action, { onClick: handleDelete, children: "ลบ" })
|
|
1002
|
+
] })
|
|
1003
|
+
] })
|
|
1004
|
+
}
|
|
1005
|
+
)
|
|
1006
|
+
] });
|
|
1007
|
+
};
|
|
1008
|
+
const BasePricingPage = () => {
|
|
1009
|
+
return /* @__PURE__ */ jsx(Container, { children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-y-6", children: [
|
|
1010
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-y-1", children: [
|
|
1011
|
+
/* @__PURE__ */ jsx(Heading, { level: "h1", children: "ฐานราคาตามระยะทาง (Messenger)" }),
|
|
1012
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: "ตั้งราคาฐานสำหรับบริการ Messenger 3 ชั่วโมงตามช่วงระยะทาง เช่น 0-5, 5-20, 20-30, 30+ กม." })
|
|
1013
|
+
] }),
|
|
1014
|
+
/* @__PURE__ */ jsx(MessengerBasePricingTable, {})
|
|
1015
|
+
] }) });
|
|
1016
|
+
};
|
|
1017
|
+
const config$3 = defineRouteConfig({
|
|
1018
|
+
icon: Route,
|
|
1019
|
+
label: "ฐานราคาตามระยะทาง"
|
|
1020
|
+
});
|
|
659
1021
|
const ParcelBoxModal = ({ box, onClose }) => {
|
|
660
1022
|
const [formData, setFormData] = useState({
|
|
661
1023
|
name: "",
|
|
@@ -1535,6 +1897,7 @@ const ShippingRateModal = ({ rate, onClose }) => {
|
|
|
1535
1897
|
const [isSaving, setIsSaving] = useState(false);
|
|
1536
1898
|
const selectedService = SERVICE_CODES$1.find((s) => s.value === formData.service_code);
|
|
1537
1899
|
const usesHours = (selectedService == null ? void 0 : selectedService.usesHours) ?? false;
|
|
1900
|
+
const isMessenger = formData.carrier_type === "COMPANY_FLEET" && formData.service_code === "MESSENGER_3H";
|
|
1538
1901
|
useEffect(() => {
|
|
1539
1902
|
var _a, _b, _c, _d;
|
|
1540
1903
|
if (rate) {
|
|
@@ -1676,6 +2039,14 @@ const ShippingRateModal = ({ rate, onClose }) => {
|
|
|
1676
2039
|
}
|
|
1677
2040
|
)
|
|
1678
2041
|
] }),
|
|
2042
|
+
isMessenger && /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-subtle p-3 text-sm space-y-1", children: [
|
|
2043
|
+
/* @__PURE__ */ jsx("div", { className: "font-semibold text-ui-fg-base", children: "ฐานราคาตามระยะทาง (Messenger)" }),
|
|
2044
|
+
/* @__PURE__ */ jsx("div", { className: "text-ui-fg-subtle", children: "ตั้งช่วงราคาตามระยะทาง เช่น 0-5, 5-20, 20-30, 30+ กม. สำหรับบริการส่งด่วน 3 ชม." }),
|
|
2045
|
+
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Button, { asChild: true, size: "small", variant: "secondary", children: /* @__PURE__ */ jsxs("a", { href: "/base-pricing", target: "_blank", rel: "noreferrer", children: [
|
|
2046
|
+
"จัดการฐานราคา",
|
|
2047
|
+
/* @__PURE__ */ jsx(ExternalLink, { className: "ml-1 h-4 w-4" })
|
|
2048
|
+
] }) }) })
|
|
2049
|
+
] }),
|
|
1679
2050
|
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-x-4", children: [
|
|
1680
2051
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1681
2052
|
/* @__PURE__ */ jsx(Label, { htmlFor: "maxWeight", children: "น้ำหนักสูงสุด (kg) *" }),
|
|
@@ -1985,9 +2356,13 @@ const ShippingRatesTable = () => {
|
|
|
1985
2356
|
] });
|
|
1986
2357
|
};
|
|
1987
2358
|
const RatesPage = () => {
|
|
1988
|
-
return /* @__PURE__ */ jsx(Container, { children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-y-
|
|
2359
|
+
return /* @__PURE__ */ jsx(Container, { children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-y-8", children: [
|
|
1989
2360
|
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ jsx(Heading, { level: "h1", children: "อัตราค่าขนส่ง" }) }),
|
|
1990
|
-
/* @__PURE__ */ jsx(ShippingRatesTable, {})
|
|
2361
|
+
/* @__PURE__ */ jsx(ShippingRatesTable, {}),
|
|
2362
|
+
/* @__PURE__ */ jsxs("div", { className: "border-t pt-4", children: [
|
|
2363
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "mb-2 text-lg", children: "ฐานราคาตามระยะทาง (Messenger)" }),
|
|
2364
|
+
/* @__PURE__ */ jsx(MessengerBasePricingTable, {})
|
|
2365
|
+
] })
|
|
1991
2366
|
] }) });
|
|
1992
2367
|
};
|
|
1993
2368
|
const config = defineRouteConfig({
|
|
@@ -2006,6 +2381,10 @@ const routeModule = {
|
|
|
2006
2381
|
Component: AreasPage,
|
|
2007
2382
|
path: "/areas"
|
|
2008
2383
|
},
|
|
2384
|
+
{
|
|
2385
|
+
Component: BasePricingPage,
|
|
2386
|
+
path: "/base-pricing"
|
|
2387
|
+
},
|
|
2009
2388
|
{
|
|
2010
2389
|
Component: BoxesPage,
|
|
2011
2390
|
path: "/boxes"
|
|
@@ -2023,8 +2402,8 @@ const routeModule = {
|
|
|
2023
2402
|
const menuItemModule = {
|
|
2024
2403
|
menuItems: [
|
|
2025
2404
|
{
|
|
2026
|
-
label: config$
|
|
2027
|
-
icon: config$
|
|
2405
|
+
label: config$4.label,
|
|
2406
|
+
icon: config$4.icon,
|
|
2028
2407
|
path: "/areas",
|
|
2029
2408
|
nested: void 0
|
|
2030
2409
|
},
|
|
@@ -2045,6 +2424,12 @@ const menuItemModule = {
|
|
|
2045
2424
|
icon: config.icon,
|
|
2046
2425
|
path: "/rates",
|
|
2047
2426
|
nested: void 0
|
|
2427
|
+
},
|
|
2428
|
+
{
|
|
2429
|
+
label: config$3.label,
|
|
2430
|
+
icon: config$3.icon,
|
|
2431
|
+
path: "/base-pricing",
|
|
2432
|
+
nested: void 0
|
|
2048
2433
|
}
|
|
2049
2434
|
]
|
|
2050
2435
|
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
exports.PUT = PUT;
|
|
5
|
+
exports.DELETE = DELETE;
|
|
6
|
+
const parcel_shipping_1 = require("../../../../modules/parcel-shipping");
|
|
7
|
+
const zod_1 = require("zod");
|
|
8
|
+
const CarrierEnum = zod_1.z.enum([
|
|
9
|
+
"COMPANY_FLEET",
|
|
10
|
+
"COMPANY_TRUCK",
|
|
11
|
+
"PRIVATE_CARRIER",
|
|
12
|
+
]);
|
|
13
|
+
const ServiceCodeEnum = zod_1.z.enum([
|
|
14
|
+
"MESSENGER_3H",
|
|
15
|
+
"SAME_DAY",
|
|
16
|
+
"STANDARD_3_5D",
|
|
17
|
+
"EXPRESS_1_2D",
|
|
18
|
+
]);
|
|
19
|
+
const UpdateBaseRateSchema = zod_1.z
|
|
20
|
+
.object({
|
|
21
|
+
carrier_type: CarrierEnum.optional(),
|
|
22
|
+
carrier: CarrierEnum.optional(),
|
|
23
|
+
service_code: ServiceCodeEnum.optional(),
|
|
24
|
+
min_distance_km: zod_1.z.number().nonnegative().optional(),
|
|
25
|
+
max_distance_km: zod_1.z.number().nonnegative().nullable().optional(),
|
|
26
|
+
price: zod_1.z.number().nonnegative().optional(),
|
|
27
|
+
currency: zod_1.z.string().optional(),
|
|
28
|
+
priority: zod_1.z.number().optional(),
|
|
29
|
+
active: zod_1.z.boolean().optional(),
|
|
30
|
+
})
|
|
31
|
+
.refine((data) => data.max_distance_km === undefined ||
|
|
32
|
+
data.max_distance_km === null ||
|
|
33
|
+
data.min_distance_km === undefined ||
|
|
34
|
+
data.max_distance_km >= data.min_distance_km, {
|
|
35
|
+
message: "ระยะทางสูงสุดต้องมากกว่าหรือเท่ากับระยะทางต่ำสุด",
|
|
36
|
+
path: ["max_distance_km"],
|
|
37
|
+
});
|
|
38
|
+
async function GET(req, res) {
|
|
39
|
+
const parcelService = req.scope.resolve(parcel_shipping_1.PARCEL_SHIPPING_MODULE);
|
|
40
|
+
const { id } = req.params;
|
|
41
|
+
const baseRates = await parcelService.findBaseRates({ id });
|
|
42
|
+
if (!baseRates || baseRates.length === 0) {
|
|
43
|
+
return res.status(404).json({ message: "Base shipping rate not found" });
|
|
44
|
+
}
|
|
45
|
+
res.json({ base_rate: baseRates[0] });
|
|
46
|
+
}
|
|
47
|
+
async function PUT(req, res) {
|
|
48
|
+
const parcelService = req.scope.resolve(parcel_shipping_1.PARCEL_SHIPPING_MODULE);
|
|
49
|
+
const { id } = req.params;
|
|
50
|
+
const validated = UpdateBaseRateSchema.parse(req.body);
|
|
51
|
+
const baseRate = await parcelService.updateBaseRate(id, validated);
|
|
52
|
+
res.json({ base_rate: baseRate });
|
|
53
|
+
}
|
|
54
|
+
async function DELETE(req, res) {
|
|
55
|
+
const parcelService = req.scope.resolve(parcel_shipping_1.PARCEL_SHIPPING_MODULE);
|
|
56
|
+
const { id } = req.params;
|
|
57
|
+
await parcelService.deleteBaseRate(id);
|
|
58
|
+
res.status(204).send();
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2Jhc2Utc2hpcHBpbmctcHJpY2VzL1tpZF0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF3Q0Esa0JBV0M7QUFFRCxrQkFRQztBQUVELHdCQU9DO0FBckVELHlFQUE2RTtBQUM3RSw2QkFBd0I7QUFFeEIsTUFBTSxXQUFXLEdBQUcsT0FBQyxDQUFDLElBQUksQ0FBQztJQUN6QixlQUFlO0lBQ2YsZUFBZTtJQUNmLGlCQUFpQjtDQUNsQixDQUFDLENBQUM7QUFDSCxNQUFNLGVBQWUsR0FBRyxPQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdCLGNBQWM7SUFDZCxVQUFVO0lBQ1YsZUFBZTtJQUNmLGNBQWM7Q0FDZixDQUFDLENBQUM7QUFFSCxNQUFNLG9CQUFvQixHQUFHLE9BQUM7S0FDM0IsTUFBTSxDQUFDO0lBQ04sWUFBWSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUU7SUFDcEMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUU7SUFDL0IsWUFBWSxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsZUFBZSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDcEQsZUFBZSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDL0QsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDMUMsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDL0IsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDL0IsTUFBTSxFQUFFLE9BQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDL0IsQ0FBQztLQUNELE1BQU0sQ0FDTCxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1AsSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTO0lBQ2xDLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSTtJQUM3QixJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVM7SUFDbEMsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUM5QztJQUNFLE9BQU8sRUFBRSxrREFBa0Q7SUFDM0QsSUFBSSxFQUFFLENBQUMsaUJBQWlCLENBQUM7Q0FDMUIsQ0FDRixDQUFDO0FBRUcsS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQy9ELE1BQU0sYUFBYSxHQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHdDQUFzQixDQUFDLENBQUM7SUFDckUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFFMUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUU1RCxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRU0sS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQy9ELE1BQU0sYUFBYSxHQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHdDQUFzQixDQUFDLENBQUM7SUFDckUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFFMUIsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRW5FLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRU0sS0FBSyxVQUFVLE1BQU0sQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2xFLE1BQU0sYUFBYSxHQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHdDQUFzQixDQUFDLENBQUM7SUFDckUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFFMUIsTUFBTSxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXZDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDekIsQ0FBQyJ9
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
exports.POST = POST;
|
|
5
|
+
const parcel_shipping_1 = require("../../../modules/parcel-shipping");
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
const CarrierEnum = zod_1.z.enum([
|
|
8
|
+
"COMPANY_FLEET",
|
|
9
|
+
"COMPANY_TRUCK",
|
|
10
|
+
"PRIVATE_CARRIER",
|
|
11
|
+
]);
|
|
12
|
+
const ServiceCodeEnum = zod_1.z.enum([
|
|
13
|
+
"MESSENGER_3H",
|
|
14
|
+
"SAME_DAY",
|
|
15
|
+
"STANDARD_3_5D",
|
|
16
|
+
"EXPRESS_1_2D",
|
|
17
|
+
]);
|
|
18
|
+
const BaseRateSchema = zod_1.z
|
|
19
|
+
.object({
|
|
20
|
+
carrier_type: CarrierEnum.default("COMPANY_FLEET"),
|
|
21
|
+
carrier: CarrierEnum.optional(),
|
|
22
|
+
service_code: ServiceCodeEnum.default("MESSENGER_3H"),
|
|
23
|
+
min_distance_km: zod_1.z.number().nonnegative().default(0),
|
|
24
|
+
max_distance_km: zod_1.z.number().nonnegative().nullable().optional(),
|
|
25
|
+
price: zod_1.z.number().nonnegative(),
|
|
26
|
+
currency: zod_1.z.string().optional().default("THB"),
|
|
27
|
+
priority: zod_1.z.number().optional().default(0),
|
|
28
|
+
active: zod_1.z.boolean().optional().default(true),
|
|
29
|
+
})
|
|
30
|
+
.refine((data) => data.max_distance_km === undefined ||
|
|
31
|
+
data.max_distance_km === null ||
|
|
32
|
+
data.max_distance_km >= data.min_distance_km, {
|
|
33
|
+
message: "ระยะทางสูงสุดต้องมากกว่าหรือเท่ากับระยะทางต่ำสุด",
|
|
34
|
+
path: ["max_distance_km"],
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* GET /admin/base-shipping-prices
|
|
38
|
+
* List all base shipping distance tiers
|
|
39
|
+
*/
|
|
40
|
+
async function GET(req, res) {
|
|
41
|
+
const parcelService = req.scope.resolve(parcel_shipping_1.PARCEL_SHIPPING_MODULE);
|
|
42
|
+
const { carrier_type, service_code, active } = req.query;
|
|
43
|
+
const filters = {};
|
|
44
|
+
if (carrier_type) {
|
|
45
|
+
filters.carrier_type = carrier_type;
|
|
46
|
+
}
|
|
47
|
+
if (service_code) {
|
|
48
|
+
filters.service_code = service_code;
|
|
49
|
+
}
|
|
50
|
+
if (active !== undefined) {
|
|
51
|
+
filters.active = active === "true";
|
|
52
|
+
}
|
|
53
|
+
const baseRates = await parcelService.findBaseRates(filters);
|
|
54
|
+
const sorted = baseRates.sort((a, b) => {
|
|
55
|
+
if (a.min_distance_km !== b.min_distance_km) {
|
|
56
|
+
return a.min_distance_km - b.min_distance_km;
|
|
57
|
+
}
|
|
58
|
+
const aMax = a.max_distance_km ?? Number.POSITIVE_INFINITY;
|
|
59
|
+
const bMax = b.max_distance_km ?? Number.POSITIVE_INFINITY;
|
|
60
|
+
return aMax - bMax;
|
|
61
|
+
});
|
|
62
|
+
res.json({ base_rates: sorted });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* POST /admin/base-shipping-prices
|
|
66
|
+
* Create a base shipping price tier
|
|
67
|
+
*/
|
|
68
|
+
async function POST(req, res) {
|
|
69
|
+
const parcelService = req.scope.resolve(parcel_shipping_1.PARCEL_SHIPPING_MODULE);
|
|
70
|
+
const validated = BaseRateSchema.parse(req.body);
|
|
71
|
+
const baseRate = await parcelService.createBaseRate(validated);
|
|
72
|
+
res.status(201).json({ base_rate: baseRate });
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2Jhc2Utc2hpcHBpbmctcHJpY2VzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkNBLGtCQTRCQztBQU1ELG9CQU9DO0FBbkZELHNFQUEwRTtBQUMxRSw2QkFBd0I7QUFFeEIsTUFBTSxXQUFXLEdBQUcsT0FBQyxDQUFDLElBQUksQ0FBQztJQUN6QixlQUFlO0lBQ2YsZUFBZTtJQUNmLGlCQUFpQjtDQUNsQixDQUFDLENBQUM7QUFDSCxNQUFNLGVBQWUsR0FBRyxPQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdCLGNBQWM7SUFDZCxVQUFVO0lBQ1YsZUFBZTtJQUNmLGNBQWM7Q0FDZixDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWMsR0FBRyxPQUFDO0tBQ3JCLE1BQU0sQ0FBQztJQUNOLFlBQVksRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztJQUNsRCxPQUFPLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRTtJQUMvQixZQUFZLEVBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7SUFDckQsZUFBZSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BELGVBQWUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQy9ELEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxFQUFFO0lBQy9CLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM5QyxRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FB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
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20251120093000 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20251120093000 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`create table if not exists "parcel_base_shipping_rate" ("id" text not null, "carrier_type" text check ("carrier_type" in ('COMPANY_FLEET', 'COMPANY_TRUCK', 'PRIVATE_CARRIER')) not null, "carrier" text check ("carrier" in ('COMPANY_FLEET', 'COMPANY_TRUCK', 'PRIVATE_CARRIER')) not null, "service_code" text check ("service_code" in ('MESSENGER_3H', 'SAME_DAY', 'STANDARD_3_5D', 'EXPRESS_1_2D')) not null, "min_distance_km" real not null default 0, "max_distance_km" real null, "price" real not null, "currency" text not null default 'THB', "priority" integer not null default 0, "active" boolean not null default true, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "parcel_base_shipping_rate_pkey" primary key ("id"));`);
|
|
8
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_parcel_base_shipping_rate_active" ON "parcel_base_shipping_rate" (active) WHERE deleted_at IS NULL;`);
|
|
9
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_parcel_base_shipping_rate_carrier_service" ON "parcel_base_shipping_rate" (carrier_type, service_code) WHERE deleted_at IS NULL;`);
|
|
10
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_parcel_base_shipping_rate_distance" ON "parcel_base_shipping_rate" (carrier_type, service_code, min_distance_km, max_distance_km) WHERE deleted_at IS NULL;`);
|
|
11
|
+
}
|
|
12
|
+
async down() {
|
|
13
|
+
this.addSql(`drop table if exists "parcel_base_shipping_rate" cascade;`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.Migration20251120093000 = Migration20251120093000;
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTExMjAwOTMwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wYXJjZWwtc2hpcHBpbmcvbWlncmF0aW9ucy9NaWdyYXRpb24yMDI1MTEyMDA5MzAwMC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBcUU7QUFFckUsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUMzQyxLQUFLLENBQUMsRUFBRTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQ1QsNnlCQUE2eUIsQ0FDOXlCLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUNULHFJQUFxSSxDQUN0SSxDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FDVCxrS0FBa0ssQ0FDbkssQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQ1QsNkxBQTZMLENBQzlMLENBQUM7SUFDSixDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDRjtBQW5CRCwwREFtQkMifQ==
|