Preserve the local Ant UI work across views/components and add the new home dashboard chart panels before merging latest main.
188 lines
4.7 KiB
TypeScript
188 lines
4.7 KiB
TypeScript
import type {
|
|
FinancialDocumentDto,
|
|
FinancialInstallmentDto,
|
|
TreasuryDashboardDto,
|
|
} from '@mento/shared';
|
|
|
|
function daysFromNow(days: number) {
|
|
const d = new Date();
|
|
d.setHours(12, 0, 0, 0);
|
|
d.setDate(d.getDate() + days);
|
|
return d.toISOString();
|
|
}
|
|
|
|
function doc(
|
|
partial: Pick<
|
|
FinancialDocumentDto,
|
|
'id' | 'kind' | 'title' | 'amount' | 'settledAmount' | 'remaining' | 'status' | 'categoryName' | 'partyName'
|
|
> &
|
|
Partial<FinancialDocumentDto>,
|
|
): FinancialDocumentDto {
|
|
return {
|
|
bookedAt: daysFromNow(-3),
|
|
dueAt: daysFromNow(10),
|
|
categoryId: null,
|
|
personId: null,
|
|
accountId: null,
|
|
accountName: 'صندوق اصلی',
|
|
method: 'transfer',
|
|
reference: null,
|
|
notes: null,
|
|
createdAt: daysFromNow(-2),
|
|
...partial,
|
|
};
|
|
}
|
|
|
|
function installment(
|
|
partial: FinancialInstallmentDto,
|
|
): FinancialInstallmentDto {
|
|
return partial;
|
|
}
|
|
|
|
/** دیتای نمایشی برای پیشنمایش داشبورد وقتی API خالی است */
|
|
export const TREASURY_DASHBOARD_MOCK: TreasuryDashboardDto = {
|
|
bookedIncome: '185000000',
|
|
actualReceipts: '142500000',
|
|
bookedExpense: '98000000',
|
|
actualPayments: '87500000',
|
|
operatingProfit: '87000000',
|
|
receivables: '42500000',
|
|
payables: '18500000',
|
|
totalBalance: '256000000',
|
|
upcomingInstallments: [
|
|
installment({
|
|
id: 'mock-inst-1',
|
|
position: 2,
|
|
dueDate: daysFromNow(-2),
|
|
amount: '12000000',
|
|
paidAmount: '0',
|
|
remaining: '12000000',
|
|
status: 'overdue',
|
|
}),
|
|
installment({
|
|
id: 'mock-inst-2',
|
|
position: 3,
|
|
dueDate: daysFromNow(5),
|
|
amount: '12000000',
|
|
paidAmount: '4000000',
|
|
remaining: '8000000',
|
|
status: 'partial',
|
|
}),
|
|
installment({
|
|
id: 'mock-inst-3',
|
|
position: 4,
|
|
dueDate: daysFromNow(35),
|
|
amount: '12000000',
|
|
paidAmount: '0',
|
|
remaining: '12000000',
|
|
status: 'open',
|
|
}),
|
|
],
|
|
upcomingPayables: [
|
|
doc({
|
|
id: 'mock-pay-1',
|
|
kind: 'expense',
|
|
title: 'اجاره دفتر — مهر',
|
|
amount: '45000000',
|
|
settledAmount: '30000000',
|
|
remaining: '15000000',
|
|
status: 'partial',
|
|
categoryName: 'اجاره',
|
|
partyName: 'موجر ساختمان',
|
|
}),
|
|
doc({
|
|
id: 'mock-pay-2',
|
|
kind: 'expense',
|
|
title: 'بیمه تکمیلی کارکنان',
|
|
amount: '8500000',
|
|
settledAmount: '5000000',
|
|
remaining: '3500000',
|
|
status: 'partial',
|
|
categoryName: 'بیمه',
|
|
partyName: 'بیمه ایران',
|
|
}),
|
|
],
|
|
recent: [
|
|
doc({
|
|
id: 'mock-doc-1',
|
|
kind: 'income',
|
|
title: 'پیشپرداخت پروژه آلفا',
|
|
amount: '75000000',
|
|
settledAmount: '75000000',
|
|
remaining: '0',
|
|
status: 'settled',
|
|
categoryName: 'فروش خدمات',
|
|
partyName: 'شرکت آریا',
|
|
bookedAt: daysFromNow(-1),
|
|
}),
|
|
doc({
|
|
id: 'mock-doc-2',
|
|
kind: 'expense',
|
|
title: 'خرید تجهیزات شبکه',
|
|
amount: '18500000',
|
|
settledAmount: '18500000',
|
|
remaining: '0',
|
|
status: 'settled',
|
|
categoryName: 'تجهیزات',
|
|
partyName: 'فروشگاه سختافزار',
|
|
bookedAt: daysFromNow(-2),
|
|
}),
|
|
doc({
|
|
id: 'mock-doc-3',
|
|
kind: 'income',
|
|
title: 'قسط قرارداد بتا',
|
|
amount: '12000000',
|
|
settledAmount: '0',
|
|
remaining: '12000000',
|
|
status: 'open',
|
|
categoryName: 'فروش خدمات',
|
|
partyName: 'گروه سپهر',
|
|
bookedAt: daysFromNow(-4),
|
|
}),
|
|
doc({
|
|
id: 'mock-doc-4',
|
|
kind: 'expense',
|
|
title: 'حقوق مهر — تیم فروش',
|
|
amount: '42000000',
|
|
settledAmount: '42000000',
|
|
remaining: '0',
|
|
status: 'settled',
|
|
categoryName: 'حقوق',
|
|
partyName: null,
|
|
bookedAt: daysFromNow(-5),
|
|
}),
|
|
doc({
|
|
id: 'mock-doc-5',
|
|
kind: 'income',
|
|
title: 'فروش پکیج پشتیبانی',
|
|
amount: '28000000',
|
|
settledAmount: '10000000',
|
|
remaining: '18000000',
|
|
status: 'partial',
|
|
categoryName: 'پشتیبانی',
|
|
partyName: 'کارخانه نوین',
|
|
bookedAt: daysFromNow(-6),
|
|
}),
|
|
],
|
|
};
|
|
|
|
export function isTreasuryDashboardEmpty(data: TreasuryDashboardDto | null | undefined) {
|
|
if (!data) return true;
|
|
const keys = [
|
|
data.bookedIncome,
|
|
data.actualReceipts,
|
|
data.bookedExpense,
|
|
data.actualPayments,
|
|
data.totalBalance,
|
|
data.receivables,
|
|
data.payables,
|
|
] as const;
|
|
const allZero = keys.every((v) => !Number(v));
|
|
return (
|
|
allZero &&
|
|
data.recent.length === 0 &&
|
|
data.upcomingInstallments.length === 0 &&
|
|
data.upcomingPayables.length === 0
|
|
);
|
|
}
|