KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > opensourcestrategies > crmsfa > party > PartyServices


1 /*
2  * Copyright (c) 2006 - 2007 Open Source Strategies, Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the Honest Public License.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * Honest Public License for more details.
11  *
12  * You should have received a copy of the Honest Public License
13  * along with this program; if not, write to Funambol,
14  * 643 Bair Island Road, Suite 305 - Redwood City, CA 94063, USA
15  */

16 package com.opensourcestrategies.crmsfa.party;
17
18 import java.util.Map JavaDoc;
19 import java.util.List JavaDoc;
20 import java.util.Locale JavaDoc;
21 import java.util.Iterator JavaDoc;
22
23 import org.ofbiz.base.util.Debug;
24 import org.ofbiz.base.util.UtilMisc;
25 import org.ofbiz.base.util.UtilDateTime;
26 import org.ofbiz.entity.GenericDelegator;
27 import org.ofbiz.entity.GenericEntityException;
28 import org.ofbiz.entity.GenericValue;
29 import org.ofbiz.entity.util.EntityUtil;
30 import org.ofbiz.service.DispatchContext;
31 import org.ofbiz.service.GenericServiceException;
32 import org.ofbiz.service.LocalDispatcher;
33 import org.ofbiz.service.ServiceUtil;
34 import org.ofbiz.service.ModelService;
35 import org.ofbiz.security.Security;
36
37 import com.opensourcestrategies.crmsfa.party.PartyHelper;
38 import com.opensourcestrategies.crmsfa.security.CrmsfaSecurity;
39 import com.opensourcestrategies.crmsfa.util.UtilCommon;
40
41 /**
42  * Services common to CRM parties such as accounts/contacts/leads. The service documentation is in services_party.xml.
43  *
44  * @author <a HREF="mailto:leon@opensourcestrategies.com">Leon Torres</a>
45  */

