fix member n kyc

This commit is contained in:
unknown
2025-04-25 16:00:24 +07:00
17 changed files with 132 additions and 114 deletions

View File

@ -46,7 +46,7 @@ export async function doSaveLogActivity(payload: SaveLogsParams): Promise<Action
throw new Error(response.data.message ?? 'Failed to save log');
}
console.log('Success Create logs with params =>', dtParams);
// console.log('Success Create logs with params =>', dtParams);
return { status: true, message: 'Success logs users' };
} catch (error: any) {

View File

@ -252,14 +252,14 @@ const DashboardHomePage = () => {
<Card
title="Registered Users"
total={responseStatisticCard?.data.total_registered ?? 0}
growth={responseStatisticCard?.data.registered_last_week.percent ?? 0}
growth={parseFloat((responseStatisticCard?.data?.registered_last_week.percent ?? 0).toFixed(2)) ?? 0}
surplus={responseStatisticCard?.data.registered_last_week.surplus ?? false}
icon="test"
/>
<Card
title="Unregistered Users"
total={responseStatisticCard?.data.total_unregistered ?? 0}
growth={responseStatisticCard?.data.unregistered_last_week.percent ?? 0}
growth={parseFloat((responseStatisticCard?.data?.unregistered_last_week.percent ?? 0).toFixed(2)) ?? 0}
surplus={responseStatisticCard?.data.unregistered_last_week.surplus ?? false}
icon="test"
@ -267,28 +267,28 @@ const DashboardHomePage = () => {
<Card
title="Total Cash-in"
total={responseStatisticCard?.data.total_cash_in ?? 0}
growth={responseStatisticCard?.data.cash_in_last_week.percent ?? 0}
growth={parseFloat((responseStatisticCard?.data?.cash_in_last_week.percent ?? 0).toFixed(2))?? 0}
surplus={responseStatisticCard?.data.cash_in_last_week.surplus ?? false}
icon="test"
/>
<Card
title="Total Cash-out"
total={responseStatisticCard?.data.total_cash_out ?? 0}
growth={responseStatisticCard?.data.cash_out_last_week.percent ?? 0}
growth={parseFloat((responseStatisticCard?.data?.cash_out_last_week.percent ?? 0).toFixed(2)) ?? 0}
surplus={responseStatisticCard?.data.cash_out_last_week.surplus ?? false}
icon="test"
/>
<Card
title="Active Event"
total={responseStatisticCard?.data.total_event ?? 0}
growth={responseStatisticCard?.data.event_last_week.percent ?? 0}
growth={parseFloat((responseStatisticCard?.data?.event_last_week.percent ?? 0).toFixed(2)) ?? 0}
surplus={responseStatisticCard?.data.event_last_week.surplus ?? false}
icon="test"
/>
<Card
title="Total Billing"
total={responseStatisticCard?.data.total_billing ?? 0}
growth={responseStatisticCard?.data.billing_last_week.percent ?? 0}
growth={parseFloat((responseStatisticCard?.data?.billing_last_week.percent ?? 0).toFixed(2)) ?? 0}
surplus={responseStatisticCard?.data.billing_last_week.surplus ?? false}
icon='test'
/>

View File

@ -42,6 +42,7 @@ const TransactionPieChart = ({ startdate, enddate }: Props) => {
{ name: 'Topup', value: parseFloat((responseTransactionValue?.data?.U ?? 0).toFixed(2)), color: '#9f7aea' },
{ name: 'Purchase', value: parseFloat((responseTransactionValue?.data?.P ?? 0).toFixed(2)), color: '#baf7c5' },
{ name: 'Withdraw', value: parseFloat((responseTransactionValue?.data?.W ?? 0).toFixed(2)), color: '#f56565' },
{ name: 'Top Up Partner', value: parseFloat((responseTransactionValue?.data?.N ?? 0).toFixed(2)), color: '#f7fa52' },
];
return (

View File

@ -61,6 +61,9 @@ const TransactionValue = ({ startdate, enddate }: Props) => {
case "R":
type = "Return";
break;
case "N":
type = "Top Up Partner";
break;
default:
type = "Unknown";
break;

View File

@ -235,7 +235,7 @@ const ManageGroups = () => {
<DataGridProvider
data={dataGroup}
columns={getColumns(handleUpdate)}
pagination={{ size: 25 }}
pagination={{ size: 10 }}
toolbar={
<ListToolBar
createGroup={createGroup}

View File

@ -180,7 +180,7 @@ const ManageWalletContextProvider = ({ children }: { children: React.ReactNode }
<Toaster expand visibleToasts={9} duration={3000} />
<DataGridProvider
columns={columns}
pagination={{ size: 25 }}
pagination={{ size: 10 }}
toolbar={<ListToolbar />}
layout={{ card: true }}
sorting={[{ id: 'wallets.created_at', desc: true }]}

View File

@ -97,7 +97,7 @@ const EditDialog = () => {
}
const data = response.data;
console.log('Fetched data:', data);
// console.log('Fetched data:', data);
setReviewNotes(data.review_notes || '');

View File

@ -92,7 +92,7 @@ const ManageFeedbackMemberProvider = ({ children }: { children: React.ReactNode
const columns = useMemo<ColumnDef<any>[]>(
() => [
{
accessorFn: (row) => row.customerid,
accessorFn: (row) => row.fullname,
id: 'customer_id',
header: ({ column }) => <DataGridColumnHeader title="Customer Name" column={column} />,
enableSorting: false,

View File

@ -22,7 +22,7 @@ const ManageKycDeletion = () => {
</Link>
<Link underline="none" color="inherit">
<span className="text-sm">History Disbursement</span>
<span className="text-sm">Manage KYC Deletion</span>
</Link>
</Breadcrumbs>
<div className="grid gap-5 lg:gap-7.5">

View File

@ -126,7 +126,7 @@ const ManageKycDeletionContextProvider = ({ children }: { children: React.ReactN
order_direction: 'DESC',
filter: JSON.stringify(formattedFilter)
});
setManageKyc(response?.data.list);
return { data: response?.data.list, totalCount: response?.data.total_count };
} catch (error) {

View File

@ -246,7 +246,7 @@ const Kyc = () => {
)}
<DataGridProvider
data={members}
pagination={{ size: 25 }}
pagination={{ size: 10 }}
columns={getColumns(handleUpdate)}
layout={{ card: true }}
sorting={[{ id: 'created_at', desc: true }]}

View File

@ -266,7 +266,7 @@ const ManageMembers = () => {
)}
<DataGridProvider
data={members}
pagination={{ size: 25 }}
pagination={{ size: 10 }}
columns={getColumns(handleUpdate)}
layout={{ card: true }}
serverSide={false}

View File

@ -292,7 +292,7 @@ const ManageMenusContextProvider = ({ children }: { children: React.ReactNode })
<DataGridProvider
columns={columns}
pagination={{ size: 25 }}
pagination={{ size: 10 }}
toolbar={<ListToolbar />}
layout={{ card: true }}
sorting={[{ id: 'created_at', desc: true }]}

View File

@ -144,6 +144,7 @@ const ListToolbar = () => {
<SelectItem value="W">WITHDRAW</SelectItem>
<SelectItem value="U">TOP UP</SelectItem>
<SelectItem value="R">RETURN</SelectItem>
<SelectItem value='N'>TOP UP PARTNER</SelectItem>
</SelectContent>
</Select>

View File

@ -70,6 +70,7 @@ const TransactionProvider = ({ children }: { children: React.ReactNode }) => {
case 'W': return 'WITHDRAW';
case 'U': return 'TOP UP';
case 'R': return 'RETURN';
case 'N': return 'TOP UP PARTNER';
default: return '_';
}
},

View File

@ -25,7 +25,14 @@ import { useCallApi } from '@/hooks';
import { doSaveLogActivity } from '@/actions/GlobalActions';
import { getAuth } from '@/auth';
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';
import {
Command,
CommandEmpty,
CommandGroup,
CommandInput,
CommandItem,
CommandList
} from '@/components/ui/command';
const API_URL = apiConfig.service_transaction;
const API_URL_MASTER_DATA = apiConfig.service_master_data;
@ -178,9 +185,9 @@ const EditFeeDialog = () => {
);
if (response?.status) {
toast.success('Successfully updated transfer fee');
reload();
handleEditFeeDialog(false, null);
toast.success('Successfully updated transfer fee');
const createActivity = {
module: 'Manage Transfer Fee',
description: `Edit Transfer Fee => ${formField.name}`,
@ -197,7 +204,7 @@ const EditFeeDialog = () => {
setIsSubmitting(false);
}
},
[formField, selectedTransferFee, PutData, reload, handleEditFeeDialog]
[formField, selectedTransferFee, handleEditFeeDialog]
);
const fetchWallets = useCallback(async () => {
@ -315,7 +322,7 @@ const EditFeeDialog = () => {
updated_by: parsedUser?.username,
updated_at: new Date().toISOString().slice(0, 19).replace('T', ' ')
});
if (response.data.transaction_type?.name) {
setTransactionTypeName(response.data.transaction_type.name);
}
@ -421,7 +428,7 @@ const EditFeeDialog = () => {
</Alert>
</div>
)}
{isLoadingTransferFee ? (
<div className="flex flex-col items-center justify-center p-8">
<div className="animate-pulse flex space-x-4 w-full">
@ -458,14 +465,14 @@ const EditFeeDialog = () => {
</div>
</div>
)}
<input
type="hidden"
name="transaction_type"
value={formField.transaction_type}
<input
type="hidden"
name="transaction_type"
value={formField.transaction_type}
/>
</div>
</div>
<div className="w-full">
<label className="form-label">
Transfer Fee Name <span className="text-red-500">*</span>
@ -480,7 +487,7 @@ const EditFeeDialog = () => {
}
/>
</div>
<div className="w-full">
<label className="form-label">
Description <span className="text-red-500">*</span>
@ -495,7 +502,7 @@ const EditFeeDialog = () => {
}
/>
</div>
<div className="w-full">
<label className="form-label">Minimum Amount</label>
<NumericFormat
@ -513,7 +520,7 @@ const EditFeeDialog = () => {
placeholder="Enter Minimum Amount"
/>
</div>
<div className="w-full">
<label className="form-label">Maximum Amount</label>
<NumericFormat
@ -531,7 +538,7 @@ const EditFeeDialog = () => {
placeholder="Enter Maximum Amount"
/>
</div>
<div className="w-full">
<label className="form-label">
Period Start <span className="text-red-500">*</span>
@ -546,7 +553,7 @@ const EditFeeDialog = () => {
}
/>
</div>
<div className="w-full">
<label className="form-label">
Period End <span className="text-red-500">*</span>
@ -561,7 +568,7 @@ const EditFeeDialog = () => {
}
/>
</div>
<div className="w-full">
<label className="form-label">Deduct Amount</label>
<NumericFormat
@ -579,7 +586,7 @@ const EditFeeDialog = () => {
placeholder="Enter Deduct Amount"
/>
</div>
<div className="w-full">
<label className="form-label">Deduct Percentage</label>
<NumericFormat
@ -597,7 +604,7 @@ const EditFeeDialog = () => {
placeholder="Enter Deduct Percentage"
/>
</div>
<div className="w-full">
<label className="form-label">Fee Amount</label>
<NumericFormat
@ -615,7 +622,7 @@ const EditFeeDialog = () => {
placeholder="Enter Fee Amount"
/>
</div>
<div className="w-full">
<label className="form-label">
Deduct From <span className="text-red-500">*</span>
@ -633,7 +640,7 @@ const EditFeeDialog = () => {
</SelectContent>
</Select>
</div>
<div className="w-full">
<label className="form-label">
Deduct From Destination <span className="text-red-500">*</span>
@ -646,7 +653,7 @@ const EditFeeDialog = () => {
isLoadingWallets
)}
</div>
<div className="w-full">
<label className="form-label">
Credit To <span className="text-red-500">*</span>
@ -672,74 +679,81 @@ const EditFeeDialog = () => {
</SelectContent>
</Select>
</div>
{formField.credit_to === 'I' && (
<div className="w-full">
<label className="form-label">
Credit Destination <span className="text-red-500">*</span>
</label>
<div className="relative">
<div
className="flex w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 cursor-pointer"
onClick={() => setOpen(!open)}
>
<span className="truncate">
{customers.find(customer => customer.id === formField.credit_destination)?.username || 'Search customer...'}
</span>
<path d="m6 9 6 6 6-6"></path>
</div>
{open && (
<div className="absolute left-0 right-0 top-full z-50 mt-1 max-h-52 overflow-auto rounded-md border border-gray-200 bg-white shadow-lg">
<div className="sticky top-0 bg-white p-2 border-b">
<Input
className="h-8 text-sm"
type="text"
placeholder="Search customer..."
value={customerSearchTerm}
onChange={(e) => setCustomerSearchTerm(e.target.value)}
autoComplete="off"
onClick={(e) => e.stopPropagation()}
autoFocus
/>
</div>
<div>
{customers
.filter(customer =>
customer.username.toLowerCase().includes(customerSearchTerm.toLowerCase()) ||
customer.msisdn.includes(customerSearchTerm)
)
.map(customer => (
<div
key={customer.id}
className="cursor-pointer px-3 py-1.5 text-sm hover:bg-gray-100"
onClick={() => {
setFormField({
...formField,
credit_destination: customer.id
});
setOpen(false);
}}
>
{customer.username}
</div>
))}
{customers.filter(customer =>
customer.username.toLowerCase().includes(customerSearchTerm.toLowerCase()) ||
customer.msisdn.includes(customerSearchTerm)
).length === 0 && (
<div className="px-3 py-2 text-sm text-gray-500">No customer found</div>
)}
</div>
</div>
)}
</div>
</div>
)}
<div className="w-full">
<label className="form-label">
Credit Destination <span className="text-red-500">*</span>
</label>
<div className="relative">
<div
className="flex w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 cursor-pointer"
onClick={() => setOpen(!open)}
>
<span className="truncate">
{customers.find(
(customer) => customer.id === formField.credit_destination
)?.username || 'Search customer...'}
</span>
<path d="m6 9 6 6 6-6"></path>
</div>
{open && (
<div className="absolute left-0 right-0 top-full z-50 mt-1 max-h-52 overflow-auto rounded-md border border-gray-200 bg-white shadow-lg">
<div className="sticky top-0 bg-white p-2 border-b">
<Input
className="h-8 text-sm"
type="text"
placeholder="Search customer..."
value={customerSearchTerm}
onChange={(e) => setCustomerSearchTerm(e.target.value)}
autoComplete="off"
onClick={(e) => e.stopPropagation()}
autoFocus
/>
</div>
<div>
{customers
.filter(
(customer) =>
customer.username
.toLowerCase()
.includes(customerSearchTerm.toLowerCase()) ||
customer.msisdn.includes(customerSearchTerm)
)
.map((customer) => (
<div
key={customer.id}
className="cursor-pointer px-3 py-1.5 text-sm hover:bg-gray-100"
onClick={() => {
setFormField({
...formField,
credit_destination: customer.id
});
setOpen(false);
}}
>
{customer.username}
</div>
))}
{customers.filter(
(customer) =>
customer.username
.toLowerCase()
.includes(customerSearchTerm.toLowerCase()) ||
customer.msisdn.includes(customerSearchTerm)
).length === 0 && (
<div className="px-3 py-2 text-sm text-gray-500">
No customer found
</div>
)}
</div>
</div>
)}
</div>
</div>
)}
<div className="w-full">
<label className="form-label">
Credit Destination Account <span className="text-red-500">*</span>
@ -752,7 +766,7 @@ const EditFeeDialog = () => {
isLoadingWallets
)}
</div>
<div className="w-full">
<label className="form-label">
Status <span className="text-red-500">*</span>
@ -770,14 +784,16 @@ const EditFeeDialog = () => {
</SelectContent>
</Select>
</div>
<div className="w-full">
<label className="form-label">
Status Include <span className="text-red-500">*</span>
</label>
<Select
value={formField.status_include}
onValueChange={(value) => setFormField({ ...formField, status_include: value })}
onValueChange={(value) =>
setFormField({ ...formField, status_include: value })
}
>
<SelectTrigger>
<SelectValue placeholder="Select Status" />
@ -788,7 +804,7 @@ const EditFeeDialog = () => {
</SelectContent>
</Select>
</div>
<div className="w-full">
<label className="form-label">
Priority <span className="text-red-500">*</span>
@ -806,13 +822,9 @@ const EditFeeDialog = () => {
</SelectContent>
</Select>
</div>
<div className="flex justify-end pt-2.5 gap-5">
<Button
variant={'outline'}
type="button"
onClick={resetForm}
>
<Button variant={'outline'} type="button" onClick={resetForm}>
Reset
</Button>
<Button
@ -839,4 +851,4 @@ const EditFeeDialog = () => {
);
};
export {EditFeeDialog};
export { EditFeeDialog };

View File

@ -378,7 +378,7 @@ const ManageTransferFeeContextProvider = ({
transactionTypeId
}}
>
<Toaster expand visibleToasts={9} duration={3000} />
{/* <Toaster expand visibleToasts={9} duration={3000} /> */}
<DataGridProvider
columns={columns}
pagination={{ size: 10 }}