Dictionary for SOA?

I'm trying to figure out where several details of contacts and organizations can be found within SOA.

Some fields still giving me problems:

  1. Name.CATEGORY
    Note that contrary to the documentation, this field is often used for things that have nothing at all to do with dues billing.
  2. CO_ID for company records.
    Party and ComboParty both have ParentOrganization, but what about companies with a parent company?
  3. Name.PAID_THRU
  4. Name.TITLE
  5. Name.TOLL_FREE_PHONE

I know I'm not supposed to be thinking of this in terms of the database schema.  I'm just using the database names to communicate unambiguously.  At the end of the day, I don't care where iMIS and SOA store the category or paid-thru date, but when a user points at the screen and says "I want it there", I have to know how to put it there using SOA, or else I can't use SOA.

I asked Tech Support (SMR 245102), and they suggested asking here.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Bruce, I can tell you i

Bruce,

I can tell you i can't find category and paid_thru but the others are there. the below is from entity name (our own name table in  sqlserver), hope it helps.

                    [Properties] => GenericPropertyDataCollection Object
                        (
                            [GenericPropertyData] =>
                            [GenericProperty] => Array
                                (
                                    [0] => GenericPropertyData Object
                                        (
                                            [Name] => ADDRESS_NUM_1
                                            [Value] => 226
                                        )

                                    [1] => GenericPropertyData Object
                                        (
                                            [Name] => ADDRESS_NUM_2
                                            [Value] => 227
                                        )

                                    [2] => GenericPropertyData Object
                                        (
                                            [Name] => ADDRESS_NUM_3
                                            [Value] => 228
                                        )

                                    [3] => GenericPropertyData Object
                                        (
                                            [Name] => BAR_CODE
                                            [Value] => /432182333335/
                                        )

                                    [4] => GenericPropertyData Object
                                        (
                                            [Name] => BILL_ADDRESS_NUM
                                            [Value] => 226
                                        )

                                    [5] => GenericPropertyData Object
                                        (
                                            [Name] => CITY
                                            [Value] => Columbus
                                        )

                                    [6] => GenericPropertyData Object
                                        (
                                            [Name] => CO_ID
                                            [Value] => 99999999
                                        )

                                    [7] => GenericPropertyData Object
                                        (
                                            [Name] => CO_MEMBER_TYPE
                                            [Value] => NMC
                                        )

                                    [8] => GenericPropertyData Object
                                        (
                                            [Name] => COMPANY
                                            [Value] => Public comany llc
                                        )

                                    [9] => GenericPropertyData Object
                                        (
                                            [Name] => COMPANY_RECORD
                                            [Value] =>
                                        )

                                    [10] => GenericPropertyData Object
                                        (
                                            [Name] => COMPANY_SORT
                                            [Value] => Public company llc
                                        )

                                    [11] => GenericPropertyData Object
                                        (
                                            [Name] => CONTACT_RANK
                                            [Value] => 0
                                        )

                                    [12] => GenericPropertyData Object
                                        (
                                            [Name] => COUNTY
                                            [Value] => Franklin
                                        )

                                    [13] => GenericPropertyData Object
                                        (
                                            [Name] => CRRT
                                            [Value] => B099
                                        )

                                    [14] => GenericPropertyData Object
                                        (
                                            [Name] => DATE_ADDED
                                            [Value] => 2005-02-22T00:00:00
                                        )

                                    [15] => GenericPropertyData Object
                                        (
                                            [Name] => DUP_MATCH_KEY
                                            [Value] => 43218DOEJOHN
                                        )

                                    [16] => GenericPropertyData Object
                                        (
                                            [Name] => EMAIL
                                            [Value] => doe@mail.org
                                        )

                                    [17] => GenericPropertyData Object
                                        (
                                            [Name] => EXCLUDE_DIRECTORY
                                            [Value] => 1
                                        )

                                    [18] => GenericPropertyData Object
                                        (
                                            [Name] => EXCLUDE_MAIL
                                            [Value] =>
                                        )

                                    [19] => GenericPropertyData Object
                                        (
                                            [Name] => FAX
                                            [Value] => (614) 222-3333
                                        )

                                    [20] => GenericPropertyData Object
                                        (
                                            [Name] => FIRST_NAME
                                            [Value] => John
                                        )

                                    [21] => GenericPropertyData Object
                                        (
                                            [Name] => FULL_ADDRESS
                                            [Value] => PO Box 19999 Columbus, OH  43218-2383
                                        )

                                    [22] => GenericPropertyData Object
                                        (
                                            [Name] => FULL_NAME
                                            [Value] => John I. Doe
                                        )

                                    [23] => GenericPropertyData Object
                                        (
                                            [Name] => GENDER
                                            [Value] => M
                                        )

                                    [24] => GenericPropertyData Object
                                        (
                                            [Name] => HOME_PHONE
                                            [Value] => (111) 222-3333
                                        )

                                    [25] => GenericPropertyData Object
                                        (
                                            [Name] => PartyId
                                            [Value] => 9999999
                                        )

                                    [26] => GenericPropertyData Object
                                        (
                                            [Name] => INFORMAL
                                            [Value] => Jack
                                        )

                                    [27] => GenericPropertyData Object
                                        (
                                            [Name] => LAST_FIRST
                                            [Value] => Doe, John
                                        )

                                    [28] => GenericPropertyData Object
                                        (
                                            [Name] => LAST_NAME
                                            [Value] => Doe
                                        )

                                    [29] => GenericPropertyData Object
                                        (
                                            [Name] => LAST_UPDATED
                                            [Value] => 2010-10-06T16:32:50
                                        )

                                    [30] => GenericPropertyData Object
                                        (
                                            [Name] => MAIL_ADDRESS_NUM
                                            [Value] => 333
                                        )

                                    [31] => GenericPropertyData Object
                                        (
                                            [Name] => MEMBER_RECORD
                                            [Value] =>
                                        )

                                    [32] => GenericPropertyData Object
                                        (
                                            [Name] => MEMBER_TYPE
                                            [Value] => AM
                                        )

                                    [33] => GenericPropertyData Object
                                        (
                                            [Name] => MIDDLE_NAME
                                            [Value] => I.
                                        )

                                    [34] => GenericPropertyData Object
                                        (
                                            [Name] => ORG_CODE
                                            [Value] => OFBF
                                        )

                                    [35] => GenericPropertyData Object
                                        (
                                            [Name] => PREFIX
                                            [Value] => Mr.
                                        )

                                    [36] => GenericPropertyData Object
                                        (
                                            [Name] => SHIP_ADDRESS_NUM
                                            [Value] => 555
                                        )

                                    [37] => GenericPropertyData Object
                                        (
                                            [Name] => STATE_PROVINCE
                                            [Value] => OH
                                        )

                                    [38] => GenericPropertyData Object
                                        (
                                            [Name] => STATUS
                                            [Value] => A
                                        )

                                    [39] => GenericPropertyData Object
                                        (
                                            [Name] => TITLE
                                            [Value] => Director
                                        )

                                    [40] => GenericPropertyData Object
                                        (
                                            [Name] => UPDATED_BY
                                            [Value] => updater
                                        )

                                    [41] => GenericPropertyData Object
                                        (
                                            [Name] => US_CONGRESS
                                            [Value] => 12
                                        )

                                    [42] => GenericPropertyData Object
                                        (
                                            [Name] => WEBSITE
                                            [Value] => www.ofbf.org
                                        )

                                    [43] => GenericPropertyData Object
                                        (
                                            [Name] => WORK_PHONE
                                            [Value] => (111) 222-3333
                                        )

                                    [44] => GenericPropertyData Object
                                        (
                                            [Name] => ZIP
                                            [Value] => 49999-2383
                                        )

All but one of these are in the object model

Unfortunately, Category is not currently represented in any existing object property. However, we will be adding it with the 15.2 release.

For each of the other properties you reference, here are the SOA native abstractions.

  • Every Party will have an AdditionalAttribute entry named ParentPartyId. This should be true for both Individuals and Organizations.
  • Since the MemberType of every Party is represented as a GroupMember in SOA, the PaidThruDate is in the DropDate of the GroupMemberSummary.
  • A Party's Title is a property of the PrimaryOrganizationInformation object (PersonData.PrimaryOrganization). Note that the Name property on that object is the Company Name.
  • All of the phone numbers for a Party are stored in a PhoneDataCollection (PartyData.Phones) and each PhoneData has a PhoneType property. The values that are assigned for the PhoneType are:
    • _Home Phone
    • _Work Phone
    • _Toll Free
    • _Fax
  • Additionally, the specific phone numbers associated with each address in a Party's FullAddressDataCollection (PartyData.Addresses) are accessible via the following two properties on each FullAddressData object:
    • Phone (this is a PhoneData object with PhoneType = Address Purpose of the specific address)
    • Fax (this is PhoneData object with PhoneType = 'Fax'

Regarding a Dictionary for SOA, of course I cannot make promises for any specific level of detail, but would like to reiterate what you've probably already heard from others. We are working to improve the API documentation to include more meaningful descriptions for the objects and properties in SOA. We have an ambitious goal of incorporating even more helpful examples within the published API in upcoming releases.

So, at the risk of being deluged with postings containing long lists of such inquiries, in the meantime, I will attempt to help locate this type of information when I am able to.

Now we're getting somewhere

Hi, Jeffrey,

Thanks for the clearly-written and authoritative answer.  If the 15.2. docs are written like this, we'll all be in a much better place.

I like the term you used: "native abstractions".  Clearly I can get (and maybe even modify) a lot of these properties using GenericEntityData, but this looks like just a simple wrapper around the physical tables.  I hold out very little hope that GenericEntityData would enforce even rudimentary business rules like MEMBER_TYPE causing updates to PREVIOUS_MT, MT_CHANGE_DATE, MEMBER_RECORD, COMPANY_RECORD, or even LAST_UPDATED, UPDATED_BY and the change log.  Those native abstractions are what I'm looking for, so I know in my head where to go in SOA so that the right thing happens in iMIS.
--
Bruce Wilson
Director, Technical Services
RSM McGladrey, Inc.

I agree, this is a step in

I agree, this is a step in the right direction and some kind of dictionary would be a huge help.

For instance: Has anyone worked out how to pull a company roster over SOA? I want to search on ParentPartyId but it is not supported in the find for party. I thought it might be rolled into PartyRelationship collection, but its not.

Thanks

A

The company roster is

The company roster is something we're wanting to do and don't know howto. If it is not supported, then we need to ping ASI for either alternatives and/or an update to the current code base. We are in the midst of revamping our website and would really really appreciate the ability to pull a company roster that includes all fields.

Gap in 15.1.3

You're right, this is a gap in 15.1.3 Soa.  In release 15.2 (which is in the final stages as I write this) both organizations and relationships will be in the GroupMember object.  I know this doesn't help you now, but I had already put an example together before I realized it wasn't in 15.1.3.  So here's a leg up for company rosters in the next release:

//Retrieve the company group 
var criteria = new CriteriaDataCollection { CriteriaData.Equal("ParentIdentity.Id", parentPartyId), CriteriaData.Equal("GroupClass.GroupClassId", "ORGRELATIONSHIP") };
var query = new QueryData("Group") { Criteria = criteria };
var results = EntityManager.Find(query);
var groups = new Collection(results.Result.Cast().ToList());     

//Retrieve members of the company group
var gmCriteria = new CriteriaDataCollection { CriteriaData.Equal("GroupId", groups[0].GroupId) };
var gmQuery = new QueryData("GroupMember") { Criteria = gmCriteria };
var gmResults = EntityManager.Find(gmQuery);
var groupMembers = new Collection(gmResults.Result.Cast().ToList());

How about top parent?

When clients use CO_ID linking, they almost always end up needing a "top company" customization.  Will these groups provide the top parent company, or only the immediate parent?

For example, Doug Hunt works for Prodigy Makers, Austin, which is linked to Prodigy Makers, Texas, which is a division of Prodigy Makers, USA, which is itself owned by Acme Enterprises, a division of Acme International,  Marcie Farmhaven works for Prodigy Makers, Chicago, which is linked to Prodigy Makers, Illinois, another division of Prodigy Makers, USA.  If I look for members of Prodigy Makers Texas, I should find Doug, but if I look for members of Acme Enterprises I should find them both.

Can we, can we, huh, please?
--
Bruce Wilson
Director, Technical Services
RSM McGladrey, Inc.

Recursive queries

Hi Bruce,

That's an interesting idea.  I suppose you could achieve this pretty easily by a recursively calling the 2 queries above.  In place of the parentPartyId you could use the groupMember.Party.PartyId.  That's essentially what we do in our new group list editor iPart.  It would allow you to drill down from Acme Enterprises to Prodigy Makers, Austin which would list Doug.  For your needs, you could use the same sort of logic but just spit them all out at one level when you find a party that is not an organization.

Cheers,
Courtney Robertson

Recursive isn't a solution

I see what you're saying, and yes, we can get the data that way, but that's exactly the customization that we want to avoid.  This problem is a "classic", and it's been discussed (and solved to varying degrees) dozens of times on NiUG.  The usual form is to add a "top parent ID" field to a UDT, and create a trigger or scheduled stored procedure to keep the field up to date.  We shouldn't have to do that, and we don't want to do it anymore.

What I want is for iMIS to automatically add Doug to groups for all those companies whenever I change his CO_ID, so I can ask for a simple query of the people in any company and get everyone linked at any level below.  That is, it needs to be something can "join" to, not something I can build up using a loop.  (Ever tried writing recursion into a Crystal report, or even a SQL view?)  The recursion should happen when the data is modified, not when I need to query on it.

Since there's still a need for pulling only immediate children of a company, I would suggest that immediate children get a different GroupRole than those at subsidiary levels.  That way we could filter by role to get immediate children, or not filter and get all descendants.  Niftier would be a "generation" value that tells us how many levels away it is.  (Doug and Marci are both 5 levels below Acme International.)  This would be cool, but not as valuable to most people.
--
Bruce Wilson
Director, Technical Services
RSM McGladrey, Inc.

I like your idea of having a

I like your idea of having a top parent id.  I'll point my team's product owner to your post.  We do usually try and include some of the top NiUG requests in our releases so if this is something a lot of people are asking for, I wouldn't be surprised if it was already in the pipeline.  For now, without an extra field like "top parent id" the recursion would either need to happen at the view level (iMIS 15 projects groups via a view) or at the code level.  I know it's not the ideal solution, but at least it works :)

Cheers,
Courtney Robertson

P.S.  iMIS 100 uses the Hierarchy table for Company rosters which does have a RootHierarchyKey, so at least we're headed in the right direction ;-)

Top NiUG request

This isn't a top NiUG request in the sense of being requested by the PAC (I'm on the PAC, so I know).  It's a frequently asked question on NiUG (right up there with filling in missing rows in required UDT's, the view for easier reporting from Relationships and clearing out PrinterDest).  I doubt it has bubbled up to ASI very often because the customization is within reach of so many people.  Still, in the brave new world of iMIS 100 (or iMIS 200), we won't have the option, so I'd rather see it in the product sooner, so we can all work out the bugs and rely on it sooner.

