Package com.jada.order.document

Source Code of com.jada.order.document.InvoiceEngine

/*
* Copyright 2007-2010 JadaSite.

* This file is part of JadaSite.
* JadaSite is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.

* JadaSite is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.

* You should have received a copy of the GNU General Public License
* along with JadaSite.  If not, see <http://www.gnu.org/licenses/>.
*/

package com.jada.order.document;

import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.Iterator;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.PropertyUtils;

import javax.persistence.EntityManager;

import com.jada.jpa.connection.JpaConnection;
import com.jada.jpa.entity.InvoiceDetail;
import com.jada.jpa.entity.InvoiceDetailTax;
import com.jada.jpa.entity.InvoiceHeader;
import com.jada.jpa.entity.OrderDetailTax;
import com.jada.jpa.entity.OrderHeader;
import com.jada.jpa.entity.OrderItemDetail;
import com.jada.jpa.entity.PaymentTran;
import com.jada.jpa.entity.User;
import com.jada.order.payment.PaymentEngine;
import com.jada.order.payment.PaymentException;
import com.jada.order.payment.PaymentManager;
import com.jada.util.Constants;
import com.jada.util.Utility;

public class InvoiceEngine extends OrderEngineBase {
  OrderHeader orderHeader = null;
  InvoiceHeader invoiceHeader = null;
  InvoiceHeader masterHeader = null;
  User user = null;
  String userId = null;
  boolean isNew = false;
  boolean invoiceShipping = false;
  InvoiceDetail lastInvoiceDetail = null;
 
  public InvoiceEngine(OrderHeader orderHeader, User user) throws Exception {
    isNew = true;
    this.user = user;
    this.orderHeader = orderHeader;
    userId = user == null ? Constants.USERNAME_SYSTEM : user.getUserId();
    invoiceHeader = new InvoiceHeader();
    invoiceHeader.setOrderHeader(orderHeader);
    invoiceHeader.setInvoiceDate(new Date());
    invoiceHeader.setInvoiceStatus(Constants.ORDERSTATUS_OPEN);
    invoiceHeader.setInvoiceTotal((float) 0);
    invoiceHeader.setRecUpdateBy(userId);
    invoiceHeader.setRecUpdateDatetime(new Date());
    invoiceHeader.setRecCreateBy(userId);
    invoiceHeader.setRecCreateDatetime(new Date());
//    orderHeader.getInvoiceHeaders().add(invoiceHeader);
  }
 
