Advertisement
aadddrr

EditModifyItemSalesOrderItemForXcom

Sep 26th, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 18.00 KB | None | 0 0
  1. /**
  2.  *
  3.  */
  4. package org.jleaf.erp.sls.bo.manageso;
  5.  
  6. import java.util.ArrayList;
  7. import java.util.List;
  8.  
  9. import org.jleaf.common.ComboIdConstants;
  10. import org.jleaf.common.CommonExceptionConstants;
  11. import org.jleaf.core.BusinessFunction;
  12. import org.jleaf.core.BusinessTransaction;
  13. import org.jleaf.core.CoreException;
  14. import org.jleaf.core.DefaultBusinessTransaction;
  15. import org.jleaf.core.Dto;
  16. import org.jleaf.core.GeneralConstants;
  17. import org.jleaf.core.annotation.ErrorList;
  18. import org.jleaf.core.annotation.Info;
  19. import org.jleaf.core.annotation.InfoIn;
  20. import org.jleaf.core.annotation.InfoOut;
  21. import org.jleaf.erp.sls.SalesConstants;
  22. import org.jleaf.erp.sls.SalesExceptionConstants;
  23. import org.jleaf.erp.sls.dao.ManageSalesOrderChangesDao;
  24. import org.jleaf.erp.sls.dao.ManageSalesOrderDao;
  25. import org.jleaf.erp.sls.dao.ManageSalesOrderItemDao;
  26. import org.jleaf.erp.sls.entity.ManageSalesOrder;
  27. import org.jleaf.erp.sls.entity.ManageSalesOrderChanges;
  28. import org.jleaf.erp.sls.entity.ManageSalesOrderItem;
  29. import org.jleaf.util.Calc;
  30. import org.jleaf.util.GsonUtil;
  31. import org.slf4j.Logger;
  32. import org.slf4j.LoggerFactory;
  33. import org.springframework.beans.factory.annotation.Autowired;
  34. import org.springframework.beans.factory.annotation.Qualifier;
  35. import org.springframework.stereotype.Service;
  36.  
  37. /**
  38.  * Edit Modify Item Sales Order Item
  39.  *
  40.  * @author WTC, Aug 4, 2013
  41.  *
  42.  * Modify by congky 29 Nov 2015
  43.  * perubahan : melaukan pengecekan ke flgDisc, jika N user tidak bisa menginput regular discount,
  44.  * selain itu user boleh melakukan insert regular discount
  45.  */
  46. /**
  47.  * modified by Adrian
  48.  * Sep 26, 2018
  49.  * Custom untuk Xcom terkait pembulatan
  50.  */
  51. //@formatter:off
  52. @Service("editModifyItemSalesOrderItem")
  53. @InfoIn(value = {
  54.         @Info(name = "id", description = "manage sales order item id", type = Long.class),
  55.         @Info(name = "manageSoId", description = "manage sales order id", type = Long.class),
  56.         @Info(name = "manageSoVersion", description = "manage sales order version", type = Long.class),
  57.         @Info(name = "adjQtySo", description = "adjustment qty po", type = Double.class),
  58.         @Info(name = "grossSellPrice", description = "new gross price", type = Double.class),
  59.         @Info(name = "taxId", description = "new tax id", type = Long.class),
  60.         @Info(name = "flgTaxAmount", description = "new flg tax amount", type = String.class),
  61.         @Info(name = "flgChangeDo", description = "flg change for outstanding receive goods", type = String.class),
  62.         @Info(name = "flgDisc", description = "flag discount", type = String.class),
  63.         @Info(name = "discountAmount", description = "discount amount", type = Double.class),
  64.         @Info(name = "discountPercentage", description = "discount percentage", type = Double.class),
  65.         @Info(name = "version", description = "manage sales order item version", type = Long.class),
  66.         @Info(name = "tenantLoginId", description = "tenant login id", type = Long.class),
  67.         @Info(name = "userLoginId", description = "user login id", type = Long.class),
  68.         @Info(name = "roleLoginId", description = "role login id", type = Long.class),
  69.         @Info(name = "datetime", description = "datetime", type = String.class)
  70. })
  71. @InfoOut(value = {
  72.         @Info(name = "id", description = "manage so id", type = Long.class),
  73.         @Info(name = "tenantId", description = "tenant id", type = Long.class),
  74.         @Info(name = "docTypeId", description = "Jenis transaksi", type = Long.class),
  75.         @Info(name = "docNo", description = "No Transaksi", type = String.class),
  76.         @Info(name = "docDate", description = "Tanggal Transaksi", type = String.class),
  77.         @Info(name = "ouId", description = "Organisasi Unit id", type = Long.class),
  78.         @Info(name = "docChangesVersion", description = "versi perubahan dokumen", type = Long.class),
  79.         @Info(name = "soId", description = "sales order id", type = Long.class),
  80.         @Info(name = "remark", description = "remark", type = String.class),
  81.         @Info(name = "statusDoc", description = "status dokumen", type = String.class),
  82.         @Info(name = "workflowStatus", description = "workflow status", type = String.class),
  83.         @Info(name = "version", description = "version", type = Long.class),
  84.         @Info(name = "createDateTime", description = "create date time", type = String.class),
  85.         @Info(name = "createUserId", description = "create user id", type = Long.class),
  86.         @Info(name = "updateDateTime", description = "update date time", type = String.class),
  87.         @Info(name = "updateUserId", description = "update user id", type = Long.class)
  88. })
  89. @ErrorList(errorKeys = {
  90.         CommonExceptionConstants.TENANT_LOGIN_CANT_USED,
  91.         CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
  92.         CommonExceptionConstants.DATA_CANT_CHANGE_CAUSE_TENANT,
  93.         SalesExceptionConstants.MANAGE_SALES_ORDER_ID_NOT_FOUND,
  94.         SalesExceptionConstants.DOC_ALREADY_SUBMITTED
  95. })
  96. //@formatter:on
  97. public class EditModifyItemSalesOrderItemForXcom extends DefaultBusinessTransaction implements BusinessTransaction {
  98.  
  99.     @SuppressWarnings("unused")
  100.     private static final Logger log = LoggerFactory.getLogger(EditModifyItemSalesOrderItemForXcom.class);
  101.  
  102.     @Autowired
  103.     private ManageSalesOrderDao manageSalesOrderDao;
  104.    
  105.     @Autowired
  106.     private ManageSalesOrderItemDao manageSalesOrderItemDao;
  107.  
  108.     @Autowired
  109.     private ManageSalesOrderChangesDao manageSalesOrderChangesDao;
  110.    
  111.     @Autowired
  112.     @Qualifier("findManageSalesOrderById")
  113.     private BusinessFunction findManageSalesOrderById;
  114.    
  115.     @Autowired
  116.     @Qualifier("findManageSalesOrderItemById")
  117.     private BusinessFunction findManageSalesOrderItemById;
  118.    
  119.     @Autowired
  120.     @Qualifier("findManageSalesOrderChangesByIndex")
  121.     private BusinessFunction findManageSalesOrderChangesByIndex;
  122.  
  123.     @Autowired
  124.     @Qualifier("valTenantLoginCanUse")
  125.     private BusinessFunction valTenantLoginCanUse;
  126.    
  127.     @Autowired
  128.     @Qualifier("getRoundingParameter")
  129.     private BusinessFunction getRoundingParameter;
  130.    
  131.     @Autowired
  132.     @Qualifier("findSalesOrderBalanceItemById")
  133.     private BusinessFunction findSalesOrderBalanceItemById;
  134.    
  135.     @Autowired
  136.     @Qualifier("getDigitDecimalCurrencyByDocType")
  137.     private BusinessFunction getDigitDecimalCurrencyByDocType;
  138.    
  139.     @Autowired
  140.     @Qualifier("valComboValueByCode")
  141.     private BusinessFunction valComboValueByCode;
  142.    
  143.     @Autowired
  144.     @Qualifier("calculateAmountFromGrossPriceForXcom")
  145.     private BusinessFunction calculateAmountFromGrossPriceForXcom;
  146.    
  147.     @Autowired
  148.     @Qualifier("findSalesOrderItemById")
  149.     private BusinessFunction findSalesOrderItemById;
  150.    
  151.     @Autowired
  152.     @Qualifier("valSoItemNotExistsInInvoiceForModifyItemSo")
  153.     private BusinessFunction valSoItemNotExistsInInvoiceForModifyItemSo;
  154.    
  155.     @Autowired
  156.     @Qualifier("isSoItemCanBeManagedFromStatusTempSalesInvoice")
  157.     private BusinessFunction isSoItemCanBeManagedFromStatusTempSalesInvoice;
  158.    
  159.     @Override
  160.     public String getDescription() {
  161.         return "Edit modify item sales order item";
  162.     }
  163.  
  164.     @SuppressWarnings("unchecked")
  165.     @Override
  166.     public Dto prepare(Dto inputDto, Dto originalDto) throws Exception {
  167.         Long tenantLoginId = inputDto.getLong("tenantLoginId");
  168.        
  169.         Dto inputDtoForRoundingParameter = new Dto();
  170.         inputDtoForRoundingParameter.put("tenantId", tenantLoginId);
  171.         Dto resultDtoForRoundingParameter = getRoundingParameter.execute(inputDtoForRoundingParameter);
  172.        
  173.        
  174.         // int scaleNonTax = resultDtoForRoundingParameter.getInteger("scaleNonTax");
  175.         int roundingModeNonTax = resultDtoForRoundingParameter.getInteger("roundingModeNonTax");
  176.        
  177.         Long userLoginId = inputDto.getLong("userLoginId");
  178.         Long roleLoginId = inputDto.getLong("roleLoginId");
  179.         String datetime = inputDto.getString("datetime");
  180.         Long id = inputDto.getLong("id");
  181.         Long version = inputDto.getLong("version");
  182.         Long manageSoId = inputDto.getLong("manageSoId");
  183.         Long manageSoVersion = inputDto.getLong("manageSoVersion");
  184.         String flgChangeDo = inputDto.getString("flgChangeDo");
  185.         String flgDisc = inputDto.getString("flgDisc");
  186.        
  187.         // Validation tenant login id can be use
  188.         Dto loginDto = new Dto();
  189.         loginDto.put("tenantLoginId", tenantLoginId);
  190.         loginDto.put("userLoginId", userLoginId);
  191.         loginDto.put("roleLoginId", roleLoginId);
  192.         valTenantLoginCanUse.execute(loginDto);
  193.        
  194.         // ITEM TO CHANGE
  195.         Dto manageSalesOrderItemDto = findManageSalesOrderItemById.execute(new Dto().put("id", id));
  196.         Dto soBalanceItemDto = findSalesOrderBalanceItemById.execute(new Dto().put("soItemId", manageSalesOrderItemDto.getLong("soItemId")));
  197.        
  198.         Dto paramDigitDecimalCurrency = new Dto();
  199.         paramDigitDecimalCurrency.put("tenantId", tenantLoginId);
  200.         paramDigitDecimalCurrency.put("docTypeId", SalesConstants.DOCUMENT_MODIFY_ITEM_SALES_ORDER);
  201.         paramDigitDecimalCurrency.put("currCode", manageSalesOrderItemDto.getString("currCode"));
  202.         Dto resultDigitDecimalCurrency = getDigitDecimalCurrencyByDocType.execute(paramDigitDecimalCurrency);
  203.        
  204.         Integer decimalForRounding = resultDigitDecimalCurrency.getInteger("digit");
  205.        
  206.         Calc.rounding(inputDto, decimalForRounding, roundingModeNonTax, "grossSellPrice");
  207.         Double adjQtySo = inputDto.getDouble("adjQtySo");
  208.         Long taxId = inputDto.getLong("taxId");
  209.         String flgTaxAmount = inputDto.getString("flgTaxAmount");
  210.        
  211.         // bisa ubah taxId dan flgTaxAmount hanya jika belum ada invoice untuk po item tersebut
  212.         Dto poItemDto = findSalesOrderItemById.execute(new Dto().put("id", manageSalesOrderItemDto.getLong("soItemId")));
  213.        
  214.         if (poItemDto.getLong("taxId").longValue() != taxId.longValue() || !poItemDto.getString("flgTaxAmount").equals(flgTaxAmount)) {
  215.             // validasi apakah sudah dibuat invoice untuk po item id tersebut, jika sudah throw error
  216.             valSoItemNotExistsInInvoiceForModifyItemSo.execute(new Dto().put("tenantId", tenantLoginId).put("soItemId", manageSalesOrderItemDto.getLong("soItemId")));
  217.         }
  218.        
  219.         Calc ratio = new Calc(soBalanceItemDto.getDouble("qtySo")).divide(soBalanceItemDto.getDouble("qtySoInt"));
  220.         Double adjQtyInt = new Calc(adjQtySo).multiply(ratio).doubleValue();
  221. //      outstanding qty = a.qty_po - a.qty_rcv + a.qty_return - a.qty_cancel + a.qty_add
  222.         Double outstandingQtySo = new Calc(soBalanceItemDto.getDouble("qtySo")).add(soBalanceItemDto.getDouble("qtyAdd")).subtract(soBalanceItemDto.getDouble("qtyCancel"))
  223.                 .subtract(soBalanceItemDto.getDouble("qtyDlv")).add(soBalanceItemDto.getDouble("qtyReturn")).doubleValue();
  224.        
  225.         // bisa lakukan adjustment qty hanya jika PO Item masih ada yg outstanding
  226.         if (adjQtySo.doubleValue() != 0) {
  227.             if (outstandingQtySo.doubleValue() == 0) {
  228.                 // item is final, can't adjust qty
  229.                 throw new CoreException(SalesExceptionConstants.SO_ITEM_FINAL_CANT_ADJUST_QTY);
  230.             }
  231.            
  232.             if (soBalanceItemDto.getDouble("qtyCancel").doubleValue() > 0) {
  233.                 // item is cancelled, can't adjust qty
  234.                 throw new CoreException(SalesExceptionConstants.SO_ITEM_CANCEL_CANT_ADJUST_QTY);
  235.             }
  236.         }
  237.        
  238.         Double afterAdjQtyPo = new Calc(outstandingQtySo).add(adjQtySo).doubleValue();
  239.         if (afterAdjQtyPo.doubleValue() < 0) {
  240.             throw new CoreException(SalesExceptionConstants.OUTSTANDING_QTY_SO_AFTER_ADJUSTMENT_MUST_GREATER_EQUAL_THAN_ZERO, outstandingQtySo.toString(), adjQtySo.toString());
  241.         }
  242.        
  243.         // jika sudah dibuat Temporary Sales Invoice, maka harus di DO Receipt dulu
  244.         Dto soItemCanBeManagedDto = isSoItemCanBeManagedFromStatusTempSalesInvoice.execute(new Dto().put("soItemId", manageSalesOrderItemDto.getLong("soItemId")));
  245.         if(!soItemCanBeManagedDto.getBoolean("canManageSoItem")){
  246.             throw new CoreException(SalesExceptionConstants.SO_ITEM_CANT_MANAGED_BECAUSE_OF_ACTIVE_TEMP_SALES_INVOICE, manageSalesOrderItemDto.getLong("lineNo"));
  247.         }
  248.                
  249.         // validasi flgTaxAmount harus terdaftar di combo yes no
  250.         Dto paramFlagTaxAmountDto = new Dto();
  251.         paramFlagTaxAmountDto.put("comboId", ComboIdConstants.COMBO_YES_NO);
  252.         paramFlagTaxAmountDto.put("code", flgTaxAmount);
  253.         paramFlagTaxAmountDto.put("varName", "Flag Tax Amount");
  254.         valComboValueByCode.execute(paramFlagTaxAmountDto);
  255.  
  256.         Double grossSellPrice = inputDto.getDouble("grossSellPrice");
  257.         Double discountPercentage = new Double(0);
  258.         Double discountAmount = new Double(0);
  259.        
  260.         /* USE REGULAR DISCOUNT
  261.          * cek ke flg sebelumnya, jika flg sebelumnya N maka flg tidak boleh di ubah.
  262.          * Notes :
  263.          * jika N maka discountPercentage, discountAmount akan selalu di set 0
  264.          * selain itu maka akan sesuai inputan
  265.          * @Congky
  266.          */
  267.         if (GeneralConstants.NO.equals(manageSalesOrderItemDto.getString("flgDisc"))) {
  268.             flgDisc = GeneralConstants.NO;
  269.         }
  270.        
  271.         if (flgDisc.equals(SalesConstants.AMOUNT)) {
  272.             discountAmount = inputDto.getDouble("discountAmount");
  273.         } else if (flgDisc.equals(SalesConstants.PERCENTAGE)) {
  274.             discountPercentage = inputDto.getDouble("discountPercentage");
  275.         }
  276.        
  277.         if(grossSellPrice.doubleValue() < 0){
  278.             throw new CoreException(SalesExceptionConstants.INPUT_MUST_BE_POSITIVE_VALUE, "Gross Sell Price");
  279.         }
  280.        
  281.         if(discountAmount.doubleValue() < 0){
  282.             throw new CoreException(SalesExceptionConstants.INPUT_MUST_BE_POSITIVE_VALUE, "Discount Amount");
  283.         }
  284.        
  285.         if(discountPercentage.doubleValue() < 0 || discountPercentage.doubleValue() > 100){
  286.             throw new CoreException(SalesExceptionConstants.DISCOUNT_PERCENTAGE_NOT_VALID);
  287.         }
  288.        
  289.         Double nettSellPrice = new Double(0);
  290.         Double taxPrice  = new Double(0);
  291.         Double grossItemAmount  = new Double(0);
  292.         Double nettItemAmount  = new Double(0);
  293.         Double taxAmount  = new Double(0);
  294.         Double taxPercentage  = new Double(0);
  295.        
  296.         Dto paramCalculatePriceDto = new Dto();
  297.         paramCalculatePriceDto.put("grossPrice", grossSellPrice);
  298.         paramCalculatePriceDto.put("qty", adjQtySo);
  299.         paramCalculatePriceDto.put("flgTaxAmount", flgTaxAmount);
  300.         paramCalculatePriceDto.put("discountPercentage", discountPercentage);
  301.         paramCalculatePriceDto.put("discountAmount", discountAmount);
  302.         paramCalculatePriceDto.put("decimalForRounding", decimalForRounding);
  303.         paramCalculatePriceDto.put("roundingMode", roundingModeNonTax);
  304.         paramCalculatePriceDto.put("taxId", taxId);
  305.         paramCalculatePriceDto.put("flgDisc", flgDisc);
  306.        
  307.         Dto calculatePriceDto = calculateAmountFromGrossPriceForXcom.execute(paramCalculatePriceDto);
  308.    
  309.         grossSellPrice = calculatePriceDto.getDouble("grossPrice");
  310.         nettSellPrice = calculatePriceDto.getDouble("nettPrice");
  311.         taxPrice = calculatePriceDto.getDouble("taxPrice");
  312.         grossItemAmount = calculatePriceDto.getDouble("grossAmount");
  313.         nettItemAmount = calculatePriceDto.getDouble("nettAmount");
  314.         taxAmount = calculatePriceDto.getDouble("taxAmount");
  315.         discountPercentage = calculatePriceDto.getDouble("discountPercentage");
  316.         discountAmount = calculatePriceDto.getDouble("discountAmount");
  317.         taxPercentage = calculatePriceDto.getDouble("taxPercentage");
  318.        
  319.         manageSalesOrderItemDto.put("qtySo", adjQtySo);
  320.         manageSalesOrderItemDto.put("qtyInt", adjQtyInt);
  321.         manageSalesOrderItemDto.put("grossSellPrice", grossSellPrice);
  322.         manageSalesOrderItemDto.put("flgTaxAmount", flgTaxAmount);
  323.         manageSalesOrderItemDto.put("taxId", taxId);
  324.         manageSalesOrderItemDto.put("taxPercentage", taxPercentage);
  325.         manageSalesOrderItemDto.put("taxPrice", taxPrice);
  326.         manageSalesOrderItemDto.put("nettSellPrice", nettSellPrice);
  327.         manageSalesOrderItemDto.put("discountPercentage", discountPercentage);
  328.         manageSalesOrderItemDto.put("discountAmount", discountAmount);
  329.         manageSalesOrderItemDto.put("grossItemAmount", grossItemAmount);
  330.         manageSalesOrderItemDto.put("nettItemAmount", nettItemAmount);
  331.         manageSalesOrderItemDto.put("taxAmount", taxAmount);
  332.         manageSalesOrderItemDto.put("flgChangeDo", flgChangeDo);
  333.         manageSalesOrderItemDto.put("flgDisc", flgDisc);
  334.         manageSalesOrderItemDto.put("version", version);
  335.         prepareUpdateAudit(manageSalesOrderItemDto, userLoginId, datetime);
  336.        
  337.         inputDto.put("manageSalesOrderItemDto", manageSalesOrderItemDto);
  338.         // END OF ITEM TO CHANGE
  339.        
  340.         // FIND AND UPDATE HEADER
  341.         // Validation manage sales order must exists and has status DRAFT
  342.         Dto manageSalesOrderDto = findManageSalesOrderById.execute(new Dto().put("id", manageSoId));
  343.        
  344.         // header version validation
  345.         if (!manageSalesOrderDto.getLong("version").equals(manageSoVersion)) {
  346.             throw new CoreException(SalesExceptionConstants.DOCUMENT_VERSION_NOT_UPTODATE, "Manage Sales Order");
  347.         }
  348.        
  349.         if (!tenantLoginId.equals(manageSalesOrderDto.getLong("tenantId")))
  350.             throw new CoreException(CommonExceptionConstants.DATA_CANT_CHANGE_CAUSE_TENANT, "Manage Sales Order");
  351.        
  352.         if (!SalesConstants.DRAFT_TRANSACTION.equals(manageSalesOrderDto.getString("statusDoc")))
  353.             throw new CoreException(SalesExceptionConstants.DOC_ALREADY_SUBMITTED);
  354.  
  355.         manageSalesOrderDto.put("version", manageSoVersion);
  356.         prepareUpdateAudit(manageSalesOrderDto, userLoginId, datetime);
  357.        
  358.         inputDto.put("manageSalesOrderDto", manageSalesOrderDto);
  359.         // END OF FIND AND UPDATE HEADER
  360.        
  361.         // FIND AND UPDATE CHANGES
  362.        
  363.         Dto paramChangesDto = new Dto();
  364.         paramChangesDto.put("tenantId", tenantLoginId);
  365.         paramChangesDto.put("manageSoId", inputDto.getLong("manageSoId"));
  366.         paramChangesDto.put("lineNo", manageSalesOrderItemDto.getLong("lineNo"));
  367.         Dto manageSalesOrderChangesDto = findManageSalesOrderChangesByIndex.execute(paramChangesDto);
  368.         manageSalesOrderChangesDto.put("newValue", manageSalesOrderItemDto.toString());
  369.        
  370.         inputDto.put("manageSalesOrderChangesDto", manageSalesOrderChangesDto);
  371.        
  372.         // END OF FIND AND UPDATE CHANGES
  373.        
  374.         return null;
  375.     }
  376.  
  377.     @SuppressWarnings("unchecked")
  378.     @Override
  379.     public Dto process(Dto inputDto, Dto originalDto) throws Exception {
  380.         // Edit Manage Sales Order
  381.         ManageSalesOrder manageSalesOrder = GsonUtil.fromDto(inputDto.getDto("manageSalesOrderDto"), ManageSalesOrder.class);
  382.         manageSalesOrderDao.merge(manageSalesOrder.getId(), manageSalesOrder);
  383.        
  384.         // Edit Manage Sales Order Item
  385.         ManageSalesOrderItem manageSalesOrderItem = GsonUtil.fromDto(inputDto.getDto("manageSalesOrderItemDto"), ManageSalesOrderItem.class);
  386.         manageSalesOrderItemDao.merge(manageSalesOrderItem.getId(), manageSalesOrderItem);
  387.        
  388.         ManageSalesOrderChanges manageSalesOrderChanges = GsonUtil.fromDto(inputDto.getDto("manageSalesOrderChangesDto"), ManageSalesOrderChanges.class);
  389.         manageSalesOrderChangesDao.merge(manageSalesOrderChanges.getId(), manageSalesOrderChanges);
  390.        
  391.         return new Dto().put("id", manageSalesOrder.getId());
  392.     }
  393. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement