import { HttpClient } from '@angular/common/http'; import { Injectable, inject } from '@angular/core'; import { Observable } from 'rxjs'; export type RentPaymentStatus = 'CONFIRMED' | 'REVERSED'; export interface PaymentAllocation { id: string; rentDueId: string; amount: number; allocatedAt: string; } export interface RentPaymentRefund { id: string; amount: number; refundedAt: string; version: number; } export interface RentPaymentReversal { id: string; reversedAt: string; reason: string; reversedAllocations: PaymentAllocation[]; } export interface RentPayment { id: string; leaseId: string; receivedAt: string; amount: number; status: RentPaymentStatus; allocations: PaymentAllocation[]; allocatedAmount: number; refundedAmount: number; unallocatedBalance: number; confirmedAt: string; version: number; refunds: RentPaymentRefund[]; reversal: RentPaymentReversal | null; } export interface RecordRentPaymentRequest { operationId: string; rentDueId: string; rentDueVersion: number; receivedAt: string; amount: number; timeZone: string; } export interface AllocateRentPaymentRequest { operationId: string; paymentVersion: number; rentDueId: string; rentDueVersion: number; amount: number; } export interface RefundRentPaymentRequest { operationId: string; paymentVersion: number; amount: number; refundedAt: string; timeZone: string; } @Injectable({ providedIn: 'root' }) export class RentPaymentService { private readonly http = inject(HttpClient); getRentPayments(): Observable { return this.http.get('/api/rent-payments'); } record(request: RecordRentPaymentRequest): Observable { return this.http.post('/api/rent-payments', request); } allocate(paymentId: string, request: AllocateRentPaymentRequest): Observable { return this.http.post(`/api/rent-payments/${paymentId}/allocations`, request); } refund(paymentId: string, request: RefundRentPaymentRequest): Observable { return this.http.post(`/api/rent-payments/${paymentId}/refunds`, request); } reverse(paymentId: string, paymentVersion: number, reason: string): Observable { return this.http.post(`/api/rent-payments/${paymentId}/reversal`, { paymentVersion, reason, }); } downloadReceipt(id: string): Observable { return this.http.get(`/api/rent-payments/${id}/receipt`, { responseType: 'blob' }); } }