  public InvoiceEngine(InvoiceHeader header, User user) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    this.invoiceHeader = clone(header);
    this.user = user;
    this.orderHeader = invoiceHeader.getOrderHeader();
    this.masterHeader = header;
    userId = user == null ? Constants.USERNAME_SYSTEM : user.getUserId();
  }
 
  public void invoiceAll() throws Exception {
    float shippingTotal = orderHeader.getShippingTotal() - orderHeader.getShippingDiscountTotal();
    Iterator<?> iterator = orderHeader.getInvoiceHeaders().iterator();
    while (iterator.hasNext()) {
      InvoiceHeader invoiceHeader = (InvoiceHeader) iterator.next();
      if (invoiceHeader.getInvoiceHeaderId() == null) {
        continue;
      }
      if (invoiceHeader.getInvoiceStatus().equals(Constants.ORDERSTATUS_CANCELLED) || invoiceHeader.getInvoiceStatus().equals(Constants.ORDERSTATUS_VOIDED)) {
        continue;
      }
      shippingTotal -= invoiceHeader.getShippingTotal();
    }
    this.setShippingTotal(shippingTotal);
   
    iterator = orderHeader.getOrderItemDetails().iterator();
    while (iterator.hasNext()) {
      OrderItemDetail orderItemDetail = (OrderItemDetail) iterator.next();
      ItemBalance itemBalance = getItemBalance(orderHeader, orderItemDetail.getItemSkuCd(), invoiceHeader, null, null);
      int invoiceQty = itemBalance.getOrderQty() + itemBalance.getCreditQty() - itemBalance.getInvoiceQty();
      setQty(orderItemDetail.getItemSkuCd(), invoiceQty);
    }
    calculateHeader();
  }
 
  public void setQty(String itemSkuCd, int qty) throws Exception {
    InvoiceDetail invoiceDetail = null;
    boolean found = false;
    Iterator<?> iterator = invoiceHeader.getInvoiceDetails().iterator();
    while (iterator.hasNext()) {
      invoiceDetail = (InvoiceDetail) iterator.next();
      if (invoiceDetail.getOrderItemDetail().getItemSkuCd().equals(itemSkuCd)) {
        found = true;
        break;
      }
    }
    if (!found) {
      invoiceDetail = new InvoiceDetail();
      invoiceDetail.setRecCreateBy(userId);
      invoiceDetail.setRecCreateDatetime(new Date());
      iterator = orderHeader.getOrderItemDetails().iterator();
      found = false;
      while (iterator.hasNext()) {
        OrderItemDetail orderItemDetail = (OrderItemDetail) iterator.next();
        if (orderItemDetail.getItemSkuCd().equals(itemSkuCd)) {
          invoiceDetail.setOrderItemDetail(orderItemDetail);
//          orderItemDetail.getInvoiceDetails().add(invoiceDetail);
          found = true;
          break;
        }
      }
      if (!found) {
        throw new OrderItemNotFoundException("");
      }
      invoiceDetail.setInvoiceHeader(invoiceHeader);
     
      iterator = invoiceHeader.getInvoiceDetails().iterator();
      int seqNum = 0;
      while (iterator.hasNext()) {
        InvoiceDetail i = (InvoiceDetail) iterator.next();
        if (i.getSeqNum() > seqNum) {
          seqNum = i.getSeqNum();
        }
      }
      invoiceDetail.setSeqNum(seqNum);
      invoiceHeader.getInvoiceDetails().add(invoiceDetail);
    }
   
    ItemBalance itemBalance = getItemBalance(orderHeader, itemSkuCd, invoiceHeader, null, null);
    int balanceQty = itemBalance.getOrderQty() + itemBalance.getCreditQty() - itemBalance.getInvoiceQty();
    float balanceAmount = itemBalance.getOrderAmount() + itemBalance.getCreditAmount() - itemBalance.getInvoiceAmount();
   
    if (balanceQty < qty) {
      throw new OrderQuantityException("");
    }
    invoiceDetail.setItemInvoiceQty(qty);
    if (balanceQty == qty) {
      invoiceDetail.setItemInvoiceAmount(Utility.round(balanceAmount, 2));
    }
    else {
      float itemInvoiceAmount = Utility.round(balanceAmount * qty / balanceQty, 2);
      invoiceDetail.setItemInvoiceAmount(itemInvoiceAmount);
    }
   
    invoiceDetail.getInvoiceDetailTaxes().clear();
    ItemTaxBalance itemTaxBalances[] = itemBalance.getItemTaxBalances();
    for (int i = 0; i < itemTaxBalances.length; i++) {
      ItemTaxBalance itemTaxBalance = itemTaxBalances[i];
      float taxBalanceAmount = itemTaxBalance.getOrderTaxAmount() - itemTaxBalance.getInvoiceTaxAmount();
      if (taxBalanceAmount <= 0) {
        continue;
      }
     
      float taxAmount = taxBalanceAmount;
      if (balanceQty != qty) {
        taxAmount = Utility.round(taxBalanceAmount * qty / balanceQty, 2);
      }
      if (taxAmount > 0) {
        InvoiceDetailTax invoiceDetailTax = new InvoiceDetailTax();
        invoiceDetailTax.setInvoiceHeader(invoiceHeader);
        invoiceDetailTax.setInvoiceDetail(invoiceDetail);
        invoiceDetail.getInvoiceDetailTaxes().add(invoiceDetailTax);
        invoiceDetailTax.setTax(itemTaxBalance.getTax());
        invoiceDetailTax.setTaxName(itemTaxBalance.getTaxName());
        invoiceDetailTax.setTaxAmount(taxAmount);
        invoiceDetailTax.setRecUpdateBy(userId);
        invoiceDetailTax.setRecUpdateDatetime(new Date());
        invoiceDetailTax.setRecCreateBy(userId);
        invoiceDetailTax.setRecCreateDatetime(new Date());
        invoiceHeader.getInvoiceTaxes().add(invoiceDetailTax);
      }
    }
    invoiceDetail.setRecUpdateBy(userId);
    invoiceDetail.setRecUpdateDatetime(new Date());
    invoiceHeader.setRecUpdateBy(userId);
    invoiceHeader.setRecUpdateDatetime(new Date());
    setDirty(itemSkuCd);
   
    lastInvoiceDetail = invoiceDetail;
  }
 
  public void calculateHeader() throws Exception {
    float invoiceTotal = 0;
    Iterator<?> iterator = invoiceHeader.getInvoiceDetails().iterator();
    while (iterator.hasNext()) {
      InvoiceDetail invoiceDetail = (InvoiceDetail) iterator.next();
      invoiceTotal += invoiceDetail.getItemInvoiceAmount().floatValue();
      Iterator<?> taxIterator = invoiceDetail.getInvoiceDetailTaxes().iterator();
      while (taxIterator.hasNext()) {
        InvoiceDetailTax invoiceDetailTax = (InvoiceDetailTax) taxIterator.next();
        invoiceTotal += invoiceDetailTax.getTaxAmount();
      }
    } 
    invoiceTotal += invoiceHeader.getShippingTotal();
    iterator = invoiceHeader.getInvoiceTaxes().iterator();
    while (iterator.hasNext()) {
      InvoiceDetailTax invoiceDetailTax = (InvoiceDetailTax) iterator.next();
      if (invoiceDetailTax.getInvoiceDetail() != null) {
        continue;
      }
      invoiceTotal += invoiceDetailTax.getTaxAmount();
    }
   
    invoiceHeader.setInvoiceTotal(Float.valueOf(invoiceTotal));
    invoiceHeader.setRecUpdateBy(userId);
    invoiceHeader.setRecUpdateDatetime(new Date());
  }
 
  /*
   * Used only when payment has not been authorized.  To be used with shopping cart.
   */
  public void payOrder(PaymentEngine paymentEngine, HttpServletRequest request) throws Exception {
    if (isVoided(orderHeader)) {
      throw new PaymentException("Order is already voided");
    }
    if (paymentEngine != null) {
      paymentEngine.setCreditCardInfo(creditCardInfo);
      paymentEngine.authorizeAndCapturePayment(invoiceHeader, request);
 
      PaymentTran paymentTran = new PaymentTran();
      paymentTran.setAuthCode(paymentEngine.getAuthCode());
      paymentTran.setPaymentReference1(paymentEngine.getPaymentReference1());
      paymentTran.setPaymentReference2(paymentEngine.getPaymentReference2());
      paymentTran.setPaymentReference3(paymentEngine.getPaymentReference3());
      paymentTran.setPaymentReference4(paymentEngine.getPaymentReference4());
      paymentTran.setPaymentReference5(paymentEngine.getPaymentReference5());
      paymentTran.setTranDatetime(new Date());
      paymentTran.setRecUpdateBy(userId);
      paymentTran.setRecUpdateDatetime(new Date());
      paymentTran.setRecCreateBy(userId);
      paymentTran.setRecCreateDatetime(new Date());
      invoiceHeader.setPaymentTran(paymentTran);
    }
    invoiceHeader.setInvoiceStatus(Constants.ORDERSTATUS_COMPLETED);
    invoiceHeader.setRecUpdateBy(userId);
    invoiceHeader.setRecUpdateDatetime(new Date());
  }
 
  /*
   * To be used during back order processing.
   */
  public void payOrder(HttpServletRequest request) throws Exception {
    PaymentEngine paymentEngine = PaymentManager.getPaymentEngine(orderHeader.getPaymentGatewayProvider(), orderHeader.getSiteCurrency());
    if (isVoided(orderHeader)) {
      throw new OrderStateException("Order is already voided");
    }
    if (paymentEngine != null) {
      paymentEngine.capturePayment(invoiceHeader);
     
      PaymentTran paymentTran = new PaymentTran();
      paymentTran.setAuthCode(paymentEngine.getAuthCode());
      paymentTran.setPaymentReference1(paymentEngine.getPaymentReference1());
      paymentTran.setPaymentReference2(paymentEngine.getPaymentReference2());
      paymentTran.setPaymentReference3(paymentEngine.getPaymentReference3());
      paymentTran.setPaymentReference4(paymentEngine.getPaymentReference4());
      paymentTran.setPaymentReference5(paymentEngine.getPaymentReference5());
      paymentTran.setTranDatetime(new Date());
      paymentTran.setRecUpdateBy(userId);
      paymentTran.setRecUpdateDatetime(new Date());
      paymentTran.setRecCreateBy(userId);
      paymentTran.setRecCreateDatetime(new Date());
      invoiceHeader.setPaymentTran(paymentTran);
    }
    invoiceHeader.setInvoiceStatus(Constants.ORDERSTATUS_COMPLETED);
    invoiceHeader.setRecUpdateBy(userId);
    invoiceHeader.setRecUpdateDatetime(new Date());
  }
 
  public void cancelOrder() throws OrderStateException {
    if (!isOpen(invoiceHeader)) {
      throw new OrderStateException("Order cannot be cancelled");
    }
    invoiceHeader.setInvoiceStatus(Constants.ORDERSTATUS_CANCELLED);
    invoiceHeader.setRecUpdateBy(userId);
    invoiceHeader.setRecUpdateDatetime(new Date());
  }
 
  public void voidOrder() throws Exception {
    if (!isCompleted(invoiceHeader) && !isClosed(invoiceHeader)) {
      throw new OrderStateException("Order has not been completed");
    }
    String paymentGateway = orderHeader.getPaymentGatewayProvider();
    if (paymentGateway != null) {
      PaymentEngine paymentEngine = PaymentManager.getPaymentEngine(paymentGateway, orderHeader.getSiteCurrency());
      paymentEngine.voidPayment(invoiceHeader);
      PaymentTran paymentTran = new PaymentTran();
      paymentTran.setAuthCode(paymentEngine.getAuthCode());
      paymentTran.setPaymentReference1(paymentEngine.getPaymentReference1());
      paymentTran.setPaymentReference2(paymentEngine.getPaymentReference2());
      paymentTran.setPaymentReference3(paymentEngine.getPaymentReference3());
      paymentTran.setPaymentReference4(paymentEngine.getPaymentReference4());
      paymentTran.setPaymentReference5(paymentEngine.getPaymentReference5());
      paymentTran.setTranDatetime(new Date());
      paymentTran.setRecUpdateBy(userId);
      paymentTran.setRecUpdateDatetime(new Date());
      paymentTran.setRecCreateBy(userId);
      paymentTran.setRecCreateDatetime(new Date());
      invoiceHeader.setVoidPaymentTran(paymentTran);
    }
    invoiceHeader.setInvoiceStatus(Constants.ORDERSTATUS_VOIDED);
    invoiceHeader.setRecUpdateBy(userId);
    invoiceHeader.setRecUpdateDatetime(new Date());
  }
 
  public void setShippingTotal(float shippingTotal) throws Exception {
    float shippingBalance = orderHeader.getShippingTotal() - orderHeader.getShippingDiscountTotal();
    Iterator<?> iterator = orderHeader.getInvoiceHeaders().iterator();
    while (iterator.hasNext()) {
      InvoiceHeader iHeader = (InvoiceHeader) iterator.next();
      if (iHeader.getInvoiceStatus().equals(Constants.ORDERSTATUS_VOIDED)) {
        continue;
      }
      if (isNew) {
        if (iHeader.getInvoiceHeaderId() == null) {
          continue;
        }
      }
      else {
        if (iHeader.getInvoiceHeaderId().equals(invoiceHeader.getInvoiceHeaderId())) {
          continue;
        }
      }
      shippingBalance -= iHeader.getShippingTotal();
    }
    float ratio = 1;
    if (shippingTotal == 0) {
      ratio = 0;
    }
    if (shippingBalance != shippingTotal) {
      ratio = shippingTotal / orderHeader.getShippingTotal();
    }
   
    invoiceHeader.setShippingTotal(shippingTotal);
   
    invoiceHeader.getInvoiceTaxes().clear();
    Iterator<?> shippingIterator = orderHeader.getOrderTaxes().iterator();
    while (shippingIterator.hasNext()) {
      OrderDetailTax orderDetailTax = (OrderDetailTax) shippingIterator.next();
      if (orderDetailTax.getOrderItemDetail() != null) {
        continue;
      }
      InvoiceDetailTax invoiceDetailTax = new InvoiceDetailTax();
      invoiceDetailTax.setInvoiceHeader(invoiceHeader);
      invoiceDetailTax.setTax(orderDetailTax.getTax());
      invoiceDetailTax.setTaxName(orderDetailTax.getTaxName());
      float taxAmount = orderDetailTax.getTaxAmount() * ratio;
      if (taxAmount <= 0) {
        continue;
      }
      invoiceDetailTax.setTaxAmount(taxAmount);
      invoiceDetailTax.setRecUpdateBy(userId);
      invoiceDetailTax.setRecUpdateDatetime(new Date());
      invoiceDetailTax.setRecCreateBy(userId);
      invoiceDetailTax.setRecCreateDatetime(new Date());
      invoiceHeader.getInvoiceTaxes().add(invoiceDetailTax);
    }
    invoiceHeader.setRecUpdateBy(userId);
    invoiceHeader.setRecUpdateDatetime(new Date());
  }
 
  public Vector<?> getInvoiceTaxes() {
    Vector<InvoiceDetailTax> invoiceDetailTaxes = new Vector<InvoiceDetailTax>();
    Iterator<?> iterator = invoiceHeader.getInvoiceTaxes().iterator();
    while (iterator.hasNext()) {
      InvoiceDetailTax invoiceDetailTax = (InvoiceDetailTax) iterator.next();
      boolean found = false;
      Iterator<?> sumIterator = invoiceDetailTaxes.iterator();
      InvoiceDetailTax sumTax = null;
      while (sumIterator.hasNext()) {
        sumTax = (InvoiceDetailTax) sumIterator.next();
        if (sumTax.getTaxName().equals(invoiceDetailTax.getTaxName())) {
          found = true;
          break;
       
      }
      if (!found) {
        sumTax = new InvoiceDetailTax();
        sumTax.setTaxName(invoiceDetailTax.getTaxName());
        sumTax.setTaxAmount((float) 0);
        sumTax.setTax(invoiceDetailTax.getTax());
        invoiceDetailTaxes.add(sumTax);
      }
      float taxAmount = sumTax.getTaxAmount();
      taxAmount += invoiceDetailTax.getTaxAmount();
      sumTax.setTaxAmount(taxAmount);
    }
    return invoiceDetailTaxes;
  }
 
  public boolean isInvoiceShipping() {
    return invoiceShipping;
  }

  public void setInvoiceShipping(boolean invoiceShipping) {
    this.invoiceShipping = invoiceShipping;
  }

  public InvoiceHeader getInvoiceHeader() {
    return invoiceHeader;
  }

  public void setInvoiceHeader(InvoiceHeader invoiceHeader) {
    this.invoiceHeader = invoiceHeader;
  }

  public OrderHeader getOrderHeader() {
    return orderHeader;
  }

  public void setOrderHeader(OrderHeader orderHeader) {
    this.orderHeader = orderHeader;
  }

  public InvoiceDetail getLastInvoiceDetail() {
    return lastInvoiceDetail;
  }

  public void setLastInvoiceDetail(InvoiceDetail lastInvoiceDetail) {
    this.lastInvoiceDetail = lastInvoiceDetail;
  }
 
  static public InvoiceHeader clone(InvoiceHeader header) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    InvoiceHeader invoiceHeader = new InvoiceHeader();
    invoiceHeader.setInvoiceHeaderId(header.getInvoiceHeaderId());
    invoiceHeader.setInvoiceNum(header.getInvoiceNum());
    invoiceHeader.setShippingTotal(header.getShippingTotal());
    invoiceHeader.setInvoiceTotal(header.getInvoiceTotal());
    invoiceHeader.setInvoiceStatus(header.getInvoiceStatus());
    invoiceHeader.setInvoiceDate(header.getInvoiceDate());
    invoiceHeader.setRecUpdateBy(header.getRecUpdateBy());
    invoiceHeader.setRecUpdateDatetime(header.getRecUpdateDatetime());
    invoiceHeader.setRecCreateBy(header.getRecCreateBy());
    invoiceHeader.setRecCreateDatetime(header.getRecCreateDatetime());
    invoiceHeader.setOrderHeader(header.getOrderHeader());
   
    if (header.getPaymentTran() != null) {
      PaymentTran pt = header.getPaymentTran();
      PaymentTran paymentTran = new PaymentTran();
      PropertyUtils.copyProperties(paymentTran, pt);
      invoiceHeader.setPaymentTran(paymentTran);
    }
    if (header.getVoidPaymentTran() != null) {
      PaymentTran pt = header.getVoidPaymentTran();
      PaymentTran paymentTran = new PaymentTran();
      PropertyUtils.copyProperties(paymentTran, pt);
      invoiceHeader.setVoidPaymentTran(paymentTran);
    }
   
    Iterator<?> iterator = header.getInvoiceDetails().iterator();
    while (iterator.hasNext()) {
      InvoiceDetail detail = (InvoiceDetail) iterator.next();
      InvoiceDetail invoiceDetail = new InvoiceDetail();
      invoiceDetail.setInvoiceHeader(invoiceHeader);
      invoiceHeader.getInvoiceDetails().add(invoiceDetail);
      invoiceDetail.setInvoiceDetailId(detail.getInvoiceDetailId());
      invoiceDetail.setSeqNum(detail.getSeqNum());
      invoiceDetail.setItemInvoiceQty(detail.getItemInvoiceQty());
      invoiceDetail.setItemInvoiceAmount(detail.getItemInvoiceAmount());
      invoiceDetail.setRecUpdateBy(header.getRecUpdateBy());
      invoiceDetail.setRecUpdateDatetime(header.getRecUpdateDatetime());
      invoiceDetail.setRecCreateBy(header.getRecCreateBy());
      invoiceDetail.setRecCreateDatetime(header.getRecCreateDatetime());
      invoiceDetail.setOrderItemDetail(detail.getOrderItemDetail());
     
      Iterator<?> taxIterator = detail.getInvoiceDetailTaxes().iterator();
      while (taxIterator.hasNext()) {
        InvoiceDetailTax detailTax = (InvoiceDetailTax) taxIterator.next();
        InvoiceDetailTax invoiceDetailTax = new InvoiceDetailTax();
        invoiceDetailTax.setInvoiceDetailTaxId(detailTax.getInvoiceDetailTaxId());
        invoiceDetailTax.setTaxName(detailTax.getTaxName());
        invoiceDetailTax.setTaxAmount(detailTax.getTaxAmount());
        invoiceDetailTax.setRecUpdateBy(detailTax.getRecUpdateBy());
        invoiceDetailTax.setRecUpdateDatetime(detailTax.getRecUpdateDatetime());
        invoiceDetailTax.setRecCreateBy(detailTax.getRecCreateBy());
        invoiceDetailTax.setRecCreateDatetime(detailTax.getRecCreateDatetime());
        invoiceDetailTax.setTax(detailTax.getTax());
        invoiceDetailTax.setInvoiceDetail(invoiceDetail);
        invoiceDetail.getInvoiceDetailTaxes().add(invoiceDetailTax);
        invoiceDetailTax.setInvoiceHeader(invoiceHeader);
        invoiceHeader.getInvoiceTaxes().add(invoiceDetailTax);
      }
    }
   
    Iterator<?> taxIterator = header.getInvoiceTaxes().iterator();
    while (taxIterator.hasNext()) {
      InvoiceDetailTax detailTax = (InvoiceDetailTax) taxIterator.next();
      if (detailTax.getInvoiceDetail() != null) {
        continue;
      }
      InvoiceDetailTax invoiceDetailTax = new InvoiceDetailTax();
      invoiceDetailTax.setInvoiceDetailTaxId(detailTax.getInvoiceDetailTaxId());
      invoiceDetailTax.setTaxName(detailTax.getTaxName());
      invoiceDetailTax.setTaxAmount(detailTax.getTaxAmount());
      invoiceDetailTax.setRecUpdateBy(detailTax.getRecUpdateBy());
      invoiceDetailTax.setRecUpdateDatetime(detailTax.getRecUpdateDatetime());
      invoiceDetailTax.setRecCreateBy(detailTax.getRecCreateBy());
      invoiceDetailTax.setRecCreateDatetime(detailTax.getRecCreateDatetime());
      invoiceDetailTax.setTax(detailTax.getTax());
      invoiceDetailTax.setInvoiceHeader(invoiceHeader);
      invoiceHeader.getInvoiceTaxes().add(invoiceDetailTax);
    }
    return invoiceHeader;
  }
 
  public void saveHeader() throws Exception {
        EntityManager em = JpaConnection.getInstance().getCurrentEntityManager();
    Date current = new Date();
    if (isNew) {
      invoiceHeader.setInvoiceNum(generateNumber(orderHeader.getSiteDomain().getSite(), Constants.SEQUENCE_INVOICE));
      invoiceHeader.setInvoiceDate(new Date());
      invoiceHeader.setRecCreateBy(userId);
      invoiceHeader.setRecCreateDatetime(current);
    }
    invoiceHeader.setRecUpdateBy(userId);
    invoiceHeader.setRecUpdateDatetime(current);
    if (invoiceHeader.getInvoiceHeaderId() == null) {
      em.persist(invoiceHeader);
    }
    isNew = false;
  }
 
  public void saveOrder() throws Exception {
        EntityManager em = JpaConnection.getInstance().getCurrentEntityManager();
    if (masterHeader == null || !masterHeader.getRecUpdateDatetime().equals(invoiceHeader.getRecUpdateDatetime())) {
      if (invoiceHeader.getInvoiceNum() == null) {
        invoiceHeader.setInvoiceNum(generateNumber(orderHeader.getSiteDomain().getSite(), Constants.SEQUENCE_INVOICE));
      }
      if (masterHeader == null) {
        masterHeader = new InvoiceHeader();
      }
      masterHeader.setInvoiceNum(invoiceHeader.getInvoiceNum());
      masterHeader.setShippingTotal(invoiceHeader.getShippingTotal());
      masterHeader.setInvoiceTotal(invoiceHeader.getInvoiceTotal());
      masterHeader.setInvoiceStatus(invoiceHeader.getInvoiceStatus());
      masterHeader.setInvoiceDate(invoiceHeader.getInvoiceDate());
      masterHeader.setRecUpdateBy(invoiceHeader.getRecUpdateBy());
      masterHeader.setRecUpdateDatetime(invoiceHeader.getRecUpdateDatetime());
      masterHeader.setRecCreateBy(invoiceHeader.getRecCreateBy());
      masterHeader.setRecCreateDatetime(invoiceHeader.getRecCreateDatetime());
      masterHeader.setOrderHeader(orderHeader);
      orderHeader.getInvoiceHeaders().add(masterHeader);

      // Copy data from invoiceHeader to masterHeader
      if (masterHeader.getInvoiceHeaderId() == null) {
        em.persist(masterHeader);
      }
      invoiceHeader.setInvoiceHeaderId(masterHeader.getInvoiceHeaderId());

      if (masterHeader != null) {
        Iterator<?> taxIterator = masterHeader.getInvoiceTaxes().iterator();
        while (taxIterator.hasNext()) {
          InvoiceDetailTax invoiceDetailTax = (InvoiceDetailTax) taxIterator.next();
          if (invoiceDetailTax.getInvoiceDetail() != null) {
            continue;
          }
          em.remove(invoiceDetailTax);
          taxIterator.remove();
        }
      }
     
      Iterator<?> taxIterator = invoiceHeader.getInvoiceTaxes().iterator();
      while (taxIterator.hasNext()) {
        InvoiceDetailTax invoiceDetailTax = (InvoiceDetailTax) taxIterator.next();
        if (invoiceDetailTax.getInvoiceDetail() != null) {
          continue;
        }
        InvoiceDetailTax masterTax = new InvoiceDetailTax();
//        masterTax.setInvoiceDetailTaxId(invoiceDetailTax.getInvoiceDetailTaxId());
        masterTax.setTaxName(invoiceDetailTax.getTaxName());
        masterTax.setTaxAmount(invoiceDetailTax.getTaxAmount());
        masterTax.setRecUpdateBy(invoiceDetailTax.getRecUpdateBy());
        masterTax.setRecUpdateDatetime(invoiceDetailTax.getRecUpdateDatetime());
        masterTax.setRecCreateBy(invoiceDetailTax.getRecCreateBy());
        masterTax.setRecCreateDatetime(invoiceDetailTax.getRecCreateDatetime());
        masterTax.setTax(invoiceDetailTax.getTax());
        masterTax.setInvoiceDetail(null);
        masterTax.setInvoiceHeader(masterHeader);
        em.persist(masterTax);
      }
    }
   
    Iterator<?> iterator = masterHeader.getInvoiceDetails().iterator();
    while (iterator.hasNext()) {
      InvoiceDetail masterDetail = (InvoiceDetail) iterator.next();
      Iterator<?> taxIterator = masterDetail.getInvoiceDetailTaxes().iterator();
      while (taxIterator.hasNext()) {
        InvoiceDetailTax masterDetailTax = (InvoiceDetailTax) taxIterator.next();
        em.remove(masterDetailTax);
        taxIterator.remove();
      }
      em.remove(masterDetail);
      iterator.remove();
    }
   
    iterator = invoiceHeader.getInvoiceDetails().iterator();
    while (iterator.hasNext()) {
      InvoiceDetail invoiceDetail = (InvoiceDetail) iterator.next();
      InvoiceDetail masterDetail = new InvoiceDetail();
      masterDetail.setInvoiceHeader(masterHeader);
      masterDetail.setSeqNum(invoiceDetail.getSeqNum());
      masterDetail.setItemInvoiceQty(invoiceDetail.getItemInvoiceQty());
      masterDetail.setItemInvoiceAmount(invoiceDetail.getItemInvoiceAmount());
      masterDetail.setRecUpdateBy(invoiceDetail.getRecUpdateBy());
      masterDetail.setRecUpdateDatetime(invoiceDetail.getRecUpdateDatetime());
      masterDetail.setRecCreateBy(invoiceDetail.getRecCreateBy());
      masterDetail.setRecCreateDatetime(invoiceDetail.getRecCreateDatetime());
      masterDetail.setOrderItemDetail(invoiceDetail.getOrderItemDetail());
      em.persist(masterDetail);
      masterHeader.getInvoiceDetails().add(masterDetail);
 
      Iterator<?> taxIterator = invoiceDetail.getInvoiceDetailTaxes().iterator();
      while (taxIterator.hasNext()) {
        InvoiceDetailTax invoiceDetailTax = (InvoiceDetailTax) taxIterator.next();
        InvoiceDetailTax masterTax = new InvoiceDetailTax();
        masterTax.setTaxName(invoiceDetailTax.getTaxName());
        masterTax.setTaxAmount(invoiceDetailTax.getTaxAmount());
        masterTax.setRecUpdateBy(invoiceDetailTax.getRecUpdateBy());
        masterTax.setRecUpdateDatetime(invoiceDetailTax.getRecUpdateDatetime());
        masterTax.setRecCreateBy(invoiceDetailTax.getRecCreateBy());
        masterTax.setRecCreateDatetime(invoiceDetailTax.getRecCreateDatetime());
        masterTax.setInvoiceDetail(masterDetail);
        masterTax.setTax(invoiceDetailTax.getTax());
        masterDetail.getInvoiceDetailTaxes().add(masterTax);
        masterTax.setInvoiceHeader(masterHeader);
        em.persist(masterTax);
      }
    }

    PaymentTran paymentTran = invoiceHeader.getPaymentTran();
    PaymentTran masterPaymentTran = null;
    if (masterHeader != null) {
      masterPaymentTran = masterHeader.getPaymentTran();
    }
    if (isSavePaymentTran(paymentTran, masterPaymentTran)) {
      if (masterPaymentTran == null) {
        masterPaymentTran = new PaymentTran();
      }
      PropertyUtils.copyProperties(masterPaymentTran, paymentTran);
      masterHeader.setPaymentTran(masterPaymentTran);
      if (masterPaymentTran.getPaymentTranId() == null) {
        em.persist(masterPaymentTran);
      }
    }
   
    PaymentTran voidPaymentTran = invoiceHeader.getVoidPaymentTran();
    masterPaymentTran = null;
    if (masterHeader != null) {
      masterPaymentTran = masterHeader.getVoidPaymentTran();
    }
    if (isSavePaymentTran(voidPaymentTran, masterPaymentTran)) {
      if (masterPaymentTran == null) {
        masterPaymentTran = new PaymentTran();
      }
      PropertyUtils.copyProperties(masterPaymentTran, voidPaymentTran);
      masterHeader.setVoidPaymentTran(masterPaymentTran);
      if (masterPaymentTran.getPaymentTranId() == null) {
        em.persist(masterPaymentTran);
      }
    }
  }
 
  public boolean isSavePaymentTran(PaymentTran paymentTran, PaymentTran masterPaymentTran) {
    if (paymentTran == null) {
      return false;
    }
    if (masterPaymentTran == null) {
      return true;
    }
    if (!paymentTran.getRecUpdateDatetime().equals(masterPaymentTran.getRecUpdateDatetime())) {
      return true;
    }
    return false;
  }
 
  public InvoiceDetail getMasterDetail(InvoiceDetail invoiceDetail) {
    if (masterHeader == null) {
      return null;
    }
    if (invoiceDetail.getInvoiceDetailId() == null) {
      return null;
    }
    Iterator<?> iterator = masterHeader.getInvoiceDetails().iterator();
    while (iterator.hasNext()) {
      InvoiceDetail detail = (InvoiceDetail) iterator.next();
      if (invoiceDetail.getInvoiceDetailId().equals(detail.getInvoiceDetailId())) {
        return invoiceDetail;
      }
    }
    return null;
  }
 
  public boolean isModified(InvoiceDetail invoiceDetail) {
    InvoiceDetail masterDetail = getMasterDetail(invoiceDetail);
    if (masterDetail == null) {
      return true;
    }
    if (invoiceDetail.getRecUpdateDatetime().equals(masterDetail.getRecUpdateDatetime())) {
      return false;
    }
    return true;
  }
}
TOP

Related Classes of com.jada.order.document.InvoiceEngine

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.