Advertisement
aadddrr

AddSalesInvoiceForXcom

Jan 21st, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 39.94 KB | None | 0 0
  1. /**
  2.  *
  3.  */
  4. package org.jleaf.erp.sls.bo.invoice;
  5.  
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Map.Entry;
  12. import java.util.concurrent.TimeUnit;
  13. import java.util.regex.Matcher;
  14. import java.util.regex.Pattern;
  15.  
  16. import org.jleaf.common.CommonExceptionConstants;
  17. import org.jleaf.core.BusinessFunction;
  18. import org.jleaf.core.BusinessTransaction;
  19. import org.jleaf.core.CoreException;
  20. import org.jleaf.core.DefaultBusinessTransaction;
  21. import org.jleaf.core.Dto;
  22. import org.jleaf.core.GeneralConstants;
  23. import org.jleaf.core.annotation.ErrorList;
  24. import org.jleaf.core.annotation.Info;
  25. import org.jleaf.core.annotation.InfoIn;
  26. import org.jleaf.core.annotation.InfoOut;
  27. import org.jleaf.erp.master.MasterConstants;
  28. import org.jleaf.erp.master.MasterExceptionConstants;
  29. import org.jleaf.erp.sls.SalesConstants;
  30. import org.jleaf.erp.sls.SalesConstantsForXcom;
  31. import org.jleaf.erp.sls.SalesExceptionConstants;
  32. import org.jleaf.erp.sls.SalesExceptionConstantsForXcom;
  33. import org.jleaf.erp.sls.dao.SalesInvoiceAdvanceDao;
  34. import org.jleaf.erp.sls.dao.SalesInvoiceCostDao;
  35. import org.jleaf.erp.sls.dao.SalesInvoiceDao;
  36. import org.jleaf.erp.sls.dao.SalesInvoiceItemDao;
  37. import org.jleaf.erp.sls.dao.SalesInvoiceTaxDao;
  38. import org.jleaf.erp.sls.dao.SalesOrderBalanceInvoiceDao;
  39. import org.jleaf.erp.sls.dao.SalesOrderBalanceInvoiceTaxDao;
  40. import org.jleaf.erp.sls.dao.SoBalanceAdvanceInvoiceDao;
  41. import org.jleaf.erp.sls.entity.SalesInvoice;
  42. import org.jleaf.erp.sls.entity.SalesInvoiceAdvance;
  43. import org.jleaf.erp.sls.entity.SalesInvoiceCost;
  44. import org.jleaf.erp.sls.entity.SalesInvoiceItem;
  45. import org.jleaf.erp.sls.entity.SalesInvoiceTax;
  46. import org.jleaf.erp.sls.entity.SalesOrderBalanceInvoice;
  47. import org.jleaf.erp.sls.entity.SalesOrderBalanceInvoiceTax;
  48. import org.jleaf.erp.sls.entity.SoBalanceAdvanceInvoice;
  49. import org.jleaf.util.Calc;
  50. import org.jleaf.util.DateUtil;
  51. import org.jleaf.util.DtoUtil;
  52. import org.jleaf.util.GsonUtil;
  53. import org.jleaf.util.ValidationUtil;
  54. import org.jleaf.validator.CommonBusinessValidator;
  55. import org.slf4j.Logger;
  56. import org.slf4j.LoggerFactory;
  57. import org.springframework.beans.factory.annotation.Autowired;
  58. import org.springframework.beans.factory.annotation.Qualifier;
  59. import org.springframework.stereotype.Service;
  60.  
  61. /**
  62.  * AddSalesInvoiceForXcom
  63.  * Hanya boleh ada satu DO dalam Sales Invoice
  64.  * Nomor Sales Invoice berdasarkan DO
  65.  * @author Adrian
  66.  * Nov 30, 2017
  67.  */
  68.  
  69. //@formatter:off
  70. @Service("addSalesInvoice")
  71. @InfoIn(value = {
  72.         @Info(name = "docNo", description = "Nomor Transaksi", type = String.class),
  73.         @Info(name = "docDate", description = "Tanggal Transaksi", type = String.class),
  74.         @Info(name = "ouLegalId", description = "Organisasi Unit Legal id", type = Long.class),
  75.         @Info(name = "remark", description = "remark", type = String.class),
  76.         @Info(name = "refId", description = "sales order id", type = Long.class),
  77.         @Info(name = "invoiceItemList", description = "list of sales invoice item (lineNo, refItemId,doDocNo,doDocDate,productName,qtyDlvSo,soUomName,currCode,itemAmount)", type = List.class),
  78.         @Info(name = "tenantLoginId", description = "tenant login id", type = Long.class),
  79.         @Info(name = "userLoginId", description = "user login id", type = Long.class),
  80.         @Info(name = "roleLoginId", description = "role login id", type = Long.class),
  81.         @Info(name = "datetime", description = "datetime", type = String.class)
  82. })
  83. @InfoOut(value = {
  84.         @Info(name = "id", description = "id", type = Long.class),
  85.         @Info(name = "tenantId", description = "tenant id", type = Long.class),
  86.         @Info(name = "docTypeId", description = "Jenis transaksi", type = Long.class),
  87.         @Info(name = "docNo", description = "No Transaksi", type = String.class),
  88.         @Info(name = "docDate", description = "Tanggal Transaksi", type = String.class),
  89.         @Info(name = "ouId", description = "Organisasi Unit id", type = Long.class),
  90.         @Info(name = "extDocNo", description = "external document no", type = String.class),
  91.         @Info(name = "extDocDate", description = "external document date", type = String.class),
  92.         @Info(name = "refDocTypeId", description = "ref doc type id", type = Long.class),
  93.         @Info(name = "refId", description = "ref id", type = Long.class),
  94.         @Info(name = "remark", description = "remark", type = String.class),
  95.         @Info(name = "partnerId", description = "partner / supplier id", type = Long.class),
  96.         @Info(name = "ouLegalId", description = "ou legal id", type = Long.class),
  97.         @Info(name = "dueDate", description = "due date", type = String.class),
  98.         @Info(name = "salesmanId", description = "salesman id", type = Long.class),
  99.         @Info(name = "currCode", description = "currency code", type = String.class),
  100.         @Info(name = "grossAmount", description = "gross amount", type = Double.class),
  101.         @Info(name = "advanceAmount", description = "advance amount", type = Double.class),
  102.         @Info(name = "taxAmount", description = "tax amount", type = Double.class),
  103.         @Info(name = "addAmount", description = "add amount", type = Double.class),
  104.         @Info(name = "totalAmount", description = "total amount", type = Double.class),
  105.         @Info(name = "discountAmount", description = "discount amount", type = Double.class),
  106.         @Info(name = "statusDoc", description = "status dokumen", type = String.class),
  107.         @Info(name = "workflowStatus", description = "status workflow", type = String.class),
  108.         @Info(name = "version", description = "version", type = Long.class),
  109.         @Info(name = "createDateTime", description = "create date time", type = String.class),
  110.         @Info(name = "createUserId", description = "create user id", type = Long.class),
  111.         @Info(name = "updateDateTime", description = "update date time", type = String.class),
  112.         @Info(name = "updateUserId", description = "update user id", type = Long.class)
  113. })
  114. @ErrorList(errorKeys = {
  115.         CommonExceptionConstants.TENANT_LOGIN_CANT_USED,
  116.         CommonExceptionConstants.OU_ID_NOT_FOUND,
  117.         CommonExceptionConstants.OU_NOT_LEGAL_ENTITY,
  118.         CommonExceptionConstants.OULEGAL_ID_NOT_FOUND,
  119.         SalesExceptionConstants.INVOICE_ALREADY_EXISTS,
  120.         SalesExceptionConstants.SALES_ORDER_ID_NOT_FOUND,
  121.         MasterExceptionConstants.PARTNER_ID_NOT_FOUND,
  122.         MasterExceptionConstants.POLICY_PARTNER_AUTHORIZATION_FAILED,
  123.         SalesExceptionConstants.DELIVERY_ORDER_ITEM_ID_NOT_FOUND,
  124.         SalesExceptionConstants.DELIVERY_ORDER_ID_NOT_FOUND,
  125.         SalesExceptionConstants.SALES_ORDER_BALANCE_INVOICE_NOT_FOUND,
  126.         SalesExceptionConstants.PARTNER_NOT_AUTHORIZED_AS_CUSTOMER
  127. })
  128. //@formatter:on
  129. public class AddSalesInvoiceForXcom extends DefaultBusinessTransaction implements BusinessTransaction {
  130.     private static final Logger log = LoggerFactory
  131.             .getLogger(AddSalesInvoiceForXcom.class);
  132.  
  133.     @Autowired
  134.     private SalesInvoiceDao salesInvoiceDao;
  135.  
  136.     @Autowired
  137.     private SalesInvoiceItemDao salesInvoiceItemDao;
  138.  
  139.     @Autowired
  140.     private SalesInvoiceTaxDao salesInvoiceTaxDao;
  141.  
  142.     @Autowired
  143.     private SalesOrderBalanceInvoiceTaxDao salesOrderBalanceInvoiceTaxDao;
  144.  
  145.     @Autowired
  146.     private SalesOrderBalanceInvoiceDao salesOrderBalanceInvoiceDao;
  147.  
  148.     @Autowired
  149.     SalesInvoiceAdvanceDao salesInvoiceAdvanceDao;
  150.    
  151.     @Autowired
  152.     SoBalanceAdvanceInvoiceDao soBalanceAdvanceInvoiceDao;
  153.    
  154.     @Autowired
  155.     SalesInvoiceCostDao salesInvoiceCostDao;
  156.    
  157.     @Autowired
  158.     @Qualifier("valTenantLoginCanUse")
  159.     private BusinessFunction valTenantLoginCanUse;
  160.  
  161.     @Autowired
  162.     @Qualifier("findOULegalById")
  163.     private BusinessFunction findOULegalById;
  164.  
  165.     @Autowired
  166.     @Qualifier("valOUAsLegal")
  167.     private BusinessFunction valOUAsLegal;
  168.  
  169.     @Autowired
  170.     @Qualifier("isSalesInvoiceExistsByIndex")
  171.     private BusinessFunction isSalesInvoiceExistsByIndex;
  172.  
  173.     @Autowired
  174.     @Qualifier("findPartnerById")
  175.     private BusinessFunction findPartnerById;
  176.  
  177.     @Autowired
  178.     @Qualifier("findSalesOrderById")
  179.     private BusinessFunction findSalesOrderById;
  180.  
  181.     @Autowired
  182.     @Qualifier("isPartnerTypeExistsByIndex")
  183.     private BusinessFunction isPartnerTypeExistsByIndex;
  184.  
  185.     @Autowired
  186.     @Qualifier("valAuthorizedPolicyPartner")
  187.     private BusinessFunction valAuthorizedPolicyPartner;
  188.  
  189.     @Autowired
  190.     @Qualifier("findDeliveryOrderById")
  191.     private BusinessFunction findDeliveryOrderById;
  192.  
  193.     @Autowired
  194.     @Qualifier("findDeliveryOrderItemById")
  195.     private BusinessFunction findDeliveryOrderItemById;
  196.  
  197.     @Autowired
  198.     @Qualifier("findSalesOrderBalanceInvoiceByIndex")
  199.     private BusinessFunction findSalesOrderBalanceInvoiceByIndex;
  200.  
  201.     @Autowired
  202.     @Qualifier("getSalesOrderBalanceInvoiceTaxListByDeliveryOrderItem")
  203.     private BusinessFunction getSalesOrderBalanceInvoiceTaxListByDeliveryOrderItem;
  204.    
  205.     @Autowired
  206.     @Qualifier("getRoundingParameter")
  207.     private BusinessFunction getRoundingParameter;
  208.    
  209.     @Autowired
  210.     @Qualifier("valOutstandingDoReceiptItemForInvoicing")
  211.     private BusinessFunction valOutstandingDoReceiptItemForInvoicing;
  212.    
  213.     @Autowired
  214.     @Qualifier("findCustPaymentByIndex")
  215.     BusinessFunction findCustPaymentByIndex;
  216.    
  217.     @Autowired
  218.     @Qualifier("isSoBalanceAdvanceInvoiceExistsBySalesOrder")
  219.     BusinessFunction isSoBalanceAdvanceInvoiceExistsBySalesOrder;
  220.    
  221.     @Autowired
  222.     @Qualifier("findSystemConfigByParamCode")
  223.     private BusinessFunction findSystemConfigByParamCode;
  224.    
  225.     @Autowired
  226.     @Qualifier("findDeliveryOrderReceiptItemById")
  227.     private BusinessFunction findDeliveryOrderReceiptItemById;
  228.    
  229.     @Autowired
  230.     @Qualifier("findDeliveryOrderReceiptById")
  231.     private BusinessFunction findDeliveryOrderReceiptById; 
  232.  
  233.     @Autowired
  234.     @Qualifier("findExchangeRateByDate")
  235.     private BusinessFunction findExchangeRateByDate;
  236.    
  237.     @Autowired
  238.     @Qualifier("findActivityByIndex")
  239.     private BusinessFunction findActivityByIndex;
  240.    
  241.     @Autowired
  242.     @Qualifier("getTaxListAdvance")
  243.     private BusinessFunction getTaxListAdvance;
  244.    
  245.     @Override
  246.     public String getDescription() {
  247.         return "Add sales invoice";
  248.     }
  249.  
  250.     @SuppressWarnings({ "unchecked"})
  251.     @Override
  252.     public Dto prepare(Dto inputDto, Dto originalDto) throws Exception {
  253.         Dto inputDtoForRoundingParameter = new Dto();
  254.         inputDtoForRoundingParameter.put("tenantId", inputDto.getLong("tenantLoginId"));
  255.         Dto resultDtoForRoundingParameter = getRoundingParameter.execute(inputDtoForRoundingParameter);
  256.        
  257.         // int scaleNonTax = resultDtoForRoundingParameter.getInteger("scaleNonTax");
  258. //      int roundingModeNonTax = resultDtoForRoundingParameter.getInteger("roundingModeNonTax");
  259.         int scaleTax = resultDtoForRoundingParameter.getInteger("scaleTax");
  260.         int roundingModeTax = resultDtoForRoundingParameter.getInteger("roundingModeTax");     
  261.        
  262.         // Validation tenant login id can be use
  263.         Dto loginDto = new Dto();
  264.         loginDto.put("tenantLoginId", inputDto.getLong("tenantLoginId"));
  265.         loginDto.put("userLoginId", inputDto.getLong("userLoginId"));
  266.         loginDto.put("roleLoginId", inputDto.getLong("roleLoginId"));
  267.         valTenantLoginCanUse.execute(loginDto);
  268.  
  269.         this.prepareInsertAudit(inputDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  270.         this.prepareUpdateAudit(inputDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  271.  
  272.         String docDate = inputDto.getString("docDate");
  273.  
  274.         // Validation tidak boleh kosong / null / tanggal / etc
  275.         ValidationUtil.valBlankOrNull(inputDto.getString("docNo"), "Document No");
  276.         ValidationUtil.valBlankOrNull(docDate, "Document Date");
  277.         ValidationUtil.valDate(docDate, "Document Date");
  278.  
  279.         if (!GeneralConstants.NULL_REF_VALUE_LONG.equals(inputDto.getLong("ouLegalId"))) {
  280.             Dto ouLegalDto = findOULegalById.execute(new Dto().put("id", inputDto.getLong("ouLegalId")));
  281.             valOUAsLegal.execute(new Dto().put("id", ouLegalDto.getLong("ouId")));
  282.         }
  283.  
  284.         Dto salesOrderDto = findSalesOrderById.execute(new Dto().put("id", inputDto.getLong("refId")));
  285.  
  286.         Dto partnerDto = findPartnerById.execute(new Dto().put("id", salesOrderDto.getLong("partnerBillToId")));
  287.  
  288.         Dto paramAuthorizedPolicyPartner = new Dto();
  289.         paramAuthorizedPolicyPartner.put("userLoginId", inputDto.getLong("userLoginId"));
  290.         paramAuthorizedPolicyPartner.put("roleLoginId", inputDto.getLong("roleLoginId"));
  291.         paramAuthorizedPolicyPartner.put("partnerId", partnerDto.getLong("id"));
  292.         paramAuthorizedPolicyPartner.put("varName", "Customer");
  293.         valAuthorizedPolicyPartner.execute(paramAuthorizedPolicyPartner);
  294.  
  295.         // get due date
  296.         String dueDate = docDate;
  297.         Dto custPaymentDto = findCustPaymentByIndex.execute(new Dto()
  298.                 .put("tenantId", inputDto.get("tenantLoginId"))
  299.                 .put("partnerId", salesOrderDto.get("partnerBillToId")));
  300.        
  301.         dueDate = DateUtil.addDate(dueDate, TimeUnit.MILLISECONDS.convert(custPaymentDto.getLong("duePaymentDays"), TimeUnit.DAYS));
  302.        
  303.         inputDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  304.         inputDto.put("docTypeId", SalesConstants.DOCUMENT_SALES_INVOICE);
  305.         inputDto.put("ouId", salesOrderDto.getLong("ouId"));
  306.         inputDto.put("refDocTypeId", SalesConstants.DOCUMENT_SALES_ORDER);
  307.         inputDto.put("partnerId", salesOrderDto.getLong("partnerBillToId"));
  308.         inputDto.put("salesmanId", salesOrderDto.getLong("salesmanId"));
  309.         inputDto.put("currCode", salesOrderDto.getString("currCode"));
  310.         inputDto.put("extDocNo", salesOrderDto.getString("extDocNo"));
  311.         inputDto.put("extDocDate", salesOrderDto.getString("extDocDate"));
  312. //      inputDto.put("dueDate",
  313. //              DateUtil.addDate(docDate, TimeUnit.MILLISECONDS.convert(resultPartnerMustSupplier.getLong("partnerTypeDto.dueDate"), TimeUnit.DAYS)));
  314.         inputDto.put("dueDate", dueDate);
  315.         inputDto.put("grossAmount", new Double(0));
  316.         inputDto.put("advanceAmount", new Double(0));
  317.         inputDto.put("taxAmount", new Double(0));
  318.         inputDto.put("addAmount", new Double(0));
  319.         inputDto.put("totalAmount", new Double(0));
  320.         inputDto.put("statusDoc", SalesConstants.DRAFT_TRANSACTION);
  321.         inputDto.put("workflowStatus", SalesConstants.WORKFLOW_STATUS_DRAFT);
  322.        
  323.         // Get valuta gov
  324.         Dto inputCurrCodeGovDto = new Dto();
  325.         inputCurrCodeGovDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  326.         inputCurrCodeGovDto.put("parameterCode", MasterConstants.PARAMETER_CODE_VALUTA_RESMI);
  327.        
  328.         Dto outputCurrCodeGovDto = findSystemConfigByParamCode.execute(inputCurrCodeGovDto);
  329.         String currCodeGov = outputCurrCodeGovDto.getString("value");
  330.        
  331.         // get activity g/l regular disc for invoice cost
  332.         Dto inputRegularDiscDto = new Dto();
  333.         inputRegularDiscDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  334.         inputRegularDiscDto.put("code", SalesConstants.REGULAR_DISC);
  335.        
  336.         // activity harus terdaftar di master activity
  337.         Dto activityRegularDiscDto = findActivityByIndex.execute(inputRegularDiscDto);
  338.         // Tidak perlu validasi otorisasi terhadap activity GL discount, serta tidak perlu validasi doc type vs act GL discount (WTC, 151209)
  339.  
  340.         if (GeneralConstants.NO.equals(activityRegularDiscDto.getString("active"))) {
  341.             throw new CoreException(MasterExceptionConstants.DATA_NOT_ACTIVE, "Activity GL of Regular discount");
  342.         }
  343.        
  344.         // get activity g/l promo disc for invoice cost
  345.         Dto inputPromoDiscDto = new Dto();
  346.         inputPromoDiscDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  347.         inputPromoDiscDto.put("code", SalesConstants.PROMO_DISC);
  348.        
  349.         // activity harus terdaftar di master activity
  350.         Dto activityPromoDiscDto = findActivityByIndex.execute(inputPromoDiscDto);
  351.  
  352.         if (GeneralConstants.NO.equals(activityPromoDiscDto.getString("active"))) {
  353.             throw new CoreException(MasterExceptionConstants.DATA_NOT_ACTIVE, "Activity GL of Promo discount");
  354.         }
  355.  
  356.         Dto paramTax = new Dto();
  357.         paramTax.put("tenantId", inputDto.getLong("tenantLoginId"));
  358.         Dto taxListDto = getTaxListAdvance.execute(paramTax);
  359.  
  360.         log.info("taxListDto = " + taxListDto);
  361.  
  362.         List<Dto> taxList = taxListDto.getList("taxList");
  363.         Dto taxDto = taxList.get(0);
  364.        
  365.         if (GeneralConstants.NO.equals(taxDto.getString("active"))) {
  366.             throw new CoreException(MasterExceptionConstants.DATA_NOT_ACTIVE, "Tax");
  367.         }
  368.        
  369.         // prepare detail for add item
  370.         List<Dto> invoiceItemList = inputDto.getList("invoiceItemList");
  371.         List<Dto> resultInvoiceItemList = new ArrayList<Dto>();
  372.         List<Dto> resultSoBalanceInvoiceList = new ArrayList<Dto>();
  373.         List<Dto> resultSoBalanceInvoiceTaxList = new ArrayList<Dto>();
  374. //      List<Dto> successList = new ArrayList<Dto>();
  375.         List<Dto> failList = new ArrayList<Dto>();
  376.         Map<String, Dto> mapInvoiceTax = new HashMap<String, Dto>();
  377.         Calc calcTaxAmount = new Calc(0);
  378.         Calc calcNettAmount = new Calc(0);
  379.         Calc totalRegularDiscAmount = new Calc(0);
  380.         Calc totalPromoDiscAmount = new Calc(0);
  381.         String doDocNo = GeneralConstants.EMPTY_VALUE;
  382.         if (invoiceItemList != null && !invoiceItemList.isEmpty()) {
  383.             for (Dto invoiceItemDto : invoiceItemList) {
  384.                 try {
  385.                     Dto deliveryOrderItemDto = findDeliveryOrderItemById.execute(new Dto().put("id", Long.valueOf(invoiceItemDto.getString("refItemId"))));
  386.                     Dto deliveryOrderDto = findDeliveryOrderById.execute(new Dto().put("id", deliveryOrderItemDto.getLong("doId")));
  387.                     CommonBusinessValidator.valCompareDate(docDate, deliveryOrderDto.getString("docDate"), CommonBusinessValidator.COMPARE_GREATER_EQUAL,
  388.                             "Document Date", "Delivery Order Date");
  389.  
  390.                     Long doReceiptItemId = Long.valueOf(invoiceItemDto.getString("doReceiptItemId"));
  391.                     if (!GeneralConstants.NULL_REF_VALUE_LONG.equals(doReceiptItemId)) {
  392.                         Dto deliveryOrderItemReceiptDto = findDeliveryOrderReceiptItemById.execute(new Dto().put("id", doReceiptItemId));
  393.                         Dto deliveryOrderReceiptDto = findDeliveryOrderReceiptById.execute(new Dto().put("id", deliveryOrderItemReceiptDto.getLong("doReceiptId")));
  394.                         CommonBusinessValidator.valCompareDate(docDate, deliveryOrderReceiptDto.getString("docDate"), CommonBusinessValidator.COMPARE_GREATER_EQUAL,
  395.                                 "Document Date", "Delivery Order Receipt Date");
  396.                     }
  397.                    
  398.                    
  399.                     Dto paramSoBalanceInvoiceDto = new Dto();
  400.                     paramSoBalanceInvoiceDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  401.                     paramSoBalanceInvoiceDto.put("ouId", salesOrderDto.getLong("ouId"));
  402.                     paramSoBalanceInvoiceDto.put("soId", salesOrderDto.getLong("id"));
  403.                     paramSoBalanceInvoiceDto.put("refDocTypeId", SalesConstants.DOCUMENT_DELIVERY_ORDER);
  404.                     paramSoBalanceInvoiceDto.put("refId", deliveryOrderItemDto.getLong("doId"));
  405.                     paramSoBalanceInvoiceDto.put("refItemId", Long.valueOf(invoiceItemDto.getString("refItemId")));
  406.                     paramSoBalanceInvoiceDto.put("doReceiptItemId", doReceiptItemId);
  407.                     Dto soBalanceInvoiceDto = findSalesOrderBalanceInvoiceByIndex.execute(paramSoBalanceInvoiceDto);
  408.                    
  409.                     // validate flg inv temp
  410.                     if(!GeneralConstants.NO.equals(soBalanceInvoiceDto.get("flgInvoiceTemp"))){
  411.                         throw new CoreException(SalesExceptionConstants.BALANCE_DELIVERY_ORDER_ITEM_ALREADY_USED_IN_OTHER_TRANSACTION, invoiceItemDto.get("doDocNo"), invoiceItemDto.get("doDocDate"), invoiceItemDto.get("productName"));
  412.                     }
  413.                    
  414.                     // validate flg inv
  415.                     if(!GeneralConstants.NO.equals(soBalanceInvoiceDto.get("flgInvoice"))){
  416.                         throw new CoreException(SalesExceptionConstants.BALANCE_DELIVERY_ORDER_ITEM_ALREADY_USED_IN_OTHER_TRANSACTION, invoiceItemDto.get("doDocNo"), invoiceItemDto.get("doDocDate"), invoiceItemDto.get("productName"));
  417.                     }
  418.                    
  419.                     Dto paramValOutstandingDoReceiptItemForInvoicingDto = new Dto();
  420.                     paramValOutstandingDoReceiptItemForInvoicingDto.put("doItemId", deliveryOrderItemDto.getLong("id"));                   
  421.                     valOutstandingDoReceiptItemForInvoicing.execute(paramValOutstandingDoReceiptItemForInvoicingDto);
  422.                    
  423.                     invoiceItemDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  424.                     invoiceItemDto.put("lineNo", Long.valueOf(invoiceItemDto.getString("lineNo")));
  425.                     invoiceItemDto.put("refDocTypeId", SalesConstants.DOCUMENT_DELIVERY_ORDER);
  426.                     invoiceItemDto.put("refId", deliveryOrderItemDto.getLong("doId"));
  427.                     invoiceItemDto.put("refItemId", Long.valueOf(invoiceItemDto.getString("refItemId")));
  428.                     invoiceItemDto.put("refItemAmount", soBalanceInvoiceDto.getDouble("itemAmount"));
  429.                     invoiceItemDto.put("remark", GeneralConstants.EMPTY_VALUE);
  430.                     invoiceItemDto.put("doReceiptItemId", Long.valueOf(invoiceItemDto.getString("doReceiptItemId")));
  431.                     this.prepareInsertAudit(invoiceItemDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  432.                     this.prepareUpdateAudit(invoiceItemDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  433.  
  434.                     calcNettAmount = calcNettAmount.add(invoiceItemDto.getDouble("refItemAmount"));
  435.  
  436.                     soBalanceInvoiceDto.put("flgInvoice", SalesConstants.IN_PROGRESS_TRANSACTION);
  437.                     this.prepareUpdateAudit(soBalanceInvoiceDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  438.  
  439.                     totalRegularDiscAmount = totalRegularDiscAmount.add(soBalanceInvoiceDto.getDouble("regularDiscAmount"));
  440.                     totalPromoDiscAmount = totalPromoDiscAmount.add(soBalanceInvoiceDto.getDouble("promoDiscAmount"));
  441.                    
  442.                     //Validasi hanya boleh ada satu DO
  443.                     if (!doDocNo.isEmpty() && !doDocNo.equals(invoiceItemDto.getString("doDocNo"))) {
  444.                         throw new CoreException(SalesExceptionConstantsForXcom.ONLY_ONE_DO_IS_ALLOWED_IN_SALES_INVOICE);
  445.                     }
  446.                    
  447.                     doDocNo = invoiceItemDto.getString("doDocNo");
  448.                    
  449.                     Dto paramSoBalanceInvoiceTax = new Dto();
  450.                     paramSoBalanceInvoiceTax.put("tenantId", inputDto.getLong("tenantLoginId"));
  451.                     paramSoBalanceInvoiceTax.put("ouId", salesOrderDto.getLong("ouId"));
  452.                     paramSoBalanceInvoiceTax.put("soId", salesOrderDto.getLong("id"));
  453.                     paramSoBalanceInvoiceTax.put("refDocTypeId", SalesConstants.DOCUMENT_DELIVERY_ORDER);
  454.                     paramSoBalanceInvoiceTax.put("refId", invoiceItemDto.getLong("refId"));
  455.                     paramSoBalanceInvoiceTax.put("refItemId", invoiceItemDto.getLong("refItemId"));
  456.                     paramSoBalanceInvoiceTax.put("doReceiptItemId", invoiceItemDto.getLong("doReceiptItemId"));
  457.                     Dto soBalanceInvoiceTaxListDto = getSalesOrderBalanceInvoiceTaxListByDeliveryOrderItem.execute(paramSoBalanceInvoiceTax);
  458.  
  459.                     log.info("soBalanceInvoiceTaxListDto = " + soBalanceInvoiceTaxListDto);
  460.                    
  461.                     List<Dto> soBalanceInvoiceTaxList = soBalanceInvoiceTaxListDto.getList("salesOrderBalanceInvoiceTaxList");
  462.  
  463.                     log.info("soBalanceInvoiceTaxList = " + soBalanceInvoiceTaxList);
  464.                    
  465.                     if (soBalanceInvoiceTaxList != null && !soBalanceInvoiceTaxList.isEmpty()) {
  466.                         for (Dto soBalanceInvoiceTaxDto : soBalanceInvoiceTaxList) {
  467.                             Dto invoiceTaxDto = new Dto();
  468.  
  469.                             if (mapInvoiceTax.containsKey(soBalanceInvoiceTaxDto.get("taxId").toString())) {
  470.                                 invoiceTaxDto = mapInvoiceTax.get(soBalanceInvoiceTaxDto.get("taxId").toString());
  471.  
  472.                                 invoiceTaxDto.put("baseAmount",
  473.                                         new Calc(invoiceTaxDto.getDouble("baseAmount")).add(soBalanceInvoiceTaxDto.getDouble("baseAmount")).doubleValue());
  474.                                 invoiceTaxDto.put("taxAmount", new Calc(invoiceTaxDto.getDouble("taxAmount"))
  475.                                         .add(soBalanceInvoiceTaxDto.getDouble("taxAmount")).doubleValue());
  476.                             } else {
  477.                                 invoiceTaxDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  478.                                 invoiceTaxDto.put("taxId", Long.valueOf(soBalanceInvoiceTaxDto.get("taxId").toString()));
  479.                                 invoiceTaxDto.put("flgAmount", soBalanceInvoiceTaxDto.get("flgAmount").toString());
  480.                                 invoiceTaxDto.put("taxPercentage", Double.valueOf(soBalanceInvoiceTaxDto.get("taxPercentage").toString()));
  481.                                 invoiceTaxDto.put("taxCurrCode", currCodeGov); // WTC, 20141115, fix bug, seharusnya diisi dengan valuta resmi
  482.                                 invoiceTaxDto.put("taxNo", GeneralConstants.EMPTY_VALUE);
  483.                                
  484.                                 invoiceTaxDto.put("taxDate", GeneralConstants.EMPTY_VALUE);
  485.                                 invoiceTaxDto.put("govTaxAmount", new Double(0));                                                                                      
  486.                                
  487.                                 invoiceTaxDto.put("baseAmount", soBalanceInvoiceTaxDto.getDouble("baseAmount"));
  488.                                 invoiceTaxDto.put("advanceAmount", new Double(0));
  489.                                 invoiceTaxDto.put("taxAmount", soBalanceInvoiceTaxDto.getDouble("taxAmount"));
  490.                                 invoiceTaxDto.put("doReceiptItemId", soBalanceInvoiceTaxDto.getLong("doReceiptItemId"));
  491.                                 invoiceTaxDto.put("remark", GeneralConstants.EMPTY_VALUE);
  492.                             }
  493.  
  494.                             mapInvoiceTax.put(soBalanceInvoiceTaxDto.get("taxId").toString(), invoiceTaxDto);
  495.  
  496.                             soBalanceInvoiceTaxDto.put("flgInvoice", SalesConstants.IN_PROGRESS_TRANSACTION);
  497.                             if (!resultSoBalanceInvoiceTaxList.contains(soBalanceInvoiceTaxDto)) {
  498.                                 resultSoBalanceInvoiceTaxList.add(soBalanceInvoiceTaxDto);
  499.                             }
  500.                         }
  501.                     }
  502.                    
  503.                     log.info("resultSoBalanceInvoiceTaxList = " + resultSoBalanceInvoiceTaxList);
  504.  
  505.                     resultInvoiceItemList.add(invoiceItemDto);
  506.                     resultSoBalanceInvoiceList.add(soBalanceInvoiceDto);
  507.                 } catch (CoreException e) {
  508.                     Dto errorDto = new Dto();
  509.  
  510.                     errorDto.put("id", GeneralConstants.NULL_REF_VALUE_LONG);
  511.                     errorDto.put("version", GeneralConstants.NULL_REF_VALUE_LONG);
  512.                     errorDto.put("lineNo", Long.valueOf(invoiceItemDto.getString("lineNo")));
  513.                     errorDto.put("refItemId", Long.valueOf(invoiceItemDto.getString("refItemId")));
  514.                     errorDto.put("doDocNo", invoiceItemDto.getString("doDocNo"));
  515.                     errorDto.put("doDocDate", invoiceItemDto.getString("doDocDate"));
  516.                     errorDto.put("productName", invoiceItemDto.getString("productName"));
  517.                     errorDto.put("qtyDlvSo", Long.valueOf(invoiceItemDto.getString("qtyDlvSo")));
  518.                     errorDto.put("soUomName", invoiceItemDto.getString("soUomName"));
  519.                     errorDto.put("currCode", invoiceItemDto.getString("currCode"));
  520.                     errorDto.put("itemAmount", invoiceItemDto.getString("itemAmount"));
  521.                     errorDto.put("remark", invoiceItemDto.getString("remark"));
  522.                     errorDto.put("errorKey", e.getErrorKey());
  523.  
  524.                     List<Object> argsList = new ArrayList<Object>();
  525.                     if (e.getParamValues() != null && e.getParamValues().length > 0)
  526.                         for (Object paramValue : e.getParamValues()) {
  527.                             argsList.add(paramValue);
  528.                         }
  529.                     errorDto.put("args", argsList);
  530.  
  531.                     failList.add(errorDto);
  532.                 }
  533.             }
  534.         }
  535.        
  536.         //Buat doc no Sales Invoice berdasarkan DO
  537.         String[] doDocNoArray = doDocNo.split(SalesConstantsForXcom.DOC_NO_SPLITTER);
  538.         String[] invoiceDocNoArray = inputDto.getString("docNo").split(SalesConstantsForXcom.DOC_NO_SPLITTER);
  539.         String invDocNo = GeneralConstants.EMPTY_VALUE;
  540.        
  541.         Pattern lettersPattern = Pattern.compile(SalesConstantsForXcom.LETTERS_REGEX);
  542.         Pattern numbersPattern = Pattern.compile(SalesConstantsForXcom.NUMBERS_REGEX);
  543.        
  544.         for (int i = 0; i < invoiceDocNoArray.length; i++) {
  545.             Matcher lettersMatcher = lettersPattern.matcher(invoiceDocNoArray[i]);
  546.             if (lettersMatcher.find()){
  547.                 if (!invDocNo.isEmpty()) {
  548.                     invDocNo = invDocNo.concat(SalesConstantsForXcom.DOC_NO_SPLITTER);
  549.                 }
  550.                 invDocNo = invDocNo.concat(invoiceDocNoArray[i]);
  551.             }
  552.         }
  553.        
  554.         for (int i = 0; i < doDocNoArray.length; i++) {
  555.             Matcher numbersMatcher = numbersPattern.matcher(doDocNoArray[i]);
  556.             if (numbersMatcher.find()){
  557.                 invDocNo = invDocNo.concat(SalesConstantsForXcom.DOC_NO_SPLITTER).concat(doDocNoArray[i]);
  558.             }
  559.         }
  560.        
  561.         inputDto.put("docNo", invDocNo);
  562.        
  563.         // Validation data (business key) is not exists yet in db (add)
  564.         Dto paramCheckUniqueDto = new Dto();
  565.         paramCheckUniqueDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  566.         paramCheckUniqueDto.put("docTypeId", SalesConstants.DOCUMENT_SALES_INVOICE);
  567.         paramCheckUniqueDto.put("docDate", docDate);
  568.         paramCheckUniqueDto.put("docNo", inputDto.getString("docNo"));
  569.         paramCheckUniqueDto.put("ouId", salesOrderDto.getLong("ouId"));
  570.         Dto resultCheckUniqueDto = isSalesInvoiceExistsByIndex.execute(paramCheckUniqueDto);
  571.  
  572.         if (resultCheckUniqueDto.getBoolean("exists")) {
  573.             throw new CoreException(SalesExceptionConstants.INVOICE_ALREADY_EXISTS, docDate, inputDto.getString("docNo"), salesOrderDto.getLong("ouId"));
  574.         }
  575.        
  576.         // check so balance advance invoice
  577.         Dto outputIsSoBalanceAdvanceInvoiceExistsBySalesOrderDto = isSoBalanceAdvanceInvoiceExistsBySalesOrder.execute(new Dto()
  578.                 .put("soId", inputDto.get("refId")));
  579.         Dto soBalanceAdvanceInvoiceDto = new Dto();
  580.         boolean isAddInvoiceAdvance = false;
  581.         Dto invoiceAdvanceDto = new Dto();
  582.         Double advanceAmount = 0d;
  583.         if(outputIsSoBalanceAdvanceInvoiceExistsBySalesOrderDto.getBoolean("exists")){
  584.             isAddInvoiceAdvance = true;
  585.            
  586.             soBalanceAdvanceInvoiceDto = outputIsSoBalanceAdvanceInvoiceExistsBySalesOrderDto.getDto("soBalanceAdvanceInvoiceDto");
  587.             advanceAmount = soBalanceAdvanceInvoiceDto.getDouble("advanceAmount");
  588.             Long invoiceAdvanceLastLineNo = 1L;
  589.            
  590.             invoiceAdvanceDto.put("tenantId", inputDto.get("tenantLoginId"));
  591.             invoiceAdvanceDto.put("invoiceId", GeneralConstants.NULL_REF_VALUE_LONG);
  592.             invoiceAdvanceDto.put("lineNo", invoiceAdvanceLastLineNo);
  593.             invoiceAdvanceDto.put("refDocTypeId", soBalanceAdvanceInvoiceDto.get("refDocTypeId"));
  594.             invoiceAdvanceDto.put("refId", soBalanceAdvanceInvoiceDto.get("refId"));
  595.             invoiceAdvanceDto.put("advanceCurrCode", soBalanceAdvanceInvoiceDto.get("advanceCurrCode"));
  596.             invoiceAdvanceDto.put("advanceAmount", advanceAmount);
  597.             invoiceAdvanceDto.put("allocAmount", advanceAmount);
  598.             invoiceAdvanceDto.put("remark", GeneralConstants.EMPTY_VALUE);
  599.            
  600.             this.prepareInsertAudit(invoiceAdvanceDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  601.             this.prepareUpdateAudit(invoiceAdvanceDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  602.            
  603.             // update SoBalanceAdvanceInvoiceList
  604.             soBalanceAdvanceInvoiceDto.put("flgInvoice", SalesConstants.IN_PROGRESS_TRANSACTION);
  605.             soBalanceAdvanceInvoiceDto.put("invoiceId", GeneralConstants.NULL_REF_VALUE_LONG);
  606.             this.prepareUpdateAudit(soBalanceAdvanceInvoiceDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  607.            
  608.             // Update ke invoice tax, jika taxId <> -99
  609.             if (!GeneralConstants.NULL_REF_VALUE_LONG.equals(soBalanceAdvanceInvoiceDto.getLong("taxId"))) {
  610.                 Dto invoiceTaxDto = mapInvoiceTax.get(soBalanceAdvanceInvoiceDto.getLong("taxId").toString());
  611.                 invoiceTaxDto.put("advanceAmount", new Calc(invoiceTaxDto.getDouble("advanceAmount")).add(advanceAmount).doubleValue());
  612.             }
  613.         }
  614.  
  615.         for (Entry<String, Dto> entry : mapInvoiceTax.entrySet()) {
  616.             Dto invoiceTaxDto = entry.getValue();
  617.             Double baseAmount = invoiceTaxDto.getDouble("baseAmount");
  618.             Double baseAmountAfterDisc = new Calc(baseAmount).subtract(totalRegularDiscAmount).subtract(totalPromoDiscAmount).doubleValue();
  619.             Double taxAdvanceAmount = invoiceTaxDto.getDouble("advanceAmount");
  620.             Double taxPercentage = invoiceTaxDto.getDouble("taxPercentage");
  621.             invoiceTaxDto.put("taxAmount", new Calc(new Calc(baseAmountAfterDisc).subtract(taxAdvanceAmount).getValue())
  622.                                             .multiply(taxPercentage).divide(100, scaleTax, roundingModeTax).doubleValue());
  623.             calcTaxAmount = calcTaxAmount.add(invoiceTaxDto.getDouble("taxAmount"));
  624.            
  625.             invoiceTaxDto.put("totalTaxDiscAmount", totalRegularDiscAmount.add(totalPromoDiscAmount)
  626.                     .multiply(taxDto.getDouble("percentage")).divide(100, scaleTax, roundingModeTax).doubleValue());
  627.            
  628.             // add by: Ping An 30 Juni 2015, set default tanggal faktur ambil dari tanggal dokumen
  629.             // dan gov tax amountnya langsung di simpankan juga = DPP Rupiah * 10% (pembulatan kebawah)
  630.             invoiceTaxDto.put("taxDate", docDate);
  631.                                            
  632.             if (inputDto.get("currCode").equals(currCodeGov)) {
  633.                     // No need to calculate, since it has the same currency code
  634.                     invoiceTaxDto.put("govTaxAmount", invoiceTaxDto.getDouble("taxAmount"));                                       
  635.                                                            
  636.             } else {
  637.                
  638.                 Dto inputCurrExcRateDto = new Dto();
  639.                 inputCurrExcRateDto.put("tenantId", inputDto.get("tenantLoginId"));
  640.                 inputCurrExcRateDto.put("date", invoiceTaxDto.get("taxDate"));
  641.                 inputCurrExcRateDto.put("currencyCodeFrom", inputDto.get("currCode"));
  642.                 inputCurrExcRateDto.put("type", MasterConstants.EXCHANGE_RATE_TYPE_TAX);
  643.                
  644.                 Dto outputCurrExcRateDto = findExchangeRateByDate.execute(inputCurrExcRateDto);
  645.                
  646.                 String amountTo = outputCurrExcRateDto.getString("amountTo");
  647.                 String amountFrom = outputCurrExcRateDto.getString("amountFrom");
  648.                
  649.                 // Calculate using exchange rate
  650.                 invoiceTaxDto.put("govTaxAmount", new Calc(baseAmountAfterDisc).subtract(taxAdvanceAmount)
  651.                 .multiply(Double.valueOf(amountTo))
  652.                 .divide(Double.valueOf(amountFrom))
  653.                 .multiply(taxPercentage)
  654.                 .divide(100, scaleTax, roundingModeTax)
  655.                 .doubleValue());
  656.             }
  657.  
  658.             // end add by: Ping An
  659.         }
  660.  
  661.         if (!failList.isEmpty()) {
  662.             Dto errorParamDto = new Dto();
  663.             DtoUtil.putInErrorParamDto(errorParamDto, "failList",
  664.                     new String[] {"lineNo","doDocNo","doDocDate","productName","qtyDlvSo","soUomName","currCode","itemAmount", "errorKey", "args" }, failList);
  665.             throw new CoreException(SalesExceptionConstants.SALES_INVOICE_ITEMS_ERROR, errorParamDto);
  666.         }
  667.        
  668.         Long lineNo = 1L;
  669.         List<Dto> salesInvoiceCostList = new ArrayList<Dto>(); 
  670.         if (CommonBusinessValidator.compareNumber(totalRegularDiscAmount.toString(), "0",
  671.                 CommonBusinessValidator.COMPARE_GREATER, "Total Regular Discount Amount", "Zero")) {
  672.             SalesInvoiceCost salesInvoiceCost = new SalesInvoiceCost();
  673.             salesInvoiceCost.setTenantId(inputDto.getLong("tenantLoginId"));
  674.             salesInvoiceCost.setLineNo(lineNo++);
  675.             salesInvoiceCost.setRefDocTypeId(GeneralConstants.NULL_REF_VALUE_LONG);
  676.             salesInvoiceCost.setRefId(GeneralConstants.NULL_REF_VALUE_LONG);
  677.             salesInvoiceCost.setActivityGlId(activityRegularDiscDto.getLong("id"));
  678.             salesInvoiceCost.setOuRcId(GeneralConstants.NULL_REF_VALUE_LONG);
  679.             salesInvoiceCost.setCurrCode(inputDto.getString("currCode"));
  680.             salesInvoiceCost.setAddAmount(totalRegularDiscAmount.multiply(-1).doubleValue());
  681.             salesInvoiceCost.setTaxId(taxDto.getLong("id"));
  682.             salesInvoiceCost.setTaxPercentage(taxDto.getDouble("percentage"));
  683.             salesInvoiceCost.setTaxAmount(totalRegularDiscAmount.multiply(taxDto.getDouble("percentage"))
  684.                     .divide(100, scaleTax, roundingModeTax).doubleValue());
  685.             salesInvoiceCost.setRemark(GeneralConstants.EMPTY_VALUE);
  686.             salesInvoiceCost.setSegmentId(GeneralConstants.NULL_REF_VALUE_LONG);
  687.            
  688.             Dto salesInvoiceCostDto = new Dto(salesInvoiceCost);
  689.             this.prepareInsertAudit(salesInvoiceCostDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  690.             this.prepareUpdateAudit(salesInvoiceCostDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  691.            
  692.             salesInvoiceCostList.add(salesInvoiceCostDto);
  693.         }
  694.        
  695.         if (CommonBusinessValidator.compareNumber(totalPromoDiscAmount.toString(), "0",
  696.                 CommonBusinessValidator.COMPARE_GREATER, "Total Promo Discount Amount", "Zero")) {
  697.             SalesInvoiceCost salesInvoiceCost = new SalesInvoiceCost();
  698.             salesInvoiceCost.setTenantId(inputDto.getLong("tenantLoginId"));
  699.             salesInvoiceCost.setLineNo(lineNo);
  700.             salesInvoiceCost.setRefDocTypeId(GeneralConstants.NULL_REF_VALUE_LONG);
  701.             salesInvoiceCost.setRefId(GeneralConstants.NULL_REF_VALUE_LONG);
  702.             salesInvoiceCost.setActivityGlId(activityPromoDiscDto.getLong("id"));
  703.             salesInvoiceCost.setOuRcId(GeneralConstants.NULL_REF_VALUE_LONG);
  704.             salesInvoiceCost.setCurrCode(inputDto.getString("currCode"));
  705.             salesInvoiceCost.setAddAmount(totalPromoDiscAmount.multiply(-1).doubleValue());
  706.             salesInvoiceCost.setTaxId(taxDto.getLong("id"));
  707.             salesInvoiceCost.setTaxPercentage(taxDto.getDouble("percentage"));
  708.             salesInvoiceCost.setTaxAmount(totalPromoDiscAmount.multiply(taxDto.getDouble("percentage"))
  709.                     .divide(100, scaleTax, roundingModeTax).doubleValue());
  710.             salesInvoiceCost.setRemark(GeneralConstants.EMPTY_VALUE);
  711.             salesInvoiceCost.setSegmentId(GeneralConstants.NULL_REF_VALUE_LONG);
  712.            
  713.             Dto salesInvoiceCostDto = new Dto(salesInvoiceCost);
  714.             this.prepareInsertAudit(salesInvoiceCostDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  715.             this.prepareUpdateAudit(salesInvoiceCostDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  716.            
  717.             salesInvoiceCostList.add(salesInvoiceCostDto);
  718.         }
  719.        
  720.         inputDto.put("grossAmount", calcNettAmount.subtract(totalRegularDiscAmount).subtract(totalPromoDiscAmount).add(calcTaxAmount).doubleValue());
  721.         inputDto.put("advanceAmount", advanceAmount);
  722.         inputDto.put("taxAmount", calcTaxAmount.doubleValue());
  723.         inputDto.put("totalAmount", calcNettAmount.subtract(advanceAmount).subtract(totalRegularDiscAmount).subtract(totalPromoDiscAmount).doubleValue());
  724.         inputDto.put("refInvTempId", GeneralConstants.NULL_REF_VALUE_LONG);
  725.         inputDto.put("discountAmount", totalRegularDiscAmount.add(totalPromoDiscAmount).doubleValue());
  726.  
  727.         inputDto.put("mapInvoiceTax", mapInvoiceTax);
  728.         inputDto.put("resultInvoiceItemList", resultInvoiceItemList);
  729.         inputDto.put("resultSoBalanceInvoiceList", resultSoBalanceInvoiceList);
  730.         inputDto.put("resultSoBalanceInvoiceTaxList", resultSoBalanceInvoiceTaxList);
  731.        
  732.         inputDto.put("isAddInvoiceAdvance", isAddInvoiceAdvance);
  733.         inputDto.put("invoiceAdvanceDto", invoiceAdvanceDto);
  734.         inputDto.put("soBalanceAdvanceInvoiceDto", soBalanceAdvanceInvoiceDto);
  735.         inputDto.put("salesInvoiceCostList", salesInvoiceCostList);
  736.        
  737.         return null;
  738.     }
  739.  
  740.     @SuppressWarnings({ "unchecked", "rawtypes" })
  741.     @Override
  742.     public Dto process(Dto inputDto, Dto originalDto) throws Exception {
  743.  
  744.         SalesInvoice invoice = GsonUtil.fromDto(inputDto, SalesInvoice.class);
  745.         salesInvoiceDao.persist(invoice);
  746.  
  747.         List<Dto> resultInvoiceItemList = inputDto.getList("resultInvoiceItemList");
  748. //      List<Dto> successListDto = new ArrayList<Dto>();
  749.         for (Dto invoiceItemDto : resultInvoiceItemList) {
  750.             invoiceItemDto.put("invoiceId", invoice.getId());
  751.             SalesInvoiceItem invoiceItem = GsonUtil.fromDto(invoiceItemDto, SalesInvoiceItem.class);
  752.             salesInvoiceItemDao.persist(invoiceItem);
  753.  
  754.         }
  755.  
  756.         Dto mapInvoiceTax = inputDto.getDto("mapInvoiceTax");
  757.         Iterator iter = mapInvoiceTax.entrySet().iterator();
  758.         while (iter.hasNext()) {
  759.             Entry entry = (Entry) iter.next();
  760.             Dto invoiceTaxDto = (Dto) entry.getValue();
  761.             if(!invoiceTaxDto.getDouble("taxAmount").equals(new Double(0))){
  762.                 invoiceTaxDto.put("invoiceId", invoice.getId());
  763.                 SalesInvoiceTax invoiceTax = GsonUtil.fromDto(invoiceTaxDto, SalesInvoiceTax.class);
  764.                 salesInvoiceTaxDao.persist(invoiceTax);
  765.             }
  766.         }
  767.  
  768.         List<Dto> resultSoBalanceInvoiceList = inputDto.getList("resultSoBalanceInvoiceList");
  769.         for (Dto soBalanceInvoiceDto : resultSoBalanceInvoiceList) {
  770.             soBalanceInvoiceDto.put("invoiceId", invoice.getId());
  771.             SalesOrderBalanceInvoice soBalanceInvoice = GsonUtil.fromDto(soBalanceInvoiceDto, SalesOrderBalanceInvoice.class);
  772.             soBalanceInvoice = salesOrderBalanceInvoiceDao.merge(soBalanceInvoiceDto.getLong("id"), soBalanceInvoice);
  773.         }
  774.  
  775.         List<Dto> resultSoBalanceInvoiceTaxList = inputDto.getList("resultSoBalanceInvoiceTaxList");
  776.         for (Dto soBalanceInvoiceTaxDto : resultSoBalanceInvoiceTaxList) {
  777.             soBalanceInvoiceTaxDto.put("invoiceId", invoice.getId());
  778.             SalesOrderBalanceInvoiceTax soBalanceInvoiceTax = GsonUtil.fromDto(soBalanceInvoiceTaxDto, SalesOrderBalanceInvoiceTax.class);
  779.             soBalanceInvoiceTax = salesOrderBalanceInvoiceTaxDao.merge(soBalanceInvoiceTaxDto.getLong("id"), soBalanceInvoiceTax);
  780.         }
  781.  
  782.         log.info("inputDto.getBoolean(\"isAddInvoiceAdvance\") : "+inputDto.getBoolean("isAddInvoiceAdvance"));
  783.         if(inputDto.getBoolean("isAddInvoiceAdvance")){
  784.             Dto invoiceAdvanceDto = inputDto.getDto("invoiceAdvanceDto");
  785.             invoiceAdvanceDto.put("invoiceId", invoice.getId());
  786.             SalesInvoiceAdvance invoiceAdvance = GsonUtil.fromDto(invoiceAdvanceDto, SalesInvoiceAdvance.class);
  787.             salesInvoiceAdvanceDao.persist(invoiceAdvance);
  788.            
  789.             // update so balance
  790.             Dto soBalanceAdvanceInvoiceDto = inputDto.getDto("soBalanceAdvanceInvoiceDto");
  791.             soBalanceAdvanceInvoiceDto.put("invoiceId", invoice.getId());
  792.             SoBalanceAdvanceInvoice soBalanceAdvanceInvoice = GsonUtil.fromDto(soBalanceAdvanceInvoiceDto, SoBalanceAdvanceInvoice.class);
  793.             soBalanceAdvanceInvoice = soBalanceAdvanceInvoiceDao.merge(soBalanceAdvanceInvoice.getId(), soBalanceAdvanceInvoice);
  794.         }
  795.        
  796.         List<Dto> salesInvoiceCostList = inputDto.getList("salesInvoiceCostList");
  797.         if (salesInvoiceCostList != null && !salesInvoiceCostList.isEmpty()) {
  798.             for (Dto salesInvoiceCostDto : salesInvoiceCostList) {
  799.                 SalesInvoiceCost salesInvoiceCost = GsonUtil.fromDto(salesInvoiceCostDto, SalesInvoiceCost.class);
  800.                 salesInvoiceCost.setInvoiceId(invoice.getId());
  801.                 salesInvoiceCostDao.persist(salesInvoiceCost);
  802.             }
  803.         }
  804.        
  805.         return new Dto(invoice);
  806.     }
  807. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement