From cff198277e14450f8d20d9e18548325e6f277682 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Mon, 8 May 2023 16:40:15 +0700 Subject: raja ongkir --- src/core/api/rajaOngkirApi.js | 15 ++ src/lib/checkout/api/ExpedisiList.js | 8 ++ src/lib/checkout/api/serviceExpedisi.js | 8 ++ src/lib/checkout/components/Checkout.jsx | 211 +++++++++++++++++++++++++++-- src/lib/variant/components/VariantCard.jsx | 3 + src/pages/api/rajaongkir-service.js | 15 ++ 6 files changed, 252 insertions(+), 8 deletions(-) create mode 100644 src/core/api/rajaOngkirApi.js create mode 100644 src/lib/checkout/api/ExpedisiList.js create mode 100644 src/lib/checkout/api/serviceExpedisi.js create mode 100644 src/pages/api/rajaongkir-service.js (limited to 'src') diff --git a/src/core/api/rajaOngkirApi.js b/src/core/api/rajaOngkirApi.js new file mode 100644 index 00000000..3faa3210 --- /dev/null +++ b/src/core/api/rajaOngkirApi.js @@ -0,0 +1,15 @@ +import axios from 'axios' + +const rajaOngkir = async (method, url, body) => { + let axiosParameter = { + method, + url: process.env.NEXT_PUBLIC_RAJA_ONGKIR_HOST + url, + headers: { key: process.env.NEXT_PUBLIC_RAJA_ONGKIR_KEY }, + data : body + } + const dataOngkir = await axios(axiosParameter) + + return dataOngkir +} + +export default rajaOngkir \ No newline at end of file diff --git a/src/lib/checkout/api/ExpedisiList.js b/src/lib/checkout/api/ExpedisiList.js new file mode 100644 index 00000000..ca22bec1 --- /dev/null +++ b/src/lib/checkout/api/ExpedisiList.js @@ -0,0 +1,8 @@ +import odooApi from '@/core/api/odooApi' + +const ExpedisiList = async () => { + const dataExpedisi = await odooApi('GET', '/api/v1/courier') + return dataExpedisi +} + +export default ExpedisiList diff --git a/src/lib/checkout/api/serviceExpedisi.js b/src/lib/checkout/api/serviceExpedisi.js new file mode 100644 index 00000000..0ff0aa03 --- /dev/null +++ b/src/lib/checkout/api/serviceExpedisi.js @@ -0,0 +1,8 @@ +import rajaOngkir from '@/core/api/rajaOngkirApi' + +const serviceExpedisi = async (body) => { + const dataExpedisi = await rajaOngkir('POST', '/starter/cost', body) + return dataExpedisi +} + +export default serviceExpedisi diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index eee679fd..111117c9 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -19,6 +19,7 @@ import axios from 'axios' import Image from '@/core/components/elements/Image/Image' import MobileView from '@/core/components/views/MobileView' import DesktopView from '@/core/components/views/DesktopView' +import ExpedisiList from '../api/ExpedisiList' const Checkout = () => { const router = useRouter() @@ -61,7 +62,22 @@ const Checkout = () => { const [products, setProducts] = useState(null) const [totalAmount, setTotalAmount] = useState(0) const [totalDiscountAmount, setTotalDiscountAmount] = useState(0) + const [totalWeight, setTotalWeight] = useState(0) const [priceCheck, setPriceCheck] = useState(false) + const [listExpedisi, setExpedisi] = useState([]) + const [listserviceExpedisi, setListServiceExpedisi] = useState([]) + const [selectedExpedisi, setSelectedExpedisi] = useState(0) + const [biayaKirim, setBiayaKirim] = useState(null) + const [checkWeigth, setCheckWeight] = useState(false) + + useEffect(() => { + const loadExpedisi = async () => { + let dataExpedisi = await ExpedisiList() + dataExpedisi = dataExpedisi.map((city) => ({ value: city.id, label: city.name })) + setExpedisi(dataExpedisi) + } + loadExpedisi() + }, []) useEffect(() => { const loadProducts = async () => { @@ -95,16 +111,44 @@ const Checkout = () => { if (products) { let calculateTotalAmount = 0 let calculateTotalDiscountAmount = 0 + let calcuateTotalWeight = 0 products.forEach((product) => { calculateTotalAmount += product.price.price * product.quantity calculateTotalDiscountAmount += (product.price.price - product.price.priceDiscount) * product.quantity + calcuateTotalWeight += product.weight * product.quantity + if (product.weight == 0) { + setCheckWeight(true) + } }) setTotalAmount(calculateTotalAmount) setTotalDiscountAmount(calculateTotalDiscountAmount) + setTotalWeight(calcuateTotalWeight * 1000) } }, [products]) + useEffect(() => { + const loadServiceRajaOngkir = async () => { + const body = { + origin: 155, + destination: selectedAddress.shipping.rajaongkirCityId, + weight: totalWeight, + courier: selectedExpedisi, + originType: 'city', + destinationType: 'city' + } + setBiayaKirim(0) + const dataService = await axios('/api/rajaongkir-service?body=' + JSON.stringify(body)) + setListServiceExpedisi(dataService.data[0].costs) + } + if (selectedExpedisi != 0 && totalWeight > 0) { + loadServiceRajaOngkir() + } else { + setListServiceExpedisi() + setBiayaKirim(0) + } + }, [selectedExpedisi, selectedAddress, totalWeight]) + const poNumber = useRef(null) const poFile = useRef(null) @@ -125,6 +169,7 @@ const Checkout = () => { partner_shipping_id: selectedAddress.shipping.id, partner_invoice_id: selectedAddress.invoicing.id, order_line: JSON.stringify(productOrder), + delivery_amount : biayaKirim, type: 'sale_order' } if (poNumber.current.value) data.po_number = poNumber.current.value @@ -136,10 +181,11 @@ const Checkout = () => { return } - for (const product of products) deleteItemCart({ productId: product.id }) + // for (const product of products) deleteItemCart({ productId: product.id }) const payment = await axios.post( `${process.env.NEXT_PUBLIC_SELF_HOST}/api/shop/midtrans-payment?transactionId=${isCheckouted.id}` ) + console.log(payment) setIsLoading(false) window.location.href = payment.data.redirectUrl } @@ -162,9 +208,50 @@ const Checkout = () => { - - - + {/* */} + + + + + + + + + {listserviceExpedisi && ( +
+
+
Service Type Expedisi :
+
+ +
+
+
+ )} +
{products && } @@ -195,12 +282,16 @@ const Checkout = () => {
PPN 11%
{currencyFormat(taxTotal)}
+
+
Biaya Kirim
+
{currencyFormat(biayaKirim)}
+

Grand Total
- {currencyFormat(totalAmount - totalDiscountAmount + taxTotal)} + {currencyFormat(totalAmount - totalDiscountAmount + taxTotal + biayaKirim)}
{/*

*) Belum termasuk biaya pengiriman

*/} @@ -262,8 +353,49 @@ const Checkout = () => {
- - + {/* */} + + + + + + + + + {listserviceExpedisi && ( +
+
+
Service Type Expedisi :
+
+ +
+
+
+ )}
@@ -298,6 +430,9 @@ const Checkout = () => { ? `| ${product?.attributes.join(', ')}` : ''}
+
+ Berat item : {product?.weight} Kg +
@@ -369,6 +504,10 @@ const Checkout = () => {
PPN 11%
{currencyFormat(taxTotal)}
+
+
Biaya Kirim
+
{currencyFormat(biayaKirim)}
+

@@ -376,7 +515,7 @@ const Checkout = () => {
Grand Total
- {currencyFormat(totalAmount - totalDiscountAmount + taxTotal)} + {currencyFormat(totalAmount - totalDiscountAmount + taxTotal + parseInt(biayaKirim))}

@@ -460,6 +599,62 @@ const SectionAddress = ({ address, label, url }) => ( )} ) + +const SectionValidation = ({ address, checkWeigth }) => ( + address?.rajaongkirCityId == 0 && ( +

+
+
+

+ SIlahkan Update alamat kirim melalui{' '} + + Link ini ! + +

+
+
+
+ ), + checkWeigth == true && ( +
+
+
+

+ Ada item barang yang belum di setting berat nya, silahkan hub admin di{' '} + + + Link InI ! + + +

+
+
+
+ ) +) + +const SectionExpedisi = ({ address, listExpedisi, setSelectedExpedisi, checkWeigth }) => + (address?.rajaongkirCityId > 0 && checkWeigth != true) && ( +
+
+
Pilih Expedisi :
+
+ +
+
+
+ ) const PickupAddress = ({ label }) => (
diff --git a/src/lib/variant/components/VariantCard.jsx b/src/lib/variant/components/VariantCard.jsx index 8cd70bc0..28f3e193 100644 --- a/src/lib/variant/components/VariantCard.jsx +++ b/src/lib/variant/components/VariantCard.jsx @@ -38,6 +38,9 @@ const VariantCard = ({ product, openOnClick = true, buyMore = false }) => { {product.code || '-'} {product.attributes.length > 0 ? ` ・ ${product.attributes.join(', ')}` : ''}

+

+ Berat Item : {product?.weight} Kg +

{product.price.discountPercentage > 0 && ( <> diff --git a/src/pages/api/rajaongkir-service.js b/src/pages/api/rajaongkir-service.js new file mode 100644 index 00000000..dd5fd812 --- /dev/null +++ b/src/pages/api/rajaongkir-service.js @@ -0,0 +1,15 @@ +import rajaOngkir from "@/core/api/rajaOngkirApi"; + +export default async function handler(req, res){ + const { + body + } = req.query + + let result = await rajaOngkir('POST', '/api/cost', JSON.parse(body)) + try{ + res.status(200).json(result.data.rajaongkir.results) + }catch(error) { + res.status(400).json({ error: error.message }) + } + +} \ No newline at end of file -- cgit v1.2.3