0
votes

I have modified portal copy order functionality to carry forward the source order shipping address detail into new order.

I have added a custom field to Portalcartlines DAC to store source order type & order number and while Proceed to Checkout action I am filling the address from the source order.

The address is properly carry forward to new order, but while saving I am getting error.

Error: Inserting 'Shipping Address' record raised at least one error. Please review the errors. Error: 'RevisionID' cannot be empty. Error: 'Country' cannot be empty

I am using the following code

public class PortalCardLinesExtn : PXCacheExtension<SP.Objects.IN.PortalCardLines>
{

    #region UsrSourceOrderType
    [PXDBString(2)]
    //[PXUIField(DisplayName = "SourceOrderType")]

    public virtual string UsrSourceOrderType { get; set; }
    public abstract class usrSourceOrderType : IBqlField { }
    #endregion

    #region UsrSourceOrderNbr
    [PXDBString(15)]
    //[PXUIField(DisplayName = "SourceOrderNbr")]

    public virtual string UsrSourceOrderNbr { get; set; }
    public abstract class usrSourceOrderNbr : IBqlField { }
    #endregion
}

public class InventoryCardMaint_Extension : PXGraphExtension<InventoryCardMaint>
{


    public PXAction<PortalCardLine> ProceedToCheckOut;
    [PXButton]
    [PXUIField(DisplayName = "Proceed to Checkout")]
    public IEnumerable proceedToCheckOut(PXAdapter adapter)
    {
        Base.DocumentDetails.Cache.Persist(PXDBOperation.Update);
        Base.DocumentDetails.Cache.Persist(PXDBOperation.Insert);
        Base.DocumentDetails.Cache.Persist(PXDBOperation.Delete);
        foreach (PXCache value in Base.Caches.Values)
        {
            value.IsDirty = false;
        }
        SOOrderEntry sOOrderEntry = PXGraph.CreateInstance<SOOrderEntry>();
        SOOrder sOOrder = sOOrderEntry.Document.Cache.CreateInstance() as SOOrder;
        sOOrder = sOOrderEntry.Document.Insert();
        sOOrderEntry.Document.Cache.SetValueExt<SOOrderExt.isSecondScreen>(sOOrder, 1);
        //sOOrderEntry.Document.Cache.SetValueExt<SOOrderExt.overrideShipment>(sOOrder, true);
        SOOrderExt extension = PXCache<SOOrder>.GetExtension<SOOrderExt>(sOOrder);
        SOShippingContact sOShippingContact = sOOrderEntry.Shipping_Contact.Cache.Current as SOShippingContact;
        SOShippingAddress sOShippingAddress = sOOrderEntry.Shipping_Address.Cache.Current as SOShippingAddress;

        PortalCardLines prow = Base.DocumentDetails.Current;
        if (prow != null)
        {
            PortalCardLinesExtn extn = Base.DocumentDetails.Cache.GetExtension<PortalCardLinesTSExtn>(prow);
            if (!string.IsNullOrEmpty(extn.UsrSourceOrderNbr) && !string.IsNullOrEmpty(extn.UsrSourceOrderType))
            {
                SOOrder order = PXSelect<SOOrder, Where<SOOrder.orderType, Equal<Required<SOOrder.orderType>>, And<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>>.Select(Base, extn.UsrSourceOrderType, extn.UsrSourceOrderNbr);
                if (order != null)
                {
                    SOOrderExt sourceextension = PXCache<SOOrder>.GetExtension<SOOrderExt>(order);
                    sOOrderEntry.Document.Cache.SetValueExt<SOOrderExt.comment>(sOOrder, sourceextension.Comment);
                    SOShippingContact contact = PXSelect<SOShippingContact, Where<SOShippingContact.contactID, Equal<Required<SOShippingContact.contactID>>>>.Select(Base, order.ShipContactID);
                    SOShippingAddress address = PXSelect<SOShippingAddress, Where<SOShippingAddress.addressID, Equal<Required<SOShippingAddress.addressID>>>>.Select(Base, order.ShipAddressID);
                    contact.OverrideContact = true;
                    address.OverrideAddress = true;

                    sOShippingAddress.OverrideAddress = true;
                    sOShippingContact.OverrideContact = true;
                    if (contact != null)
                    {
                        sOShippingContact.FullName = contact.FullName;
                        sOShippingContact.Attention = contact.Attention;
                        sOShippingContact.Phone1 = contact.Phone1;
                        sOShippingContact.Email = contact.Email;
                    }
                    if (address != null)
                    {
                        sOShippingAddress.AddressLine1 = address.AddressLine1;
                        sOShippingAddress.AddressLine2 = address.AddressLine2;
                        sOShippingAddress.AddressLine3 = address.AddressLine3;
                        sOShippingAddress.City = address.City;
                        sOShippingAddress.CountryID = address.CountryID;
                        sOShippingAddress.State = address.State;
                        sOShippingAddress.PostalCode = address.PostalCode;
                    }
                    sOOrderEntry.Shipping_Contact.Cache.Update(sOShippingContact);
                    sOOrderEntry.Shipping_Address.Cache.Update(sOShippingAddress);
                }
            }
        }

        PXRedirectHelper.TryRedirect(sOOrderEntry, PXRedirectHelper.WindowMode.Same);
        return adapter.Get();
    }
}
1

1 Answers

0
votes

I have tried it on customerid field updated event and this solved the issue.

The code is given below

    protected void SOOrder_CustomerID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler)
    {
        if (InvokeBaseHandler != null)
            InvokeBaseHandler(cache, e);
        var row = (SOOrder)e.Row;
        if (row == null) return;
        SOOrderExt ext = cache.GetExtension<SOOrderExt>(row);
        PortalCardLines prow = Base1.DocumentCardDetails.SelectSingle();

        if (prow != null)
        {
            PortalCardLinesTSExtn extn = PXCache<PortalCardLines>.GetExtension<PortalCardLinesTSExtn>(prow);
            if (!string.IsNullOrEmpty(extn.UsrSourceOrderNbr) && !string.IsNullOrEmpty(extn.UsrSourceOrderType))
            {
                //UsrDeliveryNotes
                SOOrder order = PXSelect<SOOrder, Where<SOOrder.orderType, Equal<Required<SOOrder.orderType>>, And<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>>.Select(Base, extn.UsrSourceOrderType, extn.UsrSourceOrderNbr);

                if (order != null )
                {
                    string notes = PXNoteAttribute.GetNote(Base.Document.Cache, order);
                    ext.Comment = notes;
                    row.ShipAddressID = order.ShipAddressID;
                    row.ShipContactID = order.ShipContactID;
                }
            }
        }
    }