Subversion Repositories SmartDukaan

Rev

Blame | Last modification | View Log | RSS feed

package com.spice.profitmandi.dao.entity.fofo;

import com.spice.profitmandi.dao.convertor.LocalDateTimeAttributeConverter;
import com.spice.profitmandi.dao.enumuration.pinelabs.PinelabsRefundStatus;

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

/**
 * Entity representing refund transactions for Pinelabs orders.
 *
 * @author Pinelabs Integration Team
 * @since 1.0
 */
@Entity
@Table(name = "pinelabs_refunds", schema = "fofo")
public class PinelabsRefund implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * Reference to Pinelabs order
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "pinelabs_order_id", nullable = false)
    private PinelabsOrder pinelabsOrder;

    /**
     * Refund ID from Pinelabs API
     */
    @Column(name = "pinelabs_refund_id", nullable = false, unique = true, length = 100)
    private String pinelabsRefundId;

    /**
     * Refund amount
     */
    @Column(name = "refund_amount", nullable = false, precision = 12, scale = 2)
    private BigDecimal refundAmount;

    /**
     * Reason for refund
     */
    @Column(name = "refund_reason", length = 500)
    private String refundReason;

    /**
     * Refund status
     */
    @Column(name = "refund_status", nullable = false, length = 50)
    @Enumerated(EnumType.STRING)
    private PinelabsRefundStatus refundStatus = PinelabsRefundStatus.PENDING;

    /**
     * Bank reference number for refund
     */
    @Column(name = "refund_reference", length = 100)
    private String refundReference;

    /**
     * Refund initiated timestamp
     */
    @Convert(converter = LocalDateTimeAttributeConverter.class)
    @Column(name = "create_timestamp", nullable = false, updatable = false)
    private LocalDateTime createTimestamp = LocalDateTime.now();

    /**
     * Last update timestamp
     */
    @Convert(converter = LocalDateTimeAttributeConverter.class)
    @Column(name = "update_timestamp", nullable = false)
    private LocalDateTime updateTimestamp = LocalDateTime.now();

    /**
     * When refund was processed by bank
     */
    @Convert(converter = LocalDateTimeAttributeConverter.class)
    @Column(name = "processed_timestamp")
    private LocalDateTime processedTimestamp;

    /**
     * Default constructor
     */
    public PinelabsRefund() {
    }

    /**
     * Constructor with essential fields
     *
     * @param pinelabsOrder    The order to refund
     * @param pinelabsRefundId Refund ID from Pinelabs
     * @param refundAmount     Amount to refund
     */
    public PinelabsRefund(PinelabsOrder pinelabsOrder, String pinelabsRefundId, BigDecimal refundAmount) {
        this.pinelabsOrder = pinelabsOrder;
        this.pinelabsRefundId = pinelabsRefundId;
        this.refundAmount = refundAmount;
    }

    // ==================== Getters and Setters ====================

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public PinelabsOrder getPinelabsOrder() {
        return pinelabsOrder;
    }

    public void setPinelabsOrder(PinelabsOrder pinelabsOrder) {
        this.pinelabsOrder = pinelabsOrder;
    }

    public String getPinelabsRefundId() {
        return pinelabsRefundId;
    }

    public void setPinelabsRefundId(String pinelabsRefundId) {
        this.pinelabsRefundId = pinelabsRefundId;
    }

    public BigDecimal getRefundAmount() {
        return refundAmount;
    }

    public void setRefundAmount(BigDecimal refundAmount) {
        this.refundAmount = refundAmount;
    }

    public String getRefundReason() {
        return refundReason;
    }

    public void setRefundReason(String refundReason) {
        this.refundReason = refundReason;
    }

    public PinelabsRefundStatus getRefundStatus() {
        return refundStatus;
    }

    public void setRefundStatus(PinelabsRefundStatus refundStatus) {
        this.refundStatus = refundStatus;
    }

    public String getRefundReference() {
        return refundReference;
    }

    public void setRefundReference(String refundReference) {
        this.refundReference = refundReference;
    }

    public LocalDateTime getCreateTimestamp() {
        return createTimestamp;
    }

    public void setCreateTimestamp(LocalDateTime createTimestamp) {
        this.createTimestamp = createTimestamp;
    }

    public LocalDateTime getUpdateTimestamp() {
        return updateTimestamp;
    }

    public void setUpdateTimestamp(LocalDateTime updateTimestamp) {
        this.updateTimestamp = updateTimestamp;
    }

    public LocalDateTime getProcessedTimestamp() {
        return processedTimestamp;
    }

    public void setProcessedTimestamp(LocalDateTime processedTimestamp) {
        this.processedTimestamp = processedTimestamp;
    }

    // ==================== Helper Methods ====================

    /**
     * Check if refund is completed
     *
     * @return true if refund is successful
     */
    public boolean isCompleted() {
        return refundStatus == PinelabsRefundStatus.SUCCESS;
    }

    /**
     * Check if refund failed
     *
     * @return true if refund failed
     */
    public boolean isFailed() {
        return refundStatus == PinelabsRefundStatus.FAILED;
    }

    /**
     * Mark refund as successful
     *
     * @param reference Bank reference number
     */
    public void markAsSuccessful(String reference) {
        this.refundStatus = PinelabsRefundStatus.SUCCESS;
        this.refundReference = reference;
        this.processedTimestamp = LocalDateTime.now();
    }

    /**
     * Mark refund as failed
     */
    public void markAsFailed() {
        this.refundStatus = PinelabsRefundStatus.FAILED;
        this.processedTimestamp = LocalDateTime.now();
    }

    // ==================== Object Methods ====================

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((pinelabsRefundId == null) ? 0 : pinelabsRefundId.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        PinelabsRefund other = (PinelabsRefund) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (pinelabsRefundId == null) {
            if (other.pinelabsRefundId != null)
                return false;
        } else if (!pinelabsRefundId.equals(other.pinelabsRefundId))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "PinelabsRefund [id=" + id + ", pinelabsRefundId=" + pinelabsRefundId + ", refundAmount="
                + refundAmount + ", refundReason=" + refundReason + ", refundStatus=" + refundStatus
                + ", refundReference=" + refundReference + ", createTimestamp=" + createTimestamp
                + ", processedTimestamp=" + processedTimestamp + "]";
    }
}