Refund.java 1.73 KB
package com.ecommerce.payment.model;

import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Data
@NoArgsConstructor
@Entity
@Table(name = "refunds")
public class Refund {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "refund_id", unique = true, nullable = false)
    private String refundId;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "payment_id", nullable = false)
    private Payment payment;
    
    @Column(name = "amount", nullable = false, precision = 12, scale = 2)
    private BigDecimal amount;
    
    @Column(name = "currency", nullable = false)
    private String currency = "USD";
    
    @Column(name = "status", nullable = false)
    private String status = "PENDING"; // PENDING, PROCESSING, SUCCEEDED, FAILED, CANCELLED
    
    @Column(name = "reason")
    private String reason;
    
    @Column(name = "gateway_refund_id")
    private String gatewayRefundId;
    
    @Column(name = "failure_reason")
    private String failureReason;
    
    @Column(name = "failure_code")
    private String failureCode;
    
    @Column(name = "metadata", columnDefinition = "TEXT")
    private String metadata;
    
    @Column(name = "created_at")
    private LocalDateTime createdAt;
    
    @Column(name = "processed_at")
    private LocalDateTime processedAt;
    
    @PrePersist
    protected void onCreate() {
        if (refundId == null) {
            refundId = generateRefundId();
        }
        createdAt = LocalDateTime.now();
    }
    
    private String generateRefundId() {
        return "REF" + System.currentTimeMillis() + (int)(Math.random() * 1000);
    }
}