Files
edr-platform/apps/edr-hr-web/src/features/payroll/api.ts
2026-08-25 00:11:39 +03:00

143 lines
4.3 KiB
TypeScript

import { hrApi } from "@/auth/http";
import type {
EmployeeSalary,
IncomeTaxBracket,
PayrollRun,
PayrollRunStatus,
Payslip,
SalaryComponent,
SalaryStructure,
StatutoryRate,
} from "./types";
interface Page<T> {
items: T[];
total: number;
page: number;
pageCount: number;
}
export const seedPayrollStatutory = async () => {
const response = await hrApi.post<{
components: { created: string[]; skipped: string[] };
taxBands: string;
rates: { created: string[]; skipped: string[] };
}>("/payroll/seed-statutory");
return response.data;
};
export const listComponents = async (): Promise<SalaryComponent[]> => {
const response = await hrApi.get<SalaryComponent[]>("/payroll/components");
return response.data;
};
export const listStructures = async (): Promise<SalaryStructure[]> => {
const response = await hrApi.get<SalaryStructure[]>("/payroll/structures");
return response.data;
};
export const getStructure = async (id: string): Promise<SalaryStructure> => {
const response = await hrApi.get<SalaryStructure>(`/payroll/structures/${id}`);
return response.data;
};
export const createStructure = async (payload: {
code: string;
name: { am: string; en: string };
lines?: { salaryComponentId: string; amount?: string; rate?: string }[];
}) => {
const response = await hrApi.post<SalaryStructure>("/payroll/structures", payload);
return response.data;
};
export const listTaxBrackets = async (): Promise<IncomeTaxBracket[]> => {
const response = await hrApi.get<IncomeTaxBracket[]>("/payroll/tax-brackets");
return response.data;
};
export const listStatutoryRates = async (): Promise<StatutoryRate[]> => {
const response = await hrApi.get<StatutoryRate[]>("/payroll/statutory-rates");
return response.data;
};
export const assignSalary = async (payload: {
employeeId: string;
basicSalary: string;
salaryStructureId?: string;
effectiveFrom: string;
reason?: string;
}) => {
const response = await hrApi.post<EmployeeSalary>("/payroll/salaries", payload);
return response.data;
};
export const getSalaryHistory = async (employeeId: string) => {
const response = await hrApi.get<EmployeeSalary[]>(
`/payroll/salaries/${employeeId}`,
);
return response.data;
};
// ── Runs ────────────────────────────────────────────────────────────────────
export const listPayrollRuns = async (params?: {
status?: PayrollRunStatus;
page?: number;
limit?: number;
}) => {
const response = await hrApi.get<Page<PayrollRun>>("/payroll-runs", { params });
return response.data;
};
export const getPayrollRun = async (id: string): Promise<PayrollRun> => {
const response = await hrApi.get<PayrollRun>(`/payroll-runs/${id}`);
return response.data;
};
export const createPayrollRun = async (payload: {
periodStart: string;
periodEnd: string;
paymentDate?: string;
note?: string;
}) => {
const response = await hrApi.post<PayrollRun>("/payroll-runs", payload);
return response.data;
};
export const calculatePayrollRun = async (id: string) => {
const response = await hrApi.post<PayrollRun>(`/payroll-runs/${id}/calculate`);
return response.data;
};
export const approvePayrollRun = async (id: string) => {
const response = await hrApi.patch<PayrollRun>(`/payroll-runs/${id}/approve`);
return response.data;
};
export const markPayrollPaid = async (id: string, paymentDate?: string) => {
const response = await hrApi.patch<PayrollRun>(`/payroll-runs/${id}/mark-paid`, {
paymentDate,
});
return response.data;
};
export const cancelPayrollRun = async (id: string) => {
const response = await hrApi.patch<PayrollRun>(`/payroll-runs/${id}/cancel`);
return response.data;
};
export const listRunPayslips = async (id: string): Promise<Payslip[]> => {
const response = await hrApi.get<Payslip[]>(`/payroll-runs/${id}/payslips`);
return response.data;
};
export const getPayslip = async (id: string): Promise<Payslip> => {
const response = await hrApi.get<Payslip>(`/payroll-runs/payslips/${id}`);
return response.data;
};
export const getMyPayslips = async (): Promise<Payslip[]> => {
const response = await hrApi.get<Payslip[]>("/payroll-runs/my-payslips");
return response.data;
};