Skip to content

Commit

Permalink
#1444 Add Cancel Delivery Process
Browse files Browse the repository at this point in the history
  • Loading branch information
cristinamghita committed Jan 26, 2023
1 parent 5c6ec65 commit 0edd9b5
Show file tree
Hide file tree
Showing 5 changed files with 209 additions and 17 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
-- Value: de.metas.deliveryplanning.DeliveryPlanningService.WhithOutReleaseNo
-- 2023-01-26T11:36:13.427Z
INSERT INTO AD_Message (AD_Client_ID,AD_Message_ID,AD_Org_ID,Created,CreatedBy,EntityType,IsActive,MsgText,MsgType,Updated,UpdatedBy,Value) VALUES (0,545231,0,TO_TIMESTAMP('2023-01-26 13:36:13','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','Records do not have a ReleaseNo.','I',TO_TIMESTAMP('2023-01-26 13:36:13','YYYY-MM-DD HH24:MI:SS'),100,'de.metas.deliveryplanning.DeliveryPlanningService.WhithOutReleaseNo')
;

-- 2023-01-26T11:36:13.429Z
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,IsActive) SELECT l.AD_Language, t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,'Y' FROM AD_Language l, AD_Message t WHERE l.IsActive='Y'AND (l.IsSystemLanguage='Y' OR l.IsBaseLanguage='Y') AND t.AD_Message_ID=545231 AND NOT EXISTS (SELECT 1 FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;

-- Value: de.metas.deliveryplanning.DeliveryPlanningService.WhithOutReleaseNo
-- 2023-01-26T11:36:21.352Z
UPDATE AD_Message SET MsgText='The records do not have a ReleaseNo.',Updated=TO_TIMESTAMP('2023-01-26 13:36:21','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Message_ID=545231
;

-- 2023-01-26T11:36:21.353Z
UPDATE AD_Message_Trl trl SET MsgText='The records do not have a ReleaseNo.' WHERE AD_Message_ID=545231 AND AD_Language='de_DE'
;

-- Value: M_Delivery_Planning_CancelDeliveryInstruction
-- Classname: de.metas.deliveryplanning.process.M_Delivery_Planning_CancelDeliveryInstruction
-- 2023-01-26T12:54:35.519Z
INSERT INTO AD_Process (AccessLevel,AD_Client_ID,AD_Org_ID,AD_Process_ID,AllowProcessReRun,Classname,CopyFromProcess,Created,CreatedBy,EntityType,IsActive,IsApplySecuritySettings,IsBetaFunctionality,IsDirectPrint,IsFormatExcelFile,IsNotifyUserAfterExecution,IsOneInstanceOnly,IsReport,IsTranslateExcelHeaders,IsUpdateExportDate,IsUseBPartnerLanguage,LockWaitTimeout,Name,PostgrestResponseFormat,RefreshAllAfterExecution,ShowHelp,SpreadsheetFormat,Type,Updated,UpdatedBy,Value) VALUES ('3',0,0,585195,'Y','de.metas.deliveryplanning.process.M_Delivery_Planning_CancelDeliveryInstruction','N',TO_TIMESTAMP('2023-01-26 14:54:35','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','N','N','N','Y','N','N','N','Y','N','Y',0,'Delivery cancelled','json','Y','N','xls','Java',TO_TIMESTAMP('2023-01-26 14:54:35','YYYY-MM-DD HH24:MI:SS'),100,'M_Delivery_Planning_CancelDeliveryInstruction')
;

-- 2023-01-26T12:54:35.521Z
INSERT INTO AD_Process_Trl (AD_Language,AD_Process_ID, Description,Help,Name, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,IsActive) SELECT l.AD_Language, t.AD_Process_ID, t.Description,t.Help,t.Name, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,'Y' FROM AD_Language l, AD_Process t WHERE l.IsActive='Y'AND (l.IsSystemLanguage='Y' OR l.IsBaseLanguage='Y') AND t.AD_Process_ID=585195 AND NOT EXISTS (SELECT 1 FROM AD_Process_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Process_ID=t.AD_Process_ID)
;

-- Process: M_Delivery_Planning_CancelDeliveryInstruction(de.metas.deliveryplanning.process.M_Delivery_Planning_CancelDeliveryInstruction)
-- Table: M_Delivery_Planning
-- EntityType: D
-- 2023-01-26T12:55:05.556Z
INSERT INTO AD_Table_Process (AD_Client_ID,AD_Org_ID,AD_Process_ID,AD_Table_ID,AD_Table_Process_ID,Created,CreatedBy,EntityType,IsActive,Updated,UpdatedBy,WEBUI_DocumentAction,WEBUI_IncludedTabTopAction,WEBUI_ViewAction,WEBUI_ViewQuickAction,WEBUI_ViewQuickAction_Default) VALUES (0,0,585195,542259,541342,TO_TIMESTAMP('2023-01-26 14:55:05','YYYY-MM-DD HH24:MI:SS'),100,'D','Y',TO_TIMESTAMP('2023-01-26 14:55:05','YYYY-MM-DD HH24:MI:SS'),100,'Y','N','Y','N','N')
;

-- Process: M_Delivery_Planning_CancelDeliveryInstruction(de.metas.deliveryplanning.process.M_Delivery_Planning_CancelDeliveryInstruction)
-- Table: M_Delivery_Planning
-- Window: Lieferplanung(541632,D)
-- EntityType: D
-- 2023-01-26T12:57:31.429Z
UPDATE AD_Table_Process SET AD_Window_ID=541632,Updated=TO_TIMESTAMP('2023-01-26 14:57:31','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Table_Process_ID=541342
;

Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,18 @@
import de.metas.shipping.model.I_M_ShippingPackage;
import de.metas.util.Services;
import lombok.NonNull;
import org.adempiere.ad.dao.ICompositeQueryFilter;
import org.adempiere.ad.dao.IQueryBL;
import org.adempiere.ad.dao.IQueryFilter;
import org.adempiere.warehouse.WarehouseId;
import org.compiere.model.I_M_Delivery_Planning;
import org.compiere.model.I_M_Delivery_Planning_Delivery_Instructions_V;
import org.compiere.model.I_M_Package;
import org.compiere.model.X_M_Delivery_Planning;
import org.compiere.util.TimeUtil;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.stream.Stream;

Expand Down Expand Up @@ -234,6 +237,15 @@ public boolean isExistDeliveryPlanningsWithoutReleaseNo(final IQueryFilter<I_M_D
.anyMatch();
}

public boolean isExistDeliveryPlanningsWithReleaseNo(final IQueryFilter<I_M_Delivery_Planning> selectedDeliveryPlanningsFilter)
{
return queryBL.createQueryBuilder(I_M_Delivery_Planning.class)
.filter(selectedDeliveryPlanningsFilter)
.addNotNull(I_M_Delivery_Planning.COLUMNNAME_ReleaseNo)
.create()
.anyMatch();
}

public I_M_ShipperTransportation generateDeliveryInstruction(@NonNull final DeliveryInstructionCreateRequest request)
{
final I_M_ShipperTransportation deliveryInstructionRecord = newInstance(I_M_ShipperTransportation.class);
Expand Down Expand Up @@ -299,30 +311,18 @@ public I_M_ShipperTransportation generateDeliveryInstruction(@NonNull final Deli
}

public void updateDeliveryPlanningFromInstruction(@NonNull final DeliveryPlanningId deliveryPlanningId,
@NonNull final I_M_ShipperTransportation deliveryInstruction)
@NonNull final I_M_ShipperTransportation deliveryInstruction)
{
final I_M_Delivery_Planning deliveryPlanningRecord = getById(deliveryPlanningId);
deliveryPlanningRecord.setReleaseNo(deliveryInstruction.getDocumentNo());
deliveryPlanningRecord.setM_ShipperTransportation_ID(deliveryInstruction.getM_ShipperTransportation_ID());
saveRecord(deliveryPlanningRecord);
}

public Iterator<I_M_Delivery_Planning> extractDeliveryPlanningsSuitableForDeliveryInstruction(final IQueryFilter<I_M_Delivery_Planning> selectedDeliveryPlanningsFilter)
public Iterator<I_M_Delivery_Planning> extractDeliveryPlannings(final IQueryFilter<I_M_Delivery_Planning> selectedDeliveryPlanningsFilter)
{
return queryBL.createQueryBuilder(I_M_Delivery_Planning.class)
.filter(selectedDeliveryPlanningsFilter)
.addEqualsFilter(I_M_Delivery_Planning.COLUMNNAME_ReleaseNo, null)
.addEqualsFilter(I_M_Delivery_Planning.COLUMNNAME_IsClosed, false)
.create()
.iterate(I_M_Delivery_Planning.class);
}

public Iterator<I_M_Delivery_Planning> extractDeliveryPlanningsSuitableForRegenerateDeliveryInstruction(final IQueryFilter<I_M_Delivery_Planning> selectedDeliveryPlanningsFilter)
{
return queryBL.createQueryBuilder(I_M_Delivery_Planning.class)
.filter(selectedDeliveryPlanningsFilter)
.addNotNull(I_M_Delivery_Planning.COLUMNNAME_ReleaseNo)
.addEqualsFilter(I_M_Delivery_Planning.COLUMNNAME_IsClosed, false)
.create()
.iterate(I_M_Delivery_Planning.class);
}
Expand Down Expand Up @@ -354,4 +354,26 @@ public Iterator<I_M_ShipperTransportation> retrieveForDeliveryPlanning(@NonNull
.create()
.iterate(I_M_ShipperTransportation.class);
}

public void cancelSelectedDeliveryPlannings(final IQueryFilter<I_M_Delivery_Planning> selectedDeliveryPlanningsFilter)
{
final ICompositeQueryFilter<I_M_Delivery_Planning> dpFilter = queryBL
.createCompositeQueryFilter(I_M_Delivery_Planning.class)
.setJoinOr()
.addFilter(selectedDeliveryPlanningsFilter)
.addEqualsFilter(I_M_Delivery_Planning.COLUMNNAME_IsClosed, false);

final Iterator<I_M_Delivery_Planning> deliveryPlanningIterator = extractDeliveryPlannings(dpFilter);

while (deliveryPlanningIterator.hasNext())
{
final I_M_Delivery_Planning deliveryPlanningRecord = deliveryPlanningIterator.next();
deliveryPlanningRecord.setIsClosed(true);
deliveryPlanningRecord.setProcessed(true);
deliveryPlanningRecord.setOrderStatus(X_M_Delivery_Planning.ORDERSTATUS_Canceled);
deliveryPlanningRecord.setPlannedLoadedQuantity(BigDecimal.ZERO);
deliveryPlanningRecord.setPlannedDischargeQuantity(BigDecimal.ZERO);
save(deliveryPlanningRecord);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@
import de.metas.util.Check;
import de.metas.util.Services;
import lombok.NonNull;
import org.adempiere.ad.dao.ICompositeQueryFilter;
import org.adempiere.ad.dao.IQueryBL;
import org.adempiere.ad.dao.IQueryFilter;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.exceptions.DocTypeNotFoundException;
Expand Down Expand Up @@ -85,11 +87,13 @@ public class DeliveryPlanningService

public static final AdMessageKey MSG_M_Delivery_Planning_NoForwarder = AdMessageKey.of("de.metas.deliveryplanning.DeliveryPlanningService.NoForwarder");
public static final AdMessageKey MSG_M_Delivery_Planning_AllHaveReleaseNo = AdMessageKey.of("de.metas.deliveryplanning.DeliveryPlanningService.AllHaveReleaseNo");
public static final AdMessageKey MSG_M_Delivery_Planning_WhithOutReleaseNo = AdMessageKey.of("de.metas.deliveryplanning.DeliveryPlanningService.WhithOutReleaseNo");
private static final String SYSCONFIG_M_Delivery_Planning_CreateAutomatically = "de.metas.deliveryplanning.DeliveryPlanningService.M_Delivery_Planning_CreateAutomatically";

public static final String PARAM_AdditionalLines = "AdditionalLines";

private final ISysConfigBL sysConfigBL = Services.get(ISysConfigBL.class);
private final IQueryBL queryBL = Services.get(IQueryBL.class);
private final IUOMDAO uomDAO = Services.get(IUOMDAO.class);
private final IProductBL productBL = Services.get(IProductBL.class);
private final IShipmentScheduleBL shipmentScheduleBL = Services.get(IShipmentScheduleBL.class);
Expand Down Expand Up @@ -316,6 +320,10 @@ public boolean isExistDeliveryPlanningsWithoutReleaseNo(final IQueryFilter<I_M_D
{
return deliveryPlanningRepository.isExistDeliveryPlanningsWithoutReleaseNo(selectedDeliveryPlanningsFilter);
}
public boolean isExistDeliveryPlanningsWithReleaseNo(final IQueryFilter<I_M_Delivery_Planning> selectedDeliveryPlanningsFilter)
{
return deliveryPlanningRepository.isExistDeliveryPlanningsWithReleaseNo(selectedDeliveryPlanningsFilter);
}

private DeliveryInstructionCreateRequest createDeliveryInstructionRequest(@NonNull final DeliveryPlanningId deliveryPlanningId)
{
Expand Down Expand Up @@ -384,7 +392,14 @@ private DeliveryInstructionCreateRequest createDeliveryInstructionRequest(@NonNu

public void generateDeliveryInstructions(final IQueryFilter<I_M_Delivery_Planning> selectedDeliveryPlanningsFilter)
{
final Iterator<I_M_Delivery_Planning> deliveryPlanningIterator = deliveryPlanningRepository.extractDeliveryPlanningsSuitableForDeliveryInstruction(selectedDeliveryPlanningsFilter);
final ICompositeQueryFilter<I_M_Delivery_Planning> dpFilter = queryBL
.createCompositeQueryFilter(I_M_Delivery_Planning.class)
.setJoinOr()
.addFilter(selectedDeliveryPlanningsFilter)
.addEqualsFilter(I_M_Delivery_Planning.COLUMNNAME_ReleaseNo, null)
.addEqualsFilter(I_M_Delivery_Planning.COLUMNNAME_IsClosed, false);

final Iterator<I_M_Delivery_Planning> deliveryPlanningIterator = deliveryPlanningRepository.extractDeliveryPlannings(dpFilter);
while (deliveryPlanningIterator.hasNext())
{
final I_M_Delivery_Planning deliveryPlanningRecord = deliveryPlanningIterator.next();
Expand All @@ -394,8 +409,14 @@ public void generateDeliveryInstructions(final IQueryFilter<I_M_Delivery_Plannin

public void regenerateDeliveryInstructions(final IQueryFilter<I_M_Delivery_Planning> selectedDeliveryPlanningsFilter)
{
final Iterator<I_M_Delivery_Planning> deliveryPlanningIterator = deliveryPlanningRepository.extractDeliveryPlanningsSuitableForRegenerateDeliveryInstruction(selectedDeliveryPlanningsFilter);

final ICompositeQueryFilter<I_M_Delivery_Planning> dpFilter = queryBL
.createCompositeQueryFilter(I_M_Delivery_Planning.class)
.setJoinOr()
.addFilter(selectedDeliveryPlanningsFilter)
.addNotNull(I_M_Delivery_Planning.COLUMNNAME_ReleaseNo)
.addEqualsFilter(I_M_Delivery_Planning.COLUMNNAME_IsClosed, false);

final Iterator<I_M_Delivery_Planning> deliveryPlanningIterator = deliveryPlanningRepository.extractDeliveryPlannings(dpFilter);
while (deliveryPlanningIterator.hasNext())
{
final I_M_Delivery_Planning deliveryPlanningRecord = deliveryPlanningIterator.next();
Expand All @@ -420,6 +441,31 @@ private void voidLinkedDeliveryInstructions(@NonNull final DeliveryPlanningId de
}
}


public void cancelDelivery(final IQueryFilter<I_M_Delivery_Planning> selectedDeliveryPlanningsFilter)
{
final ICompositeQueryFilter<I_M_Delivery_Planning> dpFilter = queryBL
.createCompositeQueryFilter(I_M_Delivery_Planning.class)
.setJoinOr()
.addFilter(selectedDeliveryPlanningsFilter)
.addNotNull(I_M_Delivery_Planning.COLUMNNAME_ReleaseNo)
.addEqualsFilter(I_M_Delivery_Planning.COLUMNNAME_IsClosed, false);

final Iterator<I_M_Delivery_Planning> deliveryPlanningIterator = deliveryPlanningRepository.extractDeliveryPlannings(selectedDeliveryPlanningsFilter);

while (deliveryPlanningIterator.hasNext())
{
final I_M_Delivery_Planning deliveryPlanningRecord = deliveryPlanningIterator.next();

// first void the existent delivery instructions
final DeliveryPlanningId deliveryPlanningId = DeliveryPlanningId.ofRepoId(deliveryPlanningRecord.getM_Delivery_Planning_ID());
voidLinkedDeliveryInstructions(deliveryPlanningId);

// then cancel delivery planning
deliveryPlanningRepository.cancelSelectedDeliveryPlannings(selectedDeliveryPlanningsFilter);
}
}

public void unlinkDeliveryPlannings(@NonNull final String releaseNo)
{
deliveryPlanningRepository.unlinkDeliveryPlannings(releaseNo);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* #%L
* de.metas.swat.base
* %%
* Copyright (C) 2023 metas GmbH
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-2.0.html>.
* #L%
*/

package de.metas.deliveryplanning.process;

import de.metas.deliveryplanning.DeliveryPlanningService;
import de.metas.process.IProcessPrecondition;
import de.metas.process.IProcessPreconditionsContext;
import de.metas.process.JavaProcess;
import de.metas.process.ProcessPreconditionsResolution;
import lombok.NonNull;
import org.adempiere.ad.dao.ConstantQueryFilter;
import org.adempiere.ad.dao.IQueryFilter;
import org.compiere.SpringContextHolder;
import org.compiere.model.I_M_Delivery_Planning;

public class M_Delivery_Planning_CancelDeliveryInstruction extends JavaProcess implements IProcessPrecondition
{
private final DeliveryPlanningService deliveryPlanningService = SpringContextHolder.instance.getBean(DeliveryPlanningService.class);

public ProcessPreconditionsResolution checkPreconditionsApplicable(@NonNull final IProcessPreconditionsContext context)
{
if (context.isNoSelection())
{
return ProcessPreconditionsResolution.rejectBecauseNoSelection();
}

final IQueryFilter<I_M_Delivery_Planning> selectedDeliveryPlanningsFilter = context.getQueryFilter(I_M_Delivery_Planning.class);

final boolean isExistsOpenDeliveryPlannings = deliveryPlanningService.isExistsOpenDeliveryPlannings(selectedDeliveryPlanningsFilter);

if (!isExistsOpenDeliveryPlannings)
{
return ProcessPreconditionsResolution.reject(msgBL.getTranslatableMsgText(DeliveryPlanningService.MSG_M_Delivery_Planning_AllClosed));
}

final boolean isExistDeliveryPlanningsWithoutReleaseNo = deliveryPlanningService.isExistDeliveryPlanningsWithReleaseNo(selectedDeliveryPlanningsFilter);
if (!isExistDeliveryPlanningsWithoutReleaseNo)
{
return ProcessPreconditionsResolution.reject(msgBL.getTranslatableMsgText(DeliveryPlanningService.MSG_M_Delivery_Planning_WhithOutReleaseNo));
}

return ProcessPreconditionsResolution.accept();
}

@Override
protected String doIt() throws Exception
{
final IQueryFilter<I_M_Delivery_Planning> selectedDeliveryPlanningsFilter = getProcessInfo().getQueryFilterOrElse(ConstantQueryFilter.of(false));

deliveryPlanningService.cancelDelivery(selectedDeliveryPlanningsFilter);

return MSG_OK;

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ public ProcessPreconditionsResolution checkPreconditionsApplicable(@NonNull fina
return ProcessPreconditionsResolution.reject(msgBL.getTranslatableMsgText(DeliveryPlanningService.MSG_M_Delivery_Planning_AllClosed));
}

final boolean isExistDeliveryPlanningsWithoutReleaseNo = deliveryPlanningService.isExistDeliveryPlanningsWithReleaseNo(selectedDeliveryPlanningsFilter);
if (!isExistDeliveryPlanningsWithoutReleaseNo)
{
return ProcessPreconditionsResolution.reject(msgBL.getTranslatableMsgText(DeliveryPlanningService.MSG_M_Delivery_Planning_WhithOutReleaseNo));
}

return ProcessPreconditionsResolution.accept();
}

Expand Down

0 comments on commit 0edd9b5

Please sign in to comment.