samuel025

BT Add DO Receipt

Nov 28th, 2021
694
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 25.44 KB | None | 0 0
  1. package org.jleaf.erp.inv.bo.doreceipt;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import javax.persistence.Query;
  7.  
  8. import org.jleaf.common.CommonExceptionConstants;
  9. import org.jleaf.core.BusinessFunction;
  10. import org.jleaf.core.BusinessTransaction;
  11. import org.jleaf.core.CoreException;
  12. import org.jleaf.core.DefaultBusinessTransaction;
  13. import org.jleaf.core.Dto;
  14. import org.jleaf.core.GeneralConstants;
  15. import org.jleaf.core.annotation.ErrorList;
  16. import org.jleaf.core.annotation.Info;
  17. import org.jleaf.core.annotation.InfoIn;
  18. import org.jleaf.core.annotation.InfoOut;
  19. import org.jleaf.core.dao.QueryBuilder;
  20. import org.jleaf.erp.inv.InventoryConstants;
  21. import org.jleaf.erp.inv.InventoryExceptionConstants;
  22. import org.jleaf.erp.inv.dao.BalanceDeliveryOrderItemDao;
  23. import org.jleaf.erp.inv.dao.DeliveryOrderReceiptDao;
  24. import org.jleaf.erp.inv.dao.DeliveryOrderReceiptItemDao;
  25. import org.jleaf.erp.inv.dao.DeliveryOrderReceiptProductDao;
  26. import org.jleaf.erp.inv.entity.BalanceDeliveryOrderItem;
  27. import org.jleaf.erp.inv.entity.DeliveryOrderReceipt;
  28. import org.jleaf.erp.inv.entity.DeliveryOrderReceiptItem;
  29. import org.jleaf.erp.inv.entity.DeliveryOrderReceiptProduct;
  30. import org.jleaf.erp.master.MasterExceptionConstants;
  31. import org.jleaf.util.Calc;
  32. import org.jleaf.util.DtoUtil;
  33. import org.jleaf.util.GsonUtil;
  34. import org.jleaf.util.ValidationUtil;
  35. import org.jleaf.validator.CommonBusinessValidator;
  36. import org.springframework.beans.factory.annotation.Autowired;
  37. import org.springframework.beans.factory.annotation.Qualifier;
  38. import org.springframework.stereotype.Service;
  39.  
  40. /**
  41.  *
  42.  * @see http://jleaf.org:8181/browse/INVSVC-20
  43.  * @author Fredi, 24 Agustus 2014
  44.  *
  45.  * Validation
  46.  * - val tenant login
  47.  * - val data from same tenant
  48.  * - val
  49.  *
  50.  * Process :
  51.  * - looping trough all do item list'
  52.  * - find every do item in balance do item
  53.  * - check qty return againts balance do item , must be < qty dlv int - balance qty return in every selected item
  54.  * - find if product of do item has serial number,
  55.  * - if not have then  
  56.  * -- prepare add to do receipt product with current product balance
  57.  * - if have then
  58.  * -- not need prepare add receipt product
  59.  * - prepare add do receipt item
  60.  * - prepare add do receipt
  61.  * - update balance do item, qty return + = qtyReturn
  62.  * - add do receipt
  63.  * - add do receipt item
  64.  * - add do receipt product if any
  65.  *
  66.  */
  67. //@formatter:off
  68. @Service
  69. @InfoIn(value = {
  70.         @Info(name = "tenantLoginId", description = "Tenant login id", type = Long.class),
  71.         @Info(name = "userLoginId", description = "User login id", type = Long.class),
  72.         @Info(name = "roleLoginId", description = "User login id", type = Long.class),
  73.         @Info(name = "datetime", description = "Datetime", type = String.class),
  74.        
  75.         @Info(name = "doId", description = "do Id", type = Long.class),
  76.         @Info(name = "warehouseId", description = "Warehouse Id", type = Long.class),
  77.         @Info(name = "docNo", description = "docNo", type = String.class),
  78.         @Info(name = "docDate", description = "doc date", type = String.class),
  79.         @Info(name = "extDocNo", description = "docNo", type = String.class),
  80.         @Info(name = "extDocDate", description = "doc date", type = String.class),
  81.         @Info(name = "remark", description = "Remark", type = String.class),
  82.         @Info(name = "doItemList", description = "List of DO item(doItemId, lineNo, productId, qtyReturn, remark, productStatus)", type = List.class)
  83. })
  84. @InfoOut(value = {
  85.         @Info(name = "id", description = "Id", type = Long.class, required = true),
  86.         @Info(name = "tenantId", description = "Tenant id", type = Long.class, required = true),
  87.         @Info(name = "docTypeId", description = "Doc type id", type = Long.class, required = true),
  88.         @Info(name = "docNo", description = "Doc no", type = String.class, required = true),
  89.         @Info(name = "docDate", description = "Doc date", type = String.class, required = true),
  90.         @Info(name = "ouId", description = "Ou id", type = Long.class, required = true),
  91.         @Info(name = "extDocNo", description = "Ext doc no", type = String.class, required = true),
  92.         @Info(name = "extDocDate", description = "Ext doc date", type = String.class, required = true),
  93.         @Info(name = "refDocTypeId", description = "Ref doc type id", type = Long.class, required = true),
  94.         @Info(name = "refId", description = "Ref id", type = Long.class, required = true),
  95.         @Info(name = "remark", description = "Remark", type = String.class, required = true),
  96.         @Info(name = "warehouseId", description = "Warehouse id", type = Long.class, required = true),
  97.         @Info(name = "statusDoc", description = "Status doc", type = String.class, required = true),
  98.         @Info(name = "workflowStatus", description = "Workflow status", type = String.class, required = true),
  99.         @Info(name = "createUserId", description = "Create user id", type = Long.class, required = true),
  100.         @Info(name = "createDateTime", description = "Create date time", type = String.class, required = true),
  101.         @Info(name = "updateUserId", description = "Update user id", type = Long.class, required = true),
  102.         @Info(name = "updateDateTime", description = "Update date time", type = String.class, required = true),
  103.         @Info(name = "version", description = "Version", type = Long.class, required = true)
  104. })
  105. @ErrorList(errorKeys = {
  106.         CommonExceptionConstants.TENANT_LOGIN_CANT_USED,
  107.         CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  108.         MasterExceptionConstants.DATA_NOT_ACTIVE
  109. })
  110. //@formatter:on
  111. public class AddDeliveryOrderReceipt extends DefaultBusinessTransaction implements BusinessTransaction {
  112.  
  113.     @Autowired
  114.     @Qualifier("valTenantLoginCanUse")
  115.     BusinessFunction valTenantLoginCanUse;
  116.  
  117.     @Autowired
  118.     @Qualifier("findBalanceDeliveryOrderItemById")
  119.     BusinessFunction findBalanceDeliveryOrderItemById;
  120.  
  121.     @Autowired
  122.     @Qualifier("findAdditionalInfoDoInBalanceDeliveryOrderItem")
  123.     BusinessFunction findAdditionalInfoDoInBalanceDeliveryOrderItem;
  124.    
  125.     @Autowired
  126.     @Qualifier("valAuthorizedPolicyOU")
  127.     private BusinessFunction valAuthorizedPolicyOU;
  128.    
  129.     @Autowired
  130.     @Qualifier("findWarehouseById")
  131.     private BusinessFunction findWarehouseById;
  132.    
  133.     @Autowired
  134.     @Qualifier("findProductById")
  135.     private BusinessFunction findProductById;
  136.    
  137.     @Autowired
  138.     @Qualifier("getBalanceDeliveryOrderItemListByDeliveryOrder")
  139.     BusinessFunction getBalanceDeliveryOrderItemListByDeliveryOrder;
  140.    
  141.     @Autowired
  142.     @Qualifier("valWarehouseExistsInOu")
  143.     private BusinessFunction valWarehouseExistsInOu;
  144.    
  145.     @Autowired
  146.     @Qualifier("valAuthorizedPolicyWarehouse")
  147.     private BusinessFunction valAuthorizedPolicyWarehouse;
  148.  
  149.     @Autowired
  150.     @Qualifier("valAuthorizedPolicyProduct")
  151.     BusinessFunction valAuthorizedPolicyProduct;
  152.  
  153.     @Autowired
  154.     @Qualifier("isProductHasSerialNumber")
  155.     BusinessFunction isProductHasSerialNumber;
  156.    
  157.     @Autowired
  158.     @Qualifier("getLogProductBalanceStockListForDeliveryOrderReceipt")
  159.     BusinessFunction getLogProductBalanceStockListForDeliveryOrderReceipt;
  160.    
  161.     @Autowired
  162.     @Qualifier("isProductStatusExistsByIndex")
  163.     BusinessFunction isProductStatusExistsByIndex;
  164.    
  165.     @Autowired
  166.     @Qualifier("valCanCreateDoReceiptBySalesOrderBalanceInvoice")
  167.     BusinessFunction valCanCreateDoReceiptBySalesOrderBalanceInvoice;
  168.    
  169.     @Autowired
  170.     @Qualifier("valCanCreateDoReceiptBySalesOrderBalanceItem")
  171.     BusinessFunction valCanCreateDoReceiptBySalesOrderBalanceItem;
  172.    
  173.     @Autowired
  174.     @Qualifier("valCanCreateDoReceiptBySalesOrder")
  175.     BusinessFunction valCanCreateDoReceiptBySalesOrder;
  176.    
  177.     @Autowired
  178.     DeliveryOrderReceiptDao deliveryOrderReceiptDao;
  179.    
  180.     @Autowired
  181.     DeliveryOrderReceiptItemDao deliveryOrderReceiptItemDao;
  182.  
  183.     @Autowired
  184.     DeliveryOrderReceiptProductDao deliveryOrderReceiptProductDao;
  185.  
  186.     @Autowired
  187.     BalanceDeliveryOrderItemDao balanceDeliveryOrderItemDao;
  188.    
  189.     @Override
  190.     public String getDescription() {
  191.         return "Add delivery order receipt";
  192.     }
  193.  
  194.     @SuppressWarnings("unchecked")
  195.     @Override
  196.     public Dto prepare(Dto inputDto, Dto originalDto) throws Exception {       
  197.         ValidationUtil.valDtoContainsKey(inputDto, "tenantLoginId");
  198.         ValidationUtil.valDtoContainsKey(inputDto, "userLoginId");
  199.         ValidationUtil.valDtoContainsKey(inputDto, "roleLoginId");
  200.         ValidationUtil.valDtoContainsKey(inputDto, "datetime");
  201.        
  202.         Long tenantLoginId = inputDto.getLong("tenantLoginId");
  203.         Long userLoginId = inputDto.getLong("userLoginId");
  204.         Long roleLoginId = inputDto.getLong("roleLoginId");
  205.         String datetime = inputDto.getString("datetime");
  206.        
  207.         // - validation: tenant login can use
  208.         Dto inputDtoForValTenantLoginCanUse = new Dto();
  209.         inputDtoForValTenantLoginCanUse.put("tenantLoginId", tenantLoginId);
  210.         inputDtoForValTenantLoginCanUse.put("userLoginId", userLoginId);
  211.         inputDtoForValTenantLoginCanUse.put("roleLoginId", roleLoginId);
  212.         valTenantLoginCanUse.execute(inputDto);
  213.        
  214.         ValidationUtil.valDtoContainsKey(inputDto, "doId");
  215. //      ValidationUtil.valDtoContainsKey(inputDto, "ouId");
  216.         ValidationUtil.valDtoContainsKey(inputDto, "warehouseId");
  217.         ValidationUtil.valDtoContainsKey(inputDto, "docNo");
  218.         ValidationUtil.valDtoContainsKey(inputDto, "docDate");
  219.         ValidationUtil.valDtoContainsKey(inputDto, "extDocNo");
  220.         ValidationUtil.valDtoContainsKey(inputDto, "extDocDate");
  221.         ValidationUtil.valDtoContainsKey(inputDto, "remark");
  222.         ValidationUtil.valDtoContainsKey(inputDto, "doItemList");
  223.        
  224.         Long doId = inputDto.getLong("doId");
  225.         Long warehouseId = inputDto.getLong("warehouseId");
  226.         String docNo = inputDto.getString("docNo");
  227.         String docDate = inputDto.getString("docDate");
  228.         String extDocNo = inputDto.getString("extDocNo");
  229.         String extDocDate = inputDto.getString("extDocDate");
  230.         String remark = inputDto.getString("remark");
  231.         List<Dto> doItemList = inputDto.getList("doItemList");
  232.        
  233.         ValidationUtil.valBlankOrNull(docNo, "Document No");
  234.         ValidationUtil.valBlankOrNull(docDate, "Document Date");
  235.         ValidationUtil.valDate(docDate, "Document Date");
  236.  
  237.         if(!extDocNo.isEmpty() || !extDocDate.isEmpty()){
  238.             ValidationUtil.valBlankOrNull(extDocNo, "Document External No");
  239.             ValidationUtil.valBlankOrNull(extDocDate, "Document External Date");
  240.             ValidationUtil.valDate(extDocDate, "Document External Date");
  241.            
  242.             // Validasi docDate harus >= extDocDate
  243.             if (CommonBusinessValidator.compareDate(docDate, extDocDate, CommonBusinessValidator.COMPARE_LESS, "Document Date", "Document External Date")) {
  244.                 throw new CoreException(InventoryExceptionConstants.DELIVERY_ORDER_RECEIPT_DOC_DATE_MUST_GREATER_EQUALS_THAN_EXT_DOC_DATE);
  245.             }
  246.         }
  247.        
  248.         Dto additionalInfoDoDto = findAdditionalInfoDoInBalanceDeliveryOrderItem.execute(new Dto()
  249.                 .put("tenantId", tenantLoginId)
  250.                 .put("doId", doId));
  251.  
  252.         Long ouId = additionalInfoDoDto.getLong("ouId");
  253.        
  254.         // validasi tanggal DO <= tanggal dokumen
  255.         CommonBusinessValidator.valCompareDate(additionalInfoDoDto.getString("docDate"), docDate, CommonBusinessValidator.COMPARE_LESS_EQUAL,
  256.                 "DO Date", "Doc Date");
  257.        
  258.         Dto inputDtoForValAuthorizedPolicyOU = new Dto();
  259.         inputDtoForValAuthorizedPolicyOU.put("userLoginId", userLoginId);
  260.         inputDtoForValAuthorizedPolicyOU.put("roleLoginId", roleLoginId);
  261.         inputDtoForValAuthorizedPolicyOU.put("ouId", ouId);
  262.         inputDtoForValAuthorizedPolicyOU.put("varName", "OU");
  263.         valAuthorizedPolicyOU.execute(inputDtoForValAuthorizedPolicyOU);
  264.        
  265.         // gudang harus terdaftar dan aktif (pakai findWarehouseById)
  266.         Dto warehouseDto = findWarehouseById.execute(new Dto().put("id", warehouseId));
  267.         if(!warehouseDto.getString("active").equals(GeneralConstants.YES)){
  268.             throw new CoreException(MasterExceptionConstants.DATA_NOT_ACTIVE, "Warehouse");
  269.         }
  270.        
  271.         // gudang harus termasuk dalam OU yg dipilih (valWarehouseOuExistsByIndex)
  272.         Dto inputDtoForValWarehouseExistsInOu = new Dto();
  273.         inputDtoForValWarehouseExistsInOu.put("warehouseId", warehouseId);
  274.         inputDtoForValWarehouseExistsInOu.put("ouId", ouId);       
  275.         valWarehouseExistsInOu.execute(inputDtoForValWarehouseExistsInOu);
  276.        
  277.         // user dan role login harus berhak untuk warehouse tersebut (valAuthorizedPolicyWarehouse)
  278.         Dto inputDtoForValAuthorizedPolicyWarehouse = new Dto();
  279.         inputDtoForValAuthorizedPolicyWarehouse.put("userLoginId", userLoginId);
  280.         inputDtoForValAuthorizedPolicyWarehouse.put("roleLoginId", roleLoginId);
  281.         inputDtoForValAuthorizedPolicyWarehouse.put("warehouseId", warehouseId);
  282.         inputDtoForValAuthorizedPolicyWarehouse.put("varName", "Warehouse");
  283.         valAuthorizedPolicyWarehouse.execute(inputDtoForValAuthorizedPolicyWarehouse);
  284.        
  285.         // cek so
  286.         Dto paramSoDto = new Dto();
  287.         paramSoDto.put("tenantId", tenantLoginId);
  288.         paramSoDto.put("ouId", ouId);
  289.         paramSoDto.put("soId", additionalInfoDoDto.getLong("soId"));
  290.         valCanCreateDoReceiptBySalesOrder.execute(paramSoDto);
  291.                        
  292.         // validate per do doc
  293. //      Long lineNo = 0L;
  294.         List<Dto> deliveryOrderReceiptItemList = new ArrayList<Dto>();
  295.         List<Dto> updateBalanceDeliveryOrderItemList = new ArrayList<Dto>();
  296.         List<Dto> failList = new ArrayList<Dto>();
  297.         for (Dto doItemItem : doItemList) {
  298.             try{
  299.                 ValidationUtil.valDtoContainsKey(doItemItem, "doItemId");
  300.                 ValidationUtil.valDtoContainsKey(doItemItem, "qtyReturn");
  301.                 ValidationUtil.valDtoContainsKey(doItemItem, "remark");
  302.                 ValidationUtil.valDtoContainsKey(doItemItem, "productId");
  303.                 ValidationUtil.valDtoContainsKey(doItemItem, "lineNo");
  304.                 ValidationUtil.valBlankOrNull(doItemItem.get("productStatus")==null?null:doItemItem.getString("productStatus"), "Product Status Item");
  305.                                
  306.                 Long lineNo = Long.valueOf(doItemItem.get("lineNo").toString());
  307.                 Long doItemId = Long.valueOf(doItemItem.get("doItemId").toString());
  308.                 Long productId = Long.valueOf(doItemItem.get("productId").toString());
  309.                 Double qtyReturn = Double.valueOf(doItemItem.get("qtyReturn").toString());
  310.                 String doReceiveItemRemark = doItemItem.getString("remark");
  311.                 String productStatus = doItemItem.getString("productStatus");
  312.                
  313.                 Dto balanceDeliveryOrderItemDto = findBalanceDeliveryOrderItemById.execute(new Dto().put("deliveryOrderItemId", doItemId));
  314.                
  315.                 // cek so balance invoice
  316.                 Dto paramSoBalanceInvoiceDto = new Dto();
  317.                 paramSoBalanceInvoiceDto.put("tenantId", tenantLoginId);
  318.                 paramSoBalanceInvoiceDto.put("ouId", ouId);
  319.                 paramSoBalanceInvoiceDto.put("soId", balanceDeliveryOrderItemDto.getLong("soId"));
  320.                 paramSoBalanceInvoiceDto.put("refDocTypeId", InventoryConstants.DOCUMENT_DELIVERY_ORDER);
  321.                 paramSoBalanceInvoiceDto.put("refId", doId);
  322.                 paramSoBalanceInvoiceDto.put("refItemId", doItemId);
  323.                 paramSoBalanceInvoiceDto.put("doReceiptItemId", GeneralConstants.NULL_REF_VALUE_LONG);
  324. //              Dto soBalanceInvoiceDto = findSalesOrderBalanceInvoiceByIndex.execute(paramSoBalanceInvoiceDto);
  325.                
  326.                 valCanCreateDoReceiptBySalesOrderBalanceInvoice.execute(paramSoBalanceInvoiceDto);
  327.                
  328.                 // cek so balance item
  329.                 Dto paramSoBalanceItemDto = new Dto();
  330.                 paramSoBalanceItemDto.put("tenantId", tenantLoginId);
  331.                 paramSoBalanceItemDto.put("ouId", ouId);
  332.                 paramSoBalanceItemDto.put("soItemId", balanceDeliveryOrderItemDto.getLong("soItemId"));
  333.                 valCanCreateDoReceiptBySalesOrderBalanceItem.execute(paramSoBalanceItemDto);
  334.                
  335.                 Dto productDto = findProductById.execute(new Dto().put("id", productId));
  336.                
  337.                 valAuthorizedPolicyProduct.execute(new Dto()
  338.                         .put("userLoginId", userLoginId)
  339.                         .put("roleLoginId", roleLoginId)
  340.                         .put("productId", productDto.get("id"))
  341.                         .put("varName", "Product Delivery Order Item"));
  342.                
  343.                 // validate product status
  344.                 Dto outputIsProductStatusExistsByIndex = isProductStatusExistsByIndex.execute(new Dto()
  345.                         .put("tenantId", tenantLoginId)
  346.                         .put("productStatusCode", productStatus));
  347.                
  348.                 if(outputIsProductStatusExistsByIndex.getBoolean("exists")){
  349.                     // validate if product status active
  350.                     Dto productStatusDto = outputIsProductStatusExistsByIndex.getDto("productStatusDto");
  351.                     if(!GeneralConstants.YES.equals(productStatusDto.get("active"))){
  352.                         throw new CoreException(InventoryExceptionConstants.DATA_NOT_ACTIVE, "Product Status Item Delivery Order");
  353.                     }
  354.                 } else{
  355.                     throw new CoreException(MasterExceptionConstants.PRODUCT_STATUS_NOT_FOUND, tenantLoginId, productStatus);
  356.                 }
  357.                
  358.                 // validate qty return <= qtyIntDlv
  359.                 CommonBusinessValidator.valCompareNumber(qtyReturn.toString(), balanceDeliveryOrderItemDto.getDouble("qtyIntDlv").toString(), CommonBusinessValidator.COMPARE_LESS_EQUAL,
  360.                         "Quantity Return", "Quantity Delivery");
  361.                
  362.                 // validate qty return > 0
  363.                 CommonBusinessValidator.valCompareNumber(qtyReturn.toString(), "0", CommonBusinessValidator.COMPARE_GREATER,
  364.                         "Quantity Return", "0");
  365.  
  366.                 // prepare add product if any
  367.                 boolean isDoItemProductHasSerialNumber = true;
  368.                 Dto deliveryOrderReceiptProductDto = new Dto();
  369.                 Dto outputIsProductHasSerialNumber = isProductHasSerialNumber.execute(new Dto()
  370.                         .put("tenantId", tenantLoginId)
  371.                         .put("productId", productId));
  372.                 if(outputIsProductHasSerialNumber.getBoolean("hasSerialNumber")){
  373.                     // do nothing
  374.                 } else{
  375.                     isDoItemProductHasSerialNumber = false;
  376.                    
  377.                     // get product for this item
  378.                     Dto outputGetLogProductBalanceStockListForDeliveryOrderReceipt = getLogProductBalanceStockListForDeliveryOrderReceipt.execute(new Dto()
  379.                             .put("doId", doId)
  380.                             .put("productId", productId));
  381.                    
  382.                     // add do receipt product
  383.                     deliveryOrderReceiptProductDto = new Dto();
  384.                    
  385.                     deliveryOrderReceiptProductDto.put("tenantId", tenantLoginId);
  386.                     deliveryOrderReceiptProductDto.put("doReceiptItemId", GeneralConstants.NULL_REF_VALUE_LONG);
  387.                     deliveryOrderReceiptProductDto.put("lineNo", 1L);
  388.                     deliveryOrderReceiptProductDto.put("productId", productId);
  389.                     deliveryOrderReceiptProductDto.put("productBalanceId", outputIsProductHasSerialNumber.get("productBalanceId"));
  390.                     deliveryOrderReceiptProductDto.put("productStatus", productStatus);
  391.                     deliveryOrderReceiptProductDto.put("uomId", productDto.get("baseUomId"));
  392.                    
  393.                     deliveryOrderReceiptProductDto.put("remark", GeneralConstants.EMPTY_VALUE);
  394.                     deliveryOrderReceiptProductDto.put("qtyReturn", qtyReturn);
  395.                     deliveryOrderReceiptProductDto.put("qtyDlv", balanceDeliveryOrderItemDto.getDouble("qtyIntDlv"));
  396.                     this.prepareUpdateAudit(deliveryOrderReceiptProductDto, userLoginId, datetime);
  397.                 }
  398.                
  399.                 // prepare add do receipt item
  400.                 Dto deliveryOrderReceiptItemDto = new Dto();
  401.                 deliveryOrderReceiptItemDto.put("doReceiptId", GeneralConstants.NULL_REF_VALUE_LONG);
  402.                 deliveryOrderReceiptItemDto.put("tenantId", tenantLoginId);
  403.                 deliveryOrderReceiptItemDto.put("lineNo", lineNo);
  404.                 deliveryOrderReceiptItemDto.put("refDocTypeId", InventoryConstants.DOCUMENT_DELIVERY_ORDER);
  405.                 deliveryOrderReceiptItemDto.put("refId", doItemId);
  406.                 deliveryOrderReceiptItemDto.put("productId", productId);
  407.                 deliveryOrderReceiptItemDto.put("qtyDlv", balanceDeliveryOrderItemDto.getDouble("qtyIntDlv"));
  408.                 deliveryOrderReceiptItemDto.put("qtyReturn", qtyReturn);
  409.                 deliveryOrderReceiptItemDto.put("uomId", balanceDeliveryOrderItemDto.get("baseUomId"));
  410.                 deliveryOrderReceiptItemDto.put("remark", doReceiveItemRemark);
  411.                 deliveryOrderReceiptItemDto.put("productStatus", productStatus);
  412.                
  413.                 deliveryOrderReceiptItemDto.put("hasSerialNumber", isDoItemProductHasSerialNumber);
  414.                 deliveryOrderReceiptItemDto.put("deliveryOrderReceiptProductDto", deliveryOrderReceiptProductDto);
  415.                
  416.                 this.prepareInsertAudit(deliveryOrderReceiptItemDto, userLoginId, datetime);
  417.                 this.prepareUpdateAudit(deliveryOrderReceiptItemDto, userLoginId, datetime);
  418.                
  419.                 deliveryOrderReceiptItemList.add(deliveryOrderReceiptItemDto);
  420.                
  421.                 // prepare update balance do item
  422.                 balanceDeliveryOrderItemDto.put("statusItem", InventoryConstants.IN_PROGRESS_TRANSACTION);
  423.                 this.prepareUpdateAudit(balanceDeliveryOrderItemDto, userLoginId, datetime);
  424.                
  425.                 updateBalanceDeliveryOrderItemList.add(balanceDeliveryOrderItemDto);
  426.             } catch(CoreException ce){
  427.                 Dto errorDto = (Dto)doItemItem.clone();
  428.                 errorDto.put("errorKey", ce.getErrorKey());
  429.  
  430.                 List<Object> argsList = new ArrayList<Object>();
  431.                 if (ce.getParamValues() != null && ce.getParamValues().length > 0) for (Object paramValue : ce.getParamValues()) {
  432.                     argsList.add(paramValue);
  433.                 }
  434.                 errorDto.put("args", argsList);
  435.  
  436.                 failList.add(errorDto);
  437.             }
  438.            
  439.         }
  440.        
  441.         if (!failList.isEmpty()) {
  442.             Dto errorParamDto = new Dto();
  443.             DtoUtil.putInErrorParamDto(errorParamDto, "failList",
  444.                     new String[] {"doItemId", "qtyReturn", "remark", "productStatus", "errorKey", "args"}, failList);
  445.             throw new CoreException(InventoryExceptionConstants.DELIVERY_ORDER_RECEIPT_ITEMS_ERROR, errorParamDto);
  446.         }
  447.        
  448.         // also update other balance do item
  449.         Dto outputGetBalanceDeliveryOrderItemListByDeliveryOrder = getBalanceDeliveryOrderItemListByDeliveryOrder.execute(new Dto().put("doId", doId));
  450.         List<Dto> balanceDeliveryOrderItemList = outputGetBalanceDeliveryOrderItemListByDeliveryOrder.getList("balanceDeliveryOrderItemList");
  451.         for (Dto balanceDeliveryOrderItemItem : balanceDeliveryOrderItemList) {
  452.             Dto balanceDeliveryOrderItem = findBalanceDeliveryOrderItemById.execute(new Dto().put("deliveryOrderItemId", balanceDeliveryOrderItemItem.get("deliveryOrderItemId")));
  453.             if(isDtoExistsInList(balanceDeliveryOrderItem, updateBalanceDeliveryOrderItemList, "deliveryOrderItemId")){
  454.                 // do nothing
  455.             } else{
  456.                 // prepare update
  457.                 balanceDeliveryOrderItem.put("statusItem", InventoryConstants.IN_PROGRESS_TRANSACTION);
  458.                 this.prepareUpdateAudit(balanceDeliveryOrderItem, userLoginId, datetime);
  459.                 updateBalanceDeliveryOrderItemList.add(balanceDeliveryOrderItem);
  460.             }
  461.         }
  462.        
  463.         Dto deliveryOrderReceiptDto = new Dto();
  464.         deliveryOrderReceiptDto.put("tenantId", tenantLoginId);
  465.         deliveryOrderReceiptDto.put("docTypeId", InventoryConstants.DOCUMENT_DELIVERY_ORDER_RECEIPT);
  466.         deliveryOrderReceiptDto.put("docNo", docNo);
  467.         deliveryOrderReceiptDto.put("docDate", additionalInfoDoDto.getString("docDate"));
  468.         deliveryOrderReceiptDto.put("ouId", ouId);
  469.         deliveryOrderReceiptDto.put("extDocNo", extDocNo);
  470.         deliveryOrderReceiptDto.put("extDocDate", extDocDate);
  471.         deliveryOrderReceiptDto.put("refDocTypeId", InventoryConstants.DOCUMENT_DELIVERY_ORDER);
  472.         deliveryOrderReceiptDto.put("refId", doId);
  473.         deliveryOrderReceiptDto.put("remark", remark);
  474.         deliveryOrderReceiptDto.put("warehouseId", warehouseId);
  475.         deliveryOrderReceiptDto.put("statusDoc", InventoryConstants.DRAFT_TRANSACTION);
  476.         deliveryOrderReceiptDto.put("workflowStatus", InventoryConstants.WORKFLOW_STATUS_DRAFT);
  477.         this.prepareInsertAudit(deliveryOrderReceiptDto, userLoginId, datetime);
  478.         this.prepareUpdateAudit(deliveryOrderReceiptDto, userLoginId, datetime);
  479.        
  480.         inputDto.put("deliveryOrderReceiptDto", deliveryOrderReceiptDto);
  481.         inputDto.put("deliveryOrderReceiptItemList", deliveryOrderReceiptItemList);
  482.         inputDto.put("updateBalanceDeliveryOrderItemList", updateBalanceDeliveryOrderItemList);
  483.        
  484.         return null;
  485.     }
  486.  
  487.     @SuppressWarnings("unchecked")
  488.     @Override
  489.     public Dto process(Dto inputDto, Dto originalDto) throws Exception {
  490.         // prepare add do receipt
  491.         Dto deliveryOrderReceiptDto = inputDto.getDto("deliveryOrderReceiptDto");
  492.         DeliveryOrderReceipt deliveryOrderReceipt = GsonUtil.fromDto(deliveryOrderReceiptDto, DeliveryOrderReceipt.class);
  493.         deliveryOrderReceiptDao.persist(deliveryOrderReceipt);
  494.        
  495.         // prepare add do receipt item
  496.         List<Dto> deliveryOrderReceiptItemList = inputDto.getList("deliveryOrderReceiptItemList");
  497.         for (Dto deliveryOrderReceiptItemDto : deliveryOrderReceiptItemList) {
  498.             deliveryOrderReceiptItemDto.put("doReceiptId", deliveryOrderReceipt.getId());
  499.             DeliveryOrderReceiptItem deliveryOrderReceiptItem = GsonUtil.fromDto(deliveryOrderReceiptItemDto, DeliveryOrderReceiptItem.class);
  500.             deliveryOrderReceiptItemDao.persist(deliveryOrderReceiptItem);
  501.            
  502.             // cek is product has serial number
  503.             if(!deliveryOrderReceiptItemDto.getBoolean("hasSerialNumber")){
  504.                 Dto deliveryOrderReceiptProductDto = deliveryOrderReceiptItemDto.getDto("deliveryOrderReceiptProductDto");
  505.                 deliveryOrderReceiptProductDto.put("doReceiptItemId", deliveryOrderReceiptItem.getId());
  506.                 DeliveryOrderReceiptProduct deliveryOrderReceiptProduct = GsonUtil.fromDto(deliveryOrderReceiptProductDto, DeliveryOrderReceiptProduct.class);
  507.                 deliveryOrderReceiptProductDao.persist(deliveryOrderReceiptProduct);
  508.             }
  509.         }
  510.        
  511.         // prepare update balance do item
  512.         List<Dto> updateBalanceDeliveryOrderItemList = inputDto.getList("updateBalanceDeliveryOrderItemList");
  513.         for (Dto updateBalanceDeliveryOrderItemDto : updateBalanceDeliveryOrderItemList) {
  514.             BalanceDeliveryOrderItem balanceDeliveryOrderItem = GsonUtil.fromDto(updateBalanceDeliveryOrderItemDto, BalanceDeliveryOrderItem.class);
  515.             balanceDeliveryOrderItemDao.merge(balanceDeliveryOrderItem.getDeliveryOrderItemId(), balanceDeliveryOrderItem);
  516.         }
  517.        
  518.        
  519.         // update status sl_so, sl_so_balance_item, sl_so_balance_invoice
  520.         QueryBuilder builder = new QueryBuilder();
  521.         builder.add(" SELECT COALESCE(COUNT(1), 0) FROM sl_update_status_so_for_add_do_receipt(:doId, :userId, :datetime)");
  522.        
  523.         Query q = deliveryOrderReceiptProductDao.createNativeQuery(builder.toString());
  524.         q.setParameter("doId", inputDto.get("doId"));
  525.         q.setParameter("userId", inputDto.get("userLoginId"));
  526.         q.setParameter("datetime", inputDto.get("datetime"));
  527.        
  528.         Object obj = q.getSingleResult();
  529.        
  530.         return new Dto(deliveryOrderReceipt);
  531.     }
  532.    
  533.     private boolean isDtoExistsInList(Dto dto, List<Dto> dtoList, String key){
  534.         for (Dto item : dtoList) {
  535.             if(item.get(key)!=null){
  536.                 if(item.get(key).equals(dto.get(key))){
  537.                     return true;
  538.                 }
  539.             }
  540.         }
  541.        
  542.         return false;
  543.     }
  544. }
  545.  
Advertisement
Add Comment
Please, Sign In to add comment