Advertisement
aadddrr

AddSalesInvoiceTemp

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