package zw.qantra.tm.domain.models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.SQLRestriction; import org.springframework.data.domain.Persistable; import zw.qantra.tm.domain.enums.*; import java.math.BigDecimal; import java.util.UUID; @Entity @Table(name = "transaction", indexes = { @Index(name = "idx_transaction_trace_type", columnList = "trace, type"), @Index(name = "idx_transaction_reference", columnList = "reference"), @Index(name = "idx_transaction_workspace_id", columnList = "workspace_id"), @Index(name = "idx_transaction_confirm_pay_integ", columnList = "confirmation_status, payment_status, integration_status"), @Index(name = "idx_transaction_pay_poll", columnList = "payment_status, polling_status"), @Index(name = "idx_transaction_status", columnList = "status"), @Index(name = "idx_transaction_created_at", columnList = "created_at"), @Index(name = "idx_transaction_debit_phone", columnList = "debit_phone"), @Index(name = "idx_transaction_credit_phone", columnList = "credit_phone"), @Index(name = "idx_transaction_workflow_id", columnList = "workflow_id"), }) @Getter @Setter @Builder @AllArgsConstructor @NoArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) @SQLRestriction("deleted = false") public class Transaction extends BaseEntity { @Column(name = "workspace_id") private UUID workspaceId; @Column(name = "user_id") private String userId; private String username; private String trace; private String region; @Enumerated(EnumType.STRING) private PartyType partyType; private BigDecimal amount; private BigDecimal charge; private BigDecimal gatewayCharge; private BigDecimal tax; private BigDecimal totalAmount; private String reference; private String providerUid; private String productUid; private String paymentProcessorLabel; private String integrationProcessorLabel; private String confirmationProcessorLabel; private String providerLabel; private String rrn; private String channelName; private String channel; @Column(name = "debit_phone") private String debitPhone; private String debitAccount; @Enumerated(EnumType.STRING) private CurrencyType debitCurrency; private String debitName; private String debitCard; private String debitRef; private String debitEmail; @Column(name = "credit_phone") private String creditPhone; private String creditAccount; @Enumerated(EnumType.STRING) private CurrencyType creditCurrency; private BigDecimal creditAmount; private BigDecimal creditTotalAmount; private String creditName; private String creditCard; private String creditRef; private String creditEmail; private String creditAddress; private String creditVoucher; private String billClientId; private String clientSecret; private String aggregatorId; private String paymentProcessorRef; private String billName; private String billProductName; private String paymentProcessorName; private String providerImage; private String paymentProcessorImage; private UUID batchId; private String batchDescription; @Enumerated(EnumType.STRING) private Status authorizationStatus; @Enumerated(EnumType.STRING) @Column(name = "confirmation_status") private Status confirmationStatus; @Enumerated(EnumType.STRING) @Column(name = "payment_status") private Status paymentStatus; @Enumerated(EnumType.STRING) @Column(name = "integration_status") private Status integrationStatus; @Enumerated(EnumType.STRING) private Status reversalStatus; @Enumerated(EnumType.STRING) @Column(name = "polling_status") private Status pollingStatus; private String orderId; private String orderTrace; private String orderTransactionTrace; private String orderTransactionId; private String erpSalesRef; private String erpJournalRef; private String erpSalesPaymentRef; private String erpPurchaseRef; private String erpPurchasePaymentRef; private String erpCommissionJournalRef; @Column(name = "workflow_id", nullable = true) private long workflowId; @Enumerated(EnumType.STRING) private RequestType type; @Enumerated(EnumType.STRING) private AuthType authType; @Column(columnDefinition = "TEXT") private String errorMessage; @Column(columnDefinition = "TEXT") private String systemErrorMessage; private String responseCode; @Enumerated(EnumType.STRING) private Status status; @Column(columnDefinition = "TEXT") private String targetUrl; private String sdkActionId; private String verificationCode; private Integer retries; @Transient private Object additionalData; }