Skip to main content
Answer

Creating a pop up to show various vendor pricing

  • June 23, 2022
  • 1 reply
  • 112 views

I need to create a link on each line item(Inventory Item on a sales order) of the graph on page PO505000 that will pop up a screen showing all of the vendors for that item and the cost from each vendor. Any ideas how to approach this?  

Best answer by JKurtz29

Hello,

We did something similar with a POOrderEntry graph extension that uses the in-field warning to create a hint/message that shows the quantity pricing for the current vendor.  Maybe you could use that as a basis to create what you need to show multiple vendor’s prices?

Here’s the graph extension’s code:

 

using PX.Data;
using PX.Data.BQL;
using PX.Data.BQL.Fluent;
using PX.Objects.AP;
using System;
using System.Text;

namespace PX.Objects.PO
{
public class POOrderEntry_ExtensionAI : PXGraphExtension<POOrderEntry>
{
public static bool IsActive() => true;

#region Event Handlers

protected void _(Events.RowUpdated<POLine> e)
{
var row = (POLine)e.Row;
if (row == null || row.InventoryID == null || row.OrderQty == null) return;

PXUIFieldAttribute.SetWarning<POLine.curyUnitCost>(Base.Transactions.Cache, row, null);
string msg = GetQtyMessage(row.InventoryID, row.VendorID, row.OrderQty, row.RequestedDate);
PXUIFieldAttribute.SetWarning<POLine.curyUnitCost>(Base.Transactions.Cache, row, msg);
}

protected decimal GetItemQtyTotalOnPO(int? inventoryID)
{
decimal retval = 0;

foreach(POLine line in Base.Transactions.Select())
{
if (line.InventoryID == inventoryID)
{
retval += line.OrderQty ?? 0;
}
}
return retval;
}

protected string GetQtyMessage(int? inventoryID, int? vendorID, decimal? lineQty, DateTime? requestedDate)
{
if (inventoryID == null || vendorID == null || lineQty == null) return null;

StringBuilder p = new StringBuilder();
decimal orderQty = GetItemQtyTotalOnPO(inventoryID);
if (requestedDate == null) requestedDate = Base.Accessinfo.BusinessDate;

var prices =
SelectFrom<APVendorPrice>
.Where<APVendorPrice.inventoryID.IsEqual<@P.AsInt>
.And<APVendorPrice.vendorID.IsEqual<@P.AsInt>>
.And<APVendorPrice.effectiveDate.IsLessEqual<@P.AsDateTime>
.Or<APVendorPrice.effectiveDate.IsNull>>
.And<APVendorPrice.expirationDate.IsGreaterEqual<@P.AsDateTime>
.Or<APVendorPrice.expirationDate.IsNull>>>
.View.ReadOnly.Select(Base, inventoryID, vendorID, requestedDate, requestedDate);


if (prices == null) return null;

p.AppendLine("Quantity pricing available:");
foreach (APVendorPrice price in prices)
{
p.AppendLine($"{price.BreakQty:n2} @ {price.SalesPrice:n2}");
}
p.AppendLine("");
p.AppendLine($"You have {orderQty:n2} on this Purchase Order");
return p.ToString();
}
#endregion
}
}

 

1 reply

JKurtz29
Varsity II
Forum|alt.badge.img+1
  • Varsity II
  • Answer
  • June 23, 2022

Hello,

We did something similar with a POOrderEntry graph extension that uses the in-field warning to create a hint/message that shows the quantity pricing for the current vendor.  Maybe you could use that as a basis to create what you need to show multiple vendor’s prices?

Here’s the graph extension’s code:

 

using PX.Data;
using PX.Data.BQL;
using PX.Data.BQL.Fluent;
using PX.Objects.AP;
using System;
using System.Text;

namespace PX.Objects.PO
{
public class POOrderEntry_ExtensionAI : PXGraphExtension<POOrderEntry>
{
public static bool IsActive() => true;

#region Event Handlers

protected void _(Events.RowUpdated<POLine> e)
{
var row = (POLine)e.Row;
if (row == null || row.InventoryID == null || row.OrderQty == null) return;

PXUIFieldAttribute.SetWarning<POLine.curyUnitCost>(Base.Transactions.Cache, row, null);
string msg = GetQtyMessage(row.InventoryID, row.VendorID, row.OrderQty, row.RequestedDate);
PXUIFieldAttribute.SetWarning<POLine.curyUnitCost>(Base.Transactions.Cache, row, msg);
}

protected decimal GetItemQtyTotalOnPO(int? inventoryID)
{
decimal retval = 0;

foreach(POLine line in Base.Transactions.Select())
{
if (line.InventoryID == inventoryID)
{
retval += line.OrderQty ?? 0;
}
}
return retval;
}

protected string GetQtyMessage(int? inventoryID, int? vendorID, decimal? lineQty, DateTime? requestedDate)
{
if (inventoryID == null || vendorID == null || lineQty == null) return null;

StringBuilder p = new StringBuilder();
decimal orderQty = GetItemQtyTotalOnPO(inventoryID);
if (requestedDate == null) requestedDate = Base.Accessinfo.BusinessDate;

var prices =
SelectFrom<APVendorPrice>
.Where<APVendorPrice.inventoryID.IsEqual<@P.AsInt>
.And<APVendorPrice.vendorID.IsEqual<@P.AsInt>>
.And<APVendorPrice.effectiveDate.IsLessEqual<@P.AsDateTime>
.Or<APVendorPrice.effectiveDate.IsNull>>
.And<APVendorPrice.expirationDate.IsGreaterEqual<@P.AsDateTime>
.Or<APVendorPrice.expirationDate.IsNull>>>
.View.ReadOnly.Select(Base, inventoryID, vendorID, requestedDate, requestedDate);


if (prices == null) return null;

p.AppendLine("Quantity pricing available:");
foreach (APVendorPrice price in prices)
{
p.AppendLine($"{price.BreakQty:n2} @ {price.SalesPrice:n2}");
}
p.AppendLine("");
p.AppendLine($"You have {orderQty:n2} on this Purchase Order");
return p.ToString();
}
#endregion
}
}