You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ha...@apache.org on 2013/07/11 05:14:30 UTC

svn commit: r1502093 - in /ofbiz/trunk: ./ applications/accounting/config/ applications/accounting/data/ applications/accounting/entitydef/ applications/accounting/servicedef/ applications/accounting/src/org/ofbiz/accounting/invoice/ applications/accou...

Author: hansbak
Date: Thu Jul 11 03:14:30 2013
New Revision: 1502093

URL: http://svn.apache.org/r1502093
Log:
add a csv import/export invoices at an organizational level with partyid and productid translation functions, more imports/exports will follow

Added:
    ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar   (with props)
Modified:
    ofbiz/trunk/.classpath
    ofbiz/trunk/LICENSE
    ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml
    ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml
    ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml
    ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml
    ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml
    ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java
    ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml
    ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml
    ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml
    ofbiz/trunk/framework/common/config/CommonUiLabels.xml

Modified: ofbiz/trunk/.classpath
URL: http://svn.apache.org/viewvc/ofbiz/trunk/.classpath?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/.classpath (original)
+++ ofbiz/trunk/.classpath Thu Jul 11 03:14:30 2013
@@ -83,6 +83,7 @@
     <classpathentry kind="lib" path="framework/base/lib/commons/commons-pool-1.3.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/commons/commons-primitives-1.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/commons/commons-validator-1.4.0.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-csv-1.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-activation_1.0.2_spec-1.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-j2ee-connector_1.5_spec-1.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-jaxr_1.0_spec-1.0.jar"/>

Modified: ofbiz/trunk/LICENSE
URL: http://svn.apache.org/viewvc/ofbiz/trunk/LICENSE?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/LICENSE (original)
+++ ofbiz/trunk/LICENSE Thu Jul 11 03:14:30 2013
@@ -44,6 +44,7 @@ framework/base/lib/commons/commons-cli-1
 framework/base/lib/commons/commons-codec-1.6.jar
 framework/base/lib/commons/commons-collections-3.2.1.jar
 framework/base/lib/commons/commons-compress-1.4.1.jar
+framework/base/lib/commons/commons-csv-1.0.jar
 framework/base/lib/commons/commons-digester3-3.2.jar
 framework/base/lib/commons/commons-discovery-0.4.jar
 framework/base/lib/commons/commons-el-1.0.jar
@@ -2729,4 +2730,5 @@ This package also includes the following
       donated by SyncRO Soft Ltd., the publishers of the oXygen XML Editor.
     * Cosmetic improvements provided by OpenStack.
 
-Webhelp for DocBook was developed as a Google Summer of Code project. August 2010
\ No newline at end of file
+Webhelp for DocBook was developed as a Google Summer of Code project. August 2010
+

Modified: ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml (original)
+++ ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml Thu Jul 11 03:14:30 2013
@@ -5010,6 +5010,9 @@
         <value xml:lang="zh">固定资产数据中的期望使用寿命结束为空。</value>
         <value xml:lang="zh_TW">固定資產資料中的期望使用壽命結束為空。</value>
     </property>
+    <property key="AccountingExportInvoices">
+        <value xml:lang="en">Export Invoices</value>
+    </property>
     <property key="AccountingExpenses">
         <value xml:lang="de">Aufwendungen</value>
         <value xml:lang="en">Expenses</value>

Modified: ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml (original)
+++ ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml Thu Jul 11 03:14:30 2013
@@ -1087,4 +1087,7 @@ under the License.
     <CustomMethod customMethodId="STR_LINE_DEP_FORMULA" customMethodTypeId="DEPRECIATION_FORMULA" customMethodName="straightLineDepreciation" description="Straight Line depreciatiion algorithm for fixed asset((purchaseCost - salvageCost)/expectedLifeInYears)"/>
     <CustomMethod customMethodId="DBL_DECL_DEP_FORMULA" customMethodTypeId="DEPRECIATION_FORMULA" customMethodName="doubleDecliningBalanceDepreciation" description="Double decline depreciatiion algorithm for fixed asset((NetBookValue - salvageCost)*2/remainingLifeInYears)"/>
 
+    <!-- invoice export replacement Id types -->
+    <GoodIdentificationType description="replacement value for partyId in the invoice export function in accounting" goodIdentificationTypeId="INVOICE_EXPORT"/>
+    <PartyIdentificationType description="replacement value for partyId in the invoice export function in accounting" partyIdentificationTypeId="INVOICE_EXPORT"/>
 </entity-engine-xml>

Modified: ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml (original)
+++ ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml Thu Jul 11 03:14:30 2013
@@ -224,4 +224,7 @@ under the License.
             partyId="Company" transactionDate="2009-07-18 00:00:01.000" entryDate="2009-08-11 12:28:45.315" performedByPartyId="admin" statusId="FINACT_TRNS_CREATED" paymentId="8002"/>
     <Payment paymentId="8002" finAccountTransId="9104"/>
 
+    <!-- invoice export demo data for replacement id's -->
+    <GoodIdentification goodIdentificationTypeId="INVOICE_EXPORT" idValue="GZ-2644-replaced" productId="GZ-2644"/>
+    <PartyIdentification idValue="DemoCustomer2" partyId="DemoCustomer" partyIdentificationTypeId="INVOICE_EXPORT"/>
 </entity-engine-xml>

Modified: ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml (original)
+++ ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml Thu Jul 11 03:14:30 2013
@@ -77,4 +77,51 @@ under the License.
             <key-map field-name="productId"/>
         </view-link>
     </view-entity>
+    
+    <view-entity entity-name="InvoiceExport" package-name="org.ofbiz.accounting.reports">
+        <member-entity entity-alias="INV" entity-name="Invoice"/>
+        <member-entity entity-alias="ITM" entity-name="InvoiceItem"/>
+        <member-entity entity-alias="PFR" entity-name="PartyIdentification"/>
+        <member-entity entity-alias="PTO" entity-name="PartyIdentification"/>
+        <member-entity entity-alias="GI" entity-name="GoodIdentification"/>
+        <alias entity-alias="INV" name="invoiceId" />
+        <alias entity-alias="INV" name="invoiceDate"/>
+        <alias entity-alias="INV" name="invoiceTypeId"/>
+        <alias entity-alias="INV" name="description"/>
+        <alias entity-alias="INV" name="partyIdFrom"/>
+        <alias entity-alias="PFR" name="partyIdFromTrans" field="idValue"/>
+        <alias entity-alias="INV" name="partyId"/>
+        <alias entity-alias="PTO" name="partyIdTrans" field="idValue"/>
+        <alias entity-alias="INV" name="currencyUomId"/>
+        <alias entity-alias="INV" name="referenceNum"/>
+        <alias entity-alias="ITM" name="invoiceItemSeqId"/>
+        <alias entity-alias="ITM" name="invoiceItemTypeId"/>
+        <alias entity-alias="ITM" name="itemDescription" field="description"/>
+        <alias entity-alias="ITM" name="productId"/>
+        <alias entity-alias="GI" name="productIdTrans" field="idValue"/>
+        <alias entity-alias="ITM" name="quantity"/>
+        <alias entity-alias="ITM" name="amount"/>
+        <view-link entity-alias="INV" rel-entity-alias="ITM" rel-optional="true">
+            <key-map field-name="invoiceId"/>
+        </view-link>
+        <view-link entity-alias="INV" rel-entity-alias="PFR" rel-optional="true">
+            <key-map field-name="partyIdFrom" rel-field-name="partyId"/>
+            <entity-condition>
+                <condition-expr entity-alias="PFR" field-name="partyIdentificationTypeId" value="INVOICE_EXPORT"/>
+            </entity-condition>
+        </view-link>
+        <view-link entity-alias="INV" rel-entity-alias="PTO" rel-optional="true">
+            <key-map field-name="partyId"/>
+            <entity-condition>
+                <condition-expr entity-alias="PTO" field-name="partyIdentificationTypeId" value="INVOICE_EXPORT"/>
+            </entity-condition>
+        </view-link>
+        <view-link entity-alias="ITM" rel-entity-alias="GI" rel-optional="true">
+            <key-map field-name="productId"/>
+            <entity-condition>
+                <condition-expr entity-alias="GI" field-name="goodIdentificationTypeId"/>
+            </entity-condition>
+        </view-link>
+    </view-entity>
+
 </entitymodel>

Modified: ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml (original)
+++ ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml Thu Jul 11 03:14:30 2013
@@ -430,5 +430,12 @@ under the License.
         <attribute name="invoiceId" type="String" mode="IN" optional="false"/>
         <attribute name="isForeign" type="Boolean" mode="OUT" optional="false"/>
     </service>
+    <service name="importInvoice" engine="java"
+        location="org.ofbiz.accounting.invoice.InvoiceServices" invoke="importInvoice" auth="true">
+        <description>Import an invoice with invoiceitems in csv format</description>
+        <permission-service service-name="acctgInvoicePermissionCheck" main-action="CREATE"/>
+        <attribute mode="INOUT" name="organizationPartyId" type="String" optional="false"/>
+        <attribute mode="IN" name="uploadedFile" type="java.nio.ByteBuffer" optional="true" />
+    </service>
     
 </services>

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java Thu Jul 11 03:14:30 2013
@@ -18,7 +18,16 @@
  *******************************************************************************/
 package org.ofbiz.accounting.invoice;
 
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVFormat.CSVFormatBuilder;
+import org.apache.commons.csv.CSVRecord;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
 import java.math.BigDecimal;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -3334,5 +3343,164 @@ public class InvoiceServices {
             return ServiceUtil.returnError(ee.getMessage());
         }
     }
