Advertisement
aadddrr

AddInvoiceForXcom

Oct 1st, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 33.20 KB | None | 0 0
  1. /**
  2.  *
  3.  */
  4. package org.jleaf.erp.purch.bo.invoice;
  5.  
  6. import java.util.ArrayList;
  7. import java.util.Iterator;
  8. import java.util.List;
  9. import java.util.Map.Entry;
  10. import java.util.concurrent.TimeUnit;
  11.  
  12. import org.jleaf.common.CommonExceptionConstants;
  13. import org.jleaf.core.BusinessFunction;
  14. import org.jleaf.core.BusinessTransaction;
  15. import org.jleaf.core.CoreException;
  16. import org.jleaf.core.DefaultBusinessTransaction;
  17. import org.jleaf.core.Dto;
  18. import org.jleaf.core.GeneralConstants;
  19. import org.jleaf.core.annotation.ErrorList;
  20. import org.jleaf.core.annotation.Info;
  21. import org.jleaf.core.annotation.InfoIn;
  22. import org.jleaf.core.annotation.InfoOut;
  23. import org.jleaf.erp.master.MasterConstants;
  24. import org.jleaf.erp.master.MasterExceptionConstants;
  25. import org.jleaf.erp.master.bo.admin.GetEarliestYearMonthOfNotYetClosedAdminProcessLedgerByOu;
  26. import org.jleaf.erp.purch.PurchasingConstants;
  27. import org.jleaf.erp.purch.PurchasingExceptionConstants;
  28. import org.jleaf.erp.purch.PurchasingExceptionConstantsForXcom;
  29. import org.jleaf.erp.purch.dao.InvoiceAdvanceDao;
  30. import org.jleaf.erp.purch.dao.InvoiceCostDao;
  31. import org.jleaf.erp.purch.dao.InvoiceDao;
  32. import org.jleaf.erp.purch.dao.InvoiceItemDao;
  33. import org.jleaf.erp.purch.dao.InvoiceTaxDao;
  34. import org.jleaf.erp.purch.dao.PoBalanceAdvanceInvoiceDao;
  35. import org.jleaf.erp.purch.dao.PoBalanceDiscountDao;
  36. import org.jleaf.erp.purch.dao.PurchaseOrderBalanceInvoiceDao;
  37. import org.jleaf.erp.purch.dao.PurchaseOrderBalanceInvoiceTaxDao;
  38. import org.jleaf.erp.purch.entity.Invoice;
  39. import org.jleaf.erp.purch.entity.InvoiceAdvance;
  40. import org.jleaf.erp.purch.entity.InvoiceCost;
  41. import org.jleaf.erp.purch.entity.InvoiceItem;
  42. import org.jleaf.erp.purch.entity.InvoiceTax;
  43. import org.jleaf.erp.purch.entity.PoBalanceAdvanceInvoice;
  44. import org.jleaf.erp.purch.entity.PoBalanceDiscount;
  45. import org.jleaf.erp.purch.entity.PurchaseOrderBalanceInvoice;
  46. import org.jleaf.erp.purch.entity.PurchaseOrderBalanceInvoiceTax;
  47. import org.jleaf.util.Calc;
  48. import org.jleaf.util.DateUtil;
  49. import org.jleaf.util.DtoUtil;
  50. import org.jleaf.util.GsonUtil;
  51. import org.jleaf.util.ValidationUtil;
  52. import org.jleaf.validator.CommonBusinessValidator;
  53. import org.slf4j.Logger;
  54. import org.slf4j.LoggerFactory;
  55. import org.springframework.beans.factory.annotation.Autowired;
  56. import org.springframework.beans.factory.annotation.Qualifier;
  57. import org.springframework.stereotype.Service;
  58.  
  59. /**
  60.  *
  61.  * @author unknown
  62.  * modified by fredi, Okt 16th 2014
  63.  * added check from invoice balance advance
  64.  * @see  http://jleaf.org:8181/browse/PURSVC-10
  65.  *
  66.  */
  67. //@formatter:off
  68. @Service("addInvoice")
  69. @InfoIn(value = {
  70.         @Info(name = "docNo", description = "Nomor Transaksi", type = String.class),
  71.         @Info(name = "docDate", description = "Tanggal Transaksi", type = String.class),
  72.         @Info(name = "extDocNo", description = "external document no", type = String.class),
  73.         @Info(name = "extDocDate", description = "external document date", 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 = "purchase order id", type = Long.class),
  77.         @Info(name = "invoiceItemList", description = "list of invoice item (lineNo, refItemId)", type = List.class),
  78.         @Info(name = "gridCostList", description = "list of cost item", type = List.class, required = false),
  79.         @Info(name = "tenantLoginId", description = "tenant login id", type = Long.class),
  80.         @Info(name = "userLoginId", description = "user login id", type = Long.class),
  81.         @Info(name = "roleLoginId", description = "role login id", type = Long.class),
  82.         @Info(name = "datetime", description = "datetime", type = String.class)
  83. })
  84. @InfoOut(value = {
  85.         @Info(name = "id", description = "invoice id", type = Long.class),
  86.         @Info(name = "docNo", description = "Nomor Transaksi", type = String.class),
  87.         @Info(name = "docDate", description = "Tanggal Transaksi", type = String.class),
  88.         @Info(name = "extDocNo", description = "external document no", type = String.class),
  89.         @Info(name = "extDocDate", description = "external document date", type = String.class),
  90.         @Info(name = "ouLegalId", description = "Organisasi Unit Legal id", type = Long.class),
  91.         @Info(name = "remark", description = "remark", type = String.class),
  92.         @Info(name = "refId", description = "purchase order id", type = Long.class),
  93.         @Info(name = "version", description = "version", type = Long.class)
  94. })
  95. @ErrorList(errorKeys = {
  96.         CommonExceptionConstants.TENANT_LOGIN_CANT_USED,
  97.         CommonExceptionConstants.OU_ID_NOT_FOUND,
  98.         CommonExceptionConstants.OU_NOT_LEGAL_ENTITY,
  99.         CommonExceptionConstants.OULEGAL_ID_NOT_FOUND,
  100.         PurchasingExceptionConstants.INVOICE_ALREADY_EXISTS,
  101.         PurchasingExceptionConstants.PURCHASE_ORDER_ID_NOT_FOUND,
  102.         MasterExceptionConstants.PARTNER_ID_NOT_FOUND,
  103.         MasterExceptionConstants.POLICY_PARTNER_AUTHORIZATION_FAILED,
  104.         PurchasingExceptionConstants.RECEIVE_GOODS_ITEM_ID_NOT_FOUND,
  105.         PurchasingExceptionConstants.PURCHASE_ORDER_BALANCE_INVOICE_NOT_FOUND,
  106.         PurchasingExceptionConstants.PARTNER_NOT_AUTHORIZED_AS_SUPPLIER
  107. })
  108. //@formatter:on
  109. public class AddInvoiceForXcom extends DefaultBusinessTransaction implements BusinessTransaction {
  110.  
  111.     private static final Logger log = LoggerFactory.getLogger(AddInvoice.class);
  112.  
  113.     @Autowired
  114.     InvoiceDao invoiceDao;
  115.  
  116.     @Autowired
  117.     InvoiceItemDao invoiceItemDao;
  118.  
  119.     @Autowired
  120.     InvoiceTaxDao invoiceTaxDao;
  121.  
  122.     @Autowired
  123.     InvoiceCostDao invoiceCostDao;
  124.    
  125.     @Autowired
  126.     PoBalanceDiscountDao poBalanceDiscountDao;
  127.  
  128.     @Autowired
  129.     PurchaseOrderBalanceInvoiceTaxDao purchaseOrderBalanceInvoiceTaxDao;
  130.  
  131.     @Autowired
  132.     PurchaseOrderBalanceInvoiceDao purchaseOrderBalanceInvoiceDao;
  133.  
  134.     @Autowired
  135.     PoBalanceAdvanceInvoiceDao poBalanceAdvanceInvoiceDao;
  136.    
  137.     @Autowired
  138.     InvoiceAdvanceDao invoiceAdvanceDao;
  139.    
  140.     @Autowired
  141.     @Qualifier("valTenantLoginCanUse")
  142.     BusinessFunction valTenantLoginCanUse;
  143.  
  144.     @Autowired
  145.     @Qualifier("findOULegalById")
  146.     BusinessFunction findOULegalById;
  147.    
  148.     @Autowired
  149.     @Qualifier("valOUAsLegal")
  150.     BusinessFunction valOUAsLegal;
  151.  
  152.     @Autowired
  153.     @Qualifier("isInvoiceExistsByIndex")
  154.     BusinessFunction isInvoiceExistsByIndex;
  155.  
  156.     @Autowired
  157.     @Qualifier("findPartnerById")
  158.     BusinessFunction findPartnerById;
  159.  
  160.     @Autowired
  161.     @Qualifier("findPurchaseOrderById")
  162.     BusinessFunction findPurchaseOrderById;
  163.  
  164.     @Autowired
  165.     @Qualifier("isPartnerTypeExistsByIndex")
  166.     BusinessFunction isPartnerTypeExistsByIndex;
  167.  
  168.     @Autowired
  169.     @Qualifier("valAuthorizedPolicyPartner")
  170.     BusinessFunction valAuthorizedPolicyPartner;
  171.  
  172.     @Autowired
  173.     @Qualifier("findReceiveGoodsItemById")
  174.     BusinessFunction findReceiveGoodsItemById;
  175.    
  176.     @Autowired
  177.     @Qualifier("findReceiveGoodsById")
  178.     BusinessFunction findReceiveGoodsById;
  179.  
  180.     @Autowired
  181.     @Qualifier("findPurchaseOrderBalanceInvoiceByIndex")
  182.     BusinessFunction findPurchaseOrderBalanceInvoiceByIndex;
  183.  
  184.     @Autowired
  185.     @Qualifier("getPurchaseOrderBalanceInvoiceTaxListByReceiveGoodsItem")
  186.     BusinessFunction getPurchaseOrderBalanceInvoiceTaxListByReceiveGoodsItem;
  187.    
  188.     @Autowired
  189.     @Qualifier("getRoundingParameter")
  190.     BusinessFunction getRoundingParameter;
  191.  
  192.     @Autowired
  193.     @Qualifier("isPoBalanceAdvanceInvoiceExistsByPurchaseOrder")
  194.     BusinessFunction isPoBalanceAdvanceInvoiceExistsByPurchaseOrder;
  195.    
  196.     @Autowired
  197.     @Qualifier("findSystemConfigByParamCode")
  198.     private BusinessFunction findSystemConfigByParamCode;
  199.    
  200.     @Autowired
  201.     @Qualifier("findExchangeRateByDate")
  202.     private BusinessFunction findExchangeRateByDate;
  203.  
  204.     @Autowired
  205.     @Qualifier("findPoBalanceDiscountByIndex")
  206.     private BusinessFunction findPoBalanceDiscountByIndex;
  207.  
  208.     @Autowired
  209.     @Qualifier("findInvoiceCostLastLineNo")
  210.     private BusinessFunction findInvoiceCostLastLineNo;
  211.    
  212.     @Override
  213.     public String getDescription() {
  214.         return "Add invoice";
  215.     }
  216.  
  217.     @SuppressWarnings({"unchecked", "rawtypes"})
  218.     @Override
  219.     public Dto prepare(Dto inputDto, Dto originalDto) throws Exception {
  220.         Dto inputDtoForRoundingParameter = new Dto();
  221.         inputDtoForRoundingParameter.put("tenantId", inputDto.getLong("tenantLoginId"));
  222.         Dto resultDtoForRoundingParameter = getRoundingParameter.execute(inputDtoForRoundingParameter);
  223.        
  224. //      int scaleNonTax = resultDtoForRoundingParameter.getInteger("scaleNonTax");
  225. //      int roundingModeNonTax = resultDtoForRoundingParameter.getInteger("roundingModeNonTax");
  226.         int scaleTax = resultDtoForRoundingParameter.getInteger("scaleTax");
  227.         int roundingModeTax = resultDtoForRoundingParameter.getInteger("roundingModeTax");     
  228.        
  229.         // Validation tenant login id can be use
  230.         Dto loginDto = new Dto();
  231.         loginDto.put("tenantLoginId", inputDto.getLong("tenantLoginId"));
  232.         loginDto.put("userLoginId", inputDto.getLong("userLoginId"));
  233.         loginDto.put("roleLoginId", inputDto.getLong("roleLoginId"));
  234.         valTenantLoginCanUse.execute(loginDto);
  235.  
  236.         this.prepareInsertAudit(inputDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  237.         this.prepareUpdateAudit(inputDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  238.  
  239.         // Validation tidak boleh kosong / null / tanggal / etc
  240.         ValidationUtil.valBlankOrNull(inputDto.getString("docNo"), "Document No");
  241.         ValidationUtil.valBlankOrNull(inputDto.getString("docDate"), "Document Date");
  242.         ValidationUtil.valBlankOrNull(inputDto.getString("extDocDate"), "Ext Document Date");
  243.         ValidationUtil.valBlankOrNull(inputDto.getString("extDocNo"), "Ext Document No");
  244.         ValidationUtil.valDate(inputDto.getString("docDate"), "Document Date");
  245.         ValidationUtil.valDate(inputDto.getString("extDocDate"), "Ext Document Date");
  246.  
  247.         if (!GeneralConstants.NULL_REF_VALUE_LONG.equals(inputDto.getLong("ouLegalId"))) {
  248.             Dto ouLegalDto = findOULegalById.execute(new Dto().put("id", inputDto.getLong("ouLegalId")));
  249.             valOUAsLegal.execute(new Dto().put("id", ouLegalDto.getLong("ouId")));
  250.         }
  251.  
  252.         Dto purchaseOrderDto = findPurchaseOrderById.execute(new Dto().put("id", inputDto.getLong("refId"))); // TODO
  253.        
  254.         // Validasi tanggal Purchase Invoice >= dari tanggal PO
  255.         CommonBusinessValidator.valCompareDate(inputDto.getString("docDate"), purchaseOrderDto.getString("docDate"), CommonBusinessValidator.COMPARE_GREATER_EQUAL, "Purchase Invoice Document Date", "Purchase Order Document Date");
  256.         CommonBusinessValidator.valCompareDate(inputDto.getString("extDocDate"), inputDto.getString("docDate"), CommonBusinessValidator.COMPARE_LESS_EQUAL, "Supplier Document Date", "Purchase Invoice Document Date");
  257.         CommonBusinessValidator.valCompareDate(inputDto.getString("extDocDate"), purchaseOrderDto.getString("docDate"), CommonBusinessValidator.COMPARE_GREATER_EQUAL, "Supplier Document Date", "Purchase Order Document Date");
  258.  
  259.         Dto partnerDto = findPartnerById.execute(new Dto().put("id", purchaseOrderDto.getLong("partnerId")));
  260.  
  261.         // partner harus supplier
  262.         Dto paramPartnerMustSupplier = new Dto();
  263.         paramPartnerMustSupplier.put("tenantId", inputDto.getLong("tenantLoginId"));
  264.         paramPartnerMustSupplier.put("partnerId", partnerDto.getLong("id"));
  265.         paramPartnerMustSupplier.put("groupPartner", MasterConstants.GROUP_PARTNER_CODE_SUPPLIER);
  266.         Dto resultPartnerMustSupplier = isPartnerTypeExistsByIndex.execute(paramPartnerMustSupplier);
  267.  
  268.         if (!resultPartnerMustSupplier.getBoolean("exists")) {
  269.             throw new CoreException(PurchasingExceptionConstants.PARTNER_NOT_AUTHORIZED_AS_SUPPLIER, partnerDto.getLong("id"), partnerDto.getString("code"),
  270.                     partnerDto.getString("name"));
  271.         }
  272.  
  273.         Dto paramAuthorizedPolicyPartner = new Dto();
  274.         paramAuthorizedPolicyPartner.put("userLoginId", inputDto.getLong("userLoginId"));
  275.         paramAuthorizedPolicyPartner.put("roleLoginId", inputDto.getLong("roleLoginId"));
  276.         paramAuthorizedPolicyPartner.put("partnerId", partnerDto.getLong("id"));
  277.         paramAuthorizedPolicyPartner.put("varName", "Supplier");
  278.         valAuthorizedPolicyPartner.execute(paramAuthorizedPolicyPartner);
  279.  
  280.         // Validation data (business key) is not exists yet in db (add)
  281.         Dto paramCheckUniqueDto = new Dto();
  282.         paramCheckUniqueDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  283.         paramCheckUniqueDto.put("docTypeId", PurchasingConstants.DOCUMENT_PURCH_INVOICE);
  284.         paramCheckUniqueDto.put("docDate", inputDto.getString("docDate"));
  285.         paramCheckUniqueDto.put("docNo", inputDto.getString("docNo"));
  286.         paramCheckUniqueDto.put("ouId", purchaseOrderDto.getLong("ouId"));
  287.         Dto resultCheckUniqueDto = isInvoiceExistsByIndex.execute(paramCheckUniqueDto);
  288.  
  289.         if (resultCheckUniqueDto.getBoolean("exists")) {
  290.             throw new CoreException(PurchasingExceptionConstants.INVOICE_ALREADY_EXISTS, inputDto.getString("docDate"), inputDto.getString("docNo"),
  291.                     purchaseOrderDto.getLong("ouId"));
  292.         }
  293.  
  294.         inputDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  295.         inputDto.put("docTypeId", PurchasingConstants.DOCUMENT_PURCH_INVOICE);
  296.         inputDto.put("ouId", purchaseOrderDto.getLong("ouId"));
  297.         inputDto.put("refDocTypeId", PurchasingConstants.DOCUMENT_PURCHASE_ORDER);
  298.         inputDto.put("partnerId", purchaseOrderDto.getLong("partnerId"));
  299.         inputDto.put("purchaserId", purchaseOrderDto.getLong("purchaserId"));
  300.         inputDto.put("currCode", purchaseOrderDto.getString("currCode"));
  301.         inputDto.put("dueDate", DateUtil.addDate(inputDto.getString("docDate"), TimeUnit.MILLISECONDS.convert(resultPartnerMustSupplier.getLong("partnerTypeDto.dueDate"), TimeUnit.DAYS)));
  302.         inputDto.put("grossAmount", new Double(0));
  303.         inputDto.put("advanceAmount", new Double(0));
  304.         inputDto.put("taxAmount", new Double(0));
  305.         inputDto.put("addAmount", new Double(0));
  306.         inputDto.put("totalAmount", new Double(0));
  307.         inputDto.put("statusDoc", PurchasingConstants.DRAFT_TRANSACTION);
  308.         inputDto.put("workflowStatus", PurchasingConstants.WORKFLOW_STATUS_DRAFT);
  309.        
  310.        
  311.         // prepare detail for add item
  312.         List<Dto> invoiceItemList = inputDto.getList("invoiceItemList");
  313.         List<Dto> resultInvoiceItemList = new ArrayList<Dto>();
  314.         List<Dto> gridCostList = inputDto.getList("gridCostList");
  315.         List<Dto> resultPoBalanceInvoiceList = new ArrayList<Dto>();
  316.         List<Dto> resultPoBalanceInvoiceTaxList = new ArrayList<Dto>();
  317.         List<Dto> failList = new ArrayList<Dto>();
  318.         Dto mapInvoiceTax = new Dto();
  319.         Calc calcTaxAmount = new Calc(0);
  320.         Calc calcNettAmount = new Calc(0);
  321.        
  322.         /*
  323.          * Modified By Sarah 05 Oktober 2017
  324.          * Tambahkan Cost dari discout PO kalau ada discount nya.
  325.          * Nilai amount nya dari discout amount di balance discount, ambil nilai current, lalu update nilai balance nya.
  326.          *
  327.          */
  328.  
  329.         Dto balanceDiscountDto = new Dto();
  330.         Double addAmount = 0D;
  331.        
  332.         if (gridCostList != null){
  333.             // prepare data untuk mengurangi current amount dari cost amount data
  334.             Dto filterFindPoBalanceDiscount = new Dto();
  335.             filterFindPoBalanceDiscount.put("tenantId", inputDto.get("tenantLoginId"));
  336.             filterFindPoBalanceDiscount.put("ouId", purchaseOrderDto.getLong("ouId"));
  337.             filterFindPoBalanceDiscount.put("poId", purchaseOrderDto.getLong("id"));       
  338.             balanceDiscountDto = findPoBalanceDiscountByIndex.execute(filterFindPoBalanceDiscount);
  339.    
  340.             Double currentAmount = balanceDiscountDto.getDouble("currentAmount");
  341.  
  342.             // cek status jika I maka tidak bisa di save // I = sedang di pakai di dokumen lain
  343.             if (!balanceDiscountDto.get("status").equals(GeneralConstants.NO)){
  344.                 throw new CoreException(PurchasingExceptionConstantsForXcom.DISCOUNT_CANNOT_USED,
  345.                         new Calc(balanceDiscountDto.getDouble("currentAmount")).subtract(currentAmount).doubleValue());
  346.             }
  347.            
  348.             // prepare data untuk menambahkan cost
  349.             for(Dto costDto : gridCostList) {  
  350.                 costDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  351.                 costDto.put("refDocTypeId", PurchasingConstants.DOCUMENT_PURCHASE_ORDER);
  352.                 costDto.put("refId", balanceDiscountDto.get("id"));
  353.                 costDto.put("taxId", GeneralConstants.NULL_REF_VALUE_LONG);
  354.                 costDto.put("taxPercentage", new Double(0));
  355.                 costDto.put("taxAmount", new Double(0));
  356.                 costDto.put("remark", GeneralConstants.EMPTY_VALUE);
  357.  
  358.                 addAmount = Double.valueOf(costDto.getString("addAmount"));
  359.                    
  360.                 this.prepareInsertAudit(costDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  361.                 this.prepareUpdateAudit(costDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  362.                
  363.                 // current amount di kurangkan hasil add amount
  364.                 currentAmount = new Calc(currentAmount).add(addAmount).doubleValue();      
  365.             }
  366.            
  367.             balanceDiscountDto.put("currentAmount", currentAmount);
  368.             balanceDiscountDto.put("status", PurchasingConstants.IN_PROGRESS_TRANSACTION); // status di ubah menjadi I karna sedang di pakai
  369.             inputDto.put("balanceDiscountDto", balanceDiscountDto);
  370.             this.prepareUpdateAudit(balanceDiscountDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  371.         } else {
  372.  
  373.             inputDto.put("balanceDiscountDto", null);
  374.         }
  375.  
  376.        
  377.        
  378.         // Get valuta gov
  379.         Dto inputCurrCodeGovDto = new Dto();
  380.         inputCurrCodeGovDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  381.         inputCurrCodeGovDto.put("parameterCode", MasterConstants.PARAMETER_CODE_VALUTA_RESMI);
  382.        
  383.         Dto outputCurrCodeGovDto = findSystemConfigByParamCode.execute(inputCurrCodeGovDto);
  384.         String currCodeGov = outputCurrCodeGovDto.getString("value");
  385.        
  386.         if (invoiceItemList != null && !invoiceItemList.isEmpty()) {
  387.             for (Dto invoiceItemDto : invoiceItemList) {
  388.                 try {
  389.                     Dto receiveGoodsItemDto = findReceiveGoodsItemById.execute(new Dto().put("id", Long.valueOf(invoiceItemDto.getString("refItemId"))));
  390.                     Dto receiveGoodsDto = findReceiveGoodsById.execute(new Dto().put("id", Long.valueOf(receiveGoodsItemDto.getString("receiveGoodsId"))));
  391.  
  392.                     // Validasi tanggal Purchase Invoice >= tanggal Receive Goods
  393.                     CommonBusinessValidator.valCompareDate(inputDto.getString("docDate"), receiveGoodsDto.getString("docDate"), CommonBusinessValidator.COMPARE_GREATER_EQUAL, "Purchase Invoice Document Date", "Receive Goods Document Date");
  394.                     CommonBusinessValidator.valCompareDate(inputDto.getString("extDocDate"), receiveGoodsDto.getString("docDate"), CommonBusinessValidator.COMPARE_GREATER_EQUAL, "Supplier Document Date", "Receive Goods Document Date");
  395.                    
  396.                     Dto paramPoBalanceInvoiceDto = new Dto();
  397.                     paramPoBalanceInvoiceDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  398.                     paramPoBalanceInvoiceDto.put("ouId", purchaseOrderDto.getLong("ouId"));
  399.                     paramPoBalanceInvoiceDto.put("poId", purchaseOrderDto.getLong("id"));
  400.                     paramPoBalanceInvoiceDto.put("refDocTypeId", PurchasingConstants.DOCUMENT_RECEIVE_GOODS);
  401.                     paramPoBalanceInvoiceDto.put("refId", receiveGoodsItemDto.getLong("receiveGoodsId"));
  402.                     paramPoBalanceInvoiceDto.put("refItemId", Long.valueOf(invoiceItemDto.getString("refItemId")));
  403.                     Dto poBalanceInvoiceDto = findPurchaseOrderBalanceInvoiceByIndex.execute(paramPoBalanceInvoiceDto);
  404.  
  405.                     invoiceItemDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  406.                     invoiceItemDto.put("lineNo", Long.valueOf(invoiceItemDto.getString("lineNo")));
  407.                     invoiceItemDto.put("refDocTypeId", PurchasingConstants.DOCUMENT_RECEIVE_GOODS);
  408.                     invoiceItemDto.put("refId", receiveGoodsItemDto.getLong("receiveGoodsId"));
  409.                     invoiceItemDto.put("refItemId", Long.valueOf(invoiceItemDto.getString("refItemId")));
  410.                     invoiceItemDto.put("refItemAmount", poBalanceInvoiceDto.getDouble("itemAmount"));
  411.                     invoiceItemDto.put("remark", GeneralConstants.EMPTY_VALUE);
  412.                     this.prepareInsertAudit(invoiceItemDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  413.                     this.prepareUpdateAudit(invoiceItemDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  414.  
  415.                     calcNettAmount = calcNettAmount.add(invoiceItemDto.getDouble("refItemAmount"));
  416.  
  417.                     poBalanceInvoiceDto.put("flgInvoice", PurchasingConstants.IN_PROGRESS_TRANSACTION);
  418.                     this.prepareUpdateAudit(poBalanceInvoiceDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  419.  
  420.                     Dto paramPoBalanceInvoiceTax = new Dto();
  421.                     paramPoBalanceInvoiceTax.put("tenantId", inputDto.getLong("tenantLoginId"));
  422.                     paramPoBalanceInvoiceTax.put("ouId", purchaseOrderDto.getLong("ouId"));
  423.                     paramPoBalanceInvoiceTax.put("poId", purchaseOrderDto.getLong("id"));
  424.                     paramPoBalanceInvoiceTax.put("refDocTypeId", PurchasingConstants.DOCUMENT_RECEIVE_GOODS);
  425.                     paramPoBalanceInvoiceTax.put("refId", invoiceItemDto.getLong("refId"));
  426.                     paramPoBalanceInvoiceTax.put("refItemId", invoiceItemDto.getLong("refItemId"));
  427.                     Dto poBalanceInvoiceTaxListDto = getPurchaseOrderBalanceInvoiceTaxListByReceiveGoodsItem.execute(paramPoBalanceInvoiceTax);
  428.                    
  429.                     List<Dto> poBalanceInvoiceTaxList = poBalanceInvoiceTaxListDto.getList("purchaseOrderBalanceInvoiceTaxList");
  430.  
  431.  
  432.                     log.debug("============================== ini poBalanceInvoiceTaxList " + poBalanceInvoiceTaxList);
  433.                     if (poBalanceInvoiceTaxList != null && !poBalanceInvoiceTaxList.isEmpty()) { // TODO
  434.                         for (Dto poBalanceInvoiceTaxDto : poBalanceInvoiceTaxList) {
  435.                             Dto invoiceTaxDto = new Dto();
  436.                            
  437. //                          invoice tax akan di ambil dari nilai nett amount yang sudah di kurangi diskon, bukan dari per item lagi
  438. //                          By : Sarah
  439.                            
  440.                             if (mapInvoiceTax.containsKey(poBalanceInvoiceTaxDto.get("taxId").toString())) {
  441.                                 invoiceTaxDto = (Dto)mapInvoiceTax.get(poBalanceInvoiceTaxDto.get("taxId").toString());
  442.                                
  443.                                 invoiceTaxDto.put("baseAmount",
  444.                                         new Calc(invoiceTaxDto.getDouble("baseAmount")).add(poBalanceInvoiceTaxDto.getDouble("baseAmount")).doubleValue());
  445.                                 invoiceTaxDto.put("taxAmount",
  446.                                         new Calc(invoiceTaxDto.getDouble("taxAmount")).add(poBalanceInvoiceTaxDto.getDouble("taxAmount")).doubleValue());
  447.                                 log.debug("============================== invoiceTaxDto.getDouble(\"taxAmount\") " + invoiceTaxDto.getDouble("taxAmount"));
  448.  
  449.                             } else {
  450.                                 invoiceTaxDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  451.                                 invoiceTaxDto.put("taxId", Long.valueOf(poBalanceInvoiceTaxDto.get("taxId").toString()));
  452.                                 invoiceTaxDto.put("flgAmount", poBalanceInvoiceTaxDto.get("flgAmount").toString());
  453.                                 invoiceTaxDto.put("taxPercentage", Double.valueOf(poBalanceInvoiceTaxDto.get("taxPercentage").toString()));
  454.                                 invoiceTaxDto.put("taxCurrCode", currCodeGov); // WTC, 20141115, fix bug, seharusnya diisi dengan valuta resmi
  455.                                 invoiceTaxDto.put("taxNo", GeneralConstants.EMPTY_VALUE);
  456.                                 invoiceTaxDto.put("taxDate", GeneralConstants.EMPTY_VALUE);
  457.                                 invoiceTaxDto.put("govTaxAmount", new Double(0));
  458.                                 invoiceTaxDto.put("baseAmount", poBalanceInvoiceTaxDto.getDouble("baseAmount"));
  459.                                 invoiceTaxDto.put("advanceAmount", 0d);
  460.                                 invoiceTaxDto.put("taxAmount", poBalanceInvoiceTaxDto.getDouble("taxAmount"));
  461.                             }
  462.  
  463.                             mapInvoiceTax.put(poBalanceInvoiceTaxDto.get("taxId").toString(), invoiceTaxDto);
  464.                            
  465.                             poBalanceInvoiceTaxDto.put("flgInvoice", PurchasingConstants.IN_PROGRESS_TRANSACTION);
  466.                             if (!resultPoBalanceInvoiceTaxList.contains(poBalanceInvoiceTaxDto)) {
  467.                                 resultPoBalanceInvoiceTaxList.add(poBalanceInvoiceTaxDto);
  468.                             }
  469.                         }
  470.                     }
  471.  
  472.                     resultInvoiceItemList.add(invoiceItemDto);
  473.                     resultPoBalanceInvoiceList.add(poBalanceInvoiceDto);
  474.                 } catch (CoreException e) {
  475.                     invoiceItemDto.put("errorKey", e.getErrorKey());
  476.  
  477.                     List<Object> argsList = new ArrayList<Object>();
  478.                     if (e.getParamValues() != null && e.getParamValues().length > 0) {
  479.                         for (Object paramValue : e.getParamValues()) {
  480.                             argsList.add(paramValue);
  481.                         }
  482.                     }
  483.                     invoiceItemDto.put("args", argsList);
  484.  
  485.                     failList.add(invoiceItemDto);
  486.                 }
  487.             }
  488.         }
  489.  
  490.         // check so balance advance invoice
  491.         Dto outputIsPoBalanceAdvanceInvoiceExistsByPurchaseOrderDto = isPoBalanceAdvanceInvoiceExistsByPurchaseOrder.execute(new Dto()
  492.                 .put("poId", inputDto.get("refId")));
  493.        
  494.         log.debug("outputIsPoBalanceAdvanceInvoiceExistsByPurchaseOrderDto : "+outputIsPoBalanceAdvanceInvoiceExistsByPurchaseOrderDto);
  495.        
  496.         Dto poBalanceAdvanceInvoiceDto = new Dto();
  497.         boolean isAddInvoiceAdvance = false;
  498.         Dto invoiceAdvanceDto = new Dto();
  499.         Double advanceAmount = 0d;
  500.         if(outputIsPoBalanceAdvanceInvoiceExistsByPurchaseOrderDto.getBoolean("exists")){
  501.             isAddInvoiceAdvance = true;
  502.            
  503.             poBalanceAdvanceInvoiceDto = outputIsPoBalanceAdvanceInvoiceExistsByPurchaseOrderDto.getDto("poBalanceAdvanceInvoiceDto");
  504.             advanceAmount = poBalanceAdvanceInvoiceDto.getDouble("advanceAmount");
  505.             Long invoiceAdvanceLastLineNo = 1L;
  506.            
  507.             invoiceAdvanceDto.put("tenantId", inputDto.get("tenantLoginId"));
  508.             invoiceAdvanceDto.put("invoiceId", GeneralConstants.NULL_REF_VALUE_LONG);
  509.             invoiceAdvanceDto.put("lineNo", invoiceAdvanceLastLineNo);
  510.             invoiceAdvanceDto.put("refDocTypeId", poBalanceAdvanceInvoiceDto.get("refDocTypeId"));
  511.             invoiceAdvanceDto.put("refId", poBalanceAdvanceInvoiceDto.get("refId"));
  512.             invoiceAdvanceDto.put("advanceCurrCode", poBalanceAdvanceInvoiceDto.get("advanceCurrCode"));
  513.             invoiceAdvanceDto.put("advanceAmount", advanceAmount);
  514.             invoiceAdvanceDto.put("allocAmount", advanceAmount);
  515.             invoiceAdvanceDto.put("remark", GeneralConstants.EMPTY_VALUE);
  516.            
  517.             this.prepareInsertAudit(invoiceAdvanceDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  518.             this.prepareUpdateAudit(invoiceAdvanceDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  519.            
  520.             // update SoBalanceAdvanceInvoiceList
  521.             poBalanceAdvanceInvoiceDto.put("flgInvoice", PurchasingConstants.IN_PROGRESS_TRANSACTION);
  522.             poBalanceAdvanceInvoiceDto.put("invoiceId", GeneralConstants.NULL_REF_VALUE_LONG);
  523.             this.prepareUpdateAudit(poBalanceAdvanceInvoiceDto, inputDto.getLong("userLoginId"), inputDto.getString("datetime"));
  524.            
  525.             // Update ke invoice tax, jika taxId <> -99
  526.             if (!GeneralConstants.NULL_REF_VALUE_LONG.equals(poBalanceAdvanceInvoiceDto.getLong("taxId"))) {
  527.                 Dto taxDto = (Dto)mapInvoiceTax.get(poBalanceAdvanceInvoiceDto.getLong("taxId").toString());
  528.                 taxDto.put("advanceAmount", new Calc(taxDto.getDouble("advanceAmount")).add(advanceAmount).doubleValue());
  529.                
  530.                 log.debug("tax after add advance amount : "+taxDto);
  531.             }
  532.         }
  533.  
  534.         calcNettAmount = calcNettAmount.subtract(addAmount); // total item - diskon
  535.        
  536.         Iterator iter = mapInvoiceTax.entrySet().iterator();
  537.         while (iter.hasNext()) {
  538.             Entry entry = (Entry)iter.next();
  539.             Dto invoiceTaxDto = (Dto)entry.getValue();
  540. //          Double baseAmount = invoiceTaxDto.getDouble("baseAmount");
  541.             Double taxAdvanceAmount = invoiceTaxDto.getDouble("advanceAmount");
  542.             Double taxPercentage = invoiceTaxDto.getDouble("taxPercentage");
  543.             log.debug("taxAdvanceAmount : " + taxAdvanceAmount);
  544.            
  545.             // karena mapInvoiceTax ini datanya selalu 1, maka dapat di lakukan seperti ini
  546.             // base amount nya langsung di ambil dari total item - diskon, bukan total item lagi.
  547.             invoiceTaxDto.put("baseAmount", calcNettAmount.getValue());
  548.             invoiceTaxDto.put("taxAmount", new Calc(calcNettAmount.subtract(taxAdvanceAmount).getValue())
  549.                                             .multiply(taxPercentage).divide(100, scaleTax, roundingModeTax).doubleValue());
  550.             invoiceTaxDto.put("taxDate", inputDto.getString("docDate"));
  551.            
  552.             calcTaxAmount = calcTaxAmount.add(invoiceTaxDto.getDouble("taxAmount"));
  553.            
  554.             if (inputDto.get("currCode").equals(currCodeGov)) {
  555.                 // Hans 22 Apr 2016, No need to calculate, since it has the same currency code
  556.                 invoiceTaxDto.put("govTaxAmount", invoiceTaxDto.getDouble("taxAmount"));                                       
  557.                                                        
  558.             } else {
  559.                
  560.                 Dto inputCurrExcRateDto = new Dto();
  561.                 inputCurrExcRateDto.put("tenantId", inputDto.get("tenantLoginId"));
  562.                 inputCurrExcRateDto.put("date", invoiceTaxDto.get("taxDate"));
  563.                 inputCurrExcRateDto.put("currencyCodeFrom", inputDto.get("currCode"));
  564.                 inputCurrExcRateDto.put("type", MasterConstants.EXCHANGE_RATE_TYPE_TAX);
  565.                
  566.                 Dto outputCurrExcRateDto = findExchangeRateByDate.execute(inputCurrExcRateDto);
  567.                
  568.                 String amountTo = outputCurrExcRateDto.getString("amountTo");
  569.                 String amountFrom = outputCurrExcRateDto.getString("amountFrom");
  570.                
  571.                 // Calculate using exchange rate
  572.                 invoiceTaxDto.put("govTaxAmount", calcNettAmount.subtract(taxAdvanceAmount).multiply(Double.valueOf(amountTo))
  573.                 .divide(Double.valueOf(amountFrom)).multiply(taxPercentage).divide(100, scaleTax, roundingModeTax).doubleValue());
  574.             }
  575.         }
  576.        
  577.         if (!failList.isEmpty()) {
  578.             Dto errorParamDto = new Dto();
  579.             DtoUtil.putInErrorParamDto(errorParamDto, "failList",
  580.                     new String[] {"lineNo", "refItemId", "errorKey", "args"}, failList);
  581.             throw new CoreException(PurchasingExceptionConstants.INVOICE_ITEMS_ERROR, errorParamDto);
  582.         }
  583.  
  584.         inputDto.put("resultCost", gridCostList);
  585.         inputDto.put("grossAmount", calcNettAmount.add(calcTaxAmount).doubleValue()); // ini nettItem(sudah di kurangkan diskon) + tax
  586.         inputDto.put("advanceAmount", advanceAmount);
  587.         inputDto.put("taxAmount", calcTaxAmount.doubleValue());
  588.         inputDto.put("totalAmount", calcNettAmount.subtract(advanceAmount).doubleValue());
  589.  
  590.         inputDto.put("mapInvoiceTax", mapInvoiceTax);
  591.         inputDto.put("resultInvoiceItemList", resultInvoiceItemList);
  592.         inputDto.put("resultPoBalanceInvoiceList", resultPoBalanceInvoiceList);
  593.         inputDto.put("resultPoBalanceInvoiceTaxList", resultPoBalanceInvoiceTaxList);
  594.  
  595.         inputDto.put("isAddInvoiceAdvance", isAddInvoiceAdvance);
  596.         inputDto.put("invoiceAdvanceDto", invoiceAdvanceDto);
  597.         inputDto.put("poBalanceAdvanceInvoiceDto", poBalanceAdvanceInvoiceDto);
  598.  
  599.         log.debug("============================== return inputDto " + inputDto);
  600.         return null;
  601.     }
  602.  
  603.     @SuppressWarnings({"unchecked", "rawtypes"})
  604.     @Override
  605.     public Dto process(Dto inputDto, Dto originalDto) throws Exception {
  606.         Invoice invoice = GsonUtil.fromDto(inputDto, Invoice.class);
  607.         invoiceDao.persist(invoice);
  608.  
  609.         List<Dto> resultInvoiceItemList = inputDto.getList("resultInvoiceItemList");
  610.         List<Dto> successListDto = new ArrayList<Dto>();
  611.         for (Dto invoiceItemDto : resultInvoiceItemList) {
  612.             invoiceItemDto.put("invoiceId", invoice.getId());
  613.             InvoiceItem invoiceItem = GsonUtil.fromDto(invoiceItemDto, InvoiceItem.class);
  614.             invoiceItemDao.persist(invoiceItem);
  615.  
  616.             Dto successDto = new Dto(invoiceItem);
  617.             successListDto.add(successDto);
  618.         }
  619.  
  620.        
  621.         Dto mapInvoiceTax = inputDto.getDto("mapInvoiceTax");
  622.         Iterator iter = mapInvoiceTax.entrySet().iterator();
  623.         while (iter.hasNext()) {
  624.             Entry entry = (Entry)iter.next();
  625.             Dto invoiceTaxDto = (Dto)entry.getValue();
  626.             //Hans, 11 Apr 2016 tambah validasi jika tax amount 0 tidak perlu buat invoice taxnya
  627.             if(!invoiceTaxDto.getDouble("taxAmount").equals(new Double(0))){
  628.                 invoiceTaxDto.put("invoiceId", invoice.getId());
  629.                 InvoiceTax invoiceTax = GsonUtil.fromDto(invoiceTaxDto, InvoiceTax.class);
  630.                 invoiceTaxDao.persist(invoiceTax);
  631.             }
  632.         }
  633.  
  634.         List<Dto> resultPoBalanceInvoiceList = inputDto.getList("resultPoBalanceInvoiceList");
  635.         for (Dto poBalanceInvoiceDto : resultPoBalanceInvoiceList) {
  636.             poBalanceInvoiceDto.put("invoiceId", invoice.getId());
  637.             PurchaseOrderBalanceInvoice poBalanceInvoice = GsonUtil.fromDto(poBalanceInvoiceDto, PurchaseOrderBalanceInvoice.class);
  638.             poBalanceInvoice = purchaseOrderBalanceInvoiceDao.merge(poBalanceInvoiceDto.getLong("id"), poBalanceInvoice);
  639.         }
  640.  
  641.         List<Dto> resultPoBalanceInvoiceTaxList = inputDto.getList("resultPoBalanceInvoiceTaxList");
  642.         for (Dto poBalanceInvoiceTaxDto : resultPoBalanceInvoiceTaxList) {
  643.             poBalanceInvoiceTaxDto.put("invoiceId", invoice.getId());
  644.             PurchaseOrderBalanceInvoiceTax poBalanceInvoiceTax = GsonUtil.fromDto(poBalanceInvoiceTaxDto, PurchaseOrderBalanceInvoiceTax.class);
  645.             poBalanceInvoiceTax = purchaseOrderBalanceInvoiceTaxDao.merge(poBalanceInvoiceTaxDto.getLong("id"), poBalanceInvoiceTax);
  646.         }
  647.        
  648.         log.info("inputDto.getBoolean(\"isAddInvoiceAdvance\") : "+inputDto.getBoolean("isAddInvoiceAdvance"));
  649.         if(inputDto.getBoolean("isAddInvoiceAdvance")){
  650.             Dto invoiceAdvanceDto = inputDto.getDto("invoiceAdvanceDto");
  651.             invoiceAdvanceDto.put("invoiceId", invoice.getId());
  652.             InvoiceAdvance invoiceAdvance = GsonUtil.fromDto(invoiceAdvanceDto, InvoiceAdvance.class);
  653.             invoiceAdvanceDao.persist(invoiceAdvance);
  654.             log.debug("inserted invoice advance : "+new Dto(invoiceAdvance));
  655.            
  656.             // update so balance
  657.             Dto poBalanceAdvanceInvoiceDto = inputDto.getDto("poBalanceAdvanceInvoiceDto");
  658.             poBalanceAdvanceInvoiceDto.put("invoiceId", invoice.getId());
  659.             PoBalanceAdvanceInvoice poBalanceAdvanceInvoice = GsonUtil.fromDto(poBalanceAdvanceInvoiceDto, PoBalanceAdvanceInvoice.class);
  660.             poBalanceAdvanceInvoice = poBalanceAdvanceInvoiceDao.merge(poBalanceAdvanceInvoice.getId(), poBalanceAdvanceInvoice);
  661.             log.debug("poBalanceAdvanceInvoice : "+new Dto(poBalanceAdvanceInvoice));
  662.         }
  663.        
  664.         // insert invoice cost from Dto
  665.         List<Dto> invoiceCostList = inputDto.getList("resultCost");
  666.         if(invoiceCostList != null){
  667.             for(Dto invoiceCostDto : invoiceCostList){
  668.                 invoiceCostDto.put("invoiceId", invoice.getId());
  669.                 InvoiceCost invoiceCost = GsonUtil.fromDto(invoiceCostDto, InvoiceCost.class);
  670.                 invoiceCostDao.persist(invoiceCost);           
  671.             }
  672.         }
  673.        
  674.         // update current amount hasil akhir nya di kurang add amount dari cost
  675.         Dto balanceDiscountDto = inputDto.getDto("balanceDiscountDto");
  676.         if(balanceDiscountDto != null){
  677.             PoBalanceDiscount poBalanceDiscount = GsonUtil.fromDto(balanceDiscountDto, PoBalanceDiscount.class);
  678.             poBalanceDiscountDao.merge(poBalanceDiscount.getId(), poBalanceDiscount);
  679.         }
  680.        
  681.  
  682.  
  683.         return  new Dto(invoice);
  684.     }
  685. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement