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