+    
+    public static Map<String, Object> importInvoice(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 organizationPartyId = (String) context.get("organizationPartyId");
+        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 lastInvoiceId = null;
+        String currentInvoiceId = null;
+        String newInvoiceId = null;
+        int invoicesCreated = 0;
+        
+        if (fileBytes == null) {
+        	return ServiceUtil.returnError("Uploaded file data not found");
+        }
+        
+        try {
+        	for(final CSVRecord rec : fmt.parse(csvReader)) {
+        		currentInvoiceId =  rec.get("invoiceId");
+        		if (lastInvoiceId == null || !currentInvoiceId.equals(lastInvoiceId)) {
+        			newInvoiceId = null;
+        			Map<String, Object> invoice = UtilMisc.toMap(
+        				"invoiceTypeId", rec.get("invoiceTypeId"),
+        				"partyIdFrom", rec.get("partyIdFrom"),
+        				"partyId", rec.get("partyId"),
+        				"invoiceDate", rec.get("invoiceDate"),
+        				"dueDate", rec.get("dueDate"),
+        				"currencyUomId", rec.get("currencyUomId"),
+        				"description", rec.get("description"),
+        				"referenceNum", rec.get("referenceNum") + "   Imported: orginal InvoiceId: " + currentInvoiceId,
+                		"userLogin", userLogin
+                		);
+
+        			// replace values if required
+        			if (UtilValidate.isNotEmpty(rec.get("partyIdFromTrans"))) {
+        				invoice.put("partyIdFrom", rec.get("partyIdFromTrans"));
+        			}
+        			if (UtilValidate.isNotEmpty(rec.get("partyIdTrans"))) {
+        				invoice.put("partyId", rec.get("partyIdTrans"));
+        			}
+
+        			// invoice validation
+                    try {
+            	    	newErrMsgs = FastList.newInstance();
+                        if (UtilValidate.isEmpty(invoice.get("partyIdFrom"))) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Mandatory Party Id From and Party Id From Trans missing for invoice: " + currentInvoiceId);
+                        } else if (delegator.findOne("Party", UtilMisc.<String, Object>toMap("partyId", invoice.get("partyIdFrom")), false) == null) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": partyIdFrom: " + invoice.get("partyIdFrom") + " not found for invoice: " + currentInvoiceId);
+                        }
+                        if (UtilValidate.isEmpty(invoice.get("partyId"))) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Mandatory Party Id and Party Id Trans missing for invoice: " + currentInvoiceId);
+                        } else if (delegator.findOne("Party", UtilMisc.<String, Object>toMap("partyId", invoice.get("partyId")), false) == null) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": partyId: " + invoice.get("partyId") + " not found for invoice: " + currentInvoiceId);
+                        }
+                        if (UtilValidate.isEmpty(invoice.get("invoiceTypeId"))) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Mandatory Invoice Type missing for invoice: " + currentInvoiceId);
+                        } else if (delegator.findOne("InvoiceType", UtilMisc.<String, Object>toMap("invoiceTypeId", invoice.get("invoiceTypeId")), false) == null) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": InvoiceItem type id: " + invoice.get("invoiceTypeId") + " not found for invoice: " + currentInvoiceId);
+                        }
+                        GenericValue invoiceType = delegator.findOne("InvoiceType", UtilMisc.<String, Object>toMap("invoiceTypeId", invoice.get("invoiceTypeId")), false);
+                        if ("PURCHASE_INVOICE".equals(invoiceType.getString("parentTypeId")) && !invoice.get("partyId").equals(organizationPartyId)) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": A purchase type invoice should have the partyId 'To' being the organizationPartyId(=" + organizationPartyId + ")! however is " + invoice.get("partyId") +"! invoice: " + currentInvoiceId);
+                        }
+                        if ("SALES_INVOICE".equals(invoiceType.getString("parentTypeId")) && !invoice.get("partyIdFrom").equals(organizationPartyId)) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": A sales type invoice should have the partyId 'from' being the organizationPartyId(=" + organizationPartyId + ")! however is " + invoice.get("partyIdFrom") +"! invoice: " + currentInvoiceId);
+                        }
+                        
+                    
+                    } catch (GenericEntityException e) {
+                        Debug.logError("Valication checking problem against database. due to " + e.getMessage(), module);
+                    }
+
+                    if (newErrMsgs.size() > 0) {
+        				errMsgs.addAll(newErrMsgs);
+                    } else {
+                        Map<String, Object> invoiceResult = null;
+                    	try {
+                            invoiceResult = dispatcher.runSync("createInvoice", invoice);
+                    		} catch (GenericServiceException e) {
+                    			Debug.logError(e, module);
+                    			return ServiceUtil.returnError(e.getMessage());
+                    		}
+                        newInvoiceId = (String) invoiceResult.get("invoiceId");
+                        invoicesCreated++;
+        			}
+                    lastInvoiceId = currentInvoiceId;
+        		}
+
+        		
+        		if (newInvoiceId != null) {
+        			Map<String, Object> invoiceItem = UtilMisc.toMap(
+                    		"invoiceId", newInvoiceId,
+                    		"invoiceItemSeqId", rec.get("invoiceItemSeqId"),
+                    		"invoiceItemTypeId", rec.get("invoiceItemTypeId"),
+                    		"productId", rec.get("productId"),
+                    		"description", rec.get("itemDescription"),
+                    		"amount", rec.get("amount"),
+                    		"quantity", rec.get("quantity"),
+                    		"userLogin", userLogin
+                    		);
+
+        			if (UtilValidate.isNotEmpty(rec.get("productIdTrans"))) {
+        				invoiceItem.put("productId", rec.get("productIdTrans"));
+        			}
+        			// invoice item validation
+                    try {
+            	    	newErrMsgs = FastList.newInstance();
+                        if (UtilValidate.isEmpty(invoiceItem.get("invoiceItemSeqId"))) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Mandatory item sequence Id missing for invoice: " + currentInvoiceId);
+                        } 
+                        if (UtilValidate.isEmpty(invoiceItem.get("invoiceItemTypeId"))) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Mandatory invoice item type missing for invoice: " + currentInvoiceId);
+                        } else if (delegator.findOne("InvoiceItemType", UtilMisc.<String, Object>toMap("invoiceItemTypeId", invoiceItem.get("invoiceItemTypeId")), false) == null) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": InvoiceItem Item type id: " + invoiceItem.get("invoiceItemTypeId") + " not found for invoice: " + currentInvoiceId + " Item seqId:" + invoiceItem.get("invoiceItemSeqId"));
+                        } 
+                        if (UtilValidate.isEmpty(invoiceItem.get("productId")) && UtilValidate.isEmpty(invoiceItem.get("description"))) {
+                        }                    
+                        if (UtilValidate.isNotEmpty(invoiceItem.get("productId")) && delegator.findOne("Product", UtilMisc.<String, Object>toMap("productId", invoiceItem.get("productId")), false) == null) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Product Id: " + invoiceItem.get("productId") + " not found for invoice: " + currentInvoiceId + " Item seqId:" + invoiceItem.get("invoiceItemSeqId"));
+                        } 
+                        if (UtilValidate.isEmpty(invoiceItem.get("amount")) && UtilValidate.isEmpty(invoiceItem.get("quantity"))) {
+                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Either or both quantity and amount is required for invoice: " + currentInvoiceId + " Item seqId:" + invoiceItem.get("invoiceItemSeqId"));
+                        }                    
+                    } catch (GenericEntityException e) {
+                        Debug.logError("Validation checking problem against database. due to " + e.getMessage(), module);
+                    }
+
+                    if (newErrMsgs.size() > 0) {
+        				errMsgs.addAll(newErrMsgs);
+                    } else {
+            			try {
+            				dispatcher.runSync("createInvoiceItem", invoiceItem);
+            			} catch (GenericServiceException 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);
+        }
 
+        Map<String, Object> result = ServiceUtil.returnSuccess(invoicesCreated + " new invoice(s) created");
+        result.put("organizationPartyId", organizationPartyId);
+        return result;
+    }
 }

Modified: ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml (original)
+++ ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml Thu Jul 11 03:14:30 2013
@@ -753,6 +753,23 @@ under the License.
         <security https="true" auth="true"/>
         <response name="success" type="view" value="ListGlAccountOrgCsv"/>
     </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="PartyAccountsExportInvoicesCsv.csv">
+        <security https="true" auth="true"/>
+        <response name="success" type="view" value="PartyAccountsExportInvoicesCsv"/>
+    </request-map>
+    <request-map uri="uploadInvoice">
+        <security auth="true" https="true"/>
+        <event invoke="importInvoice" path="" type="service"/>
+        <response name="success" type="request" value="ImportExport"/>
+        <response name="error" type="view" value="ImportExport"/>
+    </request-map>
 
     <!-- TO BE REMOVED
     <request-map uri="EditGlobalGlAccountOrganizations"><security https="true" auth="true"/><response name="success" type="view" value="EditGlobalGlAccountOrganizations"/></request-map>
@@ -2768,6 +2785,10 @@ under the License.
     <view-map name="ListGlAccountOrgPdf" type="screenfop" page="component://accounting/widget/GlSetupScreens.xml#ListGlAccountOrgPdf" content-type="application/pdf" encoding="none"/>
     <view-map name="ListGlAccountOrgCsv" type="screencsv" page="component://accounting/widget/GlSetupScreens.xml#ListGlAccountOrgCsv" content-type="text/csv" encoding="none"/>
 
+    <!-- import export -->
+    <view-map name="ImportExport" type="screen" page="component://accounting/widget/GlSetupScreens.xml#ImportExport"/>
+    <view-map name="PartyAccountsExportInvoicesCsv" type="screencsv" page="component://accounting/widget/GlSetupScreens.xml#PartyAccountsExportInvoicesCsv" content-type="text/csv" encoding="none"/>
+
     <!-- Manual Credit Card Transaction -->
     <view-map name="FindGatewayResponses" page="component://accounting/widget/TransactionScreens.xml#FindGatewayResponses" type="screen"/>
     <view-map name="ViewGatewayResponse" page="component://accounting/widget/TransactionScreens.xml#ViewGatewayResponse" type="screen"/>

Modified: ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml (original)
+++ ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml Thu Jul 11 03:14:30 2013
@@ -34,6 +34,11 @@ under the License.
                 <parameter param-name="organizationPartyId" from-field="partyId"/>
             </hyperlink>
         </field>
+        <field name="importexport" title=" " use-when="hasBasicPermission" widget-style="buttontext">
+            <hyperlink target="ImportExport" description="${uiLabelMap.CommonImportExport}">
+                <parameter param-name="organizationPartyId" from-field="partyId"/>
+            </hyperlink>
+        </field>
     </form>
 
     <form name="ListGlAccountOrganization" list-name="listIt" target="" title="" type="list" view-size="50"
@@ -71,6 +76,55 @@ under the License.
         <field name="submitButton" title="${uiLabelMap.AccountingNewCompany}"><submit button-type="button"/></field>
     </form>
 
+    <form name="ExportInvoice" type="single" target="PartyAccountsExportInvoicesCsv.csv" title="" >
+        <field name="organizationPartyId"><hidden value="${parameters.organizationPartyId}"/></field>
+        <field name="invoiceId"><lookup target-form-name="LookupInvoice"/></field>
+        <field name="startDate"><date-time/></field>
+        <field name="submitButton" title="${uiLabelMap.CommonSubmit}"><submit button-type="button"/></field>
+    </form>
+
+    <form name="PartyAccountsExportInvoicesCsv" 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="InvoiceExport">
+                <condition-list combine="and">
+                    <condition-list combine="or">
+                        <condition-expr field-name="partyIdFrom" from-field="organizationPartyId" operator="equals"/>
+                        <condition-expr field-name="partyId" from-field="organizationPartyId" operator="equals"/>
+                    </condition-list>
+                    <condition-expr field-name="invoiceDate" operator="greater-equals" from-field="parameters.startDate" ignore-if-empty="true"/>
+                    <condition-expr field-name="invoiceId" operator="equals" from-field="parameters.invoiceId" ignore-if-empty="true"/>
+                </condition-list>
+                <order-by field-name="invoiceId"/>
+            </entity-condition>
+        </actions>
+        <field name="organizationPartyId"><hidden value="${organizationPartyId}"/></field>
+        <field name="invoiceId" title="invoiceId"><display/></field>
+        <field name="invoiceTypeId" title="invoiceTypeId"><display/></field>
+        <field name="invoiceDate" title="invoiceDate"><display/></field>
+        <field name="dueDate" title="dueDate"><display/></field>
+        <field name="partyIdFrom" title="partyIdFrom"><display/></field>
+        <field name="partyIdFromTrans" title="partyIdFromTrans"><display/></field>
+        <field name="partyId" title="partyId"><display/></field>
+        <field name="partyIdTrans" title="partyIdTrans"><display/></field>
+        <field name="currencyUomId" title="currencyUomId"><display/></field>
+        <field name="description" title="description"><display/></field>
+        <field name="referenceNum" title="referenceNum"><display/></field>
+        <field name="invoiceItemSeqId" title="invoiceItemSeqId"><display/></field>
+        <field name="invoiceItemTypeId" title="invoiceItemTypeId"><display/></field>
+        <field name="productId" title="productId"><display/></field>
+        <field name="productIdTrans" title="productIdTrans"><display/></field>
+        <field name="itemDescription" title="itemDescription"><display/></field>
+        <field name="quantity" title="quantity"><display/></field>
+        <field name="amount" title="amount"><display/></field>
+    </form>
+    
+    <form name="ImportInvoice" type="upload" target="uploadInvoice" title="" >
+        <field name="organizationPartyId"><hidden value="${parameters.organizationPartyId}"/></field>
+        <field name="uploadedFile"><file/></field>
+        <field name="submitButton" title="${uiLabelMap.CommonUpload}"><submit button-type="button"/></field>
+    </form>
+
     <form name="AssignGlAccount" type="single" target="createGlAccountOrganization" title="" default-map-name="account"
         header-row-style="header-row" default-table-style="basic-table">
         <field name="organizationPartyId"><hidden/></field>

