Author: hansbak
Date: Fri Jul 26 07:00:28 2013
New Revision: 1507200
URL: http://svn.apache.org/r1507200
Log:
add a csv party import and export function to the party component
Modified:
ofbiz/trunk/applications/party/build.xml
ofbiz/trunk/applications/party/data/PartyTypeData.xml
ofbiz/trunk/applications/party/entitydef/entitymodel.xml
ofbiz/trunk/applications/party/servicedef/services.xml
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyServices.java
ofbiz/trunk/applications/party/webapp/partymgr/WEB-INF/controller.xml
ofbiz/trunk/applications/party/widget/partymgr/PartyForms.xml
ofbiz/trunk/applications/party/widget/partymgr/PartyMenus.xml
ofbiz/trunk/applications/party/widget/partymgr/PartyScreens.xml
Modified: ofbiz/trunk/applications/party/build.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/build.xml?rev=1507200&r1=1507199&r2=1507200&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/build.xml (original)
+++ ofbiz/trunk/applications/party/build.xml Fri Jul 26 07:00:28 2013
@@ -32,6 +32,7 @@ under the License.
<path id="local.class.path">
<!--<fileset dir="${lib.dir}" includes="*.jar"/>-->
<fileset dir="../../framework/base/lib" includes="*.jar"/>
+ <fileset dir="../../framework/base/lib/commons" includes="*.jar"/>
<fileset dir="../../framework/base/lib/j2eespecs" includes="*.jar"/>
<fileset dir="../../framework/base/build/lib" includes="*.jar"/>
<fileset dir="../../framework/entity/lib" includes="*.jar"/>
Modified: ofbiz/trunk/applications/party/data/PartyTypeData.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/data/PartyTypeData.xml?rev=1507200&r1=1507199&r2=1507200&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/data/PartyTypeData.xml (original)
+++ ofbiz/trunk/applications/party/data/PartyTypeData.xml Fri Jul 26 07:00:28
2013
@@ -441,4 +441,6 @@ under the License.
<Enumeration description="Organization party" enumCode=""
enumId="ORGANIZATION_PARTY" sequenceId="01" enumTypeId="GLOBAL_PREFERENCES"/>
<Enumeration description="Visual Theme" enumCode="" enumId="VISUAL_THEME"
sequenceId="02" enumTypeId="GLOBAL_PREFERENCES"/>
+ <PartyIdentificationType partyIdentificationTypeId="PARTY_IMPORT"
description="Original ID in the system where this record was imported from"/>
+
</entity-engine-xml>
Modified: ofbiz/trunk/applications/party/entitydef/entitymodel.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/entitydef/entitymodel.xml?rev=1507200&r1=1507199&r2=1507200&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/entitydef/entitymodel.xml (original)
+++ ofbiz/trunk/applications/party/entitydef/entitymodel.xml Fri Jul 26
07:00:28 2013
@@ -2929,4 +2929,80 @@ under the License.
<key-map field-name="partyId"/>
</relation>
</extend-entity>
+ <view-entity entity-name="PartyExport"
package-name="org.ofbiz.accounting.reports">
+ <member-entity entity-alias="PRT" entity-name="Party"/>
+ <member-entity entity-alias="GRP" entity-name="PartyGroup"/>
+ <member-entity entity-alias="PER" entity-name="Person"/>
+ <member-entity entity-alias="PR" entity-name="PartyRelationship"/>
+ <member-entity entity-alias="CGRP" entity-name="PartyGroup"/>
+ <member-entity entity-alias="PRL" entity-name="PartyRole"/>
+ <member-entity entity-alias="PCM" entity-name="PartyContactMech"/>
+ <member-entity entity-alias="PCP"
entity-name="PartyContactMechPurpose"/>
+ <member-entity entity-alias="CM" entity-name="ContactMech"/>
+ <member-entity entity-alias="TN" entity-name="TelecomNumber"/>
+ <member-entity entity-alias="PA" entity-name="PostalAddress"/>
+ <alias entity-alias="PRT" name="partyId" />
+ <alias entity-alias="PRT" name="statusId" />
+ <alias entity-alias="PRT" name="preferredCurrencyUomId" />
+ <alias entity-alias="GRP" name="groupName"/>
+ <alias entity-alias="PER" name="firstName"/>
+ <alias entity-alias="PER" name="middleName"/>
+ <alias entity-alias="PER" name="lastName"/>
+ <alias entity-alias="PR" name="companyPartyId" field="partyIdFrom"/>
+ <alias entity-alias="CGRP" name="companyName" field="groupName"/>
+ <alias entity-alias="PRL" name="roleTypeId"/>
+ <alias entity-alias="CM" name="contactMechTypeId"/>
+ <alias entity-alias="PCP" name="contactMechPurposeTypeId"/>
+ <alias entity-alias="CM" name="emailAddress" field="infoString"/>
+ <alias entity-alias="TN" name="telCountryCode" field="countryCode"/>
+ <alias entity-alias="TN" name="telAreaCode" field="areaCode"/>
+ <alias entity-alias="TN" name="telContactNumber"
field="contactNumber"/>
+ <alias entity-alias="PA" name="address1"/>
+ <alias entity-alias="PA" name="address2"/>
+ <alias entity-alias="PA" name="city"/>
+ <alias entity-alias="PA" name="stateProvinceGeoId"/>
+ <alias entity-alias="PA" name="postalCode"/>
+ <alias entity-alias="PA" name="countryGeoId"/>
+ <view-link entity-alias="PRT" rel-entity-alias="GRP"
rel-optional="true">
+ <key-map field-name="partyId"/>
+ </view-link>
+ <view-link entity-alias="PRT" rel-entity-alias="PER"
rel-optional="true">
+ <key-map field-name="partyId"/>
+ </view-link>
+ <view-link entity-alias="PRT" rel-entity-alias="PR"
rel-optional="true">
+ <key-map field-name="partyId" rel-field-name="partyIdTo"/>
+ <entity-condition>
+ <condition-list combine="and">
+ <condition-expr field-name="roleTypeIdFrom"
entity-alias="PR" value="ACCOUNT"/>
+ <condition-expr field-name="partyRelationshipTypeId"
entity-alias="PR" value="EMPLOYMENT"/>
+ </condition-list>
+ </entity-condition>
+ </view-link>
+ <view-link entity-alias="PR" rel-entity-alias="CGRP"
rel-optional="true">
+ <key-map field-name="partyIdFrom" rel-field-name="partyId"/>
+ </view-link>
+ <view-link entity-alias="PRT" rel-entity-alias="PRL"
rel-optional="true">
+ <key-map field-name="partyId"/>
+ </view-link>
+ <view-link entity-alias="PRT" rel-entity-alias="PCM"
rel-optional="true">
+ <key-map field-name="partyId"/>
+ <entity-condition filter-by-date="true"/>
+ </view-link>
+ <view-link entity-alias="PCM" rel-entity-alias="PA"
rel-optional="true">
+ <key-map field-name="contactMechId"/>
+ </view-link>
+ <view-link entity-alias="PCM" rel-entity-alias="CM"
rel-optional="true">
+ <key-map field-name="contactMechId"/>
+ </view-link>
+ <view-link entity-alias="PCM" rel-entity-alias="TN"
rel-optional="true">
+ <key-map field-name="contactMechId"/>
+ </view-link>
+ <view-link entity-alias="PCM" rel-entity-alias="PCP"
rel-optional="true">
+ <key-map field-name="contactMechId"/>
+ <key-map field-name="partyId"/>
+ <entity-condition filter-by-date="true"/>
+ </view-link>
+ </view-entity>
+
+
</entitymodel>
Modified: ofbiz/trunk/applications/party/servicedef/services.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/servicedef/services.xml?rev=1507200&r1=1507199&r2=1507200&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/servicedef/services.xml (original)
+++ ofbiz/trunk/applications/party/servicedef/services.xml Fri Jul 26 07:00:28
2013
@@ -1355,4 +1355,12 @@ under the License.
<attribute name="userLoginId" type="String" mode="IN"
optional="false"/>
<attribute name="productStoreId" type="String" mode="IN"
optional="false"/>
</service>
+
+ <service name="importParty" engine="java"
+ location="org.ofbiz.party.party.PartyServices" invoke="importParty"
auth="true">
+ <description>Import an party with related main role, company and
contact info in csv format, will ignore parties already entered</description>
+ <permission-service service-name="partyGroupPermissionCheck"
main-action="CREATE"/>
+ <attribute mode="IN" name="uploadedFile" type="java.nio.ByteBuffer"
optional="true" />
+ </service>
+
</services>
Modified:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyServices.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyServices.java?rev=1507200&r1=1507199&r2=1507200&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyServices.java
(original)
+++ ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyServices.java
Fri Jul 26 07:00:28 2013
@@ -24,12 +24,18 @@ import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import javolution.util.FastList;
import javolution.util.FastMap;
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVRecord;
+import org.apache.commons.csv.CSVFormat.CSVFormatBuilder;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilDateTime;
import org.ofbiz.base.util.UtilGenerics;
@@ -1850,4 +1856,353 @@ public class PartyServices {
return result;
}
+ public static Map<String, Object> importParty(DispatchContext dctx,
Map<String, Object> context) {
+ Delegator delegator = dctx.getDelegator();
+ LocalDispatcher dispatcher = dctx.getDispatcher();
+ GenericValue userLogin = (GenericValue) context.get("userLogin");
+ ByteBuffer fileBytes = (ByteBuffer) context.get("uploadedFile");
+ String encoding = System.getProperty("file.encoding");
+ String csvString =
Charset.forName(encoding).decode(fileBytes).toString();
+ final BufferedReader csvReader = new BufferedReader(new
StringReader(csvString));
+ final CSVFormatBuilder builder =
CSVFormat.newBuilder(',').withQuoteChar('"').withHeader();
+ CSVFormat fmt = builder.build();
+ List<String> errMsgs = FastList.newInstance();
+ List<String> newErrMsgs = FastList.newInstance();
+ String lastPartyId = null; // last partyId read from the csv
file
+ String currentPartyId = null; // current partyId from the csv file
+ String newPartyId = null; // new to create/update partyId in
the system
+ String newCompanyPartyId = null;
+ int partiesCreated = 0;
+ Map<String, Object> result = null;
+ String newContactMechId = null;
+ String currentContactMechTypeId = null;
+
+ String lastAddress1 = null;
+ String lastAddress2 = null;
+ String lastCity = null;
+ String lastCountryGeoId = null;
+
+ String lastEmailAddress = null;
+
+ String lastCountryCode = null;
+ String lastAreaCode = null;
+ String lastContactNumber = null;
+
+ String lastContactMechPurposeTypeId = null;
+ String currentContactMechPurposeTypeId = null;
+
+ Boolean addParty = false; // when modify party, contact mech not added
again
+
+ if (fileBytes == null) {
+ return ServiceUtil.returnError("Uploaded file data not found");
+ }
+
+ try {
+ for(final CSVRecord rec : fmt.parse(csvReader)) {
+ if (UtilValidate.isNotEmpty(rec.get("partyId"))) {
+ currentPartyId = rec.get("partyId");
+ }
+ if (lastPartyId == null ||
!currentPartyId.equals(lastPartyId)) {
+ newPartyId = null;
+ currentContactMechPurposeTypeId = null;
+ lastAddress1 = null;
+ lastAddress2 = null;
+ lastCity = null;
+ lastCountryGeoId = null;
+
+ lastEmailAddress = null;
+
+ lastCountryCode = null;
+ lastAreaCode = null;
+ lastContactNumber = null;
+
+ // party validation
+ List <GenericValue> currencyCheck =
delegator.findByAnd("Uom", UtilMisc.toMap("abbreviation",
rec.get("preferredCurrencyUomId"), "uomTypeId", "CURRENCY_MEASURE"), null,
false);
+ if
(UtilValidate.isNotEmpty(rec.get("preferredCurrencyUomId")) &&
currencyCheck.size() == 0) {
+ newErrMsgs.add("Line number " + rec.getRecordNumber()
+ ": partyId: " + currentPartyId + "Currency code not found for: " +
rec.get("preferredCurrencyUomId"));
+ }
+
+ if (UtilValidate.isEmpty(rec.get("roleTypeId"))) {
+ newErrMsgs.add("Line number " + rec.getRecordNumber()
+ ": Mandatory roletype is missing, possible values: CUSTOMER, SUPPLIER,
EMPLOYEE and more....");
+ } else if (delegator.findOne("RoleType", UtilMisc.<String,
Object>toMap("roleTypeId", rec.get("roleTypeId")), true) == null) {
+ newErrMsgs.add("Line number " + rec.getRecordNumber()
+ ": RoletypeId is not valid: " + rec.get("roleTypeId") );
+ }
+
+ if (UtilValidate.isNotEmpty(rec.get("contactMechTypeId"))
&&
+ delegator.findOne("ContactMechType", true,
UtilMisc.toMap("contactMechTypeId", rec.get("contactMechTypeId"))) == null) {
+ newErrMsgs.add("Line number " + rec.getRecordNumber()
+ ": partyId: " + currentPartyId + " contactMechTypeId code not found for: " +
rec.get("contactMechTypeId"));
+ }
+
+ if
(UtilValidate.isNotEmpty(rec.get("contactMechPurposeTypeId")) &&
+ delegator.findOne("ContactMechPurposeType", true,
UtilMisc.toMap("contactMechPurposeTypeId",
rec.get("contactMechPurposeTypeId"))) == null) {
+ newErrMsgs.add("Line number " + rec.getRecordNumber()
+ ": partyId: " + currentPartyId + "contactMechPurposeTypeId code not found
for: " + rec.get("contactMechPurposeTypeId"));
+ }
+
+ if (UtilValidate.isNotEmpty(rec.get("contactMechTypeId"))
&& "POSTAL_ADDRESS".equals(rec.get("contactMechTypeId"))) {
+ if (UtilValidate.isEmpty(rec.get("countryGeoId"))) {
+ newErrMsgs.add("Line number " +
rec.getRecordNumber() + ": partyId: " + currentPartyId + "Country code
missing");
+ } else {
+ List <GenericValue> countryCheck =
delegator.findByAnd("Geo", UtilMisc.toMap("geoTypeId", "COUNTRY",
"abbreviation", rec.get("countryGeoId")), null, false);
+ if (countryCheck.size() == 0) {
+ newErrMsgs.add("Line number " +
rec.getRecordNumber() + " partyId: " + currentPartyId + " Invalid Country code:
" + rec.get("countryGeoId"));
+ }
+ }
+
+ if (UtilValidate.isEmpty(rec.get("city"))) {
+ newErrMsgs.add("Line number " +
rec.getRecordNumber() + " partyId: " + currentPartyId + "City name is missing");
+ }
+
+ if
(UtilValidate.isNotEmpty(rec.get("stateProvinceGeoId"))) {
+ List <GenericValue> stateCheck =
delegator.findByAnd("Geo", UtilMisc.toMap("geoTypeId", "STATE", "abbreviation",
rec.get("stateProvinceGeoId")), null, false);
+ if (stateCheck.size() == 0) {
+ newErrMsgs.add("Line number " +
rec.getRecordNumber() + " partyId: " + currentPartyId + " Invalid
stateProvinceGeoId code: " + rec.get("countryGeoId"));
+ }
+ }
+ }
+
+ if (UtilValidate.isNotEmpty(rec.get("contactMechTypeId"))
&& "TELECOM_NUMBER".equals(rec.get("contactMechTypeId"))) {
+ if (UtilValidate.isEmpty(rec.get("telAreaCode")) &&
UtilValidate.isEmpty(rec.get("telAreaCode"))) {
+ newErrMsgs.add("Line number " +
rec.getRecordNumber() + " partyId: " + currentPartyId + " telephone number
missing");
+ }
+ }
+
+ if (UtilValidate.isNotEmpty(rec.get("contactMechTypeId"))
&& "EMAIL_ADDRESS".equals(rec.get("contactMechTypeId"))) {
+ if (UtilValidate.isEmpty(rec.get("emailAddress"))) {
+ newErrMsgs.add("Line number " +
rec.getRecordNumber() + " partyId: " + currentPartyId + " email address
missing");
+ }
+ }
+
+ if (errMsgs.size() == 0) {
+ List <GenericValue> partyCheck =
delegator.findByAnd("PartyIdentification",
UtilMisc.toMap("partyIdentificationTypeId", "PARTY_IMPORT", "idValue",
rec.get("partyId")), null, false);
+ addParty = partyCheck.size() == 0;
+ if (!addParty) { // update party
+ newPartyId =
EntityUtil.getFirst(partyCheck).getString("partyId");
+
+ if (UtilValidate.isNotEmpty(rec.get("groupName")))
{
+ Map<String, Object> partyGroup =
UtilMisc.toMap(
+ "partyId", newPartyId,
+ "preferredCurrencyUomId",
rec.get("preferredCurrencyUomId"),
+ "groupName", rec.get("groupName"),
+ "userLogin", userLogin
+ );
+ result =
dispatcher.runSync("updatePartyGroup", partyGroup);
+ } else { // person
+ Map<String, Object> person = UtilMisc.toMap(
+ "partyId", newPartyId,
+ "firstName", rec.get("firstName"),
+ "middleName", rec.get("midleName"),
+ "lastName", rec.get("lastName"),
+ "preferredCurrencyUomId",
rec.get("preferredCurrencyUomId"),
+ "userLogin", userLogin
+ );
+ result = dispatcher.runSync("updatePerson",
person);
+ }
+
+ } else { // create new party
+ if (UtilValidate.isNotEmpty(rec.get("groupName")))
{
+ Map<String, Object> partyGroup =
UtilMisc.toMap(
+ "preferredCurrencyUomId",
rec.get("preferredCurrencyUomId"),
+ "groupName", rec.get("groupName"),
+ "userLogin", userLogin,
+ "statusId", "PARTY_ENABLED"
+ );
+ result =
dispatcher.runSync("createPartyGroup", partyGroup);
+ } else { // person
+ Map<String, Object> person = UtilMisc.toMap(
+ "firstName", rec.get("firstName"),
+ "middleName", rec.get("midleName"),
+ "lastName", rec.get("lastName"),
+ "preferredCurrencyUomId",
rec.get("preferredCurrencyUomId"),
+ "statusId", "PARTY_ENABLED",
+ "userLogin", userLogin
+ );
+ result = dispatcher.runSync("createPerson",
person);
+ }
+ newPartyId = (String) result.get("partyId");
+
+ Map<String, Object> partyIdentification =
UtilMisc.toMap(
+ "partyId", newPartyId,
+ "partyIdentificationTypeId", "PARTY_IMPORT",
+ "idValue", rec.get("partyId"),
+ "userLogin", userLogin
+ );
+
+ result =
dispatcher.runSync("createPartyIdentification", partyIdentification);
+
+ Map<String, Object> partyRole = UtilMisc.toMap(
+ "partyId", newPartyId,
+ "roleTypeId", rec.get("roleTypeId"),
+ "userLogin", userLogin
+ );
+ dispatcher.runSync("createPartyRole", partyRole);
+
+ if
(UtilValidate.isNotEmpty(rec.get("companyPartyId"))) {
+ List <GenericValue> companyCheck =
delegator.findByAnd("PartyIdentification",
UtilMisc.toMap("partyIdentificationTypeId", "PARTY_IMPORT", "idValue",
rec.get("partyId")), null, false);
+ if (companyCheck.size() == 0) { // update
party group
+ // company does not exist so create
+ Map<String, Object> companyPartyGroup =
UtilMisc.toMap(
+ "partyId", newCompanyPartyId,
+ "statusId", "PARTY_ENABLED",
+ "userLogin", userLogin
+ );
+ result =
dispatcher.runSync("createPartyGroup", companyPartyGroup);
+ newCompanyPartyId = (String)
result.get("partyId");
+ } else {
+ newCompanyPartyId =
EntityUtil.getFirst(companyCheck).getString("partyId");
+ }
+
+ Map<String, Object> companyRole =
UtilMisc.toMap(
+ "partyId", newCompanyPartyId,
+ "roleTypeId", "ACCOUNT",
+ "userLogin", userLogin
+ );
+ dispatcher.runSync("createPartyRole",
companyRole);
+
+ // company exist, so create link
+ Map<String, Object> partyRelationship =
UtilMisc.toMap(
+ "partyIdTo", newPartyId,
+ "partyIdFrom", newCompanyPartyId,
+ "roleTypeIdFrom", "ACCOUNT",
+ "partyRelationshipTypeId", "EMPLOYMENT",
+ "userLogin", userLogin
+ );
+ result =
dispatcher.runSync("createPartyRelationship", partyRelationship);
+ }
+ }
+ Debug.logInfo("
=========================================================party created id: " +
newPartyId, module);
+ partiesCreated++;
+ } else {
+ errMsgs.addAll(newErrMsgs);
+ newErrMsgs = FastList.newInstance();
+ }
+ }
+
+ currentContactMechTypeId = rec.get("contactMechTypeId");
+ currentContactMechPurposeTypeId =
rec.get("contactMechPurposeTypeId");
+ // party correctly created (not updated) and contactMechtype
provided?
+ if (newPartyId != null && addParty &&
UtilValidate.isNotEmpty(currentContactMechTypeId)) {
+
+ // fill maps and check changes
+ Map<String, Object> emailAddress = UtilMisc.toMap(
+ "contactMechTypeId", "EMAIL_ADDRESS",
+ "userLogin", userLogin
+ );
+ Boolean emailAddressChanged = false;
+ if ("EMAIL_ADDRESS".equals(currentContactMechTypeId)) {
+ emailAddress.put("infoString",
rec.get("emailAddress"));
+ emailAddressChanged = lastEmailAddress == null ||
!lastEmailAddress.equals(rec.get("emailAddress"));
+ lastEmailAddress = rec.get("emailAddress");
+ }
+
+ Map<String, Object> postalAddress =
UtilMisc.toMap("userLogin", userLogin);
+ Boolean postalAddressChanged = false;
+ if ("POSTAL_ADDRESS".equals(currentContactMechTypeId)) {
+ postalAddress.put("address1", rec.get("address1"));
+ postalAddress.put("address2", rec.get("address2"));
+ postalAddress.put("city", rec.get("city"));
+ postalAddress.put("stateProvinceGeoId",
rec.get("stateProvinceGeoId"));
+ postalAddress.put("countryGeoId",
rec.get("countryGeoId"));
+ postalAddress.put("postalCode", rec.get("postalCode"));
+ postalAddressChanged =
+ lastAddress1 == null ||
!lastAddress1.equals(postalAddress.get("address1")) ||
+ lastAddress2 == null ||
!lastAddress2.equals(postalAddress.get("address2")) ||
+ lastCity == null ||
!lastCity.equals(postalAddress.get("city")) ||
+ lastCountryGeoId == null ||
!lastCountryGeoId.equals(postalAddress.get("countryGeoId"));
+ lastAddress1 = (String) postalAddress.get("address1");
+ lastAddress2 = (String) postalAddress.get("address2");
+ lastCity = (String) postalAddress.get("city");
+ lastCountryGeoId = (String)
postalAddress.get("countryGeoId");
+ }
+
+ Map<String, Object> telecomNumber =
UtilMisc.toMap("userLogin", userLogin);
+ Boolean telecomNumberChanged = false;
+ if ("TELECOM_NUMBER".equals(currentContactMechTypeId)) {
+ telecomNumber.put("countryCode",
rec.get("telCountryCode"));
+ telecomNumber.put("areaCode", rec.get("telAreaCode"));
+ telecomNumber.put("contactNumber",
rec.get("telContactNumber"));
+ telecomNumberChanged =
+ lastCountryCode == null ||
!lastCountryCode.equals(telecomNumber.get("countryCode")) ||
+ lastAreaCode == null ||
!lastAreaCode.equals(telecomNumber.get("areaCode")) ||
+ lastContactNumber == null ||
!lastContactNumber.equals(telecomNumber.get("contactNumber"));
+ lastCountryCode = (String)
telecomNumber.get("countryCode");
+ lastAreaCode = (String) telecomNumber.get("areaCode");
+ lastContactNumber = (String)
telecomNumber.get("contactNumber");
+ }
+
+ Map<String, Object> partyContactMechPurpose =
UtilMisc.toMap("partyId", newPartyId, "userLogin", userLogin);
+ Boolean partyContactMechPurposeChanged = false;
+ currentContactMechPurposeTypeId =
rec.get("contactMechPurposeTypeId");
+ if (currentContactMechPurposeTypeId != null &&
("TELECOM_NUMBER".equals(currentContactMechTypeId) ||
"POSTAL_ADDRESS".equals(currentContactMechTypeId)
||"EMAIL_ADDRESS".equals(currentContactMechTypeId))) {
+
partyContactMechPurpose.put("contactMechPurposeTypeId",
currentContactMechPurposeTypeId);
+ partyContactMechPurposeChanged =
(lastContactMechPurposeTypeId == null ||
!lastContactMechPurposeTypeId.equals(currentContactMechPurposeTypeId)) &&
!telecomNumberChanged && !postalAddressChanged && !emailAddressChanged;
+
Debug.logInfo("===================================last:" +
lastContactMechPurposeTypeId + " current: " + currentContactMechPurposeTypeId +
" t :" + telecomNumberChanged + " p: " + postalAddressChanged + " e: " +
emailAddressChanged + " result: " + partyContactMechPurposeChanged, module);
+ }
+ lastContactMechPurposeTypeId =
currentContactMechPurposeTypeId;
+
+ // update
+ if (errMsgs.size() == 0) {
+
+ if (postalAddressChanged) {
+ result = dispatcher.runSync("createPostalAddress",
postalAddress);
+ newContactMechId = (String)
result.get("contactMechId");
+ if (currentContactMechPurposeTypeId == null) {
+ currentContactMechPurposeTypeId =
"GENERAL_LOCATION";
+ }
+ dispatcher.runSync("createPartyContactMech",
UtilMisc.toMap("partyId", newPartyId, "contactMechId", newContactMechId,
"contactMechPurposeTypeId", currentContactMechPurposeTypeId, "userLogin",
userLogin));
+ }
+
+ if (telecomNumberChanged) {
+ result = dispatcher.runSync("createTelecomNumber",
telecomNumber);
+ newContactMechId = (String)
result.get("contactMechId");
+ if (currentContactMechPurposeTypeId == null) {
+ currentContactMechPurposeTypeId= "PHONE_WORK";
+ }
+ dispatcher.runSync("createPartyContactMech",
UtilMisc.toMap("partyId", newPartyId, "contactMechId", newContactMechId,
"contactMechPurposeTypeId", currentContactMechPurposeTypeId, "userLogin",
userLogin));
+ }
+
+ if (emailAddressChanged) {
+ result = dispatcher.runSync("createContactMech",
emailAddress);
+ newContactMechId = (String)
result.get("contactMechId");
+ if (currentContactMechPurposeTypeId == null) {
+ currentContactMechPurposeTypeId =
"PRIMARY_EMAIL";
+ }
+ dispatcher.runSync("createPartyContactMech",
UtilMisc.toMap("partyId", newPartyId, "contactMechId", newContactMechId,
"contactMechPurposeTypeId", currentContactMechPurposeTypeId, "userLogin",
userLogin));
+ }
+
+ if (partyContactMechPurposeChanged) {
+ partyContactMechPurpose.put("contactMechId",
newContactMechId);
+ result =
dispatcher.runSync("createPartyContactMechPurpose", partyContactMechPurpose);
+ }
+
+ lastPartyId = currentPartyId;
+ errMsgs.addAll(newErrMsgs);
+ newErrMsgs = FastList.newInstance();
+ }
+ }
+
+ }
+
+ }
+ catch (GenericServiceException e) {
+ Debug.logError(e, module);
+ return ServiceUtil.returnError(e.getMessage());
+ }
+
+ catch (GenericEntityException e) {
+ Debug.logError(e, module);
+ return ServiceUtil.returnError(e.getMessage());
+ }
+
+ catch (IOException e) {
+ Debug.logError(e, module);
+ return ServiceUtil.returnError(e.getMessage());
+ }
+
+ if (errMsgs.size() > 0) {
+ return ServiceUtil.returnError(errMsgs);
+ }
+
+ result = ServiceUtil.returnSuccess(partiesCreated + " new parties
created");
+ return result;
+ }
}
Modified: ofbiz/trunk/applications/party/webapp/partymgr/WEB-INF/controller.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/webapp/partymgr/WEB-INF/controller.xml?rev=1507200&r1=1507199&r2=1507200&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/webapp/partymgr/WEB-INF/controller.xml
(original)
+++ ofbiz/trunk/applications/party/webapp/partymgr/WEB-INF/controller.xml Fri
Jul 26 07:00:28 2013
@@ -906,6 +906,22 @@ under the License.
<response name="success" type="view" value="FindAddressMatch"/>
</request-map>
+ <!-- Import export -->
+ <request-map uri="ImportExport">
+ <security https="true" auth="true"/>
+ <response name="success" type="view" value="ImportExport"/>
+ </request-map>
+ <request-map uri="ExportPartyCsv.csv">
+ <security https="true" auth="true"/>
+ <response name="success" type="view" value="PartyExportCsv"/>
+ </request-map>
+ <request-map uri="uploadParty">
+ <security auth="true" https="true"/>
+ <event invoke="importParty" path="" type="service"/>
+ <response name="success" type="request" value="ImportExport"/>
+ <response name="error" type="view" value="ImportExport"/>
+ </request-map>
+
<!-- ================ SimpleContent Requests ================= -->
<request-map uri="ViewSimpleContent">
@@ -1352,6 +1368,10 @@ under the License.
<view-map name="AddressMatchMap" type="screen"
page="component://party/widget/partymgr/PartyScreens.xml#AddressMatchMap"/>
<view-map name="FindAddressMatch" type="screen"
page="component://party/widget/partymgr/PartyScreens.xml#FindAddressMatch"/>
+
+ <view-map name="ImportExport" type="screen"
page="component://party/widget/partymgr/PartyScreens.xml#ImportExport"/>
+ <view-map name="PartyExportCsv" type="screencsv"
page="component://party/widget/partymgr/PartyScreens.xml#PartyExportCsv"
content-type="text/csv" encoding="none"/>
+
<view-map name="EditPartyContents" type="screen"
page="component://party/widget/partymgr/PartyScreens.xml#EditPartyContents"/>
<view-map name="editCarrierAccount" type="screen"
page="component://party/widget/partymgr/PartyScreens.xml#editCarrierAccount"/>
<view-map name="partyInvitation" type="screen"
page="component://party/widget/partymgr/PartyInvitationScreens.xml#FindPartyInvitations"/>
Modified: ofbiz/trunk/applications/party/widget/partymgr/PartyForms.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/widget/partymgr/PartyForms.xml?rev=1507200&r1=1507199&r2=1507200&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/widget/partymgr/PartyForms.xml (original)
+++ ofbiz/trunk/applications/party/widget/partymgr/PartyForms.xml Fri Jul 26
07:00:28 2013
@@ -1198,4 +1198,56 @@ under the License.
</hyperlink>
</field>
</form>
+
+ <form name="ExportParty" type="single" target="ExportPartyCsv.csv"
title="" >
+ <field name="partyId" tooltip="blank for all"><lookup
target-form-name="LookupPartyName"/></field>
+ <field name="submitButton" title="${uiLabelMap.CommonSubmit}"><submit
button-type="button"/></field>
+ </form>
+
+ <form name="ExportPartyCsv" list-name="listIt" target="" title=""
type="list" view-size="99999"
+ odd-row-style="alternate-row" header-row-style="header-row-2"
default-table-style="basic-table hover-bar" paginate="false">
+ <actions>
+ <entity-condition entity-name="PartyExport">
+ <condition-list combine="and">
+ <condition-list combine="or">
+ <condition-expr field-name="roleTypeId"
value="CUSTOMER" operator="equals"/>
+ <condition-expr field-name="roleTypeId"
value="SUPPLIER" operator="equals"/>
+ <condition-expr field-name="roleTypeId"
value="EMPLOYEE" operator="equals"/>
+ </condition-list>
+ <condition-expr field-name="statusId"
value="PARTY_DISABLED" operator="not-equals"/>
+ <condition-expr field-name="partyId" from-field="partyId"
operator="equals" value="${parameters.partyId}" ignore-if-empty="true"/>
+ </condition-list>
+ <order-by field-name="partyId"/>
+ </entity-condition>
+ </actions>
+ <field name="partyId" title="partyId"><display/></field>
+ <field name="preferredCurrencyUomId"
title="preferredCurrencyUomId"><display/></field>
+ <field name="groupName" title="groupName"><display/></field>
+ <field name="firstName" title="firstName"><display/></field>
+ <field name="middleName" title="middleName"><display/></field>
+ <field name="lastName" title="lastName"><display/></field>
+ <field name="companyPartyId" title="companyPartyId"><display/></field>
+ <field name="companyName" title="companyName"><display/></field>
+ <field name="roleTypeId" title="roleTypeId"><display/></field>
+ <field name="contactMechPurposeTypeId"
title="contactMechPurposeTypeId"><display/></field>
+ <field name="contactMechTypeId"
title="contactMechTypeId"><display/></field>
+ <field name="emailAddress" title="emailAddress"><display/></field>
+ <field name="telCountryCode" title="telCountryCode"><display/></field>
+ <field name="telAreaCode" title="telAreaCode"><display/></field>
+ <field name="telContactNumber"
title="telContactNumber"><display/></field>
+ <field name="address1" title="address1"><display/></field>
+ <field name="address2" title="address2"><display/></field>
+ <field name="city" title="city"><display/></field>
+ <field name="stateProvinceGeoId"
title="stateProvinceGeoId"><display/></field>
+ <field name="postalCode" title="postalCode"><display/></field>
+ <field name="countryGeoId" title="countryGeoId"><display/></field>
+ </form>
+
+ <form name="ImportParty" type="upload" target="uploadParty" title="" >
+ <field name="uploadedFile"><file/></field>
+ <field name="submitButton" title="${uiLabelMap.CommonUpload}"><submit
button-type="button"/></field>
+ </form>
+
+
+
</forms>
Modified: ofbiz/trunk/applications/party/widget/partymgr/PartyMenus.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/widget/partymgr/PartyMenus.xml?rev=1507200&r1=1507199&r2=1507200&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/widget/partymgr/PartyMenus.xml (original)
+++ ofbiz/trunk/applications/party/widget/partymgr/PartyMenus.xml Fri Jul 26
07:00:28 2013
@@ -35,6 +35,7 @@
</menu-item>
<menu-item name="addrmap"
title="${uiLabelMap.PageTitleAddressMatchMap}"><link
target="addressMatchMap"/></menu-item>
<menu-item name="partyinv" title="${uiLabelMap.PartyInvitation}"><link
target="partyInvitation"/></menu-item>
+ <menu-item name="importexport"
title="${uiLabelMap.CommonImportExport}"><link
target="ImportExport"/></menu-item>
</menu>
<menu name="ProfileTabBar" extends="CommonTabBarMenu"
extends-resource="component://common/widget/CommonMenus.xml"
Modified: ofbiz/trunk/applications/party/widget/partymgr/PartyScreens.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/widget/partymgr/PartyScreens.xml?rev=1507200&r1=1507199&r2=1507200&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/widget/partymgr/PartyScreens.xml (original)
+++ ofbiz/trunk/applications/party/widget/partymgr/PartyScreens.xml Fri Jul 26
07:00:28 2013
@@ -1302,4 +1302,41 @@ under the License.
</widgets>
</section>
</screen>
+ <screen name="ImportExport">
+ <section>
+ <actions>
+ <set field="titleProperty" value="CommonImportExport"/>
+ <set field="headerItem" value="importexport"/>
+ </actions>
+ <widgets>
+ <decorator-screen name="main-decorator"
location="${parameters.mainDecoratorLocation}">
+ <decorator-section name="body">
+ <screenlet title="${uiLabelMap.PartyParty}
${uiLabelMap.CommonImportExport} ID Name, single role (employee, customer,
supplier) and contactmechs">
+ <container style="lefthalf">
+ <label
style="h2">${uiLabelMap.CommonImport}</label>
+ <include-form name="ImportParty"
location="component://party/widget/partymgr/PartyForms.xml"/>
+ </container>
+ <container style="righthalf">
+ <label
style="h2">${uiLabelMap.CommonExport}</label>
+ <include-form name="ExportParty"
location="component://party/widget/partymgr/PartyForms.xml"/>
+ </container>
+ </screenlet>
+ </decorator-section>
+ </decorator-screen>
+ </widgets>
+ </section>
+ </screen>
+ <screen name="PartyExportCsv">
+ <section>
+ <actions>
+ <property-map resource="CommonUiLabels" map-name="uiLabelMap"
global="true"/>
+ <property-map resource="AccountingUiLabels"
map-name="uiLabelMap" global="true"/>
+ <set field="organizationPartyId"
from-field="parameters.organizationPartyId"/>
+ </actions>
+ <widgets>
+ <include-form name="ExportPartyCsv"
location="component://party/widget/partymgr/PartyForms.xml"/>
+ </widgets>
+ </section>
+ </screen>
+
</screens>