From e9cd13307f0095dc4edc5048752675d80c551564 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Fri, 6 Dec 2024 17:06:26 +0700 Subject: pengajuan tempo --- src/lib/address/components/EditAddress.jsx | 53 +- src/lib/pengajuan-tempo/component/Dokumen.jsx | 85 +- src/lib/pengajuan-tempo/component/FinishTempo.jsx | 16 +- .../component/KonfirmasiDokumen.jsx | 118 +- .../pengajuan-tempo/component/KontakPerusahaan.jsx | 245 ++-- .../pengajuan-tempo/component/PengajuanTempo.jsx | 235 ++-- src/lib/pengajuan-tempo/component/Pengiriman.jsx | 1310 +++++++++----------- src/lib/pengajuan-tempo/component/Referensi.jsx | 14 +- .../component/informasiPerusahaan.jsx | 359 ++---- src/lib/tempo/components/Tempo.jsx | 217 ++-- 10 files changed, 1341 insertions(+), 1311 deletions(-) (limited to 'src/lib') diff --git a/src/lib/address/components/EditAddress.jsx b/src/lib/address/components/EditAddress.jsx index 23cf72a9..dd5c27fd 100644 --- a/src/lib/address/components/EditAddress.jsx +++ b/src/lib/address/components/EditAddress.jsx @@ -34,7 +34,8 @@ const EditAddress = ({ id, defaultValues }) => { const [states, setStates] = useState([]); const [cities, setCities] = useState([]); const [districts, setDistricts] = useState([]); - const [subDistricts, setSubDistricts] = useState([]); + const [subDistricts, setSubDistricts] = useState([]); + const [isZipTrue, setIsZipTrue] = useState(false); useEffect(() => { const loadProfile = async () => { @@ -60,12 +61,12 @@ const EditAddress = ({ id, defaultValues }) => { setStates(dataStates); }; loadStates(); - },[]) + }, []); const watchState = watch('state'); useEffect(() => { setValue('city', ''); - if(watchState) { + if (watchState) { const loadCities = async () => { let dataCities = await cityApi({ stateId: watchState }); dataCities = dataCities.map((city) => ({ @@ -81,7 +82,6 @@ const EditAddress = ({ id, defaultValues }) => { }; loadCities(); } - }, [watchState, setValue, getValues]); const watchCity = watch('city'); @@ -128,7 +128,44 @@ const EditAddress = ({ id, defaultValues }) => { loadSubDistricts(); } }, [watchDistrict, setValue, getValues]); + + const watchZip = watch('zip'); const onSubmitHandler = async (values) => { + if (watchZip) { + const loadZip = async () => { + try { + const response = await fetch( + `https://alamat.thecloudalert.com/api/cari/index/?keyword=${watchZip}` + ); + + if (!response.ok) { + toast.error('Gagal memuat data alamat pos.'); + setValue('zip', ''); + return false; + } + + const result = await response.json(); + console.log('result', result); + + if (result.length === 0) { + toast.error('Alamat pos salah'); + setValue('zip', ''); + return false; + } + + return true; // Jika valid + } catch (error) { + toast.error('Terjadi kesalahan saat memeriksa alamat pos.'); + console.error('Error:', error); + return false; + } + }; + + const isValidZip = await loadZip(); + if (!isValidZip) { + return; // Menghentikan eksekusi jika alamat salah + } + } const data = { ...values, phone: values.mobile, @@ -287,7 +324,11 @@ const EditAddress = ({ id, defaultValues }) => { name='city' control={control} render={(props) => ( - + )} />
@@ -348,7 +389,7 @@ const validationSchema = Yup.object().shape({ mobile: Yup.string().required('Harus di-isi'), street: Yup.string().required('Harus di-isi'), zip: Yup.string().required('Harus di-isi'), - state : Yup.string().required('Harus di-pilih'), + state: Yup.string().required('Harus di-pilih'), city: Yup.string().required('Harus di-pilih'), district: Yup.string().required('Harus di-pilih'), }); diff --git a/src/lib/pengajuan-tempo/component/Dokumen.jsx b/src/lib/pengajuan-tempo/component/Dokumen.jsx index f05dc9ce..52217e56 100644 --- a/src/lib/pengajuan-tempo/component/Dokumen.jsx +++ b/src/lib/pengajuan-tempo/component/Dokumen.jsx @@ -6,6 +6,7 @@ import { UseToastOptions } from '@chakra-ui/react'; import { toast } from 'react-hot-toast'; import getFileBase64 from '@/core/utils/getFileBase64'; import useDevice from '@/core/hooks/useDevice'; +import imageCompression from 'browser-image-compression'; const Dokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { const { control, watch } = useForm(); const { @@ -44,15 +45,32 @@ const Dokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { // Check for file size if (file.size > 500000) { - toast.error('Maksimal ukuran file adalah 500Kb', { duration: 4000 }); - - event.target.value = ''; - return; + try { + const toastId = toast.loading('mencoba mengompresi file...'); + // Compress image file + const options = { + maxSizeMB: 0.5, // Target size in MB + maxWidthOrHeight: 1920, // Adjust as needed + useWebWorker: true, + }; + const compressedFile = await imageCompression(file, options); + toast.success('berhasil mengompresi file', { duration: 4000 }); + // Convert compressed file to Base64 + fileBase64 = await getFileBase64(compressedFile); + updateFormDokumen( + name, + compressedFile.name, + fileExtension, + fileBase64 + ); + } catch (error) { + toast.error('Gagal mengompresi file', { duration: 4000 }); + } + } else { + // Convert file to Base64 + fileBase64 = await getFileBase64(file); + updateFormDokumen(name, file.name, fileExtension, fileBase64); } - - // Convert file to Base64 - fileBase64 = await getFileBase64(file); - updateFormDokumen(name, file.name, fileExtension, fileBase64); validateDokumen(); } }; @@ -139,6 +157,7 @@ const Dokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { useEffect(() => { validateDokumen(); }, [buttonSubmitClick]); + console.log('formDokumen', formDokumen); return ( <> {isDesktop && ( @@ -155,7 +174,8 @@ const Dokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { >
Pastikan dokumen yang anda upload sudah benar @@ -286,7 +306,7 @@ const Dokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
Pastikan dokumen yang anda upload sudah benar @@ -330,7 +350,8 @@ const Dokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
Pastikan dokumen yang anda upload sudah benar @@ -378,7 +399,8 @@ const Dokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
Pastikan dokumen yang anda upload sudah benar @@ -511,7 +533,7 @@ const Dokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { >
Pastikan dokumen yang anda upload sudah benar @@ -554,6 +576,10 @@ const Dokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
+ + *Jika anda ingin kredit limit lebih dari 25 Juta, harap lampirkan + dokumen yang diberi tanda bintang *) +

Upload Progress

@@ -601,7 +627,8 @@ const Dokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {

{ className='cursor-pointer bg-gray-200 hover:bg-gray-300 text-gray-700 py-2 px-4 rounded w-fit min-w-40 text-nowrap text-center flex items-center justify-center' > {formDokumen?.dokumenNpwp?.name - ? 'Sudah Upload' + ? 'Ubah Dokumen' : 'Upload Dokumen'} { className='cursor-pointer bg-gray-200 hover:bg-gray-300 text-gray-700 py-2 px-4 rounded w-fit min-w-40 text-nowrap text-center flex items-center justify-center' > {formDokumen?.dokumenSppkp?.name - ? 'Sudah Upload' + ? 'Ubah Dokumen' : 'Upload Dokumen'} { className='cursor-pointer bg-gray-200 hover:bg-gray-300 text-gray-700 py-2 px-4 rounded w-fit min-w-40 text-nowrap text-center flex items-center justify-center' > {formDokumen?.dokumenAktaPerubahan?.name - ? 'Sudah Upload' + ? 'Ubah Dokumen' : 'Upload Dokumen'} { >
{ ref={dokumenAktaPendirianRef} >
{ className='cursor-pointer bg-gray-200 hover:bg-gray-300 text-gray-700 py-2 px-4 rounded w-fit min-w-40 text-nowrap text-center flex items-center justify-center' > {formDokumen?.dokumenLaporanKeuangan?.name - ? 'Sudah Upload' + ? 'Ubah Dokumen' : 'Upload Dokumen'} { className='cursor-pointer bg-gray-200 hover:bg-gray-300 text-gray-700 py-2 px-4 rounded w-fit min-w-40 text-nowrap text-center flex items-center justify-center' > {formDokumen?.dokumenFotoKantor?.name - ? 'Sudah Upload' + ? 'Ubah Dokumen' : 'Upload Dokumen'} { ref={dokumenTempatBekerjaRef} >
{
+ + *Jika anda ingin kredit limit lebih dari 25 Juta, harap lampirkan + dokumen yang diberi tanda bintang *) +

Upload Progress

diff --git a/src/lib/pengajuan-tempo/component/FinishTempo.jsx b/src/lib/pengajuan-tempo/component/FinishTempo.jsx index ba28ab2a..933ede62 100644 --- a/src/lib/pengajuan-tempo/component/FinishTempo.jsx +++ b/src/lib/pengajuan-tempo/component/FinishTempo.jsx @@ -14,6 +14,7 @@ const FinishTempo = ({ query }) => { const [transactionData, setTransactionData] = useState(); const { isDesktop, isMobile } = useDevice(); const auth = useAuth(); + console.log('auth', auth); const so_order = query?.order_id?.replaceAll('-', '/'); useEffect(() => { const fetchData = async () => { @@ -62,6 +63,7 @@ const FinishTempo = ({ query }) => { 'Form Pengajuan Tempo Kamu Gagal Dilakukan'} {query?.status == 'review' && 'Pengajuan Tempo dalam Proses Verifikasi'} + {query?.status == 'approve' && 'Pengajuan Tempo Berhasil'}

{query?.status == 'finish' && ( @@ -88,6 +90,14 @@ const FinishTempo = ({ query }) => { height={isMobile ? 300 : 550} /> )} + {query?.status == 'approve' && ( + Registrasi Tempo + )}
{ 'Mohon menunggu untuk verifikasi dokumen dan kelengkapan data yang telah anda berikan. Proses approval pembayaran tempo kamu berhasil atau tidak akan diinfokan melalui email perusahaan / email yang mendaftar'} {query?.status == 'review' && 'Proses pengajuan tempo anda saat ini sedang dalam tahapan proses verifikasi oleh tim indoteknik, mohon menunggu'} + {query?.status == 'approve' && + 'Proses pengajuan tempo anda sudah berhasil terdaftar di indoteknik.com. Nikmati pembelian anda di website indoteknik dengan menggunakan pembayaran tempo'}
{ > {query?.status == 'switch-account' ? 'Ubah Akun' - : 'Lihat Status Pendaftaran'}{' '} + : query?.status == 'approve' + ? 'Lihat Detail Tempo' + : 'Lihat Status Pendaftaran'}
diff --git a/src/lib/pengajuan-tempo/component/KonfirmasiDokumen.jsx b/src/lib/pengajuan-tempo/component/KonfirmasiDokumen.jsx index c1f2d07c..e9ec01e1 100644 --- a/src/lib/pengajuan-tempo/component/KonfirmasiDokumen.jsx +++ b/src/lib/pengajuan-tempo/component/KonfirmasiDokumen.jsx @@ -9,6 +9,7 @@ import Image from 'next/image'; import BottomPopup from '@/core/components/elements/Popup/BottomPopup'; import { EyeIcon } from '@heroicons/react/24/outline'; import useDevice from '@/core/hooks/useDevice'; +import imageCompression from 'browser-image-compression'; const KonfirmasiDokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { const { control, watch } = useForm(); const [isExample, setIsExample] = useState(false); @@ -16,6 +17,7 @@ const KonfirmasiDokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { const [base64, setBase64] = useState(); const [pdfData, setPdfData] = useState(); const [format, setFormat] = useState(); + const [url, setUrl] = useState(); const [popUpSource, setSource] = useState(); const { formDokumen, @@ -26,8 +28,12 @@ const KonfirmasiDokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { } = usePengajuanTempoStoreDokumen(); const handleConfirmSubmit = (format, base64) => { + console.log('format iman', format); if (format == 'pdf') { setFormat(`application/${format}`); + } else if (format == undefined) { + setFormat(null); + setUrl(`http://192.168.23.244:8069` + base64); } else { setFormat(`image/${format}`); } @@ -40,11 +46,13 @@ const KonfirmasiDokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { let fileBase64 = ''; const { name } = event.target; const file = event.target.files?.[0]; + // Allowed file extensions const allowedExtensions = ['pdf', 'png', 'jpg', 'jpeg']; let fileExtension = ''; if (file) { - fileExtension = file.name.split('.').pop()?.toLowerCase(); + fileExtension = file.name.split('.').pop()?.toLowerCase(); // Extract file extension + // Check if the file extension is allowed if (!fileExtension || !allowedExtensions.includes(fileExtension)) { toast.error( 'Format file yang diijinkan adalah .pdf, .png, .jpg, atau .jpeg', @@ -55,15 +63,34 @@ const KonfirmasiDokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { return; } - if (file.size > 2000000) { - toast.error('Maksimal ukuran file adalah 2MB', { duration: 4000 }); - - event.target.value = ''; - return; + // Check for file size + if (file.size > 500000) { + try { + const toastId = toast.loading('mencoba mengompresi file...'); + // Compress image file + const options = { + maxSizeMB: 0.5, // Target size in MB + maxWidthOrHeight: 1920, // Adjust as needed + useWebWorker: true, + }; + const compressedFile = await imageCompression(file, options); + toast.success('berhasil mengompresi file', { duration: 4000 }); + // Convert compressed file to Base64 + fileBase64 = await getFileBase64(compressedFile); + updateFormDokumen( + name, + compressedFile.name, + fileExtension, + fileBase64 + ); + } catch (error) { + toast.error('Gagal mengompresi file', { duration: 4000 }); + } + } else { + // Convert file to Base64 + fileBase64 = await getFileBase64(file); + updateFormDokumen(name, file.name, fileExtension, fileBase64); } - - fileBase64 = await getFileBase64(file); - updateFormDokumen(name, file.name, fileExtension, fileBase64); validateDokumen(); } }; @@ -145,6 +172,7 @@ const KonfirmasiDokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { useEffect(() => { validateDokumen(); }, [buttonSubmitClick]); + console.log('format', format); return ( <> {isDesktop && ( @@ -169,7 +197,7 @@ const KonfirmasiDokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { htmlFor='dokumenNib' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenNib?.name ? 'Ubah' : 'Upload'} { htmlFor='dokumenNpwp' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenNpwp?.name ? 'Ubah' : 'Upload'} { htmlFor='dokumenSppkp' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenSppkp?.name.length > 0 + ? 'Ubah' + : 'Upload'} { className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > {formDokumen.dokumenAktaPerubahan.name - ? 'ubah' - : 'upload'} + ? 'Ubah' + : 'Upload'} { htmlFor='dokumenKtpDirut' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenKtpDirut?.name ? 'Ubah' : 'Upload'} { htmlFor='dokumenAktaPendirian' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenAktaPendirian?.name + ? 'Ubah' + : 'Upload'} { htmlFor='dokumenLaporanKeuangan' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenLaporanKeuangan?.name + ? 'Ubah' + : 'Upload'} { htmlFor='dokumenFotoKantor' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenFotoKantor?.name ? 'Ubah' : 'Upload'} {
@@ -586,7 +620,9 @@ const KonfirmasiDokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { htmlFor='dokumenTempatBekerja' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenTempatBekerja?.name + ? 'Ubah' + : 'Upload'} { htmlFor='dokumenNib' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenNib?.name ? 'Ubah' : 'Upload'} { htmlFor='dokumenNpwp' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenNpwp?.name ? 'Sudah' : 'Upload'} { htmlFor='dokumenSppkp' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenSppkp?.name ? 'Ubah' : 'Upload'} { htmlFor='dokumenAktaPerubahan' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenAktaPerubahan?.name + ? 'Ubah' + : 'Upload'} { htmlFor='dokumenKtpDirut' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenKtpDirut?.name ? 'Ubah' : 'Upload'} { htmlFor='dokumenAktaPendirian' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenAktaPendirian?.name + ? 'Ubah' + : 'Upload'} { htmlFor='dokumenLaporanKeuangan' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenLaporanKeuangan?.name + ? 'Ubah' + : 'Upload'} { htmlFor='dokumenFotoKantor' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20 text-center' > - Ubah + {formDokumen?.dokumenFotoKantor?.name ? 'Ubah' : 'Upload'} {
- +
@@ -1065,7 +1109,9 @@ const KonfirmasiDokumen = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { htmlFor='dokumenTempatBekerja' className='cursor-pointer bg-red-500 hover:bg-red-600 text-white py-1 px-3 text-sm rounded min-w-20' > - Ubah + {formDokumen?.dokumenTempatBekerja?.name + ? 'Ubah' + : 'Upload'} { )} {isDesktop && ( setIsExample(false)} >
diff --git a/src/lib/pengajuan-tempo/component/KontakPerusahaan.jsx b/src/lib/pengajuan-tempo/component/KontakPerusahaan.jsx index e7bfdbbe..d5bb69fb 100644 --- a/src/lib/pengajuan-tempo/component/KontakPerusahaan.jsx +++ b/src/lib/pengajuan-tempo/component/KontakPerusahaan.jsx @@ -11,6 +11,7 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { const { isDesktop, isMobile } = useDevice(); const handleInputChange = (event) => { const { name, value } = event.target; + console.log('name', name, value); updateFormKontakPerson(name, value); validateKontakPerson(); }; @@ -84,6 +85,7 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { useEffect(() => { validateKontakPerson(); }, [buttonSubmitClick]); + console.log('formKontakPerson', formKontakPerson); return ( <> {isDesktop && ( @@ -93,24 +95,42 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
-
+
-
- +
+ {/* Dropdown untuk memilih "Bpk" atau "Ibu" */} + + + {/* Input untuk nama */} + +
{chekValid && (
{errorsKontakPerson.direkturName} @@ -122,7 +142,8 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
{!isKonfirmasi && ( @@ -194,17 +215,32 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { )}
- +
+ + +
{chekValid && (
{errorsKontakPerson.purchasingName} @@ -216,7 +252,7 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
{!isKonfirmasi && ( @@ -288,17 +324,32 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { )}
- +
+ + +
{chekValid && (
{errorsKontakPerson.financeName} @@ -309,7 +360,7 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
{!isKonfirmasi && ( @@ -387,17 +438,32 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { - +
+ + +
{chekValid && (
{errorsKontakPerson.direkturName} @@ -407,7 +473,8 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
{ - +
+ + +
{chekValid && (
{errorsKontakPerson.purchasingName} @@ -473,7 +555,7 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
{
- +
+ + +
{chekValid && (
{errorsKontakPerson.financeName} @@ -536,7 +633,7 @@ const KontakPerusahaan = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
{ const { isDesktop, isMobile } = useDevice(); const [currentStep, setCurrentStep] = React.useState(0); @@ -137,7 +139,7 @@ const PengajuanTempo = () => { validateKontakPerson(); validatePengiriman(); validateDokumen(); - updateHasSave(false); + updateHasSave(true); if (isFormValid) { window.scrollTo({ top: 0, @@ -175,7 +177,8 @@ const PengajuanTempo = () => { 'GET', `/api/v1/partner/detail-tempo/${auth.parentId}` ); - + console.log('original data', dataPaymentTerm); + const transformedData = transformKeysToCamelCase(dataPaymentTerm); setBigData(transformedData); } catch (error) { console.error('Error loading dataPaymentTerm:', error); @@ -213,6 +216,7 @@ const PengajuanTempo = () => { ? JSON.stringify(bigData[key]) // Untuk objek atau array : String(bigData[key]); // Untuk tipe primitif // Kirim data yang sudah diubah ke string ke stepDivsUpdateForm + console.log('key', key, stringData); stepDivsUpdateForm[currentStep](key, stringData); } }); @@ -225,7 +229,7 @@ const PengajuanTempo = () => { validatePengiriman(); validateDokumen(); validateSupplier(); - updateHasSave(false); + updateHasSave(true); }, [currentStep, bigData, auth]); const goToNextStep = () => { @@ -291,15 +295,25 @@ const PengajuanTempo = () => { return; } } - const formattedDokumen = Object.entries(formDokumen).map(([key, doc]) => ({ - documentName: key, - details: { - name: doc.name, - format: doc.format, - base64: doc.base64, - }, - })); + + // Filter hanya dokumen dengan `format` yang tidak undefined + const formattedDokumen = Object.entries(formDokumen) + .filter(([_, doc]) => doc.format !== undefined) // Hanya dokumen dengan `format` tidak undefined + .map(([key, doc]) => ({ + documentName: key, + details: { + name: doc.name, + format: doc.format, + base64: doc.base64, + }, + })); + const toastId = toast.loading('Mengirimkan formulir pengajuan tempo...'); + if (formattedDokumen.length === 0) { + // toast.error('Tidak ada dokumen valid untuk dikirim.'); + return; + } + setIsLoading(true); try { const address = await createPengajuanTempoApi({ @@ -321,12 +335,30 @@ const PengajuanTempo = () => { console.error(error); } }; + + const isSupplierDataChanged = (formSupplier, supplierIds) => { + if (formSupplier.length !== supplierIds.length) { + return true; + } + return formSupplier.some((supplier, index) => { + const original = supplierIds[index]; + return ( + supplier.supplier !== original.supplier || + supplier.pic !== original.pic || + supplier.telepon !== original.telepon || + supplier.durasiTempo !== original.durasiTempo || + supplier.creditLimit !== original.creditLimit + ); + }); + }; + const handleDaftarTempoSupplier = async () => { for (const error of stepDivsError) { if (error.length > 0) { return; } } + const productOrder = formSupplier.map((product) => ({ supplier: product.supplier, pic: product.pic, @@ -334,7 +366,13 @@ const PengajuanTempo = () => { durasiTempo: product.durasiTempo, creditLimit: product.creditLimit, })); + + // Periksa perubahan const toastId = toast.loading('Mengirimkan formulir pengajuan tempo...'); + if (!isSupplierDataChanged(productOrder, bigData.supplierIds)) { + return; + } + setIsLoading(true); try { const address = await createPengajuanTempoApi({ @@ -363,35 +401,23 @@ const PengajuanTempo = () => { return; } } - const productOrder = formSupplier.map((product) => ({ - supplier: product.supplier, - pic: product.pic, - telepon: product.telepon, - durasiTempo: product.durasiTempo, - creditLimit: product.creditLimit, - })); - const formattedDokumen = Object.entries(formDokumen).map(([key, doc]) => ({ - documentName: key, - details: { - name: doc.name, - format: doc.format, - base64: doc.base64, - }, - })); + // Filter hanya dokumen dengan `format` yang tidak undefined + const formattedDokumen = Object.entries(formDokumen) + .filter(([_, doc]) => doc.format !== undefined) // Hanya dokumen dengan `format` tidak undefined + .map(([key, doc]) => ({ + documentName: key, + details: { + name: doc.name, + format: doc.format, + base64: doc.base64, + }, + })); - // const data2 = { - // user_id: auth.id, - // ...form, - // ...formKontakPerson, - // ...formPengiriman, - // formDocs: JSON.stringify(formattedDokumen), - // formSupplier: JSON.stringify(productOrder), - // }; const toastId = toast.loading('Mengirimkan formulir pengajuan tempo...'); setIsLoading(true); try { - let address5; + let address4; const address = await createPengajuanTempoApi({ id: 0, partner_id: auth.partnerId, @@ -415,37 +441,29 @@ const PengajuanTempo = () => { tempo_request: false, ...formPengiriman, }); - if (address3.id) { - const address4 = await createPengajuanTempoApi({ + if (address3.id && formattedDokumen.length > 0) { + // Kirim dokumen yang sudah difilter + address4 = await createPengajuanTempoApi({ id: address3.id, partner_id: auth.partnerId, user_id: address3.userId, - tempo_request: false, + tempo_request: true, formDocs: JSON.stringify(formattedDokumen), }); - if (address4.id) { - address5 = await createPengajuanTempoApi({ - id: address4.id, - partner_id: auth.partnerId, - user_id: address4.userId, - tempo_request: true, - formSupplier: JSON.stringify(productOrder), - }); - } } } } - if (address5.id) { + if (address4?.id) { const isUpdated = await editAuthTempo(); toast.dismiss(toastId); - setIsLoading(false); - toast.success('Pengajuan tempo berhasil dilakukan'); if (isUpdated?.user) { setAuth(isUpdated.user); + setIsLoading(false); + toast.success('Pengajuan tempo berhasil dilakukan'); toast.success('Berhasil mengubah status akun', { duration: 1000 }); removeFromLocalStorage(); - router.push('/pengajuan-tempo/finish?tempo_id=SO-2023-06480'); + router.push('/pengajuan-tempo/finish'); return; } } @@ -479,6 +497,14 @@ const PengajuanTempo = () => { } }; + const [isCheckedTNC, setIsCheckedTNC] = useState(false); + + const handleCheckChange = (checked) => { + setIsCheckedTNC(checked); + }; + console.log('formSupplier', formSupplier); + console.log('!hassavedata', hasSavedata); + console.log('isCheckedTNC', isCheckedTNC); return ( <>
@@ -507,45 +533,102 @@ const PengajuanTempo = () => { className={`flex ${ isMobile ? 'flex-col justify-start items-start' - : 'flex-row justify-end items-center' - } gap-4 mb-8`} + : 'flex-col justify-end items-end' + } mb-8 gap-2`} > *Pastikan data yang anda masukan sudah benar dan sesuai {currentStep < 5 && ( - + <> + + + + + )} + {currentStep == 5 && ( +
+ - - )} - {currentStep == 5 && ( - +
)}
); }; +const TempoTermCondition = ({ onCheckChange }) => { + const [isCheckedTNC, SetIsCheckedTNC] = useState(false); + const [openTNC, SetOpenTNC] = useState(false); + + const openTNCHandle = () => { + SetOpenTNC(!openTNC); + }; + + const toggleCheckTNC = () => { + const newValue = !isCheckedTNC; + SetIsCheckedTNC(newValue); + if (onCheckChange) { + onCheckChange(newValue); + } + }; + return ( + <> +
+ +
+ {' '} + + syarat dan ketentuan + + +
+
+ + SetOpenTNC(false)} + title='Syarat & Ketentuan Pendaftaran Tempo' + > + + + + ); +}; export default PengajuanTempo; diff --git a/src/lib/pengajuan-tempo/component/Pengiriman.jsx b/src/lib/pengajuan-tempo/component/Pengiriman.jsx index 8b8961c5..0352b54f 100644 --- a/src/lib/pengajuan-tempo/component/Pengiriman.jsx +++ b/src/lib/pengajuan-tempo/component/Pengiriman.jsx @@ -9,7 +9,7 @@ import { usePengajuanTempoStorePengiriman, usePengajuanTempoStore, } from '../../../../src-migrate/modules/register/stores/usePengajuanTempoStore'; - +import { toast } from 'react-hot-toast'; import useDevice from '@/core/hooks/useDevice'; const Pengiriman = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { const { control, watch, setValue } = useForm(); @@ -102,7 +102,7 @@ const Pengiriman = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { const watchState = watch('statePengiriman'); useEffect(() => { - updateFormPengiriman('cityPengiriman', ''); + // updateFormPengiriman('cityPengiriman', ''); if (watchState) { updateFormPengiriman('statePengiriman', `${watchState}`); validatePengiriman(); @@ -352,35 +352,63 @@ const Pengiriman = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { if (sameAddress) { updateFormPengiriman('streetInvoice', formPengiriman.streetPengiriman); updateFormPengiriman('stateInvoice', formPengiriman.statePengiriman); + setValue('stateInvoice', parseInt(formPengiriman.statePengiriman)); updateFormPengiriman('cityInvoice', formPengiriman.cityPengiriman); + setValue('cityInvoice', parseInt(formPengiriman.cityPengiriman)); + updateFormPengiriman('isSameAddrees', `${sameAddress}`); } else { - updateFormPengiriman('streetInvoice', ''); - updateFormPengiriman('stateInvoice', ''); - updateFormPengiriman('cityInvoice', ''); - setValue('streetInvoice', ''); - setValue('stateInvoice', ''); - setValue('cityInvoice', ''); + // updateFormPengiriman('streetInvoice', ''); + // updateFormPengiriman('stateInvoice', ''); + // updateFormPengiriman('cityInvoice', ''); + // setValue('streetInvoice', ''); + // setValue('stateInvoice', ''); + // setValue('cityInvoice', ''); } - updateFormPengiriman('isSameAddrees', `${sameAddress}`); validatePengiriman(); - }, [sameAddress]); + }, [ + sameAddress, + formPengiriman.streetPengiriman, + formPengiriman.statePengiriman, + formPengiriman.cityPengiriman, + ]); + useEffect(() => { + if (formPengiriman.sameAddressStreet?.toLowerCase().includes('true')) { + setSameAddressStreet(true); + } else { + setSameAddressStreet(false); + } + }, [formPengiriman.sameAddressStreet]); + useEffect(() => { + if (formPengiriman.statePengiriman) { + setValue('statePengiriman', parseInt(formPengiriman.statePengiriman)); + } + }, [formPengiriman.statePengiriman]); + useEffect(() => { + if (formPengiriman.cityPengiriman) { + setValue('cityPengiriman', parseInt(formPengiriman.cityPengiriman)); + } + }, [formPengiriman.cityPengiriman]); useEffect(() => { if (sameAddressStreet) { + console.log('form.state', form); updateFormPengiriman('streetPengiriman', form.street); updateFormPengiriman('statePengiriman', form.state); + setValue('statePengiriman', parseInt(form.state)); updateFormPengiriman('cityPengiriman', form.city); + setValue('cityPengiriman', parseInt(form.city)); updateFormPengiriman('zipPengiriman', form.zip); - } else { - updateFormPengiriman('streetPengiriman', ''); - updateFormPengiriman('statePengiriman', ''); - updateFormPengiriman('cityPengiriman', ''); - updateFormPengiriman('zipPengiriman', ''); - setValue('streetPengiriman', ''); - setValue('statePengiriman', ''); - setValue('cityPengiriman', ''); + updateFormPengiriman('isSameAddreesStreet', `${sameAddressStreet}`); } - updateFormPengiriman('isSameAddreesStreet', `${sameAddressStreet}`); + // else { + // updateFormPengiriman('streetPengiriman', ''); + // updateFormPengiriman('statePengiriman', ''); + // updateFormPengiriman('cityPengiriman', ''); + // updateFormPengiriman('zipPengiriman', ''); + // setValue('streetPengiriman', ''); + // setValue('statePengiriman', ''); + // setValue('cityPengiriman', ''); + // } validatePengiriman(); }, [sameAddressStreet]); @@ -459,8 +487,70 @@ const Pengiriman = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { setSameAddress(!sameAddress); }; const handleChangeSameAddressStreet = () => { + // updateFormPengiriman('sameAddressStreet', `${!sameAddressStreet}`); setSameAddressStreet(!sameAddressStreet); + if (sameAddressStreet == false) { + updateFormPengiriman('streetPengiriman', ''); + updateFormPengiriman('statePengiriman', ''); + updateFormPengiriman('cityPengiriman', ''); + updateFormPengiriman('zipPengiriman', ''); + setValue('streetPengiriman', ''); + setValue('statePengiriman', ''); + setValue('cityPengiriman', ''); + updateFormPengiriman('isSameAddreesStreet', `${sameAddressStreet}`); + validate(); + } }; + + useEffect(() => { + const options = { + behavior: 'smooth', + block: 'center', + }; + + const loadIndustries = async () => { + const watchZip = formPengiriman.zipPengiriman?.trim(); // Menghapus spasi berlebih + + // Validasi: hanya eksekusi jika watchZip valid (contoh: minimal 5 karakter) + if (watchZip && watchZip.length >= 5) { + const loadZip = async () => { + try { + const response = await fetch( + `https://alamat.thecloudalert.com/api/cari/index/?keyword=${watchZip}` + ); + + const result = await response.json(); + + if (!result.result.length > 0) { + toast.error('Alamat pos salah'); + updateFormPengiriman('zipPengiriman', ''); // Reset form.zip jika salah + validate(); // Memanggil validasi formulir + return false; + } else { + updateFormPengiriman('zipPengiriman', watchZip); + validate(); + return true; // Jika valid + } + } catch (error) { + toast.error('Terjadi kesalahan saat memeriksa alamat pos.'); + console.error('Error:', error); + return false; + } + }; + + const isValidZip = await loadZip(); + if (!isValidZip) { + zipRef.current.scrollIntoView(options); + } + } + }; + + loadIndustries(); + }, [formPengiriman.zipPengiriman]); + + console.log('formPengiriman', formPengiriman); + console.log('errorsPengiriman', errorsPengiriman); + return ( <> {isDesktop && ( @@ -477,18 +567,33 @@ const Pengiriman = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
- +
+ + +
{chekValid && (
{errorsPengiriman.PICName} @@ -515,92 +620,95 @@ const Pengiriman = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { isChecked={sameAddressStreet} onChange={handleChangeSameAddressStreet} > - Alamat Pengiriman sama dengan alamat pengiriman + Alamat Pengiriman sama dengan alamat bisnis - {!sameAddressStreet && ( - <> -
+ + <> +
+ + {chekValid && ( +
+ {errorsPengiriman.streetPengiriman} +
+ )} +
+
+
+ ( + + )} + /> + {chekValid && ( +
+ {errorsPengiriman.statePengiriman} +
+ )} +
+
+ ( + + )} + /> + {chekValid && ( +
+ {errorsPengiriman.cityPengiriman} +
+ )} +
+
{chekValid && (
- {errorsPengiriman.streetPengiriman} + {errorsPengiriman.zipPengiriman}
)}
-
-
- ( - - )} - /> - {chekValid && ( -
- {errorsPengiriman.statePengiriman} -
- )} -
-
- ( - - )} - /> - {chekValid && ( -
- {errorsPengiriman.cityPengiriman} -
- )} -
-
- - {chekValid && ( -
- {errorsPengiriman.zipPengiriman} -
- )} -
-
- - )} +
+
@@ -611,18 +719,33 @@ const Pengiriman = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => {
- +
+ + +
{chekValid && (
{errorsPengiriman.invoicePic} @@ -653,75 +776,76 @@ const Pengiriman = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { Alamat invoice sama dengan alamat pengiriman
- {!sameAddress && ( - <> -
- +
+ + {chekValid && ( +
+ {errorsPengiriman.streetInvoice} +
+ )} +
+
+
+ ( + + )} /> {chekValid && (
- {errorsPengiriman.streetInvoice} + {errorsPengiriman.stateInvoice}
)}
-
-
- ( - - )} - /> - {chekValid && ( -
- {errorsPengiriman.stateInvoice} -
- )} -
-
- ( - - )} - /> - {chekValid && ( -
- {errorsPengiriman.cityInvoice} -
+
+ ( + )} -
+ /> + {chekValid && ( +
+ {errorsPengiriman.cityInvoice} +
+ )}
- - )} +
+
@@ -738,59 +862,17 @@ const Pengiriman = ({ chekValid, buttonSubmitClick, isKonfirmasi }) => { )}
- -
- - Setiap Minggu di hari - - -
-
- - Setiap Bulan di minggu ke - - -
-
- - Lainnya - -