Modified: ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml (original)
+++ ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml Thu Jul 11 03:14:30 2013
@@ -51,7 +51,6 @@ under the License.
     <screen name="ListCompanies">
         <section>
             <actions>
-                <property-map resource="AccountingUiLabels" map-name="uiLabelMap" global="true"/>
                 <set field="titleProperty" value="AccountingAvailableInternalOrganizations"/>
                 <set field="headerItem" value="companies"/>
                 <set field="labelTitleProperty" value="${uiLabelMap.AccountingAvailableInternalOrganizations}"/>
@@ -80,7 +79,6 @@ under the License.
     <screen name="AddCompany">
         <section>
             <actions>
-                <property-map resource="AccountingUiLabels" map-name="uiLabelMap" global="true"/>
                 <set field="titleProperty" value="AccountingNewCompany"/>
             </actions>
             <widgets>
@@ -94,6 +92,32 @@ under the License.
             </widgets>
         </section>
     </screen>
+    <screen name="ImportExport">
+        <section>
+            <actions>
+                <set field="titleProperty" value="CommonImportExport"/>
+                <entity-one entity-name="PartyGroup" value-field="partyGroup">
+                    <field-map field-name="partyId" from-field="parameters.organizationPartyId"/>
+                </entity-one>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <screenlet title="${uiLabelMap.AccountingInvoice} ${uiLabelMap.CommonImportExport}  ${uiLabelMap.CommonFor}: ${partyGroup.groupName} [${parameters.organizationPartyId}]">
+                            <container style="lefthalf">
+                                <label style="h2">${uiLabelMap.CommonImport}</label>
+                                <include-form name="ImportInvoice" location="component://accounting/widget/GlSetupForms.xml"/>
+                            </container>
+                            <container style="righthalf">
+                                <label style="h2">${uiLabelMap.CommonExport}</label>
+                                <include-form name="ExportInvoice" location="component://accounting/widget/GlSetupForms.xml"/>
+                            </container>
+                         </screenlet>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
     <screen name="ListGlAccountOrganization">
         <section>
             <actions>
@@ -559,6 +583,18 @@ under the License.
             </widgets>
         </section>
     </screen>
+    <screen name="PartyAccountsExportInvoicesCsv">
+        <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="PartyAccountsExportInvoicesCsv" location="component://accounting/widget/GlSetupForms.xml"/>           
+            </widgets>
+        </section>
+    </screen>
     <screen name="FindGlAccountCategory">
         <section>
             <actions>

Added: ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar?rev=1502093&view=auto
==============================================================================
Binary file - no diff available.

Propchange: ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: ofbiz/trunk/framework/common/config/CommonUiLabels.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/config/CommonUiLabels.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
==============================================================================
--- ofbiz/trunk/framework/common/config/CommonUiLabels.xml (original)
+++ ofbiz/trunk/framework/common/config/CommonUiLabels.xml Thu Jul 11 03:14:30 2013
@@ -5166,6 +5166,12 @@
         <value xml:lang="vi">Ảnh</value>
         <value xml:lang="zh">图片</value>
     </property>
+    <property key="CommonImport">
+        <value xml:lang="en">Import</value>
+    </property>
+    <property key="CommonImportExport">
+        <value xml:lang="en">Import/Export</value>
+    </property>
     <property key="CommonIn">
         <value xml:lang="ar">داخل</value>
         <value xml:lang="cs">V</value>



Re: svn commit: r1502093 - in /ofbiz/trunk: ./ applications/accounting/config/ applications/accounting/data/ applications/accounting/entitydef/ applications/accounting/servicedef/ applications/accounting/src/org/ofbiz/accounting/invoice/ applications/accou...

Posted by Hans Bakker <ma...@antwebsystems.com>.
Hi Jacques,

if I remember well, there is the possibility to prefix the id's in order 
to avoid conflicts in the target ofbiz system....

