Advertisement
aadddrr

AddPurchaseOrderForCland

May 25th, 2018
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 62.63 KB | None | 0 0
  1. /**
  2.  *  
  3.  */
  4. package org.jleaf.erp.purch.bo.po;
  5.  
  6. import java.util.ArrayList;
  7. import java.util.HashSet;
  8. import java.util.List;
  9. import java.util.Set;
  10.  
  11. import javax.persistence.Query;
  12.  
  13. import org.apache.commons.validator.GenericValidator;
  14. import org.jleaf.common.ComboIdConstants;
  15. import org.jleaf.common.CommonExceptionConstants;
  16. import org.jleaf.core.BusinessFunction;
  17. import org.jleaf.core.BusinessTransaction;
  18. import org.jleaf.core.CoreException;
  19. import org.jleaf.core.DefaultBusinessTransaction;
  20. import org.jleaf.core.Dto;
  21. import org.jleaf.core.GeneralConstants;
  22. import org.jleaf.core.annotation.ErrorList;
  23. import org.jleaf.core.annotation.Info;
  24. import org.jleaf.core.annotation.InfoIn;
  25. import org.jleaf.core.annotation.InfoOut;
  26. import org.jleaf.core.dao.QueryBuilder;
  27. import org.jleaf.erp.master.MasterConstants;
  28. import org.jleaf.erp.master.MasterExceptionConstants;
  29. import org.jleaf.erp.master.bo.ComboIdMasterConstants;
  30. import org.jleaf.erp.purch.PurchasingConstants;
  31. import org.jleaf.erp.purch.PurchasingExceptionConstants;
  32. import org.jleaf.erp.purch.dao.PurchaseOrderCodDao;
  33. import org.jleaf.erp.purch.dao.PurchaseOrderDao;
  34. import org.jleaf.erp.purch.dao.PurchaseOrderExtDao;
  35. import org.jleaf.erp.purch.dao.PurchaseOrderItemDao;
  36. import org.jleaf.erp.purch.dao.PurchaseOrderLogisticDao;
  37. import org.jleaf.erp.purch.entity.PurchaseOrder;
  38. import org.jleaf.erp.purch.entity.PurchaseOrderCod;
  39. import org.jleaf.erp.purch.entity.PurchaseOrderExt;
  40. import org.jleaf.erp.purch.entity.PurchaseOrderItem;
  41. import org.jleaf.erp.purch.entity.PurchaseOrderLogistic;
  42. import org.jleaf.util.Calc;
  43. import org.jleaf.util.DtoUtil;
  44. import org.jleaf.util.GsonUtil;
  45. import org.jleaf.util.ValidationUtil;
  46. import org.jleaf.validator.CommonBusinessValidator;
  47. import org.slf4j.Logger;
  48. import org.slf4j.LoggerFactory;
  49. import org.springframework.beans.factory.annotation.Autowired;
  50. import org.springframework.beans.factory.annotation.Qualifier;
  51. import org.springframework.stereotype.Service;
  52.  
  53. /**
  54.  * Add purchase order
  55.  *
  56.  * @author david 13 Sep 2012 modified by fredi <br />
  57.  *         <ul>
  58.  *         <li>add input partnerShipAddressId, partnerShipCpId
  59.  *         purchaseOrderCodList, purchaseOrderItemList</li>
  60.  *         <li>remove validation extDocDate and extDocNo</li>
  61.  *         <li>etc</li>
  62.  *         </ul>
  63.  * @see http://jleaf.org:8181/browse/PURSVC-25
  64.  */
  65. // @formatter:off
  66. @Service("addPurchaseOrder")
  67. @InfoIn(value = {
  68.         @Info(name = "docNo", description = "Nomor Transaksi", type = String.class),
  69.         @Info(name = "docDate", description = "Tanggal Transaksi", type = String.class),
  70.         @Info(name = "ouId", description = "Organisasi Unit id", type = Long.class),
  71.         @Info(name = "extDocNo", description = "external document no", type = String.class),
  72.         @Info(name = "extDocDate", description = "external document date", type = String.class),
  73.         @Info(name = "remark", description = "remark", type = String.class),
  74.         @Info(name = "partnerId", description = "partner / supplier id", type = Long.class),
  75.         @Info(name = "purchaserId", description = "purchase officer id", type = Long.class),
  76.         @Info(name = "warehouseId", description = "received warehouse id", type = Long.class),
  77.         @Info(name = "refDocTypeId", description = "ref doc type id", type = Long.class),
  78.         @Info(name = "refId", description = "ref id", type = Long.class),
  79.         @Info(name = "flgDelivery", description = "flag delivery (pick up or deliver)", type = String.class),
  80.         @Info(name = "currCode", description = "currency code", type = String.class),
  81.         @Info(name = "topCode", description = "term of payment code", type = String.class),
  82.         @Info(name = "flgBuyConsignment", description = "flag buy consignment (yes or no)", type = String.class),
  83.         @Info(name = "purchaseOrderItemList", description = "list of purchase order item (refId, lineNo, productId, productName, flgStock, grossPricePo, flgTaxAmount, taxId, taxName, qtyPo, poUomId, poUomName, qtyInt, activityGlId, activityGlName, ouRcId, ouRcName, segmentId, eta, etaDay, flgIndent, toleranceRcvQty, discountPercentage)", type = List.class),
  84.         @Info(name = "partnerShipAddressId", description = "Partner Ship Address id", type = Long.class),
  85.         @Info(name = "partnerShipCpId", description = "Partner Ship CP id", type = Long.class),
  86.         @Info(name = "purchaseOrderCodList", description = "list of purchase order cod (flgCollection, dueDate, currCode, amount, trxCurrCode, trxAmount, remark)", type = List.class),
  87.  
  88.         @Info(name = "tenantLoginId", description = "tenant login id", type = Long.class),
  89.         @Info(name = "userLoginId", description = "user login id", type = Long.class),
  90.         @Info(name = "roleLoginId", description = "role login id", type = Long.class),
  91.         @Info(name = "datetime", description = "datetime", type = String.class) })
  92. @InfoOut(value = {
  93.         @Info(name = "id", description = "po id", type = Long.class),
  94.         @Info(name = "docNo", description = "Nomor Transaksi", type = String.class),
  95.         @Info(name = "docDate", description = "Tanggal Transaksi", type = String.class),
  96.         @Info(name = "ouId", description = "Organisasi Unit id", type = Long.class),
  97.         @Info(name = "extDocNo", description = "external document no", type = String.class),
  98.         @Info(name = "extDocDate", description = "external document date", type = String.class),
  99.         @Info(name = "remark", description = "remark", type = String.class),
  100.         @Info(name = "partnerId", description = "partner / supplier id", type = Long.class),
  101.         @Info(name = "purchaserId", description = "purchase officer id", type = Long.class),
  102.         @Info(name = "warehouseId", description = "received warehouse id", type = Long.class),
  103.         @Info(name = "flgDelivery", description = "flag delivery (pick up or deliver)", type = String.class),
  104.         @Info(name = "currCode", description = "currency code", type = String.class),
  105.         @Info(name = "topCode", description = "term of payment code", type = String.class),
  106.         @Info(name = "version", description = "version", type = Long.class) })
  107. @ErrorList(errorKeys = { CommonExceptionConstants.TENANT_LOGIN_CANT_USED,
  108.         CommonExceptionConstants.OU_ID_NOT_FOUND,
  109.         CommonExceptionConstants.OUTYPE_ID_NOT_FOUND,
  110.         CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  111.         CommonExceptionConstants.COMBO_VALUE_NOT_VALID,
  112.         CommonExceptionConstants.DATA_CANT_CHANGE_CAUSE_TENANT,
  113.         MasterExceptionConstants.PURCHASE_OFFICER_ID_NOT_FOUND,
  114.         MasterExceptionConstants.WAREHOUSE_ID_NOT_FOUND,
  115.         MasterExceptionConstants.WAREHOUSE_NOT_BELONG_TO_OU,
  116.         MasterExceptionConstants.PARTNER_ID_NOT_FOUND,
  117.         MasterExceptionConstants.DATA_NOT_ACTIVE,
  118.         MasterExceptionConstants.WAREHOUSE_ID_NOT_FOUND,
  119.         MasterExceptionConstants.ACTIVITY_DOCUMENT_NOT_FOUND,
  120.         MasterExceptionConstants.PRODUCT_ID_NOT_FOUND,
  121.         MasterExceptionConstants.UOM_ID_NOT_FOUND,
  122.         MasterExceptionConstants.GROUP_PRODUCT_ID_NOT_FOUND,
  123.         MasterExceptionConstants.CATEGORY_PRODUCT_ID_NOT_FOUND,
  124.         MasterExceptionConstants.ACTIVITY_ID_NOT_FOUND,
  125.         MasterExceptionConstants.COA_ID_NOT_FOUND,
  126.         MasterExceptionConstants.GROUP_COA_ID_NOT_FOUND,
  127.         MasterExceptionConstants.PRODUCT_NOT_AUTHORIZED_IN_WAREHOUSE,
  128.         PurchasingExceptionConstants.PURCHASE_ORDER_ID_NOT_FOUND,
  129.         PurchasingExceptionConstants.ACTIVITY_GL_PO_ITEM_NOT_COUNT_STOCK,
  130.         PurchasingExceptionConstants.PURCHASE_ORDER_ITEM_PRICE_INCLUDE_TAX,
  131.         PurchasingExceptionConstants.OU_RC_MUST_BE_FILLED,
  132.         PurchasingExceptionConstants.PARTNER_NOT_AUTHORIZED_AS_SUPPLIER,
  133.         PurchasingExceptionConstants.PURCHASE_ORDER_ITEMS_ERROR })
  134. // @formatter:on
  135. public class AddPurchaseOrderForCland extends DefaultBusinessTransaction
  136.         implements BusinessTransaction {
  137.  
  138.     private static final Logger log = LoggerFactory
  139.             .getLogger(AddPurchaseOrderForCland.class);
  140.  
  141.     @Autowired
  142.     PurchaseOrderDao purchaseOrderDao;
  143.  
  144.     @Autowired
  145.     PurchaseOrderExtDao purchaseOrderExtDao;
  146.  
  147.     @Autowired
  148.     PurchaseOrderItemDao purchaseOrderItemDao;
  149.  
  150.     @Autowired
  151.     PurchaseOrderLogisticDao purchaseOrderLogisticDao;
  152.  
  153.     @Autowired
  154.     PurchaseOrderCodDao purchaseOrderCodDao;
  155.  
  156.     @Autowired
  157.     @Qualifier("findPurchaseOrderById")
  158.     BusinessFunction findPurchaseOrderById;
  159.  
  160.     @Autowired
  161.     @Qualifier("valTenantLoginCanUse")
  162.     BusinessFunction valTenantLoginCanUse;
  163.  
  164.     @Autowired
  165.     @Qualifier("valComboValueByCode")
  166.     BusinessFunction valComboValueByCode;
  167.  
  168.     @Autowired
  169.     @Qualifier("findOUById")
  170.     BusinessFunction findOUById;
  171.  
  172.     @Autowired
  173.     @Qualifier("findPartnerById")
  174.     BusinessFunction findPartnerById;
  175.  
  176.     @Autowired
  177.     @Qualifier("findPurchaseOfficerById")
  178.     BusinessFunction findPurchaseOfficerById;
  179.  
  180.     @Autowired
  181.     @Qualifier("findWarehouseById")
  182.     BusinessFunction findWarehouseById;
  183.  
  184.     @Autowired
  185.     @Qualifier("findCtgrProductById")
  186.     BusinessFunction findCtgrProductById;
  187.  
  188.     @Autowired
  189.     @Qualifier("findProductById")
  190.     BusinessFunction findProductById;
  191.  
  192.     @Autowired
  193.     @Qualifier("isPurchaseOrderExistsByIndex")
  194.     BusinessFunction isPurchaseOrderExistsByIndex;
  195.  
  196.     @Autowired
  197.     @Qualifier("findGroupProductById")
  198.     BusinessFunction findGroupProductById;
  199.  
  200.     @Autowired
  201.     @Qualifier("findActivityDocumentById")
  202.     BusinessFunction findActivityDocumentById;
  203.  
  204.     @Autowired
  205.     @Qualifier("findUomById")
  206.     BusinessFunction findUomById;
  207.  
  208.     @Autowired
  209.     @Qualifier("findTaxById")
  210.     BusinessFunction findTaxById;
  211.  
  212.     @Autowired
  213.     @Qualifier("valOUAsSubAccounting")
  214.     BusinessFunction valOUAsSubAccounting;
  215.  
  216.     @Autowired
  217.     @Qualifier("valAuthorizedPolicyPartner")
  218.     BusinessFunction valAuthorizedPolicyPartner;
  219.  
  220.     @Autowired
  221.     @Qualifier("valAuthorizedPolicyWarehouse")
  222.     BusinessFunction valAuthorizedPolicyWarehouse;
  223.  
  224.     @Autowired
  225.     @Qualifier("valAuthorizedPolicyProduct")
  226.     BusinessFunction valAuthorizedPolicyProduct;
  227.  
  228.     @Autowired
  229.     @Qualifier("valAuthorizedPolicyActivity")
  230.     BusinessFunction valAuthorizedPolicyActivity;
  231.  
  232.     @Autowired
  233.     @Qualifier("isItemWarehouseExistsByIndex")
  234.     BusinessFunction isItemWarehouseExistsByIndex;
  235.  
  236.     @Autowired
  237.     @Qualifier("findActivityById")
  238.     BusinessFunction findActivityById;
  239.  
  240.     @Autowired
  241.     @Qualifier("findCoaById")
  242.     BusinessFunction findCoaById;
  243.  
  244.     @Autowired
  245.     @Qualifier("findGroupCoaById")
  246.     BusinessFunction findGroupCoaById;
  247.  
  248.     @Autowired
  249.     @Qualifier("isPartnerTypeExistsByIndex")
  250.     BusinessFunction isPartnerTypeExistsByIndex;
  251.  
  252.     @Autowired
  253.     @Qualifier("valOUAsMainBusinessUnit")
  254.     BusinessFunction valOUAsMainBusinessUnit;
  255.  
  256.     @Autowired
  257.     @Qualifier("valWarehouseExistsInOu")
  258.     BusinessFunction valWarehouseExistsInOu;
  259.  
  260.     @Autowired
  261.     @Qualifier("valAuthorizedPolicyOU")
  262.     BusinessFunction valAuthorizedPolicyOU;
  263.  
  264.     @Autowired
  265.     @Qualifier("valProductCanOnlyInOnePoConsignmentManual")
  266.     BusinessFunction valProductCanOnlyInOnePoConsignmentManual;
  267.    
  268.     @Autowired
  269.     @Qualifier("getDigitDecimalCurrencyByDocType")
  270.     BusinessFunction getDigitDecimalCurrencyByDocType;
  271.  
  272.     @Autowired
  273.     @Qualifier("calculateAmountFromGrossPrice")
  274.     BusinessFunction calculateAmountFromGrossPrice;
  275.  
  276.     @Autowired
  277.     @Qualifier("getRoundingParameter")
  278.     BusinessFunction getRoundingParameter;
  279.  
  280.     @Autowired
  281.     @Qualifier("findSegmentCoaById")
  282.     BusinessFunction findSegmentCoaById;
  283.  
  284.     @Autowired
  285.     @Qualifier("findSalesOrderByIdForRefPo")
  286.     BusinessFunction findSalesOrderByIdForRefPo;
  287.  
  288.     @Autowired
  289.     @Qualifier("findSalesOrderItemByLineNoForPo")
  290.     BusinessFunction findSalesOrderItemByLineNoForPo;
  291.  
  292.     @Autowired
  293.     @Qualifier("findPartnerAddressById")
  294.     BusinessFunction findPartnerAddressById;
  295.  
  296.     @Autowired
  297.     @Qualifier("findPartnerCpById")
  298.     BusinessFunction findPartnerCpById;
  299.  
  300.     @Autowired
  301.     @Qualifier("isOULegalExistsByIndex")
  302.     BusinessFunction isOULegalExistsByIndex;
  303.  
  304.     @Autowired
  305.     @Qualifier("findSoPoBalanceItemByIdForPo")
  306.     BusinessFunction findSoPoBalanceItemByIdForPo;
  307.  
  308.     @Autowired
  309.     @Qualifier("findSalesOrderItemByIdForPo")
  310.     BusinessFunction findSalesOrderItemByIdForPo;
  311.  
  312.     @Autowired
  313.     @Qualifier("valNoProductConsignmentItemDuplicate")
  314.     BusinessFunction valNoProductConsignmentItemDuplicate;
  315.  
  316.     private static List<String> flgCollectionList = new ArrayList<String>() {
  317.         private static final long serialVersionUID = 591510409496989395L;
  318.         {
  319.             add(PurchasingConstants.FLG_COLLECTION_CHANGE);
  320.             add(PurchasingConstants.FLG_COLLECTION_PAYMENT);
  321.         }
  322.     };
  323.  
  324.     public String getDescription() {
  325.         return "Add purchase order";
  326.     }
  327.  
  328.     @SuppressWarnings("unchecked")
  329.     @Override
  330.     public Dto prepare(Dto inputDto, Dto originalDto) throws Exception {
  331.         log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>> Awas kalo ini aja ga muncul preparenyaaaaaaaaaaaaaaaaa <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
  332.        
  333.         log.debug("hasil inputdto : "+inputDto);
  334.         ValidationUtil.valDtoContainsKey(inputDto, "tenantLoginId");
  335.         ValidationUtil.valDtoContainsKey(inputDto, "roleLoginId");
  336.         ValidationUtil.valDtoContainsKey(inputDto, "userLoginId");
  337.         ValidationUtil.valBlankOrNull(inputDto, "datetime");
  338.  
  339.         String datetime = inputDto.getString("datetime");
  340.         String date = datetime.substring(0, 8);
  341.         String flgBuyConsignment = inputDto.getString("flgBuyConsignment");
  342.  
  343.         Set<String> tempPoItemList = new HashSet<String>();
  344.         Dto inputDtoForRoundingParameter = new Dto();
  345.         inputDtoForRoundingParameter.put("tenantId",
  346.                 inputDto.getLong("tenantLoginId"));
  347.         Dto resultDtoForRoundingParameter = getRoundingParameter
  348.                 .execute(inputDtoForRoundingParameter);
  349.  
  350.         // int scaleNonTax =
  351.         // resultDtoForRoundingParameter.getInteger("scaleNonTax");
  352.         int roundingModeNonTax = resultDtoForRoundingParameter
  353.                 .getInteger("roundingModeNonTax");
  354.         int scaleTax = resultDtoForRoundingParameter.getInteger("scaleTax");
  355.         int roundingModeTax = resultDtoForRoundingParameter
  356.                 .getInteger("roundingModeTax");
  357.  
  358.         // Validation tenant login id can be use
  359.         Dto loginDto = new Dto();
  360.         loginDto.put("tenantLoginId", inputDto.getLong("tenantLoginId"));
  361.         loginDto.put("userLoginId", inputDto.getLong("userLoginId"));
  362.         loginDto.put("roleLoginId", inputDto.getLong("roleLoginId"));
  363.         valTenantLoginCanUse.execute(loginDto);
  364.  
  365.         this.prepareInsertAudit(inputDto, inputDto.getLong("userLoginId"),
  366.                 inputDto.getString("datetime"));
  367.         this.prepareUpdateAudit(inputDto, inputDto.getLong("userLoginId"),
  368.                 inputDto.getString("datetime"));
  369.  
  370.         // Validation tidak boleh kosong / null / tanggal / etc
  371.         ValidationUtil.valBlankOrNull(inputDto.getString("docNo"),
  372.                 "Document No");
  373.         ValidationUtil.valBlankOrNull(inputDto.getString("docDate"),
  374.                 "Document Date");
  375.         // remove validation not blank extDocNo and extDocDate
  376.         // ValidationUtil.valBlankOrNull(inputDto.getString("extDocDate"),
  377.         // "Ext Document Date");
  378.         // ValidationUtil.valBlankOrNull(inputDto.getString("extDocNo"),
  379.         // "Ext Document No");
  380.         ValidationUtil.valDtoContainsKey(inputDto, "extDocDate");
  381.         ValidationUtil.valDtoContainsKey(inputDto, "extDocNo");
  382.         ValidationUtil.valBlankOrNull(inputDto.getString("flgDelivery"),
  383.                 "Flag Delivery");
  384.         ValidationUtil.valBlankOrNull(inputDto.getString("currCode"),
  385.                 "Currency");
  386.         ValidationUtil.valBlankOrNull(inputDto.getString("topCode"),
  387.                 "Term of Payment");
  388.         ValidationUtil.valDate(inputDto.getString("docDate"), "Document Date");
  389.         ValidationUtil.valBlankOrNull("flgKonsinyasiManual", inputDto.getString("flgKonsinyasiManual"));
  390.         // ValidationUtil.valDate(inputDto.getString("extDocDate"),
  391.         // "Ext Document Date");
  392.         ValidationUtil.valDtoContainsKey(inputDto, "partnerShipAddressId");
  393.         ValidationUtil.valDtoContainsKey(inputDto, "partnerShipCpId");
  394.         ValidationUtil.valDtoContainsKey(inputDto, "purchaseOrderCodList");
  395.  
  396.         String flgKonsinyasiManual = inputDto.getString("flgKonsinyasiManual");
  397.  
  398.         Long partnerShipAddressId = inputDto.getLong("partnerShipAddressId");
  399.         Long partnerShipCpId = inputDto.getLong("partnerShipCpId");
  400.         Long partnerId = inputDto.getLong("partnerId");
  401.         List<Dto> purchaseOrderCodList = inputDto
  402.                 .getList("purchaseOrderCodList");
  403.         String flgDelivery = inputDto.getString("flgDelivery");
  404.  
  405.         // Validation ou, partner, purchaser, and warehouse must exists and
  406.         // active
  407.         Dto ouDto = findOUById.execute(new Dto().put("id",
  408.                 inputDto.getLong("ouId")));
  409.         if (!inputDto.getLong("tenantLoginId")
  410.                 .equals(ouDto.getLong("tenantId"))) {
  411.             throw new CoreException(
  412.                     CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  413.                     "Purchase Order", "OU");
  414.         }
  415.  
  416.         if (!GeneralConstants.YES.equals(ouDto.getString("active"))) {
  417.             throw new CoreException(MasterExceptionConstants.DATA_NOT_ACTIVE,
  418.                     "OU");
  419.         }
  420.  
  421.         valOUAsMainBusinessUnit.execute(new Dto().put("id",
  422.                 inputDto.getLong("ouId")));
  423.  
  424.         Dto paramAuthorizedPolicyOU = new Dto();
  425.         paramAuthorizedPolicyOU.put("userLoginId",
  426.                 inputDto.getLong("userLoginId"));
  427.         paramAuthorizedPolicyOU.put("roleLoginId",
  428.                 inputDto.getLong("roleLoginId"));
  429.         paramAuthorizedPolicyOU.put("ouId", inputDto.getLong("ouId"));
  430.         paramAuthorizedPolicyOU.put("varName", "OU Business Unit");
  431.         valAuthorizedPolicyOU.execute(paramAuthorizedPolicyOU);
  432.  
  433.         Dto partnerDto = findPartnerById.execute(new Dto().put("id",
  434.                 inputDto.getLong("partnerId")));
  435.         if (!inputDto.getLong("tenantLoginId").equals(
  436.                 partnerDto.getLong("tenantId"))) {
  437.             throw new CoreException(
  438.                     CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  439.                     "Purchase Order", "Partner");
  440.         }
  441.  
  442.         if (!GeneralConstants.YES.equals(partnerDto.getString("active"))) {
  443.             throw new CoreException(MasterExceptionConstants.DATA_NOT_ACTIVE,
  444.                     "Partner");
  445.         }
  446.  
  447.         // partner harus supplier
  448.         Dto paramPartnerMustSupplier = new Dto();
  449.         paramPartnerMustSupplier.put("tenantId",
  450.                 inputDto.getLong("tenantLoginId"));
  451.         paramPartnerMustSupplier.put("partnerId", partnerDto.getLong("id"));
  452.         paramPartnerMustSupplier.put("groupPartner",
  453.                 MasterConstants.GROUP_PARTNER_CODE_SUPPLIER);
  454.         Dto resultPartnerMustSupplier = isPartnerTypeExistsByIndex
  455.                 .execute(paramPartnerMustSupplier);
  456.  
  457.         if (!resultPartnerMustSupplier.getBoolean("exists")) {
  458.             throw new CoreException(
  459.                     PurchasingExceptionConstants.PARTNER_NOT_AUTHORIZED_AS_SUPPLIER,
  460.                     partnerDto.getLong("id"), partnerDto.getString("code"),
  461.                     partnerDto.getString("name"));
  462.         }
  463.  
  464.         Dto paramAuthorizedPolicyPartner = new Dto();
  465.         paramAuthorizedPolicyPartner.put("userLoginId",
  466.                 inputDto.getLong("userLoginId"));
  467.         paramAuthorizedPolicyPartner.put("roleLoginId",
  468.                 inputDto.getLong("roleLoginId"));
  469.         paramAuthorizedPolicyPartner.put("partnerId", partnerDto.getLong("id"));
  470.         paramAuthorizedPolicyPartner.put("varName", "Supplier");
  471.         valAuthorizedPolicyPartner.execute(paramAuthorizedPolicyPartner);
  472.  
  473.         Dto purchaserDto = findPurchaseOfficerById.execute(new Dto().put(
  474.                 "tenantId", inputDto.getLong("tenantLoginId")).put("id",
  475.                 inputDto.getLong("purchaserId")));
  476.         if (!inputDto.getLong("tenantLoginId").equals(
  477.                 purchaserDto.getLong("tenantId"))) {
  478.             throw new CoreException(
  479.                     CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  480.                     "Purchase Order", "Purchaser");
  481.         }
  482.  
  483.         if (!GeneralConstants.YES.equals(purchaserDto.getString("active"))) {
  484.             throw new CoreException(MasterExceptionConstants.DATA_NOT_ACTIVE,
  485.                     "Purchaser");
  486.         }
  487.  
  488.         Dto warehouseDto = findWarehouseById.execute(new Dto().put("id",
  489.                 inputDto.getLong("warehouseId")));
  490.         if (!inputDto.getLong("tenantLoginId").equals(
  491.                 warehouseDto.getLong("tenantId"))) {
  492.             throw new CoreException(
  493.                     CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  494.                     "Purchase Order", "Warehouse");
  495.         }
  496.  
  497.         if (!GeneralConstants.YES.equals(warehouseDto.getString("active"))) {
  498.             throw new CoreException(MasterExceptionConstants.DATA_NOT_ACTIVE,
  499.                     "Warehouse");
  500.         }
  501.  
  502.         Dto paramAuthorizedPolicyWarehouse = new Dto();
  503.         paramAuthorizedPolicyWarehouse.put("userLoginId",
  504.                 inputDto.getLong("userLoginId"));
  505.         paramAuthorizedPolicyWarehouse.put("roleLoginId",
  506.                 inputDto.getLong("roleLoginId"));
  507.         paramAuthorizedPolicyWarehouse.put("warehouseId",
  508.                 warehouseDto.getLong("id"));
  509.         paramAuthorizedPolicyWarehouse.put("varName", "Warehouse");
  510.         valAuthorizedPolicyWarehouse.execute(paramAuthorizedPolicyWarehouse);
  511.  
  512.         valWarehouseExistsInOu.execute(new Dto().put("warehouseId",
  513.                 inputDto.getLong("warehouseId")).put("ouId",
  514.                 inputDto.getLong("ouId")));
  515.  
  516.         // validasi flgDelivery (YES NO), currCode (CURRENCY), topCode (TERM OF
  517.         // PAYMENT), flgKonsinyasiManual (YES NO) harus terdaftar di combo
  518.         Dto paramFlgDeliveryDto = new Dto();
  519.         paramFlgDeliveryDto.put("comboId", ComboIdConstants.COMBO_YES_NO);
  520.         paramFlgDeliveryDto.put("code", inputDto.getString("flgDelivery"));
  521.         paramFlgDeliveryDto.put("varName", "Flag Delivery");
  522.         valComboValueByCode.execute(paramFlgDeliveryDto);
  523.        
  524.         Dto paramFlgKonsinyasiDto = new Dto();
  525.         paramFlgKonsinyasiDto.put("comboId", ComboIdConstants.COMBO_YES_NO);
  526.         paramFlgKonsinyasiDto.put("code", flgKonsinyasiManual);
  527.         paramFlgKonsinyasiDto.put("varName", "Flag Konsinyasi");
  528.         valComboValueByCode.execute(paramFlgKonsinyasiDto);
  529.  
  530.         Dto paramCurrencyDto = new Dto();
  531.         paramCurrencyDto.put("comboId", ComboIdMasterConstants.COMBO_CURRENCY);
  532.         paramCurrencyDto.put("code", inputDto.getString("currCode"));
  533.         paramCurrencyDto.put("varName", "Currency");
  534.         valComboValueByCode.execute(paramCurrencyDto);
  535.  
  536.         Dto paramTopDto = new Dto();
  537.         paramTopDto
  538.                 .put("comboId", ComboIdMasterConstants.COMBO_TERM_OF_PAYMENT);
  539.         paramTopDto.put("code", inputDto.getString("topCode"));
  540.         paramTopDto.put("varName", "Term of Payment");
  541.         valComboValueByCode.execute(paramTopDto);
  542.  
  543.         // cek validasi tanggal dokumen harus >= tanggal dokumen supplier
  544.         if (inputDto.get("extDocDate") == null
  545.                 || inputDto.getString("extDocDate").trim().isEmpty())
  546.             inputDto.put("extDocDate", GeneralConstants.EMPTY_VALUE);
  547.         else
  548.             CommonBusinessValidator.valCompareDate(inputDto, "docDate",
  549.                     "extDocDate",
  550.                     CommonBusinessValidator.COMPARE_GREATER_EQUAL, "PO Date",
  551.                     "Supplier Doc Date");
  552.  
  553.         // cek validasi tanggal dokumen harus >= tanggal referensi SO
  554.         if (!inputDto.getLong("refId").equals(
  555.                 GeneralConstants.NULL_REF_VALUE_LONG)) {
  556.             Dto resultFindSoByIdDto = findSalesOrderByIdForRefPo
  557.                     .execute(new Dto().put("id", inputDto.getLong("refId")));
  558.  
  559.             CommonBusinessValidator.valCompareDate(
  560.                     inputDto.getString("docDate"),
  561.                     resultFindSoByIdDto.getString("docDate"),
  562.                     CommonBusinessValidator.COMPARE_GREATER_EQUAL, "PO Date",
  563.                     "Ref. SO Date");
  564.         }
  565.  
  566.         // Validation data (business key) is not exists yet in db (add)
  567.         Dto paramCheckUniqueDto = new Dto();
  568.         paramCheckUniqueDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  569.         paramCheckUniqueDto.put("docTypeId",
  570.                 PurchasingConstants.DOCUMENT_PURCHASE_ORDER);
  571.         paramCheckUniqueDto.put("docDate", inputDto.getString("docDate"));
  572.         paramCheckUniqueDto.put("docNo", inputDto.getString("docNo"));
  573.         paramCheckUniqueDto.put("ouId", inputDto.getLong("ouId"));
  574.         Dto resultCheckUniqueDto = isPurchaseOrderExistsByIndex
  575.                 .execute(paramCheckUniqueDto);
  576.  
  577.         if (resultCheckUniqueDto.getBoolean("exists")) {
  578.             throw new CoreException(
  579.                     PurchasingExceptionConstants.PURCHASE_ORDER_ALREADY_EXISTS,
  580.                     inputDto.getString("docDate"), inputDto.getString("docNo"),
  581.                     inputDto.getLong("ouId"));
  582.         }
  583.  
  584.         // find partnership address and cp if not Delivery
  585.         List<Dto> purchaseOrderLogisticList = new ArrayList<Dto>();
  586.         if (GeneralConstants.NO.equals(flgDelivery)) {
  587.             // partner address and partner cp must be filled
  588.             if (GeneralConstants.NULL_REF_VALUE_LONG
  589.                     .equals(partnerShipAddressId)
  590.                     || GeneralConstants.NULL_REF_VALUE_LONG
  591.                             .equals(partnerShipCpId)) {
  592.  
  593.                 throw new CoreException(
  594.                         PurchasingExceptionConstants.PARTNER_SHIP_ADDRESS_AND_PARTNER_SHIP_CP_MUST_BE_FILLED_ON_NON_DELIVERY_PURCHASING_ORDER);
  595.             }
  596.  
  597.             Dto partnerShipAddressDto = findPartnerAddressById
  598.                     .execute(new Dto().put("id", partnerShipAddressId));
  599.             Dto partnerShipCpDto = findPartnerCpById.execute(new Dto().put(
  600.                     "id", partnerShipCpId));
  601.  
  602.             // partner address must be register as shipping and related to
  603.             // partner and active
  604.             if (!GeneralConstants.YES.equals(partnerShipAddressDto
  605.                     .get("active"))) {
  606.                 throw new CoreException(
  607.                         PurchasingExceptionConstants.DATA_NOT_ACTIVE,
  608.                         "Partner Ship Address");
  609.             }
  610.  
  611.             if (!GeneralConstants.YES.equals(partnerShipAddressDto
  612.                     .get("flgShip"))) {
  613.                 throw new CoreException(
  614.                         PurchasingExceptionConstants.PARTNER_ADDRESS_NOT_REGISTERED_ASS_SHIPPING_ADDRESS,
  615.                         partnerShipAddressDto.getString("addressDesc"));
  616.             }
  617.  
  618.             if (!partnerShipAddressDto.get("partnerId").equals(partnerId)) {
  619.                 throw new CoreException(
  620.                         PurchasingExceptionConstants.PARTNER_ADDRESS_NOT_RELATED_TO_PARTNER,
  621.                         partnerShipAddressDto.get("addressDesc"), partnerDto
  622.                                 .getString("partnerName"));
  623.             }
  624.  
  625.             // partner cp must register and active
  626.             if (!GeneralConstants.YES.equals(partnerShipCpDto.get("active"))) {
  627.                 throw new CoreException(
  628.                         PurchasingExceptionConstants.DATA_NOT_ACTIVE,
  629.                         "Partner Ship CP");
  630.             }
  631.  
  632.             log.debug("partnerShipCpDto.get(\"partnerId\") : "
  633.                     + partnerShipCpDto.get("partnerId"));
  634.             log.debug("partnerId : " + partnerId);
  635.  
  636.             if (!partnerShipCpDto.get("partnerId").equals(partnerId)) {
  637.                 throw new CoreException(
  638.                         PurchasingExceptionConstants.PARTNER_CP_NOT_RELATED_TO_PARTNER,
  639.                         partnerShipCpDto.get("cpName"), partnerDto
  640.                                 .getString("partnerName"));
  641.             }
  642.  
  643.             // prepare insert to poLogistic
  644.             Dto purchaseOrderLogisticDto = new Dto();
  645.             purchaseOrderLogisticDto.put("tenantId",
  646.                     inputDto.get("tenantLoginId"));
  647.             purchaseOrderLogisticDto.put("poId",
  648.                     GeneralConstants.NULL_REF_VALUE_LONG);
  649.             purchaseOrderLogisticDto.put("partnerAddressId",
  650.                     partnerShipAddressId);
  651.             purchaseOrderLogisticDto.put("partnerCpId", partnerShipCpId);
  652.             purchaseOrderLogisticDto.put("cpName",
  653.                     partnerShipCpDto.get("cpName"));
  654.             purchaseOrderLogisticDto.put("cpPhone1",
  655.                     partnerShipCpDto.get("phone1"));
  656.             purchaseOrderLogisticDto.put("cpPhone2",
  657.                     partnerShipCpDto.get("phone2"));
  658.             purchaseOrderLogisticDto
  659.                     .put("remark", GeneralConstants.EMPTY_VALUE);
  660.  
  661.             this.prepareInsertAudit(purchaseOrderLogisticDto,
  662.                     inputDto.getLong("userLoginId"),
  663.                     inputDto.getString("datetime"));
  664.             this.prepareUpdateAudit(purchaseOrderLogisticDto,
  665.                     inputDto.getLong("userLoginId"),
  666.                     inputDto.getString("datetime"));
  667.  
  668.             purchaseOrderLogisticList.add(purchaseOrderLogisticDto);
  669.         }
  670.  
  671.         inputDto.put("tenantId", inputDto.getLong("tenantLoginId"));
  672.         inputDto.put("docTypeId", PurchasingConstants.DOCUMENT_PURCHASE_ORDER);
  673.         // inputDto.put("refDocTypeId", GeneralConstants.NULL_REF_VALUE_LONG);
  674.         // inputDto.put("refId", GeneralConstants.NULL_REF_VALUE_LONG);
  675.         inputDto.put("addDiscountPercentage", new Double(0));
  676.         inputDto.put("addDiscountAmount", new Double(0));
  677.         inputDto.put("statusDoc", PurchasingConstants.DRAFT_TRANSACTION);
  678.         inputDto.put("workflowStatus",
  679.                 PurchasingConstants.WORKFLOW_STATUS_DRAFT);
  680.  
  681.         // prepare detail for add item
  682.         List<Dto> purchaseOrderItemList = inputDto
  683.                 .getList("purchaseOrderItemList");
  684.         List<Dto> resultPurchaseOrderItemList = new ArrayList<Dto>();
  685.         List<Dto> failList = new ArrayList<Dto>();
  686.         List<Dto> failListDuplicateProduct = new ArrayList<Dto>();
  687.  
  688.         Dto paramDigitDecimalCurrency = new Dto();
  689.         paramDigitDecimalCurrency.put("tenantId",
  690.                 inputDto.getLong("tenantLoginId"));
  691.         paramDigitDecimalCurrency.put("docTypeId",
  692.                 PurchasingConstants.DOCUMENT_PURCHASE_ORDER);
  693.         paramDigitDecimalCurrency.put("currCode",
  694.                 inputDto.getString("currCode"));
  695.         Dto resultDigitDecimalCurrency = getDigitDecimalCurrencyByDocType
  696.                 .execute(paramDigitDecimalCurrency);
  697.  
  698.         Integer decimalForRounding = resultDigitDecimalCurrency
  699.                 .getInteger("digit");
  700.  
  701.         for (Dto purchaseOrderItemDto : purchaseOrderItemList) {
  702.  
  703.             log.info("======================================================== ini jalan loh else nya ========================================================");
  704.            
  705.             if(flgKonsinyasiManual.equals(GeneralConstants.YES)) {
  706.                
  707.                 log.info(" ini bro masuk validasi flg consigmnet manual product terebut ");
  708.                
  709.                 Dto valProductCanOnlyInOnePoConsignmentManualDto = new Dto();
  710.                 valProductCanOnlyInOnePoConsignmentManualDto.put("productId", Long.valueOf(purchaseOrderItemDto.getString("productId")));
  711.                
  712.                 valProductCanOnlyInOnePoConsignmentManual.execute(valProductCanOnlyInOnePoConsignmentManualDto);
  713.             }
  714.  
  715.             try {
  716.                 Calc.rounding(purchaseOrderItemDto, decimalForRounding,
  717.                         roundingModeNonTax, "grossPricePo");
  718.  
  719.                 // Copy process date and userId
  720.                 this.prepareInsertAudit(purchaseOrderItemDto,
  721.                         inputDto.getLong("userLoginId"),
  722.                         inputDto.getString("datetime"));
  723.                 this.prepareUpdateAudit(purchaseOrderItemDto,
  724.                         inputDto.getLong("userLoginId"),
  725.                         inputDto.getString("datetime"));
  726.  
  727.                 // Validation tidak boleh kosong / null / tanggal / etc
  728.                 ValidationUtil.valBlankOrNull(
  729.                         purchaseOrderItemDto.getString("flgStock"),
  730.                         "Flag Stock");
  731.                 ValidationUtil.valBlankOrNull(
  732.                         purchaseOrderItemDto.getString("flgTaxAmount"),
  733.                         "Flag Tax Amount");
  734.                 ValidationUtil.valDate(purchaseOrderItemDto.getString("eta"),
  735.                         "ETA");
  736.  
  737.                 ValidationUtil
  738.                         .valDtoContainsKey(purchaseOrderItemDto, "etaDay");
  739.                 ValidationUtil.valBlankOrNull(
  740.                         purchaseOrderItemDto.get("flgIndent") == null ? null
  741.                                 : purchaseOrderItemDto.getString("flgIndent"),
  742.                         "Item flag Indent");
  743.                 ValidationUtil.valDtoContainsKey(purchaseOrderItemDto, "refId");
  744.  
  745.                 String etaDay = purchaseOrderItemDto.getString("etaDay");
  746.                 String flgIndent = purchaseOrderItemDto.getString("flgIndent");
  747.                 Long refId = Long.valueOf(purchaseOrderItemDto
  748.                         .getString("refId"));
  749.  
  750.                 // validate combo etaday and flgIndent
  751.                 if (!GenericValidator.isBlankOrNull(etaDay)) {
  752.                     valComboValueByCode
  753.                             .execute(new Dto()
  754.                                     .put("comboId",
  755.                                             ComboIdMasterConstants.COMBO_ETADAY)
  756.                                     .put("code", etaDay)
  757.                                     .put("varName", "ETA day item"));
  758.                 }
  759.  
  760.                 valComboValueByCode.execute(new Dto()
  761.                         .put("comboId", ComboIdConstants.COMBO_YES_NO)
  762.                         .put("code", flgIndent).put("varName", "Flag Indent"));
  763.  
  764.                 CommonBusinessValidator.valCompareNumber(
  765.                         purchaseOrderItemDto.getString("qtyPo"), "0",
  766.                         CommonBusinessValidator.COMPARE_GREATER,
  767.                         "Item Qty (in PO UoM)", "0");
  768.                 CommonBusinessValidator.valCompareNumber(
  769.                         purchaseOrderItemDto.getString("qtyInt"), "0",
  770.                         CommonBusinessValidator.COMPARE_GREATER,
  771.                         "Item Qty (in Base UoM)", "0");
  772.  
  773.                 // Validation product must exists and active
  774.                 Dto productDto = findProductById.execute(new Dto().put("id",
  775.                         Long.valueOf(purchaseOrderItemDto
  776.                                 .getString("productId"))));
  777.                 if (!inputDto.getLong("tenantLoginId").equals(
  778.                         productDto.getLong("tenantId"))) {
  779.                     throw new CoreException(
  780.                             CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  781.                             "Purchase Order Item", "Product");
  782.                 }
  783.  
  784.                 if (!GeneralConstants.YES
  785.                         .equals(productDto.getString("active"))) {
  786.                     throw new CoreException(
  787.                             MasterExceptionConstants.DATA_NOT_ACTIVE, "Product");
  788.                 }
  789.  
  790.                 Dto paramAuthorizedPolicyProduct = new Dto();
  791.                 paramAuthorizedPolicyProduct.put("userLoginId",
  792.                         inputDto.getLong("userLoginId"));
  793.                 paramAuthorizedPolicyProduct.put("roleLoginId",
  794.                         inputDto.getLong("roleLoginId"));
  795.                 paramAuthorizedPolicyProduct.put("productId",
  796.                         productDto.getLong("id"));
  797.                 paramAuthorizedPolicyProduct.put("varName", "Product");
  798.                 valAuthorizedPolicyProduct
  799.                         .execute(paramAuthorizedPolicyProduct);
  800.  
  801.                 Dto paramValSubCtgrProductAuthorizedInItemWarehouse = new Dto();
  802.                 paramValSubCtgrProductAuthorizedInItemWarehouse.put("tenantId",
  803.                         inputDto.getLong("tenantLoginId"));
  804.                 paramValSubCtgrProductAuthorizedInItemWarehouse.put(
  805.                         "warehouseId", inputDto.getLong("warehouseId"));
  806.                 paramValSubCtgrProductAuthorizedInItemWarehouse.put(
  807.                         "subCtgrProductId",
  808.                         productDto.getLong("subCtgrProductId"));
  809.                 Dto resultItemWarehouseDto = isItemWarehouseExistsByIndex
  810.                         .execute(paramValSubCtgrProductAuthorizedInItemWarehouse);
  811.  
  812.                 if (!resultItemWarehouseDto.getBoolean("exists")) {
  813.                     throw new CoreException(
  814.                             MasterExceptionConstants.PRODUCT_NOT_AUTHORIZED_IN_WAREHOUSE,
  815.                             productDto.getLong("id"), inputDto
  816.                                     .getLong("warehouseId"));
  817.                 }
  818.  
  819.                 Dto ctgrProductDto = findCtgrProductById.execute(new Dto().put(
  820.                         "id", productDto.getLong("ctgrProductId")));
  821.                 Dto groupProductDto = findGroupProductById.execute(new Dto()
  822.                         .put("id", ctgrProductDto.getLong("groupProductId")));
  823.  
  824.                 // come here
  825.                 // hans
  826.                 // validasi tidak boleh ada product_id yang duplikat dalam po yg
  827.                 // sama
  828.                 log.info("ini isinya si tempPoItemList >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
  829.                         + tempPoItemList.toString()
  830.                         + "<<<<<<<<<<<<<<"
  831.                         + "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
  832.                 log.info("ini dianya si product id >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
  833.                         + purchaseOrderItemDto.getString("productId"));
  834.                 if (tempPoItemList.contains(purchaseOrderItemDto
  835.                         .getString("productId"))) {
  836.                     log.info("======================================================== ini jalan loh if nya ========================================================");
  837.                     throw new CoreException(
  838.                             PurchasingExceptionConstants.PRODUCT_IS_ALREADY_EXIST_IN_CURRENT_PURCHASE_ORDER,
  839.                             purchaseOrderItemDto.getString("productName"));
  840.                 }
  841.                
  842.                 tempPoItemList.add(purchaseOrderItemDto.getString("productId"));
  843.  
  844.                 // KoAli
  845.                 // Added by Ali, untuk PO Konsinyasi, tidak boleh ada produk
  846.                 // yang sama di PO lain
  847.                 // Hanya validasi untuk PO konsinyasi
  848.                 if (flgBuyConsignment.equals(GeneralConstants.YES)) {
  849.                     valNoProductConsignmentItemDuplicate.execute(
  850.                             new Dto()
  851.                             .put("currentPoId", GeneralConstants.NULL_REF_VALUE_LONG)
  852.                             .put("productId", Long.valueOf(purchaseOrderItemDto.getString("productId"))));
  853.                 }
  854.  
  855.                 // if PO from sales check qtyPo <= qtySo item
  856.                 if (!GeneralConstants.NULL_REF_VALUE_LONG.equals(inputDto
  857.                         .get("refId"))) {
  858.                     // if from so flgStock = Y, activityGlId = -99, ouRcId =
  859.                     // -99
  860.                     // segmentId = -99
  861.                     purchaseOrderItemDto.put("flgStock", GeneralConstants.YES);
  862.                     purchaseOrderItemDto.put("activityGlId",
  863.                             GeneralConstants.NULL_REF_VALUE_LONG.toString());
  864.                     purchaseOrderItemDto.put("ouRcId",
  865.                             GeneralConstants.NULL_REF_VALUE_LONG.toString());
  866.                     purchaseOrderItemDto.put("segmentId",
  867.                             GeneralConstants.NULL_REF_VALUE_LONG.toString());
  868.                 }
  869.  
  870.                 // validasi flgStock harus terdaftar di combo yes no, jika
  871.                 // diisi No, harus isi activity gl id
  872.                 Dto paramFlagStockDto = new Dto();
  873.                 paramFlagStockDto.put("comboId", ComboIdConstants.COMBO_YES_NO);
  874.                 paramFlagStockDto.put("code",
  875.                         purchaseOrderItemDto.getString("flgStock"));
  876.                 paramFlagStockDto.put("varName", "Flag Stock");
  877.                 valComboValueByCode.execute(paramFlagStockDto);
  878.  
  879.                 if (GeneralConstants.NO.equals(purchaseOrderItemDto
  880.                         .getString("flgStock"))) {
  881.                     if (GeneralConstants.NULL_REF_VALUE_LONG.equals(Long
  882.                             .valueOf(purchaseOrderItemDto
  883.                                     .getString("activityGlId")))) {
  884.                         throw new CoreException(
  885.                                 PurchasingExceptionConstants.ACTIVITY_GL_PO_ITEM_NOT_COUNT_STOCK);
  886.                     } else {
  887.                         // activity harus terdaftar di master activity
  888.                         Dto activityDto = findActivityById.execute(new Dto()
  889.                                 .put("id", Long.valueOf(purchaseOrderItemDto
  890.                                         .getString("activityGlId"))));
  891.  
  892.                         // activity harus terdaftar di master activity
  893.                         // document dengan jenis trx purchase order dan
  894.                         // aktif
  895.                         Dto paramActivityDocumentDto = new Dto();
  896.                         paramActivityDocumentDto.put("documentTypeId",
  897.                                 PurchasingConstants.DOCUMENT_PURCHASE_ORDER);
  898.                         paramActivityDocumentDto.put("activityId", Long
  899.                                 .valueOf(purchaseOrderItemDto
  900.                                         .getString("activityGlId")));
  901.                         Dto resultActivityDocumentDto = findActivityDocumentById
  902.                                 .execute(paramActivityDocumentDto);
  903.  
  904.                         if (GeneralConstants.NO
  905.                                 .equals(resultActivityDocumentDto
  906.                                         .getString("active"))) {
  907.                             throw new CoreException(
  908.                                     MasterExceptionConstants.DATA_NOT_ACTIVE,
  909.                                     "Activity");
  910.                         }
  911.  
  912.                         Dto paramAuthorizedPolicyActivity = new Dto();
  913.                         paramAuthorizedPolicyActivity.put("userLoginId",
  914.                                 inputDto.getLong("userLoginId"));
  915.                         paramAuthorizedPolicyActivity.put("roleLoginId",
  916.                                 inputDto.getLong("roleLoginId"));
  917.                         paramAuthorizedPolicyActivity.put("activityId", Long
  918.                                 .valueOf(purchaseOrderItemDto
  919.                                         .getString("activityGlId")));
  920.                         paramAuthorizedPolicyActivity
  921.                                 .put("varName", "Activity");
  922.                         valAuthorizedPolicyActivity
  923.                                 .execute(paramAuthorizedPolicyActivity);
  924.  
  925.                         Dto coaDto = findCoaById.execute(new Dto().put("id",
  926.                                 activityDto.getLong("coaId")));
  927.                         Dto groupCoaDto = findGroupCoaById.execute(new Dto()
  928.                                 .put("id", coaDto.getLong("groupCoaId")));
  929.  
  930.                         // validasi harus memilih ou rc, ou rc harus
  931.                         // terdaftar sebagai sub accounting di ou dan aktif
  932.                         if (GeneralConstants.YES.equals(groupCoaDto
  933.                                 .getString("flagSubRc"))) {
  934.                             if (!GeneralConstants.NULL_REF_VALUE_LONG
  935.                                     .equals(inputDto.getLong("ouRcId"))) {
  936.                                 Dto ouRcDto = findOUById.execute(new Dto().put(
  937.                                         "id", Long.valueOf(purchaseOrderItemDto
  938.                                                 .getString("ouRcId"))));
  939.  
  940.                                 if (!inputDto.getLong("tenantLoginId").equals(
  941.                                         ouRcDto.getLong("tenantId"))) {
  942.                                     throw new CoreException(
  943.                                             CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  944.                                             "Purchase Order Item", "OU RC");
  945.                                 }
  946.  
  947.                                 if (!GeneralConstants.YES.equals(ouRcDto
  948.                                         .getString("active"))) {
  949.                                     throw new CoreException(
  950.                                             MasterExceptionConstants.DATA_NOT_ACTIVE,
  951.                                             "OU RC");
  952.                                 }
  953.  
  954.                                 // ou yang dipilih harus merupakan ou RC
  955.                                 // (accounting flag = YES)
  956.                                 valOUAsSubAccounting.execute(new Dto().put(
  957.                                         "id", ouRcDto.getLong("id")));
  958.                             } else {
  959.                                 throw new CoreException(
  960.                                         PurchasingExceptionConstants.OU_RC_MUST_BE_FILLED);
  961.                             }
  962.                         }
  963.  
  964.                         // validasi segment coa
  965.                         if (GeneralConstants.YES.equals(groupCoaDto
  966.                                 .getString("flagSubSegment"))) {
  967.                             if (!GeneralConstants.NULL_REF_VALUE_LONG
  968.                                     .equals(inputDto.getLong("segmentId"))) {
  969.                                 Dto segmentCoaDto = findSegmentCoaById
  970.                                         .execute(new Dto().put(
  971.                                                 "id",
  972.                                                 Long.valueOf(purchaseOrderItemDto
  973.                                                         .getString("segmentId"))));
  974.  
  975.                                 if (!inputDto.getLong("tenantLoginId").equals(
  976.                                         segmentCoaDto.getLong("tenantId"))) {
  977.                                     throw new CoreException(
  978.                                             CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  979.                                             "Purchase Order", "Segment");
  980.                                 }
  981.  
  982.                                 if (!GeneralConstants.YES.equals(segmentCoaDto
  983.                                         .getString("active"))) {
  984.                                     throw new CoreException(
  985.                                             MasterExceptionConstants.DATA_NOT_ACTIVE,
  986.                                             "Segment");
  987.                                 }
  988.                             } else {
  989.                                 throw new CoreException(
  990.                                         PurchasingExceptionConstants.SEGMENT_MUST_BE_FILLED);
  991.                             }
  992.                         }
  993.                     }
  994.                 } else {
  995.                     purchaseOrderItemDto.put("activityGlId",
  996.                             GeneralConstants.NULL_REF_VALUE_LONG);
  997.                 }
  998.  
  999.                 // validation ou PKP
  1000.                 Dto outputIsOULegalExistsByIndex = isOULegalExistsByIndex
  1001.                         .execute(new Dto().put("ouId", inputDto.get("ouId"))
  1002.                                 .put("tenantId", inputDto.get("tenantLoginId")));
  1003.                 if (outputIsOULegalExistsByIndex.getBoolean("exists")) {
  1004.                     Dto ouLegalDto = outputIsOULegalExistsByIndex
  1005.                             .getDto("ouLegalDto");
  1006.                     // if not pkpOu
  1007.                     if (GeneralConstants.NO.equals(ouLegalDto.get("flgPkp"))) {
  1008.                         log.debug("not pkp ou, unset flgTaxAmount and taxId");
  1009.                         purchaseOrderItemDto.put("flgTaxAmount",
  1010.                                 GeneralConstants.NO);
  1011.                         purchaseOrderItemDto.put("taxId",
  1012.                                 GeneralConstants.NULL_REF_VALUE_LONG);
  1013.                     }
  1014.                 } else {
  1015.                     // if not pkp Ou
  1016.                     log.debug("not pkp ou, unset flgTaxAmount and taxId");
  1017.                     purchaseOrderItemDto.put("flgTaxAmount",
  1018.                             GeneralConstants.NO);
  1019.                     purchaseOrderItemDto.put("taxId",
  1020.                             GeneralConstants.NULL_REF_VALUE_LONG);
  1021.                 }
  1022.  
  1023.                 // validasi flgTaxAmount harus terdaftar di combo yes no
  1024.                 Dto paramFlagTaxAmountDto = new Dto();
  1025.                 paramFlagTaxAmountDto.put("comboId",
  1026.                         ComboIdConstants.COMBO_YES_NO);
  1027.                 paramFlagTaxAmountDto.put("code",
  1028.                         purchaseOrderItemDto.getString("flgTaxAmount"));
  1029.                 paramFlagTaxAmountDto.put("varName", "Flag Tax Amount");
  1030.                 valComboValueByCode.execute(paramFlagTaxAmountDto);
  1031.  
  1032.                 // Untuk flag tax amount (flag mempengaruhi pajak) : Y / YES
  1033.                 // harus memilih tax nya, jika tidak memilih tax maka error
  1034.                 // tax price po = (gross price po – discount) * 100 / (100 +
  1035.                 // tax percentage value) * (tax percentage value / 100)
  1036.                 // rounding ke atas sampai 1 rupiah
  1037.                 // Nett price po = (gross price po – discount) – tax price
  1038.                 // Untuk flag tax amount (flag mempengaruhi pajak) : N / NO
  1039.                 // nett price po = (gross price po – discount)
  1040.                 // jika memilih tax, maka tax price = (gross price po –
  1041.                 // discount) * (tax percentage value / 100) rounding ke atas
  1042.                 // sampai 1 rupiah
  1043.                 // tidak memilih tax maka tax percentage dan tax price = 0
  1044.                 // Gross Item Amount = gross price po * qty po
  1045.                 // Nett item amount = nett price po * qty po
  1046.                 // Tax Amount = tax price * qty po
  1047.  
  1048.                 Double grossPricePo = Double.valueOf(purchaseOrderItemDto
  1049.                         .getString("grossPricePo"));
  1050.                 Double qtyPo = Double.valueOf(purchaseOrderItemDto
  1051.                         .getString("qtyPo"));
  1052.                 String flgTaxAmount = purchaseOrderItemDto
  1053.                         .getString("flgTaxAmount");
  1054.                 Long taxId = Long.valueOf(purchaseOrderItemDto
  1055.                         .getString("taxId"));
  1056.  
  1057.                 if (grossPricePo.doubleValue() < 0) {
  1058.                     throw new CoreException(
  1059.                             PurchasingExceptionConstants.INPUT_MUST_BE_POSITIVE_VALUE,
  1060.                             "Gross Price PO");
  1061.                 }
  1062.  
  1063.                 Double discountPercentage = Double.valueOf(purchaseOrderItemDto.get("discountPercentage").toString());
  1064.                 Double discountAmount = new Double(0);
  1065.                 Double nettPricePo = new Double(0);
  1066.                 Double taxPrice = new Double(0);
  1067.                 Double grossItemAmount = new Double(0);
  1068.                 Double nettItemAmount = new Double(0);
  1069.                 Double taxAmount = new Double(0);
  1070.                 Double taxPercentage = new Double(0);
  1071.  
  1072.                 // hitung discount amount
  1073.                 discountAmount = new Calc(grossPricePo).multiply(discountPercentage).divide(100).doubleValue();
  1074.                
  1075.                 Dto paramCalculatePriceDto = new Dto();
  1076.                 paramCalculatePriceDto.put("grossPrice", grossPricePo);
  1077.                 paramCalculatePriceDto.put("qty", qtyPo);
  1078.                 paramCalculatePriceDto.put("flgTaxAmount", flgTaxAmount);
  1079.                 paramCalculatePriceDto.put("discountPercentage", discountPercentage);
  1080.                 paramCalculatePriceDto.put("discountAmount", discountAmount);
  1081.                 paramCalculatePriceDto.put("decimalForRounding", decimalForRounding);
  1082.                 paramCalculatePriceDto.put("roundingMode", roundingModeNonTax);
  1083.                 paramCalculatePriceDto.put("taxId", taxId);
  1084.  
  1085.                 Dto calculatePriceDto = calculateAmountFromGrossPrice
  1086.                         .execute(paramCalculatePriceDto);
  1087.  
  1088.                 grossPricePo = calculatePriceDto.getDouble("grossPrice");
  1089.                 nettPricePo = calculatePriceDto.getDouble("nettPrice");
  1090.                 taxPrice = calculatePriceDto.getDouble("taxPrice");
  1091.                 grossItemAmount = calculatePriceDto.getDouble("grossAmount");
  1092.                 nettItemAmount = calculatePriceDto.getDouble("nettAmount");
  1093.                 taxAmount = calculatePriceDto.getDouble("taxAmount");
  1094.                 discountPercentage = calculatePriceDto.getDouble("discountPercentage");
  1095.                 discountAmount = calculatePriceDto.getDouble("discountAmount");
  1096.                 taxPercentage = calculatePriceDto.getDouble("taxPercentage");
  1097.  
  1098.                 // if
  1099.                 // (GeneralConstants.YES.equals(purchaseOrderItemDto.getString("flgTaxAmount")))
  1100.                 // {
  1101.                 // if
  1102.                 // (!CommonConstants.ID_NOT_USED.equals(Long.valueOf(purchaseOrderItemDto.getString("taxId"))))
  1103.                 // {
  1104.                 // Dto taxDto = findTaxDto(inputDto, purchaseOrderItemDto);
  1105.                 // // tax_amount = ROUND(nett_item_amount * (tax_percentage
  1106.                 // / (100 + tax_percentage)))
  1107.                 // taxPercentage = taxDto.getDouble("percentage");
  1108.                 // taxPrice = new
  1109.                 // Calc(nettPricePo).multiply(taxPercentage).divide(100 +
  1110.                 // taxPercentage, decimalForRounding,
  1111.                 // BigDecimal.ROUND_DOWN).doubleValue();
  1112.                 // taxAmount = new
  1113.                 // Calc(nettItemAmount).multiply(taxPercentage).divide(100 +
  1114.                 // taxPercentage, decimalForRounding,
  1115.                 // BigDecimal.ROUND_DOWN).doubleValue();
  1116.                 //
  1117.                 // nettPricePo = new
  1118.                 // Calc(nettPricePo).subtract(taxPrice).doubleValue();
  1119.                 // nettItemAmount = new
  1120.                 // Calc(nettItemAmount).subtract(taxAmount).doubleValue();
  1121.                 // } else {
  1122.                 // throw new
  1123.                 // CoreException(PurchasingExceptionConstants.PURCHASE_ORDER_ITEM_PRICE_INCLUDE_TAX);
  1124.                 // }
  1125.                 // } else {
  1126.                 // if
  1127.                 // (!CommonConstants.ID_NOT_USED.equals(Long.valueOf(purchaseOrderItemDto.getString("taxId"))))
  1128.                 // {
  1129.                 // Dto taxDto = findTaxDto(inputDto, purchaseOrderItemDto);
  1130.                 // // tax_amount = nett_item_amount * tax_percentage / 100
  1131.                 // taxPercentage = taxDto.getDouble("percentage");
  1132.                 // taxPrice = new
  1133.                 // Calc(nettPricePo).multiply(taxPercentage).divide(100,
  1134.                 // decimalForRounding, BigDecimal.ROUND_DOWN).doubleValue();
  1135.                 // taxAmount = new
  1136.                 // Calc(nettItemAmount).multiply(taxPercentage).divide(100,
  1137.                 // decimalForRounding, BigDecimal.ROUND_DOWN).doubleValue();
  1138.                 // }
  1139.                 // }
  1140.  
  1141.                 // PO Uom must exists
  1142.                 Dto poUomDto = findUomById
  1143.                         .execute(new Dto().put("id", Long
  1144.                                 .valueOf(purchaseOrderItemDto
  1145.                                         .getString("poUomId"))));
  1146.  
  1147.                 if (!inputDto.getLong("tenantLoginId").equals(
  1148.                         poUomDto.getLong("tenantId"))) {
  1149.                     throw new CoreException(
  1150.                             CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  1151.                             "Purchase Order Item", "PO Uom");
  1152.                 }
  1153.  
  1154.                 if (!GeneralConstants.YES.equals(poUomDto.getString("active"))) {
  1155.                     throw new CoreException(
  1156.                             MasterExceptionConstants.DATA_NOT_ACTIVE, "PO Uom");
  1157.                 }
  1158.  
  1159.                 // if PO from sales check qtyPo <= qtySo item
  1160.                 if (!GeneralConstants.NULL_REF_VALUE_LONG.equals(inputDto
  1161.                         .get("refId"))) {
  1162.                     Dto soItemDto = findSalesOrderItemByIdForPo
  1163.                             .execute(new Dto().put("soItemId", refId));
  1164.                     purchaseOrderItemDto.put("lineNo", soItemDto.get("lineNo")
  1165.                             .toString());
  1166.  
  1167.                     log.debug("soItemDto : " + soItemDto);
  1168.                     if (!soItemDto
  1169.                             .get("productId")
  1170.                             .toString()
  1171.                             .equals(purchaseOrderItemDto.get("productId")
  1172.                                     .toString())) {
  1173.                         throw new CoreException(
  1174.                                 PurchasingExceptionConstants.PURCHASE_ORDER_ITEM_NOT_FROM_REFERENCE_SALES_ORDER_ITEM,
  1175.                                 purchaseOrderItemDto.get("productId"));
  1176.                     }
  1177.                     //
  1178.                     // log.debug("purchaseOrderItemDto.getString(\"qtyInt\") : "+purchaseOrderItemDto.getString("qtyInt"));
  1179.                     // log.debug("soItemDto.get(\"qtyInt\").toString() : "+soItemDto.get("qtyInt").toString());
  1180.                     //
  1181.                     // CommonBusinessValidator.valCompareNumber(purchaseOrderItemDto.getString("qtyInt"),
  1182.                     // soItemDto.get("qtyInt").toString(),
  1183.                     // CommonBusinessValidator.COMPARE_LESS_EQUAL,
  1184.                     // "Item Qty PO Internal", "Item Qty SO Internal");
  1185.  
  1186.                     Dto soPoBalanceItemDto = findSoPoBalanceItemByIdForPo
  1187.                             .execute(new Dto().put("soItemId", refId));
  1188.  
  1189.                     // validate status item
  1190.                     if (!PurchasingConstants.RELEASED_TRANSACTION
  1191.                             .equals(soPoBalanceItemDto.get("statusItem"))) {
  1192.                         throw new CoreException(
  1193.                                 PurchasingExceptionConstants.SALES_ORDER_ITEM_HAS_BEEN_USED_BY_OTHER_TRANSACTION,
  1194.                                 soItemDto.get("lineNo"));
  1195.                     }
  1196.  
  1197.                     Double qtyInt = Double.valueOf(purchaseOrderItemDto.get(
  1198.                             "qtyPo").toString());
  1199.  
  1200.                     if (!Long.valueOf(
  1201.                             purchaseOrderItemDto.get("poUomId").toString())
  1202.                             .equals(productDto.getLong("baseUomId"))) {
  1203.                         qtyInt = Double.valueOf(purchaseOrderItemDto.get(
  1204.                                 "qtyInt").toString());
  1205.                     }
  1206.  
  1207.                     CommonBusinessValidator.valCompareNumber(qtyInt.toString(),
  1208.                             soPoBalanceItemDto.getDouble("qtyOsPo").toString(),
  1209.                             CommonBusinessValidator.COMPARE_LESS_EQUAL,
  1210.                             "Item Qty PO Internal", "Balance Qty PO Internal");
  1211.  
  1212.                 }
  1213.  
  1214.                 /*************************************************************************************************/
  1215.                 // validasi setiap item product punya supplier harus cocok
  1216.                 // dengan supplier dari PO
  1217.                 if (inputDto.get("flgBuyConsignment").equals(
  1218.                         GeneralConstants.YES)) {
  1219.                     Query query = purchaseOrderExtDao
  1220.                             .createNativeQuery("SELECT COUNT(*) FROM m_product_consignment_supp_info e WHERE e.product_id = :productId AND e.supplier_id = :partnerId");
  1221.  
  1222.                     query.setParameter("productId", Long
  1223.                             .valueOf(purchaseOrderItemDto
  1224.                                     .getString("productId")));
  1225.                     query.setParameter("partnerId",
  1226.                             Long.valueOf(inputDto.getString("partnerId")));
  1227.  
  1228.                     Long count = Long.valueOf(query.getSingleResult()
  1229.                             .toString());
  1230.  
  1231.                     if (count == 0) {
  1232.                         throw new CoreException(
  1233.                                 PurchasingExceptionConstants.PRODUCT_NOT_FROM_SUPPLIER,
  1234.                                 inputDto.getString("productId"), inputDto
  1235.                                         .getString("partnerId"));
  1236.                     }
  1237.                 }
  1238.  
  1239.                 /*************************************************************************************************/
  1240.  
  1241.                 purchaseOrderItemDto.put("tenantId",
  1242.                         inputDto.getLong("tenantLoginId"));
  1243.                 purchaseOrderItemDto.put("lineNo",
  1244.                         Long.valueOf(purchaseOrderItemDto.getString("lineNo")));
  1245.                 purchaseOrderItemDto.put("refDocTypeId",
  1246.                         PurchasingConstants.DOCUMENT_SALES_ORDER);
  1247.                 purchaseOrderItemDto.put("refId", refId);
  1248.                 purchaseOrderItemDto.put("warehouseId",
  1249.                         inputDto.getString("warehouseId"));
  1250.                 purchaseOrderItemDto.put("productId", Long
  1251.                         .valueOf(purchaseOrderItemDto.getString("productId")));
  1252.                 purchaseOrderItemDto.put("flgStock",
  1253.                         purchaseOrderItemDto.getString("flgStock"));
  1254.                 purchaseOrderItemDto.put("currCode",
  1255.                         inputDto.getString("currCode"));
  1256.                 purchaseOrderItemDto.put("flgTaxAmount",
  1257.                         purchaseOrderItemDto.getString("flgTaxAmount"));
  1258.                 purchaseOrderItemDto.put("taxId",
  1259.                         Long.valueOf(purchaseOrderItemDto.getString("taxId")));
  1260.                 purchaseOrderItemDto
  1261.                         .put("qtyPo", Double.valueOf(purchaseOrderItemDto
  1262.                                 .getString("qtyPo")));
  1263.                 purchaseOrderItemDto
  1264.                         .put("poUomId", Long.valueOf(purchaseOrderItemDto
  1265.                                 .getString("poUomId")));
  1266.                 if (Long.valueOf(purchaseOrderItemDto.getString("poUomId"))
  1267.                         .equals(productDto.getLong("baseUomId"))) {
  1268.                     purchaseOrderItemDto.put("qtyInt", Double
  1269.                             .valueOf(purchaseOrderItemDto.getString("qtyPo")));
  1270.                 } else {
  1271.                     purchaseOrderItemDto.put("qtyInt", Double
  1272.                             .valueOf(purchaseOrderItemDto.getString("qtyInt")));
  1273.                 }
  1274.                 purchaseOrderItemDto.put("baseUomId",
  1275.                         productDto.getLong("baseUomId"));
  1276.  
  1277.                 purchaseOrderItemDto.put("activityGlId",
  1278.                         Long.valueOf(purchaseOrderItemDto
  1279.                                 .getString("activityGlId")));
  1280.                 purchaseOrderItemDto.put("productCoaId",
  1281.                         groupProductDto.getLong("coaId"));
  1282.                 purchaseOrderItemDto.put("segmentId", Long
  1283.                         .valueOf(purchaseOrderItemDto.getString("segmentId")));
  1284.                 purchaseOrderItemDto.put("ouRcId",
  1285.                         Long.valueOf(purchaseOrderItemDto.getString("ouRcId")));
  1286.                 purchaseOrderItemDto.put("eta",
  1287.                         purchaseOrderItemDto.getString("eta"));
  1288.                 purchaseOrderItemDto.put("toleranceRcvQty", Double
  1289.                         .valueOf(purchaseOrderItemDto
  1290.                                 .getString("toleranceRcvQty")));
  1291.                 purchaseOrderItemDto
  1292.                         .put("remark", GeneralConstants.EMPTY_VALUE);
  1293.  
  1294.                 purchaseOrderItemDto.put("discountPercentage",
  1295.                         discountPercentage);
  1296.                 purchaseOrderItemDto.put("discountAmount", discountAmount);
  1297.                 purchaseOrderItemDto.put("taxPrice", taxPrice);
  1298.  
  1299.                 purchaseOrderItemDto.put("grossPricePo", grossPricePo);
  1300.                 purchaseOrderItemDto.put("nettPricePo", nettPricePo);
  1301.                 purchaseOrderItemDto.put("grossItemAmount", grossItemAmount);
  1302.                
  1303. //              // Untuk nettItemAmount harus dikurangi dengan nilai discAmount*qty =>> nettItemAmount-(discountAmount*qtyPo)
  1304. //              Double totalDiscAmount = new Calc(discountAmount).multiply(qtyPo).doubleValue();
  1305. //              nettItemAmount = new Calc(grossItemAmount).subtract(totalDiscAmount).doubleValue();
  1306.                
  1307.                 purchaseOrderItemDto.put("nettItemAmount", nettItemAmount);
  1308.                 purchaseOrderItemDto.put("taxAmount", taxAmount);
  1309.                 purchaseOrderItemDto.put("taxPercentage", taxPercentage);
  1310.  
  1311.                 resultPurchaseOrderItemList.add(purchaseOrderItemDto);
  1312.             } catch (CoreException e) {
  1313.                 log.error(e.getErrorKey(), e);
  1314.                 purchaseOrderItemDto.put("errorKey", e.getErrorKey());
  1315.  
  1316.                 List<Object> argsList = new ArrayList<Object>();
  1317.                 if (e.getParamValues() != null && e.getParamValues().length > 0)
  1318.                     for (Object paramValue : e.getParamValues()) {
  1319.                         argsList.add(paramValue);
  1320.                     }
  1321.                 purchaseOrderItemDto.put("args", argsList);
  1322.  
  1323.                 failList.add(purchaseOrderItemDto);
  1324.             }
  1325.  
  1326.         }
  1327.         ///Ujung for
  1328.  
  1329.         if (!failList.isEmpty()) {
  1330.             Dto errorParamDto = new Dto();
  1331.             DtoUtil.putInErrorParamDto(errorParamDto, "failList", new String[] {
  1332.                     "lineNo", "productCode", "productName", "flgStock", "grossPricePo",
  1333.                     "flgTaxAmount", "taxName", "qtyPo", "poUomName", "qtyInt",
  1334.                     "activityGlName", "ouRcName", "eta", "etaDay", "flgIndent",
  1335.                     "toleranceRcvQty", "errorKey", "args" }, failList);
  1336.             throw new CoreException(
  1337.                     PurchasingExceptionConstants.PURCHASE_ORDER_ITEMS_ERROR,
  1338.                     errorParamDto);
  1339.         }
  1340.  
  1341.         // process cod
  1342.         long lineNoCode = 0;
  1343.         List<Dto> insertedPurchaseOrderCodList = new ArrayList<Dto>();
  1344.         List<Dto> failListCod = new ArrayList<Dto>();
  1345.         if (purchaseOrderCodList != null && purchaseOrderCodList.size() > 0) {
  1346.             for (Dto purchaseOrderCodItemDto : purchaseOrderCodList) {
  1347.                 try {
  1348.                     // validate cod item key
  1349.                     // flgCollection, dueDate, currCode, amount,
  1350.                     // trxCurrCode, trxAmount, remark
  1351.                     ValidationUtil
  1352.                             .valBlankOrNull(
  1353.                                     purchaseOrderCodItemDto
  1354.                                             .get("flgCollection") == null ? null
  1355.                                             : purchaseOrderCodItemDto
  1356.                                                     .getString("flgCollection"),
  1357.                                     "Flg Collection");
  1358.                     ValidationUtil.valBlankOrNull(purchaseOrderCodItemDto
  1359.                             .get("dueDate") == null ? null
  1360.                             : purchaseOrderCodItemDto.getString("dueDate"),
  1361.                             "Due Date");
  1362.                     ValidationUtil.valDate(
  1363.                             purchaseOrderCodItemDto.getString("dueDate"),
  1364.                             "Due Date");
  1365.                     ValidationUtil.valBlankOrNull(purchaseOrderCodItemDto
  1366.                             .get("currCode") == null ? null
  1367.                             : purchaseOrderCodItemDto.getString("currCode"),
  1368.                             "Curr Code");
  1369.                     ValidationUtil.valDtoContainsKey(purchaseOrderCodItemDto,
  1370.                             "amount");
  1371.                     ValidationUtil.valBlankOrNull(purchaseOrderCodItemDto
  1372.                             .get("trxCurrCode") == null ? null
  1373.                             : purchaseOrderCodItemDto.getString("trxCurrCode"),
  1374.                             "Curr Code Transaction");
  1375.                     ValidationUtil.valDtoContainsKey(purchaseOrderCodItemDto,
  1376.                             "trxAmount");
  1377.                     ValidationUtil.valDtoContainsKey(purchaseOrderCodItemDto,
  1378.                             "remark");
  1379.  
  1380.                     String flgCollection = purchaseOrderCodItemDto
  1381.                             .getString("flgCollection");
  1382.                     String dueDate = purchaseOrderCodItemDto
  1383.                             .getString("dueDate");
  1384.                     String currCode = purchaseOrderCodItemDto
  1385.                             .getString("currCode");
  1386.                     String trxCurrCode = purchaseOrderCodItemDto
  1387.                             .getString("trxCurrCode");
  1388.                     String remarkCod = purchaseOrderCodItemDto
  1389.                             .getString("remark");
  1390.                     Double amount = Double.valueOf(purchaseOrderCodItemDto.get(
  1391.                             "amount").toString());
  1392.                     Double trxAmount = Double.valueOf(purchaseOrderCodItemDto
  1393.                             .get("trxAmount").toString());
  1394.  
  1395.                     // validate flg collection
  1396.                     valFlgCollection(flgCollection);
  1397.  
  1398.                     // combo currCode and trxCurrCode
  1399.                     valComboValueByCode.execute(new Dto()
  1400.                             .put("comboId",
  1401.                                     ComboIdMasterConstants.COMBO_CURRENCY)
  1402.                             .put("code", currCode)
  1403.                             .put("varName", "Currency COD"));
  1404.  
  1405.                     valComboValueByCode.execute(new Dto()
  1406.                             .put("comboId",
  1407.                                     ComboIdMasterConstants.COMBO_CURRENCY)
  1408.                             .put("code", trxCurrCode)
  1409.                             .put("varName", "Trx Currency COD"));
  1410.  
  1411.                     // dueDate >= system date and dueDate >= doc date
  1412.                     CommonBusinessValidator.valCompareDate(dueDate, date,
  1413.                             CommonBusinessValidator.COMPARE_GREATER_EQUAL,
  1414.                             "Due Date COD", "System Date");
  1415.  
  1416.                     CommonBusinessValidator.valCompareDate(dueDate,
  1417.                             inputDto.getString("docDate"),
  1418.                             CommonBusinessValidator.COMPARE_GREATER_EQUAL,
  1419.                             "Due Date COD", "Document Date");
  1420.  
  1421.                     // amount > 0
  1422.                     CommonBusinessValidator.valCompareNumber(amount.toString(),
  1423.                             "0", CommonBusinessValidator.COMPARE_GREATER,
  1424.                             "Amount", "0");
  1425.  
  1426.                     // trxAmount > 0 when currCode != trxCurrCode
  1427.                     if (!currCode.equals(trxCurrCode)) {
  1428.                         // amount > 0
  1429.                         CommonBusinessValidator.valCompareNumber(
  1430.                                 trxAmount.toString(), "0",
  1431.                                 CommonBusinessValidator.COMPARE_GREATER,
  1432.                                 "Trx Amount COD", "0");
  1433.                     } else {
  1434.                         trxAmount = amount;
  1435.                     }
  1436.  
  1437.                     Dto purchaseOrderCodDto = new Dto();
  1438.                     purchaseOrderCodDto.put("tenantId",
  1439.                             inputDto.get("tenantLoginId"));
  1440.                     purchaseOrderCodDto.put("poId",
  1441.                             GeneralConstants.NULL_REF_VALUE_LONG);
  1442.                     purchaseOrderCodDto.put("lineNo", new Long(++lineNoCode));
  1443.                     purchaseOrderCodDto.put("flgCollection", flgCollection);
  1444.                     purchaseOrderCodDto.put("currCode", currCode);
  1445.                     purchaseOrderCodDto.put("dueDate", dueDate);
  1446.                     purchaseOrderCodDto.put("amount", amount);
  1447.                     purchaseOrderCodDto.put("trxCurrCode", trxCurrCode);
  1448.                     purchaseOrderCodDto.put("trxAmount", trxAmount);
  1449.                     purchaseOrderCodDto.put("remark", remarkCod);
  1450.  
  1451.                     this.prepareInsertAudit(purchaseOrderCodItemDto,
  1452.                             inputDto.getLong("userLoginId"), datetime);
  1453.                     this.prepareUpdateAudit(purchaseOrderCodItemDto,
  1454.                             inputDto.getLong("userLoginId"), datetime);
  1455.  
  1456.                     insertedPurchaseOrderCodList.add(purchaseOrderCodDto);
  1457.                 } catch (CoreException e) {
  1458.                     log.error(e.getErrorKey(), e);
  1459.                     purchaseOrderCodItemDto.put("errorKey", e.getErrorKey());
  1460.  
  1461.                     List<Object> argsList = new ArrayList<Object>();
  1462.                     if (e.getParamValues() != null
  1463.                             && e.getParamValues().length > 0)
  1464.                         for (Object paramValue : e.getParamValues()) {
  1465.                             argsList.add(paramValue);
  1466.                         }
  1467.                     purchaseOrderCodItemDto.put("args", argsList);
  1468.  
  1469.                     failListCod.add(purchaseOrderCodItemDto);
  1470.                 }
  1471.             }
  1472.         }
  1473.  
  1474.         if (!failListCod.isEmpty()) {
  1475.             Dto errorParamDto = new Dto();
  1476.             DtoUtil.putInErrorParamDto(errorParamDto, "failListCod",
  1477.                     new String[] { "flgCollection", "dueDate", "currCode",
  1478.                             "amount", "trxCurrCode", "trxAmount", "remark",
  1479.                             "errorKey", "args" }, failListCod);
  1480.             throw new CoreException(
  1481.                     PurchasingExceptionConstants.PURCHASE_ORDER_COD_ITEMS_ERROR,
  1482.                     errorParamDto);
  1483.         }
  1484.  
  1485.         inputDto.put("resultPurchaseOrderItemList", resultPurchaseOrderItemList);
  1486.         inputDto.put("purchaseOrderLogisticList", purchaseOrderLogisticList);
  1487.         inputDto.put("insertedPurchaseOrderCodList",
  1488.                 insertedPurchaseOrderCodList);
  1489.  
  1490.         log.debug("hasil input dto 2 : "+inputDto);
  1491.         return null;
  1492.  
  1493.     }
  1494.  
  1495.     @SuppressWarnings("unchecked")
  1496.     @Override
  1497.     public Dto process(Dto inputDto, Dto originalDto) throws Exception {
  1498.         log.debug("hasil input Dto 3 : "+inputDto);
  1499.         PurchaseOrder purchaseOrder = GsonUtil.fromDto(inputDto,
  1500.                 PurchaseOrder.class);
  1501.         String datetime = inputDto.getString("datetime");
  1502.         purchaseOrderDao.persist(purchaseOrder);
  1503.  
  1504.         List<Dto> resultPurchaseOrderItemList = inputDto
  1505.                 .getList("resultPurchaseOrderItemList");
  1506.         for (Dto purchaseOrderItemDto : resultPurchaseOrderItemList) {
  1507.             // Add purchaseOrderItemDto
  1508.             purchaseOrderItemDto.put("poId", purchaseOrder.getId());
  1509.             PurchaseOrderItem purchaseOrderItem = GsonUtil.fromDto(
  1510.                     purchaseOrderItemDto, PurchaseOrderItem.class);
  1511.             purchaseOrderItemDao.persist(purchaseOrderItem);
  1512.  
  1513.             // update so po balance item
  1514.             if (!GeneralConstants.NULL_REF_VALUE_LONG.equals(inputDto
  1515.                     .get("refId"))) {
  1516.                 QueryBuilder builder = new QueryBuilder();
  1517.                 builder.add(" SELECT COALESCE(COUNT(1), 0) FROM sl_update_status_so_po_balance_item(:tenantId, :userId, :datetime, :soItemId, :statusItem )");
  1518.  
  1519.                 Query q = purchaseOrderItemDao.createNativeQuery(builder
  1520.                         .toString());
  1521.                 q.setParameter("tenantId", inputDto.get("tenantLoginId"));
  1522.                 q.setParameter("userId", inputDto.get("userLoginId"));
  1523.                 q.setParameter("datetime", inputDto.get("datetime"));
  1524.                 q.setParameter("soItemId", purchaseOrderItem.getRefId());
  1525.                 q.setParameter("statusItem",
  1526.                         PurchasingConstants.IN_PROGRESS_TRANSACTION);
  1527.  
  1528.                 Object obj = q.getSingleResult();
  1529.                 log.debug("Result Update status so po balance item : " + obj);
  1530.             }
  1531.         }
  1532.  
  1533.         // insert logistic
  1534.         List<Dto> purchaseOrderLogisticList = inputDto
  1535.                 .getList("purchaseOrderLogisticList");
  1536.         for (Dto purchaseOrderLogisticDto : purchaseOrderLogisticList) {
  1537.             purchaseOrderLogisticDto.put("poId", purchaseOrder.getId());
  1538.             PurchaseOrderLogistic purchaseOrderLogistic = GsonUtil.fromDto(
  1539.                     purchaseOrderLogisticDto, PurchaseOrderLogistic.class);
  1540.             purchaseOrderLogisticDao.persist(purchaseOrderLogistic);
  1541.         }
  1542.  
  1543.         // insert po cod
  1544.         List<Dto> insertedPurchaseOrderCodList = inputDto
  1545.                 .getList("insertedPurchaseOrderCodList");
  1546.         for (Dto purchaseOrderCodDto : insertedPurchaseOrderCodList) {
  1547.             purchaseOrderCodDto.put("poId", purchaseOrder.getId());
  1548.             PurchaseOrderCod purchaseOrderCod = GsonUtil.fromDto(
  1549.                     purchaseOrderCodDto, PurchaseOrderCod.class);
  1550.             purchaseOrderCodDao.persist(purchaseOrderCod);
  1551.         }
  1552.  
  1553.         // insert PurchaseOrder Ext
  1554.         Dto purchaseOrderExtDto = new Dto();
  1555.         purchaseOrderExtDto.put("poId", purchaseOrder.getId());
  1556.         purchaseOrderExtDto.put("flgBuyConsignment",
  1557.                 inputDto.get("flgBuyConsignment"));
  1558.         purchaseOrderExtDto.put("flgKonsinyasiManual",inputDto.get("flgKonsinyasiManual"));
  1559.         log.debug("hasil dto : "+purchaseOrderExtDto);
  1560.         this.prepareInsertAudit(purchaseOrderExtDto,
  1561.                 inputDto.getLong("userLoginId"), datetime);
  1562.  
  1563.         PurchaseOrderExt pox = GsonUtil.fromDto(purchaseOrderExtDto,
  1564.                 PurchaseOrderExt.class);
  1565.         purchaseOrderExtDao.persist(pox);
  1566.  
  1567.         return new Dto(purchaseOrder);
  1568.     }
  1569.  
  1570.     private void valFlgCollection(String flgCollection) throws CoreException {
  1571.         if (!flgCollectionList.contains(flgCollection)) {
  1572.             throw new CoreException(
  1573.                     PurchasingExceptionConstants.FLAG_COLLECTION_MUST_BE_B_OR_K);
  1574.         }
  1575.     }
  1576.  
  1577.     // private Dto findTaxDto(Dto inputDto, Dto purchaseOrderItemDto) throws
  1578.     // Exception {
  1579.     // Dto taxDto = findTaxById.execute(new Dto().put("id",
  1580.     // Long.valueOf(purchaseOrderItemDto.getString("taxId"))));
  1581.     //
  1582.     // if
  1583.     // (!inputDto.getLong("tenantLoginId").equals(taxDto.getLong("tenantId"))) {
  1584.     // throw new
  1585.     // CoreException(CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  1586.     // "Purchase Order Item", "Tax");
  1587.     // }
  1588.     //
  1589.     // if (!GeneralConstants.YES.equals(taxDto.getString("active"))) {
  1590.     // throw new CoreException(MasterExceptionConstants.DATA_NOT_ACTIVE, "Tax");
  1591.     // }
  1592.     // return taxDto;
  1593.     // }
  1594. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement