Yes, I first thought about that. But what I find weird is that lines like
Map<String, Object> filter = UtilMisc.toMap("orderItemSeqId",
orderItem.get("orderItemSeqId"));
Map<String, Object> deletePcmCtx = UtilMisc.toMap("contactMechId",
context.get("contactMechId"));
compile and also that Hans, and buildbot did not detect it, so some 1.6(?)
compilers are ok with it.
For the lines above I guess it's due to how UtilMisc.toMap() works, but for the
compilers, it's still weird to me.
BTW, you might also use
Map<String, Object> postalAddress = UtilMisc.toMap("userLogin", (Object)
userLogin);
Which is a little less verbose ;)
Jacques
From: "Scott Gray" <[email protected]>
>> I replaced by
>> Map<String, Object> postalAddress = new HashMap<String, Object>();
>> postalAddress.put("userLogin", userLogin);
>
> The correct approach is:
> Map<String, Object> postalAddress = UtilMisc.<String,
> Object>toMap("userLogin", userLogin);
>
> Regards
> Scott
>
> On 27/07/2013, at 8:48 PM, Jacques Le Roux wrote:
>
>> Hi Hans,
>>
>> There is an issue with this commit. It does not compile on trunk demo nor in
>> my local copy/
>> I wonder though
>> why Buildbot did not detect it (certainly it uses a more recent jdk version);
>> and also why my IDE (Eclipse) does not detect it (I guess because I use 1.7
>> complying 1.6 to internally build);
>> and also why this fails, because the same scheme is successfully used
>> elsewhere in code.
>>
>> The demo compilers (mine for ant is is jdk 1.6 22, ) say:
>>
>> classes:
>> [javac16] Compiling 11 source files to
>> /home/ofbiz/trunk/applications/party/build/classes
>> [javac16]
>> /home/ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyServices.java:2097:
>> incompatible types
>> [javac16] found :
>> java.util.Map<java.lang.String,org.ofbiz.entity.GenericValue>
>> [javac16] required: java.util.Map<java.lang.String,java.lang.Object>
>> [javac16] Map<String, Object> postalAddress =
>> UtilMisc.toMap("userLogin", userLogin);
>> [javac16]
>> ^
>> [javac16]
>> /home/ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyServices.java:2117:
>> incompatible types
>> [javac16] found :
>> java.util.Map<java.lang.String,org.ofbiz.entity.GenericValue>
>> [javac16] required: java.util.Map<java.lang.String,java.lang.Object>
>> [javac16] Map<String, Object> telecomNumber =
>> UtilMisc.toMap("userLogin", userLogin);
>> [javac16]
>> ^
>> [javac16] 2 errors
>>
>> BUILD FAILED
>> /home/ofbiz/trunk/build.xml:206: The following error occurred while
>> executing this line:
>> /home/ofbiz/trunk/applications/build.xml:67: The following error occurred
>> while executing this line:
>> /home/ofbiz/trunk/macros.xml:39: The following error occurred while
>> executing this line:
>> /home/ofbiz/trunk/common.xml:91: Compile failed; see the compiler error
>> output for details.
>>
>> Total time: 1 minute 2 seconds
>> $ java -version
>> java version "1.6.0_26"
>> Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
>> Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
>>
>>
>> Of course replacing by
>> java.util.Map<java.lang.String,java.lang.Object> postalAddress =
>> UtilMisc.toMap("userLogin", userLogin);
>> as the compilers suggest does not help.
>>
>> I replaced by
>> Map<String, Object> postalAddress = new HashMap<String, Object>();
>> postalAddress.put("userLogin", userLogin);
>>
>> And it worked, this must be investigated... I guess it's related with how
>> UtilMisc.toMap() works. But still, looking at it it's quite weird, enough
>> for me on that today...
>>
>> Hans, I guess your jdk version compiles? Do you use a 1.6 version? Which
>> one? Please let us know, thanks!
>>
>> I restarted the trunk demo
>>
>> Jacques
>>
>>
>> ----- Original Message -----
>> From: <[email protected]>
>> To: <[email protected]>
>> Sent: Friday, July 26, 2013 9:00 AM
>> Subject: svn commit: r1507200 - in /ofbiz/trunk/applications/party: ./ data/
>> entitydef/ servicedef/ src/org/ofbiz/party/party/ webapp/partymgr/WEB-INF/
>> widget/partymgr/
>>
>>
>>> 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>
>>>
>>>
>
>