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>