Regards,
Hans
On 07/10/14 15:47, Jacques Le Roux wrote:
> Hi Hans,
>
> I stumbled upon that on the demo and wondered.
> Is there an explanation somewhere about what are "invoice export 
> replacement Id types" and how to use them?
>
> Thanks
>
> Jacques
>
> Le 11/07/2013 05:14, hansbak@apache.org a écrit :
>> Author: hansbak
>> Date: Thu Jul 11 03:14:30 2013
>> New Revision: 1502093
>>
>> URL: http://svn.apache.org/r1502093
>> Log:
>> add a csv import/export invoices at an organizational level with 
>> partyid and productid translation functions, more imports/exports 
>> will follow
>>
>> Added:
>> ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar (with props)
>> Modified:
>>      ofbiz/trunk/.classpath
>>      ofbiz/trunk/LICENSE
>> ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml
>> ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml
>> ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml
>> ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml
>> ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml
>> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java
>> ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml
>>      ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml
>> ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml
>>      ofbiz/trunk/framework/common/config/CommonUiLabels.xml
>>
>> Modified: ofbiz/trunk/.classpath
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/.classpath?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- ofbiz/trunk/.classpath (original)
>> +++ ofbiz/trunk/.classpath Thu Jul 11 03:14:30 2013
>> @@ -83,6 +83,7 @@
>>       <classpathentry kind="lib" 
>> path="framework/base/lib/commons/commons-pool-1.3.jar"/>
>>       <classpathentry kind="lib" 
>> path="framework/base/lib/commons/commons-primitives-1.0.jar"/>
>>       <classpathentry kind="lib" 
>> path="framework/base/lib/commons/commons-validator-1.4.0.jar"/>
>> +    <classpathentry kind="lib" 
>> path="framework/base/lib/commons/commons-csv-1.0.jar"/>
>>       <classpathentry kind="lib" 
>> path="framework/base/lib/j2eespecs/geronimo-activation_1.0.2_spec-1.0.jar"/>
>>       <classpathentry kind="lib" 
>> path="framework/base/lib/j2eespecs/geronimo-j2ee-connector_1.5_spec-1.0.jar"/>
>>       <classpathentry kind="lib" 
>> path="framework/base/lib/j2eespecs/geronimo-jaxr_1.0_spec-1.0.jar"/>
>>
>> Modified: ofbiz/trunk/LICENSE
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/LICENSE?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- ofbiz/trunk/LICENSE (original)
>> +++ ofbiz/trunk/LICENSE Thu Jul 11 03:14:30 2013
>> @@ -44,6 +44,7 @@ framework/base/lib/commons/commons-cli-1
>>   framework/base/lib/commons/commons-codec-1.6.jar
>>   framework/base/lib/commons/commons-collections-3.2.1.jar
>>   framework/base/lib/commons/commons-compress-1.4.1.jar
>> +framework/base/lib/commons/commons-csv-1.0.jar
>>   framework/base/lib/commons/commons-digester3-3.2.jar
>>   framework/base/lib/commons/commons-discovery-0.4.jar
>>   framework/base/lib/commons/commons-el-1.0.jar
>> @@ -2729,4 +2730,5 @@ This package also includes the following
>>         donated by SyncRO Soft Ltd., the publishers of the oXygen XML 
>> Editor.
>>       * Cosmetic improvements provided by OpenStack.
>>   -Webhelp for DocBook was developed as a Google Summer of Code 
>> project. August 2010
>> \ No newline at end of file
>> +Webhelp for DocBook was developed as a Google Summer of Code 
>> project. August 2010
>> +
>>
>> Modified: 
>> ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml 
>> (original)
>> +++ ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml 
>> Thu Jul 11 03:14:30 2013
>> @@ -5010,6 +5010,9 @@
>>           <value 
>> xml:lang="zh">固定资产数据中的期望使用寿命结束为空。</value>
>>           <value 
>> xml:lang="zh_TW">固定資產資料中的期望使用壽命結束為空。</value>
>>       </property>
>> +    <property key="AccountingExportInvoices">
>> +        <value xml:lang="en">Export Invoices</value>
>> +    </property>
>>       <property key="AccountingExpenses">
>>           <value xml:lang="de">Aufwendungen</value>
>>           <value xml:lang="en">Expenses</value>
>>
>> Modified: 
>> ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml 
>> (original)
>> +++ ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml 
>> Thu Jul 11 03:14:30 2013
>> @@ -1087,4 +1087,7 @@ under the License.
>>       <CustomMethod customMethodId="STR_LINE_DEP_FORMULA" 
>> customMethodTypeId="DEPRECIATION_FORMULA" 
>> customMethodName="straightLineDepreciation" description="Straight 
>> Line depreciatiion algorithm for fixed asset((purchaseCost - 
>> salvageCost)/expectedLifeInYears)"/>
>>       <CustomMethod customMethodId="DBL_DECL_DEP_FORMULA" 
>> customMethodTypeId="DEPRECIATION_FORMULA" 
>> customMethodName="doubleDecliningBalanceDepreciation" 
>> description="Double decline depreciatiion algorithm for fixed 
>> asset((NetBookValue - salvageCost)*2/remainingLifeInYears)"/>
>>   +    <!-- invoice export replacement Id types -->
>> +    <GoodIdentificationType description="replacement value for 
>> partyId in the invoice export function in accounting" 
>> goodIdentificationTypeId="INVOICE_EXPORT"/>
>> +    <PartyIdentificationType description="replacement value for 
>> partyId in the invoice export function in accounting" 
>> partyIdentificationTypeId="INVOICE_EXPORT"/>
>>   </entity-engine-xml>
>>
>> Modified: 
>> ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml 
>> (original)
>> +++ ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml 
>> Thu Jul 11 03:14:30 2013
>> @@ -224,4 +224,7 @@ under the License.
>>               partyId="Company" transactionDate="2009-07-18 
>> 00:00:01.000" entryDate="2009-08-11 12:28:45.315" 
>> performedByPartyId="admin" statusId="FINACT_TRNS_CREATED" 
>> paymentId="8002"/>
>>       <Payment paymentId="8002" finAccountTransId="9104"/>
>>   +    <!-- invoice export demo data for replacement id's -->
>> +    <GoodIdentification goodIdentificationTypeId="INVOICE_EXPORT" 
>> idValue="GZ-2644-replaced" productId="GZ-2644"/>
>> +    <PartyIdentification idValue="DemoCustomer2" 
>> partyId="DemoCustomer" partyIdentificationTypeId="INVOICE_EXPORT"/>
>>   </entity-engine-xml>
>>
>> Modified: 
>> ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- 
>> ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml 
>> (original)
>> +++ 
>> ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml 
>> Thu Jul 11 03:14:30 2013
>> @@ -77,4 +77,51 @@ under the License.
>>               <key-map field-name="productId"/>
>>           </view-link>
>>       </view-entity>
>> +
>> +    <view-entity entity-name="InvoiceExport" 
>> package-name="org.ofbiz.accounting.reports">
>> +        <member-entity entity-alias="INV" entity-name="Invoice"/>
>> +        <member-entity entity-alias="ITM" entity-name="InvoiceItem"/>
>> +        <member-entity entity-alias="PFR" 
>> entity-name="PartyIdentification"/>
>> +        <member-entity entity-alias="PTO" 
>> entity-name="PartyIdentification"/>
>> +        <member-entity entity-alias="GI" 
>> entity-name="GoodIdentification"/>
>> +        <alias entity-alias="INV" name="invoiceId" />
>> +        <alias entity-alias="INV" name="invoiceDate"/>
>> +        <alias entity-alias="INV" name="invoiceTypeId"/>
>> +        <alias entity-alias="INV" name="description"/>
>> +        <alias entity-alias="INV" name="partyIdFrom"/>
>> +        <alias entity-alias="PFR" name="partyIdFromTrans" 
>> field="idValue"/>
>> +        <alias entity-alias="INV" name="partyId"/>
>> +        <alias entity-alias="PTO" name="partyIdTrans" field="idValue"/>
>> +        <alias entity-alias="INV" name="currencyUomId"/>
>> +        <alias entity-alias="INV" name="referenceNum"/>
>> +        <alias entity-alias="ITM" name="invoiceItemSeqId"/>
>> +        <alias entity-alias="ITM" name="invoiceItemTypeId"/>
>> +        <alias entity-alias="ITM" name="itemDescription" 
>> field="description"/>
>> +        <alias entity-alias="ITM" name="productId"/>
>> +        <alias entity-alias="GI" name="productIdTrans" 
>> field="idValue"/>
>> +        <alias entity-alias="ITM" name="quantity"/>
>> +        <alias entity-alias="ITM" name="amount"/>
>> +        <view-link entity-alias="INV" rel-entity-alias="ITM" 
>> rel-optional="true">
>> +            <key-map field-name="invoiceId"/>
>> +        </view-link>
>> +        <view-link entity-alias="INV" rel-entity-alias="PFR" 
>> rel-optional="true">
>> +            <key-map field-name="partyIdFrom" 
>> rel-field-name="partyId"/>
>> +            <entity-condition>
>> +                <condition-expr entity-alias="PFR" 
>> field-name="partyIdentificationTypeId" value="INVOICE_EXPORT"/>
>> +            </entity-condition>
>> +        </view-link>
>> +        <view-link entity-alias="INV" rel-entity-alias="PTO" 
>> rel-optional="true">
>> +            <key-map field-name="partyId"/>
>> +            <entity-condition>
>> +                <condition-expr entity-alias="PTO" 
>> field-name="partyIdentificationTypeId" value="INVOICE_EXPORT"/>
>> +            </entity-condition>
>> +        </view-link>
>> +        <view-link entity-alias="ITM" rel-entity-alias="GI" 
>> rel-optional="true">
>> +            <key-map field-name="productId"/>
>> +            <entity-condition>
>> +                <condition-expr entity-alias="GI" 
>> field-name="goodIdentificationTypeId"/>
>> +            </entity-condition>
>> +        </view-link>
>> +    </view-entity>
>> +
>>   </entitymodel>
>>
>> Modified: 
>> ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- 
>> ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml 
>> (original)
>> +++ 
>> ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml 
>> Thu Jul 11 03:14:30 2013
>> @@ -430,5 +430,12 @@ under the License.
>>           <attribute name="invoiceId" type="String" mode="IN" 
>> optional="false"/>
>>           <attribute name="isForeign" type="Boolean" mode="OUT" 
>> optional="false"/>
>>       </service>
>> +    <service name="importInvoice" engine="java"
>> +        location="org.ofbiz.accounting.invoice.InvoiceServices" 
>> invoke="importInvoice" auth="true">
>> +        <description>Import an invoice with invoiceitems in csv 
>> format</description>
>> +        <permission-service 
>> service-name="acctgInvoicePermissionCheck" main-action="CREATE"/>
>> +        <attribute mode="INOUT" name="organizationPartyId" 
>> type="String" optional="false"/>
>> +        <attribute mode="IN" name="uploadedFile" 
>> type="java.nio.ByteBuffer" optional="true" />
>> +    </service>
>>         </services>
>>
>> Modified: 
>> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- 
>> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java 
>> (original)
>> +++ 
>> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java 
>> Thu Jul 11 03:14:30 2013
>> @@ -18,7 +18,16 @@
>> *******************************************************************************/
>>   package org.ofbiz.accounting.invoice;
>>   +import org.apache.commons.csv.CSVFormat;
>> +import org.apache.commons.csv.CSVFormat.CSVFormatBuilder;
>> +import org.apache.commons.csv.CSVRecord;
>> +
>> +import java.io.BufferedReader;
>> +import java.io.IOException;
>> +import java.io.StringReader;
>>   import java.math.BigDecimal;
>> +import java.nio.ByteBuffer;
>> +import java.nio.charset.Charset;
>>   import java.sql.Timestamp;
>>   import java.util.ArrayList;
>>   import java.util.Iterator;
>> @@ -3334,5 +3343,164 @@ public class InvoiceServices {
>>               return ServiceUtil.returnError(ee.getMessage());
>>           }
>>       }
>> +
>> +    public static Map<String, Object> importInvoice(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 organizationPartyId = (String) 
>> context.get("organizationPartyId");
>> +        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 lastInvoiceId = null;
>> +        String currentInvoiceId = null;
>> +        String newInvoiceId = null;
>> +        int invoicesCreated = 0;
>> +
>> +        if (fileBytes == null) {
>> +            return ServiceUtil.returnError("Uploaded file data not 
>> found");
>> +        }
>> +
>> +        try {
>> +            for(final CSVRecord rec : fmt.parse(csvReader)) {
>> +                currentInvoiceId =  rec.get("invoiceId");
>> +                if (lastInvoiceId == null || 
>> !currentInvoiceId.equals(lastInvoiceId)) {
>> +                    newInvoiceId = null;
>> +                    Map<String, Object> invoice = UtilMisc.toMap(
>> +                        "invoiceTypeId", rec.get("invoiceTypeId"),
>> +                        "partyIdFrom", rec.get("partyIdFrom"),
>> +                        "partyId", rec.get("partyId"),
>> +                        "invoiceDate", rec.get("invoiceDate"),
>> +                        "dueDate", rec.get("dueDate"),
>> +                        "currencyUomId", rec.get("currencyUomId"),
>> +                        "description", rec.get("description"),
>> +                        "referenceNum", rec.get("referenceNum") + 
>> "   Imported: orginal InvoiceId: " + currentInvoiceId,
>> +                        "userLogin", userLogin
>> +                        );
>> +
>> +                    // replace values if required
>> +                    if 
>> (UtilValidate.isNotEmpty(rec.get("partyIdFromTrans"))) {
>> +                        invoice.put("partyIdFrom", 
>> rec.get("partyIdFromTrans"));
>> +                    }
>> +                    if 
>> (UtilValidate.isNotEmpty(rec.get("partyIdTrans"))) {
>> +                        invoice.put("partyId", 
>> rec.get("partyIdTrans"));
>> +                    }
>> +
>> +                    // invoice validation
>> +                    try {
>> +                        newErrMsgs = FastList.newInstance();
>> +                        if 
>> (UtilValidate.isEmpty(invoice.get("partyIdFrom"))) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": Mandatory Party Id From and Party Id From 
>> Trans missing for invoice: " + currentInvoiceId);
>> +                        } else if (delegator.findOne("Party", 
>> UtilMisc.<String, Object>toMap("partyId", 
>> invoice.get("partyIdFrom")), false) == null) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": partyIdFrom: " + 
>> invoice.get("partyIdFrom") + " not found for invoice: " + 
>> currentInvoiceId);
>> +                        }
>> +                        if 
>> (UtilValidate.isEmpty(invoice.get("partyId"))) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": Mandatory Party Id and Party Id Trans 
>> missing for invoice: " + currentInvoiceId);
>> +                        } else if (delegator.findOne("Party", 
>> UtilMisc.<String, Object>toMap("partyId", invoice.get("partyId")), 
>> false) == null) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": partyId: " + invoice.get("partyId") + " 
>> not found for invoice: " + currentInvoiceId);
>> +                        }
>> +                        if 
>> (UtilValidate.isEmpty(invoice.get("invoiceTypeId"))) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": Mandatory Invoice Type missing for 
>> invoice: " + currentInvoiceId);
>> +                        } else if (delegator.findOne("InvoiceType", 
>> UtilMisc.<String, Object>toMap("invoiceTypeId", 
>> invoice.get("invoiceTypeId")), false) == null) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": InvoiceItem type id: " + 
>> invoice.get("invoiceTypeId") + " not found for invoice: " + 
>> currentInvoiceId);
>> +                        }
>> +                        GenericValue invoiceType = 
>> delegator.findOne("InvoiceType", UtilMisc.<String, 
>> Object>toMap("invoiceTypeId", invoice.get("invoiceTypeId")), false);
>> +                        if 
>> ("PURCHASE_INVOICE".equals(invoiceType.getString("parentTypeId")) && 
>> !invoice.get("partyId").equals(organizationPartyId)) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": A purchase type invoice should have the 
>> partyId 'To' being the organizationPartyId(=" + organizationPartyId + 
>> ")! however is " + invoice.get("partyId") +"! invoice: " + 
>> currentInvoiceId);
>> +                        }
>> +                        if 
>> ("SALES_INVOICE".equals(invoiceType.getString("parentTypeId")) && 
>> !invoice.get("partyIdFrom").equals(organizationPartyId)) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": A sales type invoice should have the 
>> partyId 'from' being the organizationPartyId(=" + organizationPartyId 
>> + ")! however is " + invoice.get("partyIdFrom") +"! invoice: " + 
>> currentInvoiceId);
>> +                        }
>> +
>> +
>> +                    } catch (GenericEntityException e) {
>> +                        Debug.logError("Valication checking problem 
>> against database. due to " + e.getMessage(), module);
>> +                    }
>> +
>> +                    if (newErrMsgs.size() > 0) {
>> +                        errMsgs.addAll(newErrMsgs);
>> +                    } else {
>> +                        Map<String, Object> invoiceResult = null;
>> +                        try {
>> +                            invoiceResult = 
>> dispatcher.runSync("createInvoice", invoice);
>> +                            } catch (GenericServiceException e) {
>> +                                Debug.logError(e, module);
>> +                                return 
>> ServiceUtil.returnError(e.getMessage());
>> +                            }
>> +                        newInvoiceId = (String) 
>> invoiceResult.get("invoiceId");
>> +                        invoicesCreated++;
>> +                    }
>> +                    lastInvoiceId = currentInvoiceId;
>> +                }
>> +
>> +
>> +                if (newInvoiceId != null) {
>> +                    Map<String, Object> invoiceItem = UtilMisc.toMap(
>> +                            "invoiceId", newInvoiceId,
>> +                            "invoiceItemSeqId", 
>> rec.get("invoiceItemSeqId"),
>> +                            "invoiceItemTypeId", 
>> rec.get("invoiceItemTypeId"),
>> +                            "productId", rec.get("productId"),
>> +                            "description", rec.get("itemDescription"),
>> +                            "amount", rec.get("amount"),
>> +                            "quantity", rec.get("quantity"),
>> +                            "userLogin", userLogin
>> +                            );
>> +
>> +                    if 
>> (UtilValidate.isNotEmpty(rec.get("productIdTrans"))) {
>> +                        invoiceItem.put("productId", 
>> rec.get("productIdTrans"));
>> +                    }
>> +                    // invoice item validation
>> +                    try {
>> +                        newErrMsgs = FastList.newInstance();
>> +                        if 
>> (UtilValidate.isEmpty(invoiceItem.get("invoiceItemSeqId"))) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": Mandatory item sequence Id missing for 
>> invoice: " + currentInvoiceId);
>> +                        }
>> +                        if 
>> (UtilValidate.isEmpty(invoiceItem.get("invoiceItemTypeId"))) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": Mandatory invoice item type missing for 
>> invoice: " + currentInvoiceId);
>> +                        } else if 
>> (delegator.findOne("InvoiceItemType", UtilMisc.<String, 
>> Object>toMap("invoiceItemTypeId", 
>> invoiceItem.get("invoiceItemTypeId")), false) == null) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": InvoiceItem Item type id: " + 
>> invoiceItem.get("invoiceItemTypeId") + " not found for invoice: " + 
>> currentInvoiceId + " Item seqId:" + 
>> invoiceItem.get("invoiceItemSeqId"));
>> +                        }
>> +                        if 
>> (UtilValidate.isEmpty(invoiceItem.get("productId")) && 
>> UtilValidate.isEmpty(invoiceItem.get("description"))) {
>> +                        }
>> +                        if 
>> (UtilValidate.isNotEmpty(invoiceItem.get("productId")) && 
>> delegator.findOne("Product", UtilMisc.<String, 
>> Object>toMap("productId", invoiceItem.get("productId")), false) == 
>> null) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": Product Id: " + 
>> invoiceItem.get("productId") + " not found for invoice: " + 
>> currentInvoiceId + " Item seqId:" + 
>> invoiceItem.get("invoiceItemSeqId"));
>> +                        }
>> +                        if 
>> (UtilValidate.isEmpty(invoiceItem.get("amount")) && 
>> UtilValidate.isEmpty(invoiceItem.get("quantity"))) {
>> +                            newErrMsgs.add("Line number " + 
>> rec.getRecordNumber() + ": Either or both quantity and amount is 
>> required for invoice: " + currentInvoiceId + " Item seqId:" + 
>> invoiceItem.get("invoiceItemSeqId"));
>> +                        }
>> +                    } catch (GenericEntityException e) {
>> +                        Debug.logError("Validation checking problem 
>> against database. due to " + e.getMessage(), module);
>> +                    }
>> +
>> +                    if (newErrMsgs.size() > 0) {
>> +                        errMsgs.addAll(newErrMsgs);
>> +                    } else {
>> +                        try {
>> + dispatcher.runSync("createInvoiceItem", invoiceItem);
>> +                        } catch (GenericServiceException 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);
>> +        }
>>   +        Map<String, Object> result = 
>> ServiceUtil.returnSuccess(invoicesCreated + " new invoice(s) created");
>> +        result.put("organizationPartyId", organizationPartyId);
>> +        return result;
>> +    }
>>   }
>>
>> Modified: 
>> ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- 
>> ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml 
>> (original)
>> +++ 
>> ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml 
>> Thu Jul 11 03:14:30 2013
>> @@ -753,6 +753,23 @@ under the License.
>>           <security https="true" auth="true"/>
>>           <response name="success" type="view" 
>> value="ListGlAccountOrgCsv"/>
>>       </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="PartyAccountsExportInvoicesCsv.csv">
>> +        <security https="true" auth="true"/>
>> +        <response name="success" type="view" 
>> value="PartyAccountsExportInvoicesCsv"/>
>> +    </request-map>
>> +    <request-map uri="uploadInvoice">
>> +        <security auth="true" https="true"/>
>> +        <event invoke="importInvoice" path="" type="service"/>
>> +        <response name="success" type="request" value="ImportExport"/>
>> +        <response name="error" type="view" value="ImportExport"/>
>> +    </request-map>
>>         <!-- TO BE REMOVED
>>       <request-map uri="EditGlobalGlAccountOrganizations"><security 
>> https="true" auth="true"/><response name="success" type="view" 
>> value="EditGlobalGlAccountOrganizations"/></request-map>
>> @@ -2768,6 +2785,10 @@ under the License.
>>       <view-map name="ListGlAccountOrgPdf" type="screenfop" 
>> page="component://accounting/widget/GlSetupScreens.xml#ListGlAccountOrgPdf" 
>> content-type="application/pdf" encoding="none"/>
>>       <view-map name="ListGlAccountOrgCsv" type="screencsv" 
>> page="component://accounting/widget/GlSetupScreens.xml#ListGlAccountOrgCsv" 
>> content-type="text/csv" encoding="none"/>
>>   +    <!-- import export -->
>> +    <view-map name="ImportExport" type="screen" 
>> page="component://accounting/widget/GlSetupScreens.xml#ImportExport"/>
>> +    <view-map name="PartyAccountsExportInvoicesCsv" type="screencsv" 
>> page="component://accounting/widget/GlSetupScreens.xml#PartyAccountsExportInvoicesCsv" 
>> content-type="text/csv" encoding="none"/>
>> +
>>       <!-- Manual Credit Card Transaction -->
>>       <view-map name="FindGatewayResponses" 
>> page="component://accounting/widget/TransactionScreens.xml#FindGatewayResponses" 
>> type="screen"/>
>>       <view-map name="ViewGatewayResponse" 
>> page="component://accounting/widget/TransactionScreens.xml#ViewGatewayResponse" 
>> type="screen"/>
>>
>> Modified: ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml 
>> (original)
>> +++ ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml Thu 
>> Jul 11 03:14:30 2013
>> @@ -34,6 +34,11 @@ under the License.
>>                   <parameter param-name="organizationPartyId" 
>> from-field="partyId"/>
>>               </hyperlink>
>>           </field>
>> +        <field name="importexport" title=" " 
>> use-when="hasBasicPermission" widget-style="buttontext">
>> +            <hyperlink target="ImportExport" 
>> description="${uiLabelMap.CommonImportExport}">
>> +                <parameter param-name="organizationPartyId" 
>> from-field="partyId"/>
>> +            </hyperlink>
>> +        </field>
>>       </form>
>>         <form name="ListGlAccountOrganization" list-name="listIt" 
>> target="" title="" type="list" view-size="50"
>> @@ -71,6 +76,55 @@ under the License.
>>           <field name="submitButton" 
>> title="${uiLabelMap.AccountingNewCompany}"><submit 
>> button-type="button"/></field>
>>       </form>
>>   +    <form name="ExportInvoice" type="single" 
>> target="PartyAccountsExportInvoicesCsv.csv" title="" >
>> +        <field name="organizationPartyId"><hidden 
>> value="${parameters.organizationPartyId}"/></field>
>> +        <field name="invoiceId"><lookup 
>> target-form-name="LookupInvoice"/></field>
>> +        <field name="startDate"><date-time/></field>
>> +        <field name="submitButton" 
>> title="${uiLabelMap.CommonSubmit}"><submit 
>> button-type="button"/></field>
>> +    </form>
>> +
>> +    <form name="PartyAccountsExportInvoicesCsv" 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="InvoiceExport">
>> +                <condition-list combine="and">
>> +                    <condition-list combine="or">
>> +                        <condition-expr field-name="partyIdFrom" 
>> from-field="organizationPartyId" operator="equals"/>
>> +                        <condition-expr field-name="partyId" 
>> from-field="organizationPartyId" operator="equals"/>
>> +                    </condition-list>
>> +                    <condition-expr field-name="invoiceDate" 
>> operator="greater-equals" from-field="parameters.startDate" 
>> ignore-if-empty="true"/>
>> +                    <condition-expr field-name="invoiceId" 
>> operator="equals" from-field="parameters.invoiceId" 
>> ignore-if-empty="true"/>
>> +                </condition-list>
>> +                <order-by field-name="invoiceId"/>
>> +            </entity-condition>
>> +        </actions>
>> +        <field name="organizationPartyId"><hidden 
>> value="${organizationPartyId}"/></field>
>> +        <field name="invoiceId" title="invoiceId"><display/></field>
>> +        <field name="invoiceTypeId" 
>> title="invoiceTypeId"><display/></field>
>> +        <field name="invoiceDate" 
>> title="invoiceDate"><display/></field>
>> +        <field name="dueDate" title="dueDate"><display/></field>
>> +        <field name="partyIdFrom" 
>> title="partyIdFrom"><display/></field>
>> +        <field name="partyIdFromTrans" 
>> title="partyIdFromTrans"><display/></field>
>> +        <field name="partyId" title="partyId"><display/></field>
>> +        <field name="partyIdTrans" 
>> title="partyIdTrans"><display/></field>
>> +        <field name="currencyUomId" 
>> title="currencyUomId"><display/></field>
>> +        <field name="description" 
>> title="description"><display/></field>
>> +        <field name="referenceNum" 
>> title="referenceNum"><display/></field>
>> +        <field name="invoiceItemSeqId" 
>> title="invoiceItemSeqId"><display/></field>
>> +        <field name="invoiceItemTypeId" 
>> title="invoiceItemTypeId"><display/></field>
>> +        <field name="productId" title="productId"><display/></field>
>> +        <field name="productIdTrans" 
>> title="productIdTrans"><display/></field>
>> +        <field name="itemDescription" 
>> title="itemDescription"><display/></field>
>> +        <field name="quantity" title="quantity"><display/></field>
>> +        <field name="amount" title="amount"><display/></field>
>> +    </form>
>> +
>> +    <form name="ImportInvoice" type="upload" target="uploadInvoice" 
>> title="" >
>> +        <field name="organizationPartyId"><hidden 
>> value="${parameters.organizationPartyId}"/></field>
>> +        <field name="uploadedFile"><file/></field>
>> +        <field name="submitButton" 
>> title="${uiLabelMap.CommonUpload}"><submit 
>> button-type="button"/></field>
>> +    </form>
>> +
>>       <form name="AssignGlAccount" type="single" 
>> target="createGlAccountOrganization" title="" default-map-name="account"
>>           header-row-style="header-row" 
>> default-table-style="basic-table">
>>           <field name="organizationPartyId"><hidden/></field>
>>
>> Modified: ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml 
>> (original)
>> +++ ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml Thu 
>> Jul 11 03:14:30 2013
>> @@ -51,7 +51,6 @@ under the License.
>>       <screen name="ListCompanies">
>>           <section>
>>               <actions>
>> -                <property-map resource="AccountingUiLabels" 
>> map-name="uiLabelMap" global="true"/>
>>                   <set field="titleProperty" 
>> value="AccountingAvailableInternalOrganizations"/>
>>                   <set field="headerItem" value="companies"/>
>>                   <set field="labelTitleProperty" 
>> value="${uiLabelMap.AccountingAvailableInternalOrganizations}"/>
>> @@ -80,7 +79,6 @@ under the License.
>>       <screen name="AddCompany">
>>           <section>
>>               <actions>
>> -                <property-map resource="AccountingUiLabels" 
>> map-name="uiLabelMap" global="true"/>
>>                   <set field="titleProperty" 
>> value="AccountingNewCompany"/>
>>               </actions>
>>               <widgets>
>> @@ -94,6 +92,32 @@ under the License.
>>               </widgets>
>>           </section>
>>       </screen>
>> +    <screen name="ImportExport">
>> +        <section>
>> +            <actions>
>> +                <set field="titleProperty" value="CommonImportExport"/>
>> +                <entity-one entity-name="PartyGroup" 
>> value-field="partyGroup">
>> +                    <field-map field-name="partyId" 
>> from-field="parameters.organizationPartyId"/>
>> +                </entity-one>
>> +            </actions>
>> +            <widgets>
>> +                <decorator-screen name="main-decorator" 
>> location="${parameters.mainDecoratorLocation}">
>> +                    <decorator-section name="body">
>> +                        <screenlet 
>> title="${uiLabelMap.AccountingInvoice} 
>> ${uiLabelMap.CommonImportExport}  ${uiLabelMap.CommonFor}: 
>> ${partyGroup.groupName} [${parameters.organizationPartyId}]">
>> +                            <container style="lefthalf">
>> +                                <label 
>> style="h2">${uiLabelMap.CommonImport}</label>
>> +                                <include-form name="ImportInvoice" 
>> location="component://accounting/widget/GlSetupForms.xml"/>
>> +                            </container>
>> +                            <container style="righthalf">
>> +                                <label 
>> style="h2">${uiLabelMap.CommonExport}</label>
>> +                                <include-form name="ExportInvoice" 
>> location="component://accounting/widget/GlSetupForms.xml"/>
>> +                            </container>
>> +                         </screenlet>
>> +                    </decorator-section>
>> +                </decorator-screen>
>> +            </widgets>
>> +        </section>
>> +    </screen>
>>       <screen name="ListGlAccountOrganization">
>>           <section>
>>               <actions>
>> @@ -559,6 +583,18 @@ under the License.
>>               </widgets>
>>           </section>
>>       </screen>
>> +    <screen name="PartyAccountsExportInvoicesCsv">
>> +        <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="PartyAccountsExportInvoicesCsv" 
>> location="component://accounting/widget/GlSetupForms.xml"/>
>> +            </widgets>
>> +        </section>
>> +    </screen>
>>       <screen name="FindGlAccountCategory">
>>           <section>
>>               <actions>
>>
>> Added: ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar?rev=1502093&view=auto
>> ============================================================================== 
>>
>> Binary file - no diff available.
>>
>> Propchange: ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar
>> ------------------------------------------------------------------------------ 
>>
>>      svn:mime-type = application/octet-stream
>>
>> Modified: ofbiz/trunk/framework/common/config/CommonUiLabels.xml
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/config/CommonUiLabels.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
>> ============================================================================== 
>>
>> --- ofbiz/trunk/framework/common/config/CommonUiLabels.xml (original)
>> +++ ofbiz/trunk/framework/common/config/CommonUiLabels.xml Thu Jul 11 
>> 03:14:30 2013
>> @@ -5166,6 +5166,12 @@
>>           <value xml:lang="vi">Ảnh</value>
>>           <value xml:lang="zh">图片</value>
>>       </property>
>> +    <property key="CommonImport">
>> +        <value xml:lang="en">Import</value>
>> +    </property>
>> +    <property key="CommonImportExport">
>> +        <value xml:lang="en">Import/Export</value>
>> +    </property>
>>       <property key="CommonIn">
>>           <value xml:lang="ar">داخل</value>
>>           <value xml:lang="cs">V</value>
>>
>>


