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 { 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 whatsappUrl from '@/core/utils/whatsappUrl' import { createSlug } from '@/core/utils/slug' 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 [priceCheck, setPriceCheck] = useState(false) 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 products.forEach((product) => { calculateTotalAmount += product.price.price * product.quantity calculateTotalDiscountAmount += (product.price.price - product.price.priceDiscount) * product.quantity }) setTotalAmount(calculateTotalAmount) setTotalDiscountAmount(calculateTotalDiscountAmount) } }, [products]) 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), 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
{products && }
Ringkasan Pesanan
{products?.length} Barang

Total Belanja
{currencyFormat(totalAmount)}
Total Diskon
- {currencyFormat(totalDiscountAmount)}
Subtotal
{currencyFormat(totalAmount - totalDiscountAmount)}
PPN 11%
{currencyFormat(taxTotal)}

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

*) 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.
)}
Detail Pesanan
{products?.map((product) => ( ))}
Nama Produk Jumlah Harga Subtotal
{product?.name}
{product?.parent?.name}
{product?.code}{' '} {product?.attributes.length > 0 ? `| ${product?.attributes.join(', ')}` : ''}
{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)}

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

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 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

*) Belum termasuk biaya pengiriman

) export default Checkout