protected virtual void TransferActivities(BusinessAccountMaint graph, BAccount account)
 {
     foreach (CRPMTimeActivity activity in Activities.Select())
     {
         activity.BAccountID = account.BAccountID;
         graph.Activities.Update(activity);
     }
 }
        protected override void ReverseDocumentUpdate(BusinessAccountMaint graph, BAccount entity)
        {
            var document = Documents.Current;

            Documents.Cache.SetValue <Document.bAccountID>(document, entity.BAccountID);
            Documents.Cache.SetValue <Document.locationID>(document, entity.DefLocationID);

            graph.Caches <TMain>().Update(GetMain(document));
        }
    protected void Page_Load(object sender, EventArgs e)
    {
        ContactMaint         graph          = PXGraph.CreateInstance <ContactMaint>();
        var                  search_phone   = Request.QueryString["phone"];
        var                  default_callID = Request.QueryString["cid"];
        BusinessAccountMaint baccount_graph = PXGraph.CreateInstance <BusinessAccountMaint>();

        Int32?contactId   = null;
        Guid? contactGuid = null;

        var contacts = PXSelect <Contact,
                                 Where <Contact.phone1,
                                        Equal <Required <Contact.phone1> >,
                                        Or <Contact.phone2,
                                            Equal <Required <Contact.phone2> >,
                                            Or <Contact.phone3,
                                                Equal <Required <Contact.phone3> > > > > > .Select(graph, search_phone, search_phone, search_phone);

        // For now, just grab the first result
        if (contacts.Count() > 0)
        {
            var contact = ((Contact)contacts.First());
            contactName = contact.DisplayName;
            var customers = PXSelect <BAccount,
                                      Where <BAccount.bAccountID,
                                             Equal <Required <Contact.bAccountID> > > > .Select(graph, contact.BAccountID);

            // There should only be one bAccount that matches
            if (customers.Count() > 0)
            {
                accountCD = ((BAccount)customers.First()).AcctCD;
            }

            contactId   = contact.ContactID;
            contactGuid = contact.NoteID;
        }
        else
        {
            var contact = new Contact();
            contact.LastName = default_callID;
            contact.Phone1   = search_phone;
            contact          = graph.Contact.Insert(contact);
            //graph.Contact.Cache.Persist(PXDBOperation.Insert);
            graph.Save.Press();
            contactName = default_callID;

            contactId   = graph.Contact.Current.ContactID;
            contactGuid = graph.Contact.Current.NoteID;
        }

        // Save an audit record of the phone call
        var audit_graph = PXGraph.CreateInstance <PhoneAudit>();
        var audit       = new PhoneCallerAudit();

        audit.PhoneNubmer = search_phone;
        audit.CallerID    = contactName;
        audit.ContactID   = contactId;
        audit_graph.Audit.Insert(audit);
        audit_graph.Save.Press();

        CRActivityMaint activity_graph = PXGraph.CreateInstance <CRActivityMaint>();
        CRActivity      activity       = new CRActivity();

        activity           = activity_graph.Activities.Insert(activity);
        activity.Type      = "P";
        activity.Subject   = "Inbound Call";
        activity.OwnerID   = new Guid("B5344897-037E-4D58-B5C3-1BDFD0F47BF9");
        activity.ContactID = contactId;
        activity.RefNoteID = contactGuid;
        activity_graph.Activities.Update(activity);
        activity_graph.Save.Press();

        var json = string.Format("{{\"baccount\": \"{0}\", \"contact\": \"{1}\"}}", accountCD, contactName);

        Response.Clear();
        Response.ContentType = "application/json; charset=utf-8";
        Response.Write(json);
        Response.End();
    }
        protected override BAccount CreateMaster(BusinessAccountMaint graph, AccountConversionOptions config)
        {
            var param      = AccountInfo.Current;
            var document   = Documents.Current;
            var docContact = Contacts.Current ?? Contacts.SelectSingle();
            var docAddress = Addresses.Current ?? Addresses.SelectSingle();

            object cd = param.BAccountID;

            graph.BAccount.Cache.RaiseFieldUpdating <BAccount.acctCD>(null, ref cd);

            BAccount account = graph.BAccount.Insert(new BAccount
            {
                AcctCD           = (string)cd,
                AcctName         = param.AccountName,
                Type             = BAccountType.ProspectType,
                ParentBAccountID = document.ParentBAccountID,
                CampaignSourceID = document.CampaignID,
            });

            account.ClassID = param.AccountClass;             // In case of (param.AccountClass == null) constructor fills ClassID with default value, so we have to set this directly.

            CRCustomerClass ocls = PXSelect <
                CRCustomerClass,
                Where <
                    CRCustomerClass.cRCustomerClassID, Equal <Required <CRCustomerClass.cRCustomerClassID> > > >
                                   .SelectSingleBound(graph, null, account.ClassID);

            if (ocls?.DefaultOwner == CRDefaultOwnerAttribute.Source)
            {
                account.WorkgroupID = document.WorkgroupID;
                account.OwnerID     = document.OwnerID;
            }

            account = graph.BAccount.Update(account);

            if (param.LinkContactToAccount == true)
            {
                // in case of opportunity
                Contact contact = PXSelect <Contact, Where <Contact.contactID, Equal <Required <CROpportunity.contactID> > > > .Select(graph, document.RefContactID);

                if (contact != null)
                {
                    graph.Answers.CopyAttributes(account, contact);
                    contact.BAccountID = account.BAccountID;
                    graph.Contacts.Update(contact);
                }
            }


            var defContact = graph.DefContact.SelectSingle()
                             ?? throw new InvalidOperationException("Cannot get Contact for Business Account.");    // just to ensure

            MapContact(docContact, account, ref defContact);
            MapConsentable(docContact, defContact);
            defContact = graph.DefContact.Update(defContact);

            var defAddress = graph.AddressCurrent.SelectSingle()
                             ?? throw new InvalidOperationException("Cannot get Address for Business Account.");    // just to ensure

            MapAddress(docAddress, account, ref defAddress);
            defAddress = graph.AddressCurrent.Update(defAddress);

            CR.Location location = graph.DefLocation.Select();
            location.DefAddressID = defAddress.AddressID;
            location.CTaxZoneID   = document.TaxZoneID;           // Saving tax zone before ReverseDocumentUpdate() removes it
            graph.DefLocation.Update(location);

            ReverseDocumentUpdate(graph, account);

            FillRelations(graph.Relations, account);

            FillAttributes(graph.Answers, account);

            TransferActivities(graph, account);

            // Copy Note text and Files references
            CRSetup setup = PXSetupOptional <CRSetup> .Select(graph);

            PXNoteAttribute.CopyNoteAndFiles(graph.Caches <TMain>(), GetMain(document), graph.CurrentBAccount.Cache, account, setup);

            return(account);
        }
        public static bool CreateBusAccount(BusAccount record)
        {
            if (ValidateData(record))
            {
                try
                {
                    BusinessAccountMaint accountMaint = PXGraph.CreateInstance <BusinessAccountMaint>();
                    BAccount             account      = new BAccount
                    {
                        AcctCD   = record.CompanyName,
                        AcctName = record.CompanyName,
                        Type     = "PR",
                    };
                    account = accountMaint.BAccount.Insert(account);
                    Contact defContact = PXCache <Contact> .CreateCopy(PXSelectBase <Contact, PXSelect <Contact, Where <Contact.contactID, Equal <Current <BAccount.defContactID> > > > .Config> .SelectSingleBound(accountMaint, new object[]
                    {
                        account
                    }, Array.Empty <object>()));

                    Guid?defContactNoteID = defContact.NoteID;
                    defContact.ContactType     = "AR";
                    defContact.FullName        = record.CompanyName;
                    defContact.ContactID       = account.DefContactID;
                    defContact.BAccountID      = account.BAccountID;
                    defContact.DuplicateStatus = "NV";
                    defContact.DuplicateFound  = new bool?(false);
                    defContact.WorkgroupID     = null;
                    defContact.OwnerID         = null;
                    defContact.ClassID         = null;
                    defContact.EMail           = record.Email;
                    defContact.FirstName       = record.FirstName;
                    defContact.LastName        = record.LastName;
                    defContact.Phone1          = record.Phone;
                    defContact.NoteID          = defContactNoteID;
                    defContact = accountMaint.DefContact.Update(defContact);
                    Address defAddress = PXSelectBase <Address, PXSelect <Address, Where <Address.addressID, Equal <Required <Contact.defAddressID> > > > .Config> .Select(accountMaint, new object[]
                    {
                        account.DefAddressID
                    });

                    if (defAddress == null)
                    {
                        return(false);
                    }
                    defAddress.AddressLine1 = record.BillingAddressLine1;
                    defAddress.AddressLine2 = record.BillingAddressLine2;
                    defAddress.City         = record.BillingCity;
                    defAddress.CountryID    = record.BillingCountry;
                    defAddress.State        = record.BillingState;
                    defAddress.PostalCode   = record.BillingZip;
                    accountMaint.AddressCurrent.Cache.Clear();
                    defAddress           = accountMaint.AddressCurrent.Update(defAddress);
                    account.DefAddressID = defAddress.AddressID;
                    accountMaint.BAccount.Update(account);
                    accountMaint.Save.Press();
                    return(true);
                }
                catch (Exception exc)
                {
                    PXTrace.WriteError(exc);
                }
            }
            return(false);
        }