Re: svn commit: r1502093 - in /ofbiz/trunk: ./ applications/accounting/config/ applications/accounting/data/ applications/accounting/entitydef/ applications/accounting/servicedef/ applications/accounting/src/org/ofbiz/accounting/invoice/ applications/accou...

Posted by Jacques Le Roux <ja...@les7arts.com>.
Hi Hans,

I stumbled upon that on the demo and wondered.
Is there an explanation somewhere about what are "invoice export replacement Id types" and how to use them?

Thanks

Jacques

Le 11/07/2013 05:14, hansbak@apache.org a écrit :
> Author: hansbak
> Date: Thu Jul 11 03:14:30 2013
> New Revision: 1502093
>
> URL: http://svn.apache.org/r1502093
> Log:
> add a csv import/export invoices at an organizational level with partyid and productid translation functions, more imports/exports will follow
>
> Added:
>      ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar   (with props)
> Modified:
>      ofbiz/trunk/.classpath
>      ofbiz/trunk/LICENSE
>      ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml
>      ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml
>      ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml
>      ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml
>      ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml
>      ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java
>      ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml
>      ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml
>      ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml
>      ofbiz/trunk/framework/common/config/CommonUiLabels.xml
>
> Modified: ofbiz/trunk/.classpath
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/.classpath?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/.classpath (original)
> +++ ofbiz/trunk/.classpath Thu Jul 11 03:14:30 2013
> @@ -83,6 +83,7 @@
>       <classpathentry kind="lib" path="framework/base/lib/commons/commons-pool-1.3.jar"/>
>       <classpathentry kind="lib" path="framework/base/lib/commons/commons-primitives-1.0.jar"/>
>       <classpathentry kind="lib" path="framework/base/lib/commons/commons-validator-1.4.0.jar"/>
> +    <classpathentry kind="lib" path="framework/base/lib/commons/commons-csv-1.0.jar"/>
>       <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-activation_1.0.2_spec-1.0.jar"/>
>       <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-j2ee-connector_1.5_spec-1.0.jar"/>
>       <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-jaxr_1.0_spec-1.0.jar"/>
>
> Modified: ofbiz/trunk/LICENSE
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/LICENSE?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/LICENSE (original)
> +++ ofbiz/trunk/LICENSE Thu Jul 11 03:14:30 2013
> @@ -44,6 +44,7 @@ framework/base/lib/commons/commons-cli-1
>   framework/base/lib/commons/commons-codec-1.6.jar
>   framework/base/lib/commons/commons-collections-3.2.1.jar
>   framework/base/lib/commons/commons-compress-1.4.1.jar
> +framework/base/lib/commons/commons-csv-1.0.jar
>   framework/base/lib/commons/commons-digester3-3.2.jar
>   framework/base/lib/commons/commons-discovery-0.4.jar
>   framework/base/lib/commons/commons-el-1.0.jar
> @@ -2729,4 +2730,5 @@ This package also includes the following
>         donated by SyncRO Soft Ltd., the publishers of the oXygen XML Editor.
>       * Cosmetic improvements provided by OpenStack.
>   
> -Webhelp for DocBook was developed as a Google Summer of Code project. August 2010
> \ No newline at end of file
> +Webhelp for DocBook was developed as a Google Summer of Code project. August 2010
> +
>
> Modified: ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml (original)
> +++ ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml Thu Jul 11 03:14:30 2013
> @@ -5010,6 +5010,9 @@
>           <value xml:lang="zh">固定资产数据中的期望使用寿命结束为空。</value>
>           <value xml:lang="zh_TW">固定資產資料中的期望使用壽命結束為空。</value>
>       </property>
> +    <property key="AccountingExportInvoices">
> +        <value xml:lang="en">Export Invoices</value>
> +    </property>
>       <property key="AccountingExpenses">
>           <value xml:lang="de">Aufwendungen</value>
>           <value xml:lang="en">Expenses</value>
>
> Modified: ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml (original)
> +++ ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml Thu Jul 11 03:14:30 2013
> @@ -1087,4 +1087,7 @@ under the License.
>       <CustomMethod customMethodId="STR_LINE_DEP_FORMULA" customMethodTypeId="DEPRECIATION_FORMULA" customMethodName="straightLineDepreciation" description="Straight Line depreciatiion algorithm for fixed asset((purchaseCost - salvageCost)/expectedLifeInYears)"/>
>       <CustomMethod customMethodId="DBL_DECL_DEP_FORMULA" customMethodTypeId="DEPRECIATION_FORMULA" customMethodName="doubleDecliningBalanceDepreciation" description="Double decline depreciatiion algorithm for fixed asset((NetBookValue - salvageCost)*2/remainingLifeInYears)"/>
>   
> +    <!-- invoice export replacement Id types -->
> +    <GoodIdentificationType description="replacement value for partyId in the invoice export function in accounting" goodIdentificationTypeId="INVOICE_EXPORT"/>
> +    <PartyIdentificationType description="replacement value for partyId in the invoice export function in accounting" partyIdentificationTypeId="INVOICE_EXPORT"/>
>   </entity-engine-xml>
>
> Modified: ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml (original)
> +++ ofbiz/trunk/applications/accounting/data/DemoPaymentsInvoices.xml Thu Jul 11 03:14:30 2013
> @@ -224,4 +224,7 @@ under the License.
>               partyId="Company" transactionDate="2009-07-18 00:00:01.000" entryDate="2009-08-11 12:28:45.315" performedByPartyId="admin" statusId="FINACT_TRNS_CREATED" paymentId="8002"/>
>       <Payment paymentId="8002" finAccountTransId="9104"/>
>   
> +    <!-- invoice export demo data for replacement id's -->
> +    <GoodIdentification goodIdentificationTypeId="INVOICE_EXPORT" idValue="GZ-2644-replaced" productId="GZ-2644"/>
> +    <PartyIdentification idValue="DemoCustomer2" partyId="DemoCustomer" partyIdentificationTypeId="INVOICE_EXPORT"/>
>   </entity-engine-xml>
>
> Modified: ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml (original)
> +++ ofbiz/trunk/applications/accounting/entitydef/entitymodel_reports.xml Thu Jul 11 03:14:30 2013
> @@ -77,4 +77,51 @@ under the License.
>               <key-map field-name="productId"/>
>           </view-link>
>       </view-entity>
> +
> +    <view-entity entity-name="InvoiceExport" package-name="org.ofbiz.accounting.reports">
> +        <member-entity entity-alias="INV" entity-name="Invoice"/>
> +        <member-entity entity-alias="ITM" entity-name="InvoiceItem"/>
> +        <member-entity entity-alias="PFR" entity-name="PartyIdentification"/>
> +        <member-entity entity-alias="PTO" entity-name="PartyIdentification"/>
> +        <member-entity entity-alias="GI" entity-name="GoodIdentification"/>
> +        <alias entity-alias="INV" name="invoiceId" />
> +        <alias entity-alias="INV" name="invoiceDate"/>
> +        <alias entity-alias="INV" name="invoiceTypeId"/>
> +        <alias entity-alias="INV" name="description"/>
> +        <alias entity-alias="INV" name="partyIdFrom"/>
> +        <alias entity-alias="PFR" name="partyIdFromTrans" field="idValue"/>
> +        <alias entity-alias="INV" name="partyId"/>
> +        <alias entity-alias="PTO" name="partyIdTrans" field="idValue"/>
> +        <alias entity-alias="INV" name="currencyUomId"/>
> +        <alias entity-alias="INV" name="referenceNum"/>
> +        <alias entity-alias="ITM" name="invoiceItemSeqId"/>
> +        <alias entity-alias="ITM" name="invoiceItemTypeId"/>
> +        <alias entity-alias="ITM" name="itemDescription" field="description"/>
> +        <alias entity-alias="ITM" name="productId"/>
> +        <alias entity-alias="GI" name="productIdTrans" field="idValue"/>
> +        <alias entity-alias="ITM" name="quantity"/>
> +        <alias entity-alias="ITM" name="amount"/>
> +        <view-link entity-alias="INV" rel-entity-alias="ITM" rel-optional="true">
> +            <key-map field-name="invoiceId"/>
> +        </view-link>
> +        <view-link entity-alias="INV" rel-entity-alias="PFR" rel-optional="true">
> +            <key-map field-name="partyIdFrom" rel-field-name="partyId"/>
> +            <entity-condition>
> +                <condition-expr entity-alias="PFR" field-name="partyIdentificationTypeId" value="INVOICE_EXPORT"/>
> +            </entity-condition>
> +        </view-link>
> +        <view-link entity-alias="INV" rel-entity-alias="PTO" rel-optional="true">
> +            <key-map field-name="partyId"/>
> +            <entity-condition>
> +                <condition-expr entity-alias="PTO" field-name="partyIdentificationTypeId" value="INVOICE_EXPORT"/>
> +            </entity-condition>
> +        </view-link>
> +        <view-link entity-alias="ITM" rel-entity-alias="GI" rel-optional="true">
> +            <key-map field-name="productId"/>
> +            <entity-condition>
> +                <condition-expr entity-alias="GI" field-name="goodIdentificationTypeId"/>
> +            </entity-condition>
> +        </view-link>
> +    </view-entity>
> +
>   </entitymodel>
>
> Modified: ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml (original)
> +++ ofbiz/trunk/applications/accounting/servicedef/services_invoice.xml Thu Jul 11 03:14:30 2013
> @@ -430,5 +430,12 @@ under the License.
>           <attribute name="invoiceId" type="String" mode="IN" optional="false"/>
>           <attribute name="isForeign" type="Boolean" mode="OUT" optional="false"/>
>       </service>
> +    <service name="importInvoice" engine="java"
> +        location="org.ofbiz.accounting.invoice.InvoiceServices" invoke="importInvoice" auth="true">
> +        <description>Import an invoice with invoiceitems in csv format</description>
> +        <permission-service service-name="acctgInvoicePermissionCheck" main-action="CREATE"/>
> +        <attribute mode="INOUT" name="organizationPartyId" type="String" optional="false"/>
> +        <attribute mode="IN" name="uploadedFile" type="java.nio.ByteBuffer" optional="true" />
> +    </service>
>       
>   </services>
>
> Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java (original)
> +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java Thu Jul 11 03:14:30 2013
> @@ -18,7 +18,16 @@
>    *******************************************************************************/
>   package org.ofbiz.accounting.invoice;
>   
> +import org.apache.commons.csv.CSVFormat;
> +import org.apache.commons.csv.CSVFormat.CSVFormatBuilder;
> +import org.apache.commons.csv.CSVRecord;
> +
> +import java.io.BufferedReader;
> +import java.io.IOException;
> +import java.io.StringReader;
>   import java.math.BigDecimal;
> +import java.nio.ByteBuffer;
> +import java.nio.charset.Charset;
>   import java.sql.Timestamp;
>   import java.util.ArrayList;
>   import java.util.Iterator;
> @@ -3334,5 +3343,164 @@ public class InvoiceServices {
>               return ServiceUtil.returnError(ee.getMessage());
>           }
>       }
> +
> +    public static Map<String, Object> importInvoice(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 organizationPartyId = (String) context.get("organizationPartyId");
> +        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 lastInvoiceId = null;
> +        String currentInvoiceId = null;
> +        String newInvoiceId = null;
> +        int invoicesCreated = 0;
> +
> +        if (fileBytes == null) {
> +        	return ServiceUtil.returnError("Uploaded file data not found");
> +        }
> +
> +        try {
> +        	for(final CSVRecord rec : fmt.parse(csvReader)) {
> +        		currentInvoiceId =  rec.get("invoiceId");
> +        		if (lastInvoiceId == null || !currentInvoiceId.equals(lastInvoiceId)) {
> +        			newInvoiceId = null;
> +        			Map<String, Object> invoice = UtilMisc.toMap(
> +        				"invoiceTypeId", rec.get("invoiceTypeId"),
> +        				"partyIdFrom", rec.get("partyIdFrom"),
> +        				"partyId", rec.get("partyId"),
> +        				"invoiceDate", rec.get("invoiceDate"),
> +        				"dueDate", rec.get("dueDate"),
> +        				"currencyUomId", rec.get("currencyUomId"),
> +        				"description", rec.get("description"),
> +        				"referenceNum", rec.get("referenceNum") + "   Imported: orginal InvoiceId: " + currentInvoiceId,
> +                		"userLogin", userLogin
> +                		);
> +
> +        			// replace values if required
> +        			if (UtilValidate.isNotEmpty(rec.get("partyIdFromTrans"))) {
> +        				invoice.put("partyIdFrom", rec.get("partyIdFromTrans"));
> +        			}
> +        			if (UtilValidate.isNotEmpty(rec.get("partyIdTrans"))) {
> +        				invoice.put("partyId", rec.get("partyIdTrans"));
> +        			}
> +
> +        			// invoice validation
> +                    try {
> +            	    	newErrMsgs = FastList.newInstance();
> +                        if (UtilValidate.isEmpty(invoice.get("partyIdFrom"))) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Mandatory Party Id From and Party Id From Trans missing for invoice: " + currentInvoiceId);
> +                        } else if (delegator.findOne("Party", UtilMisc.<String, Object>toMap("partyId", invoice.get("partyIdFrom")), false) == null) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": partyIdFrom: " + invoice.get("partyIdFrom") + " not found for invoice: " + currentInvoiceId);
> +                        }
> +                        if (UtilValidate.isEmpty(invoice.get("partyId"))) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Mandatory Party Id and Party Id Trans missing for invoice: " + currentInvoiceId);
> +                        } else if (delegator.findOne("Party", UtilMisc.<String, Object>toMap("partyId", invoice.get("partyId")), false) == null) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": partyId: " + invoice.get("partyId") + " not found for invoice: " + currentInvoiceId);
> +                        }
> +                        if (UtilValidate.isEmpty(invoice.get("invoiceTypeId"))) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Mandatory Invoice Type missing for invoice: " + currentInvoiceId);
> +                        } else if (delegator.findOne("InvoiceType", UtilMisc.<String, Object>toMap("invoiceTypeId", invoice.get("invoiceTypeId")), false) == null) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": InvoiceItem type id: " + invoice.get("invoiceTypeId") + " not found for invoice: " + currentInvoiceId);
> +                        }
> +                        GenericValue invoiceType = delegator.findOne("InvoiceType", UtilMisc.<String, Object>toMap("invoiceTypeId", invoice.get("invoiceTypeId")), false);
> +                        if ("PURCHASE_INVOICE".equals(invoiceType.getString("parentTypeId")) && !invoice.get("partyId").equals(organizationPartyId)) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": A purchase type invoice should have the partyId 'To' being the organizationPartyId(=" + organizationPartyId + ")! however is " + invoice.get("partyId") +"! invoice: " + currentInvoiceId);
> +                        }
> +                        if ("SALES_INVOICE".equals(invoiceType.getString("parentTypeId")) && !invoice.get("partyIdFrom").equals(organizationPartyId)) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": A sales type invoice should have the partyId 'from' being the organizationPartyId(=" + organizationPartyId + ")! however is " + invoice.get("partyIdFrom") +"! invoice: " + currentInvoiceId);
> +                        }
> +
> +
> +                    } catch (GenericEntityException e) {
> +                        Debug.logError("Valication checking problem against database. due to " + e.getMessage(), module);
> +                    }
> +
> +                    if (newErrMsgs.size() > 0) {
> +        				errMsgs.addAll(newErrMsgs);
> +                    } else {
> +                        Map<String, Object> invoiceResult = null;
> +                    	try {
> +                            invoiceResult = dispatcher.runSync("createInvoice", invoice);
> +                    		} catch (GenericServiceException e) {
> +                    			Debug.logError(e, module);
> +                    			return ServiceUtil.returnError(e.getMessage());
> +                    		}
> +                        newInvoiceId = (String) invoiceResult.get("invoiceId");
> +                        invoicesCreated++;
> +        			}
> +                    lastInvoiceId = currentInvoiceId;
> +        		}
> +
> +        		
> +        		if (newInvoiceId != null) {
> +        			Map<String, Object> invoiceItem = UtilMisc.toMap(
> +                    		"invoiceId", newInvoiceId,
> +                    		"invoiceItemSeqId", rec.get("invoiceItemSeqId"),
> +                    		"invoiceItemTypeId", rec.get("invoiceItemTypeId"),
> +                    		"productId", rec.get("productId"),
> +                    		"description", rec.get("itemDescription"),
> +                    		"amount", rec.get("amount"),
> +                    		"quantity", rec.get("quantity"),
> +                    		"userLogin", userLogin
> +                    		);
> +
> +        			if (UtilValidate.isNotEmpty(rec.get("productIdTrans"))) {
> +        				invoiceItem.put("productId", rec.get("productIdTrans"));
> +        			}
> +        			// invoice item validation
> +                    try {
> +            	    	newErrMsgs = FastList.newInstance();
> +                        if (UtilValidate.isEmpty(invoiceItem.get("invoiceItemSeqId"))) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Mandatory item sequence Id missing for invoice: " + currentInvoiceId);
> +                        }
> +                        if (UtilValidate.isEmpty(invoiceItem.get("invoiceItemTypeId"))) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Mandatory invoice item type missing for invoice: " + currentInvoiceId);
> +                        } else if (delegator.findOne("InvoiceItemType", UtilMisc.<String, Object>toMap("invoiceItemTypeId", invoiceItem.get("invoiceItemTypeId")), false) == null) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": InvoiceItem Item type id: " + invoiceItem.get("invoiceItemTypeId") + " not found for invoice: " + currentInvoiceId + " Item seqId:" + invoiceItem.get("invoiceItemSeqId"));
> +                        }
> +                        if (UtilValidate.isEmpty(invoiceItem.get("productId")) && UtilValidate.isEmpty(invoiceItem.get("description"))) {
> +                        }
> +                        if (UtilValidate.isNotEmpty(invoiceItem.get("productId")) && delegator.findOne("Product", UtilMisc.<String, Object>toMap("productId", invoiceItem.get("productId")), false) == null) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Product Id: " + invoiceItem.get("productId") + " not found for invoice: " + currentInvoiceId + " Item seqId:" + invoiceItem.get("invoiceItemSeqId"));
> +                        }
> +                        if (UtilValidate.isEmpty(invoiceItem.get("amount")) && UtilValidate.isEmpty(invoiceItem.get("quantity"))) {
> +                        	newErrMsgs.add("Line number " + rec.getRecordNumber() + ": Either or both quantity and amount is required for invoice: " + currentInvoiceId + " Item seqId:" + invoiceItem.get("invoiceItemSeqId"));
> +                        }
> +                    } catch (GenericEntityException e) {
> +                        Debug.logError("Validation checking problem against database. due to " + e.getMessage(), module);
> +                    }
> +
> +                    if (newErrMsgs.size() > 0) {
> +        				errMsgs.addAll(newErrMsgs);
> +                    } else {
> +            			try {
> +            				dispatcher.runSync("createInvoiceItem", invoiceItem);
> +            			} catch (GenericServiceException 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);
> +        }
>   
> +        Map<String, Object> result = ServiceUtil.returnSuccess(invoicesCreated + " new invoice(s) created");
> +        result.put("organizationPartyId", organizationPartyId);
> +        return result;
> +    }
>   }
>
> Modified: ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml (original)
> +++ ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml Thu Jul 11 03:14:30 2013
> @@ -753,6 +753,23 @@ under the License.
>           <security https="true" auth="true"/>
>           <response name="success" type="view" value="ListGlAccountOrgCsv"/>
>       </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="PartyAccountsExportInvoicesCsv.csv">
> +        <security https="true" auth="true"/>
> +        <response name="success" type="view" value="PartyAccountsExportInvoicesCsv"/>
> +    </request-map>
> +    <request-map uri="uploadInvoice">
> +        <security auth="true" https="true"/>
> +        <event invoke="importInvoice" path="" type="service"/>
> +        <response name="success" type="request" value="ImportExport"/>
> +        <response name="error" type="view" value="ImportExport"/>
> +    </request-map>
>   
>       <!-- TO BE REMOVED
>       <request-map uri="EditGlobalGlAccountOrganizations"><security https="true" auth="true"/><response name="success" type="view" value="EditGlobalGlAccountOrganizations"/></request-map>
> @@ -2768,6 +2785,10 @@ under the License.
>       <view-map name="ListGlAccountOrgPdf" type="screenfop" page="component://accounting/widget/GlSetupScreens.xml#ListGlAccountOrgPdf" content-type="application/pdf" encoding="none"/>
>       <view-map name="ListGlAccountOrgCsv" type="screencsv" page="component://accounting/widget/GlSetupScreens.xml#ListGlAccountOrgCsv" content-type="text/csv" encoding="none"/>
>   
> +    <!-- import export -->
> +    <view-map name="ImportExport" type="screen" page="component://accounting/widget/GlSetupScreens.xml#ImportExport"/>
> +    <view-map name="PartyAccountsExportInvoicesCsv" type="screencsv" page="component://accounting/widget/GlSetupScreens.xml#PartyAccountsExportInvoicesCsv" content-type="text/csv" encoding="none"/>
> +
>       <!-- Manual Credit Card Transaction -->
>       <view-map name="FindGatewayResponses" page="component://accounting/widget/TransactionScreens.xml#FindGatewayResponses" type="screen"/>
>       <view-map name="ViewGatewayResponse" page="component://accounting/widget/TransactionScreens.xml#ViewGatewayResponse" type="screen"/>
>
> Modified: ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml (original)
> +++ ofbiz/trunk/applications/accounting/widget/GlSetupForms.xml Thu Jul 11 03:14:30 2013
> @@ -34,6 +34,11 @@ under the License.
>                   <parameter param-name="organizationPartyId" from-field="partyId"/>
>               </hyperlink>
>           </field>
> +        <field name="importexport" title=" " use-when="hasBasicPermission" widget-style="buttontext">
> +            <hyperlink target="ImportExport" description="${uiLabelMap.CommonImportExport}">
> +                <parameter param-name="organizationPartyId" from-field="partyId"/>
> +            </hyperlink>
> +        </field>
>       </form>
>   
>       <form name="ListGlAccountOrganization" list-name="listIt" target="" title="" type="list" view-size="50"
> @@ -71,6 +76,55 @@ under the License.
>           <field name="submitButton" title="${uiLabelMap.AccountingNewCompany}"><submit button-type="button"/></field>
>       </form>
>   
> +    <form name="ExportInvoice" type="single" target="PartyAccountsExportInvoicesCsv.csv" title="" >
> +        <field name="organizationPartyId"><hidden value="${parameters.organizationPartyId}"/></field>
> +        <field name="invoiceId"><lookup target-form-name="LookupInvoice"/></field>
> +        <field name="startDate"><date-time/></field>
> +        <field name="submitButton" title="${uiLabelMap.CommonSubmit}"><submit button-type="button"/></field>
> +    </form>
> +
> +    <form name="PartyAccountsExportInvoicesCsv" 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="InvoiceExport">
> +                <condition-list combine="and">
> +                    <condition-list combine="or">
> +                        <condition-expr field-name="partyIdFrom" from-field="organizationPartyId" operator="equals"/>
> +                        <condition-expr field-name="partyId" from-field="organizationPartyId" operator="equals"/>
> +                    </condition-list>
> +                    <condition-expr field-name="invoiceDate" operator="greater-equals" from-field="parameters.startDate" ignore-if-empty="true"/>
> +                    <condition-expr field-name="invoiceId" operator="equals" from-field="parameters.invoiceId" ignore-if-empty="true"/>
> +                </condition-list>
> +                <order-by field-name="invoiceId"/>
> +            </entity-condition>
> +        </actions>
> +        <field name="organizationPartyId"><hidden value="${organizationPartyId}"/></field>
> +        <field name="invoiceId" title="invoiceId"><display/></field>
> +        <field name="invoiceTypeId" title="invoiceTypeId"><display/></field>
> +        <field name="invoiceDate" title="invoiceDate"><display/></field>
> +        <field name="dueDate" title="dueDate"><display/></field>
> +        <field name="partyIdFrom" title="partyIdFrom"><display/></field>
> +        <field name="partyIdFromTrans" title="partyIdFromTrans"><display/></field>
> +        <field name="partyId" title="partyId"><display/></field>
> +        <field name="partyIdTrans" title="partyIdTrans"><display/></field>
> +        <field name="currencyUomId" title="currencyUomId"><display/></field>
> +        <field name="description" title="description"><display/></field>
> +        <field name="referenceNum" title="referenceNum"><display/></field>
> +        <field name="invoiceItemSeqId" title="invoiceItemSeqId"><display/></field>
> +        <field name="invoiceItemTypeId" title="invoiceItemTypeId"><display/></field>
> +        <field name="productId" title="productId"><display/></field>
> +        <field name="productIdTrans" title="productIdTrans"><display/></field>
> +        <field name="itemDescription" title="itemDescription"><display/></field>
> +        <field name="quantity" title="quantity"><display/></field>
> +        <field name="amount" title="amount"><display/></field>
> +    </form>
> +
> +    <form name="ImportInvoice" type="upload" target="uploadInvoice" title="" >
> +        <field name="organizationPartyId"><hidden value="${parameters.organizationPartyId}"/></field>
> +        <field name="uploadedFile"><file/></field>
> +        <field name="submitButton" title="${uiLabelMap.CommonUpload}"><submit button-type="button"/></field>
> +    </form>
> +
>       <form name="AssignGlAccount" type="single" target="createGlAccountOrganization" title="" default-map-name="account"
>           header-row-style="header-row" default-table-style="basic-table">
>           <field name="organizationPartyId"><hidden/></field>
>
> Modified: ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml (original)
> +++ ofbiz/trunk/applications/accounting/widget/GlSetupScreens.xml Thu Jul 11 03:14:30 2013
> @@ -51,7 +51,6 @@ under the License.
>       <screen name="ListCompanies">
>           <section>
>               <actions>
> -                <property-map resource="AccountingUiLabels" map-name="uiLabelMap" global="true"/>
>                   <set field="titleProperty" value="AccountingAvailableInternalOrganizations"/>
>                   <set field="headerItem" value="companies"/>
>                   <set field="labelTitleProperty" value="${uiLabelMap.AccountingAvailableInternalOrganizations}"/>
> @@ -80,7 +79,6 @@ under the License.
>       <screen name="AddCompany">
>           <section>
>               <actions>
> -                <property-map resource="AccountingUiLabels" map-name="uiLabelMap" global="true"/>
>                   <set field="titleProperty" value="AccountingNewCompany"/>
>               </actions>
>               <widgets>
> @@ -94,6 +92,32 @@ under the License.
>               </widgets>
>           </section>
>       </screen>
> +    <screen name="ImportExport">
> +        <section>
> +            <actions>
> +                <set field="titleProperty" value="CommonImportExport"/>
> +                <entity-one entity-name="PartyGroup" value-field="partyGroup">
> +                    <field-map field-name="partyId" from-field="parameters.organizationPartyId"/>
> +                </entity-one>
> +            </actions>
> +            <widgets>
> +                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
> +                    <decorator-section name="body">
> +                        <screenlet title="${uiLabelMap.AccountingInvoice} ${uiLabelMap.CommonImportExport}  ${uiLabelMap.CommonFor}: ${partyGroup.groupName} [${parameters.organizationPartyId}]">
> +                            <container style="lefthalf">
> +                                <label style="h2">${uiLabelMap.CommonImport}</label>
> +                                <include-form name="ImportInvoice" location="component://accounting/widget/GlSetupForms.xml"/>
> +                            </container>
> +                            <container style="righthalf">
> +                                <label style="h2">${uiLabelMap.CommonExport}</label>
> +                                <include-form name="ExportInvoice" location="component://accounting/widget/GlSetupForms.xml"/>
> +                            </container>
> +                         </screenlet>
> +                    </decorator-section>
> +                </decorator-screen>
> +            </widgets>
> +        </section>
> +    </screen>
>       <screen name="ListGlAccountOrganization">
>           <section>
>               <actions>
> @@ -559,6 +583,18 @@ under the License.
>               </widgets>
>           </section>
>       </screen>
> +    <screen name="PartyAccountsExportInvoicesCsv">
> +        <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="PartyAccountsExportInvoicesCsv" location="component://accounting/widget/GlSetupForms.xml"/>
> +            </widgets>
> +        </section>
> +    </screen>
>       <screen name="FindGlAccountCategory">
>           <section>
>               <actions>
>
> Added: ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar?rev=1502093&view=auto
> ==============================================================================
> Binary file - no diff available.
>
> Propchange: ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar
> ------------------------------------------------------------------------------
>      svn:mime-type = application/octet-stream
>
> Modified: ofbiz/trunk/framework/common/config/CommonUiLabels.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/config/CommonUiLabels.xml?rev=1502093&r1=1502092&r2=1502093&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/common/config/CommonUiLabels.xml (original)
> +++ ofbiz/trunk/framework/common/config/CommonUiLabels.xml Thu Jul 11 03:14:30 2013
> @@ -5166,6 +5166,12 @@
>           <value xml:lang="vi">Ảnh</value>
>           <value xml:lang="zh">图片</value>
>       </property>
> +    <property key="CommonImport">
> +        <value xml:lang="en">Import</value>
> +    </property>
> +    <property key="CommonImportExport">
> +        <value xml:lang="en">Import/Export</value>
> +    </property>
>       <property key="CommonIn">
>           <value xml:lang="ar">داخل</value>
>           <value xml:lang="cs">V</value>
>
>

