From 637c22f1886cecf7307ced88dc951134d466a3fa Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Mon, 19 Jun 2023 15:46:03 +0700 Subject: checkout --- src/lib/checkout/api/checkoutApi.js | 9 +- src/lib/checkout/components/Checkout.jsx | 90 +-- src/lib/checkout/components/CheckoutOld.jsx | 811 ++++++++++++++++++++++++++++ 3 files changed, 840 insertions(+), 70 deletions(-) create mode 100644 src/lib/checkout/components/CheckoutOld.jsx (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/api/checkoutApi.js b/src/lib/checkout/api/checkoutApi.js index b76c9b7f..94de8721 100644 --- a/src/lib/checkout/api/checkoutApi.js +++ b/src/lib/checkout/api/checkoutApi.js @@ -1,7 +1,7 @@ import odooApi from '@/core/api/odooApi' import { getAuth } from '@/core/utils/auth' -const checkoutApi = async ({ data }) => { +export const checkoutApi = async ({ data }) => { const auth = getAuth() const dataCheckout = await odooApi( 'POST', @@ -11,4 +11,9 @@ const checkoutApi = async ({ data }) => { return dataCheckout } -export default checkoutApi +export const getProductsCheckout = async () => { + const id = getAuth()?.id + const products = await odooApi('GET',`/api/v1/user/${id}/sale_order/checkout`) + + return products +} diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 088b641b..09fdbd86 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -4,15 +4,14 @@ import Link from '@/core/components/elements/Link/Link' import useAuth from '@/core/hooks/useAuth' import { getItemAddress } from '@/core/utils/address' import addressesApi from '@/lib/address/api/addressesApi' -import CartApi from '@/lib/cart/api/CartApi' import { ExclamationCircleIcon } from '@heroicons/react/24/outline' import React, { useEffect, useRef, useState } from 'react' import _ from 'lodash' -import { deleteItemCart, getCart, getItemCart } from '@/core/utils/cart' +import { deleteItemCart, getCartApi } from '@/core/utils/cart' import currencyFormat from '@/core/utils/currencyFormat' import { toast } from 'react-hot-toast' import getFileBase64 from '@/core/utils/getFileBase64' -import checkoutApi from '../api/checkoutApi' +// import checkoutApi from '../api/checkoutApi' import { useRouter } from 'next/router' import VariantGroupCard from '@/lib/variant/components/VariantGroupCard' import axios from 'axios' @@ -24,12 +23,18 @@ import whatsappUrl from '@/core/utils/whatsappUrl' import { createSlug } from '@/core/utils/slug' import { Button, Modal } from 'flowbite-react' import BottomPopup from '@/core/components/elements/Popup/BottomPopup' +import { useQuery } from 'react-query' const SELF_PICKUP_ID = 32 +const { checkoutApi } = require('../api/checkoutApi') +const { getProductsCheckout } = require('../api/checkoutApi') + const Checkout = () => { const router = useRouter() const auth = useAuth() + const { data: cartCheckout } = useQuery('cartCheckout', getProductsCheckout) + const [selectedAddress, setSelectedAddress] = useState({ shipping: null, invoicing: null @@ -66,8 +71,6 @@ const Checkout = () => { }, [addresses]) 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([]) @@ -96,52 +99,10 @@ const Checkout = () => { }, []) useEffect(() => { - const loadProducts = async () => { - let variantIds = '' - let { query } = router - if (query?.productId) { - variantIds = query.productId - } else { - const cart = getCart() - variantIds = _.filter(cart, (o) => o.selected == true) - .map((o) => o.productId) - .join(',') - } - - const dataProducts = await CartApi({ variantIds }) - const productsWithQuantity = dataProducts?.map((product) => { - if (product.price.priceDiscount == 0) setPriceCheck(true) - return { - ...product, - quantity: query.quantity - ? query.quantity - : getItemCart({ productId: product.id }).quantity - } - }) - setProducts(productsWithQuantity) - } - loadProducts() - }, [router]) - - useEffect(() => { - 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]) + setProducts(cartCheckout?.products) + setCheckWeight(cartCheckout?.hasProductWithoutWeight) + setTotalWeight(cartCheckout?.totalWeight.g) + }, [cartCheckout]) useEffect(() => { const loadServiceRajaOngkir = async () => { @@ -240,7 +201,6 @@ const Checkout = () => { setIsLoading(false) window.location.href = payment.data.redirectUrl } - const taxTotal = (totalAmount - totalDiscountAmount) * 0.11 return ( <> @@ -304,19 +264,19 @@ const Checkout = () => {
Total Belanja
-
{currencyFormat(totalAmount)}
+
{currencyFormat(cartCheckout?.totalPurchase)}
Total Diskon
-
- {currencyFormat(totalDiscountAmount)}
+
- {currencyFormat(cartCheckout?.totalDiscount)}
Subtotal
-
{currencyFormat(totalAmount - totalDiscountAmount)}
+
{currencyFormat(cartCheckout?.subtotal)}
PPN 11%
-
{currencyFormat(taxTotal)}
+
{currencyFormat(cartCheckout?.tax)}
@@ -329,10 +289,7 @@ const Checkout = () => {
Grand Total
- {currencyFormat( - totalAmount - - totalDiscountAmount + - taxTotal + + {currencyFormat(cartCheckout?.grandTotal + Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 )}
@@ -526,19 +483,19 @@ const Checkout = () => {
Total Belanja
-
{currencyFormat(totalAmount)}
+
{currencyFormat(cartCheckout?.totalPurchase)}
Total Diskon
-
- {currencyFormat(totalDiscountAmount)}
+
- {currencyFormat(cartCheckout?.totalDiscount)}
Subtotal
-
{currencyFormat(totalAmount - totalDiscountAmount)}
+
{currencyFormat(cartCheckout?.subtotal)}
PPN 11%
-
{currencyFormat(taxTotal)}
+
{currencyFormat(cartCheckout?.tax)}
@@ -554,10 +511,7 @@ const Checkout = () => {
Grand Total
- {currencyFormat( - totalAmount - - totalDiscountAmount + - taxTotal + + {currencyFormat(cartCheckout?.grandTotal + Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 )}
diff --git a/src/lib/checkout/components/CheckoutOld.jsx b/src/lib/checkout/components/CheckoutOld.jsx new file mode 100644 index 00000000..088b641b --- /dev/null +++ b/src/lib/checkout/components/CheckoutOld.jsx @@ -0,0 +1,811 @@ +import Alert from '@/core/components/elements/Alert/Alert' +import Divider from '@/core/components/elements/Divider/Divider' +import Link from '@/core/components/elements/Link/Link' +import useAuth from '@/core/hooks/useAuth' +import { getItemAddress } from '@/core/utils/address' +import addressesApi from '@/lib/address/api/addressesApi' +import CartApi from '@/lib/cart/api/CartApi' +import { ExclamationCircleIcon } from '@heroicons/react/24/outline' +import React, { useEffect, useRef, useState } from 'react' +import _ from 'lodash' +import { deleteItemCart, getCart, getItemCart } from '@/core/utils/cart' +import currencyFormat from '@/core/utils/currencyFormat' +import { toast } from 'react-hot-toast' +import getFileBase64 from '@/core/utils/getFileBase64' +import checkoutApi from '../api/checkoutApi' +import { useRouter } from 'next/router' +import VariantGroupCard from '@/lib/variant/components/VariantGroupCard' +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' +import whatsappUrl from '@/core/utils/whatsappUrl' +import { createSlug } from '@/core/utils/slug' +import { Button, Modal } from 'flowbite-react' +import BottomPopup from '@/core/components/elements/Popup/BottomPopup' + +const SELF_PICKUP_ID = 32 + +const Checkout = () => { + const router = useRouter() + const auth = useAuth() + const [selectedAddress, setSelectedAddress] = useState({ + shipping: null, + invoicing: null + }) + const [addresses, setAddresses] = useState(null) + + useEffect(() => { + if (!auth) return + + const getAddresses = async () => { + const dataAddresses = await addressesApi() + setAddresses(dataAddresses) + } + + getAddresses() + }, [auth]) + + useEffect(() => { + if (!addresses) return + + const matchAddress = (key) => { + const addressToMatch = getItemAddress(key) + const foundAddress = addresses.filter((address) => address.id == addressToMatch) + if (foundAddress.length > 0) { + return foundAddress[0] + } + return addresses[0] + } + + setSelectedAddress({ + shipping: matchAddress('shipping'), + invoicing: matchAddress('invoicing') + }) + }, [addresses]) + + 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 [selectedCarrierId, setselectedCarrierId] = useState(0) + const [selectedCarrier, setselectedCarrier] = useState(0) + const [biayaKirim, setBiayaKirim] = useState(0) + const [checkWeigth, setCheckWeight] = useState(false) + const [selectedServiceType, setSelectedServiceType] = useState(null) + const [selectedExpedisiService, setselectedExpedisiService] = useState(null) + const [etd, setEtd] = useState(null) + const [etdFix, setEtdFix] = useState(null) + + useEffect(() => { + const loadExpedisi = async () => { + let dataExpedisi = await ExpedisiList() + dataExpedisi = dataExpedisi.map((expedisi) => ({ + value: expedisi.id, + label: expedisi.name, + carrierId: expedisi.deliveryCarrierId + })) + setExpedisi(dataExpedisi) + } + loadExpedisi() + }, []) + + useEffect(() => { + const loadProducts = async () => { + let variantIds = '' + let { query } = router + if (query?.productId) { + variantIds = query.productId + } else { + const cart = getCart() + variantIds = _.filter(cart, (o) => o.selected == true) + .map((o) => o.productId) + .join(',') + } + + const dataProducts = await CartApi({ variantIds }) + const productsWithQuantity = dataProducts?.map((product) => { + if (product.price.priceDiscount == 0) setPriceCheck(true) + return { + ...product, + quantity: query.quantity + ? query.quantity + : getItemCart({ productId: product.id }).quantity + } + }) + setProducts(productsWithQuantity) + } + loadProducts() + }, [router]) + + useEffect(() => { + 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: 2127, + destination: selectedAddress.shipping.rajaongkirCityId, + weight: totalWeight, + courier: selectedCarrier, + originType: 'subdistrict', + destinationType: 'subdistrict' + } + setBiayaKirim(0) + const dataService = await axios('/api/rajaongkir-service?body=' + JSON.stringify(body)) + setListServiceExpedisi(dataService.data[0].costs) + if (dataService.data[0].costs[0]) { + setBiayaKirim(dataService.data[0].costs[0]?.cost[0].value) + setselectedExpedisiService( + dataService.data[0].costs[0]?.description + '-' + dataService.data[0].costs[0]?.service + ) + setEtd(dataService.data[0].costs[0]?.cost[0].etd) + toast.success('Harap pilih tipe layanan pengiriman') + } else { + toast.error('Maaf, layanan tidak tersedia. Mohon pilih expedisi lain.') + } + } + if (selectedCarrier != 0 && selectedCarrier != 1 && totalWeight > 0) { + loadServiceRajaOngkir() + } else { + setListServiceExpedisi() + setBiayaKirim(0) + setselectedExpedisiService() + setEtd() + } + }, [selectedCarrier, selectedAddress, totalWeight]) + + useEffect(() => { + if (selectedServiceType) { + let serviceType = selectedServiceType.split(',') + setBiayaKirim(serviceType[0]) + setselectedExpedisiService(serviceType[1]) + setEtd(serviceType[2]) + } + }, [selectedServiceType]) + + useEffect(() => { + if (etd) setEtdFix(calculateEstimatedArrival(etd)) + }, [etd]) + + useEffect(() => { + if (selectedExpedisi) { + let serviceType = selectedExpedisi.split(',') + setselectedCarrier(serviceType[0]) + setselectedCarrierId(serviceType[1]) + setListServiceExpedisi([]) + } + }, [selectedExpedisi]) + + const poNumber = useRef(null) + const poFile = useRef(null) + + const [isLoading, setIsLoading] = useState(false) + + const checkout = async () => { + const file = poFile.current.files[0] + if (typeof file !== 'undefined' && file.size > 5000000) { + toast.error('Maksimal ukuran file adalah 5MB', { position: 'bottom-center' }) + return + } + setIsLoading(true) + const productOrder = products.map((product) => ({ + product_id: product.id, + quantity: product.quantity + })) + let data = { + partner_shipping_id: auth.partnerId, + partner_invoice_id: auth.partnerId, + order_line: JSON.stringify(productOrder), + delivery_amount: biayaKirim, + carrier_id: selectedCarrierId, + delivery_service_type: selectedExpedisiService, + type: 'sale_order' + } + if (poNumber.current.value) data.po_number = poNumber.current.value + if (typeof file !== 'undefined') data.po_file = await getFileBase64(file) + + const isCheckouted = await checkoutApi({ data }) + if (!isCheckouted?.id) { + toast.error('Gagal melakukan transaksi, terjadi kesalahan internal') + return + } + + 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}` + ) + setIsLoading(false) + window.location.href = payment.data.redirectUrl + } + const taxTotal = (totalAmount - totalDiscountAmount) * 0.11 + + return ( + <> + +
+ +
+ +
+ + Jika mengalami kesulitan dalam melakukan pembelian di website Indoteknik. Hubungi kami + disini + +
+
+ + + + {selectedCarrierId == SELF_PICKUP_ID && } + {selectedCarrierId != SELF_PICKUP_ID && ( + <> + + + + + )} + + + + + + +
+ {products && } +
+ + + +
+
+
Ringkasan Pesanan
+
{products?.length} Barang
+
+
+
+
+
Total Belanja
+
{currencyFormat(totalAmount)}
+
+
+
Total Diskon
+
- {currencyFormat(totalDiscountAmount)}
+
+
+
Subtotal
+
{currencyFormat(totalAmount - totalDiscountAmount)}
+
+
+
PPN 11%
+
{currencyFormat(taxTotal)}
+
+
+
+ Biaya Kirim

{etdFix}

+
+
{currencyFormat(Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000)}
+
+
+
+
+
Grand Total
+
+ {currencyFormat( + totalAmount - + totalDiscountAmount + + taxTotal + + Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 + )} +
+
+ {/*

*) Belum termasuk biaya pengiriman

*/} +

+ Dengan melakukan pembelian melalui website Indoteknik, saya menyetujui{' '} + + Syarat & Ketentuan + {' '} + yang berlaku +

+
+ + + +
+
Purchase Order
+ +
+
+ + +
+
+ + +
+
+

Ukuran dokumen PO Maksimal 5MB

+
+ + + +
+ +
+ {priceCheck && ( +
+ + *) Terdapat produk yang belum memiliki harga,{' '} + + Hubungi Kami untuk meminta harga. + + +
+ )} +
+ + +
+
+ {selectedCarrierId == SELF_PICKUP_ID && } + {selectedCarrierId != SELF_PICKUP_ID && ( + <> + + + + + )} + + + + + + +
+
Detail Pesanan
+ + + + + + + + + + + {products?.map((product) => ( + + + + + + + ))} + +
Nama ProdukJumlahHargaSubtotal
+
+ {product?.name} +
+
+
+ {product?.parent?.name} +
+
+ {product?.code}{' '} + {product?.attributes.length > 0 + ? `| ${product?.attributes.join(', ')}` + : ''} +
+
+ Berat item : {product?.weight} Kg +
+
+
+ + + {product?.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(product?.price?.price)} +
+
+ {product?.price?.discountPercentage}% +
+
+ )} +
+ {product.price.priceDiscount > 0 + ? currencyFormat(product?.price?.priceDiscount) + : 'Call For Price'} +
+
+
+ {product.price.priceDiscount > 0 ? ( + currencyFormat(product?.price?.priceDiscount * product?.quantity) + ) : ( + + Call For Price{' '} + + )} +
+
+
+
+ +
+
+
+
Ringkasan Pesanan
+
{products?.length} Barang
+
+ +
+ +
+
+
Total Belanja
+
{currencyFormat(totalAmount)}
+
+
+
Total Diskon
+
- {currencyFormat(totalDiscountAmount)}
+
+
+
Subtotal
+
{currencyFormat(totalAmount - totalDiscountAmount)}
+
+
+
PPN 11%
+
{currencyFormat(taxTotal)}
+
+
+
+ Biaya Kirim +

{etdFix}

+
+
{currencyFormat(Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000)}
+
+
+ +
+ +
+
Grand Total
+
+ {currencyFormat( + totalAmount - + totalDiscountAmount + + taxTotal + + Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 + )} +
+
+

+ Dengan melakukan pembelian melalui website Indoteknik, saya menyetujui{' '} + + Syarat & Ketentuan + {' '} + yang berlaku +

+ +
+ +
+ Purchase Order (Opsional) +
+ +
+
+ + +
+
+ + +
+
+

Ukuran dokumen PO Maksimal 5MB

+ +
+ + + {priceCheck && ( +
+ + *) Terdapat produk yang belum memiliki harga,{' '} + + Hubungi Kami untuk meminta harga. + + +
+ )} +
+
+
+
+ + ) +} + +const SectionAddress = ({ address, label, url }) => ( +
+
+
{label}
+ + Pilih Alamat Lain + +
+ + {address && ( +
+
+ {address.type.charAt(0).toUpperCase() + address.type.slice(1) + ' Address'} +
+

{address.name}

+

{address.mobile}

+

+ {address.street}, {address?.city?.name} +

+
+ )} +
+) + +const SectionValidation = ({ address }) => + address?.rajaongkirCityId == 0 && ( + +
+ Mohon untuk memperbarui alamat Anda dengan mengklik tombol di bawah ini.{' '} +
+
+ + Update Alamat + +
+
+ ) + +const SectionExpedisi = ({ address, listExpedisi, setSelectedExpedisi, checkWeigth }) => + address?.rajaongkirCityId > 0 && ( +
+
+
Pilih Expedisi :
+
+ +
+
+ {checkWeigth == true && ( +

+ Mohon maaf, pengiriman hanya tersedia untuk self pickup karena terdapat barang yang belum + diatur beratnya. Mohon atur berat barang dengan menghubungi admin melalui{' '} + + tautan ini + +

+ )} +
+ ) + +const SectionListService = ({ listserviceExpedisi, setSelectedServiceType }) => + listserviceExpedisi?.length > 0 && ( + <> +
+
+
Service Type Expedisi :
+
+ +
+
+
+ + + ) + +function addDays(date, days) { + const result = new Date(date) + result.setDate(result.getDate() + days) + return result +} + +function formatDate(date) { + const day = date.getDate() + const month = date.toLocaleString('default', { month: 'short' }) + return `${day} ${month}` +} + +function calculateEstimatedArrival(duration) { + if (duration) { + let estimationDate = duration.split('-') + estimationDate[0] = parseInt(estimationDate[0]) + estimationDate[1] = parseInt(estimationDate[1]) + const from = addDays(new Date(), estimationDate[0] + 3) + const to = addDays(new Date(), estimationDate[1] + 3) + + let etdText = `*Estimasi tiba ${formatDate(from)}` + + if (estimationDate[1] > estimationDate[0]) { + etdText += ` - ${formatDate(to)}` + } + + return etdText + } + + return '' +} + +const extractDuration = (text) => { + const matches = text.match(/\d+(?:-\d+)?/g) + + if (matches && matches.length === 1) { + const parts = matches[0].split('-') + const min = parseInt(parts[0]) + const max = parseInt(parts[1]) + + if (min === max) { + return min.toString() + } + + return matches[0] + } + + return '' +} + +const PickupAddress = ({ label }) => ( +
+
+
{label}
+
+
+

Indoteknik

+

+ Jl. Bandengan Utara Raya No.85, RT.3/RW.16, Penjaringan, Kec. Penjaringan, Kota Jkt Utara, + Daerah Khusus Ibukota Jakarta, Indonesia Kodepos : 14440 +

+

Telp : 021-2933 8828/29

+

Mobile : 0813 9000 7430

+
+
+) + +export default Checkout -- cgit v1.2.3 From 8b173abd19630b7cab5f0f562925c46e3f71d096 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Tue, 4 Jul 2023 13:38:33 +0700 Subject: promotion program --- src/lib/checkout/components/Checkout.jsx | 194 ++++++++++++++++++++----------- 1 file changed, 127 insertions(+), 67 deletions(-) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 09fdbd86..0eaab020 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -289,8 +289,8 @@ const Checkout = () => {
Grand Total
- {currencyFormat(cartCheckout?.grandTotal + - Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 + {currencyFormat( + cartCheckout?.grandTotal + Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 )}
@@ -398,73 +398,131 @@ const Checkout = () => { {products?.map((product) => ( - - -
- {product?.name} -
-
-
- {product?.parent?.name} -
-
- {product?.code}{' '} - {product?.attributes.length > 0 - ? `| ${product?.attributes.join(', ')}` - : ''} -
-
- Berat item : {product?.weight} Kg + <> + + +
+ {product?.name}
-
- - - - - - {product?.price?.discountPercentage > 0 && ( -
-
- {currencyFormat(product?.price?.price)} +
+
+ {product?.parent?.name}
-
- {product?.price?.discountPercentage}% +
+ {product?.code}{' '} + {product?.attributes.length > 0 + ? `| ${product?.attributes.join(', ')}` + : ''} +
+
+ Berat item : {product?.weight} Kg
- )} -
- {product.price.priceDiscount > 0 - ? currencyFormat(product?.price?.priceDiscount) - : 'Call For Price'} -
- - -
- {product.price.priceDiscount > 0 ? ( - currencyFormat(product?.price?.priceDiscount * product?.quantity) - ) : ( - - Call For Price{' '} - + + + + + + {product?.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(product?.price?.price)} +
+
+ {product?.price?.discountPercentage}% +
+
)} -
- - +
+ {product.price.priceDiscount > 0 + ? currencyFormat(product?.price?.priceDiscount) + : 'Call For Price'} +
+ + +
+ {product.price.priceDiscount > 0 ? ( + currencyFormat(product?.price?.priceDiscount * product?.quantity) + ) : ( + + Call For Price{' '} + + )} +
+ + + {product.program && + product.program.items && + product.program.items.map((item) => ( + <> + + +
+ {item.name} +
+
+
+ + {product.program.type.label} + +
+
+ {item.name} +
+
+ + + + + + {item?.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(product?.price?.price)} +
+
+ )} +
+ {item?.price.priceDiscount > 0 ? 'Gratis' : ''} +
+ + +
+ {item.price.priceDiscount > 0 ? 'Gratis' : ''} +
+ + + + + ))} + ))} @@ -487,7 +545,9 @@ const Checkout = () => {
Total Diskon
-
- {currencyFormat(cartCheckout?.totalDiscount)}
+
+ - {currencyFormat(cartCheckout?.totalDiscount)} +
Subtotal
@@ -511,8 +571,8 @@ const Checkout = () => {
Grand Total
- {currencyFormat(cartCheckout?.grandTotal + - Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 + {currencyFormat( + cartCheckout?.grandTotal + Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 )}
-- cgit v1.2.3 From 9272a07644a75d201753501cfff173b1260963ea Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Wed, 5 Jul 2023 09:29:46 +0700 Subject: cart, checkout dan nav bar mobile --- src/lib/checkout/components/Checkout.jsx | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 0eaab020..b30f7e43 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -270,6 +270,10 @@ const Checkout = () => {
Total Diskon
- {currencyFormat(cartCheckout?.totalDiscount)}
+
+
Total Hemat
+
- {currencyFormat(cartCheckout?.totalSavings)}
+
Subtotal
{currencyFormat(cartCheckout?.subtotal)}
@@ -549,6 +553,12 @@ const Checkout = () => { - {currencyFormat(cartCheckout?.totalDiscount)}
+
+
Total Hemat
+
+ - {currencyFormat(cartCheckout?.totalSavings)} +
+
Subtotal
{currencyFormat(cartCheckout?.subtotal)}
-- cgit v1.2.3 From 581334e8d077916c3a9ab87fd5b6e6b5126aba12 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Mon, 10 Jul 2023 10:00:33 +0700 Subject: add auth id --- src/lib/checkout/components/Checkout.jsx | 1 + 1 file changed, 1 insertion(+) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index b30f7e43..f5b27cfb 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -179,6 +179,7 @@ const Checkout = () => { let data = { partner_shipping_id: auth.partnerId, partner_invoice_id: auth.partnerId, + user_id : auth.id, order_line: JSON.stringify(productOrder), delivery_amount: biayaKirim, carrier_id: selectedCarrierId, -- cgit v1.2.3 From 502ea2700003e8959f3d81c8978126da0d3b9828 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Mon, 10 Jul 2023 10:31:42 +0700 Subject: button voucher --- src/lib/checkout/components/Checkout.jsx | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 07d9acb6..6cb735fe 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -578,6 +578,16 @@ const Checkout = () => { )}
+ +
+ + +

Dengan melakukan pembelian melalui website Indoteknik, saya menyetujui{' '} -- cgit v1.2.3 From bdb8aa884317fdca72a20989f73764fdde06f42e Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Mon, 10 Jul 2023 16:56:58 +0700 Subject: layouting --- src/lib/checkout/api/getVoucher.js | 8 ++ src/lib/checkout/components/Checkout.jsx | 134 +++++++++++++++++++++++++++++-- 2 files changed, 136 insertions(+), 6 deletions(-) create mode 100644 src/lib/checkout/api/getVoucher.js (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/api/getVoucher.js b/src/lib/checkout/api/getVoucher.js new file mode 100644 index 00000000..68185021 --- /dev/null +++ b/src/lib/checkout/api/getVoucher.js @@ -0,0 +1,8 @@ +import odooApi from '@/core/api/odooApi' + +const getVoucher = async () => { + const dataVoucher = await odooApi('GET', `/api/v1/voucher`) + return dataVoucher +} + +export default getVoucher diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 6cb735fe..629ec5bc 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -24,6 +24,7 @@ import whatsappUrl from '@/core/utils/whatsappUrl' import { createSlug } from '@/core/utils/slug' import BottomPopup from '@/core/components/elements/Popup/BottomPopup' import { gtagPurchase } from '@/core/utils/googleTag' +import getVoucher from '../api/getVoucher' const SELF_PICKUP_ID = 32 @@ -81,7 +82,13 @@ const Checkout = () => { const [selectedExpedisiService, setselectedExpedisiService] = useState(null) const [etd, setEtd] = useState(null) const [etdFix, setEtdFix] = useState(null) + const [bottomPopup, SetBottomPopup] = useState(null) + const [listVouchers, SetListVoucher] = useState(null) + const voucher = async () => { + let dataVoucher = await getVoucher() + SetListVoucher(dataVoucher) + } useEffect(() => { const loadExpedisi = async () => { let dataExpedisi = await ExpedisiList() @@ -93,8 +100,11 @@ const Checkout = () => { setExpedisi(dataExpedisi) } loadExpedisi() + voucher() }, []) + console.log('ini voucher', listVouchers) + useEffect(() => { const loadProducts = async () => { let variantIds = '' @@ -260,6 +270,95 @@ const Checkout = () => { return ( <> + SetBottomPopup(false)} title='Gunakan Promo'> +

+
+
+ +
+
+ +
+
+ +
+
+

Promo yang tersedia

+ {listVouchers?.map((item) => ( +
+
+
+ {item.name} +
+
+
+
+

{item.name}

+
+ {item.description} +
+
+
+ +
+
+
+

+ Kode Voucher :{' '} + {item.code} +

+
+
+
+

+ Voucher ini dapat anda gunakan untuk pengguna pertama{' '} +

+
+
+ + + Berakhir dalam {item.endTime} lagi !{' '} + + Lihat Detail + + +
+
+
+ ))} +
+
+
@@ -353,6 +452,22 @@ const Checkout = () => { )}
+ +
+ +
+ +
{/*

*) Belum termasuk biaya pengiriman

*/}

Dengan melakukan pembelian melalui website Indoteknik, saya menyetujui{' '} @@ -581,12 +696,19 @@ const Checkout = () => {


- +
+ +

Dengan melakukan pembelian melalui website Indoteknik, saya menyetujui{' '} -- cgit v1.2.3 From dc334fa49ad13959b6a0d572fd56a4cde38176fa Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Tue, 11 Jul 2023 15:29:03 +0700 Subject: get voucher --- src/lib/checkout/api/getVoucher.js | 7 +- src/lib/checkout/components/Checkout.jsx | 230 ++++++++++++++++++++++--------- 2 files changed, 168 insertions(+), 69 deletions(-) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/api/getVoucher.js b/src/lib/checkout/api/getVoucher.js index 68185021..03ac3d6d 100644 --- a/src/lib/checkout/api/getVoucher.js +++ b/src/lib/checkout/api/getVoucher.js @@ -1,8 +1,11 @@ import odooApi from '@/core/api/odooApi' -const getVoucher = async () => { +export const getVoucher = async () => { const dataVoucher = await odooApi('GET', `/api/v1/voucher`) return dataVoucher } -export default getVoucher +export const findVoucher = async (code) => { + const dataVoucher = await odooApi('GET', `/api/v1/voucher?code=${code}`) + return dataVoucher +} diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 629ec5bc..dcc00eb8 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -24,7 +24,7 @@ import whatsappUrl from '@/core/utils/whatsappUrl' import { createSlug } from '@/core/utils/slug' import BottomPopup from '@/core/components/elements/Popup/BottomPopup' import { gtagPurchase } from '@/core/utils/googleTag' -import getVoucher from '../api/getVoucher' +import { findVoucher, getVoucher } from '../api/getVoucher' const SELF_PICKUP_ID = 32 @@ -84,11 +84,22 @@ const Checkout = () => { const [etdFix, setEtdFix] = useState(null) const [bottomPopup, SetBottomPopup] = useState(null) const [listVouchers, SetListVoucher] = useState(null) + const [activeVoucher, SetActiveVoucher] = useState(null) + const [discountVoucher, SetDiscountVoucher] = useState(null) + const [codeVoucher, SetCodeVoucher] = useState(null) const voucher = async () => { let dataVoucher = await getVoucher() SetListVoucher(dataVoucher) } + const VoucherCode = async (code) => { + let dataVoucher = await findVoucher(code) + if (!dataVoucher) return + + let addNewLine = dataVoucher[0] + SetListVoucher((prevList) => [addNewLine, ...prevList]) + SetActiveVoucher(addNewLine.code) + } useEffect(() => { const loadExpedisi = async () => { let dataExpedisi = await ExpedisiList() @@ -103,7 +114,27 @@ const Checkout = () => { voucher() }, []) - console.log('ini voucher', listVouchers) + useEffect(() => { + if (!listVouchers) return + if (!activeVoucher) return + + let dataVoucherIndex = listVouchers.findIndex((vocuher) => vocuher.code == activeVoucher) + let dataActiveVocuher = listVouchers[dataVoucherIndex] + let countDiscount = 0 + + if (dataActiveVocuher.discountType === 'percentage') { + countDiscount = (totalAmount - totalDiscountAmount) * 0.1 + if ( + dataActiveVocuher.maxDiscountAmount > 0 && + countDiscount > dataActiveVocuher.maxDiscountAmount + ) { + countDiscount = dataActiveVocuher.maxDiscountAmount + } + } else { + countDiscount = dataActiveVocuher.discountAmount + } + SetDiscountVoucher(countDiscount) + }, [activeVoucher, listVouchers]) useEffect(() => { const loadProducts = async () => { @@ -266,92 +297,137 @@ const Checkout = () => { event_callback: midtrans }) } + + const handlingActivateCode = async () => { + VoucherCode(codeVoucher) + } const taxTotal = (totalAmount - totalDiscountAmount) * 0.11 return ( <> - SetBottomPopup(false)} title='Gunakan Promo'> + SetBottomPopup(false)} + title='Gunakan Promo' + >

SetCodeVoucher(e.target.value)} />
-
+ {codeVoucher && activeVoucher == codeVoucher ? ( +
+ + Voucher berhasil ditambahkan{' '} + +
+ ) : ( +
+ + Kode voucher salah / sudah tidak berlaku lagi. Coba voucher lainnya, ya. + +
+ )}

Promo yang tersedia

{listVouchers?.map((item) => ( -
-
-
- {item.name} -
-
-
-
-

{item.name}

-
- {item.description} +
+ {totalAmount - totalDiscountAmount < item.minPurchaseAmount && ( +
+ )} + +
+
+
+ {item.name} +
+
+
+
+

{item.name}

+
+ {item.description} +
+
+
+
-
- +
+
+

+ Kode Voucher :{' '} + {item.code} +

+

+ {activeVoucher === item.code && ( + + Voucher digunakan{' '} + + )} +

-
-

- Kode Voucher :{' '} - {item.code} -

-
-
-

- Voucher ini dapat anda gunakan untuk pengguna pertama{' '} -

-
-
- - - Berakhir dalam {item.endTime} lagi !{' '} - - Lihat Detail - - +
+

+ {totalAmount - totalDiscountAmount < item.minPurchaseAmount + ? 'Tambah ' + + currencyFormat( + item.minPurchaseAmount - (totalAmount - totalDiscountAmount) + ) + + ' untuk pakai promo ini' + : 'Voucher ini dapat anda gunakan untuk pengguna pertama'} +

+
+
+ + + Berakhir dalam {item.remainingTime}{' '} + lagi{' '} + +
@@ -462,9 +538,18 @@ const Checkout = () => { className='text-gray-900 flex items-center justify-center rounded-lg bg-white border font-medium border-gray-300 hover:bg-gray-100 py-2.5 h-[50px] w-[100%]' > % - - Hemat belanja dengan promo - + {activeVoucher ? ( +
+ + Kamu dapat potogan {discountVoucher} + + Voucher berhasil digunakan +
+ ) : ( + + Hemat belanja dengan promo + + )} {'>'}
@@ -700,12 +785,23 @@ const Checkout = () => {
-- cgit v1.2.3 From b3855694c2723168d1c7ad949d892649fff220b8 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Tue, 11 Jul 2023 17:05:43 +0700 Subject: find voucher --- src/lib/checkout/components/Checkout.jsx | 40 ++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 5 deletions(-) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index dcc00eb8..f19b6054 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -87,6 +87,8 @@ const Checkout = () => { const [activeVoucher, SetActiveVoucher] = useState(null) const [discountVoucher, SetDiscountVoucher] = useState(null) const [codeVoucher, SetCodeVoucher] = useState(null) + const [findCodeVoucher, SetFindVoucher] = useState(null) + const [selisihHargaCode, SetSelisihHargaCode] = useState(null) const voucher = async () => { let dataVoucher = await getVoucher() @@ -94,9 +96,21 @@ const Checkout = () => { } const VoucherCode = async (code) => { let dataVoucher = await findVoucher(code) - if (!dataVoucher) return + if (dataVoucher.length <= 0) { + SetFindVoucher(1) + return + } let addNewLine = dataVoucher[0] + if (totalAmount - totalDiscountAmount < addNewLine.minPurchaseAmount) { + SetSelisihHargaCode( + currencyFormat(addNewLine.minPurchaseAmount - (totalAmount - totalDiscountAmount)) + ) + SetFindVoucher(2) + return + } else { + SetFindVoucher(3) + } SetListVoucher((prevList) => [addNewLine, ...prevList]) SetActiveVoucher(addNewLine.code) } @@ -301,6 +315,14 @@ const Checkout = () => { const handlingActivateCode = async () => { VoucherCode(codeVoucher) } + + const handleUseVoucher = async (code) => { + SetActiveVoucher(code) + SetFindVoucher(null) + // document.getElementById('uniqCode').val('') + } + + console.log('ini find voucher', findCodeVoucher) const taxTotal = (totalAmount - totalDiscountAmount) * 0.11 return ( @@ -334,19 +356,27 @@ const Checkout = () => {
- {codeVoucher && activeVoucher == codeVoucher ? ( + {findCodeVoucher === 3 && activeVoucher === codeVoucher && (
Voucher berhasil ditambahkan{' '}
- ) : ( + )} + {findCodeVoucher === 1 && (
- + Kode voucher salah / sudah tidak berlaku lagi. Coba voucher lainnya, ya.
)} + {findCodeVoucher === 2 && ( +
+ + {'Tambah ' + selisihHargaCode + ' untuk pakai promo ini'} + +
+ )}
@@ -374,7 +404,7 @@ const Checkout = () => {
@@ -351,6 +361,7 @@ const Checkout = () => { className='btn-solid-red flex-1 md:flex-none rounded-md' type='button' onClick={() => handlingActivateCode()} + disabled={buttonTerapkan} > Terapkan @@ -380,7 +391,16 @@ const Checkout = () => {
-

Promo yang tersedia

+ {!listVouchers ? ( +
+
+

Tidak ada voucher tersedia

+

Maaf, saat ini tidak ada voucher yang tersedia.

+
+
+ ) : ( +

Promo yang tersedia

+ )} {listVouchers?.map((item) => (
{totalAmount - totalDiscountAmount < item.minPurchaseAmount && ( @@ -389,7 +409,7 @@ const Checkout = () => {
-
+
{item.name}
@@ -528,9 +548,15 @@ const Checkout = () => {
{currencyFormat(totalAmount)}
-
Total Diskon
+
Diskon Produk
- {currencyFormat(totalDiscountAmount)}
+ {activeVoucher && ( +
+
Diskon Voucher
+
- {currencyFormat(discountVoucher)}
+
+ )}
Subtotal
{currencyFormat(totalAmount - totalDiscountAmount)}
@@ -552,7 +578,8 @@ const Checkout = () => {
{currencyFormat( totalAmount - - totalDiscountAmount + + totalDiscountAmount - + discountVoucher + taxTotal + Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 )} @@ -565,22 +592,33 @@ const Checkout = () => {
{/*

*) Belum termasuk biaya pengiriman

*/} @@ -778,9 +816,15 @@ const Checkout = () => {
Total Diskon
- {currencyFormat(totalDiscountAmount)}
+ {activeVoucher && ( +
+
Diskon Voucher
+
- {currencyFormat(discountVoucher)}
+
+ )}
Subtotal
-
{currencyFormat(totalAmount - totalDiscountAmount)}
+
{currencyFormat(totalAmount - totalDiscountAmount - discountVoucher)}
PPN 11%
@@ -802,7 +846,8 @@ const Checkout = () => {
{currencyFormat( totalAmount - - totalDiscountAmount + + totalDiscountAmount - + discountVoucher + taxTotal + Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 )} @@ -815,9 +860,15 @@ const Checkout = () => {
-- cgit v1.2.3 From c2be9e77d22840eb33142ea2e694c3278613c4ef Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Wed, 12 Jul 2023 11:49:53 +0700 Subject: checkout --- src/lib/checkout/components/Checkout.jsx | 80 ++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 34 deletions(-) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 1763ae5b..6990b420 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -104,7 +104,7 @@ const Checkout = () => { let addNewLine = dataVoucher[0] let checkList = listVouchers.findIndex((voucher) => voucher.code == addNewLine.code) - if(checkList > 0) return + if (checkList > 0) return if (totalAmount - totalDiscountAmount < addNewLine.minPurchaseAmount) { SetSelisihHargaCode( currencyFormat(addNewLine.minPurchaseAmount - (totalAmount - totalDiscountAmount)) @@ -132,25 +132,34 @@ const Checkout = () => { voucher() }, []) - useEffect(() => { - if (!listVouchers) return - if (!activeVoucher) return + const hitungDiscountVoucher = (code) => { + let dataVoucherIndex = listVouchers.findIndex((voucher) => voucher.code == code) + let dataActiveVoucher = listVouchers[dataVoucherIndex] - let dataVoucherIndex = listVouchers.findIndex((voucher) => voucher.code == activeVoucher) - let dataActiveVocuher = listVouchers[dataVoucherIndex] + console.log('ini data active', dataActiveVoucher, code, dataVoucherIndex) let countDiscount = 0 - if (dataActiveVocuher.discountType === 'percentage') { + if (dataActiveVoucher.discountType === 'percentage') { countDiscount = (totalAmount - totalDiscountAmount) * 0.1 if ( - dataActiveVocuher.maxDiscountAmount > 0 && - countDiscount > dataActiveVocuher.maxDiscountAmount + dataActiveVoucher.maxDiscountAmount > 0 && + countDiscount > dataActiveVoucher.maxDiscountAmount ) { - countDiscount = dataActiveVocuher.maxDiscountAmount + countDiscount = dataActiveVoucher.maxDiscountAmount } } else { - countDiscount = dataActiveVocuher.discountAmount + countDiscount = dataActiveVoucher.discountAmount } + + return countDiscount + } + + useEffect(() => { + if (!listVouchers) return + if (!activeVoucher) return + + const countDiscount = hitungDiscountVoucher(activeVoucher) + SetDiscountVoucher(countDiscount) }, [activeVoucher, listVouchers]) @@ -417,7 +426,7 @@ const Checkout = () => {

{item.name}

- {item.description} + {item.description}
@@ -455,7 +464,8 @@ const Checkout = () => { item.minPurchaseAmount - (totalAmount - totalDiscountAmount) ) + ' untuk pakai promo ini' - : 'Voucher ini dapat anda gunakan untuk pengguna pertama'} + : 'Potensi potongan sebesar ' + + currencyFormat(hitungDiscountVoucher(item.code))}


@@ -559,7 +569,7 @@ const Checkout = () => { )}
Subtotal
-
{currencyFormat(totalAmount - totalDiscountAmount)}
+
{currencyFormat(totalAmount - totalDiscountAmount - discountVoucher)}
PPN 11%
@@ -862,27 +872,29 @@ const Checkout = () => { onClick={() => SetBottomPopup(true)} className='text-gray-900 p-3 flex items-center justify-between rounded-lg bg-white border font-medium border-gray-300 hover:bg-gray-100 py-2.5 h-[50px] w-[100%]' > - - {''} - - {activeVoucher ? ( -
-
- Hemat {currencyFormat(discountVoucher)} -
-
- Voucher berhasil digunakan -
-
- ) : ( - - Hemat belanja dengan promo +
+ + {''} - )} + {activeVoucher ? ( +
+
+ Hemat {currencyFormat(discountVoucher)} +
+
+ Voucher berhasil digunakan +
+
+ ) : ( + + Hemat belanja dengan promo + + )} +
{'>'}
-- cgit v1.2.3 From 3f890e6d482cefba37014e021cb4c2b8d5de2a9d Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Wed, 12 Jul 2023 14:31:07 +0700 Subject: cr --- src/lib/checkout/components/Checkout.jsx | 34 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 6990b420..27cdda76 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -17,6 +17,7 @@ import { useRouter } from 'next/router' import VariantGroupCard from '@/lib/variant/components/VariantGroupCard' import axios from 'axios' import Image from '@/core/components/elements/Image/Image' +import imageNext from 'next/image' import MobileView from '@/core/components/views/MobileView' import DesktopView from '@/core/components/views/DesktopView' import ExpedisiList from '../api/ExpedisiList' @@ -136,15 +137,11 @@ const Checkout = () => { let dataVoucherIndex = listVouchers.findIndex((voucher) => voucher.code == code) let dataActiveVoucher = listVouchers[dataVoucherIndex] - console.log('ini data active', dataActiveVoucher, code, dataVoucherIndex) let countDiscount = 0 if (dataActiveVoucher.discountType === 'percentage') { - countDiscount = (totalAmount - totalDiscountAmount) * 0.1 - if ( - dataActiveVoucher.maxDiscountAmount > 0 && - countDiscount > dataActiveVoucher.maxDiscountAmount - ) { + countDiscount = (totalAmount - totalDiscountAmount) * (dataActiveVoucher.discountAmount/100) + if (dataActiveVoucher.maxDiscountAmount > 0 && countDiscount > dataActiveVoucher.maxDiscountAmount) { countDiscount = dataActiveVoucher.maxDiscountAmount } } else { @@ -331,10 +328,14 @@ const Checkout = () => { } const handleUseVoucher = async (code) => { - SetActiveVoucher(code) - SetFindVoucher(null) - document.getElementById('uniqCode').value = '' - SetButtonTerapkan(false) + if(code === activeVoucher){ + SetActiveVoucher(null) + }else{ + SetActiveVoucher(code) + SetFindVoucher(null) + document.getElementById('uniqCode').value = '' + SetButtonTerapkan(false) + } } const onChangeCodeVoucher = async (e) => { @@ -354,7 +355,7 @@ const Checkout = () => { >
-
+
{
)} -
+
{!listVouchers ? (
@@ -418,7 +419,7 @@ const Checkout = () => {
-
+
{item.name}
@@ -434,9 +435,8 @@ const Checkout = () => { className='btn-solid-red w-[102px] md:flex-none rounded-md' type='button' onClick={() => handleUseVoucher(item.code)} - disabled={activeVoucher === item.code} > - {activeVoucher === item.code ? 'Terpakai' : 'Pakai'} + {activeVoucher === item.code ? 'Batal' : 'Pakai'}
@@ -609,7 +609,7 @@ const Checkout = () => { {''} {activeVoucher ? ( @@ -823,7 +823,7 @@ const Checkout = () => {
{currencyFormat(totalAmount)}
-
Total Diskon
+
Diskon Produk
- {currencyFormat(totalDiscountAmount)}
{activeVoucher && ( -- cgit v1.2.3 From b886fcf2dbc9114bc2e2347e3d4bf5299ed43d3b Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Fri, 14 Jul 2023 09:26:08 +0700 Subject: toggle on off --- src/lib/checkout/components/Checkout.jsx | 62 +++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 21 deletions(-) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 27cdda76..78d61770 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -105,7 +105,7 @@ const Checkout = () => { let addNewLine = dataVoucher[0] let checkList = listVouchers.findIndex((voucher) => voucher.code == addNewLine.code) - if (checkList > 0) return + if (checkList >= 0) return if (totalAmount - totalDiscountAmount < addNewLine.minPurchaseAmount) { SetSelisihHargaCode( currencyFormat(addNewLine.minPurchaseAmount - (totalAmount - totalDiscountAmount)) @@ -140,8 +140,11 @@ const Checkout = () => { let countDiscount = 0 if (dataActiveVoucher.discountType === 'percentage') { - countDiscount = (totalAmount - totalDiscountAmount) * (dataActiveVoucher.discountAmount/100) - if (dataActiveVoucher.maxDiscountAmount > 0 && countDiscount > dataActiveVoucher.maxDiscountAmount) { + countDiscount = (totalAmount - totalDiscountAmount) * (dataActiveVoucher.discountAmount / 100) + if ( + dataActiveVoucher.maxDiscountAmount > 0 && + countDiscount > dataActiveVoucher.maxDiscountAmount + ) { countDiscount = dataActiveVoucher.maxDiscountAmount } } else { @@ -327,10 +330,17 @@ const Checkout = () => { VoucherCode(codeVoucher) } - const handleUseVoucher = async (code) => { - if(code === activeVoucher){ - SetActiveVoucher(null) - }else{ + const handleUseVoucher = async (code, isCheck) => { + if (isCheck) { + if (code === activeVoucher) { + SetActiveVoucher(null) + } else { + SetActiveVoucher(code) + SetFindVoucher(null) + document.getElementById('uniqCode').value = '' + SetButtonTerapkan(false) + } + } else { SetActiveVoucher(code) SetFindVoucher(null) document.getElementById('uniqCode').value = '' @@ -343,6 +353,13 @@ const Checkout = () => { SetButtonTerapkan(false) } + const [isChecked, setIsChecked] = useState(false) + + const ToggleSwitch = (code) => { + setIsChecked(!isChecked) + handleUseVoucher(code, !isChecked) + } + const taxTotal = (totalAmount - totalDiscountAmount - discountVoucher) * 0.11 return ( @@ -409,21 +426,21 @@ const Checkout = () => {
) : ( -

Promo yang tersedia

+

Promo Khusus Untuk {auth.name}

)} {listVouchers?.map((item) => (
{totalAmount - totalDiscountAmount < item.minPurchaseAmount && ( -
+
)}
-
+
{item.name}
-
+

{item.name}

@@ -431,24 +448,27 @@ const Checkout = () => {
- +

-

+

Kode Voucher :{' '} {item.code}

-

+

{activeVoucher === item.code && ( - + Voucher digunakan{' '} )} -- cgit v1.2.3 From e3679ab4a7c58f6b8b9ac661b3adaa8d2dc0b0f2 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Fri, 14 Jul 2023 13:24:57 +0700 Subject: bug fixing button lanjut pembayaran --- src/lib/checkout/components/Checkout.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 78d61770..098d1e66 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -261,6 +261,9 @@ const Checkout = () => { useEffect(() => { if (selectedExpedisi) { let serviceType = selectedExpedisi.split(',') + if(serviceType[0] === 0){ + setSelectedExpedisi(0) + } setselectedCarrier(serviceType[0]) setselectedCarrierId(serviceType[1]) setListServiceExpedisi([]) @@ -411,7 +414,7 @@ const Checkout = () => { {findCodeVoucher === 2 && (

- {'Tambah ' + selisihHargaCode + ' untuk pakai promo ini'} + Tambah {selisihHargaCode} untuk pakai promo ini
)} -- cgit v1.2.3 From e39d3b0082e83ad08044918f0b6d8e977223100d Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Mon, 17 Jul 2023 16:30:17 +0700 Subject: feedback UAT --- src/lib/checkout/components/Checkout.jsx | 73 +++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 20 deletions(-) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 098d1e66..0c7a35fa 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -91,6 +91,9 @@ const Checkout = () => { const [findCodeVoucher, SetFindVoucher] = useState(null) const [selisihHargaCode, SetSelisihHargaCode] = useState(null) const [buttonTerapkan, SetButtonTerapkan] = useState(false) + const [checkoutValidation, setCheckoutValidation] = useState(false) + + const expedisiValidation = useRef(null) const voucher = async () => { let dataVoucher = await getVoucher() @@ -212,6 +215,7 @@ const Checkout = () => { }, [products]) useEffect(() => { + setCheckoutValidation(false) const loadServiceRajaOngkir = async () => { const body = { origin: 2127, @@ -261,7 +265,7 @@ const Checkout = () => { useEffect(() => { if (selectedExpedisi) { let serviceType = selectedExpedisi.split(',') - if(serviceType[0] === 0){ + if (serviceType[0] === 0) { setSelectedExpedisi(0) } setselectedCarrier(serviceType[0]) @@ -281,6 +285,21 @@ const Checkout = () => { toast.error('Maksimal ukuran file adalah 5MB', { position: 'bottom-center' }) return } + if (selectedExpedisi === 0) { + setCheckoutValidation(true) + if (expedisiValidation.current) { + const position = expedisiValidation.current.getBoundingClientRect() + window.scrollTo({ + top: position.top - 300 + window.pageYOffset, + behavior: 'smooth' + }) + } + return + } + if (selectedCarrier != 1 && biayaKirim == 0) { + toast.error('Maaf, layanan tidak tersedia. Mohon pilih expedisi lain.') + return + } setIsLoading(true) const productOrder = products.map((product) => ({ product_id: product.id, @@ -337,6 +356,7 @@ const Checkout = () => { if (isCheck) { if (code === activeVoucher) { SetActiveVoucher(null) + SetDiscountVoucher(0) } else { SetActiveVoucher(code) SetFindVoucher(null) @@ -414,7 +434,8 @@ const Checkout = () => { {findCodeVoucher === 2 && (
- Tambah {selisihHargaCode} untuk pakai promo ini + Tambah {selisihHargaCode} untuk pakai promo + ini
)} @@ -471,9 +492,7 @@ const Checkout = () => {

{activeVoucher === item.code && ( - - Voucher digunakan{' '} - + Voucher digunakan )}

@@ -556,6 +575,8 @@ const Checkout = () => { listExpedisi={listExpedisi} setSelectedExpedisi={setSelectedExpedisi} checkWeigth={checkWeigth} + checkoutValidation={checkoutValidation} + expedisiValidation={expedisiValidation} /> { @@ -738,6 +757,8 @@ const Checkout = () => { listExpedisi={listExpedisi} setSelectedExpedisi={setSelectedExpedisi} checkWeigth={checkWeigth} + checkoutValidation={checkoutValidation} + expedisiValidation={expedisiValidation} /> { @@ -1028,13 +1042,24 @@ const SectionValidation = ({ address }) => ) -const SectionExpedisi = ({ address, listExpedisi, setSelectedExpedisi, checkWeigth }) => +const SectionExpedisi = ({ + address, + listExpedisi, + setSelectedExpedisi, + checkWeigth, + checkoutValidation, + expedisiValidation +}) => address?.rajaongkirCityId > 0 && ( -
+
Pilih Expedisi :
-
- setSelectedExpedisi(e.target.value)} + required + > {checkWeigth != true && @@ -1049,7 +1074,15 @@ const SectionExpedisi = ({ address, listExpedisi, setSelectedExpedisi, checkWeig ))} + {checkoutValidation && ( + * Silahkan pilih expedisi + )}
+
{checkWeigth == true && (

-- cgit v1.2.3 From 91f5a1251c5eac261ac5a1997df581f5ccd8e868 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Tue, 18 Jul 2023 17:03:07 +0700 Subject: proses merging --- src/lib/checkout/components/Checkout.jsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 9c026372..44e0b0b6 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -345,7 +345,9 @@ const Checkout = () => { handleUseVoucher(code, !isChecked) } - const taxTotal = (totalAmount - totalDiscountAmount - discountVoucher) * 0.11 + console.log('ini adalah', listVouchers) + + // const taxTotal = (totalAmount - totalDiscountAmount - discountVoucher) * 0.11 return ( <> @@ -565,7 +567,7 @@ const Checkout = () => {

Diskon Produk
-
- {currencyFormat(totalDiscountAmount)}
+
- {currencyFormat(cartCheckout?.totalDiscount )}
{activeVoucher && (
@@ -884,7 +886,7 @@ const Checkout = () => {
Diskon Produk
-
- {currencyFormat(cartCheckout?.totalDiscount)}
+
- {currencyFormat(cartCheckout?.totalDiscount )}
{activeVoucher && (
@@ -1111,7 +1113,7 @@ const SectionExpedisi = ({
) -const SectionListService = ({ listserviceExpedisi, setSelectedServiceType }) => +const SectionListService = ({ listserviceExpedisi, setSelectedServiceType }) => listserviceExpedisi?.length > 0 && ( <>
-- cgit v1.2.3 From c210cdc221db85f6711af92442808e15fc2eb10e Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Thu, 20 Jul 2023 16:41:30 +0700 Subject: voucher get perhitungan dari api --- src/lib/checkout/api/checkoutApi.js | 9 +- src/lib/checkout/api/getVoucher.js | 8 +- src/lib/checkout/components/Checkout.jsx | 416 ++++++++++++++++++------------- 3 files changed, 254 insertions(+), 179 deletions(-) (limited to 'src/lib/checkout') diff --git a/src/lib/checkout/api/checkoutApi.js b/src/lib/checkout/api/checkoutApi.js index 94de8721..0d0cc918 100644 --- a/src/lib/checkout/api/checkoutApi.js +++ b/src/lib/checkout/api/checkoutApi.js @@ -11,9 +11,14 @@ export const checkoutApi = async ({ data }) => { return dataCheckout } -export const getProductsCheckout = async () => { +export const getProductsCheckout = async (voucher) => { const id = getAuth()?.id - const products = await odooApi('GET',`/api/v1/user/${id}/sale_order/checkout`) + let products + if(voucher){ + products = await odooApi('GET',`/api/v1/user/${id}/sale_order/checkout?voucher=${voucher}`) + }else{ + products = await odooApi('GET',`/api/v1/user/${id}/sale_order/checkout`) + } return products } diff --git a/src/lib/checkout/api/getVoucher.js b/src/lib/checkout/api/getVoucher.js index 03ac3d6d..57d8acf5 100644 --- a/src/lib/checkout/api/getVoucher.js +++ b/src/lib/checkout/api/getVoucher.js @@ -1,11 +1,11 @@ import odooApi from '@/core/api/odooApi' -export const getVoucher = async () => { - const dataVoucher = await odooApi('GET', `/api/v1/voucher`) +export const getVoucher = async (id) => { + const dataVoucher = await odooApi('GET', `/api/v1/user/${id}/voucher`) return dataVoucher } -export const findVoucher = async (code) => { - const dataVoucher = await odooApi('GET', `/api/v1/voucher?code=${code}`) +export const findVoucher = async (code, id) => { + const dataVoucher = await odooApi('GET', `/api/v1/user/${id}/voucher?code=${code}`) return dataVoucher } diff --git a/src/lib/checkout/components/Checkout.jsx b/src/lib/checkout/components/Checkout.jsx index 44e0b0b6..3686ced9 100644 --- a/src/lib/checkout/components/Checkout.jsx +++ b/src/lib/checkout/components/Checkout.jsx @@ -26,6 +26,7 @@ import BottomPopup from '@/core/components/elements/Popup/BottomPopup' import { useQuery } from 'react-query' import { gtagPurchase } from '@/core/utils/googleTag' import { findVoucher, getVoucher } from '../api/getVoucher' +import LogoSpinner from '@/core/components/elements/Spinner/LogoSpinner' const SELF_PICKUP_ID = 32 @@ -35,7 +36,12 @@ const { getProductsCheckout } = require('../api/checkoutApi') const Checkout = () => { const router = useRouter() const auth = useAuth() - const { data: cartCheckout } = useQuery('cartCheckout', getProductsCheckout) + + const [activeVoucher, SetActiveVoucher] = useState(null) + + const { data: cartCheckout } = useQuery('cartCheckout-' + activeVoucher, () => + getProductsCheckout(activeVoucher) + ) const [selectedAddress, setSelectedAddress] = useState({ shipping: null, @@ -88,7 +94,6 @@ const Checkout = () => { const [etdFix, setEtdFix] = useState(null) const [bottomPopup, SetBottomPopup] = useState(null) const [listVouchers, SetListVoucher] = useState(null) - const [activeVoucher, SetActiveVoucher] = useState(null) const [discountVoucher, SetDiscountVoucher] = useState(0) const [codeVoucher, SetCodeVoucher] = useState(null) const [findCodeVoucher, SetFindVoucher] = useState(null) @@ -99,11 +104,11 @@ const Checkout = () => { const expedisiValidation = useRef(null) const voucher = async () => { - let dataVoucher = await getVoucher() + let dataVoucher = await getVoucher(auth?.id) SetListVoucher(dataVoucher) } const VoucherCode = async (code) => { - let dataVoucher = await findVoucher(code) + let dataVoucher = await findVoucher(code, auth.id) if (dataVoucher.length <= 0) { SetFindVoucher(1) return @@ -111,11 +116,18 @@ const Checkout = () => { let addNewLine = dataVoucher[0] let checkList = listVouchers.findIndex((voucher) => voucher.code == addNewLine.code) - if (checkList >= 0) return - if (totalAmount - totalDiscountAmount < addNewLine.minPurchaseAmount) { - SetSelisihHargaCode( - currencyFormat(addNewLine.minPurchaseAmount - (totalAmount - totalDiscountAmount)) - ) + if (checkList >= 0) { + if (listVouchers[checkList].canApply) { + ToggleSwitch(code) + SetCodeVoucher(null) + } else { + SetSelisihHargaCode(listVouchers[checkList].differenceToApply) + SetFindVoucher(2) + } + return + } + if (cartCheckout?.subtotal < addNewLine.minPurchaseAmount) { + SetSelisihHargaCode(currencyFormat(addNewLine.minPurchaseAmount - cartCheckout?.subtotal)) SetFindVoucher(2) return } else { @@ -125,6 +137,11 @@ const Checkout = () => { SetListVoucher((prevList) => [addNewLine, ...prevList]) SetActiveVoucher(addNewLine.code) } + + useEffect(() => { + SetFindVoucher(null) + }, [bottomPopup]) + useEffect(() => { const loadExpedisi = async () => { let dataExpedisi = await ExpedisiList() @@ -136,7 +153,7 @@ const Checkout = () => { setExpedisi(dataExpedisi) } loadExpedisi() - voucher() + // voucher() }, []) const hitungDiscountVoucher = (code) => { @@ -146,7 +163,7 @@ const Checkout = () => { let countDiscount = 0 if (dataActiveVoucher.discountType === 'percentage') { - countDiscount = (totalAmount - totalDiscountAmount) * (dataActiveVoucher.discountAmount / 100) + countDiscount = cartCheckout?.subtotal * (dataActiveVoucher.discountAmount / 100) if ( dataActiveVoucher.maxDiscountAmount > 0 && countDiscount > dataActiveVoucher.maxDiscountAmount @@ -269,7 +286,7 @@ const Checkout = () => { let data = { partner_shipping_id: auth.partnerId, partner_invoice_id: auth.partnerId, - user_id : auth.id, + user_id: auth.id, order_line: JSON.stringify(productOrder), delivery_amount: biayaKirim, carrier_id: selectedCarrierId, @@ -299,11 +316,7 @@ const Checkout = () => { gtag('event', 'conversion', { send_to: 'AW-954540379/nDymCL3BhaQYENvClMcD', - value: - totalAmount - - totalDiscountAmount + - taxTotal + - Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000, + value: cartCheckout?.grandTotal + Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000, currency: 'IDR', transaction_id: isCheckouted.id, event_callback: midtrans @@ -345,8 +358,6 @@ const Checkout = () => { handleUseVoucher(code, !isChecked) } - console.log('ini adalah', listVouchers) - // const taxTotal = (totalAmount - totalDiscountAmount - discountVoucher) * 0.11 return ( @@ -418,7 +429,7 @@ const Checkout = () => { )} {listVouchers?.map((item) => (
- {totalAmount - totalDiscountAmount < item.minPurchaseAmount && ( + {item.canApply === false && (
)} @@ -464,11 +475,9 @@ const Checkout = () => {

- {totalAmount - totalDiscountAmount < item.minPurchaseAmount + {item.canApply === false ? 'Tambah ' + - currencyFormat( - item.minPurchaseAmount - (totalAmount - totalDiscountAmount) - ) + + currencyFormat(item.differenceToApply) + ' untuk pakai promo ini' : 'Potensi potongan sebesar ' + currencyFormat(hitungDiscountVoucher(item.code))} @@ -567,7 +576,7 @@ const Checkout = () => {

Diskon Produk
-
- {currencyFormat(cartCheckout?.totalDiscount )}
+
- {currencyFormat(cartCheckout?.totalDiscount)}
{activeVoucher && (
@@ -738,133 +747,149 @@ const Checkout = () => { - {products?.map((product) => ( - <> - - -
- {product?.name} -
-
-
- {product?.parent?.name} -
-
- {product?.code}{' '} - {product?.attributes.length > 0 - ? `| ${product?.attributes.join(', ')}` - : ''} -
-
- Berat item : {product?.weight} Kg + {!products ? ( + + +
+
+
+
+
+
+ + + ) : ( + products?.map((product) => ( + <> + + +
+ {product?.name}
-
- - - - - - {product?.price?.discountPercentage > 0 && ( -
-
- {currencyFormat(product?.price?.price)} +
+
+ {product?.parent?.name}
-
- {product?.price?.discountPercentage}% +
+ {product?.code}{' '} + {product?.attributes.length > 0 + ? `| ${product?.attributes.join(', ')}` + : ''} +
+
+ Berat item : {product?.weight} Kg
- )} -
- {product.price.priceDiscount > 0 - ? currencyFormat(product?.price?.priceDiscount) - : 'Call For Price'} -
- - -
- {product.price.priceDiscount > 0 ? ( - currencyFormat(product?.price?.priceDiscount * product?.quantity) - ) : ( - - Call For Price{' '} - - )} -
- - - {product.program && - product.program.items && - product.program.items.map((item) => ( - <> - - -
- {item.name} + + + + + + {product?.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(product?.price?.price)} +
+
+ {product?.price?.discountPercentage}%
-
-
- - {product.program.type.label} - +
+ )} +
+ {product.price.priceDiscount > 0 + ? currencyFormat(product?.price?.priceDiscount) + : 'Call For Price'} +
+ + +
+ {product.price.priceDiscount > 0 ? ( + currencyFormat(product?.price?.priceDiscount * product?.quantity) + ) : ( + + Call For Price{' '} + + )} +
+ + + {product.program && + product.program.items && + product.program.items.map((item) => ( + <> + + +
+ {item.name}
-
- {item.name} +
+
+ + {product.program.type.label} + +
+
{item.name}
-
- - - - - - {item?.price?.discountPercentage > 0 && ( -
-
- {currencyFormat(product?.price?.price)} + + + + + + {item?.price?.discountPercentage > 0 && ( +
+
+ {currencyFormat(product?.price?.price)} +
+ )} +
+ {item?.price.priceDiscount > 0 ? 'Gratis' : ''}
- )} -
- {item?.price.priceDiscount > 0 ? 'Gratis' : ''} -
- - -
- {item.price.priceDiscount > 0 ? 'Gratis' : ''} -
- - - - - ))} - - ))} + + +
+ {item.price.priceDiscount > 0 ? 'Gratis' : ''} +
+ + + + + ))} + + )) + )}
@@ -878,38 +903,80 @@ const Checkout = () => {

- -
-
-
Total Belanja
-
{currencyFormat(cartCheckout?.totalPurchase)}
-
-
-
Diskon Produk
-
- {currencyFormat(cartCheckout?.totalDiscount )}
+ {!cartCheckout ? ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Loading...
- {activeVoucher && ( + ) : ( +
-
Diskon Voucher
-
- {currencyFormat(discountVoucher)}
+
Total Belanja
+
{currencyFormat(cartCheckout?.totalPurchase)}
- )} -
-
Subtotal
-
{currencyFormat(cartCheckout?.subtotal)}
-
-
-
PPN 11%
-
{currencyFormat(cartCheckout?.tax)}
-
-
-
- Biaya Kirim -

{etdFix}

+
+
Diskon Produk
+
+ - {currencyFormat(cartCheckout?.totalDiscount)} +
+
+ {activeVoucher && ( +
+
Diskon Voucher
+
- {currencyFormat(discountVoucher)}
+
+ )} +
+
Subtotal
+
{currencyFormat(cartCheckout?.subtotal)}
+
+
+
PPN 11%
+
{currencyFormat(cartCheckout?.tax)}
+
+
+
+ Biaya Kirim +

{etdFix}

+
+
+ {currencyFormat(Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000)} +
-
{currencyFormat(Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000)}
-
+ )}
@@ -927,7 +994,10 @@ const Checkout = () => {
- Loading...
) : (
@@ -979,15 +1124,27 @@ const Checkout = () => { )}
- -
-
Grand Total
-
- {currencyFormat( - cartCheckout?.grandTotal + Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 - )} + {!cartCheckout ? ( +
+
+ {' '} +
+
+
+
+
-
+ ) : ( +
+
Grand Total
+
+ {currencyFormat( + cartCheckout?.grandTotal + + Math.round(parseInt(biayaKirim * 1.1) / 1000) * 1000 + )} +
+
+ )}
@@ -1159,7 +1316,7 @@ const SectionExpedisi = ({ ))} {checkoutValidation && ( - * Silahkan pilih expedisi + *silahkan pilih expedisi )}