Payment.java
package com.ctrlbuy.webshop.model;
import com.ctrlbuy.webshop.model.Order;
import com.ctrlbuy.webshop.enums.PaymentStatus;
import com.ctrlbuy.webshop.enums.PaymentType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* Payment entity för databas-lagring
*/
@Entity
@Table(name = "payments")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Payment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id", nullable = false)
private Order order;
@Column(name = "amount", nullable = false, precision = 10, scale = 2)
private BigDecimal amount;
@Column(name = "card_type", length = 20)
private String cardType;
@Column(name = "masked_card_number", length = 20)
private String maskedCardNumber;
@Column(name = "transaction_id", length = 100)
private String transactionId;
@Enumerated(EnumType.STRING)
@Column(name = "status", nullable = false, length = 30)
private PaymentStatus status;
@Enumerated(EnumType.STRING)
@Column(name = "type", length = 30)
@Builder.Default
private PaymentType type = PaymentType.CREDIT_CARD;
@Column(name = "processed_at")
private LocalDateTime processedAt;
@Column(name = "gateway_response", length = 1000)
private String gatewayResponse;
@Column(name = "gateway_transaction_id", length = 100)
private String gatewayTransactionId;
@Column(name = "authorization_code", length = 50)
private String authorizationCode;
@Column(name = "merchant_reference", length = 100)
private String merchantReference;
@Column(name = "failure_reason", length = 500)
private String failureReason;
@Column(name = "ip_address", length = 45)
private String ipAddress;
@Column(name = "user_agent", length = 500)
private String userAgent;
@Column(name = "created_at")
@Builder.Default
private LocalDateTime createdAt = LocalDateTime.now();
@Column(name = "updated_at")
@Builder.Default
private LocalDateTime updatedAt = LocalDateTime.now();
// Convenience methods för PaymentInfo compatibility
public Long getPaymentId() {
return this.id;
}
public Long getOrderId() {
return this.order != null ? this.order.getId() : null;
}
// Business methods
public boolean isSuccessful() {
return status == PaymentStatus.COMPLETED;
}
public boolean isRefund() {
return type == PaymentType.REFUND;
}
public boolean canBeRefunded() {
return status == PaymentStatus.COMPLETED && type != PaymentType.REFUND;
}
// Update timestamp when status changes
public void setStatus(PaymentStatus status) {
this.status = status;
this.updatedAt = LocalDateTime.now();
}
@Override
public String toString() {
return "Payment{" +
"id=" + id +
", amount=" + amount +
", status=" + status +
", type=" + type +
", transactionId='" + transactionId + '\'' +
", processedAt=" + processedAt +
'}';
}
}