import { ExclamationCircleIcon } from "@heroicons/react/24/solid"; import { useEffect, useState } from "react"; import Alert from "@/components/elements/Alert"; import AppBar from "@/components/layouts/AppBar"; import Layout from "@/components/layouts/Layout"; import LineDivider from "@/components/elements/LineDivider"; import Link from "@/components/elements/Link"; import ProgressBar from "@/components/elements/ProgressBar"; import Spinner from "@/components/elements/Spinner"; import apiOdoo from "@/core/utils/apiOdoo"; import { useAuth } from "@/core/utils/auth"; import { deleteItemCart, getCart } from "@/core/utils/cart"; import currencyFormat from "@/core/utils/currencyFormat"; import { getItemAddress } from "@/core/utils/address"; import { useRouter } from "next/router"; import WithAuth from "@/components/auth/WithAuth"; import { toast } from "react-hot-toast"; import getFileBase64 from "@/core/utils/getFileBase64"; import VariantCard from "@/components/variants/VariantCard"; export default function Checkout() { const router = useRouter(); const { product_id, qty } = router.query; const [ auth ] = useAuth(); const [ addresses, setAddresses ] = useState(null); const [ poNumber, setPoNumber ] = useState(''); const [ poFile, setPoFile ] = useState(''); const [ selectedAddress, setSelectedAddress ] = useState({ shipping: null, invoicing: null }); const [ selectedPayment, setSelectedPayment ] = useState(null); const [ products, setProducts ] = useState(null); const [ totalAmount, setTotalAmount ] = useState(0); const [ totalDiscountAmount, setTotalDiscountAmount ] = useState(0); const [ finishCheckout, setFinishCheckout ] = useState(null); const payments = [ { name: 'BCA', number: '8870-4000-81' }, { name: 'MANDIRI', number: '155-0067-6869-75' }, ]; useEffect(() => { const getAddresses = async () => { if (auth) { const dataAddresses = await apiOdoo('GET', `/api/v1/user/${auth.id}/address`); setAddresses(dataAddresses); } }; getAddresses(); }, [auth]); useEffect(() => { const getProducts = async () => { let cart = getCart(); let productIds = []; if (product_id) { productIds = [parseInt(product_id)]; } else { productIds = Object .values(cart) .filter((itemCart) => itemCart.selected == true) .map((itemCart) => itemCart.product_id); } if (productIds.length > 0) { productIds = productIds.join(','); let dataProducts = await apiOdoo('GET', `/api/v1/product_variant/${productIds}`); dataProducts = dataProducts.map((product) => { if (product_id) { product.quantity = 1; if (qty) product.quantity = parseInt(qty); } else { product.quantity = cart[product.id].quantity; } return product; }); setProducts(dataProducts); } else { if (auth) router.push('/shop/cart'); } }; getProducts(); }, [router, auth, product_id, qty]); useEffect(() => { if (addresses) { const matchAddress = (key) => { const addressToMatch = getItemAddress(key); let 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]); useEffect(() => { if (products) { let calculateTotalAmount = 0; let calculateTotalDiscountAmount = 0; products.forEach(product => { calculateTotalAmount += product.price.price * product.quantity; calculateTotalDiscountAmount += (product.price.price - product.price.price_discount) * product.quantity; }); setTotalAmount(calculateTotalAmount); setTotalDiscountAmount(calculateTotalDiscountAmount); } }, [products]); const submit = async () => { if (!selectedPayment) { toast.error('Mohon pilih metode pembayaran', { position: 'bottom-center' }); return; } if (poFile && poFile.size > 5000000) { toast.error('Maksimal ukuran file adalah 5MB', { position: 'bottom-center' }); return; } let productOrder = products.map((product) => ({ 'product_id': product.id, 'quantity': product.quantity })); let data = { 'partner_shipping_id': selectedAddress.shipping.id, 'partner_invoice_id': selectedAddress.invoicing.id, 'order_line': JSON.stringify(productOrder), 'type': 'sale_order' }; if (poNumber) data.po_number = poNumber; if (poFile) data.po_file = await getFileBase64(poFile); const checkoutToOdoo = await apiOdoo('POST', `/api/v1/partner/${auth.partner_id}/sale_order/checkout`, data); for (const product of products) { deleteItemCart(product.id); } setFinishCheckout(checkoutToOdoo); } return ( { finishCheckout ? (

Terima Kasih atas Pembelian Anda

Rincian belanja sudah kami kirimkan ke email anda. Mohon dicek kembali. jika tidak menerima email anda dapat menghubungi kami disini.

{ finishCheckout.name }

No. Transaksi

Mohon konfirmasi pembelian Anda disini
) : ( <> { !products && !addresses && (
) } { products && addresses && ( <>
Jika mengalami kesulitan dalam melakukan pembelian di website Indoteknik. Hubungi kami disini

Alamat Pengiriman

Pilih Alamat Lain
{ selectedAddress.shipping && (
{ selectedAddress.invoicing.type.charAt(0).toUpperCase() + selectedAddress.invoicing.type.slice(1) + ' Address' }

{ selectedAddress.shipping.name }

{ selectedAddress.shipping.mobile }

{ selectedAddress.shipping.street }, { selectedAddress.shipping?.city?.name }

) }
{products.map((product, index) => ( ))}

Ringkasan Pesanan

{products.length} Barang


Total Belanja

{currencyFormat(totalAmount)}

Total Diskon

- {currencyFormat(totalDiscountAmount)}

Subtotal

{currencyFormat(totalAmount - totalDiscountAmount)}

PPN 11% (Incl.)

{currencyFormat((totalAmount - totalDiscountAmount) * 0.11)}


Grand Total

{currencyFormat(totalAmount - totalDiscountAmount)}

*) Belum termasuk biaya pengiriman

Dengan melakukan pembelian melalui website Indoteknik, saya menyetujui Syarat & Ketentuan yang berlaku

Alamat Penagihan

Pilih Alamat Lain
{ selectedAddress.invoicing && (
{ selectedAddress.invoicing.type.charAt(0).toUpperCase() + selectedAddress.invoicing.type.slice(1) + ' Address' }

{ selectedAddress.invoicing.name }

{ selectedAddress.invoicing.mobile }

{ selectedAddress.invoicing.street } { selectedAddress.invoicing.street2 }

) }

Metode Pembayaran (Wajib dipilih)

{ payments.map((payment, index) => ( )) }

Purchase Order

setPoFile(e.target.files[0])} />
setPoNumber(e.target.value)} />

Ukuran dokumen PO Maksimal 5MB

) } ) }
) }