Sergei Biletnikov created OFBIZ-5261:
----------------------------------------

             Summary: Party contact expiration and its hidden problems
                 Key: OFBIZ-5261
                 URL: https://issues.apache.org/jira/browse/OFBIZ-5261
             Project: OFBiz
          Issue Type: Bug
          Components: accounting, order, party
    Affects Versions: Release 10.04, Release 09.04.01, Release 09.04, Release 
Branch 11.04, SVN trunk
            Reporter: Sergei Biletnikov


I found a problem which can appear when you add new contact like postal address 
and expiry old one, the old contact is still used by some code.

The cause of the problem is easy and clear. 
To make it more clear, let me remind you that OFBiz has a smart contacts data 
model, where each contact represents the contact data like address, phone 
number and etc and contact purposes, which is responsible for the how to apply 
the contact.

Regarding parties, the main entities here:
PartyContactMech   (contact)
and
PartyContactMechPurpose   (purpose)

All looks good.
However, both PartyContactMech and PartyContactMechPurpose have from and thru 
date creterias,i.e. can be expired!

If you add a purpose to the contanct and after that you remove it, the purpose 
will be expired (not deleted), that is ok for auditing.

RE: PartyContactMech, if you expire the contact,it means this contact mechanism 
must be out from the game and not be visisble on the profile page. The state of 
its purposes do not matter anymore, it must be not used.

But there is a problem here, some code takes into account  
PartyContactMechPurpose and use date filter but ignores PartyContactMech 
expiration state. This follows to the error: the contact is expired, the 
purposes not, but the contact is still used!!!

Example:

\applications\order\webapp\ordermgr\WEB-INF\actions\order\CompanyHeader.groovy

addresses = delegator.findByAnd("PartyContactMechPurpose", [partyId : partyId, 
contactMechPurposeTypeId : "GENERAL_LOCATION"]);
selAddresses = EntityUtil.filterByDate(addresses, nowTimestamp, "fromDate", 
"thruDate", true);
........
phones = delegator.findByAnd("PartyContactMechPurpose", [partyId : partyId, 
contactMechPurposeTypeId : "PRIMARY_PHONE"]);
...........

only PartyContactMechPurpose  ??? and it ignores that PartyContactMech is 
already expired! The result : I see the expired contact on the order page.

\applications\accounting\src\org\ofbiz\accounting\payment\PaymentMethodServices.java

try {
                List<GenericValue> allPCMPs = 
EntityUtil.filterByDate(delegator.findByAnd("PartyContactMechPurpose",
                        UtilMisc.toMap("partyId", partyId, "contactMechId", 
contactMechId, "contactMechPurposeTypeId", contactMechPurposeTypeId), null), 
true);

                tempVal = EntityUtil.getFirst(allPCMPs);
            } catch (GenericEntityException e) {
                Debug.logWarning(e.getMessage(), module);
                tempVal = null;
            }
.....
and again, we are interested only in PartyContactMechPurpose. The potential 
problem is here.

I did not check the all code of OFBiz, it is just my fast search attempts.


How to solve the problem???
In my opinion, the data model looks ok, and it is ok when PartyContactMech is 
expired, but its purposes are not. It does not break a sense and good for 
auditing.
The good solution is to correct code and rely on both parties to find the 
necessary contact/purpose, for example the PartyContactWithPurpose can be used 
with contactFromDate, contactThruDate, purposeFromDate, purposeThruDate 
accordingly. However, I do not know how is big the effort to do that in the 
existing code.
The fast and easy solution is expiring all purposes for the expired contact 
mechanisms, in this case we can rely only on PartyContactMechPurpose.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to