Java tutorial
/* * 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; } }