Question

New Screen Workflow

  • 26 January 2022
  • 2 replies
  • 145 views

I’ve made a screen and I need help with creating a workflow. I’ve copied the Opportunities workflow from 2020 R2 and repurposed it for my new screen. There isn’t any errors also. The workflow shows up when I go to the screen but the actions aren’t enabled in the screen. Any help would be great.

 

 

using PX.Common;
using PX.Data;
using PX.Data.BQL;
using PX.Data.WorkflowAPI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MS;
using PX.Objects.CR;
using PX.Objects.CR.MassProcess;
using PX.Objects.CR.Workflows;

namespace MS.Workflows
{
using static PX.Data.WorkflowAPI.BoundedTo<MSMaint, MSOrder>;
public class MSOrderWorkflow : PX.Data.PXGraphExtension<MSMaint>
{
// workflow works without checking active
public static bool IsActive() => false;

#region Consts

public static class States
{
public const string New = "N";
public const string Open = "O";
public const string Hold = "H";
public const string Completed = "C";

internal class ListAttribute : PXStringListAttribute
{
public ListAttribute()
: base(
new[]
{
New,
Open,
Hold,
Completed,
},
new[]
{
"New",
"Open",
"Hold",
"Completed",
}
)
{ }
}
}

private const string
_fieldStatus = "Status",

_formOpen = "FormOpen",
_formHold = "FormHold",
_formCompleted = "FormCompleted",

_actionOpen = "Open",
_actionHold = "Hold",
_actionCompleted = "Completed";

#endregion

public override void Configure(PXScreenConfiguration config)
{
var context = config.GetScreenConfigurationContext<MSMaint, MSOrder>();

#region forms

var formOpen = context.Forms.Create(_formOpen, form => form
.Prompt("Details")
.WithFields(fields =>
{
AddStatusFormField(fields, _actionOpen);
}));

var formHold = context.Forms.Create(_formHold, form => form
.Prompt("Details")
.WithFields(fields =>
{
AddStatusFormField(fields, _actionHold);
}));

var formCompleted = context.Forms.Create(_formCompleted, form => form
.Prompt("Details")
.WithFields(fields =>
{
AddStatusFormField(fields, _actionCompleted);
}));

void AddStatusFormField(FormField.IContainerFillerFields filler, string defaultValue, params string[] values)
{
filler.Add(_fieldStatus, field => field
.WithSchemaOf<MSOrder.status>()
.IsRequired()
.Prompt("Status")
.DefaultValue(defaultValue)
.OnlyComboBoxValues(values));
}

#endregion

var actionOpen = context.ActionDefinitions.CreateNew(_actionOpen, action => action
.WithFieldAssignments(fields =>
{
fields.Add<MSOrder.status>(f => f.SetFromFormField(formOpen, _actionOpen));
fields.Add<MSOrder.isActive>(f => f.SetFromValue(true));
})
.DisplayName("Open")
.WithForm(formOpen)
.WithPersistOptions(ActionPersistOptions.ForcePersist));

var actionHold = context.ActionDefinitions.CreateNew(_actionHold, action => action
.WithFieldAssignments(fields =>
{
fields.Add<MSOrder.status>(f => f.SetFromFormField(formHold, _actionHold));
fields.Add<MSOrder.isActive>(f => f.SetFromValue(true));
})
.DisplayName("Hold")
.WithForm(formHold)
.WithPersistOptions(ActionPersistOptions.ForcePersist));

var actionCompleted = context.ActionDefinitions.CreateNew(_actionCompleted, action => action
.WithFieldAssignments(fields =>
{
fields.Add<MSOrder.status>(f => f.SetFromFormField(formCompleted, _actionCompleted));
fields.Add<MSOrder.isActive>(f => f.SetFromValue(true));
})
.DisplayName("Completed")
.WithForm(formCompleted)
.WithPersistOptions(ActionPersistOptions.ForcePersist));

context.AddScreenConfigurationFor(screen =>
{
return screen
.StateIdentifierIs<MSOrder.status>()
.AddDefaultFlow(MSOrderWorkflow)
.WithActions(actions =>
{
actions.Add(actionOpen);
actions.Add(actionHold);
actions.Add(actionCompleted);
})
.WithForms(forms =>
{
forms.Add(formOpen);
forms.Add(formHold);
forms.Add(formCompleted);
})
.WithFieldStates(fields =>
{

fields.Add<MSOrder.status>(field => field
.SetComboValues(
(States.Open, "Open"),
(States.Hold, "Hold"),
(States.Completed, "Completed")));
});
});

Workflow.IConfigured MSOrderWorkflow(Workflow.INeedStatesFlow flow)
{
#region states

var newState = context.FlowStates.Create(States.New, state => state
.IsInitial()
.WithFieldStates(fields =>
{
fields.AddField<MSOrder.status>(field =>
field.DefaultValue(States.Open).ComboBoxValues(States.Open));

})
.WithActions(actions =>
{
AddOpenAction(actions, isDuplicationInToolbar: true);
AddWonAction(actions, isDuplicationInToolbar: true);
AddLostAction(actions, isDuplicationInToolbar: true);
}));

var openState = context.FlowStates.Create(States.Open, state => state
.WithFieldStates(fields =>
{
fields.AddField<MSOrder.status>(field =>
field.ComboBoxValues(States.Open));

})
.WithActions(actions =>
{
AddWonAction(actions, isDuplicationInToolbar: true);
AddLostAction(actions, isDuplicationInToolbar: true);
}));

var holdState = context.FlowStates.Create(States.Hold, state => state
.WithFieldStates(fields =>
{
fields.AddField<MSOrder.status>(field => field
.ComboBoxValues(States.Hold)
.IsDisabled());

DisableFieldsForFinalStates(fields);
})
.WithActions(actions =>
{
AddOpenAction(actions, isDuplicationInToolbar: true);
}));

var completedState = context.FlowStates.Create(States.Completed, state => state
.WithFieldStates(fields =>
{
fields.AddField<MSOrder.status>(field => field
.ComboBoxValues(States.Completed)
.IsDisabled());

})
.WithActions(actions =>
{
AddOpenAction(actions, isDuplicationInToolbar: true);
}));

#endregion

return flow
.WithFlowStates(states =>
{
states.Add(newState);
states.Add(openState);
states.Add(holdState);
states.Add(completedState);
})
.WithTransitions(transitions =>
{
transitions.Add(transition => transition
.From(newState)
.To(openState)
.IsTriggeredOn(actionOpen));

transitions.Add(transition => transition
.From(newState)
.To(holdState)
.IsTriggeredOn(actionHold));

transitions.Add(transition => transition
.From(newState)
.To(completedState)
.IsTriggeredOn(actionCompleted));

transitions.Add(transition => transition
.From(openState)
.To(holdState)
.IsTriggeredOn(actionHold));

transitions.Add(transition => transition
.From(openState)
.To(completedState)
.IsTriggeredOn(actionCompleted));

transitions.Add(transition => transition
.From(holdState)
.To(openState)
.IsTriggeredOn(actionOpen));

transitions.Add(transition => transition
.From(completedState)
.To(openState)
.IsTriggeredOn(actionOpen));
});

void AddOpenAction(ActionState.IContainerFillerActions filler, bool isDuplicationInToolbar = false)
{
filler.Add(actionOpen, a => a

.IsDuplicatedInToolbar(isDuplicationInToolbar));
}

void AddWonAction(ActionState.IContainerFillerActions filler, bool isDuplicationInToolbar = false)
{
filler.Add(actionHold, a => a

.IsDuplicatedInToolbar(isDuplicationInToolbar));
}

void AddLostAction(ActionState.IContainerFillerActions filler, bool isDuplicationInToolbar = false)
{
filler.Add(actionCompleted, field => field

.IsDuplicatedInToolbar(isDuplicationInToolbar));
}


void DisableFieldsForFinalStates(FieldState.IContainerFillerFields fields)
{
fields.AddTable<MSOrder>(field => field.IsDisabled());
fields.AddField<MSOrder.orderNbr>();
}
}
}
}
}

 


2 replies

 

 

Reply


About Acumatica ERP system
Acumatica Cloud ERP provides the best business management solution for transforming your company to thrive in the new digital economy. Built on a future-proof platform with open architecture for rapid integrations, scalability, and ease of use, Acumatica delivers unparalleled value to small and midmarket organizations. Connected Business. Delivered.
© 2008 — 2024  Acumatica, Inc. All rights reserved