Commit 25204a36 authored by Rais Aryaguna's avatar Rais Aryaguna

fix:

- validation form
- call api create draft and upload
- flow edit and pengganti
parent b7ff97de
...@@ -9,7 +9,7 @@ interface ApiResponse<T> { ...@@ -9,7 +9,7 @@ interface ApiResponse<T> {
data: T; data: T;
} }
interface KodeNegara { export interface KodeNegara {
kode: string; kode: string;
nama: string; nama: string;
} }
......
...@@ -55,7 +55,7 @@ const DialogPenandatangan: React.FC<DialogPenandatanganProps> = ({ ...@@ -55,7 +55,7 @@ const DialogPenandatangan: React.FC<DialogPenandatanganProps> = ({
}) => { }) => {
const [isOpenDialogProgressBar, setIsOpenDialogProgressBar] = useState(false); const [isOpenDialogProgressBar, setIsOpenDialogProgressBar] = useState(false);
const [isCheckedAgreement, setIsCheckedAgreement] = useState<boolean>(false); const [isCheckedAgreement, setIsCheckedAgreement] = useState<boolean>(false);
const signer = useAppSelector((state: any) => state.user.data.signer); const signer = useAppSelector((state) => state.user.data.signer);
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const methods = useForm({ const methods = useForm({
......
import Box from '@mui/material/Box';
import Button from '@mui/material/Button';
import Grid from '@mui/material/Grid'; import Grid from '@mui/material/Grid';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { useEffect, useState } from 'react'; import { useEffect } from 'react';
import { useFormContext } from 'react-hook-form'; import { useFormContext } from 'react-hook-form';
// import { useParams } from 'react-router'; // import { useParams } from 'react-router';
import { useKodeNegara } from 'src/actions/master-data';
import { Field } from 'src/components/hook-form'; import { Field } from 'src/components/hook-form';
type IdentitasProps = { type IdentitasProps = {
isPengganti?: boolean; isPengganti?: boolean;
kodeNegetaOptions: {
label: string;
value: string;
}[];
}; };
const Identitas = ({ isPengganti }: IdentitasProps) => { const Identitas = ({ isPengganti, kodeNegetaOptions }: IdentitasProps) => {
// const { dnId } = useParams(); // const { dnId } = useParams();
const { setValue, watch } = useFormContext(); const { setValue, watch } = useFormContext();
const tanggalPemotongan = watch('tglPemotongan'); const tanggalPemotongan = watch('tglPemotongan');
const fgKaryawanAsing = watch('fgKaryawanAsing'); const fgKaryawanAsing = watch('fgKaryawanAsing');
const [jumlahKeterangan, setJumlahKeterangan] = useState<number>(0); // const [jumlahKeterangan, setJumlahKeterangan] = useState<number>(0);
const maxKeterangan = 5; // const maxKeterangan = 5;
const handleTambah = () => { // const handleTambah = () => {
if (jumlahKeterangan < maxKeterangan) { // if (jumlahKeterangan < maxKeterangan) {
setJumlahKeterangan(jumlahKeterangan + 1); // setJumlahKeterangan(jumlahKeterangan + 1);
} // }
}; // };
const handleHapus = () => { // const handleHapus = () => {
if (jumlahKeterangan > 0) { // if (jumlahKeterangan > 0) {
const newCount = jumlahKeterangan - 1; // const newCount = jumlahKeterangan - 1;
setJumlahKeterangan(newCount); // setJumlahKeterangan(newCount);
setValue(`keterangan${newCount + 1}`, null); // setValue(`keterangan${newCount + 1}`, null);
} // }
}; // };
// auto set thnPajak dan msPajak berdasarkan tanggalPemotongan // auto set thnPajak dan msPajak berdasarkan tanggalPemotongan
useEffect(() => { useEffect(() => {
if (tanggalPemotongan) { if (!isPengganti) {
const date = dayjs(tanggalPemotongan); if (tanggalPemotongan) {
setValue('thnPajak', date.format('YYYY')); const date = dayjs(tanggalPemotongan);
setValue('msPajak', date.format('MM')); setValue('tahunPajak', date.format('YYYY'));
} else { setValue('masaPajak', date.format('MM'));
setValue('thnPajak', ''); } else {
setValue('msPajak', ''); setValue('tahunPajak', '');
setValue('masaPajak', '');
}
} }
}, [tanggalPemotongan, setValue]); // eslint-disable-next-line react-hooks/exhaustive-deps
}, [tanggalPemotongan, !isPengganti]);
const { kodeNegara } = useKodeNegara();
return ( return (
<> <>
...@@ -62,54 +64,68 @@ const Identitas = ({ isPengganti }: IdentitasProps) => { ...@@ -62,54 +64,68 @@ const Identitas = ({ isPengganti }: IdentitasProps) => {
</Grid> </Grid>
<Grid size={{ md: 3 }}> <Grid size={{ md: 3 }}>
<Field.DatePicker <Field.DatePicker
name="thnPajak" name="tahunPajak"
label="Tahun Pajak" label="Tahun Pajak"
view="year" view="year"
format="YYYY" format="YYYY"
readOnly readOnly
disabled={isPengganti}
/> />
</Grid> </Grid>
<Grid size={{ md: 3 }}> <Grid size={{ md: 3 }}>
<Field.DatePicker name="msPajak" label="Masa Pajak" view="month" format="MM" readOnly /> <Field.DatePicker
name="masaPajak"
label="Masa Pajak"
view="month"
format="MM"
readOnly
disabled={isPengganti}
/>
</Grid> </Grid>
{/* NPWP dengan onChange langsung */} {/* NPWP dengan onChange langsung */}
<Grid size={{ md: 6 }}> <Grid size={{ md: 6 }}>
<Field.Text <Field.Text
name="idDipotong" name="npwp"
label="NPWP" label="NPWP"
onChange={(e) => { onChange={(e) => {
const value = e.target.value.replace(/\D/g, '').slice(0, 16); // hanya angka, max 16 const value = e.target.value.replace(/\D/g, '').slice(0, 16); // hanya angka, max 16
console.log('🚀 ~ value:', value); console.log('🚀 ~ value:', value);
setValue('idDipotong', value, { shouldValidate: true, shouldDirty: true }); setValue('npwp', value, { shouldValidate: true, shouldDirty: true });
setValue('nitku', value.length === 16 ? value + '000000' : value, { setValue('nitku', value.length === 16 ? value + '000000' : value, {
shouldValidate: true, shouldValidate: true,
shouldDirty: true, shouldDirty: true,
}); });
}} }}
disabled={isPengganti}
/> />
</Grid> </Grid>
<Grid size={{ md: 6 }}> <Grid size={{ md: 6 }}>
<Field.Text name="namaDipotong" label="Nama" /> <Field.Text name="namaDipotong" label="Nama" disabled={isPengganti} />
</Grid> </Grid>
<Grid size={{ md: 12 }}> <Grid size={{ md: 12 }}>
<Field.Text name="alamatDipotong" label="Alamat" /> <Field.Text name="alamatDipotong" label="Alamat" />
</Grid> </Grid>
<Grid size={{ md: 6 }}> <Grid size={{ md: 6 }}>
<Field.Text name="email" label="Email (optional)" /> <Field.Text name="email" label="Email (optional)" disabled={isPengganti} />
</Grid> </Grid>
<Grid size={{ md: 6 }}> <Grid size={{ md: 6 }}>
<Field.Text name="posisiJabatan" label="Jabatan" /> <Field.Text name="posisiJabatan" label="Jabatan" disabled={isPengganti} />
</Grid> </Grid>
<Grid size={{ md: 3 }} alignSelf="center"> <Grid size={{ md: 3 }} alignSelf="center">
<Field.Checkbox name="fgKaryawanAsing" label="Status Karyawan Asing" /> <Field.Checkbox
name="fgKaryawanAsing"
label="Status Karyawan Asing"
disabled={isPengganti}
/>
</Grid> </Grid>
<Grid size={{ md: 3 }}> <Grid size={{ md: 3 }}>
<Field.Autocomplete <Field.Autocomplete
name="kodeNegara" name="kodeNegara"
label="Negara" label="Negara"
options={kodeNegara.map((val) => ({ label: val.nama, value: val.kode }))} options={kodeNegetaOptions}
readOnly={!fgKaryawanAsing} readOnly={!fgKaryawanAsing}
disabled={isPengganti}
/> />
</Grid> </Grid>
<Grid size={{ md: 6 }}> <Grid size={{ md: 6 }}>
...@@ -121,12 +137,13 @@ const Identitas = ({ isPengganti }: IdentitasProps) => { ...@@ -121,12 +137,13 @@ const Identitas = ({ isPengganti }: IdentitasProps) => {
readOnly: !fgKaryawanAsing, readOnly: !fgKaryawanAsing,
}, },
}} }}
disabled={isPengganti}
/> />
</Grid> </Grid>
</Grid> </Grid>
{/* Tambah / Hapus Keterangan */} {/* Tambah / Hapus Keterangan */}
<Box sx={{ display: 'flex', gap: 2, mb: 3 }}> {/* <Box sx={{ display: 'flex', gap: 2, mb: 3 }}>
<Box <Box
sx={{ sx={{
borderRadius: '18px', borderRadius: '18px',
...@@ -163,7 +180,7 @@ const Identitas = ({ isPengganti }: IdentitasProps) => { ...@@ -163,7 +180,7 @@ const Identitas = ({ isPengganti }: IdentitasProps) => {
/> />
</Grid> </Grid>
))} ))}
</Box> </Box> */}
</> </>
); );
}; };
......
...@@ -2,7 +2,6 @@ import { CalculateRounded } from '@mui/icons-material'; ...@@ -2,7 +2,6 @@ import { CalculateRounded } from '@mui/icons-material';
import { LoadingButton } from '@mui/lab'; import { LoadingButton } from '@mui/lab';
import { Grid } from '@mui/material'; import { Grid } from '@mui/material';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { useMemo } from 'react';
import { useFormContext } from 'react-hook-form'; import { useFormContext } from 'react-hook-form';
import { Field } from 'src/components/hook-form'; import { Field } from 'src/components/hook-form';
import { RHFNumeric } from 'src/components/hook-form/rhf-numeric'; import { RHFNumeric } from 'src/components/hook-form/rhf-numeric';
...@@ -12,9 +11,6 @@ import { ...@@ -12,9 +11,6 @@ import {
FG_PERHITUNGAN, FG_PERHITUNGAN,
FG_PERHITUNGAN_TEXT, FG_PERHITUNGAN_TEXT,
METODE_POTONG, METODE_POTONG,
PTKP,
PTKP_TEXT,
PTKP_TITLE,
} from '../../constant'; } from '../../constant';
const fgPerhitunganOptions = Object.values(FG_PERHITUNGAN).map((value) => ({ const fgPerhitunganOptions = Object.values(FG_PERHITUNGAN).map((value) => ({
...@@ -22,17 +18,16 @@ const fgPerhitunganOptions = Object.values(FG_PERHITUNGAN).map((value) => ({ ...@@ -22,17 +18,16 @@ const fgPerhitunganOptions = Object.values(FG_PERHITUNGAN).map((value) => ({
label: FG_PERHITUNGAN_TEXT[value], label: FG_PERHITUNGAN_TEXT[value],
})); }));
function JumlahPerhitunganForm() { function JumlahPerhitunganForm({
ptkpOptions,
}: {
ptkpOptions: {
value: string;
label: string;
}[];
}) {
const { watch, getValues, setValue } = useFormContext(); const { watch, getValues, setValue } = useFormContext();
const ptkpOptions = useMemo(
() =>
Object.entries(PTKP)
.map(([key, value]) => ({ value, label: PTKP_TEXT[value] }))
.filter((option) => !option.value.includes(PTKP_TITLE.HB)),
[]
);
const { mutate, isPending } = useHitungBulanan({ const { mutate, isPending } = useHitungBulanan({
onSuccess: (data) => { onSuccess: (data) => {
console.log('✅ Berhasil hitung PPh21:', data); console.log('✅ Berhasil hitung PPh21:', data);
......
import Divider from '@mui/material/Divider'; import Divider from '@mui/material/Divider';
import Grid from '@mui/material/Grid'; import Grid from '@mui/material/Grid';
import { useMemo } from 'react';
import { useFormContext } from 'react-hook-form'; import { useFormContext } from 'react-hook-form';
import { Field } from 'src/components/hook-form'; import { Field } from 'src/components/hook-form';
import { FG_FASILITAS_PPH_21, FG_FASILITAS_PPH_21_TEXT } from '../../constant';
type PPHDipotongProps = { type PPHDipotongProps = {
kodeObjectPajak: { kodeObjectPajak: {
value: string; value: string;
label: string; label: string;
}[]; }[];
fgFasilitasOptions: {
value: string;
label: string;
}[];
}; };
const PerhitunganPPhPasal21 = ({ kodeObjectPajak }: PPHDipotongProps) => { const PerhitunganPPhPasal21 = ({ kodeObjectPajak, fgFasilitasOptions }: PPHDipotongProps) => {
const { watch } = useFormContext(); const { watch } = useFormContext();
const fgFasilitas = watch('fgFasilitas'); const fgFasilitas = watch('fgFasilitas');
const fgFasilitasOptions = useMemo(
() =>
[
FG_FASILITAS_PPH_21.DTP,
FG_FASILITAS_PPH_21.FASILITAS_LAINNYA,
FG_FASILITAS_PPH_21.TANPA_FASILITAS,
].map((value) => ({
value,
label: FG_FASILITAS_PPH_21_TEXT[value],
})),
[]
);
return ( return (
<Grid container rowSpacing={2} columnSpacing={2}> <Grid container rowSpacing={2} columnSpacing={2}>
{/* Divider */} {/* Divider */}
......
...@@ -12,9 +12,9 @@ const transformParams = ({ isPengganti = false, ...Data }: any): TPostBulananReq ...@@ -12,9 +12,9 @@ const transformParams = ({ isPengganti = false, ...Data }: any): TPostBulananReq
id, id,
idBupot, idBupot,
noBupot, noBupot,
msPajak, masaPajak,
thnPajak, tahunPajak,
idDipotong, npwp,
nitku, nitku,
namaDipotong, namaDipotong,
fgFasilitas, fgFasilitas,
...@@ -36,21 +36,21 @@ const transformParams = ({ isPengganti = false, ...Data }: any): TPostBulananReq ...@@ -36,21 +36,21 @@ const transformParams = ({ isPengganti = false, ...Data }: any): TPostBulananReq
posisiJabatan, posisiJabatan,
} = Data; } = Data;
console.log('🚀 ~ transformParams ~ Data:', Data);
const revNo = isPengganti ? parseInt(initialRevNo || 0, 10) + 1 : parseInt(initialRevNo || 0, 10); const revNo = isPengganti ? parseInt(initialRevNo || 0, 10) + 1 : parseInt(initialRevNo || 0, 10);
const [status, jmlPtkp] = statusPtkp.split('/'); const [status, jmlPtkp] = statusPtkp.split('/');
const npwpLog = localStorage.getItem('npwp_log') ?? '';
return { return {
id: !isPengganti ? (id ?? null) : null, id: !isPengganti ? (id ?? null) : null,
idBupot: isPengganti ? (idBupot ?? '') : undefined, idBupot,
noBupot: isPengganti ? (noBupot ?? '') : undefined, noBupot,
npwpPemotong: idTku, npwpPemotong: npwpLog,
idTku: idTku ?? '', idTku: idTku ?? '',
masaPajak: msPajak ? dayjs(msPajak).format('MM') : '', masaPajak,
tahunPajak: thnPajak ? dayjs(thnPajak).format('YYYY') : '', tahunPajak,
npwp: idDipotong ?? '', npwp: npwp ?? '',
nik: nitku ?? (idDipotong ? `${idDipotong}000000` : ''), nik: nitku ?? (npwp ? `${npwp}000000` : ''),
nama: namaDipotong ?? '', nama: namaDipotong ?? '',
revNo, revNo,
fgNpwpNik: true, fgNpwpNik: true,
......
...@@ -8,6 +8,14 @@ export type TBaseResponseAPI<T> = { ...@@ -8,6 +8,14 @@ export type TBaseResponseAPI<T> = {
total?: number; total?: number;
}; };
export type TBaseResponseCreateAPI<T> = {
code: number;
data?: T;
message: string;
status: string;
time: Date;
};
export interface BupotRecord { export interface BupotRecord {
// --- Kunci numerik dinamis ("1" sampai "53") --- // --- Kunci numerik dinamis ("1" sampai "53") ---
// [key: `${number}`]: number | undefined; // [key: `${number}`]: number | undefined;
......
import { fetcher } from 'src/lib/axios'; import { fetcher } from 'src/lib/axios-ctas-box';
import type { import type {
BupotRecord, BupotRecord,
TBaseResponseAPI, TBaseResponseAPI,
...@@ -46,7 +46,7 @@ bulananApi.getKodeObjekPajak = async (params?: Record<string, any>) => { ...@@ -46,7 +46,7 @@ bulananApi.getKodeObjekPajak = async (params?: Record<string, any>) => {
}; };
bulananApi.save = async (config: TPostBulananRequest) => { bulananApi.save = async (config: TPostBulananRequest) => {
const response = await fetcher<TBaseResponseAPI<BupotRecord>>([ const response = await fetcher<TBaseResponseAPI<BupotRecord[]>>([
'/IF_TXR_028/a0', '/IF_TXR_028/a0',
{ {
method: 'POST', method: 'POST',
......
...@@ -4,8 +4,11 @@ import Divider from '@mui/material/Divider'; ...@@ -4,8 +4,11 @@ import Divider from '@mui/material/Divider';
import Grid from '@mui/material/Grid'; import Grid from '@mui/material/Grid';
import Stack from '@mui/material/Stack'; import Stack from '@mui/material/Stack';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { enqueueSnackbar } from 'notistack';
import { Suspense, useEffect, useMemo, useState } from 'react'; import { Suspense, useEffect, useMemo, useState } from 'react';
import { FormProvider, useForm } from 'react-hook-form'; import { FormProvider, useForm } from 'react-hook-form';
import { useNavigate, useParams } from 'react-router';
import { useKodeNegara } from 'src/actions/master-data';
import { CustomBreadcrumbs } from 'src/components/custom-breadcrumbs'; import { CustomBreadcrumbs } from 'src/components/custom-breadcrumbs';
import { Field } from 'src/components/hook-form'; import { Field } from 'src/components/hook-form';
import { DashboardContent } from 'src/layouts/dashboard'; import { DashboardContent } from 'src/layouts/dashboard';
...@@ -14,6 +17,7 @@ import Agreement from 'src/shared/components/agreement/Agreement'; ...@@ -14,6 +17,7 @@ import Agreement from 'src/shared/components/agreement/Agreement';
import HeadingRekam from 'src/shared/components/HeadingRekam'; import HeadingRekam from 'src/shared/components/HeadingRekam';
import FormSkeleton from 'src/shared/skeletons/FormSkeleton'; import FormSkeleton from 'src/shared/skeletons/FormSkeleton';
import z from 'zod'; import z from 'zod';
import DialogPenandatangan from '../components/DialogPenandatangan';
import Identitas from '../components/rekam/Identitas'; import Identitas from '../components/rekam/Identitas';
import JumlahPerhitunganForm from '../components/rekam/JumlahPerhitunganForm'; import JumlahPerhitunganForm from '../components/rekam/JumlahPerhitunganForm';
import PanduanDnRekam from '../components/rekam/PanduanDnRekam'; import PanduanDnRekam from '../components/rekam/PanduanDnRekam';
...@@ -23,27 +27,34 @@ import { ...@@ -23,27 +27,34 @@ import {
FG_FASILITAS_PPH_21_TEXT, FG_FASILITAS_PPH_21_TEXT,
KODE_OBJEK_PAJAK, KODE_OBJEK_PAJAK,
KODE_OBJEK_PAJAK_TEXT, KODE_OBJEK_PAJAK_TEXT,
PTKP,
PTKP_TEXT,
PTKP_TITLE,
} from '../constant'; } from '../constant';
import useGetBulanan from '../hooks/useGetBulanan';
import useSaveBulanan from '../hooks/useSaveBulanan'; import useSaveBulanan from '../hooks/useSaveBulanan';
import DialogPenandatangan from '../components/DialogPenandatangan';
import useUploadBulanan from '../hooks/useUploadeBulanan'; import useUploadBulanan from '../hooks/useUploadeBulanan';
import { useNavigate, useParams } from 'react-router';
import { enqueueSnackbar } from 'notistack';
import useGetBulanan from '../hooks/useGetBulanan';
const bulananSchema = z const bulananSchema = z
.object({ .object({
idBupot: z.string().optional(),
noBupot: z.string().optional(),
revNo: z.number().optional(),
tahunPajak: z.string().min(1, 'Tahun Pajak wajib diisi'), tahunPajak: z.string().min(1, 'Tahun Pajak wajib diisi'),
masaPajak: z.string().min(1, 'Masa Pajak wajib diisi'), masaPajak: z.string().min(1, 'Masa Pajak wajib diisi'),
feature: z.string().optional(), npwp: z.string().min(1, 'NPWP wajib diisi'),
idDipotong: z.string().optional(),
nitku: z.string().length(22, 'NITKU harus 22 digit'), nitku: z.string().length(22, 'NITKU harus 22 digit'),
namaDipotong: z.string().min(1, 'Nama wajib diisi'), namaDipotong: z.string().min(1, 'Nama wajib diisi'),
alamatDipotong: z.string().min(1, 'Alamat wajib diisi'), alamatDipotong: z.string().min(1, 'Alamat wajib diisi'),
posisiJabatan: z.string().min(1, 'Jabatan wajib diisi'), posisiJabatan: z.string().min(1, 'Jabatan wajib diisi'),
alamat: z.string().nullable().optional(), alamat: z.string().nullable().optional(),
fgKaryawanAsing: z.boolean().optional(), fgKaryawanAsing: z.boolean().optional(),
kodeNegara: z.string().optional(), kodeNegara: z
.object({
label: z.string(),
value: z.string(),
})
.optional(),
passport: z.string().optional(), passport: z.string().optional(),
kdObjPjk: z kdObjPjk: z
.object({ .object({
...@@ -172,7 +183,7 @@ export const BulananRekamView = () => { ...@@ -172,7 +183,7 @@ export const BulananRekamView = () => {
const { id, type } = useParams<{ id?: string; type?: 'ubah' | 'pengganti' | 'new' }>(); const { id, type } = useParams<{ id?: string; type?: 'ubah' | 'pengganti' | 'new' }>();
const navigate = useNavigate(); const navigate = useNavigate();
const { mutate: saveBulanan, isPending: isSaving } = useSaveBulanan({ const { mutateAsync: saveBulanan, isPending: isSaving } = useSaveBulanan({
onSuccess: () => enqueueSnackbar('Data berhasil disimpan', { variant: 'success' }), onSuccess: () => enqueueSnackbar('Data berhasil disimpan', { variant: 'success' }),
}); });
const { mutate: uploadBulanan, isPending: isUpload } = useUploadBulanan(); const { mutate: uploadBulanan, isPending: isUpload } = useUploadBulanan();
...@@ -195,13 +206,52 @@ export const BulananRekamView = () => { ...@@ -195,13 +206,52 @@ export const BulananRekamView = () => {
[] []
); );
const { kodeNegara } = useKodeNegara();
const kodeNegetaOptions = useMemo(
() => kodeNegara.map((val) => ({ label: val.nama, value: val.kode })),
[kodeNegara]
);
const fgFasilitasOptions = useMemo(
() =>
[
FG_FASILITAS_PPH_21.DTP,
FG_FASILITAS_PPH_21.FASILITAS_LAINNYA,
FG_FASILITAS_PPH_21.TANPA_FASILITAS,
].map((value) => ({
value,
label: FG_FASILITAS_PPH_21_TEXT[value],
})),
[]
);
const ptkpOptions = useMemo(
() =>
Object.entries(PTKP)
.map(([key, value]) => ({ value, label: PTKP_TEXT[value] }))
.filter((option) => !option.value.includes(PTKP_TITLE.HB)),
[]
);
const MockNitku = [
{
value: '1091031210912281000000',
label: '1091031210912281000000',
},
{
value: '1091031210912281000001',
label: '1091031210912281000001',
},
];
const { data: existingBulanan, isLoading: isLoadingBulanan } = useGetBulanan({ const { data: existingBulanan, isLoading: isLoadingBulanan } = useGetBulanan({
params: { params: {
page: 1, page: 1,
limit: 1, limit: 1,
id, id,
}, },
enabled: !!id, enabled: !!id && (isEdit || isPengganti),
}); });
type BpuFormData = z.infer<typeof bulananSchema>; type BpuFormData = z.infer<typeof bulananSchema>;
...@@ -211,12 +261,15 @@ export const BulananRekamView = () => { ...@@ -211,12 +261,15 @@ export const BulananRekamView = () => {
const defaultValues = { const defaultValues = {
tglPemotongan: dayjs().format('YYYY-MM-DD'), tglPemotongan: dayjs().format('YYYY-MM-DD'),
tahunPajak: dayjs().format('YYYY'), tahunPajak: dayjs().format('YYYY'),
masaPajak: dayjs().format('YYYY-MM'), masaPajak: dayjs().format('MM'),
npwp: '', npwp: '',
nitku: '', nitku: '',
namaDipotong: '', namaDipotong: '',
fgKaryawanAsing: false, fgKaryawanAsing: false,
kodeNegara: '', kodeNegara: {
value: '',
label: '',
},
passport: '', passport: '',
posisiJabatan: '', posisiJabatan: '',
kdObjPjk: { kdObjPjk: {
...@@ -251,12 +304,47 @@ export const BulananRekamView = () => { ...@@ -251,12 +304,47 @@ export const BulananRekamView = () => {
defaultValues, defaultValues,
}); });
console.log('🚀 ~ BulananRekamView:', {
methods: methods.getValues(),
error: methods.formState.errors,
});
useEffect(() => { useEffect(() => {
if ((isEdit || isPengganti) && existingBulanan && !isLoadingBulanan) { if ((isEdit || isPengganti) && existingBulanan.data.length !== 0) {
const dataResDetail = existingBulanan.data[0];
const normalized = { const normalized = {
...existingBulanan, ...dataResDetail,
tglPemotongan: dataResDetail.tglpemotongan,
tahunPajak: dataResDetail.thnPajak,
masaPajak: dataResDetail.masaPajak,
npwp: dataResDetail.npwp16Dipotong,
nitku: `${dataResDetail.npwp16Dipotong}000000`,
alamatDipotong: dataResDetail.alamat,
email: dataResDetail.email || '',
fgKaryawanAsing: !!dataResDetail.countryCode,
kodeNegara: kodeNegetaOptions.filter(
(val) => val.value === dataResDetail.countryCode
)[0] || {
value: '',
label: '',
},
passport: dataResDetail.passportNo || '',
kdObjPjk: dataListKOP.filter((val) => val.value === dataResDetail.kdObjPjk)[0],
fgFasilitas: fgFasilitasOptions.filter((val) => val.value === dataResDetail.fgFasilitas)[0],
ptkp: ptkpOptions.filter(
(val) => val.value === `${dataResDetail.statusPtkp}/${dataResDetail.jmlPtkp}`
)[0],
phBruto: dataResDetail.bruto,
pph21: dataResDetail.pphDipotong,
idTku: MockNitku.filter((val) => val.value === dataResDetail.nitkuPemotong)[0],
}; };
if (isPengganti) {
normalized['idBupot'] = dataResDetail.idBupot || '';
normalized['idBupot'] = dataResDetail.noBupot || '';
normalized['revNo'] = dataResDetail.revNo || 0;
}
methods.reset(normalized as any); methods.reset(normalized as any);
} }
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
...@@ -267,10 +355,8 @@ export const BulananRekamView = () => { ...@@ -267,10 +355,8 @@ export const BulananRekamView = () => {
const transformedData = { const transformedData = {
...data, ...data,
id: isEdit || isPengganti ? data.id : undefined, id: isEdit || isPengganti ? data.id : undefined,
msPajak: data.masaPajak,
thnPajak: data.tahunPajak,
passportNo: data.passport || '', passportNo: data.passport || '',
countryCode: data.kodeNegara || null, countryCode: data.kodeNegara?.value || null,
statusPtkp: data.ptkp?.value || '', statusPtkp: data.ptkp?.value || '',
kdObjPjk: data.kdObjPjk.value, kdObjPjk: data.kdObjPjk.value,
kdJnsPjk: 'PPh Pasal 21', // Sesuaikan dengan konstanta Anda kdJnsPjk: 'PPh Pasal 21', // Sesuaikan dengan konstanta Anda
...@@ -282,16 +368,19 @@ export const BulananRekamView = () => { ...@@ -282,16 +368,19 @@ export const BulananRekamView = () => {
fgGrossUp: parseInt(data.fgPerhitungan || '1', 10), fgGrossUp: parseInt(data.fgPerhitungan || '1', 10),
idTku: data.idTku.value, idTku: data.idTku.value,
komponen: data.jumlahPenghasilan || [], komponen: data.jumlahPenghasilan || [],
isPengganti,
}; };
await saveBulanan(transformedData); const response = await saveBulanan(transformedData);
return response;
}; };
const handleUploud = async (data: BpuFormData) => { const handleUploud = async (data: BpuFormData) => {
try { try {
const response = await handleDraft(data); const response = await handleDraft(data);
uploadBulanan({ uploadBulanan({
id: response?.id ?? '', id: `${response[0].id}`,
}); });
enqueueSnackbar('Berhasil Menyimpan Data', { variant: 'success' }); enqueueSnackbar('Berhasil Menyimpan Data', { variant: 'success' });
} catch (error: any) { } catch (error: any) {
...@@ -307,8 +396,7 @@ export const BulananRekamView = () => { ...@@ -307,8 +396,7 @@ export const BulananRekamView = () => {
const SubmitRekam = async (data: BpuFormData) => { const SubmitRekam = async (data: BpuFormData) => {
try { try {
const respon = await handleDraft(data); await handleDraft(data);
console.log({ respon });
enqueueSnackbar( enqueueSnackbar(
isEdit isEdit
? 'Data berhasil diperbarui' ? 'Data berhasil diperbarui'
...@@ -325,15 +413,6 @@ export const BulananRekamView = () => { ...@@ -325,15 +413,6 @@ export const BulananRekamView = () => {
} }
}; };
const MockNitku = [
{
nama: '1091031210912281000000',
},
{
nama: '1091031210912281000001',
},
];
return ( return (
<> <>
<DashboardContent> <DashboardContent>
...@@ -356,20 +435,19 @@ export const BulananRekamView = () => { ...@@ -356,20 +435,19 @@ export const BulananRekamView = () => {
<form onSubmit={methods.handleSubmit(SubmitRekam)}> <form onSubmit={methods.handleSubmit(SubmitRekam)}>
<FormProvider {...methods}> <FormProvider {...methods}>
<Suspense fallback={<FormSkeleton />}> <Suspense fallback={<FormSkeleton />}>
<Identitas /> <Identitas isPengganti={isPengganti} kodeNegetaOptions={kodeNegetaOptions} />
<Suspense fallback={<FormSkeleton />}> <Suspense fallback={<FormSkeleton />}>
<PerhitunganPPhPasal21 kodeObjectPajak={dataListKOP} /> <PerhitunganPPhPasal21
kodeObjectPajak={dataListKOP}
fgFasilitasOptions={fgFasilitasOptions}
/>
</Suspense> </Suspense>
<JumlahPerhitunganForm /> <JumlahPerhitunganForm ptkpOptions={ptkpOptions} />
<Grid size={{ md: 12 }}> <Grid size={{ md: 12 }}>
<Field.Autocomplete <Field.Autocomplete name="idTku" label="NITKU Pemotong" options={MockNitku} />
name="idTku"
label="NITKU Pemotong"
options={MockNitku.map((a) => ({ value: a.nama, label: a.nama }))}
/>
</Grid> </Grid>
<Divider /> <Divider />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment