Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- *
- */
- package org.jleaf.erp.sls.bo.manageso;
- import java.util.ArrayList;
- import java.util.List;
- import org.jleaf.common.ComboIdConstants;
- import org.jleaf.common.CommonExceptionConstants;
- import org.jleaf.core.BusinessFunction;
- import org.jleaf.core.BusinessTransaction;
- import org.jleaf.core.CoreException;
- import org.jleaf.core.DefaultBusinessTransaction;
- import org.jleaf.core.Dto;
- import org.jleaf.core.GeneralConstants;
- import org.jleaf.core.annotation.ErrorList;
- import org.jleaf.core.annotation.Info;
- import org.jleaf.core.annotation.InfoIn;
- import org.jleaf.core.annotation.InfoOut;
- import org.jleaf.erp.sls.SalesConstants;
- import org.jleaf.erp.sls.SalesExceptionConstants;
- import org.jleaf.erp.sls.dao.ManageSalesOrderChangesDao;
- import org.jleaf.erp.sls.dao.ManageSalesOrderDao;
- import org.jleaf.erp.sls.dao.ManageSalesOrderItemDao;
- import org.jleaf.erp.sls.entity.ManageSalesOrder;
- import org.jleaf.erp.sls.entity.ManageSalesOrderChanges;
- import org.jleaf.erp.sls.entity.ManageSalesOrderItem;
- import org.jleaf.util.Calc;
- import org.jleaf.util.GsonUtil;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.stereotype.Service;
- /**
- * Edit Modify Item Sales Order Item
- *
- * @author WTC, Aug 4, 2013
- *
- * Modify by congky 29 Nov 2015
- * perubahan : melaukan pengecekan ke flgDisc, jika N user tidak bisa menginput regular discount,
- * selain itu user boleh melakukan insert regular discount
- */
- /**
- * modified by Adrian
- * Sep 26, 2018
- * Custom untuk Xcom terkait pembulatan
- */
- //@formatter:off
- @Service("editModifyItemSalesOrderItem")
- @InfoIn(value = {
- @Info(name = "id", description = "manage sales order item id", type = Long.class),
- @Info(name = "manageSoId", description = "manage sales order id", type = Long.class),
- @Info(name = "manageSoVersion", description = "manage sales order version", type = Long.class),
- @Info(name = "adjQtySo", description = "adjustment qty po", type = Double.class),
- @Info(name = "grossSellPrice", description = "new gross price", type = Double.class),
- @Info(name = "taxId", description = "new tax id", type = Long.class),
- @Info(name = "flgTaxAmount", description = "new flg tax amount", type = String.class),
- @Info(name = "flgChangeDo", description = "flg change for outstanding receive goods", type = String.class),
- @Info(name = "flgDisc", description = "flag discount", type = String.class),
- @Info(name = "discountAmount", description = "discount amount", type = Double.class),
- @Info(name = "discountPercentage", description = "discount percentage", type = Double.class),
- @Info(name = "version", description = "manage sales order item version", type = Long.class),
- @Info(name = "tenantLoginId", description = "tenant login id", type = Long.class),
- @Info(name = "userLoginId", description = "user login id", type = Long.class),
- @Info(name = "roleLoginId", description = "role login id", type = Long.class),
- @Info(name = "datetime", description = "datetime", type = String.class)
- })
- @InfoOut(value = {
- @Info(name = "id", description = "manage so id", type = Long.class),
- @Info(name = "tenantId", description = "tenant id", type = Long.class),
- @Info(name = "docTypeId", description = "Jenis transaksi", type = Long.class),
- @Info(name = "docNo", description = "No Transaksi", type = String.class),
- @Info(name = "docDate", description = "Tanggal Transaksi", type = String.class),
- @Info(name = "ouId", description = "Organisasi Unit id", type = Long.class),
- @Info(name = "docChangesVersion", description = "versi perubahan dokumen", type = Long.class),
- @Info(name = "soId", description = "sales order id", type = Long.class),
- @Info(name = "remark", description = "remark", type = String.class),
- @Info(name = "statusDoc", description = "status dokumen", type = String.class),
- @Info(name = "workflowStatus", description = "workflow status", type = String.class),
- @Info(name = "version", description = "version", type = Long.class),
- @Info(name = "createDateTime", description = "create date time", type = String.class),
- @Info(name = "createUserId", description = "create user id", type = Long.class),
- @Info(name = "updateDateTime", description = "update date time", type = String.class),
- @Info(name = "updateUserId", description = "update user id", type = Long.class)
- })
- @ErrorList(errorKeys = {
- CommonExceptionConstants.TENANT_LOGIN_CANT_USED,
- CommonExceptionConstants.DATA_CANT_USE_DIFF_TENANT,
- CommonExceptionConstants.DATA_CANT_CHANGE_CAUSE_TENANT,
- SalesExceptionConstants.MANAGE_SALES_ORDER_ID_NOT_FOUND,
- SalesExceptionConstants.DOC_ALREADY_SUBMITTED
- })
- //@formatter:on
- public class EditModifyItemSalesOrderItemForXcom extends DefaultBusinessTransaction implements BusinessTransaction {
- @SuppressWarnings("unused")
- private static final Logger log = LoggerFactory.getLogger(EditModifyItemSalesOrderItemForXcom.class);
- @Autowired
- private ManageSalesOrderDao manageSalesOrderDao;
- @Autowired
- private ManageSalesOrderItemDao manageSalesOrderItemDao;
- @Autowired
- private ManageSalesOrderChangesDao manageSalesOrderChangesDao;
- @Autowired
- @Qualifier("findManageSalesOrderById")
- private BusinessFunction findManageSalesOrderById;
- @Autowired
- @Qualifier("findManageSalesOrderItemById")
- private BusinessFunction findManageSalesOrderItemById;
- @Autowired
- @Qualifier("findManageSalesOrderChangesByIndex")
- private BusinessFunction findManageSalesOrderChangesByIndex;
- @Autowired
- @Qualifier("valTenantLoginCanUse")
- private BusinessFunction valTenantLoginCanUse;
- @Autowired
- @Qualifier("getRoundingParameter")
- private BusinessFunction getRoundingParameter;
- @Autowired
- @Qualifier("findSalesOrderBalanceItemById")
- private BusinessFunction findSalesOrderBalanceItemById;
- @Autowired
- @Qualifier("getDigitDecimalCurrencyByDocType")
- private BusinessFunction getDigitDecimalCurrencyByDocType;
- @Autowired
- @Qualifier("valComboValueByCode")
- private BusinessFunction valComboValueByCode;
- @Autowired
- @Qualifier("calculateAmountFromGrossPriceForXcom")
- private BusinessFunction calculateAmountFromGrossPriceForXcom;
- @Autowired
- @Qualifier("findSalesOrderItemById")
- private BusinessFunction findSalesOrderItemById;
- @Autowired
- @Qualifier("valSoItemNotExistsInInvoiceForModifyItemSo")
- private BusinessFunction valSoItemNotExistsInInvoiceForModifyItemSo;
- @Autowired
- @Qualifier("isSoItemCanBeManagedFromStatusTempSalesInvoice")
- private BusinessFunction isSoItemCanBeManagedFromStatusTempSalesInvoice;
- @Override
- public String getDescription() {
- return "Edit modify item sales order item";
- }
- @SuppressWarnings("unchecked")
- @Override
- public Dto prepare(Dto inputDto, Dto originalDto) throws Exception {
- Long tenantLoginId = inputDto.getLong("tenantLoginId");
- Dto inputDtoForRoundingParameter = new Dto();
- inputDtoForRoundingParameter.put("tenantId", tenantLoginId);
- Dto resultDtoForRoundingParameter = getRoundingParameter.execute(inputDtoForRoundingParameter);
- // int scaleNonTax = resultDtoForRoundingParameter.getInteger("scaleNonTax");
- int roundingModeNonTax = resultDtoForRoundingParameter.getInteger("roundingModeNonTax");
- Long userLoginId = inputDto.getLong("userLoginId");
- Long roleLoginId = inputDto.getLong("roleLoginId");
- String datetime = inputDto.getString("datetime");
- Long id = inputDto.getLong("id");
- Long version = inputDto.getLong("version");
- Long manageSoId = inputDto.getLong("manageSoId");
- Long manageSoVersion = inputDto.getLong("manageSoVersion");
- String flgChangeDo = inputDto.getString("flgChangeDo");
- String flgDisc = inputDto.getString("flgDisc");
- // Validation tenant login id can be use
- Dto loginDto = new Dto();
- loginDto.put("tenantLoginId", tenantLoginId);
- loginDto.put("userLoginId", userLoginId);
- loginDto.put("roleLoginId", roleLoginId);
- valTenantLoginCanUse.execute(loginDto);
- // ITEM TO CHANGE
- Dto manageSalesOrderItemDto = findManageSalesOrderItemById.execute(new Dto().put("id", id));
- Dto soBalanceItemDto = findSalesOrderBalanceItemById.execute(new Dto().put("soItemId", manageSalesOrderItemDto.getLong("soItemId")));
- Dto paramDigitDecimalCurrency = new Dto();
- paramDigitDecimalCurrency.put("tenantId", tenantLoginId);
- paramDigitDecimalCurrency.put("docTypeId", SalesConstants.DOCUMENT_MODIFY_ITEM_SALES_ORDER);
- paramDigitDecimalCurrency.put("currCode", manageSalesOrderItemDto.getString("currCode"));
- Dto resultDigitDecimalCurrency = getDigitDecimalCurrencyByDocType.execute(paramDigitDecimalCurrency);
- Integer decimalForRounding = resultDigitDecimalCurrency.getInteger("digit");
- Calc.rounding(inputDto, decimalForRounding, roundingModeNonTax, "grossSellPrice");
- Double adjQtySo = inputDto.getDouble("adjQtySo");
- Long taxId = inputDto.getLong("taxId");
- String flgTaxAmount = inputDto.getString("flgTaxAmount");
- // bisa ubah taxId dan flgTaxAmount hanya jika belum ada invoice untuk po item tersebut
- Dto poItemDto = findSalesOrderItemById.execute(new Dto().put("id", manageSalesOrderItemDto.getLong("soItemId")));
- if (poItemDto.getLong("taxId").longValue() != taxId.longValue() || !poItemDto.getString("flgTaxAmount").equals(flgTaxAmount)) {
- // validasi apakah sudah dibuat invoice untuk po item id tersebut, jika sudah throw error
- valSoItemNotExistsInInvoiceForModifyItemSo.execute(new Dto().put("tenantId", tenantLoginId).put("soItemId", manageSalesOrderItemDto.getLong("soItemId")));
- }
- Calc ratio = new Calc(soBalanceItemDto.getDouble("qtySo")).divide(soBalanceItemDto.getDouble("qtySoInt"));
- Double adjQtyInt = new Calc(adjQtySo).multiply(ratio).doubleValue();
- // outstanding qty = a.qty_po - a.qty_rcv + a.qty_return - a.qty_cancel + a.qty_add
- Double outstandingQtySo = new Calc(soBalanceItemDto.getDouble("qtySo")).add(soBalanceItemDto.getDouble("qtyAdd")).subtract(soBalanceItemDto.getDouble("qtyCancel"))
- .subtract(soBalanceItemDto.getDouble("qtyDlv")).add(soBalanceItemDto.getDouble("qtyReturn")).doubleValue();
- // bisa lakukan adjustment qty hanya jika PO Item masih ada yg outstanding
- if (adjQtySo.doubleValue() != 0) {
- if (outstandingQtySo.doubleValue() == 0) {
- // item is final, can't adjust qty
- throw new CoreException(SalesExceptionConstants.SO_ITEM_FINAL_CANT_ADJUST_QTY);
- }
- if (soBalanceItemDto.getDouble("qtyCancel").doubleValue() > 0) {
- // item is cancelled, can't adjust qty
- throw new CoreException(SalesExceptionConstants.SO_ITEM_CANCEL_CANT_ADJUST_QTY);
- }
- }
- Double afterAdjQtyPo = new Calc(outstandingQtySo).add(adjQtySo).doubleValue();
- if (afterAdjQtyPo.doubleValue() < 0) {
- throw new CoreException(SalesExceptionConstants.OUTSTANDING_QTY_SO_AFTER_ADJUSTMENT_MUST_GREATER_EQUAL_THAN_ZERO, outstandingQtySo.toString(), adjQtySo.toString());
- }
- // jika sudah dibuat Temporary Sales Invoice, maka harus di DO Receipt dulu
- Dto soItemCanBeManagedDto = isSoItemCanBeManagedFromStatusTempSalesInvoice.execute(new Dto().put("soItemId", manageSalesOrderItemDto.getLong("soItemId")));
- if(!soItemCanBeManagedDto.getBoolean("canManageSoItem")){
- throw new CoreException(SalesExceptionConstants.SO_ITEM_CANT_MANAGED_BECAUSE_OF_ACTIVE_TEMP_SALES_INVOICE, manageSalesOrderItemDto.getLong("lineNo"));
- }
- // validasi flgTaxAmount harus terdaftar di combo yes no
- Dto paramFlagTaxAmountDto = new Dto();
- paramFlagTaxAmountDto.put("comboId", ComboIdConstants.COMBO_YES_NO);
- paramFlagTaxAmountDto.put("code", flgTaxAmount);
- paramFlagTaxAmountDto.put("varName", "Flag Tax Amount");
- valComboValueByCode.execute(paramFlagTaxAmountDto);
- Double grossSellPrice = inputDto.getDouble("grossSellPrice");
- Double discountPercentage = new Double(0);
- Double discountAmount = new Double(0);
- /* USE REGULAR DISCOUNT
- * cek ke flg sebelumnya, jika flg sebelumnya N maka flg tidak boleh di ubah.
- * Notes :
- * jika N maka discountPercentage, discountAmount akan selalu di set 0
- * selain itu maka akan sesuai inputan
- * @Congky
- */
- if (GeneralConstants.NO.equals(manageSalesOrderItemDto.getString("flgDisc"))) {
- flgDisc = GeneralConstants.NO;
- }
- if (flgDisc.equals(SalesConstants.AMOUNT)) {
- discountAmount = inputDto.getDouble("discountAmount");
- } else if (flgDisc.equals(SalesConstants.PERCENTAGE)) {
- discountPercentage = inputDto.getDouble("discountPercentage");
- }
- if(grossSellPrice.doubleValue() < 0){
- throw new CoreException(SalesExceptionConstants.INPUT_MUST_BE_POSITIVE_VALUE, "Gross Sell Price");
- }
- if(discountAmount.doubleValue() < 0){
- throw new CoreException(SalesExceptionConstants.INPUT_MUST_BE_POSITIVE_VALUE, "Discount Amount");
- }
- if(discountPercentage.doubleValue() < 0 || discountPercentage.doubleValue() > 100){
- throw new CoreException(SalesExceptionConstants.DISCOUNT_PERCENTAGE_NOT_VALID);
- }
- Double nettSellPrice = new Double(0);
- Double taxPrice = new Double(0);
- Double grossItemAmount = new Double(0);
- Double nettItemAmount = new Double(0);
- Double taxAmount = new Double(0);
- Double taxPercentage = new Double(0);
- Dto paramCalculatePriceDto = new Dto();
- paramCalculatePriceDto.put("grossPrice", grossSellPrice);
- paramCalculatePriceDto.put("qty", adjQtySo);
- paramCalculatePriceDto.put("flgTaxAmount", flgTaxAmount);
- paramCalculatePriceDto.put("discountPercentage", discountPercentage);
- paramCalculatePriceDto.put("discountAmount", discountAmount);
- paramCalculatePriceDto.put("decimalForRounding", decimalForRounding);
- paramCalculatePriceDto.put("roundingMode", roundingModeNonTax);
- paramCalculatePriceDto.put("taxId", taxId);
- paramCalculatePriceDto.put("flgDisc", flgDisc);
- Dto calculatePriceDto = calculateAmountFromGrossPriceForXcom.execute(paramCalculatePriceDto);
- grossSellPrice = calculatePriceDto.getDouble("grossPrice");
- nettSellPrice = calculatePriceDto.getDouble("nettPrice");
- taxPrice = calculatePriceDto.getDouble("taxPrice");
- grossItemAmount = calculatePriceDto.getDouble("grossAmount");
- nettItemAmount = calculatePriceDto.getDouble("nettAmount");
- taxAmount = calculatePriceDto.getDouble("taxAmount");
- discountPercentage = calculatePriceDto.getDouble("discountPercentage");
- discountAmount = calculatePriceDto.getDouble("discountAmount");
- taxPercentage = calculatePriceDto.getDouble("taxPercentage");
- manageSalesOrderItemDto.put("qtySo", adjQtySo);
- manageSalesOrderItemDto.put("qtyInt", adjQtyInt);
- manageSalesOrderItemDto.put("grossSellPrice", grossSellPrice);
- manageSalesOrderItemDto.put("flgTaxAmount", flgTaxAmount);
- manageSalesOrderItemDto.put("taxId", taxId);
- manageSalesOrderItemDto.put("taxPercentage", taxPercentage);
- manageSalesOrderItemDto.put("taxPrice", taxPrice);
- manageSalesOrderItemDto.put("nettSellPrice", nettSellPrice);
- manageSalesOrderItemDto.put("discountPercentage", discountPercentage);
- manageSalesOrderItemDto.put("discountAmount", discountAmount);
- manageSalesOrderItemDto.put("grossItemAmount", grossItemAmount);
- manageSalesOrderItemDto.put("nettItemAmount", nettItemAmount);
- manageSalesOrderItemDto.put("taxAmount", taxAmount);
- manageSalesOrderItemDto.put("flgChangeDo", flgChangeDo);
- manageSalesOrderItemDto.put("flgDisc", flgDisc);
- manageSalesOrderItemDto.put("version", version);
- prepareUpdateAudit(manageSalesOrderItemDto, userLoginId, datetime);
- inputDto.put("manageSalesOrderItemDto", manageSalesOrderItemDto);
- // END OF ITEM TO CHANGE
- // FIND AND UPDATE HEADER
- // Validation manage sales order must exists and has status DRAFT
- Dto manageSalesOrderDto = findManageSalesOrderById.execute(new Dto().put("id", manageSoId));
- // header version validation
- if (!manageSalesOrderDto.getLong("version").equals(manageSoVersion)) {
- throw new CoreException(SalesExceptionConstants.DOCUMENT_VERSION_NOT_UPTODATE, "Manage Sales Order");
- }
- if (!tenantLoginId.equals(manageSalesOrderDto.getLong("tenantId")))
- throw new CoreException(CommonExceptionConstants.DATA_CANT_CHANGE_CAUSE_TENANT, "Manage Sales Order");
- if (!SalesConstants.DRAFT_TRANSACTION.equals(manageSalesOrderDto.getString("statusDoc")))
- throw new CoreException(SalesExceptionConstants.DOC_ALREADY_SUBMITTED);
- manageSalesOrderDto.put("version", manageSoVersion);
- prepareUpdateAudit(manageSalesOrderDto, userLoginId, datetime);
- inputDto.put("manageSalesOrderDto", manageSalesOrderDto);
- // END OF FIND AND UPDATE HEADER
- // FIND AND UPDATE CHANGES
- Dto paramChangesDto = new Dto();
- paramChangesDto.put("tenantId", tenantLoginId);
- paramChangesDto.put("manageSoId", inputDto.getLong("manageSoId"));
- paramChangesDto.put("lineNo", manageSalesOrderItemDto.getLong("lineNo"));
- Dto manageSalesOrderChangesDto = findManageSalesOrderChangesByIndex.execute(paramChangesDto);
- manageSalesOrderChangesDto.put("newValue", manageSalesOrderItemDto.toString());
- inputDto.put("manageSalesOrderChangesDto", manageSalesOrderChangesDto);
- // END OF FIND AND UPDATE CHANGES
- return null;
- }
- @SuppressWarnings("unchecked")
- @Override
- public Dto process(Dto inputDto, Dto originalDto) throws Exception {
- // Edit Manage Sales Order
- ManageSalesOrder manageSalesOrder = GsonUtil.fromDto(inputDto.getDto("manageSalesOrderDto"), ManageSalesOrder.class);
- manageSalesOrderDao.merge(manageSalesOrder.getId(), manageSalesOrder);
- // Edit Manage Sales Order Item
- ManageSalesOrderItem manageSalesOrderItem = GsonUtil.fromDto(inputDto.getDto("manageSalesOrderItemDto"), ManageSalesOrderItem.class);
- manageSalesOrderItemDao.merge(manageSalesOrderItem.getId(), manageSalesOrderItem);
- ManageSalesOrderChanges manageSalesOrderChanges = GsonUtil.fromDto(inputDto.getDto("manageSalesOrderChangesDto"), ManageSalesOrderChanges.class);
- manageSalesOrderChangesDao.merge(manageSalesOrderChanges.getId(), manageSalesOrderChanges);
- return new Dto().put("id", manageSalesOrder.getId());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement