summaryrefslogtreecommitdiff
path: root/src/lib/pengajuan-tempo/component/PengajuanTempo.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/pengajuan-tempo/component/PengajuanTempo.jsx')
-rw-r--r--src/lib/pengajuan-tempo/component/PengajuanTempo.jsx235
1 files changed, 159 insertions, 76 deletions
diff --git a/src/lib/pengajuan-tempo/component/PengajuanTempo.jsx b/src/lib/pengajuan-tempo/component/PengajuanTempo.jsx
index 1704556e..82b64df7 100644
--- a/src/lib/pengajuan-tempo/component/PengajuanTempo.jsx
+++ b/src/lib/pengajuan-tempo/component/PengajuanTempo.jsx
@@ -27,6 +27,8 @@ import { toast } from 'react-hot-toast';
import useDevice from '@/core/hooks/useDevice';
import odooApi from '~/libs/odooApi';
import editAuthTempo from '../api/editAuthTempo';
+import BottomPopup from '@/core/components/elements/Popup/BottomPopup';
+import PageContent from '@/lib/content/components/PageContent';
const PengajuanTempo = () => {
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 (
<>
<div className='container flex flex-col items-center '>
@@ -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`}
>
<span className='text-xs opacity-60'>
*Pastikan data yang anda masukan sudah benar dan sesuai
</span>
{currentStep < 5 && (
- <Tooltip
- label={clsxm({
- 'Klik simpan data terlebih dahulu':
- currentStep === 3 && !hasSavedata,
- })}
- >
+ <>
+ <Tooltip
+ label={clsxm({
+ 'Klik simpan data terlebih dahulu':
+ currentStep === 3 && !hasSavedata,
+ })}
+ >
+ <Button
+ colorScheme='red'
+ w={`${isMobile ? 'full' : 'fit'}`}
+ isDisabled={
+ (currentStep === 3 && !hasSavedata) ||
+ currentStep === NUMBER_OF_STEPS - 1
+ }
+ onClick={goToNextStep}
+ >
+ Langkah Selanjutnya {<ChevronRightIcon className='w-5' />}
+ </Button>
+ </Tooltip>
+ </>
+ )}
+ {currentStep == 5 && (
+ <div className='flex flex-col items-end justify-start gap-4'>
+ <TempoTermCondition onCheckChange={handleCheckChange} />
<Button
colorScheme='red'
- w={`${isMobile ? 'full' : 'fit'}`}
- isDisabled={
- (currentStep === 3 && !hasSavedata) ||
- currentStep === NUMBER_OF_STEPS - 1
- }
- onClick={goToNextStep}
+ w={`${isMobile ? 'full' : '36'}`}
+ isDisabled={!isCheckedTNC}
+ onClick={handleDaftarTempo}
>
- Langkah Selanjutnya {<ChevronRightIcon className='w-5' />}
+ Daftar Tempo {<ChevronRightIcon className='w-5' />}
</Button>
- </Tooltip>
- )}
- {currentStep == 5 && (
- <Button
- colorScheme='red'
- w={`${isMobile ? 'full' : 'fit'}`}
- onClick={handleDaftarTempo}
- >
- Daftar Tempo {<ChevronRightIcon className='w-5' />}
- </Button>
+ </div>
)}
</div>
</div>
</>
);
};
+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 (
+ <>
+ <div className='flex items-center gap-x-2'>
+ <Checkbox
+ id='tnc'
+ name='tnc'
+ colorScheme='red'
+ isChecked={isCheckedTNC}
+ onChange={toggleCheckTNC}
+ />
+ <div>
+ <label htmlFor='tnc' className='cursor-pointer'>
+ Dengan ini saya menyetujui
+ </label>{' '}
+ <span
+ className='font-medium text-danger-500 cursor-pointer'
+ onClick={openTNCHandle}
+ >
+ syarat dan ketentuan
+ </span>
+ <label htmlFor='tnc' className='ml-2 cursor-pointer'>
+ yang berlaku
+ </label>
+ </div>
+ </div>
+
+ <BottomPopup
+ active={openTNC}
+ close={() => SetOpenTNC(false)}
+ title='Syarat & Ketentuan Pendaftaran Tempo'
+ >
+ <PageContent path='/tempoTnd' />
+ </BottomPopup>
+ </>
+ );
+};
export default PengajuanTempo;