I have this customization where I want the user to click on the new action menu in the Opportunities screen named Create Project where it redirects or pops up the project entry screen and once it is saved redirects back to opportunity screen with the created project selected in the project field.
Here's my code so far, which I tried to copy from other similar module, but problem is that it's not updating the project field in the Oppurtunity screen after Save&Close on Create Project popup.
public class OpportunityMaint_Extension:PXGraphExtension<OpportunityMaint> {
public override void Initialize() {
Base.Action.AddMenuAction(createProject);
createSalesOrder.SetVisible(false);
createSalesOrder.SetEnabled(false);
}
public PXAction<PX.Objects.CR.CROpportunity> createSalesOrder;
[PXUIField(Visible = false)]
public IEnumerable CreateSalesOrder(PXAdapter adapter) {
return null;
}
public PXAction<PX.Objects.CR.CROpportunity> createProject;
[PXUIField(DisplayName = "Create Project", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Select)]
[PXButton()]
public IEnumerable CreateProject(PXAdapter adapter) {
List<CROpportunity> opportunities = new List<CROpportunity>(adapter.Get().Cast<CROpportunity>());
foreach (CROpportunity opp in opportunities) {
Base.Save.Press();
PXLongOperation.StartOperation(Base, () => ConvertToProject(opp));
}
return opportunities;
}
public static void ConvertToProject(CROpportunity opportunity) {
ProjectEntry projectEntry = PXGraph.CreateInstance<ProjectEntry>();
PMProject proj = new PMProject {
ContractCD = (string)"<NEW>",
CustomerID = opportunity.BAccountID,
Description = opportunity.OpportunityName,
OwnerID = opportunity.OwnerID
};
proj = projectEntry.Project.Insert(proj);
opportunity.ProjectID = proj.ContractID;
throw new PXRedirectRequiredException(projectEntry , "Create Project", true);
}
protected void CROpportunity_RowSelected(PXCache cache, PXRowSelectedEventArgs e) {
var row = (CROpportunity)e.Row;
if (row == null) return;
//createProject.SetEnabled(true);
createSalesOrder.SetVisible(false);
createSalesOrder.SetEnabled(false);
}
}