46
47 public class PartyServices {
48
49     public static final String JavaDoc module = PartyServices.class.getName();
50
51     /** Merging function for two unique GenericValues. */
52     private static void mergeTwoValues(String JavaDoc entityName, Map JavaDoc fromKeys, Map JavaDoc toKeys, GenericDelegator delegator) throws GenericEntityException {
53         GenericValue from = delegator.findByPrimaryKey(entityName, fromKeys);
54         GenericValue to = delegator.findByPrimaryKey(entityName, toKeys);
55         if (from == null || to == null) return;
56         from.setNonPKFields(to.getAllFields());
57         to.setNonPKFields(from.getAllFields());
58         to.store();
59     }
60
61     public static Map JavaDoc validateMergeCrmParties(DispatchContext dctx, Map JavaDoc context) {
62         GenericDelegator delegator = dctx.getDelegator();
63         LocalDispatcher dispatcher = dctx.getDispatcher();
64         Security security = dctx.getSecurity();
65         GenericValue userLogin = (GenericValue) context.get("userLogin");
66         Locale JavaDoc locale = (Locale JavaDoc) context.get("locale");
67
68         String JavaDoc partyIdFrom = (String JavaDoc) context.get("partyIdFrom");
69         String JavaDoc partyIdTo = (String JavaDoc) context.get("partyIdTo");
70         try {
71             // ensure that merging parties are the same type (ACCOUNT, CONTACT, PROSPECT)
72
String JavaDoc fromPartyType = PartyHelper.getFirstValidInternalPartyRoleTypeId(partyIdFrom, delegator);
73             String JavaDoc toPartyType = PartyHelper.getFirstValidInternalPartyRoleTypeId(partyIdTo, delegator);
74             if ((fromPartyType == null) || !fromPartyType.equals(toPartyType)) {
75                 return UtilCommon.createAndLogServiceError("Cannot merge party ["+partyIdFrom+"] of type ["+fromPartyType+"] with party ["+partyIdTo+"] of type ["+toPartyType+"] because they are not the same type.", "CrmErrorMergePartiesFail", locale, module);
76             }
77             if (partyIdFrom.equals(partyIdTo)) {
78                 return UtilCommon.createAndLogServiceError("Cannot merge party ["+partyIdFrom+"] to itself!", "CrmErrorMergeParties", locale, module);
79             }
80
81             // convert ACCOUNT/CONTACT/PROSPECT to ACCOUNT/CONTACT/LEAD
82
String JavaDoc partyTypeCrm = (fromPartyType.equals("PROSPECT") ? "LEAD" : fromPartyType);
83
84             // make sure userLogin has CRMSFA_${partyTypeCrm}_UPDATE permission for both parties TODO: and delete, check security config
85
if (!CrmsfaSecurity.hasPartyRelationSecurity(security, "CRMSFA_" + partyTypeCrm, "_UPDATE", userLogin, partyIdFrom)
86                     || !CrmsfaSecurity.hasPartyRelationSecurity(security, "CRMSFA_" + partyTypeCrm, "_UPDATE", userLogin, partyIdTo)) {
87                 return UtilCommon.createAndLogServiceError("CrmErrorPermissionDenied", locale, module);
88             }
89         } catch (GenericEntityException e) {
90             return UtilCommon.createAndLogServiceError(e, "CrmErrorMergePartiesFail", locale, module);
91         }
92         return ServiceUtil.returnSuccess();
93     }
94
95     // TODO: avoid merging parties with particular statuses. implement with an array
96
public static Map JavaDoc mergeCrmParties(DispatchContext dctx, Map JavaDoc context) {
97         GenericDelegator delegator = dctx.getDelegator();
98         LocalDispatcher dispatcher = dctx.getDispatcher();
99         Security security = dctx.getSecurity();
100         GenericValue userLogin = (GenericValue) context.get("userLogin");
101         Locale JavaDoc locale = (Locale JavaDoc) context.get("locale");
102
103         String JavaDoc partyIdFrom = (String JavaDoc) context.get("partyIdFrom");
104         String JavaDoc partyIdTo = (String JavaDoc) context.get("partyIdTo");
105         try {
106             // validate again
107
Map JavaDoc serviceResults = dispatcher.runSync("crmsfa.validateMergeCrmParties",
108                     UtilMisc.toMap("userLogin", userLogin, "partyIdFrom", partyIdFrom, "partyIdTo", partyIdTo));
109             if (ServiceUtil.isError(serviceResults)) {
110                 return serviceResults;
111             }
112
113             // merge the party objects
114
mergeTwoValues("PartySupplementalData", UtilMisc.toMap("partyId", partyIdFrom), UtilMisc.toMap("partyId", partyIdTo), delegator);
115             mergeTwoValues("Person", UtilMisc.toMap("partyId", partyIdFrom), UtilMisc.toMap("partyId", partyIdTo), delegator);
116             mergeTwoValues("PartyGroup", UtilMisc.toMap("partyId", partyIdFrom), UtilMisc.toMap("partyId", partyIdTo), delegator);
117             mergeTwoValues("Party", UtilMisc.toMap("partyId", partyIdFrom), UtilMisc.toMap("partyId", partyIdTo), delegator);
118
119             // merge relationships by changing partyIdFrom to partyIdTo in PartyRelationship for valid ones (active and not equal)
120
List JavaDoc relationships = EntityUtil.filterByDate(delegator.findByAnd("PartyRelationship", UtilMisc.toMap("partyIdFrom", partyIdFrom)));
121             for (Iterator JavaDoc iter = relationships.iterator(); iter.hasNext(); ) {
122                 GenericValue relationship = (GenericValue) iter.next();
123                 List JavaDoc toRelationships = EntityUtil.filterByDate(delegator.findByAnd("PartyRelationship", UtilMisc.toMap("partyIdFrom", partyIdTo,
124                                 "partyIdTo", relationship.get("partyIdTo"), "roleTypeIdFrom", relationship.get("roleTypeIdFrom"),
125                                 "roleTypeIdTo", relationship.get("roleTypeIdTo"))));
126                 if (toRelationships.size() > 0) continue;
127                 GenericValue newRelationship = delegator.makeValue("PartyRelationship", relationship.getAllFields());
128                 newRelationship.set("partyIdFrom", partyIdTo);
129                 newRelationship.create();
130                 relationship.remove();
131             }
132             relationships = EntityUtil.filterByDate(delegator.findByAnd("PartyRelationship", UtilMisc.toMap("partyIdTo", partyIdFrom)));
133             for (Iterator JavaDoc iter = relationships.iterator(); iter.hasNext(); ) {
134                 GenericValue relationship = (GenericValue) iter.next();
135                 List JavaDoc toRelationships = EntityUtil.filterByDate(delegator.findByAnd("PartyRelationship", UtilMisc.toMap("partyIdTo", partyIdTo,
136                                 "partyIdFrom", relationship.get("partyIdFrom"), "roleTypeIdFrom", relationship.get("roleTypeIdFrom"),
137                                 "roleTypeIdTo", relationship.get("roleTypeIdTo"))));
138                 if (toRelationships.size() > 0) continue;
139                 GenericValue newRelationship = delegator.makeValue("PartyRelationship", relationship.getAllFields());
140                 newRelationship.set("partyIdTo", partyIdTo);
141                 newRelationship.create();
142                 relationship.remove();
143             }
144
145             // merge datasources simply by copying them (this is dangerous if a SECA is triggered by this service)
146
List JavaDoc dataSources = delegator.findByAnd("PartyDataSource", UtilMisc.toMap("partyId", partyIdFrom));
147             for (Iterator JavaDoc iter = dataSources.iterator(); iter.hasNext(); ) {
148                 GenericValue dataSource = (GenericValue) iter.next();
149                 serviceResults = dispatcher.runSync("createPartyDataSource", UtilMisc.toMap("partyId", partyIdTo,
150                             "dataSourceId", dataSource.getString("dataSourceId"), "userLogin", userLogin));
151                 if (ServiceUtil.isError(serviceResults)) {
152                     return UtilCommon.createAndLogServiceError(serviceResults, "CrmErrorMergePartiesFail", locale, module);
153                 }
154             }
155
156             // copy all the contact mechs over
157
serviceResults = dispatcher.runSync("copyPartyContactMechs", UtilMisc.toMap("partyIdFrom", partyIdFrom, "partyIdTo", partyIdTo, "userLogin", userLogin));
158             if (ServiceUtil.isError(serviceResults)) {
159                 return UtilCommon.createAndLogServiceError(serviceResults, "CrmErrorMergePartiesFail", locale, module);
160             }
161
162             // merge workefforts by changing partyIdFrom to partyIdTo in WorkEffortPartyAssignment, but avoid duplicates
163
List JavaDoc associations = EntityUtil.filterByDate(delegator.findByAnd("WorkEffortPartyAssignment", UtilMisc.toMap("partyId", partyIdFrom)));
164             for (Iterator JavaDoc iter = associations.iterator(); iter.hasNext(); ) {
165                 GenericValue wepa = (GenericValue) iter.next();
166                 List JavaDoc toWepas = EntityUtil.filterByDate(delegator.findByAnd("WorkEffortPartyAssignment", UtilMisc.toMap("partyId", partyIdTo,
167                                 "workEffortId", wepa.get("workEffortId"), "roleTypeId", wepa.get("roleTypeId"))));
168                 if (toWepas.size() > 0) continue;
169                 GenericValue newWepa = delegator.makeValue("WorkEffortPartyAssignment", wepa.getAllFields());
170                 newWepa.set("partyId", partyIdTo);
171                 newWepa.create();
172                 wepa.remove();
173             }
174
175             // merge communication events by changing the partyId
176
List JavaDoc comms = delegator.findByAnd("CommunicationEvent", UtilMisc.toMap("partyIdFrom", partyIdFrom));
177             for (Iterator JavaDoc iter = comms.iterator(); iter.hasNext(); ) {
178                 GenericValue comm = (GenericValue) iter.next();
179                 comm.set("partyIdFrom", partyIdTo);
180                 comm.store();
181             }
182             comms = delegator.findByAnd("CommunicationEvent", UtilMisc.toMap("partyIdTo", partyIdFrom));
183             for (Iterator JavaDoc iter = comms.iterator(); iter.hasNext(); ) {
184                 GenericValue comm = (GenericValue) iter.next();
185                 comm.set("partyIdTo", partyIdTo);
186                 comm.store();
187             }
188
189             // merge opportunities
190
List JavaDoc oppRoles = delegator.findByAnd("SalesOpportunityRole", UtilMisc.toMap("partyId", partyIdFrom));
191             for (Iterator JavaDoc iter = oppRoles.iterator(); iter.hasNext(); ) {
192                 GenericValue oppRole = (GenericValue) iter.next();
193                 Map JavaDoc input = UtilMisc.toMap("salesOpportunityId", oppRole.get("salesOpportunityId"), "partyId", partyIdTo, "roleTypeId", oppRole.get("roleTypeId"));
194                 GenericValue toOppRole = delegator.findByPrimaryKey("SalesOpportunityRole", input);
195                 if (toOppRole != null) continue;
196                 GenericValue newOppRole = delegator.makeValue("SalesOpportunityRole", input);
197                 newOppRole.create();
198                 oppRole.remove();
199             }
200
201             // merge case roles
202
List JavaDoc caseRoles = delegator.findByAnd("CustRequestRole", UtilMisc.toMap("partyId", partyIdFrom));
203             for (Iterator JavaDoc iter = caseRoles.iterator(); iter.hasNext(); ) {
204                 GenericValue custRequestRole = (GenericValue) iter.next();
205                 Map JavaDoc input = UtilMisc.toMap("custRequestId", custRequestRole.get("custRequestId"), "partyId", partyIdTo, "roleTypeId", custRequestRole.get("roleTypeId"));
206                 GenericValue toCustRequestRole = delegator.findByPrimaryKey("CustRequestRole", input);
207                 if (toCustRequestRole != null) continue;
208                 GenericValue newCustRequestRole = delegator.makeValue("CustRequestRole", input);
209                 newCustRequestRole.create();
210                 custRequestRole.remove();
211             }
212
213             // merge cases (here we just change the fromPartyId because it's not a pk)
214
List JavaDoc cases = delegator.findByAnd("CustRequest", UtilMisc.toMap("fromPartyId", partyIdFrom));
215             for (Iterator JavaDoc iter = cases.iterator(); iter.hasNext(); ) {
216                 GenericValue custRequest = (GenericValue) iter.next();
217                 custRequest.set("fromPartyId", partyIdTo);
218                 custRequest.store();
219             }
220
221             // merge notes
222
List JavaDoc notes = delegator.findByAnd("PartyNote", UtilMisc.toMap("partyId", partyIdFrom));
223             for (Iterator JavaDoc iter = notes.iterator(); iter.hasNext(); ) {
224                 GenericValue note = (GenericValue) iter.next();
225                 GenericValue newNote = delegator.makeValue("PartyNote", note.getAllFields());
226                 newNote.set("partyId", partyIdTo);
227                 newNote.create();
228                 note.remove();
229             }
230
231             // now delete the from party
232
PartyHelper.deleteCrmParty(partyIdFrom, delegator);
233
234         } catch (GenericServiceException e) {
235             return UtilCommon.createAndLogServiceError(e, "CrmErrorMergePartiesFail", locale, module);
236         } catch (GenericEntityException e) {
237             return UtilCommon.createAndLogServiceError(e, "CrmErrorMergePartiesFail", locale, module);
238         }
239         return ServiceUtil.returnSuccess();
240     }
241
242     public static Map JavaDoc setViewPreference(DispatchContext dctx, Map JavaDoc context) {
243         GenericDelegator delegator = dctx.getDelegator();
244         LocalDispatcher dispatcher = dctx.getDispatcher();
245         GenericValue userLogin = (GenericValue) context.get("userLogin");
246         Locale JavaDoc locale = (Locale JavaDoc) context.get("locale");
247
248         String JavaDoc viewPrefTypeId = (String JavaDoc) context.get("viewPrefTypeId");
249         String JavaDoc value = (String JavaDoc) context.get("viewPrefValue");
250         if (value != null && value.trim().length() == 0) value = null;
251         try {
252             // if preference already exists, we'll be doing an update, otherwise a create
253
GenericValue pref = ViewPrefWorker.getViewPreferenceValue(userLogin, viewPrefTypeId);
254
255             // prepare the preference
256
Map JavaDoc input = UtilMisc.toMap("userLogin", userLogin, "userLoginId", userLogin.get("userLoginId"), "viewPrefTypeId", viewPrefTypeId);
257
258             // decide whether value is an enum or a string -- start with default to string
259
input.put("viewPrefValueTypeId", "VPREF_VALTYPE_STRING");
260             input.put("viewPrefString", value);
261
262             // and if we find an enumeration, reset the fields to store an enum
263
if (value != null) {
264                 GenericValue enumeration = delegator.findByPrimaryKeyCache("Enumeration", UtilMisc.toMap("enumId", value));
265                 if (enumeration != null) {
266                     input.put("viewPrefValueTypeId", "VPREF_VALTYPE_ENUM");
267                     input.put("viewPrefString", null);
268                     input.put("viewPrefEnumId", value);
269                 }
270             }
271             return dispatcher.runSync(pref != null ? "crmsfa.updateViewPreference" : "crmsfa.createViewPreference", input);
272
273         } catch (GenericServiceException e) {
274             return UtilCommon.createAndLogServiceError(e, "CrmErrorSetPreferenceFail", locale, module);
275         } catch (GenericEntityException e) {
276             return UtilCommon.createAndLogServiceError(e, "CrmErrorSetPreferenceFail", locale, module);
277         }
278     }
279 }
280
Popular Tags