I guess that's another wrinkle for ASI to wrestle with:  how to identify those ubiquitous customizations that don't ever appear on the "hot topics" list, but are relied on by the majority of customers.  I think stored procedures that update UDTs would be very high on that list:  it allows people to do just about anything they need.  In a closed (or logically closed, because nobody can understand it) database, those customizations are off the table, and that's going to be a problem for a lot of people.
--
Bruce Wilson
Director, Technical Services
RSM McGladrey, Inc.

Was wondering if the top

Was wondering if the top parent id field was ever added in the latest iMIS release? or is it at least in a pipeline? It would be very valuable for us as well..

I don't think so

I don't think this is in the pipeline. I encourage you to either enter an RSE or email the iMIS Product Owners at productowners@advsol.com. Our product owners manage what functionality makes it into each release.

Cheers,
Courtney

Courtney, I like this. Do

Courtney, I like this. Do you think ASI will provide complete documentation on SOA and take the guess work out of the process?

Yes, for the 15.2 release,

Yes, for the 15.2 release, we have built Soa API documentation which also includes some coding examples.  Although we tried to give a good variety of examples, there are sure to be cases that we didn't cover.  In those cases, coming here (to imiscommunity) and asking the questions or sharing solutions is certainly the way to go.

Cheers,
Courtney Robertson

Documentation gap

After visiting the SOA docs multiple times, I just realized that one of the major gaps in the docs is an explanation of how to properly read and write fields in single-instance and multi-instance UDTs. I know we can use GenericEntityData (or whatever it's called) to read this. Is that the best way, or does SOA offer anything that is a little more aware of field names and data types?

It seems like something so fundamental deserves a working example. Naturally, this area will be different for every client, but you should be able to document it by saying "suppose you have a UD table with these fields...".
--
Bruce Wilson
Director, Technology Solutions
McGladrey LLP