import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable } from 'rxjs'; import { ApiConfigService } from '../../../core/services/api-config.service'; import { PagedResult, ExpenseListItemDto, ExpenseDto, CreateExpenseRequest, UpdateExpenseRequest, RejectExpenseRequest, PayExpenseRequest, } from '../models/expense.model'; export interface ExpenseQuery { page?: number; pageSize?: number; search?: string; ministryId?: number; categoryGroupId?: number; status?: string; from?: string; to?: string; } @Injectable({ providedIn: 'root' }) export class ExpenseApiService { private readonly endpoint: string; constructor(private http: HttpClient, apiConfig: ApiConfigService) { this.endpoint = apiConfig.getApiUrl('expenses'); } private toParams(q: Record): HttpParams { let p = new HttpParams(); for (const [k, v] of Object.entries(q)) if (v !== undefined && v !== null && v !== '') p = p.set(k, String(v)); return p; } getPaged(q: ExpenseQuery): Observable> { return this.http.get>(this.endpoint, { params: this.toParams(q as Record) }); } getMine(status?: string, page = 1, pageSize = 50): Observable> { return this.http.get>(`${this.endpoint}/mine`, { params: this.toParams({ status, page, pageSize }) }); } getById(id: number): Observable { return this.http.get(`${this.endpoint}/${id}`); } create(r: CreateExpenseRequest): Observable<{ id: number }> { return this.http.post<{ id: number }>(this.endpoint, r); } update(id: number, r: UpdateExpenseRequest): Observable { return this.http.put(`${this.endpoint}/${id}`, r); } delete(id: number): Observable { return this.http.delete(`${this.endpoint}/${id}`); } submit(id: number): Observable { return this.http.post(`${this.endpoint}/${id}/submit`, {}); } approve(id: number): Observable { return this.http.post(`${this.endpoint}/${id}/approve`, {}); } reject(id: number, r: RejectExpenseRequest): Observable { return this.http.post(`${this.endpoint}/${id}/reject`, r); } pay(id: number, r: PayExpenseRequest): Observable { return this.http.post(`${this.endpoint}/${id}/pay`, r); } uploadReceipt(id: number, file: File): Observable { const form = new FormData(); form.append('file', file); return this.http.post(`${this.endpoint}/${id}/receipt`, form); } receiptUrl(id: number): string { return `${this.endpoint}/${id}/receipt`; } }