Re: svn commit: r1502093 - in /ofbiz/trunk: ./ applications/accounting/config/ applications/accounting/data/ applications/accounting/entitydef/ applications/accounting/servicedef/ applications/accounting/src/org/ofbiz/accounting/invoice/ applications/accou...

Posted by Hans Bakker <ma...@antwebsystems.com>.
Adrian, feel free to improve my implementation. By the way, export is 
fine using forms, and the only csv imports are this one and the address 
match in party.....do not really see if these are ad-hoc?

Regards,
Hans

On 07/11/2013 11:13 PM, Adrian Crum wrote:
> Christian,
>
> Thank you for bringing this up. OFBiz needs a well designed CSV 
> import/export feature to replace all of the ad-hoc CSV code it uses 
> currently.
>
> -Adrian
>
> On 7/11/2013 8:27 AM, Christian Geisert wrote:
>> Am 11.07.2013 05:14, schrieb hansbak@apache.org:
>>> Author: hansbak
>>> Date: Thu Jul 11 03:14:30 2013
>>> New Revision: 1502093
>>>
>>> URL: http://svn.apache.org/r1502093
>>> Log:
>>> add a csv import/export invoices at an organizational level with 
>>> partyid and productid translation functions, more imports/exports 
>>> will follow
>>>
>>> Added:
>>> ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar (with props)
>>
>> Hans,
>>
>> I much as I like this new feature, pushing it to the repository 
>> without any discussion is not the way to go.
>>
>> And btw, you still haven't addressed Adrians concerns regarding the 
>> usage of screenlets...
>>
>> Christian
>>
>


