@lodashventure/medusa-parcel-shipping 0.4.23 → 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.
@@ -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__ */ jsx("span", { children: "ค่าจัดส่ง:" }),
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$3 = defineRouteConfig({
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-4", children: [
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$3.label,
2027
- icon: config$3.icon,
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==