Subversion Repositories SmartDukaan

Rev

Rev 33120 | Rev 33306 | Go to most recent revision | View as "text/plain" | Blame | Compare with Previous | 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.entity.catalog.Item;
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;

@NamedQueries({
        @NamedQuery(name = "InventoryItem.selectScannedCount", query = "select ii.itemId, sum(ii.initialQuantity) from InventoryItem ii "
                + "where ii.itemId in :itemIds and ii.fofoId = :fofoId and ii.purchaseId = :purchaseId group by ii.itemId"),
        //For Serialized models
        @NamedQuery(name = "InventoryItem.selectAllLineItemIdsByInventoryIds", query = "select new com.spice.profitmandi.dao.model.InventoryItemSaleModel(ii.id, lii.id)   from InventoryItem ii" +
                " join Purchase p on p.id = ii.purchaseId join Order o on o.invoiceNumber = p.purchaseReference" +
                " join LineItem li on li.orderId = o.id join LineItemImei lii on (lii.id=li.id and lii.serialNumber=ii.serialNumber)" +
                "where ii.id in :inventoryItemIds"),


        @NamedQuery(name = "InventoryItem.selectItemSaleSummaryModel",
                query = "select new com.spice.profitmandi.dao.model.ItemSaleSummaryModel(" +
                        "lii.id, ii.id, o.billingTimestamp,o.invoiceNumber, cast(li.unitPrice as float), cast(foi.sellingPrice as float), li.item)" +
                        "from InventoryItem ii " +
                        "join Purchase p on p.id = ii.purchaseId " +
                        "join Order o on o.invoiceNumber = p.purchaseReference " +
                        "join LineItem li on li.orderId = o.id " +
                        "join LineItemImei lii on (lii.lineItemId=li.id and lii.serialNumber=ii.serialNumber) " +
                        "join FofoLineItem fli on fli.inventoryItemId=ii.id " +
                        "join FofoOrderItem foi on foi.id=fli.fofoOrderItemId " +
                        "join FofoOrder fo on fo.id = foi.orderId " +
                        "where ii.id in :inventoryItemIds and fo.cancelledTimestamp is null")


})
@Entity
@Table(name = "fofo.inventory_item")
public class InventoryItem implements Comparable {

    public InventoryItem(String serialNumber) {
        this.serialNumber = serialNumber;
    }

    public InventoryItem() {

    }

    @Id
    @Column(name = "id", unique = true, updatable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "item_id")
    private int itemId;

    @Column(name = "fofo_id")
    private int fofoId;

    @Column(name = "serial_number", length = 100)
    private String serialNumber;

    @Column(name = "initial_quantity")
    private int initialQuantity;

    @Column(name = "good_quantity")
    private int goodQuantity;

    @Column(name = "bad_quantity")
    private int badQuantity;

    @Column(name = "activation_timestamp")
    private LocalDateTime activationTimestamp;

    @Column(name = "last_scan_type")
    @Enumerated(EnumType.STRING)
    private ScanType lastScanType;

    @Column(name = "purchase_id")
    private int purchaseId;

    @Column(name = "unit_price")
    private float unitPrice;

    @Column(name = "price_drop_amount")
    private float priceDropAmount;

    @Column(name = "buy_back", columnDefinition = "tinyint(1) default 1")
    private boolean buyBack;

    @Column(name = "igst_rate")
    private float igstRate;

    @Column(name = "cgst_rate")
    private float cgstRate;

    @Column(name = "sgst_rate")
    private float sgstRate;

    @Column(name = "hsn_code")
    private String hsnCode;

    @Convert(converter = LocalDateTimeAttributeConverter.class)
    @Column(name = "create_timestamp")
    private LocalDateTime createTimestamp = LocalDateTime.now();