Re: svn commit: r1502093 - in /ofbiz/trunk: ./ applications/accounting/config/ applications/accounting/data/ applications/accounting/entitydef/ applications/accounting/servicedef/ applications/accounting/src/org/ofbiz/accounting/invoice/ applications/accou...

Posted by Adrian Crum <ad...@sandglass-software.com>.
Christian,

Thank you for bringing this up. OFBiz needs a well designed CSV 
import/export feature to replace all of the ad-hoc CSV code it uses 
currently.

-Adrian

On 7/11/2013 8:27 AM, Christian Geisert wrote:
> Am 11.07.2013 05:14, schrieb hansbak@apache.org:
>> Author: hansbak
>> Date: Thu Jul 11 03:14:30 2013
>> New Revision: 1502093
>>
>> URL: http://svn.apache.org/r1502093
>> Log:
>> add a csv import/export invoices at an organizational level with 
>> partyid and productid translation functions, more imports/exports 
>> will follow
>>
>> Added:
>> ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar (with props)
>
> Hans,
>
> I much as I like this new feature, pushing it to the repository 
> without any discussion is not the way to go.
>
> And btw, you still haven't addressed Adrians concerns regarding the 
> usage of screenlets...
>
> Christian
>


Re: svn commit: r1502093 - in /ofbiz/trunk: ./ applications/accounting/config/ applications/accounting/data/ applications/accounting/entitydef/ applications/accounting/servicedef/ applications/accounting/src/org/ofbiz/accounting/invoice/ applications/accou...

Posted by Christian Geisert <ch...@isu-gmbh.de>.
Am 11.07.2013 05:14, schrieb hansbak@apache.org:
> Author: hansbak
> Date: Thu Jul 11 03:14:30 2013
> New Revision: 1502093
>
> URL: http://svn.apache.org/r1502093
> Log:
> add a csv import/export invoices at an organizational level with partyid and productid translation functions, more imports/exports will follow
>
> Added:
>      ofbiz/trunk/framework/base/lib/commons/commons-csv-1.0.jar   (with props)

Hans,

I much as I like this new feature, pushing it to the repository without 
any discussion is not the way to go.

And btw, you still haven't addressed Adrians concerns regarding the 
usage of screenlets...

Christian