    @Convert(converter = LocalDateTimeAttributeConverter.class)
    @Column(name = "update_timestamp")
    @UpdateTimestamp
    private LocalDateTime updateTimestamp = LocalDateTime.now();

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "item_id", insertable = false, updatable = false, nullable = false, referencedColumnName = "id")
    private Item item;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "purchase_id", insertable = false, updatable = false, nullable = false, referencedColumnName = "id")
    private Purchase purchase;

    public void setUnitPrice(float unitPrice) {
        this.unitPrice = unitPrice;
    }

    @Transient
    private String itemDescription;

    @Transient
    private LocalDateTime activatedTimestamp;

    @Transient
    private boolean priceDropValidated = true;

    @Transient
    private String pdValidationFailedReason = null;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        InventoryItem that = (InventoryItem) o;
        return id == that.id && itemId == that.itemId && fofoId == that.fofoId && initialQuantity == that.initialQuantity && goodQuantity == that.goodQuantity && badQuantity == that.badQuantity && purchaseId == that.purchaseId && Float.compare(that.unitPrice, unitPrice) == 0 && Float.compare(that.priceDropAmount, priceDropAmount) == 0 && buyBack == that.buyBack && Float.compare(that.igstRate, igstRate) == 0 && Float.compare(that.cgstRate, cgstRate) == 0 && Float.compare(that.sgstRate, sgstRate) == 0 && priceDropValidated == that.priceDropValidated && pdValidationFailedReason == that.pdValidationFailedReason && Objects.equals(serialNumber, that.serialNumber) && Objects.equals(activationTimestamp, that.activationTimestamp) && lastScanType == that.lastScanType && Objects.equals(hsnCode, that.hsnCode) && Objects.equals(createTimestamp, that.createTimestamp) && Objects.equals(updateTimestamp, that.updateTimestamp) && Objects.equals(item, that.item) && Objects.equals(purchase, that.purchase) && Objects.equals(itemDescription, that.itemDescription) && Objects.equals(activatedTimestamp, that.activatedTimestamp);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, itemId, fofoId, serialNumber, initialQuantity, goodQuantity, badQuantity, activationTimestamp, lastScanType, purchaseId, unitPrice, priceDropAmount, buyBack, igstRate, cgstRate, sgstRate, hsnCode, createTimestamp, updateTimestamp, item, purchase, itemDescription, activatedTimestamp, priceDropValidated, pdValidationFailedReason);
    }

    public String getPdValidationFailedReason() {
        return pdValidationFailedReason;
    }

    public void setPdValidationFailedReason(String pdValidationFailedReason) {
        this.pdValidationFailedReason = pdValidationFailedReason;
    }

    @Override
    public String toString() {
        return "InventoryItem{" +
                "id=" + id +
                ", itemId=" + itemId +
                ", fofoId=" + fofoId +
                ", serialNumber='" + serialNumber + '\'' +
                ", initialQuantity=" + initialQuantity +
                ", goodQuantity=" + goodQuantity +
                ", badQuantity=" + badQuantity +
                ", activationTimestamp=" + activationTimestamp +
                ", lastScanType=" + lastScanType +
                ", purchaseId=" + purchaseId +
                ", unitPrice=" + unitPrice +
                ", priceDropAmount=" + priceDropAmount +
                ", buyBack=" + buyBack +
                ", igstRate=" + igstRate +
                ", cgstRate=" + cgstRate +
                ", sgstRate=" + sgstRate +
                ", hsnCode='" + hsnCode + '\'' +
                ", createTimestamp=" + createTimestamp +
                ", updateTimestamp=" + updateTimestamp +
                ", item=" + item +
                ", purchase=" + purchase +
                ", itemDescription='" + itemDescription + '\'' +
                ", activatedTimestamp=" + activatedTimestamp +
                ", priceDropValidated=" + priceDropValidated +
                ", pdValidationFailedReason='" + pdValidationFailedReason + '\'' +
                '}';
    }

    public LocalDateTime getActivatedTimestamp() {
        return activatedTimestamp;
    }

    public void setActivatedTimestamp(LocalDateTime activatedTimestamp) {
        this.activatedTimestamp = activatedTimestamp;
    }

    public int getId() {
        return id;
    }

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

    public int getItemId() {
        return itemId;
    }

    public void setItemId(int itemId) {
        this.itemId = itemId;
    }

    public void setFofoId(int fofoId) {
        this.fofoId = fofoId;
    }

    public int getFofoId() {
        return fofoId;
    }

    public String getSerialNumber() {
        return serialNumber == null ? serialNumber : serialNumber.toLowerCase();
    }

    public void setSerialNumber(String serialNumber) {
        this.serialNumber = serialNumber == null ? serialNumber : serialNumber.toLowerCase();
    }

    public int getInitialQuantity() {
        return initialQuantity;
    }

    public float getUnitPrice() {
        return unitPrice;
    }

    public void setUnitPrice(Float unitPrice) {
        this.unitPrice = unitPrice;
    }

    public void setInitialQuantity(int initialQuantity) {
        this.initialQuantity = initialQuantity;
    }

    public float getNetPrice() {
        return unitPrice - priceDropAmount;
    }

    public int getGoodQuantity() {
        return goodQuantity;
    }

    public void setGoodQuantity(int goodQuantity) {
        this.goodQuantity = goodQuantity;
    }

    public int getBadQuantity() {
        return badQuantity;
    }

    public void setBadQuantity(int badQuantity) {
        this.badQuantity = badQuantity;
    }

    public ScanType getLastScanType() {
        return lastScanType;
    }

    public void setLastScanType(ScanType lastScanType) {
        this.lastScanType = lastScanType;
    }

    public int getPurchaseId() {
        return purchaseId;
    }

    public void setPurchaseId(int purchaseId) {
        this.purchaseId = purchaseId;
    }

    public float getPriceDropAmount() {
        return priceDropAmount;
    }

    public void setPriceDropAmount(float priceDropAmount) {
        this.priceDropAmount = priceDropAmount;
    }

    public float getIgstRate() {
        return igstRate;
    }

    public void setIgstRate(float igstRate) {
        this.igstRate = igstRate;
    }

    public float getCgstRate() {
        return cgstRate;
    }

    public void setCgstRate(float cgstRate) {
        this.cgstRate = cgstRate;
    }

    public float getSgstRate() {
        return sgstRate;
    }

    public void setSgstRate(float sgstRate) {
        this.sgstRate = sgstRate;
    }

    public String getHsnCode() {
        return hsnCode;
    }

    public void setHsnCode(String hsnCode) {
        this.hsnCode = hsnCode;
    }

    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 Item getItem() {
        return item;
    }

    public void setItem(Item item) {
        this.item = item;
    }

    public boolean isBuyBack() {
        return buyBack;
    }

    public void setBuyBack(boolean buyBack) {
        this.buyBack = buyBack;
    }

    public Purchase getPurchase() {
        return purchase;
    }

    public double getMarginPercentage(double amount) {
        return amount / this.getNetPrice() * (100 + this.getCgstRate() + this.getIgstRate() + this.getSgstRate());
    }

    public void setPurchase(Purchase purchase) {
        this.purchase = purchase;
    }

    public String getFormattedCreateTimestamp() {
        if (createTimestamp == null) {
            return null;
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
        return createTimestamp.format(formatter);
    }

    public String getItemDescription() {
        return itemDescription;
    }

    public void setItemDescription(String itemDescription) {
        this.itemDescription = itemDescription;
    }

    public LocalDateTime getActivationTimestamp() {
        return activationTimestamp;
    }

    public void setActivationTimestamp(LocalDateTime activationTimestamp) {
        this.activationTimestamp = activationTimestamp;
    }

    public boolean isPriceDropValidated() {
        return priceDropValidated;
    }

    public void setPriceDropValidated(boolean priceDropValidated) {
        this.priceDropValidated = priceDropValidated;
    }

    @Override
    public int compareTo(Object o) {
        return o.hashCode() - this.hashCode();
    }

}