<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.opentaps.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jwickers</id>
	<title>Opentaps Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.opentaps.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jwickers"/>
	<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Special:Contributions/Jwickers"/>
	<updated>2026-04-05T17:20:46Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.32.1</generator>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7580</id>
		<title>CRM-2 Social API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7580"/>
		<updated>2015-04-07T07:11:28Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The social API allows you to record social interactions of your customers, such as views, likes (faves), votes for and against, and comments.  They can be related to other activities or to other nodes, such as web pages or blog posts.  The API does not include the user interface but is meant to be called from the user interface to record the interactions.&lt;br /&gt;
&lt;br /&gt;
=== Summary ===&lt;br /&gt;
&lt;br /&gt;
Gets the summary of social activities that were applied to a given activity.&lt;br /&gt;
&lt;br /&gt;
Method: GET, URL extension: &amp;lt;tt&amp;gt;/social/activities/:parentNoteId&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to get the summary&lt;br /&gt;
&lt;br /&gt;
Returns a JSON structure with:&lt;br /&gt;
* thumbsUp: number of thumbs-up&lt;br /&gt;
* thumbsDown: number of thumbs-down&lt;br /&gt;
* views: number of views&lt;br /&gt;
* likes: number of likes&lt;br /&gt;
* comments: number of comments&lt;br /&gt;
* hasThumbUp: boolean flag indicating if the given user has thumb-up that activity&lt;br /&gt;
* hasThumbDown: same with thumb-down&lt;br /&gt;
* hasView: same with view&lt;br /&gt;
* hasLike: same with like&lt;br /&gt;
* hasComment: boolean flag indicating if the given user has commented on that activity&lt;br /&gt;
&lt;br /&gt;
=== Thumbs Up  ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been thumbed up.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-up&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a thumb up&lt;br /&gt;
* userId : id of the user that thumbed the activity&lt;br /&gt;
&lt;br /&gt;
=== Thumbs Down  ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been thumbed down.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-down&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a thumb down&lt;br /&gt;
* userId : id of the user that thumbed the activity&lt;br /&gt;
&lt;br /&gt;
=== Views ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been viewed.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/view&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Like ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the likes or faves of an activity.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/like&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a like&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;br /&gt;
&lt;br /&gt;
==== Posting comments ====&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/comment&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a comment&lt;br /&gt;
* userId : id of the user that commented&lt;br /&gt;
* noteText : the text of the comment&lt;br /&gt;
&lt;br /&gt;
Comments are pending moderation, the next method is to manage that.&lt;br /&gt;
&lt;br /&gt;
==== Moderating comments ====&lt;br /&gt;
&lt;br /&gt;
Method: POST or GET, URL extension: &amp;lt;tt&amp;gt;/social/comment/:_id/:action&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* _id : id of the comment&lt;br /&gt;
* action : either &amp;quot;accept&amp;quot; or &amp;quot;reject&amp;quot;&lt;br /&gt;
&lt;br /&gt;
With &amp;quot;accept&amp;quot; the comment becomes accepted and visible by all the users, &amp;quot;reject&amp;quot; rejects the comment and it stays invisible.&lt;br /&gt;
&lt;br /&gt;
==== Retreiving comments ====&lt;br /&gt;
&lt;br /&gt;
Method: GET, URL extension: &amp;lt;tt&amp;gt;/social/comments/:parentNoteId&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to get the comments&lt;br /&gt;
&lt;br /&gt;
Returns a JSON array of comment activities.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7579</id>
		<title>CRM-2 Social API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7579"/>
		<updated>2015-03-20T07:41:57Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The social API allows you to record social interactions of your customers, such as views, likes (faves), votes for and against, and comments.  They can be related to other activities or to other nodes, such as web pages or blog posts.  The API does not include the user interface but is meant to be called from the user interface to record the interactions.&lt;br /&gt;
&lt;br /&gt;
=== Summary ===&lt;br /&gt;
&lt;br /&gt;
Gets the summary of social activities that were applied to a given activity.&lt;br /&gt;
&lt;br /&gt;
Method: GET, URL extension: &amp;lt;tt&amp;gt;/social/activities/:parentNoteId&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to get the summary&lt;br /&gt;
&lt;br /&gt;
Returns a JSON structure with:&lt;br /&gt;
* thumbsUp: number of thumbs-up&lt;br /&gt;
* thumbsDown: number of thumbs-down&lt;br /&gt;
* views: number of views&lt;br /&gt;
* likes: number of likes&lt;br /&gt;
* comments: number of comments&lt;br /&gt;
* hasThumbUp: boolean flag indicating if the given user has thumb-up that activity&lt;br /&gt;
* hasThumbDown: same with thumb-down&lt;br /&gt;
* hasView: same with view&lt;br /&gt;
* hasLike: same with like&lt;br /&gt;
* hasComment: boolean flag indicating if the given user has commented on that activity&lt;br /&gt;
&lt;br /&gt;
=== Views ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been viewed.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/view&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Like ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the likes or faves of an activity.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/like&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a like&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;br /&gt;
&lt;br /&gt;
==== Posting comments ====&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/comment&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a comment&lt;br /&gt;
* userId : id of the user that commented&lt;br /&gt;
* noteText : the text of the comment&lt;br /&gt;
&lt;br /&gt;
Comments are pending moderation, the next method is to manage that.&lt;br /&gt;
&lt;br /&gt;
==== Moderating comments ====&lt;br /&gt;
&lt;br /&gt;
Method: POST or GET, URL extension: &amp;lt;tt&amp;gt;/social/comment/:_id/:action&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* _id : id of the comment&lt;br /&gt;
* action : either &amp;quot;accept&amp;quot; or &amp;quot;reject&amp;quot;&lt;br /&gt;
&lt;br /&gt;
With &amp;quot;accept&amp;quot; the comment becomes accepted and visible by all the users, &amp;quot;reject&amp;quot; rejects the comment and it stays invisible.&lt;br /&gt;
&lt;br /&gt;
==== Retreiving comments ====&lt;br /&gt;
&lt;br /&gt;
Method: GET, URL extension: &amp;lt;tt&amp;gt;/social/comments/:parentNoteId&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to get the comments&lt;br /&gt;
&lt;br /&gt;
Returns a JSON array of comment activities.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7578</id>
		<title>CRM-2 Social API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7578"/>
		<updated>2015-03-20T07:40:46Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Thumb Up and Thumb Down */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The social API allows you to record social interactions of your customers, such as views, likes (faves), votes for and against, and comments.  They can be related to other activities or to other nodes, such as web pages or blog posts.  The API does not include the user interface but is meant to be called from the user interface to record the interactions.&lt;br /&gt;
&lt;br /&gt;
=== Summary ===&lt;br /&gt;
&lt;br /&gt;
Gets the summary of social activities that were applied to a given activity.&lt;br /&gt;
&lt;br /&gt;
Method: GET, URL extension: &amp;lt;tt&amp;gt;/social/activities/:parentNoteId&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to get the summary&lt;br /&gt;
&lt;br /&gt;
Returns JSON structure with:&lt;br /&gt;
* thumbsUp: number of thumbs-up&lt;br /&gt;
* thumbsDown: number of thumbs-down&lt;br /&gt;
* views: number of views&lt;br /&gt;
* likes: number of likes&lt;br /&gt;
* comments: number of comments&lt;br /&gt;
* hasThumbUp: boolean flag indicating if the given user has thumb-up that activity&lt;br /&gt;
* hasThumbDown: same with thumb-down&lt;br /&gt;
* hasView: same with view&lt;br /&gt;
* hasLike: same with like&lt;br /&gt;
* hasComment: boolean flag indicating if the given user has commented on that activity&lt;br /&gt;
&lt;br /&gt;
=== Views ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been viewed.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/view&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Like ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the likes or faves of an activity.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/like&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a like&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;br /&gt;
&lt;br /&gt;
==== Posting comments ====&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/comment&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a comment&lt;br /&gt;
* userId : id of the user that commented&lt;br /&gt;
* noteText : the text of the comment&lt;br /&gt;
&lt;br /&gt;
Comments are pending moderation, the next method is to manage that.&lt;br /&gt;
&lt;br /&gt;
==== Moderating comments ====&lt;br /&gt;
&lt;br /&gt;
Method: POST or GET, URL extension: &amp;lt;tt&amp;gt;/social/comment/:_id/:action&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* _id : id of the comment&lt;br /&gt;
* action : either &amp;quot;accept&amp;quot; or &amp;quot;reject&amp;quot;&lt;br /&gt;
&lt;br /&gt;
With &amp;quot;accept&amp;quot; the comment becomes accepted and visible by all the users, &amp;quot;reject&amp;quot; rejects the comment and it stays invisible.&lt;br /&gt;
&lt;br /&gt;
==== Retreiving comments ====&lt;br /&gt;
&lt;br /&gt;
Method: GET, URL extension: &amp;lt;tt&amp;gt;/social/comments/:parentNoteId&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to get the comments&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7577</id>
		<title>CRM-2 Social API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7577"/>
		<updated>2015-03-20T07:39:43Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The social API allows you to record social interactions of your customers, such as views, likes (faves), votes for and against, and comments.  They can be related to other activities or to other nodes, such as web pages or blog posts.  The API does not include the user interface but is meant to be called from the user interface to record the interactions.&lt;br /&gt;
&lt;br /&gt;
=== Summary ===&lt;br /&gt;
&lt;br /&gt;
Gets the summary of social activities that were applied to a given activity.&lt;br /&gt;
&lt;br /&gt;
Method: GET, URL extension: &amp;lt;tt&amp;gt;/social/activities/:parentNoteId&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to get the summary&lt;br /&gt;
&lt;br /&gt;
Returns JSON structure with:&lt;br /&gt;
* thumbsUp: number of thumbs-up&lt;br /&gt;
* thumbsDown: number of thumbs-down&lt;br /&gt;
* views: number of views&lt;br /&gt;
* likes: number of likes&lt;br /&gt;
* comments: number of comments&lt;br /&gt;
* hasThumbUp: boolean flag indicating if the given user has thumb-up that activity&lt;br /&gt;
* hasThumbDown: same with thumb-down&lt;br /&gt;
* hasView: same with view&lt;br /&gt;
* hasLike: same with like&lt;br /&gt;
* hasComment: boolean flag indicating if the given user has commented on that activity&lt;br /&gt;
&lt;br /&gt;
=== Views ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been viewed.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/view&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Like ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the likes or faves of an activity.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/like&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a like&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Thumb Up and Thumb Down ===&lt;br /&gt;
&lt;br /&gt;
Records and retrieves votes either for or against.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-up&amp;lt;/tt&amp;gt;&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-down&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a thumb-up or thumb-down&lt;br /&gt;
* userId : id of the user that voted on the activity&lt;br /&gt;
&lt;br /&gt;
Note: only one of those action is active for a given user and activity, if the user thumb-up then thumb-down his thumb-up is deleted.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7576</id>
		<title>CRM-2 Social API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7576"/>
		<updated>2015-03-20T07:35:33Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The social API allows you to record social interactions of your customers, such as views, likes (faves), votes for and against, and comments.  They can be related to other activities or to other nodes, such as web pages or blog posts.  The API does not include the user interface but is meant to be called from the user interface to record the interactions.&lt;br /&gt;
&lt;br /&gt;
=== Views ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been viewed.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/view&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Like ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the likes or faves of an activity.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/like&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a like&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Thumb Up and Thumb Down ===&lt;br /&gt;
&lt;br /&gt;
Records and retrieves votes either for or against.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-up&amp;lt;/tt&amp;gt;&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-down&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a thumb-up or thumb-down&lt;br /&gt;
* userId : id of the user that voted on the activity&lt;br /&gt;
&lt;br /&gt;
Note: only one of those action is active for a given user and activity, if the user thumb-up then thumb-down his thumb-up is deleted.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;br /&gt;
&lt;br /&gt;
==== Posting comments ====&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/comment&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a comment&lt;br /&gt;
* userId : id of the user that commented&lt;br /&gt;
* noteText : the text of the comment&lt;br /&gt;
&lt;br /&gt;
Comments are pending moderation, the next method is to manage that.&lt;br /&gt;
&lt;br /&gt;
==== Moderating comments ====&lt;br /&gt;
&lt;br /&gt;
Method: POST or GET, URL extension: &amp;lt;tt&amp;gt;/social/comment/:_id/:action&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* _id : id of the comment&lt;br /&gt;
* action : either &amp;quot;accept&amp;quot; or &amp;quot;reject&amp;quot;&lt;br /&gt;
&lt;br /&gt;
With &amp;quot;accept&amp;quot; the comment becomes accepted and visible by all the users, &amp;quot;reject&amp;quot; rejects the comment and it stays invisible.&lt;br /&gt;
&lt;br /&gt;
==== Retreiving comments ====&lt;br /&gt;
&lt;br /&gt;
Method: GET, URL extension: &amp;lt;tt&amp;gt;/comments/:parentNoteId&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to get the comments&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7575</id>
		<title>CRM-2 Social API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7575"/>
		<updated>2015-03-20T07:31:56Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Thumb Up and Thumb Down */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The social API allows you to record social interactions of your customers, such as views, likes (faves), votes for and against, and comments.  They can be related to other activities or to other nodes, such as web pages or blog posts.  The API does not include the user interface but is meant to be called from the user interface to record the interactions.&lt;br /&gt;
&lt;br /&gt;
=== Views ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been viewed.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/view&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Like ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the likes or faves of an activity.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/like&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a like&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Thumb Up and Thumb Down ===&lt;br /&gt;
&lt;br /&gt;
Records and retrieves votes either for or against.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-up&amp;lt;/tt&amp;gt;&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-down&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a thumb-up or thumb-down&lt;br /&gt;
* userId : id of the user that voted on the activity&lt;br /&gt;
&lt;br /&gt;
Note: only one of those action is active for a given user and activity, if the user thumb-up then thumb-down his thumb-up is deleted.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7574</id>
		<title>CRM-2 Social API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7574"/>
		<updated>2015-03-20T07:27:12Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Thumb Up and Thumb Down */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The social API allows you to record social interactions of your customers, such as views, likes (faves), votes for and against, and comments.  They can be related to other activities or to other nodes, such as web pages or blog posts.  The API does not include the user interface but is meant to be called from the user interface to record the interactions.&lt;br /&gt;
&lt;br /&gt;
=== Views ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been viewed.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/view&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Like ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the likes or faves of an activity.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/like&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a like&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Thumb Up and Thumb Down ===&lt;br /&gt;
&lt;br /&gt;
Records and retrieves votes either for or against.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-up&amp;lt;/tt&amp;gt;&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-down&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a thumb-up or thumb-down&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
Note: only one of those action is active for a given user and activity, if the user thumb-up then thumb-down his thumb-up is deleted.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7573</id>
		<title>CRM-2 Social API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7573"/>
		<updated>2015-03-20T07:26:52Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Like */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The social API allows you to record social interactions of your customers, such as views, likes (faves), votes for and against, and comments.  They can be related to other activities or to other nodes, such as web pages or blog posts.  The API does not include the user interface but is meant to be called from the user interface to record the interactions.&lt;br /&gt;
&lt;br /&gt;
=== Views ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been viewed.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/view&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Like ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the likes or faves of an activity.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/like&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a like&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Thumb Up and Thumb Down ===&lt;br /&gt;
&lt;br /&gt;
Records and retrieves votes either for or against.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-up&amp;lt;/tt&amp;gt;&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-down&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
Note: only one of those action is active for a given user and activity, if the user thumb-up then thumb-down his thumb-up is deleted.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7572</id>
		<title>CRM-2 Social API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7572"/>
		<updated>2015-03-20T07:26:33Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Thumb Up and Thumb Down */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The social API allows you to record social interactions of your customers, such as views, likes (faves), votes for and against, and comments.  They can be related to other activities or to other nodes, such as web pages or blog posts.  The API does not include the user interface but is meant to be called from the user interface to record the interactions.&lt;br /&gt;
&lt;br /&gt;
=== Views ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been viewed.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/view&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Like ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the likes or faves of an activity.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/like&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Thumb Up and Thumb Down ===&lt;br /&gt;
&lt;br /&gt;
Records and retrieves votes either for or against.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-up&amp;lt;/tt&amp;gt;&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/thumb-down&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
Note: only one of those action is active for a given user and activity, if the user thumb-up then thumb-down his thumb-up is deleted.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7571</id>
		<title>CRM-2 Social API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7571"/>
		<updated>2015-03-20T07:24:59Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Like */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The social API allows you to record social interactions of your customers, such as views, likes (faves), votes for and against, and comments.  They can be related to other activities or to other nodes, such as web pages or blog posts.  The API does not include the user interface but is meant to be called from the user interface to record the interactions.&lt;br /&gt;
&lt;br /&gt;
=== Views ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been viewed.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/view&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Like ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the likes or faves of an activity.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/like&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Thumb Up and Thumb Down ===&lt;br /&gt;
&lt;br /&gt;
Records and retrieves votes either for or against.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7570</id>
		<title>CRM-2 Social API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7570"/>
		<updated>2015-03-20T07:24:30Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Views */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The social API allows you to record social interactions of your customers, such as views, likes (faves), votes for and against, and comments.  They can be related to other activities or to other nodes, such as web pages or blog posts.  The API does not include the user interface but is meant to be called from the user interface to record the interactions.&lt;br /&gt;
&lt;br /&gt;
=== Views ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the number of times the activity has been viewed.&lt;br /&gt;
&lt;br /&gt;
Method: POST, URL extension: &amp;lt;tt&amp;gt;/social/view&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* parentNoteId : id of the activity for which to record a view&lt;br /&gt;
* userId : id of the user that viewed the activity&lt;br /&gt;
&lt;br /&gt;
=== Like ===&lt;br /&gt;
&lt;br /&gt;
Records or retrieves the likes or faves of an activity.&lt;br /&gt;
&lt;br /&gt;
=== Thumb Up and Thumb Down ===&lt;br /&gt;
&lt;br /&gt;
Records and retrieves votes either for or against.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
Records comments.  A comment is first created in the pending state and will be emailed to the domain administrator (user with DOMAIN_CONF permission), who needs to approve or reject the comment.  Only approved comments will be retrieved for display.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Administrative_API&amp;diff=7555</id>
		<title>CRM-2 Administrative API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Administrative_API&amp;diff=7555"/>
		<updated>2014-10-15T06:36:42Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Email Notifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Administrative API is used to manage your domain.  &lt;br /&gt;
&lt;br /&gt;
The API calls follow the general RESTful pattern of [[CRM-2 API]].  The base URL is &amp;lt;tt&amp;gt;https://crm2.opentaps.com/admin/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To access the admin API, your user must have the '''DOMAIN_CONF''' permission.&lt;br /&gt;
&lt;br /&gt;
For all requests the clientDomain and authToken parameters are required.&lt;br /&gt;
&lt;br /&gt;
Here are the additional resources available:&lt;br /&gt;
&lt;br /&gt;
=== Reset (Permanent) Token ===&lt;br /&gt;
&lt;br /&gt;
Method: POST&lt;br /&gt;
URL extension: &amp;lt;tt&amp;gt;/admin/reset-token&amp;lt;/tt&amp;gt;&lt;br /&gt;
Parameter: &lt;br /&gt;
* Current permanent auth token for your user&lt;br /&gt;
* Client domain&lt;br /&gt;
&lt;br /&gt;
This API expires (deletes) the current permanent auth token, generates a new one, and returns it to you as the result.  After this, you must use the new one to access the system.  The API will validate that the token you've supplied is for a user of your domain.&lt;br /&gt;
&lt;br /&gt;
=== Users ===&lt;br /&gt;
&lt;br /&gt;
Add or remove users for a Contact&lt;br /&gt;
&lt;br /&gt;
URL extension: &amp;lt;tt&amp;gt;/admin/user&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* contactId : unique ID of your Contact&lt;br /&gt;
* userId: id of user.  For Gmail, use full email (someone@gmail.com).  For twitter, use username without the initial @ (someone)&lt;br /&gt;
* userIdType: type of your user id.  Use GOOGLE_APPS for Gmail or TWITTER_LOGIN for Twitter.&lt;br /&gt;
&lt;br /&gt;
Add a new User and Contact at the same time with&lt;br /&gt;
&lt;br /&gt;
URL extension: &amp;lt;tt&amp;gt;/admin/user-contact&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* firstName&lt;br /&gt;
* lastName&lt;br /&gt;
* companyName&lt;br /&gt;
* emailAddress&lt;br /&gt;
* userId&lt;br /&gt;
* userIdType: Same as above&lt;br /&gt;
&lt;br /&gt;
=== User Permissions ===&lt;br /&gt;
&lt;br /&gt;
Add or remove a security permission from a user&lt;br /&gt;
&lt;br /&gt;
URL extension: &amp;lt;tt&amp;gt;/admin/user-permission&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* userId: unique id of the user&lt;br /&gt;
* permission: Permission string&lt;br /&gt;
&lt;br /&gt;
If the permission you are trying to add is not a valid permission, you will get an error message with a list of the valid permissions.&lt;br /&gt;
&lt;br /&gt;
Valid permissions are:&lt;br /&gt;
 * CONTACT_VIEW - view contacts and contact groups&lt;br /&gt;
 * CONTACT_UPDATE - create, update, delete contacts and contact groups&lt;br /&gt;
 * ACTIVITY_VIEW - view activities, such as tasks&lt;br /&gt;
 * ACTIVITY_UPDATE - create, update, delete activities&lt;br /&gt;
 * DOMAIN_CONF - administer the domain.&lt;br /&gt;
&lt;br /&gt;
=== Email Notifications ===&lt;br /&gt;
&lt;br /&gt;
Configure the email account to use when sending notification emails for your domain.  You must also configure the same email as an email to poll (see below) separately so that the responses are also registered.  Otherwise, response to your notification emails will be ignored.&lt;br /&gt;
&lt;br /&gt;
URL extension: &amp;lt;tt&amp;gt;/admin/email-notifications&amp;lt;/tt&amp;gt; (ie, &amp;lt;tt&amp;gt;https://crm2.opentaps.com/admin/email-notifications&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Parameters are the ones for your mail server, ie &amp;lt;tt&amp;gt;mailUser&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailPass&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailStoreProtocol&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailHost&amp;lt;/tt&amp;gt;.  For gmail, use &amp;lt;tt&amp;gt;smtp&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;smtp.gmail.com&amp;lt;/tt&amp;gt; for protocol and host. Note: do not try to use smtps which is not a valid transport, the code will connect using SSL on port 465 automatically.&lt;br /&gt;
&lt;br /&gt;
For all requests the clientDomain and authToken parameters are required.&lt;br /&gt;
&lt;br /&gt;
* The method POST and PUT is used to SET the email notification account settings.&lt;br /&gt;
* The method DELETE is used to REMOVE the email notification account settings.&lt;br /&gt;
* The method GET is used to GET the current email notification account settings.&lt;br /&gt;
&lt;br /&gt;
Note: the password is encrypted in the DB and won't be returned in the replies.&lt;br /&gt;
&lt;br /&gt;
=== Emails To Poll ===&lt;br /&gt;
&lt;br /&gt;
Configures the emails to be polled for your domain.  &lt;br /&gt;
&lt;br /&gt;
URL extension: &amp;lt;tt&amp;gt;/admin/email-to-poll&amp;lt;/tt&amp;gt; (ie, &amp;lt;tt&amp;gt;https://crm2.opentaps.com/admin/email-to-poll&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Parameters are the ones for your mail server, ie &amp;lt;tt&amp;gt;mailUser&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailPass&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailStoreProtocol&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailHost&amp;lt;/tt&amp;gt;.  For gmail, use &amp;lt;tt&amp;gt;gimap&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;pop.googlemail.com&amp;lt;/tt&amp;gt; for protocol and host.&lt;br /&gt;
&lt;br /&gt;
* The method POST is used to ADD email to poll.&lt;br /&gt;
* The method PUT is used to UPDATE email to poll.&lt;br /&gt;
* The method DELETE is used to REMOVE email to poll.&lt;br /&gt;
* The method GET is used to GET list of the emails to poll.&lt;br /&gt;
&lt;br /&gt;
For POST, PUT and DELETE, mailUser is required.&lt;br /&gt;
&lt;br /&gt;
Note: the password is encrypted in the DB and won't be returned in the replies.&lt;br /&gt;
&lt;br /&gt;
=== Valid Activity Types ===&lt;br /&gt;
&lt;br /&gt;
Configures the valid activity types for your domain's application settings.  Activity types are always capitalized and automatically capitalized when you add them.&lt;br /&gt;
&lt;br /&gt;
URL: &amp;lt;tt&amp;gt;https://crm2.opentaps.com/admin/activity-type&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* POST adds a single activityType&lt;br /&gt;
* GET returns a list of valid activity types&lt;br /&gt;
* DELETE removes a single activityType&lt;br /&gt;
&lt;br /&gt;
=== Twitter ===&lt;br /&gt;
&lt;br /&gt;
Configures the twitter users which opentaps CRM2 uses to interact with twitter.  Normally this is done automatically when somebody logs into twitter.com once from the login page, but you can control it more explicitly using this API to add a user or remove one that you don't want to use.&lt;br /&gt;
&lt;br /&gt;
URL: &amp;lt;tt&amp;gt;https://crm2.opentaps.com/admin/twitter&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* POST adds a new user to use with twitter.  Parameters are &amp;lt;tt&amp;gt;userName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;userId&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;token&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;tokenSecret&amp;lt;/tt&amp;gt;&lt;br /&gt;
* GET returns a list of users to use with twitter &lt;br /&gt;
* DELETE removes a user.  Parameter is &amp;lt;tt&amp;gt;userName&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Administrative_API&amp;diff=7368</id>
		<title>CRM-2 Administrative API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Administrative_API&amp;diff=7368"/>
		<updated>2013-07-02T06:57:23Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Administrative API is used to manage your domain.  &lt;br /&gt;
&lt;br /&gt;
The API calls follow the general RESTful pattern of [[CRM-2 API]].  The base URL is &amp;lt;tt&amp;gt;http://crm-2-url/admin/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To access the admin API, your user must have the '''DOMAIN_CONF''' permission.&lt;br /&gt;
&lt;br /&gt;
Here are the additional resources available:&lt;br /&gt;
&lt;br /&gt;
=== Email Notifications ===&lt;br /&gt;
&lt;br /&gt;
Configure the email account to use when sending notification emails for your domain.  &lt;br /&gt;
&lt;br /&gt;
URL extension: &amp;lt;tt&amp;gt;/admin/email-notifications&amp;lt;/tt&amp;gt; (ie, &amp;lt;tt&amp;gt;http://crm-2-url/admin/email-notifications&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Parameters are the ones for your mail server, ie &amp;lt;tt&amp;gt;mailUser&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailPass&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailStoreProtocol&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailHost&amp;lt;/tt&amp;gt;.  For gmail, use &amp;lt;tt&amp;gt;smtps&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;smtp.google.com&amp;lt;/tt&amp;gt; for protocol and host.&lt;br /&gt;
&lt;br /&gt;
For all requests the clientDomain and authToken parameters are required.&lt;br /&gt;
&lt;br /&gt;
* The method POST and PUT is used to SET the email notification account settings.&lt;br /&gt;
* The method DELETE is used to REMOVE the email notification account settings.&lt;br /&gt;
* The method GET is used to GET the current email notification account settings.&lt;br /&gt;
&lt;br /&gt;
Note: the password is encrypted in the DB and won't be returned in the replies.&lt;br /&gt;
&lt;br /&gt;
=== Emails To Poll ===&lt;br /&gt;
&lt;br /&gt;
Configures the emails to be polled for your domain.  &lt;br /&gt;
&lt;br /&gt;
URL extension: &amp;lt;tt&amp;gt;/admin/email-to-poll&amp;lt;/tt&amp;gt; (ie, &amp;lt;tt&amp;gt;http://crm-2-url/admin/email-to-poll&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Parameters are the ones for your mail server, ie &amp;lt;tt&amp;gt;mailUser&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailPass&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailStoreProtocol&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailHost&amp;lt;/tt&amp;gt;.  For gmail, use &amp;lt;tt&amp;gt;imaps&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;pop.google.com&amp;lt;/tt&amp;gt; for protocol and host.&lt;br /&gt;
&lt;br /&gt;
For all requests the clientDomain and authToken parameters are required.&lt;br /&gt;
&lt;br /&gt;
* The method POST is used to ADD email to poll.&lt;br /&gt;
* The method PUT is used to UPDATE email to poll.&lt;br /&gt;
* The method DELETE is used to REMOVE email to poll.&lt;br /&gt;
* The method GET is used to GET list of the emails to poll.&lt;br /&gt;
&lt;br /&gt;
For POST, PUT and DELETE, mailUser is required.&lt;br /&gt;
&lt;br /&gt;
Note: the password is encrypted in the DB and won't be returned in the replies.&lt;br /&gt;
&lt;br /&gt;
=== Valid Activity Types ===&lt;br /&gt;
&lt;br /&gt;
Configures the valid activity types for your domain's application settings.  Activity types are always capitalized and automatically capitalized when you add them.&lt;br /&gt;
&lt;br /&gt;
URL extension: &amp;lt;tt&amp;gt;/admin/activity-type&amp;lt;/tt&amp;gt; (ie, &amp;lt;tt&amp;gt;http://crm-2-url/admin/activity-type&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
* POST adds a single activityType&lt;br /&gt;
* GET returns a list of valid activity types&lt;br /&gt;
* DELETE removes a single activityType&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Contacts_API&amp;diff=7355</id>
		<title>CRM-2 Contacts API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Contacts_API&amp;diff=7355"/>
		<updated>2013-04-11T14:06:44Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contacts API is used to create and retreive contacts. ==&lt;br /&gt;
&lt;br /&gt;
The API calls follow the general RESTful pattern of [[CRM-2 API]].&lt;br /&gt;
&lt;br /&gt;
The base URL is &amp;lt;tt&amp;gt;http://crm-2-url/crm2/contact&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GET: Get a List of Contacts ===&lt;br /&gt;
* contactId&lt;br /&gt;
* emailAddress&lt;br /&gt;
* attribute Map&lt;br /&gt;
&lt;br /&gt;
=== POST: Create a contact ===&lt;br /&gt;
* firstName&lt;br /&gt;
* lastName&lt;br /&gt;
* companyName&lt;br /&gt;
* emailsNumber (used to iterate the following parameter where N is an index number)&lt;br /&gt;
** emailN (the email address)&lt;br /&gt;
** emailPurposeN (can be one of : PRIMARY, OTHER, ORDER, BILLING_AR, PAYMENT_AR, SHIPMENT)&lt;br /&gt;
* attribute Map (described as a series of &amp;lt;tt&amp;gt;attribute_${key}=${value}&amp;lt;/tt&amp;gt; parameters)&lt;br /&gt;
&lt;br /&gt;
The operation returns a JSON response with the created contact eg:&lt;br /&gt;
  {&amp;quot;result&amp;quot;:{&amp;quot;resultValue&amp;quot;:{&amp;quot;contactId&amp;quot;:&amp;quot;5166b967e4b0f6e6cd09e653&amp;quot;,&amp;quot;firstName&amp;quot;:&amp;quot;test&amp;quot;,&amp;quot;clientDomain&amp;quot;:&amp;quot;mydomain.com&amp;quot;,&amp;quot;emails&amp;quot;:[{&amp;quot;email&amp;quot;:&amp;quot;test@example.com&amp;quot;,&amp;quot;purpose&amp;quot;:&amp;quot;PRIMARY&amp;quot;}],&amp;quot;attributes&amp;quot;:{&amp;quot;somekey&amp;quot;:&amp;quot;somevalue&amp;quot;}}}}&lt;br /&gt;
&lt;br /&gt;
=== PUT: Update a contact ===&lt;br /&gt;
* firstName&lt;br /&gt;
* lastName&lt;br /&gt;
* companyName&lt;br /&gt;
* emailsNumber (used to iterate the following parameter where N is an index number)&lt;br /&gt;
** emailN (the email address)&lt;br /&gt;
** emailPurposeN (can be one of : PRIMARY, OTHER, ORDER, BILLING_AR, PAYMENT_AR, SHIPMENT)&lt;br /&gt;
* attribute Map (described as a series of &amp;lt;tt&amp;gt;attribute_${key}=${value}&amp;lt;/tt&amp;gt; parameters)&lt;br /&gt;
&lt;br /&gt;
Note that when updating:&lt;br /&gt;
* the attributes are always overwritten so not gving any attribute will remove the existing ones&lt;br /&gt;
* emails are only overwritten if at least one email is given or emailsNumber is set to 0 in which case the existing ones will be removed&lt;br /&gt;
* firstName, lastName, companyName are only updated when given, they must be given and set to an empty value to be removed&lt;br /&gt;
&lt;br /&gt;
The operation returns a JSON response with the new values of the updated contact eg:&lt;br /&gt;
  {&amp;quot;result&amp;quot;:{&amp;quot;resultValue&amp;quot;:{&amp;quot;contactId&amp;quot;:&amp;quot;5166b967e4b0f6e6cd09e653&amp;quot;,&amp;quot;firstName&amp;quot;:&amp;quot;test&amp;quot;,&amp;quot;clientDomain&amp;quot;:&amp;quot;mydomain.com&amp;quot;,&amp;quot;emails&amp;quot;:[{&amp;quot;email&amp;quot;:&amp;quot;test@example.com&amp;quot;,&amp;quot;purpose&amp;quot;:&amp;quot;PRIMARY&amp;quot;}],&amp;quot;attributes&amp;quot;:{&amp;quot;somekey&amp;quot;:&amp;quot;somevalue&amp;quot;}}}}&lt;br /&gt;
&lt;br /&gt;
== Import Contact API ==&lt;br /&gt;
&lt;br /&gt;
A similar API is available to easily import contacts, it only allows POST operations but will create the contacts or update if one is found matching the given attributes.&lt;br /&gt;
&lt;br /&gt;
The base URL is &amp;lt;tt&amp;gt;http://crm-2-url/crm2/contact-import&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== POST: Create or update Contact ===&lt;br /&gt;
* firstName&lt;br /&gt;
* lastName&lt;br /&gt;
* companyName&lt;br /&gt;
* emailsNumber (used to iterate the following parameter where N is an index number)&lt;br /&gt;
** emailN (the email address)&lt;br /&gt;
** emailPurposeN (can be one of : PRIMARY, OTHER, ORDER, BILLING_AR, PAYMENT_AR, SHIPMENT)&lt;br /&gt;
* attribute Map (described as a series of &amp;lt;tt&amp;gt;attribute_${key}=${value}&amp;lt;/tt&amp;gt; parameters)&lt;br /&gt;
&lt;br /&gt;
Only the attributes given as attribute_XXX are used to find an existing contact for update, if they are not given and / or a contact matching those is not found the operation will create a new contact.&lt;br /&gt;
&lt;br /&gt;
The operation returns a JSON response with the contact ID of the created or updated record, eg:&lt;br /&gt;
  { &amp;quot;contact&amp;quot;: { &amp;quot;contactId&amp;quot;: XXX } }&lt;br /&gt;
&lt;br /&gt;
The attribute Map is described as a series of &amp;lt;tt&amp;gt;attribute_${key}=${value}&amp;lt;/tt&amp;gt; parameters.   For example, attribute_opentapsPartyId=12345 will become {opentapsPartyId:12345}&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Contacts_API&amp;diff=7349</id>
		<title>CRM-2 Contacts API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Contacts_API&amp;diff=7349"/>
		<updated>2013-04-03T08:30:25Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: Protected &amp;quot;CRM-2 Contacts API&amp;quot;: Sysop page [edit=sysop:move=sysop]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Contacts API is used to create and retreive contacts.&lt;br /&gt;
&lt;br /&gt;
The API calls follow the general RESTful pattern of [[CRM-2 API]].&lt;br /&gt;
&lt;br /&gt;
The base URL is &amp;lt;tt&amp;gt;http://crm-2-url/crm2/contact&amp;lt;/tt&amp;gt; , only POST is currently supported, which is used to create or update a contact.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following parameters are supported:&lt;br /&gt;
* firstName&lt;br /&gt;
* lastName&lt;br /&gt;
* companyName&lt;br /&gt;
* emailsNumber (used to iterate the following parameter where N is an index number)&lt;br /&gt;
** emailN (the email address)&lt;br /&gt;
** emailPurposeN (can be one of : PRIMARY, OTHER, ORDER, BILLING_AR, PAYMENT_AR, SHIPMENT)&lt;br /&gt;
* attribute_XXX (can define additional attributes where XXX is the attribute name)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Only the attributes given as attribute_XXX are used to find an existing contact for update, if they are not given and / or a contact matching those is not found the operation will create a new contact.&lt;br /&gt;
&lt;br /&gt;
The operation returns a JSON response with the contact ID of the created or updated record, eg:&lt;br /&gt;
  { &amp;quot;contact&amp;quot;: { &amp;quot;contactId&amp;quot;: XXX } }&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Contacts_API&amp;diff=7348</id>
		<title>CRM-2 Contacts API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Contacts_API&amp;diff=7348"/>
		<updated>2013-04-03T08:30:24Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: New page: Contacts API is used to create and retreive contacts.  The API calls follow the general RESTful pattern of CRM-2 API.  The base URL is &amp;lt;tt&amp;gt;http://crm-2-url/crm2/contact&amp;lt;/tt&amp;gt; , only POS...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Contacts API is used to create and retreive contacts.&lt;br /&gt;
&lt;br /&gt;
The API calls follow the general RESTful pattern of [[CRM-2 API]].&lt;br /&gt;
&lt;br /&gt;
The base URL is &amp;lt;tt&amp;gt;http://crm-2-url/crm2/contact&amp;lt;/tt&amp;gt; , only POST is currently supported, which is used to create or update a contact.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following parameters are supported:&lt;br /&gt;
* firstName&lt;br /&gt;
* lastName&lt;br /&gt;
* companyName&lt;br /&gt;
* emailsNumber (used to iterate the following parameter where N is an index number)&lt;br /&gt;
** emailN (the email address)&lt;br /&gt;
** emailPurposeN (can be one of : PRIMARY, OTHER, ORDER, BILLING_AR, PAYMENT_AR, SHIPMENT)&lt;br /&gt;
* attribute_XXX (can define additional attributes where XXX is the attribute name)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Only the attributes given as attribute_XXX are used to find an existing contact for update, if they are not given and / or a contact matching those is not found the operation will create a new contact.&lt;br /&gt;
&lt;br /&gt;
The operation returns a JSON response with the contact ID of the created or updated record, eg:&lt;br /&gt;
  { &amp;quot;contact&amp;quot;: { &amp;quot;contactId&amp;quot;: XXX } }&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Administrative_API&amp;diff=7347</id>
		<title>CRM-2 Administrative API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Administrative_API&amp;diff=7347"/>
		<updated>2013-04-03T07:49:52Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Administrative API is used to manage your domain.  &lt;br /&gt;
&lt;br /&gt;
The API calls follow the general RESTful pattern of [[CRM-2 API]].  The base URL is &amp;lt;tt&amp;gt;http://crm-2-url/admin/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To access the admin API, your user must have the '''DOMAIN_CONF''' permission.&lt;br /&gt;
&lt;br /&gt;
Here are the additional resources available:&lt;br /&gt;
&lt;br /&gt;
=== Emails To Poll ===&lt;br /&gt;
&lt;br /&gt;
Configures the emails to be polled for your domain.  &lt;br /&gt;
&lt;br /&gt;
URL extension: &amp;lt;tt&amp;gt;email-to-poll&amp;lt;/tt&amp;gt; (ie, &amp;lt;tt&amp;gt;http://crm-2-url/admin/email-to-poll&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Parameters are the ones for your mail server, ie &amp;lt;tt&amp;gt;mailUser&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailPass&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailStoreProtocol&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mailHost&amp;lt;/tt&amp;gt;.  For gmail, use &amp;lt;tt&amp;gt;imaps&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;pop.google.com&amp;lt;/tt&amp;gt; for protocol and host.&lt;br /&gt;
&lt;br /&gt;
For PUT and DELETE, &amp;lt;tt&amp;gt;mailUser&amp;lt;/tt&amp;gt; is required.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Managing_Fixed_Assets&amp;diff=7301</id>
		<title>Managing Fixed Assets</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Managing_Fixed_Assets&amp;diff=7301"/>
		<updated>2012-06-26T07:39:54Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Using Fixed Assets Management */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Using Fixed Assets Management===&lt;br /&gt;
To access the Fixed Assets management screens, proceed as follows from the&lt;br /&gt;
     Main Navigation screen (flash page):&lt;br /&gt;
 Click: [Catalog Manager] Icon &amp;gt; [Home] drop down button &amp;gt; [Asset Maint] link,&lt;br /&gt;
 Click: [Asset Maintenance Application] drop down button &amp;gt; [Fixed Assets] link,&lt;br /&gt;
 The &amp;quot;Find Fixed Assets&amp;quot; page opens.&lt;br /&gt;
&lt;br /&gt;
Or in the accounting application, then the Fixed Assets tab. eg: on a local instance the link would be http://127.0.0.1:8080/accounting/control/ListFixedAssets&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Managing_Fixed_Assets&amp;diff=7300</id>
		<title>Managing Fixed Assets</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Managing_Fixed_Assets&amp;diff=7300"/>
		<updated>2012-06-26T07:39:16Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Using Fixed Assets Management */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Using Fixed Assets Management===&lt;br /&gt;
To access the Fixed Assets management screens, proceed as follows from the&lt;br /&gt;
     Main Navigation screen (flash page):&lt;br /&gt;
 Click: [Catalog Manager] Icon &amp;gt; [Home] drop down button &amp;gt; [Asset Maint] link,&lt;br /&gt;
 Click: [Asset Maintenance Application] drop down button &amp;gt; [Fixed Assets] link,&lt;br /&gt;
 The &amp;quot;Find Fixed Assets&amp;quot; page opens.&lt;br /&gt;
&lt;br /&gt;
Or in the accounting application, then the Fixed Assets tab. eg: http://.../accounting/control/ListFixedAssets&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2_Service_Validation&amp;diff=7195</id>
		<title>Opentaps 2 Service Validation</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2_Service_Validation&amp;diff=7195"/>
		<updated>2012-01-30T14:50:21Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: New page: There are currently two level of validations, one at the service level which validates the parameters given, and one at the persistence level.  == General Concept ==  Validation at those l...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are currently two level of validations, one at the service level which validates the parameters given, and one at the persistence level.&lt;br /&gt;
&lt;br /&gt;
== General Concept ==&lt;br /&gt;
&lt;br /&gt;
Validation at those levels is implemented using Bean Validation (JSR-303), which simply consist of annotations on a POJO's properties or accessors. There are numerous online articles to learn more about it, eg: http://java.dzone.com/articles/bean-validation-made-simple&lt;br /&gt;
&lt;br /&gt;
Some validators are quite simple, like ''javax.validation.constraints.NotNull'', and it is also very easy to define your own, like for example ''org.opentaps.validation.contraints.NotEmpty''.&lt;br /&gt;
&lt;br /&gt;
A Validator can also be set on a class itself when complex validation involving multiple properties is needed.&lt;br /&gt;
&lt;br /&gt;
== Validation on Entities ==&lt;br /&gt;
&lt;br /&gt;
JPA supports Bean Validation internally so an entity which is annotated will only be persisted if it is valid.&lt;br /&gt;
&lt;br /&gt;
== Validation in the Services ==&lt;br /&gt;
&lt;br /&gt;
Validation in the Services is done in a similar manner, the Input and Output objects are annotated and the service implementation is responsible for calling the validator.&lt;br /&gt;
&lt;br /&gt;
For this the ''validation.api'' bundle defines a ''ValidationService'' which is provided by the ''validation.impl'' bundle which itself simply expose the implementation given by Geronimo.&lt;br /&gt;
&lt;br /&gt;
A typical pattern in the service implementation can be seen in ''org.opentaps.notes.services.impl.CreateNoteServiceImpl'' and is basically:&lt;br /&gt;
&lt;br /&gt;
  Set&amp;lt;ConstraintViolation&amp;lt;MyServiceInput&amp;gt;&amp;gt; inputViolations = validationService.getValidator().validate(input);&lt;br /&gt;
  if (inputViolations.size() &amp;gt; 0) {&lt;br /&gt;
    throw new ServiceValidationException(&amp;quot;My service failed.&amp;quot;, (Set) inputViolations);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  try {&lt;br /&gt;
    // do something involving  persistence&lt;br /&gt;
    ...&lt;br /&gt;
  } catch (ConstraintViolationException e) {&lt;br /&gt;
    throw new ServiceValidationException(&amp;quot;My service failed.&amp;quot;, e);&lt;br /&gt;
  } catch (PersistenceException e) {&lt;br /&gt;
    throw new ServiceException(&amp;quot;My service failed.&amp;quot;, e);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // populate the output&lt;br /&gt;
  MyServiceOutput out = new MyServiceOutput();&lt;br /&gt;
  ...&lt;br /&gt;
  &lt;br /&gt;
  Set&amp;lt;ConstraintViolation&amp;lt;MyServiceOutput&amp;gt;&amp;gt; outputViolations = validationService.getValidator().validate(out);&lt;br /&gt;
  if (outputViolations.size() &amp;gt; 0) {&lt;br /&gt;
    throw new ServiceValidationException(&amp;quot;My service failed.&amp;quot;, (Set) outputViolations);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Sending Validation Errors to the Client ==&lt;br /&gt;
&lt;br /&gt;
As an example the Note rest service `org.opentaps.notes.rest.NoteResource` simply extends `org.opentaps.rest.ServerResource` which implements an exception handler that translates a `ServiceValidationException` into a JSON structure.&lt;br /&gt;
&lt;br /&gt;
Part of the JSON response includes a `errorDetail` object which is an array of `ServiceValidationException.FieldError` which contains 3 fields:&lt;br /&gt;
* ''field'' which is the field name in the service interface that was not valid&lt;br /&gt;
* ''message'' which is the error message returned by the validator&lt;br /&gt;
* ''value'' which was the value given that failed validation&lt;br /&gt;
&lt;br /&gt;
The client can then read that response to present the errors to the user.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2_Service_Validation&amp;diff=7196</id>
		<title>Opentaps 2 Service Validation</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2_Service_Validation&amp;diff=7196"/>
		<updated>2012-01-30T14:50:21Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: Protected &amp;quot;Opentaps 2 Service Validation&amp;quot;: Sysop page [edit=sysop:move=sysop]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are currently two level of validations, one at the service level which validates the parameters given, and one at the persistence level.&lt;br /&gt;
&lt;br /&gt;
== General Concept ==&lt;br /&gt;
&lt;br /&gt;
Validation at those levels is implemented using Bean Validation (JSR-303), which simply consist of annotations on a POJO's properties or accessors. There are numerous online articles to learn more about it, eg: http://java.dzone.com/articles/bean-validation-made-simple&lt;br /&gt;
&lt;br /&gt;
Some validators are quite simple, like ''javax.validation.constraints.NotNull'', and it is also very easy to define your own, like for example ''org.opentaps.validation.contraints.NotEmpty''.&lt;br /&gt;
&lt;br /&gt;
A Validator can also be set on a class itself when complex validation involving multiple properties is needed.&lt;br /&gt;
&lt;br /&gt;
== Validation on Entities ==&lt;br /&gt;
&lt;br /&gt;
JPA supports Bean Validation internally so an entity which is annotated will only be persisted if it is valid.&lt;br /&gt;
&lt;br /&gt;
== Validation in the Services ==&lt;br /&gt;
&lt;br /&gt;
Validation in the Services is done in a similar manner, the Input and Output objects are annotated and the service implementation is responsible for calling the validator.&lt;br /&gt;
&lt;br /&gt;
For this the ''validation.api'' bundle defines a ''ValidationService'' which is provided by the ''validation.impl'' bundle which itself simply expose the implementation given by Geronimo.&lt;br /&gt;
&lt;br /&gt;
A typical pattern in the service implementation can be seen in ''org.opentaps.notes.services.impl.CreateNoteServiceImpl'' and is basically:&lt;br /&gt;
&lt;br /&gt;
  Set&amp;lt;ConstraintViolation&amp;lt;MyServiceInput&amp;gt;&amp;gt; inputViolations = validationService.getValidator().validate(input);&lt;br /&gt;
  if (inputViolations.size() &amp;gt; 0) {&lt;br /&gt;
    throw new ServiceValidationException(&amp;quot;My service failed.&amp;quot;, (Set) inputViolations);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  try {&lt;br /&gt;
    // do something involving  persistence&lt;br /&gt;
    ...&lt;br /&gt;
  } catch (ConstraintViolationException e) {&lt;br /&gt;
    throw new ServiceValidationException(&amp;quot;My service failed.&amp;quot;, e);&lt;br /&gt;
  } catch (PersistenceException e) {&lt;br /&gt;
    throw new ServiceException(&amp;quot;My service failed.&amp;quot;, e);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // populate the output&lt;br /&gt;
  MyServiceOutput out = new MyServiceOutput();&lt;br /&gt;
  ...&lt;br /&gt;
  &lt;br /&gt;
  Set&amp;lt;ConstraintViolation&amp;lt;MyServiceOutput&amp;gt;&amp;gt; outputViolations = validationService.getValidator().validate(out);&lt;br /&gt;
  if (outputViolations.size() &amp;gt; 0) {&lt;br /&gt;
    throw new ServiceValidationException(&amp;quot;My service failed.&amp;quot;, (Set) outputViolations);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Sending Validation Errors to the Client ==&lt;br /&gt;
&lt;br /&gt;
As an example the Note rest service `org.opentaps.notes.rest.NoteResource` simply extends `org.opentaps.rest.ServerResource` which implements an exception handler that translates a `ServiceValidationException` into a JSON structure.&lt;br /&gt;
&lt;br /&gt;
Part of the JSON response includes a `errorDetail` object which is an array of `ServiceValidationException.FieldError` which contains 3 fields:&lt;br /&gt;
* ''field'' which is the field name in the service interface that was not valid&lt;br /&gt;
* ''message'' which is the error message returned by the validator&lt;br /&gt;
* ''value'' which was the value given that failed validation&lt;br /&gt;
&lt;br /&gt;
The client can then read that response to present the errors to the user.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2_Automated_Testing&amp;diff=7186</id>
		<title>Opentaps 2 Automated Testing</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2_Automated_Testing&amp;diff=7186"/>
		<updated>2012-01-26T07:35:12Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* opentaps 2 Automated Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== opentaps 2 Automated Testing ==&lt;br /&gt;
&lt;br /&gt;
opentaps 2 supports both unit and automated testing.&lt;br /&gt;
&lt;br /&gt;
=== Running the tests ===&lt;br /&gt;
&lt;br /&gt;
To run unit tests:&lt;br /&gt;
&lt;br /&gt;
 mvn -DskipTests=false verify&lt;br /&gt;
&lt;br /&gt;
To run integration tests:&lt;br /&gt;
&lt;br /&gt;
 mvn -Dit verify&lt;br /&gt;
&lt;br /&gt;
To run both:&lt;br /&gt;
&lt;br /&gt;
 mvn -DskipTests=false -Dit verify&lt;br /&gt;
&lt;br /&gt;
Also when running unit tests one can chose to run only one test, for example:&lt;br /&gt;
&lt;br /&gt;
  mvn verify -DskipTests=false -Dtest=ValidationTest&lt;br /&gt;
&lt;br /&gt;
where -Dtest=&amp;lt;name of the unit test classes (can be comma separated)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Checking the tests results ===&lt;br /&gt;
&lt;br /&gt;
Integration tests results can be checked in the maven output, but also each test output and the tests summary can be found at&lt;br /&gt;
&lt;br /&gt;
  ./integration-tests/tests-run/target/failsafe-reports/&lt;br /&gt;
&lt;br /&gt;
For unit tests, the output can be found for each module, for example at&lt;br /&gt;
&lt;br /&gt;
  ./modules/notes/impl/tests/target/surefire-reports/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to setup unit tests with Pax Exam ===&lt;br /&gt;
&lt;br /&gt;
Because the integration tests runs Geronimo it can take quite some time to start and run, which can be discouraging when doing TDD or simply wanting to test a particular case.&lt;br /&gt;
&lt;br /&gt;
As an example, in `./modules/notes/impl/tests/` is the module containing the unit tests for the `notes` module.&lt;br /&gt;
&lt;br /&gt;
First is the Pax Exam configuration class:&lt;br /&gt;
&lt;br /&gt;
 ./modules/notes/impl/tests/src/test/java/org/opentaps/notes/tests/NotesTestConfig.java &lt;br /&gt;
&lt;br /&gt;
Its role is to configure the OSGI environment in which the tests will be run by listing the bundles to be started. Some of those constitute an environment similar to what is provided by the Geronimo server : JPA, transactions, aries blueprint, apache bval, and their dependencies etc .. the others are the API and implementation bundles of the module we are testing.&lt;br /&gt;
&lt;br /&gt;
Worth noting is the ''org.opentaps.validation.testimpl'' bundle which replaces ''org.opentaps.validation.impl'' during unit testing as a way to bootstrap and provide JSR303 validation.&lt;br /&gt;
&lt;br /&gt;
Second are the JUnit style unit tests, they all extend the configuration class, for example:&lt;br /&gt;
&lt;br /&gt;
 ./modules/notes/impl/tests/src/test/java/org/opentaps/notes/tests/NoteApiTest.java&lt;br /&gt;
&lt;br /&gt;
The only particularities here are the ''@RunWith(JUnit4TestRunner.class)'' annotation which allows Pax Exam to run it as a JUnit unit test, and the ''@Inject'' annotations that will inject the OSGI services.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2_Automated_Testing&amp;diff=7185</id>
		<title>Opentaps 2 Automated Testing</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2_Automated_Testing&amp;diff=7185"/>
		<updated>2012-01-26T07:20:27Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* opentaps 2 Automated Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== opentaps 2 Automated Testing ==&lt;br /&gt;
&lt;br /&gt;
opentaps 2 supports both unit and automated testing.&lt;br /&gt;
&lt;br /&gt;
=== Running the tests ===&lt;br /&gt;
&lt;br /&gt;
To run unit tests:&lt;br /&gt;
&lt;br /&gt;
 mvn -DskipTests=false verify&lt;br /&gt;
&lt;br /&gt;
To run integration tests:&lt;br /&gt;
&lt;br /&gt;
 mvn -Dit verify&lt;br /&gt;
&lt;br /&gt;
To run both:&lt;br /&gt;
&lt;br /&gt;
 mvn -DskipTests=false -Dit verify&lt;br /&gt;
&lt;br /&gt;
Also when running unit tests one can chose to run only one test, for example:&lt;br /&gt;
&lt;br /&gt;
  mvn verify -DskipTests=false -Dtest=ValidationTest&lt;br /&gt;
&lt;br /&gt;
where -Dtest=&amp;lt;name of the unit test classes (can be comma separated)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Checking the tests results ===&lt;br /&gt;
&lt;br /&gt;
Integration tests results can be checked in the maven output, but also each test output and the tests summary can be found at&lt;br /&gt;
&lt;br /&gt;
  ./integration-tests/tests-run/target/failsafe-reports/&lt;br /&gt;
&lt;br /&gt;
For unit tests, the output can be found for each module, for example at&lt;br /&gt;
&lt;br /&gt;
  ./modules/notes/impl/tests/target/surefire-reports/&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7076</id>
		<title>Opentaps Analytics Data Loader</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7076"/>
		<updated>2011-04-22T11:10:28Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* ORDER_ITEM_FACT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Uploaders ==&lt;br /&gt;
&lt;br /&gt;
=== opentaps and OFBiz ===&lt;br /&gt;
analytics-upload component help to gather and upload analytical data to server. A few steps should be done to install it with opentaps or OfBiz instance.&lt;br /&gt;
&lt;br /&gt;
# Checkout component into hot-deploy. Use &amp;lt;code&amp;gt;svn co svn://svn.opentaps.org/opentaps/modules/analytics-upload/versions/1.5/trunk analytics-upload&amp;lt;/code&amp;gt;&lt;br /&gt;
# If you are using opentaps 1.0 or 1.4, add it to your &amp;lt;code&amp;gt;hot-deploy/component-load.xml&amp;lt;/code&amp;gt; file.&lt;br /&gt;
# Adjust settings in config/analytics-uploader.properties. Webkey should be the one for your store in opentaps Analytics.&lt;br /&gt;
# Note there are two ''scripts'' value in configuration file, default one to use with opentaps instance and another for OfBiz.&lt;br /&gt;
# Start instance and run '''analytics.uploadAnalyticalData''' service.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
Data Loading is done via an HTTP POST to &amp;lt;nowiki&amp;gt;http://analytics.opentaps.com/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following parameter are required:&lt;br /&gt;
* userlogin&lt;br /&gt;
* password&lt;br /&gt;
* webkey&lt;br /&gt;
&lt;br /&gt;
Your userlogin must have the ANALYTICS_DATA_LOAD permission to load data.&lt;br /&gt;
&lt;br /&gt;
Then the data to load should be given as one parameter per field using the format ''idx.tablename.fieldname=value'' where ''idx'' is a string used both to order the import (if mutliple record depend on each other via a FK) and discriminate which fields are in the same DB row.&lt;br /&gt;
&lt;br /&gt;
Possible HTTP error codes are:&lt;br /&gt;
* 400 Bad Request : missing parameter, invalid field name, bad format, no data to load&lt;br /&gt;
* 401 Unauthorized : authentication failed&lt;br /&gt;
* 404 Not Found : given webkey does not correspond to an existing Store&lt;br /&gt;
* 403 Forbidden : tried to modify a table or field that cannot be modified&lt;br /&gt;
* 409 Conflict : found the same rows defined twice&lt;br /&gt;
* 500 Internal error : other exception during import&lt;br /&gt;
&lt;br /&gt;
To clear your data, you can send an HTTP POST to &amp;lt;nowiki&amp;gt;http://analytics.opentaps.com/analytics/control/cleardata&amp;lt;/nowiki&amp;gt; with your userlogin, password, and webkey.&lt;br /&gt;
&lt;br /&gt;
'''WARNING''': This REALLY will get rid of all your data.&lt;br /&gt;
&lt;br /&gt;
Your userlogin must have the ANALYTICS_DATA_CLEAR permission to clear your data.&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The following examples are using the curl command line utility to perform the HTTP POSTs.&lt;br /&gt;
&lt;br /&gt;
Posting data in the ''CHANNEL_DIMENSION'':&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=myuser -d password=mypass -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;https://analytics.opentaps.com/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returned Success message would be like:&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 200 OK&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: success&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;success&amp;quot;&amp;gt;&lt;br /&gt;
  Successfully loaded 1 rows&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple rows can be inserted in the same request, using the IDX part to order the insertion in case a row needs to reference to a previously loaded row:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=myuser -d password=mypass -d webkey=thisisatest1234 \&lt;br /&gt;
   -d &amp;quot;0.sales_team_dimension.sales_team_id=MY_TEAM&amp;quot; -d &amp;quot;0.sales_team_dimension.sales_team_name=My Sales Team&amp;quot; \&lt;br /&gt;
   -d &amp;quot;1.sales_rep_dimension.sales_rep_id=MY_SALESREP&amp;quot; -d &amp;quot;1.sales_rep_dimension.sales_team_id=MY_TEAM&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://analytics.opentaps.com/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example with bad authentication:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=myuser -d password=mypass -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://analytics.opentaps.com/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 401 Unauthorized&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Authentication failed.&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of Error when trying to add data in an in-existing field:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=myuser -d password=mypass -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_description=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://analytics.opentaps.com/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 500 Internal Server Error&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Data Load error: Error processing the SQL Query&lt;br /&gt;
  Caused by: Unknown column 'CHANNEL_DESCRIPTION' in 'field list'&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Model Reference ===&lt;br /&gt;
&lt;br /&gt;
The following tables and fields can be given:&lt;br /&gt;
&lt;br /&gt;
==== CHANNEL_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
This dimension table is for the sales channels of your company (ie, Phone, Online, Catalog, Store.)&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CHANNEL_ID || String (60) || Unique ID of the sales channel&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_NAME || String (100) || Descriptive name of the sales channel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_TEAM_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
This dimension table is for the sales teams of your company.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_TEAM_ID || String (60) || Unique ID of your sales team. &lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || Descriptive name of your sales team.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_REP_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
This dimension table is for the sales representatives of your company.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_REP_ID || String (60) || Unique ID of a sales representative.&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_ID || String (60) || ID of the sales team for the sales representative. References SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || Descriptive name of the sales team.&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || First name of the sales representative&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || Last name of the sales representative&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMER_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
This dimension is for your company's customers.  Currently the table supports address line, so use it for the most meaningful one for your business, ie the customer's home address.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CUSTOMER_ID || String (60) || The ID of the Customer&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_NAME || String (255) || The Customer name&lt;br /&gt;
|-&lt;br /&gt;
| COMPANY_NAME || String (255) || The Customer company name&lt;br /&gt;
|-&lt;br /&gt;
| INDUSTRY || String (60) || The Customer industry&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Customer first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Customer last name&lt;br /&gt;
|-&lt;br /&gt;
| ATTN_NAME || String (100) || The address attention name&lt;br /&gt;
|-&lt;br /&gt;
| STREET_ADDRESS_LINE1 || String (255) ||  Street of the customer's address&lt;br /&gt;
|-&lt;br /&gt;
| CITY || String (60) || City of the customer's address&lt;br /&gt;
|-&lt;br /&gt;
| STATE || String (60) || State of the customer's address&lt;br /&gt;
|-&lt;br /&gt;
| REGION || String (60) || Region of the customer's address, if relevant&lt;br /&gt;
|-&lt;br /&gt;
| COUNTRY || String (100) || Country of the customer's address&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE3DIGIT || String (3) || First 3 digits of the postal code for the customer's address&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE || String (60) || Full postal code for the customer's address&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_COUNTRY || String (60) || Country code of the customer's phone number&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_AREA_CODE || String (60) || Area code of the customer's phone number&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_NUMBER || String (60) || Remaining digits of customer's phone number &lt;br /&gt;
|-&lt;br /&gt;
| PRIMARY_EMAIL || String (255) || Customer's primary email address&lt;br /&gt;
|-&lt;br /&gt;
| OTHER_EMAIL || String (255) || Customer's other email address&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_TYPE || String (60) || Type for the customer.  Fill in whatever you want.&lt;br /&gt;
|-&lt;br /&gt;
| SOURCE || String (60) || Source code of the Customer.  Fill in whatever you want.&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (255) || The name of Sales Team associated to the Customer, from SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| CREATED_DATE_AND_TIME || Timestamp ||  Time and date when customer was first created. Format is ''YYYY-MM-DD hh:mm:ss''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PRODUCT_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
This dimension table contains the products of your company.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| PRODUCT_ID || String (60) || Unique ID of your product&lt;br /&gt;
|-&lt;br /&gt;
| SKU || String (60) || The Product SKU code&lt;br /&gt;
|-&lt;br /&gt;
| UPC || String (60) || The Product UPC code&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_NAME || String (100) || The Product name&lt;br /&gt;
|-&lt;br /&gt;
| BRAND || String (100) || The Product brand&lt;br /&gt;
|-&lt;br /&gt;
| CATEGORY || String (100) || The Product category name&lt;br /&gt;
|-&lt;br /&gt;
| SIZE || String (100) || The Product size&lt;br /&gt;
|-&lt;br /&gt;
| STYLE || String (100) || The Product style&lt;br /&gt;
|-&lt;br /&gt;
| COLOR || String (100) || The Product color&lt;br /&gt;
|-&lt;br /&gt;
| WIDTH || Numeric (18,6) || The Product width&lt;br /&gt;
|-&lt;br /&gt;
| LENGTH || Numeric (18,6) || The Product length&lt;br /&gt;
|-&lt;br /&gt;
| HEIGHT || Numeric (18,6) || The Product height&lt;br /&gt;
|-&lt;br /&gt;
| WEIGHT || Numeric (18,6) || The Product weight&lt;br /&gt;
|-&lt;br /&gt;
| DIAMETER || Numeric (18,6) || The Product diameter&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_TYPE || String (100) || The Product type&lt;br /&gt;
|-&lt;br /&gt;
| SUPPLIER_NAME || String (100) ||  Name of the supplier for this product&lt;br /&gt;
|-&lt;br /&gt;
| ORG_SUPPLIER_ID || String (60) || ID of the supplier&lt;br /&gt;
|-&lt;br /&gt;
| EST_BASE_CURRENCY_COST || Numeric (18,6) || The Product estimated cost&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORDER_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
This fact table contains all the line items of your orders.  It also includes any returns of the order items.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| ORDER_ID || String (60) || ID of the order&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_ITEM_SEQ_ID || String (100) || ID for the item within the order, ie 1, 2, 3, ...&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || The customer identifier, references the CUSTOMER_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || The channel identifier, references the CHANNEL_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_ID || String (60)|| The sales representative identifier, references the SALES_REP_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_ID || String (60) || The sales team identifier, references the SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || The date the order was placed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || The product identifier, references the PRODUCT_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || The quantity of item ordered&lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || Gross amount of the order item&lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || Net amount of the order item, ie gross amount minus discount&lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2)|| Amount of discount on order item&lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || Status of the order item: completed, canceled, etc.&lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_QUANTITY || Numeric (18,6) || The quantity of the item that was returned&lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || Gross amount of return associated with order item&lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || Discount on amount returned&lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || Net amount of return&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
This fact table is for returns.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| RETURN_ID || String (60) || Unique ID of the return &lt;br /&gt;
|-&lt;br /&gt;
| RETURN_ITEM_SEQ_ID || String (100) || ID of the item within the return &lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || The customer identifier, references the CUSTOMER_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || The channel identifier, references the CHANNEL_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || The date the original order was placed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| RETURN_DATE || String (Date) || The date the return was performed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || The product identifier, references the PRODUCT_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || The quantity of product returned&lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || Gross amount being returned&lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || Net amount being returned, or gross - discount&lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || Discount for the amount being returned&lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || Status of the return: processed, rejected, canceled, etc.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7042</id>
		<title>Opentaps Analytics Data Loader</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7042"/>
		<updated>2011-04-12T14:47:02Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* CUSTOMER_DIMENSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Uploaders ==&lt;br /&gt;
&lt;br /&gt;
=== opentaps and OFBiz ===&lt;br /&gt;
analytics-upload component help to gather and upload analytical data to server. A few steps should be done to install it with opentaps or OfBiz instance.&lt;br /&gt;
&lt;br /&gt;
# Checkout component into hot-deploy. Use &amp;lt;code&amp;gt;svn co svn://svn.opentaps.org/opentaps/modules/analytics-upload/versions/1.5/trunk analytics-upload&amp;lt;/code&amp;gt;&lt;br /&gt;
# Adjust settings in config/analytics-uploader.properties. Webkey should be the one for your store in opentaps Analytics.&lt;br /&gt;
# Note there are two ''scripts'' value in configuration file, default one to use with opentaps instance and another for OfBiz.&lt;br /&gt;
# Start instance and run '''analytics.uploadAnalyticalData''' service.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
Data Loading is done via an HTTP POST servlet.&lt;br /&gt;
&lt;br /&gt;
The following parameter are required:&lt;br /&gt;
* userlogin&lt;br /&gt;
* password&lt;br /&gt;
* webkey&lt;br /&gt;
&lt;br /&gt;
Then the data to load should be given as one parameter per field using the format ''idx.tablename.fieldname=value'' where ''idx'' is a string used both to order the import (if mutliple record depend on each other via a FK) and discriminate which fields are in the same DB row.&lt;br /&gt;
&lt;br /&gt;
Possible HTTP error codes are:&lt;br /&gt;
* 400 Bad Request : missing parameter, invalid field name, bad format, no data to load&lt;br /&gt;
* 401 Unauthorized : authentication failed&lt;br /&gt;
* 404 Not Found : given webkey does not correspond to an existing Store&lt;br /&gt;
* 403 Forbidden : tried to modify a table or field that cannot be modified&lt;br /&gt;
* 409 Conflict : found the same rows defined twice&lt;br /&gt;
* 500 Internal error : other exception during import&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The following examples are using the curl command line utility to perform the HTTP POSTs.&lt;br /&gt;
&lt;br /&gt;
Posting data in the ''CHANNEL_DIMENSION'':&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returned Success message would be like:&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 200 OK&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: success&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;success&amp;quot;&amp;gt;&lt;br /&gt;
  Successfully loaded 1 rows&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple rows can be inserted in the same request, using the IDX part to order the insertion in case a row needs to reference to a previously loaded row:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 \&lt;br /&gt;
   -d &amp;quot;0.sales_team_dimension.sales_team_id=MY_TEAM&amp;quot; -d &amp;quot;0.sales_team_dimension.sales_team_name=My Sales Team&amp;quot; \&lt;br /&gt;
   -d &amp;quot;1.sales_rep_dimension.sales_rep_id=MY_SALESREP&amp;quot; -d &amp;quot;1.sales_rep_dimension.sales_team_id=MY_TEAM&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example with bad authentication:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentapse -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 401 Unauthorized&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Authentication failed.&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of Error when trying to add data in an in-existing field:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_description=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 500 Internal Server Error&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Data Load error: Error processing the SQL Query&lt;br /&gt;
  Caused by: Unknown column 'CHANNEL_DESCRIPTION' in 'field list'&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Model Reference ===&lt;br /&gt;
&lt;br /&gt;
The following tables and fields can be given:&lt;br /&gt;
&lt;br /&gt;
==== CHANNEL_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CHANNEL_ID || String (60) || The Channel identifier&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_NAME || String (100) || The Channel name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_TEAM_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_REP_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_REP_ID || String (60) || The Sales representative identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier, references SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Sales representative first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Sales representative last name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMER_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CUSTOMER_ID || String (60) || The Customer identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_NAME || String (255) || The Customer name&lt;br /&gt;
|-&lt;br /&gt;
| COMPANY_NAME || String (255) || The Customer company name&lt;br /&gt;
|-&lt;br /&gt;
| INDUSTRY || String (60) || The Customer industry&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Customer first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Customer last name&lt;br /&gt;
|-&lt;br /&gt;
| ATTN_NAME || String (100) || The address attention name&lt;br /&gt;
|-&lt;br /&gt;
| STREET_ADDRESS_LINE1 || String (255) || The address street&lt;br /&gt;
|-&lt;br /&gt;
| CITY || String (60) || The address city&lt;br /&gt;
|-&lt;br /&gt;
| STATE || String (60) || The address state&lt;br /&gt;
|-&lt;br /&gt;
| REGION || String (60) || The address region&lt;br /&gt;
|-&lt;br /&gt;
| COUNTRY || String (100) || The address country&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE3DIGIT || String (3) || The address first 3 digits of the postal code&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE || String (60) || The address postal code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_COUNTRY || String (60) || The phone number country code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_AREA_CODE || String (60) || The phone number area code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_NUMBER || String (60) || The rest of the phone number&lt;br /&gt;
|-&lt;br /&gt;
| PRIMARY_EMAIL || String (255) || The Customer primary email address&lt;br /&gt;
|-&lt;br /&gt;
| OTHER_EMAIL || String (255) || The Customer other email address&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_TYPE || String (60) || The Customer type&lt;br /&gt;
|-&lt;br /&gt;
| SOURCE || String (60) || The source of the Customer&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (255) || The name of Sales Team associated to the Customer&lt;br /&gt;
|-&lt;br /&gt;
| CREATED_DATE_AND_TIME || Timestamp || The time and date, format is ''YYYY-MM-DD hh:mm:ss''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PRODUCT_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| PRODUCT_ID || String (60) || The Product identifier&lt;br /&gt;
|-&lt;br /&gt;
| SKU || String (60) || The Product SKU code&lt;br /&gt;
|-&lt;br /&gt;
| UPC || String (60) || The Product UPC code&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_NAME || String (100) || The Product name&lt;br /&gt;
|-&lt;br /&gt;
| BRAND || String (100) || The Product brand&lt;br /&gt;
|-&lt;br /&gt;
| CATEGORY || String (100) || The Product category name&lt;br /&gt;
|-&lt;br /&gt;
| SIZE || String (100) || The Product size&lt;br /&gt;
|-&lt;br /&gt;
| STYLE || String (100) || The Product style&lt;br /&gt;
|-&lt;br /&gt;
| COLOR || String (100) || The Product color&lt;br /&gt;
|-&lt;br /&gt;
| WIDTH || Numeric (18,6) || The Product width&lt;br /&gt;
|-&lt;br /&gt;
| LENGTH || Numeric (18,6) || The Product length&lt;br /&gt;
|-&lt;br /&gt;
| HEIGHT || Numeric (18,6) || The Product height&lt;br /&gt;
|-&lt;br /&gt;
| WEIGHT || Numeric (18,6) || The Product weight&lt;br /&gt;
|-&lt;br /&gt;
| DIAMETER || Numeric (18,6) || The Product diameter&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_TYPE || String (100) || The Product type&lt;br /&gt;
|-&lt;br /&gt;
| SUPPLIER_NAME || String (100) || The Product supplier name&lt;br /&gt;
|-&lt;br /&gt;
| ORG_SUPPLIER_ID || String (60) || The Product supplier organization identifier&lt;br /&gt;
|-&lt;br /&gt;
| EST_BASE_CURRENCY_COST || Numeric (18,6) || The Product estimated cost&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORDER_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| ORDER_ID || String (60) || The order identifier&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_ITEM_SEQ_ID || String (100) || The order item identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || The customer identifier, references the CUSTOMER_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || The channel identifier, references the CHANNEL_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_ID || String (60)|| The sales representative identifier, references the SALES_REP_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_TEAM_ID || String (60) || The sales team identifier, references the SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || The date the order was placed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || The product identifier, references the PRODUCT_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || The quantity of item ordered&lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2)|| &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_QUANTITY || Numeric (18,6) || The quantity of the item that was returned&lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| RETURN_ID || String (60) || The return identifier&lt;br /&gt;
|-&lt;br /&gt;
| RETURN_ITEM_SEQ_ID || String (100) || The return item identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || The customer identifier, references the CUSTOMER_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || The channel identifier, references the CHANNEL_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || The date the original order was placed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| RETURN_DATE || String (Date) || The date the return was performed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || The product identifier, references the PRODUCT_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || The quantity of product returned&lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7041</id>
		<title>Opentaps Analytics Data Loader</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7041"/>
		<updated>2011-04-12T14:46:50Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* CUSTOMER_DIMENSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Uploaders ==&lt;br /&gt;
&lt;br /&gt;
=== opentaps and OFBiz ===&lt;br /&gt;
analytics-upload component help to gather and upload analytical data to server. A few steps should be done to install it with opentaps or OfBiz instance.&lt;br /&gt;
&lt;br /&gt;
# Checkout component into hot-deploy. Use &amp;lt;code&amp;gt;svn co svn://svn.opentaps.org/opentaps/modules/analytics-upload/versions/1.5/trunk analytics-upload&amp;lt;/code&amp;gt;&lt;br /&gt;
# Adjust settings in config/analytics-uploader.properties. Webkey should be the one for your store in opentaps Analytics.&lt;br /&gt;
# Note there are two ''scripts'' value in configuration file, default one to use with opentaps instance and another for OfBiz.&lt;br /&gt;
# Start instance and run '''analytics.uploadAnalyticalData''' service.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
Data Loading is done via an HTTP POST servlet.&lt;br /&gt;
&lt;br /&gt;
The following parameter are required:&lt;br /&gt;
* userlogin&lt;br /&gt;
* password&lt;br /&gt;
* webkey&lt;br /&gt;
&lt;br /&gt;
Then the data to load should be given as one parameter per field using the format ''idx.tablename.fieldname=value'' where ''idx'' is a string used both to order the import (if mutliple record depend on each other via a FK) and discriminate which fields are in the same DB row.&lt;br /&gt;
&lt;br /&gt;
Possible HTTP error codes are:&lt;br /&gt;
* 400 Bad Request : missing parameter, invalid field name, bad format, no data to load&lt;br /&gt;
* 401 Unauthorized : authentication failed&lt;br /&gt;
* 404 Not Found : given webkey does not correspond to an existing Store&lt;br /&gt;
* 403 Forbidden : tried to modify a table or field that cannot be modified&lt;br /&gt;
* 409 Conflict : found the same rows defined twice&lt;br /&gt;
* 500 Internal error : other exception during import&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The following examples are using the curl command line utility to perform the HTTP POSTs.&lt;br /&gt;
&lt;br /&gt;
Posting data in the ''CHANNEL_DIMENSION'':&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returned Success message would be like:&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 200 OK&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: success&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;success&amp;quot;&amp;gt;&lt;br /&gt;
  Successfully loaded 1 rows&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple rows can be inserted in the same request, using the IDX part to order the insertion in case a row needs to reference to a previously loaded row:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 \&lt;br /&gt;
   -d &amp;quot;0.sales_team_dimension.sales_team_id=MY_TEAM&amp;quot; -d &amp;quot;0.sales_team_dimension.sales_team_name=My Sales Team&amp;quot; \&lt;br /&gt;
   -d &amp;quot;1.sales_rep_dimension.sales_rep_id=MY_SALESREP&amp;quot; -d &amp;quot;1.sales_rep_dimension.sales_team_id=MY_TEAM&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example with bad authentication:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentapse -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 401 Unauthorized&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Authentication failed.&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of Error when trying to add data in an in-existing field:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_description=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 500 Internal Server Error&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Data Load error: Error processing the SQL Query&lt;br /&gt;
  Caused by: Unknown column 'CHANNEL_DESCRIPTION' in 'field list'&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Model Reference ===&lt;br /&gt;
&lt;br /&gt;
The following tables and fields can be given:&lt;br /&gt;
&lt;br /&gt;
==== CHANNEL_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CHANNEL_ID || String (60) || The Channel identifier&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_NAME || String (100) || The Channel name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_TEAM_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_REP_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_REP_ID || String (60) || The Sales representative identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier, references SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Sales representative first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Sales representative last name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMER_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CUSTOMER_ID || String (60) || The Customer identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_NAME || String (255) || The Customer name&lt;br /&gt;
|-&lt;br /&gt;
| COMPANY_NAME || String (255) || The Customer company name&lt;br /&gt;
|-&lt;br /&gt;
| INDUSTRY || String (60) || The Customer industry&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Customer first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Customer last name&lt;br /&gt;
|-&lt;br /&gt;
| ATTN_NAME || String (100) || The address attention name&lt;br /&gt;
|-&lt;br /&gt;
| STREET_ADDRESS_LINE1 || String (255) || The address street&lt;br /&gt;
|-&lt;br /&gt;
| CITY || String (60) || The address city&lt;br /&gt;
|-&lt;br /&gt;
| STATE || String (60) || The address state&lt;br /&gt;
|-&lt;br /&gt;
| REGION || String (60) || The address region&lt;br /&gt;
|-&lt;br /&gt;
| COUNTRY || String (100) || The address country&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE3DIGIT || String (3) || The address first 3 digits of the postal code&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE || String (60) || The address postal code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_COUNTRY || String (60) || The phone number country code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_AREA_CODE || String (60) || The phone number area code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_NUMBER || String (60) || The rest of the phone number&lt;br /&gt;
|-&lt;br /&gt;
| PRIMARY_EMAIL || String (255) || The Customer primary email address&lt;br /&gt;
|-&lt;br /&gt;
| OTHER_EMAIL || String (255) || The Customer other email address&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_TYPE || String (60) || The Customer type&lt;br /&gt;
|-&lt;br /&gt;
| SOURCE || String (60) || The source of the Customer&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (255) || The name of Sales Team associated to the Customer&lt;br /&gt;
|-&lt;br /&gt;
| CREATED_DATE_AND_TIME || Timestamp || The time and date, format os ''YYYY-MM-DD hh:mm:ss''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PRODUCT_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| PRODUCT_ID || String (60) || The Product identifier&lt;br /&gt;
|-&lt;br /&gt;
| SKU || String (60) || The Product SKU code&lt;br /&gt;
|-&lt;br /&gt;
| UPC || String (60) || The Product UPC code&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_NAME || String (100) || The Product name&lt;br /&gt;
|-&lt;br /&gt;
| BRAND || String (100) || The Product brand&lt;br /&gt;
|-&lt;br /&gt;
| CATEGORY || String (100) || The Product category name&lt;br /&gt;
|-&lt;br /&gt;
| SIZE || String (100) || The Product size&lt;br /&gt;
|-&lt;br /&gt;
| STYLE || String (100) || The Product style&lt;br /&gt;
|-&lt;br /&gt;
| COLOR || String (100) || The Product color&lt;br /&gt;
|-&lt;br /&gt;
| WIDTH || Numeric (18,6) || The Product width&lt;br /&gt;
|-&lt;br /&gt;
| LENGTH || Numeric (18,6) || The Product length&lt;br /&gt;
|-&lt;br /&gt;
| HEIGHT || Numeric (18,6) || The Product height&lt;br /&gt;
|-&lt;br /&gt;
| WEIGHT || Numeric (18,6) || The Product weight&lt;br /&gt;
|-&lt;br /&gt;
| DIAMETER || Numeric (18,6) || The Product diameter&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_TYPE || String (100) || The Product type&lt;br /&gt;
|-&lt;br /&gt;
| SUPPLIER_NAME || String (100) || The Product supplier name&lt;br /&gt;
|-&lt;br /&gt;
| ORG_SUPPLIER_ID || String (60) || The Product supplier organization identifier&lt;br /&gt;
|-&lt;br /&gt;
| EST_BASE_CURRENCY_COST || Numeric (18,6) || The Product estimated cost&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORDER_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| ORDER_ID || String (60) || The order identifier&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_ITEM_SEQ_ID || String (100) || The order item identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || The customer identifier, references the CUSTOMER_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || The channel identifier, references the CHANNEL_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_ID || String (60)|| The sales representative identifier, references the SALES_REP_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_TEAM_ID || String (60) || The sales team identifier, references the SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || The date the order was placed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || The product identifier, references the PRODUCT_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || The quantity of item ordered&lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2)|| &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_QUANTITY || Numeric (18,6) || The quantity of the item that was returned&lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| RETURN_ID || String (60) || The return identifier&lt;br /&gt;
|-&lt;br /&gt;
| RETURN_ITEM_SEQ_ID || String (100) || The return item identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || The customer identifier, references the CUSTOMER_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || The channel identifier, references the CHANNEL_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || The date the original order was placed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| RETURN_DATE || String (Date) || The date the return was performed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || The product identifier, references the PRODUCT_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || The quantity of product returned&lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7040</id>
		<title>Opentaps Analytics Data Loader</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7040"/>
		<updated>2011-04-12T14:46:21Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* RETURN_ITEM_FACT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Uploaders ==&lt;br /&gt;
&lt;br /&gt;
=== opentaps and OFBiz ===&lt;br /&gt;
analytics-upload component help to gather and upload analytical data to server. A few steps should be done to install it with opentaps or OfBiz instance.&lt;br /&gt;
&lt;br /&gt;
# Checkout component into hot-deploy. Use &amp;lt;code&amp;gt;svn co svn://svn.opentaps.org/opentaps/modules/analytics-upload/versions/1.5/trunk analytics-upload&amp;lt;/code&amp;gt;&lt;br /&gt;
# Adjust settings in config/analytics-uploader.properties. Webkey should be the one for your store in opentaps Analytics.&lt;br /&gt;
# Note there are two ''scripts'' value in configuration file, default one to use with opentaps instance and another for OfBiz.&lt;br /&gt;
# Start instance and run '''analytics.uploadAnalyticalData''' service.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
Data Loading is done via an HTTP POST servlet.&lt;br /&gt;
&lt;br /&gt;
The following parameter are required:&lt;br /&gt;
* userlogin&lt;br /&gt;
* password&lt;br /&gt;
* webkey&lt;br /&gt;
&lt;br /&gt;
Then the data to load should be given as one parameter per field using the format ''idx.tablename.fieldname=value'' where ''idx'' is a string used both to order the import (if mutliple record depend on each other via a FK) and discriminate which fields are in the same DB row.&lt;br /&gt;
&lt;br /&gt;
Possible HTTP error codes are:&lt;br /&gt;
* 400 Bad Request : missing parameter, invalid field name, bad format, no data to load&lt;br /&gt;
* 401 Unauthorized : authentication failed&lt;br /&gt;
* 404 Not Found : given webkey does not correspond to an existing Store&lt;br /&gt;
* 403 Forbidden : tried to modify a table or field that cannot be modified&lt;br /&gt;
* 409 Conflict : found the same rows defined twice&lt;br /&gt;
* 500 Internal error : other exception during import&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The following examples are using the curl command line utility to perform the HTTP POSTs.&lt;br /&gt;
&lt;br /&gt;
Posting data in the ''CHANNEL_DIMENSION'':&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returned Success message would be like:&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 200 OK&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: success&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;success&amp;quot;&amp;gt;&lt;br /&gt;
  Successfully loaded 1 rows&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple rows can be inserted in the same request, using the IDX part to order the insertion in case a row needs to reference to a previously loaded row:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 \&lt;br /&gt;
   -d &amp;quot;0.sales_team_dimension.sales_team_id=MY_TEAM&amp;quot; -d &amp;quot;0.sales_team_dimension.sales_team_name=My Sales Team&amp;quot; \&lt;br /&gt;
   -d &amp;quot;1.sales_rep_dimension.sales_rep_id=MY_SALESREP&amp;quot; -d &amp;quot;1.sales_rep_dimension.sales_team_id=MY_TEAM&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example with bad authentication:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentapse -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 401 Unauthorized&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Authentication failed.&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of Error when trying to add data in an in-existing field:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_description=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 500 Internal Server Error&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Data Load error: Error processing the SQL Query&lt;br /&gt;
  Caused by: Unknown column 'CHANNEL_DESCRIPTION' in 'field list'&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Model Reference ===&lt;br /&gt;
&lt;br /&gt;
The following tables and fields can be given:&lt;br /&gt;
&lt;br /&gt;
==== CHANNEL_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CHANNEL_ID || String (60) || The Channel identifier&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_NAME || String (100) || The Channel name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_TEAM_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_REP_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_REP_ID || String (60) || The Sales representative identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier, references SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Sales representative first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Sales representative last name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMER_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CUSTOMER_ID || String (60) || The Customer identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_NAME || String (255) || The Customer name&lt;br /&gt;
|-&lt;br /&gt;
| COMPANY_NAME || String (255) || The Customer company name&lt;br /&gt;
|-&lt;br /&gt;
| INDUSTRY || String (60) || The Customer industry&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Customer first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Customer last name&lt;br /&gt;
|-&lt;br /&gt;
| ATTN_NAME || String (100) || The address attention name&lt;br /&gt;
|-&lt;br /&gt;
| STREET_ADDRESS_LINE1 || String (255) || The address street&lt;br /&gt;
|-&lt;br /&gt;
| CITY || String (60) || The address city&lt;br /&gt;
|-&lt;br /&gt;
| STATE || String (60) || The address state&lt;br /&gt;
|-&lt;br /&gt;
| REGION || String (60) || The address region&lt;br /&gt;
|-&lt;br /&gt;
| COUNTRY || String (100) || The address country&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE3DIGIT || String (3) || The address first 3 digits of the postal code&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE || String (60) || The address postal code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_COUNTRY || String (60) || The phone number country code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_AREA_CODE || String (60) || The phone number area code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_NUMBER || String (60) || The rest of the phone number&lt;br /&gt;
|-&lt;br /&gt;
| PRIMARY_EMAIL || String (255) || The Customer primary email address&lt;br /&gt;
|-&lt;br /&gt;
| OTHER_EMAIL || String (255) || The Customer other email address&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_TYPE || String (60) || The Customer type&lt;br /&gt;
|-&lt;br /&gt;
| SOURCE || String (60) || The source of the Customer&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (255) || The name of Sales Team associated to the Customer&lt;br /&gt;
|-&lt;br /&gt;
| CREATED_DATE_AND_TIME || Timestamp || The time and date, given as &amp;quot;YYYY-MM-DD hh:mm:ss&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PRODUCT_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| PRODUCT_ID || String (60) || The Product identifier&lt;br /&gt;
|-&lt;br /&gt;
| SKU || String (60) || The Product SKU code&lt;br /&gt;
|-&lt;br /&gt;
| UPC || String (60) || The Product UPC code&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_NAME || String (100) || The Product name&lt;br /&gt;
|-&lt;br /&gt;
| BRAND || String (100) || The Product brand&lt;br /&gt;
|-&lt;br /&gt;
| CATEGORY || String (100) || The Product category name&lt;br /&gt;
|-&lt;br /&gt;
| SIZE || String (100) || The Product size&lt;br /&gt;
|-&lt;br /&gt;
| STYLE || String (100) || The Product style&lt;br /&gt;
|-&lt;br /&gt;
| COLOR || String (100) || The Product color&lt;br /&gt;
|-&lt;br /&gt;
| WIDTH || Numeric (18,6) || The Product width&lt;br /&gt;
|-&lt;br /&gt;
| LENGTH || Numeric (18,6) || The Product length&lt;br /&gt;
|-&lt;br /&gt;
| HEIGHT || Numeric (18,6) || The Product height&lt;br /&gt;
|-&lt;br /&gt;
| WEIGHT || Numeric (18,6) || The Product weight&lt;br /&gt;
|-&lt;br /&gt;
| DIAMETER || Numeric (18,6) || The Product diameter&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_TYPE || String (100) || The Product type&lt;br /&gt;
|-&lt;br /&gt;
| SUPPLIER_NAME || String (100) || The Product supplier name&lt;br /&gt;
|-&lt;br /&gt;
| ORG_SUPPLIER_ID || String (60) || The Product supplier organization identifier&lt;br /&gt;
|-&lt;br /&gt;
| EST_BASE_CURRENCY_COST || Numeric (18,6) || The Product estimated cost&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORDER_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| ORDER_ID || String (60) || The order identifier&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_ITEM_SEQ_ID || String (100) || The order item identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || The customer identifier, references the CUSTOMER_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || The channel identifier, references the CHANNEL_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_ID || String (60)|| The sales representative identifier, references the SALES_REP_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_TEAM_ID || String (60) || The sales team identifier, references the SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || The date the order was placed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || The product identifier, references the PRODUCT_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || The quantity of item ordered&lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2)|| &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_QUANTITY || Numeric (18,6) || The quantity of the item that was returned&lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| RETURN_ID || String (60) || The return identifier&lt;br /&gt;
|-&lt;br /&gt;
| RETURN_ITEM_SEQ_ID || String (100) || The return item identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || The customer identifier, references the CUSTOMER_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || The channel identifier, references the CHANNEL_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || The date the original order was placed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| RETURN_DATE || String (Date) || The date the return was performed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || The product identifier, references the PRODUCT_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || The quantity of product returned&lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7039</id>
		<title>Opentaps Analytics Data Loader</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7039"/>
		<updated>2011-04-12T14:44:57Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* ORDER_ITEM_FACT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Uploaders ==&lt;br /&gt;
&lt;br /&gt;
=== opentaps and OFBiz ===&lt;br /&gt;
analytics-upload component help to gather and upload analytical data to server. A few steps should be done to install it with opentaps or OfBiz instance.&lt;br /&gt;
&lt;br /&gt;
# Checkout component into hot-deploy. Use &amp;lt;code&amp;gt;svn co svn://svn.opentaps.org/opentaps/modules/analytics-upload/versions/1.5/trunk analytics-upload&amp;lt;/code&amp;gt;&lt;br /&gt;
# Adjust settings in config/analytics-uploader.properties. Webkey should be the one for your store in opentaps Analytics.&lt;br /&gt;
# Note there are two ''scripts'' value in configuration file, default one to use with opentaps instance and another for OfBiz.&lt;br /&gt;
# Start instance and run '''analytics.uploadAnalyticalData''' service.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
Data Loading is done via an HTTP POST servlet.&lt;br /&gt;
&lt;br /&gt;
The following parameter are required:&lt;br /&gt;
* userlogin&lt;br /&gt;
* password&lt;br /&gt;
* webkey&lt;br /&gt;
&lt;br /&gt;
Then the data to load should be given as one parameter per field using the format ''idx.tablename.fieldname=value'' where ''idx'' is a string used both to order the import (if mutliple record depend on each other via a FK) and discriminate which fields are in the same DB row.&lt;br /&gt;
&lt;br /&gt;
Possible HTTP error codes are:&lt;br /&gt;
* 400 Bad Request : missing parameter, invalid field name, bad format, no data to load&lt;br /&gt;
* 401 Unauthorized : authentication failed&lt;br /&gt;
* 404 Not Found : given webkey does not correspond to an existing Store&lt;br /&gt;
* 403 Forbidden : tried to modify a table or field that cannot be modified&lt;br /&gt;
* 409 Conflict : found the same rows defined twice&lt;br /&gt;
* 500 Internal error : other exception during import&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The following examples are using the curl command line utility to perform the HTTP POSTs.&lt;br /&gt;
&lt;br /&gt;
Posting data in the ''CHANNEL_DIMENSION'':&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returned Success message would be like:&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 200 OK&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: success&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;success&amp;quot;&amp;gt;&lt;br /&gt;
  Successfully loaded 1 rows&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple rows can be inserted in the same request, using the IDX part to order the insertion in case a row needs to reference to a previously loaded row:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 \&lt;br /&gt;
   -d &amp;quot;0.sales_team_dimension.sales_team_id=MY_TEAM&amp;quot; -d &amp;quot;0.sales_team_dimension.sales_team_name=My Sales Team&amp;quot; \&lt;br /&gt;
   -d &amp;quot;1.sales_rep_dimension.sales_rep_id=MY_SALESREP&amp;quot; -d &amp;quot;1.sales_rep_dimension.sales_team_id=MY_TEAM&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example with bad authentication:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentapse -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 401 Unauthorized&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Authentication failed.&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of Error when trying to add data in an in-existing field:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_description=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 500 Internal Server Error&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Data Load error: Error processing the SQL Query&lt;br /&gt;
  Caused by: Unknown column 'CHANNEL_DESCRIPTION' in 'field list'&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Model Reference ===&lt;br /&gt;
&lt;br /&gt;
The following tables and fields can be given:&lt;br /&gt;
&lt;br /&gt;
==== CHANNEL_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CHANNEL_ID || String (60) || The Channel identifier&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_NAME || String (100) || The Channel name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_TEAM_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_REP_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_REP_ID || String (60) || The Sales representative identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier, references SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Sales representative first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Sales representative last name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMER_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CUSTOMER_ID || String (60) || The Customer identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_NAME || String (255) || The Customer name&lt;br /&gt;
|-&lt;br /&gt;
| COMPANY_NAME || String (255) || The Customer company name&lt;br /&gt;
|-&lt;br /&gt;
| INDUSTRY || String (60) || The Customer industry&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Customer first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Customer last name&lt;br /&gt;
|-&lt;br /&gt;
| ATTN_NAME || String (100) || The address attention name&lt;br /&gt;
|-&lt;br /&gt;
| STREET_ADDRESS_LINE1 || String (255) || The address street&lt;br /&gt;
|-&lt;br /&gt;
| CITY || String (60) || The address city&lt;br /&gt;
|-&lt;br /&gt;
| STATE || String (60) || The address state&lt;br /&gt;
|-&lt;br /&gt;
| REGION || String (60) || The address region&lt;br /&gt;
|-&lt;br /&gt;
| COUNTRY || String (100) || The address country&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE3DIGIT || String (3) || The address first 3 digits of the postal code&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE || String (60) || The address postal code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_COUNTRY || String (60) || The phone number country code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_AREA_CODE || String (60) || The phone number area code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_NUMBER || String (60) || The rest of the phone number&lt;br /&gt;
|-&lt;br /&gt;
| PRIMARY_EMAIL || String (255) || The Customer primary email address&lt;br /&gt;
|-&lt;br /&gt;
| OTHER_EMAIL || String (255) || The Customer other email address&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_TYPE || String (60) || The Customer type&lt;br /&gt;
|-&lt;br /&gt;
| SOURCE || String (60) || The source of the Customer&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (255) || The name of Sales Team associated to the Customer&lt;br /&gt;
|-&lt;br /&gt;
| CREATED_DATE_AND_TIME || Timestamp || The time and date, given as &amp;quot;YYYY-MM-DD hh:mm:ss&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PRODUCT_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| PRODUCT_ID || String (60) || The Product identifier&lt;br /&gt;
|-&lt;br /&gt;
| SKU || String (60) || The Product SKU code&lt;br /&gt;
|-&lt;br /&gt;
| UPC || String (60) || The Product UPC code&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_NAME || String (100) || The Product name&lt;br /&gt;
|-&lt;br /&gt;
| BRAND || String (100) || The Product brand&lt;br /&gt;
|-&lt;br /&gt;
| CATEGORY || String (100) || The Product category name&lt;br /&gt;
|-&lt;br /&gt;
| SIZE || String (100) || The Product size&lt;br /&gt;
|-&lt;br /&gt;
| STYLE || String (100) || The Product style&lt;br /&gt;
|-&lt;br /&gt;
| COLOR || String (100) || The Product color&lt;br /&gt;
|-&lt;br /&gt;
| WIDTH || Numeric (18,6) || The Product width&lt;br /&gt;
|-&lt;br /&gt;
| LENGTH || Numeric (18,6) || The Product length&lt;br /&gt;
|-&lt;br /&gt;
| HEIGHT || Numeric (18,6) || The Product height&lt;br /&gt;
|-&lt;br /&gt;
| WEIGHT || Numeric (18,6) || The Product weight&lt;br /&gt;
|-&lt;br /&gt;
| DIAMETER || Numeric (18,6) || The Product diameter&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_TYPE || String (100) || The Product type&lt;br /&gt;
|-&lt;br /&gt;
| SUPPLIER_NAME || String (100) || The Product supplier name&lt;br /&gt;
|-&lt;br /&gt;
| ORG_SUPPLIER_ID || String (60) || The Product supplier organization identifier&lt;br /&gt;
|-&lt;br /&gt;
| EST_BASE_CURRENCY_COST || Numeric (18,6) || The Product estimated cost&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORDER_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| ORDER_ID || String (60) || The order identifier&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_ITEM_SEQ_ID || String (100) || The order item identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || The customer identifier, references the CUSTOMER_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || The channel identifier, references the CHANNEL_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_ID || String (60)|| The sales representative identifier, references the SALES_REP_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_TEAM_ID || String (60) || The sales team identifier, references the SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || The date the order was placed, format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || The product identifier, references the PRODUCT_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || The quantity of item ordered&lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2)|| &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_QUANTITY || Numeric (18,6) || The quantity of the item that was returned&lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| RETURN_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURN_ITEM_SEQ_ID || String (100) || &lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || Format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| RETURN_DATE || String (Date) || Format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || &lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7038</id>
		<title>Opentaps Analytics Data Loader</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7038"/>
		<updated>2011-04-12T14:42:33Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* PRODUCT_DIMENSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Uploaders ==&lt;br /&gt;
&lt;br /&gt;
=== opentaps and OFBiz ===&lt;br /&gt;
analytics-upload component help to gather and upload analytical data to server. A few steps should be done to install it with opentaps or OfBiz instance.&lt;br /&gt;
&lt;br /&gt;
# Checkout component into hot-deploy. Use &amp;lt;code&amp;gt;svn co svn://svn.opentaps.org/opentaps/modules/analytics-upload/versions/1.5/trunk analytics-upload&amp;lt;/code&amp;gt;&lt;br /&gt;
# Adjust settings in config/analytics-uploader.properties. Webkey should be the one for your store in opentaps Analytics.&lt;br /&gt;
# Note there are two ''scripts'' value in configuration file, default one to use with opentaps instance and another for OfBiz.&lt;br /&gt;
# Start instance and run '''analytics.uploadAnalyticalData''' service.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
Data Loading is done via an HTTP POST servlet.&lt;br /&gt;
&lt;br /&gt;
The following parameter are required:&lt;br /&gt;
* userlogin&lt;br /&gt;
* password&lt;br /&gt;
* webkey&lt;br /&gt;
&lt;br /&gt;
Then the data to load should be given as one parameter per field using the format ''idx.tablename.fieldname=value'' where ''idx'' is a string used both to order the import (if mutliple record depend on each other via a FK) and discriminate which fields are in the same DB row.&lt;br /&gt;
&lt;br /&gt;
Possible HTTP error codes are:&lt;br /&gt;
* 400 Bad Request : missing parameter, invalid field name, bad format, no data to load&lt;br /&gt;
* 401 Unauthorized : authentication failed&lt;br /&gt;
* 404 Not Found : given webkey does not correspond to an existing Store&lt;br /&gt;
* 403 Forbidden : tried to modify a table or field that cannot be modified&lt;br /&gt;
* 409 Conflict : found the same rows defined twice&lt;br /&gt;
* 500 Internal error : other exception during import&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The following examples are using the curl command line utility to perform the HTTP POSTs.&lt;br /&gt;
&lt;br /&gt;
Posting data in the ''CHANNEL_DIMENSION'':&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returned Success message would be like:&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 200 OK&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: success&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;success&amp;quot;&amp;gt;&lt;br /&gt;
  Successfully loaded 1 rows&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple rows can be inserted in the same request, using the IDX part to order the insertion in case a row needs to reference to a previously loaded row:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 \&lt;br /&gt;
   -d &amp;quot;0.sales_team_dimension.sales_team_id=MY_TEAM&amp;quot; -d &amp;quot;0.sales_team_dimension.sales_team_name=My Sales Team&amp;quot; \&lt;br /&gt;
   -d &amp;quot;1.sales_rep_dimension.sales_rep_id=MY_SALESREP&amp;quot; -d &amp;quot;1.sales_rep_dimension.sales_team_id=MY_TEAM&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example with bad authentication:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentapse -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 401 Unauthorized&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Authentication failed.&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of Error when trying to add data in an in-existing field:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_description=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 500 Internal Server Error&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Data Load error: Error processing the SQL Query&lt;br /&gt;
  Caused by: Unknown column 'CHANNEL_DESCRIPTION' in 'field list'&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Model Reference ===&lt;br /&gt;
&lt;br /&gt;
The following tables and fields can be given:&lt;br /&gt;
&lt;br /&gt;
==== CHANNEL_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CHANNEL_ID || String (60) || The Channel identifier&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_NAME || String (100) || The Channel name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_TEAM_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_REP_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_REP_ID || String (60) || The Sales representative identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier, references SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Sales representative first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Sales representative last name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMER_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CUSTOMER_ID || String (60) || The Customer identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_NAME || String (255) || The Customer name&lt;br /&gt;
|-&lt;br /&gt;
| COMPANY_NAME || String (255) || The Customer company name&lt;br /&gt;
|-&lt;br /&gt;
| INDUSTRY || String (60) || The Customer industry&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Customer first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Customer last name&lt;br /&gt;
|-&lt;br /&gt;
| ATTN_NAME || String (100) || The address attention name&lt;br /&gt;
|-&lt;br /&gt;
| STREET_ADDRESS_LINE1 || String (255) || The address street&lt;br /&gt;
|-&lt;br /&gt;
| CITY || String (60) || The address city&lt;br /&gt;
|-&lt;br /&gt;
| STATE || String (60) || The address state&lt;br /&gt;
|-&lt;br /&gt;
| REGION || String (60) || The address region&lt;br /&gt;
|-&lt;br /&gt;
| COUNTRY || String (100) || The address country&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE3DIGIT || String (3) || The address first 3 digits of the postal code&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE || String (60) || The address postal code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_COUNTRY || String (60) || The phone number country code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_AREA_CODE || String (60) || The phone number area code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_NUMBER || String (60) || The rest of the phone number&lt;br /&gt;
|-&lt;br /&gt;
| PRIMARY_EMAIL || String (255) || The Customer primary email address&lt;br /&gt;
|-&lt;br /&gt;
| OTHER_EMAIL || String (255) || The Customer other email address&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_TYPE || String (60) || The Customer type&lt;br /&gt;
|-&lt;br /&gt;
| SOURCE || String (60) || The source of the Customer&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (255) || The name of Sales Team associated to the Customer&lt;br /&gt;
|-&lt;br /&gt;
| CREATED_DATE_AND_TIME || Timestamp || The time and date, given as &amp;quot;YYYY-MM-DD hh:mm:ss&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PRODUCT_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| PRODUCT_ID || String (60) || The Product identifier&lt;br /&gt;
|-&lt;br /&gt;
| SKU || String (60) || The Product SKU code&lt;br /&gt;
|-&lt;br /&gt;
| UPC || String (60) || The Product UPC code&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_NAME || String (100) || The Product name&lt;br /&gt;
|-&lt;br /&gt;
| BRAND || String (100) || The Product brand&lt;br /&gt;
|-&lt;br /&gt;
| CATEGORY || String (100) || The Product category name&lt;br /&gt;
|-&lt;br /&gt;
| SIZE || String (100) || The Product size&lt;br /&gt;
|-&lt;br /&gt;
| STYLE || String (100) || The Product style&lt;br /&gt;
|-&lt;br /&gt;
| COLOR || String (100) || The Product color&lt;br /&gt;
|-&lt;br /&gt;
| WIDTH || Numeric (18,6) || The Product width&lt;br /&gt;
|-&lt;br /&gt;
| LENGTH || Numeric (18,6) || The Product length&lt;br /&gt;
|-&lt;br /&gt;
| HEIGHT || Numeric (18,6) || The Product height&lt;br /&gt;
|-&lt;br /&gt;
| WEIGHT || Numeric (18,6) || The Product weight&lt;br /&gt;
|-&lt;br /&gt;
| DIAMETER || Numeric (18,6) || The Product diameter&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_TYPE || String (100) || The Product type&lt;br /&gt;
|-&lt;br /&gt;
| SUPPLIER_NAME || String (100) || The Product supplier name&lt;br /&gt;
|-&lt;br /&gt;
| ORG_SUPPLIER_ID || String (60) || The Product supplier organization identifier&lt;br /&gt;
|-&lt;br /&gt;
| EST_BASE_CURRENCY_COST || Numeric (18,6) || The Product estimated cost&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORDER_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| ORDER_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| ORDER_ITEM_SEQ_ID || String (100) || &lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_ID || String (60)|| &lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_TEAM_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || Format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || &lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2)|| &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_QUANTITY || Numeric (18,6) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| RETURN_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURN_ITEM_SEQ_ID || String (100) || &lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || Format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| RETURN_DATE || String (Date) || Format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || &lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7037</id>
		<title>Opentaps Analytics Data Loader</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7037"/>
		<updated>2011-04-12T13:17:22Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* CHANNEL_DIMENSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Uploaders ==&lt;br /&gt;
&lt;br /&gt;
=== opentaps and OFBiz ===&lt;br /&gt;
analytics-upload component help to gather and upload analytical data to server. A few steps should be done to install it with opentaps or OfBiz instance.&lt;br /&gt;
&lt;br /&gt;
# Checkout component into hot-deploy. Use &amp;lt;code&amp;gt;svn co svn://svn.opentaps.org/opentaps/modules/analytics-upload/versions/1.5/trunk analytics-upload&amp;lt;/code&amp;gt;&lt;br /&gt;
# Adjust settings in config/analytics-uploader.properties. Webkey should be the one for your store in opentaps Analytics.&lt;br /&gt;
# Note there are two ''scripts'' value in configuration file, default one to use with opentaps instance and another for OfBiz.&lt;br /&gt;
# Start instance and run '''analytics.uploadAnalyticalData''' service.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
Data Loading is done via an HTTP POST servlet.&lt;br /&gt;
&lt;br /&gt;
The following parameter are required:&lt;br /&gt;
* userlogin&lt;br /&gt;
* password&lt;br /&gt;
* webkey&lt;br /&gt;
&lt;br /&gt;
Then the data to load should be given as one parameter per field using the format ''idx.tablename.fieldname=value'' where ''idx'' is a string used both to order the import (if mutliple record depend on each other via a FK) and discriminate which fields are in the same DB row.&lt;br /&gt;
&lt;br /&gt;
Possible HTTP error codes are:&lt;br /&gt;
* 400 Bad Request : missing parameter, invalid field name, bad format, no data to load&lt;br /&gt;
* 401 Unauthorized : authentication failed&lt;br /&gt;
* 404 Not Found : given webkey does not correspond to an existing Store&lt;br /&gt;
* 403 Forbidden : tried to modify a table or field that cannot be modified&lt;br /&gt;
* 409 Conflict : found the same rows defined twice&lt;br /&gt;
* 500 Internal error : other exception during import&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The following examples are using the curl command line utility to perform the HTTP POSTs.&lt;br /&gt;
&lt;br /&gt;
Posting data in the ''CHANNEL_DIMENSION'':&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returned Success message would be like:&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 200 OK&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: success&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;success&amp;quot;&amp;gt;&lt;br /&gt;
  Successfully loaded 1 rows&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple rows can be inserted in the same request, using the IDX part to order the insertion in case a row needs to reference to a previously loaded row:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 \&lt;br /&gt;
   -d &amp;quot;0.sales_team_dimension.sales_team_id=MY_TEAM&amp;quot; -d &amp;quot;0.sales_team_dimension.sales_team_name=My Sales Team&amp;quot; \&lt;br /&gt;
   -d &amp;quot;1.sales_rep_dimension.sales_rep_id=MY_SALESREP&amp;quot; -d &amp;quot;1.sales_rep_dimension.sales_team_id=MY_TEAM&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example with bad authentication:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentapse -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 401 Unauthorized&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Authentication failed.&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of Error when trying to add data in an in-existing field:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_description=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 500 Internal Server Error&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Data Load error: Error processing the SQL Query&lt;br /&gt;
  Caused by: Unknown column 'CHANNEL_DESCRIPTION' in 'field list'&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Model Reference ===&lt;br /&gt;
&lt;br /&gt;
The following tables and fields can be given:&lt;br /&gt;
&lt;br /&gt;
==== CHANNEL_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CHANNEL_ID || String (60) || The Channel identifier&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_NAME || String (100) || The Channel name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_TEAM_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SALES_REP_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| SALES_REP_ID || String (60) || The Sales representative identifier&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_ID || String (60) || The Sales team identifier, references SALES_TEAM_DIMENSION&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (100) || The Sales team name&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Sales representative first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Sales representative last name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CUSTOMER_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| CUSTOMER_ID || String (60) || The Customer identifier&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_NAME || String (255) || The Customer name&lt;br /&gt;
|-&lt;br /&gt;
| COMPANY_NAME || String (255) || The Customer company name&lt;br /&gt;
|-&lt;br /&gt;
| INDUSTRY || String (60) || The Customer industry&lt;br /&gt;
|-&lt;br /&gt;
| FIRST_NAME || String (100) || The Customer first name&lt;br /&gt;
|-&lt;br /&gt;
| LAST_NAME || String (100) || The Customer last name&lt;br /&gt;
|-&lt;br /&gt;
| ATTN_NAME || String (100) || The address attention name&lt;br /&gt;
|-&lt;br /&gt;
| STREET_ADDRESS_LINE1 || String (255) || The address street&lt;br /&gt;
|-&lt;br /&gt;
| CITY || String (60) || The address city&lt;br /&gt;
|-&lt;br /&gt;
| STATE || String (60) || The address state&lt;br /&gt;
|-&lt;br /&gt;
| REGION || String (60) || The address region&lt;br /&gt;
|-&lt;br /&gt;
| COUNTRY || String (100) || The address country&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE3DIGIT || String (3) || The address first 3 digits of the postal code&lt;br /&gt;
|-&lt;br /&gt;
| POSTAL_CODE || String (60) || The address postal code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_COUNTRY || String (60) || The phone number country code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_AREA_CODE || String (60) || The phone number area code&lt;br /&gt;
|-&lt;br /&gt;
| PHONE_NUMBER || String (60) || The rest of the phone number&lt;br /&gt;
|-&lt;br /&gt;
| PRIMARY_EMAIL || String (255) || The Customer primary email address&lt;br /&gt;
|-&lt;br /&gt;
| OTHER_EMAIL || String (255) || The Customer other email address&lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_TYPE || String (60) || The Customer type&lt;br /&gt;
|-&lt;br /&gt;
| SOURCE || String (60) || The source of the Customer&lt;br /&gt;
|-&lt;br /&gt;
| SALES_TEAM_NAME || String (255) || The name of Sales Team associated to the Customer&lt;br /&gt;
|-&lt;br /&gt;
| CREATED_DATE_AND_TIME || Timestamp || The time and date, given as &amp;quot;YYYY-MM-DD hh:mm:ss&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PRODUCT_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| PRODUCT_ID || String (60) || The Product identifier&lt;br /&gt;
|-&lt;br /&gt;
| SKU || String (60) || The Product SKU code&lt;br /&gt;
|-&lt;br /&gt;
| UPC || String (60) || The Product UPC code&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_NAME || String (100) || The Product name&lt;br /&gt;
|-&lt;br /&gt;
| BRAND || String (100) || The Product brand&lt;br /&gt;
|-&lt;br /&gt;
| CATEGORY || String (100) || The Product category name&lt;br /&gt;
|-&lt;br /&gt;
| SIZE || String (100) || The Product size&lt;br /&gt;
|-&lt;br /&gt;
| STYLE || String (100) || The Product style&lt;br /&gt;
|-&lt;br /&gt;
| COLOR || String (100) || The Product color&lt;br /&gt;
|-&lt;br /&gt;
| WIDTH || Numeric (18,6) || The Product width&lt;br /&gt;
|-&lt;br /&gt;
| LENGTH || Numeric (18,6) || &lt;br /&gt;
|-&lt;br /&gt;
| HEIGHT || Numeric (18,6) || &lt;br /&gt;
|-&lt;br /&gt;
| WEIGHT || Numeric (18,6) || &lt;br /&gt;
|-&lt;br /&gt;
| DIAMETER || Numeric (18,6) || &lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_TYPE || String (100) || &lt;br /&gt;
|-&lt;br /&gt;
| SUPPLIER_NAME || String (100) || &lt;br /&gt;
|-&lt;br /&gt;
| ORG_SUPPLIER_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| EST_BASE_CURRENCY_COST || Numeric (18,6) || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ORDER_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| ORDER_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| ORDER_ITEM_SEQ_ID || String (100) || &lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_ID || String (60)|| &lt;br /&gt;
|-&lt;br /&gt;
| SALES_REP_TEAM_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || Format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || &lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2)|| &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_QUANTITY || Numeric (18,6) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURNED_NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RETURN_ITEM_FACT ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Field name&lt;br /&gt;
!width=&amp;quot;200&amp;quot;|Type&lt;br /&gt;
!width=&amp;quot;500&amp;quot;|Description&lt;br /&gt;
|- &lt;br /&gt;
| RETURN_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| RETURN_ITEM_SEQ_ID || String (100) || &lt;br /&gt;
|-&lt;br /&gt;
| CUSTOMER_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| ORDER_DATE || String (Date) || Format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| RETURN_DATE || String (Date) || Format is ''YYYY-MM-DD''&lt;br /&gt;
|-&lt;br /&gt;
| PRODUCT_ID || String (60) || &lt;br /&gt;
|-&lt;br /&gt;
| QUANTITY || Numeric (18,6) || &lt;br /&gt;
|-&lt;br /&gt;
| GROSS_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| NET_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| DISCOUNT_AMOUNT_BASE_CURRENCY || Numeric (18,2) || &lt;br /&gt;
|-&lt;br /&gt;
| RESOLUTION_STATUS || String (25) || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7036</id>
		<title>Opentaps Analytics Data Loader</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7036"/>
		<updated>2011-04-12T12:25:00Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Data Model Reference */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Uploaders ==&lt;br /&gt;
&lt;br /&gt;
=== opentaps and OFBiz ===&lt;br /&gt;
analytics-upload component help to gather and upload analytical data to server. A few steps should be done to install it with opentaps or OfBiz instance.&lt;br /&gt;
&lt;br /&gt;
# Checkout component into hot-deploy. Use &amp;lt;code&amp;gt;svn co svn://svn.opentaps.org/opentaps/modules/analytics-upload/versions/1.5/trunk analytics-upload&amp;lt;/code&amp;gt;&lt;br /&gt;
# Adjust settings in config/analytics-uploader.properties. Webkey should be the one for your store in opentaps Analytics.&lt;br /&gt;
# Note there are two ''scripts'' value in configuration file, default one to use with opentaps instance and another for OfBiz.&lt;br /&gt;
# Start instance and run '''analytics.uploadAnalyticalData''' service.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
Data Loading is done via an HTTP POST servlet.&lt;br /&gt;
&lt;br /&gt;
The following parameter are required:&lt;br /&gt;
* userlogin&lt;br /&gt;
* password&lt;br /&gt;
* webkey&lt;br /&gt;
&lt;br /&gt;
Then the data to load should be given as one parameter per field using the format ''idx.tablename.fieldname=value'' where ''idx'' is a string used both to order the import (if mutliple record depend on each other via a FK) and discriminate which fields are in the same DB row.&lt;br /&gt;
&lt;br /&gt;
Possible HTTP error codes are:&lt;br /&gt;
* 400 Bad Request : missing parameter, invalid field name, bad format, no data to load&lt;br /&gt;
* 401 Unauthorized : authentication failed&lt;br /&gt;
* 404 Not Found : given webkey does not correspond to an existing Store&lt;br /&gt;
* 403 Forbidden : tried to modify a table or field that cannot be modified&lt;br /&gt;
* 409 Conflict : found the same rows defined twice&lt;br /&gt;
* 500 Internal error : other exception during import&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The following examples are using the curl command line utility to perform the HTTP POSTs.&lt;br /&gt;
&lt;br /&gt;
Posting data in the ''CHANNEL_DIMENSION'':&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returned Success message would be like:&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 200 OK&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: success&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;success&amp;quot;&amp;gt;&lt;br /&gt;
  Successfully loaded 1 rows&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple rows can be inserted in the same request, using the IDX part to order the insertion in case a row needs to reference to a previously loaded row:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 \&lt;br /&gt;
   -d &amp;quot;0.sales_team_dimension.sales_team_id=MY_TEAM&amp;quot; -d &amp;quot;0.sales_team_dimension.sales_team_name=My Sales Team&amp;quot; \&lt;br /&gt;
   -d &amp;quot;1.sales_rep_dimension.sales_rep_id=MY_SALESREP&amp;quot; -d &amp;quot;1.sales_rep_dimension.sales_team_id=MY_TEAM&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example with bad authentication:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentapse -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 401 Unauthorized&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Authentication failed.&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of Error when trying to add data in an in-existing field:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_description=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 500 Internal Server Error&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Data Load error: Error processing the SQL Query&lt;br /&gt;
  Caused by: Unknown column 'CHANNEL_DESCRIPTION' in 'field list'&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Model Reference ===&lt;br /&gt;
&lt;br /&gt;
The following tables and fields can be given:&lt;br /&gt;
&lt;br /&gt;
==== CHANNEL_DIMENSION ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;5&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
| Field name || Type || Description&lt;br /&gt;
|- &lt;br /&gt;
| CHANNEL_ID || String || The Channel identifier&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_NAME || String || The Channel name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''SALES_TEAM_DIMENSION''' : SALES_TEAM_ID, SALES_TEAM_NAME&lt;br /&gt;
* '''SALES_REP_DIMENSION''' : SALES_REP_ID, SALES_TEAM_ID, SALES_TEAM_NAME, FIRST_NAME, LAST_NAME&lt;br /&gt;
* '''CUSTOMER_DIMENSION''' : CUSTOMER_ID, CUSTOMER_NAME, COMPANY_NAME, FIRST_NAME, LAST_NAME, ATTN_NAME, STREET_ADDRESS_LINE1, CITY, STATE, REGION, POSTAL_CODE3DIGIT, POSTAL_CODE, COUNTRY, PHONE_COUNTRY, PHONE_AREA_CODE, PHONE_NUMBER, PRIMARY_EMAIL, OTHER_EMAIL, CUSTOMER_TYPE, SOURCE, INDUSTRY, SALES_TEAM_NAME, CREATED_DATE_AND_TIME&lt;br /&gt;
* '''PRODUCT_DIMENSION''' : PRODUCT_ID, SKU, UPC, PRODUCT_NAME, BRAND, CATEGORY, SIZE, WIDTH, LENGTH, HEIGHT, WEIGHT, DIAMETER, PRODUCT_TYPE, SUPPLIER_NAME, ORG_SUPPLIER_ID, EST_BASE_CURRENCY_COST, STYLE, COLOR&lt;br /&gt;
* '''ORDER_ITEM_FACT''' : ORDER_ID, ORDER_ITEM_SEQ_ID, CUSTOMER_ID, CHANNEL_ID, SALES_REP_ID, SALES_REP_TEAM_ID, ORDER_DATE, PRODUCT_ID, QUANTITY, GROSS_AMOUNT_BASE_CURRENCY, NET_AMOUNT_BASE_CURRENCY, DISCOUNT_AMOUNT_BASE_CURRENCY, RESOLUTION_STATUS, RETURNED_QUANTITY, RETURNED_GROSS_AMOUNT_BASE_CURRENCY, RETURNED_DISCOUNT_AMOUNT_BASE_CURRENCY, RETURNED_NET_AMOUNT_BASE_CURRENCY&lt;br /&gt;
* '''RETURN_ITEM_FACT''' : RETURN_ID, RETURN_ITEM_SEQ_ID, CUSTOMER_ID, CHANNEL_ID, ORDER_DATE, RETURN_DATE, PRODUCT_ID, QUANTITY, GROSS_AMOUNT_BASE_CURRENCY, NET_AMOUNT_BASE_CURRENCY, DISCOUNT_AMOUNT_BASE_CURRENCY, RESOLUTION_STATUS&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Fact tables IDs must match the corresponding IDs in the dimension tables&lt;br /&gt;
* Dates should be formatted as ''YYYY-MM-DD''&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7034</id>
		<title>Opentaps Analytics Data Loader</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Data_Loader&amp;diff=7034"/>
		<updated>2011-04-11T16:13:38Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Uploaders ==&lt;br /&gt;
&lt;br /&gt;
=== opentaps and OFBiz ===&lt;br /&gt;
analytics-upload component help to gather and upload analytical data to server. A few steps should be done to install it with opentaps or OfBiz instance.&lt;br /&gt;
&lt;br /&gt;
# Checkout component into hot-deploy. Use &amp;lt;code&amp;gt;svn co svn://svn.opentaps.org/opentaps/modules/analytics-upload/versions/1.5/trunk analytics-upload&amp;lt;/code&amp;gt;&lt;br /&gt;
# Adjust settings in config/analytics-uploader.properties. Webkey should be the one for your store in opentaps Analytics.&lt;br /&gt;
# Note there are two ''scripts'' value in configuration file, default one to use with opentaps instance and another for OfBiz.&lt;br /&gt;
# Start instance and run '''analytics.uploadAnalyticalData''' service.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
Data Loading is done via an HTTP POST servlet.&lt;br /&gt;
&lt;br /&gt;
The following parameter are required:&lt;br /&gt;
* userlogin&lt;br /&gt;
* password&lt;br /&gt;
* webkey&lt;br /&gt;
&lt;br /&gt;
Then the data to load should be given as one parameter per field using the format ''idx.tablename.fieldname=value'' where ''idx'' is a string used both to order the import (if mutliple record depend on each other via a FK) and discriminate which fields are in the same DB row.&lt;br /&gt;
&lt;br /&gt;
Possible HTTP error codes are:&lt;br /&gt;
* 400 Bad Request : missing parameter, invalid field name, bad format, no data to load&lt;br /&gt;
* 401 Unauthorized : authentication failed&lt;br /&gt;
* 404 Not Found : given webkey does not correspond to an existing Store&lt;br /&gt;
* 403 Forbidden : tried to modify a table or field that cannot be modified&lt;br /&gt;
* 409 Conflict : found the same rows defined twice&lt;br /&gt;
* 500 Internal error : other exception during import&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The following examples are using the curl command line utility to perform the HTTP POSTs.&lt;br /&gt;
&lt;br /&gt;
Posting data in the ''CHANNEL_DIMENSION'':&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returned Success message would be like:&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 200 OK&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: success&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;success&amp;quot;&amp;gt;&lt;br /&gt;
  Successfully loaded 1 rows&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple rows can be inserted in the same request, using the IDX part to order the insertion in case a row needs to reference to a previously loaded row:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 \&lt;br /&gt;
   -d &amp;quot;0.sales_team_dimension.sales_team_id=MY_TEAM&amp;quot; -d &amp;quot;0.sales_team_dimension.sales_team_name=My Sales Team&amp;quot; \&lt;br /&gt;
   -d &amp;quot;1.sales_rep_dimension.sales_rep_id=MY_SALESREP&amp;quot; -d &amp;quot;1.sales_rep_dimension.sales_team_id=MY_TEAM&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example with bad authentication:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentapse -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_name=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 401 Unauthorized&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Authentication failed.&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of Error when trying to add data in an in-existing field:&lt;br /&gt;
&lt;br /&gt;
  curl -i -d userlogin=admin -d password=opentaps -d webkey=thisisatest1234 -d &amp;quot;0.channel_dimension.channel_id=MY_CHANNEL&amp;quot; -d &amp;quot;0.channel_dimension.channel_description=My Channel&amp;quot; &amp;lt;nowiki&amp;gt;http://127.0.0.1:8080/analytics/control/loaddata&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  HTTP/1.1 500 Internal Server Error&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Dataload: error&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body class=&amp;quot;error&amp;quot;&amp;gt;&lt;br /&gt;
  Data Load error: Error processing the SQL Query&lt;br /&gt;
  Caused by: Unknown column 'CHANNEL_DESCRIPTION' in 'field list'&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data Model Reference ===&lt;br /&gt;
&lt;br /&gt;
The following tables and fields can be given:&lt;br /&gt;
* '''CHANNEL_DIMENSION''' : CHANNEL_ID, CHANNEL_NAME&lt;br /&gt;
* '''SALES_TEAM_DIMENSION''' : SALES_TEAM_ID, SALES_TEAM_NAME&lt;br /&gt;
* '''SALES_REP_DIMENSION''' : SALES_REP_ID, SALES_TEAM_ID, SALES_TEAM_NAME, FIRST_NAME, LAST_NAME&lt;br /&gt;
* '''CUSTOMER_DIMENSION''' : CUSTOMER_ID, CUSTOMER_NAME, COMPANY_NAME, FIRST_NAME, LAST_NAME, ATTN_NAME, STREET_ADDRESS_LINE1, CITY, STATE, REGION, POSTAL_CODE3DIGIT, POSTAL_CODE, COUNTRY, PHONE_COUNTRY, PHONE_AREA_CODE, PHONE_NUMBER, PRIMARY_EMAIL, OTHER_EMAIL, CUSTOMER_TYPE, SOURCE, INDUSTRY, SALES_TEAM_NAME, CREATED_DATE_AND_TIME&lt;br /&gt;
* '''PRODUCT_DIMENSION''' : PRODUCT_ID, SKU, UPC, PRODUCT_NAME, BRAND, CATEGORY, SIZE, WIDTH, LENGTH, HEIGHT, WEIGHT, DIAMETER, PRODUCT_TYPE, SUPPLIER_NAME, ORG_SUPPLIER_ID, EST_BASE_CURRENCY_COST, STYLE, COLOR&lt;br /&gt;
* '''MAP_LOCATION_DIMENSION''' : CITY, STATE, REGION, COUNTRY, LATITUDE, LONGITUDE&lt;br /&gt;
* '''CUSTOMER_HISTORY_FACT''' : CUSTOMER_ID, AS_OF_DATE, LIFETIME_NUMBER_OF_ORDERS, LIFETIME_NUMBER_OF_RETURNS, LIFETIME_ORDER_TOTAL, LIFETIME_RETURN_TOTAL, DAYS_SINCE_LAST_ORDER, NUMBER_OF_ORDERS_LAST_12_MONTH, NUMBER_OF_RETURNS_LAST_12_MONTH, TOTAL_ORDERS_LAST_12_MONTH, TOTAL_RETURNS_LAST_12_MONTH, LIFETIME_NET_ORDER_VALUE, LIFETIME_GROSS_PROFIT, RECEIVABLES_BALANCE, OVERDUE_RECEIVABLES_BALANCE, RECENCY_SCORE, FREQUENCY_SCORE, MONETARY_SCORE, RFM_SCORE, RECENCY_SCORE_CHANGE, FREQUENCY_SCORE_CHANGE, MONETARY_SCORE_CHANGE, RFM_SCORE_CHANGE&lt;br /&gt;
* '''CUSTOMER_HISTORY_FACT_VERIFICATION''' : CUSTOMER_ID, AS_OF_DATE, EXPECTED_LIFETIME_NUMBER_OF_ORDERS, EXPECTED_LIFETIME_NUMBER_OF_RETURNS, EXPECTED_LIFETIME_ORDER_TOTAL, EXPECTED_LIFETIME_RETURN_TOTAL, EXPECTED_LIFETIME_NET_ORDER_VALUE, DELTA_LIFETIME_NUMBER_OF_ORDERS, DELTA_LIFETIME_NUMBER_OF_RETURNS, DELTA_LIFETIME_ORDER_TOTAL, DELTA_LIFETIME_RETURN_TOTAL, DELTA_LIFETIME_NET_ORDER_VALUE, MAX_ABS_DELTA&lt;br /&gt;
* '''ORDER_ITEM_FACT''' : ORDER_ID, ORDER_ITEM_SEQ_ID, CUSTOMER_ID, CHANNEL_ID, SALES_REP_ID, SALES_REP_TEAM_ID, ORDER_DATE, PRODUCT_ID, QUANTITY, GROSS_AMOUNT_BASE_CURRENCY, NET_AMOUNT_BASE_CURRENCY, DISCOUNT_AMOUNT_BASE_CURRENCY, RESOLUTION_STATUS, RETURNED_QUANTITY, RETURNED_GROSS_AMOUNT_BASE_CURRENCY, RETURNED_DISCOUNT_AMOUNT_BASE_CURRENCY, RETURNED_NET_AMOUNT_BASE_CURRENCY&lt;br /&gt;
* '''RETURN_ITEM_FACT''' : RETURN_ID, RETURN_ITEM_SEQ_ID, CUSTOMER_ID, CHANNEL_ID, ORDER_DATE, RETURN_DATE, PRODUCT_ID, QUANTITY, GROSS_AMOUNT_BASE_CURRENCY, NET_AMOUNT_BASE_CURRENCY, DISCOUNT_AMOUNT_BASE_CURRENCY, RESOLUTION_STATUS&lt;br /&gt;
* '''DASHBOARD_TOP_CUSTOMERS_FACT''' : CUSTOMER_ID, CUSTOMER_NAME, SALES_VALUE&lt;br /&gt;
* '''DASHBOARD_CUSTOMER_LOCATION_FACT''' : CITY, STATE, COUNTRY, NUMBER, LATITUDE, LONGITUDE&lt;br /&gt;
* '''DASHBOARD_SALES_OVER_TIME_FACT''' : CATEGORY, DATE, SOLD_VALUE&lt;br /&gt;
* '''DASHBOARD_SALES_BY_CATEGORY_COUNTRY_MONTH_FACT''' : PRODUCT_CATEGORY, MONTH_NAME, CUSTOMER_COUNTRY, SOLD_PRICE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Fact tables IDs must match the corresponding IDs in the dimension tables&lt;br /&gt;
* Dates should be formatted as ''YYYY-MM-DD''&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6990</id>
		<title>Release Testing</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6990"/>
		<updated>2011-02-21T12:59:11Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Release Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Release Testing==&lt;br /&gt;
&lt;br /&gt;
These are some general tests, which should be performed prior to releases:&lt;br /&gt;
&lt;br /&gt;
* checkout opentaps from the SVN&lt;br /&gt;
&lt;br /&gt;
* Make sure that ant run-install works. &lt;br /&gt;
* Then check the basic functionality for doing the following:&lt;br /&gt;
** CRM - create leads, qualify them, convert them to accounts, create notes, opportunities, tasks, events&lt;br /&gt;
** Catalog - create new categories and products, make sure they show up on ecommerce&lt;br /&gt;
** ecommerce - see new products, sign up as new customer, place orders, see order history&lt;br /&gt;
** purchasing -- creating new supplier with contact information&lt;br /&gt;
** catalog - create purchasing information for supplier&lt;br /&gt;
** purchasing -- create purchase orders for product&lt;br /&gt;
** warehouse -- receive products on purchase orders, verify that the inventory in the warehouse has increased.&lt;br /&gt;
** warehouse - Pack &amp;amp; ship orders, verify that the inventory has decreased.&lt;br /&gt;
** warehouse -- create a production run for PROD_MANUF, schedule and confirm it, make sure that it shows up on the calendar, complete the production run, and make sure that the inventory for PROD_MANUF has increased and the inventory for MAT_A_COST and MAT_B_COST have decreased.&lt;br /&gt;
** Order - create sales and purchase orders&lt;br /&gt;
** Financials - see invoices and trial balances. Trial balances should always be equal on debit &amp;amp; credit.&lt;br /&gt;
&lt;br /&gt;
* Make sure ant run-tests works&lt;br /&gt;
&lt;br /&gt;
==Release Packaging==&lt;br /&gt;
&lt;br /&gt;
* from a fresh checkout, run ant run-install&lt;br /&gt;
* change the release version in framework/common/config/CommonUiLabels.xml&lt;br /&gt;
* make sure the GWT configuration is set to compile for all locals and all browser in opentaps-common/src/common/org/opentaps/gwt/common/common.gwt.xml&lt;br /&gt;
** uncomment all extend-property&lt;br /&gt;
** comment out &amp;lt;set-property name=&amp;quot;user.agent&amp;quot; ..&amp;gt;&lt;br /&gt;
* don't forget to regenerate the labels after that&lt;br /&gt;
* run ant (so the GWT modules are rebuilt)&lt;br /&gt;
* remove logs in runtime/logs&lt;br /&gt;
* make a zip file with the root directory which should be opentaps-{version} (for example opentaps-1.0.2). Also note that we do include the .svn directories in the release (pointing to the trunk).&lt;br /&gt;
* unzip the file and verify that the data has been installed&lt;br /&gt;
&lt;br /&gt;
'''Make sure your package contains the demo data installed in localderby database.'''&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Customizing_opentaps_Applications&amp;diff=6988</id>
		<title>Customizing opentaps Applications</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Customizing_opentaps_Applications&amp;diff=6988"/>
		<updated>2011-02-08T13:50:34Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Webapp User Interface Database Entities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Frequently you will need to customize opentaps applications, such as change the tabs or shortcuts at the top or add new screens.  Beginning with opentaps 1.5, you can make these changes without affecting the core opentaps code, making it easier for you to upgrade later when new versions of opentaps becomes available.  &lt;br /&gt;
&lt;br /&gt;
opentaps 1.5 supports the following new features to help you customize its applications:&lt;br /&gt;
* The tabs and shortcuts available are now stored in the database, so you can rearrange or change the user interface labels.&lt;br /&gt;
* Other user interface elements are also now defined in configuration database entities.&lt;br /&gt;
* You can &amp;quot;inject&amp;quot; new controller entries into opentaps applications, making it possible to load your screens and actions into an opentaps application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Webapp User Interface Database Entities==&lt;br /&gt;
&lt;br /&gt;
'''OpentapsWebApps''' : defines a webapp (eg: crmsfa, financials), they are listed in the top navigation menu.&lt;br /&gt;
* linkUrl should correspond to the home page of the application (eg: /crmsfa/control/main).&lt;br /&gt;
* shortName, description, applicationName, imageUrl and imageHoverUrl are used in the opentaps main home page (accessed at /opentaps)&lt;br /&gt;
* shortName is also used in top navigation menu as the link label&lt;br /&gt;
* sequenceNum is to specify the display order in the nvaigation menu and the opentaps main home page&lt;br /&gt;
&lt;br /&gt;
'''OpentapsWebAppTab''' : a webapp may have multiple tabs (eg: home, orders, accounts .. in crmsfa), they are listed as tabs in the webapp below the top navigation menu.&lt;br /&gt;
* uiLabel is the label of the tab, this can use a localized string when present in one of the localized resources, else will be displayed as is&lt;br /&gt;
* linkUrl can be just the request name in the application, or if isExternal is set to Y it will be used as is (eg: /opentaps, http://www.example.com/somewhere for external urls)&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
'''OpentapsShortcutGroup''' : a shortcut group is a small menu in the left column of the page with a title and a list of shortcuts (links), and it belongs to a tab&lt;br /&gt;
* uiLabel is the label of the title of the group, this can use a localized string when present in one of the localized resources, else will be displayed as is. If left blank it defaults to the localized string &amp;quot;Shortcuts&amp;quot;&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
'''OpentapsShortcut''' : a link in a shortcut group&lt;br /&gt;
* uiLabel is the label of the shortcut, this can use a localized string when present in one of the localized resources, else will be displayed as is&lt;br /&gt;
* linkUrl can be just the request name in the application, or if isExternal is set to Y it will be used as is (eg: /opentaps, http://www.example.com/somewhere for external urls)&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
===String substitution===&lt;br /&gt;
&lt;br /&gt;
In OpentapsWebAppTab, OpentapsShortcutGroup and OpentapsShortcut the linkUrl and uiLabel supports automatic substitutions according to the current context so &amp;quot;${foo}&amp;quot; will be changed into the context value of &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Permission===&lt;br /&gt;
&lt;br /&gt;
OpentapsWebAppTab, OpentapsShortcutGroup and OpentapsShortcut all have the securityModule and securityAction fields to specify a basic permission the user must have in order to see the corresponding entity. eg: securityModule=&amp;quot;CRMSFA_CONTACTS&amp;quot; securityAction=&amp;quot;VIEW&amp;quot; for the contact tab.&lt;br /&gt;
&lt;br /&gt;
Note: this only affects the display on the page, not actual access control (yet).&lt;br /&gt;
&lt;br /&gt;
===Handlers===&lt;br /&gt;
&lt;br /&gt;
In some cases the basic permission will not be enough, or we need more control over what should actually be displayed or not. For this the handlerMethod and handlerParameter fields can be used.&lt;br /&gt;
&lt;br /&gt;
handlerMethod is java method that takes a context Map (Map&amp;lt;String, Object&amp;gt;) and the entity being checked (OpentapsWebAppTab or OpentapsShortcutGroup or OpentapsShortcut or a generic &amp;lt;T extends EntityInterface&amp;gt;) as parameters, and returns the given entity.&lt;br /&gt;
This method is called before display and is then free to modify any part of the entity like url, label which will then affect how it is displayed to the current user; and if the entity should not be displayed it can simply return null.&lt;br /&gt;
handlerParameter can then be used to provide data to a generic handler (like a complex permission to check, a view preference, etc ...)&lt;br /&gt;
&lt;br /&gt;
Example of handlers:&lt;br /&gt;
&lt;br /&gt;
* ''org.opentaps.warehouse.security.WarehouseSecurity.checkFacilityPermission'' : checks the current user permission on the current facility (as selected when entering the warehouse application) against the permission set in handlerParameter&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkSessionValueAbsent'' : checks if the user session does not contain the key specified by handlerParameter (or has a null value)&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkSessionValuePresent'' : checks if the user session contains the key specified by handlerParameter (has a non null value)&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkHasNoCart'' : check the current user session does not have a shopping cart&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkHasCart'' : check the current user session has a shopping cart&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkBoolean'' : check the current context has a value named by handlerParameter as a boolean True or a string Y/y&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkViewPreferenceForTab'' : check the current user view preference in the current tab; handlerParameter should contain 2 colon separated values: prefType:valueToCheck:default (eg: &amp;quot;MY_OR_TEAM_ACCOUNTS:MY_VALUES:TEAM_VALUES&amp;quot; checks if the MY_OR_TEAM_ACCOUNTS view preference is set to MY_VALUES, and use TEAM_VALUES as default if the view preference is empty)&lt;br /&gt;
&lt;br /&gt;
==Controller Injection==&lt;br /&gt;
&lt;br /&gt;
The '''ControllerInject''' entity allows to inject a controller xml file into another. Usually this is done to customize one of the existing application without modifying their controller file directly, and so keeping the customization isolated from the base code.&lt;br /&gt;
&lt;br /&gt;
The ''injectUrl'' field specify the url of the controller to inject, and ''injectIntoUrl'' the target controller.&lt;br /&gt;
&lt;br /&gt;
For example see the ''opentaps/controllerinjectex'' component, activate it by:&lt;br /&gt;
* add ''&amp;lt;load-component component-location=&amp;quot;controllerinjectex&amp;quot;/&amp;gt;'' in ''opentaps/component-load.xml''&lt;br /&gt;
&lt;br /&gt;
Then either mount is a normal webapp:&lt;br /&gt;
* uncomment the ''webapp'' definition in its ''ofbiz-component.xml''&lt;br /&gt;
* access ''/controllerinjectex/'' in a browser&lt;br /&gt;
&lt;br /&gt;
Or use the controller injection by:&lt;br /&gt;
* importing as seed data (in webtools import XML)&lt;br /&gt;
     &amp;lt;ControllerInjection injectUrl=&amp;quot;component://controllerinjectex/webapp/controllerinjectex/WEB-INF/controller.xml&amp;quot;&lt;br /&gt;
                       injectIntoUrl=&amp;quot;component://crmsfa/webapp/crmsfa/WEB-INF/controller.xml&amp;quot; sequenceNum=&amp;quot;99&amp;quot; /&amp;gt;&lt;br /&gt;
* access ''/crmsfa/control/echo'' in a browser&lt;br /&gt;
* note: ''opentaps/controllerinjectex/data/InjectData.xml'' also contains an example Shortcut which will be inserted in the crmsfa home tab shortcut group for access to this page&lt;br /&gt;
&lt;br /&gt;
Note that with injection its ''WEB-INF/web.xml'' is no longer needed.&lt;br /&gt;
&lt;br /&gt;
The result will be the same as the previous and more complex process:&lt;br /&gt;
# commenting the webapp to customize mount point in its ''ofbiz-component.xml''&lt;br /&gt;
# creating a webapp in the custom component (''WEB-INF/web.xml'' and mount point in the ''ofbiz-component.xml'', with the same name as the original webapp mount point)&lt;br /&gt;
# including the controller to customize (eg: ''component://crmsfa/webapp/crmsfa/WEB-INF/controller.xml'') in the custom component controller&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Customizing_opentaps_Applications&amp;diff=6987</id>
		<title>Customizing opentaps Applications</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Customizing_opentaps_Applications&amp;diff=6987"/>
		<updated>2011-02-08T13:48:18Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Controller Injection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Frequently you will need to customize opentaps applications, such as change the tabs or shortcuts at the top or add new screens.  Beginning with opentaps 1.5, you can make these changes without affecting the core opentaps code, making it easier for you to upgrade later when new versions of opentaps becomes available.  &lt;br /&gt;
&lt;br /&gt;
opentaps 1.5 supports the following new features to help you customize its applications:&lt;br /&gt;
* The tabs and shortcuts available are now stored in the database, so you can rearrange or change the user interface labels.&lt;br /&gt;
* Other user interface elements are also now defined in configuration database entities.&lt;br /&gt;
* You can &amp;quot;inject&amp;quot; new controller entries into opentaps applications, making it possible to load your screens and actions into an opentaps application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Webapp User Interface Database Entities==&lt;br /&gt;
&lt;br /&gt;
'''OpentapsWebApps''' : defines a webapp (eg: crmsfa, financials), they are listed in the top navigation menu.&lt;br /&gt;
* linkUrl should correspond to the home page of the application (eg: /crmsfa/control/main).&lt;br /&gt;
* shortName, description, applicationName, imageUrl and imageHoverUrl are used in the opentaps main home page (accessed at /opentaps)&lt;br /&gt;
* shortName is also used in top navigation menu as the link label&lt;br /&gt;
* sequenceNum is to specify the display order in the nvaigation menu and the opentaps main home page&lt;br /&gt;
&lt;br /&gt;
'''OpentapsWebAppTab''' : a webapp may have multiple tabs (eg: home, orders, accounts .. in crmsfa), they are listed as tabs in the webapp below the top navigation menu.&lt;br /&gt;
* uiLabel is the label of the tab, this can use a localized string when present in one of the localized resources, else will be displayed as is&lt;br /&gt;
* linkUrl can be just the request name in the application, or if isExternal is set to Y it will be used as is (eg: /opentaps, http://www.example.com/somewhere for external urls)&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
'''OpentapsShortcutGroup''' : a shortcut group is a small menu in the left column of the page with a title and a list of shortcuts (links)&lt;br /&gt;
* uiLabel is the label of the title of the group, this can use a localized string when present in one of the localized resources, else will be displayed as is. If left blank it defaults to the localized string &amp;quot;Shortcuts&amp;quot;&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
'''OpentapsShortcut''' : a link in a shortcut group&lt;br /&gt;
* uiLabel is the label of the shortcut, this can use a localized string when present in one of the localized resources, else will be displayed as is&lt;br /&gt;
* linkUrl can be just the request name in the application, or if isExternal is set to Y it will be used as is (eg: /opentaps, http://www.example.com/somewhere for external urls)&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
===String substitution===&lt;br /&gt;
&lt;br /&gt;
In OpentapsWebAppTab, OpentapsShortcutGroup and OpentapsShortcut the linkUrl and uiLabel supports automatic substitutions according to the current context so &amp;quot;${foo}&amp;quot; will be changed into the context value of &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Permission===&lt;br /&gt;
&lt;br /&gt;
OpentapsWebAppTab, OpentapsShortcutGroup and OpentapsShortcut all have the securityModule and securityAction fields to specify a basic permission the user must have in order to see the corresponding entity. eg: securityModule=&amp;quot;CRMSFA_CONTACTS&amp;quot; securityAction=&amp;quot;VIEW&amp;quot; for the contact tab.&lt;br /&gt;
&lt;br /&gt;
Note: this only affects the display on the page, not actual access control (yet).&lt;br /&gt;
&lt;br /&gt;
===Handlers===&lt;br /&gt;
&lt;br /&gt;
In some cases the basic permission will not be enough, or we need more control over what should actually be displayed or not. For this the handlerMethod and handlerParameter fields can be used.&lt;br /&gt;
&lt;br /&gt;
handlerMethod is java method that takes a context Map (Map&amp;lt;String, Object&amp;gt;) and the entity being checked (OpentapsWebAppTab or OpentapsShortcutGroup or OpentapsShortcut or a generic &amp;lt;T extends EntityInterface&amp;gt;) as parameters, and returns the given entity.&lt;br /&gt;
This method is called before display and is then free to modify any part of the entity like url, label which will then affect how it is displayed to the current user; and if the entity should not be displayed it can simply return null.&lt;br /&gt;
handlerParameter can then be used to provide data to a generic handler (like a complex permission to check, a view preference, etc ...)&lt;br /&gt;
&lt;br /&gt;
Example of handlers:&lt;br /&gt;
&lt;br /&gt;
* ''org.opentaps.warehouse.security.WarehouseSecurity.checkFacilityPermission'' : checks the current user permission on the current facility (as selected when entering the warehouse application) against the permission set in handlerParameter&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkSessionValueAbsent'' : checks if the user session does not contain the key specified by handlerParameter (or has a null value)&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkSessionValuePresent'' : checks if the user session contains the key specified by handlerParameter (has a non null value)&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkHasNoCart'' : check the current user session does not have a shopping cart&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkHasCart'' : check the current user session has a shopping cart&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkBoolean'' : check the current context has a value named by handlerParameter as a boolean True or a string Y/y&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkViewPreferenceForTab'' : check the current user view preference in the current tab; handlerParameter should contain 2 colon separated values: prefType:valueToCheck:default (eg: &amp;quot;MY_OR_TEAM_ACCOUNTS:MY_VALUES:TEAM_VALUES&amp;quot; checks if the MY_OR_TEAM_ACCOUNTS view preference is set to MY_VALUES, and use TEAM_VALUES as default if the view preference is empty)&lt;br /&gt;
&lt;br /&gt;
==Controller Injection==&lt;br /&gt;
&lt;br /&gt;
The '''ControllerInject''' entity allows to inject a controller xml file into another. Usually this is done to customize one of the existing application without modifying their controller file directly, and so keeping the customization isolated from the base code.&lt;br /&gt;
&lt;br /&gt;
The ''injectUrl'' field specify the url of the controller to inject, and ''injectIntoUrl'' the target controller.&lt;br /&gt;
&lt;br /&gt;
For example see the ''opentaps/controllerinjectex'' component, activate it by:&lt;br /&gt;
* add ''&amp;lt;load-component component-location=&amp;quot;controllerinjectex&amp;quot;/&amp;gt;'' in ''opentaps/component-load.xml''&lt;br /&gt;
&lt;br /&gt;
Then either mount is a normal webapp:&lt;br /&gt;
* uncomment the ''webapp'' definition in its ''ofbiz-component.xml''&lt;br /&gt;
* access ''/controllerinjectex/'' in a browser&lt;br /&gt;
&lt;br /&gt;
Or use the controller injection by:&lt;br /&gt;
* importing as seed data (in webtools import XML)&lt;br /&gt;
     &amp;lt;ControllerInjection injectUrl=&amp;quot;component://controllerinjectex/webapp/controllerinjectex/WEB-INF/controller.xml&amp;quot;&lt;br /&gt;
                       injectIntoUrl=&amp;quot;component://crmsfa/webapp/crmsfa/WEB-INF/controller.xml&amp;quot; sequenceNum=&amp;quot;99&amp;quot; /&amp;gt;&lt;br /&gt;
* access ''/crmsfa/control/echo'' in a browser&lt;br /&gt;
* note: ''opentaps/controllerinjectex/data/InjectData.xml'' also contains an example Shortcut which will be inserted in the crmsfa home tab shortcut group for access to this page&lt;br /&gt;
&lt;br /&gt;
Note that with injection its ''WEB-INF/web.xml'' is no longer needed.&lt;br /&gt;
&lt;br /&gt;
The result will be the same as the previous and more complex process:&lt;br /&gt;
# commenting the webapp to customize mount point in its ''ofbiz-component.xml''&lt;br /&gt;
# creating a webapp in the custom component (''WEB-INF/web.xml'' and mount point in the ''ofbiz-component.xml'', with the same name as the original webapp mount point)&lt;br /&gt;
# including the controller to customize (eg: ''component://crmsfa/webapp/crmsfa/WEB-INF/controller.xml'') in the custom component controller&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Customizing_opentaps_Applications&amp;diff=6986</id>
		<title>Customizing opentaps Applications</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Customizing_opentaps_Applications&amp;diff=6986"/>
		<updated>2011-02-08T13:39:47Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Controller Injection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Frequently you will need to customize opentaps applications, such as change the tabs or shortcuts at the top or add new screens.  Beginning with opentaps 1.5, you can make these changes without affecting the core opentaps code, making it easier for you to upgrade later when new versions of opentaps becomes available.  &lt;br /&gt;
&lt;br /&gt;
opentaps 1.5 supports the following new features to help you customize its applications:&lt;br /&gt;
* The tabs and shortcuts available are now stored in the database, so you can rearrange or change the user interface labels.&lt;br /&gt;
* Other user interface elements are also now defined in configuration database entities.&lt;br /&gt;
* You can &amp;quot;inject&amp;quot; new controller entries into opentaps applications, making it possible to load your screens and actions into an opentaps application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Webapp User Interface Database Entities==&lt;br /&gt;
&lt;br /&gt;
'''OpentapsWebApps''' : defines a webapp (eg: crmsfa, financials), they are listed in the top navigation menu.&lt;br /&gt;
* linkUrl should correspond to the home page of the application (eg: /crmsfa/control/main).&lt;br /&gt;
* shortName, description, applicationName, imageUrl and imageHoverUrl are used in the opentaps main home page (accessed at /opentaps)&lt;br /&gt;
* shortName is also used in top navigation menu as the link label&lt;br /&gt;
* sequenceNum is to specify the display order in the nvaigation menu and the opentaps main home page&lt;br /&gt;
&lt;br /&gt;
'''OpentapsWebAppTab''' : a webapp may have multiple tabs (eg: home, orders, accounts .. in crmsfa), they are listed as tabs in the webapp below the top navigation menu.&lt;br /&gt;
* uiLabel is the label of the tab, this can use a localized string when present in one of the localized resources, else will be displayed as is&lt;br /&gt;
* linkUrl can be just the request name in the application, or if isExternal is set to Y it will be used as is (eg: /opentaps, http://www.example.com/somewhere for external urls)&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
'''OpentapsShortcutGroup''' : a shortcut group is a small menu in the left column of the page with a title and a list of shortcuts (links)&lt;br /&gt;
* uiLabel is the label of the title of the group, this can use a localized string when present in one of the localized resources, else will be displayed as is. If left blank it defaults to the localized string &amp;quot;Shortcuts&amp;quot;&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
'''OpentapsShortcut''' : a link in a shortcut group&lt;br /&gt;
* uiLabel is the label of the shortcut, this can use a localized string when present in one of the localized resources, else will be displayed as is&lt;br /&gt;
* linkUrl can be just the request name in the application, or if isExternal is set to Y it will be used as is (eg: /opentaps, http://www.example.com/somewhere for external urls)&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
===String substitution===&lt;br /&gt;
&lt;br /&gt;
In OpentapsWebAppTab, OpentapsShortcutGroup and OpentapsShortcut the linkUrl and uiLabel supports automatic substitutions according to the current context so &amp;quot;${foo}&amp;quot; will be changed into the context value of &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Permission===&lt;br /&gt;
&lt;br /&gt;
OpentapsWebAppTab, OpentapsShortcutGroup and OpentapsShortcut all have the securityModule and securityAction fields to specify a basic permission the user must have in order to see the corresponding entity. eg: securityModule=&amp;quot;CRMSFA_CONTACTS&amp;quot; securityAction=&amp;quot;VIEW&amp;quot; for the contact tab.&lt;br /&gt;
&lt;br /&gt;
Note: this only affects the display on the page, not actual access control (yet).&lt;br /&gt;
&lt;br /&gt;
===Handlers===&lt;br /&gt;
&lt;br /&gt;
In some cases the basic permission will not be enough, or we need more control over what should actually be displayed or not. For this the handlerMethod and handlerParameter fields can be used.&lt;br /&gt;
&lt;br /&gt;
handlerMethod is java method that takes a context Map (Map&amp;lt;String, Object&amp;gt;) and the entity being checked (OpentapsWebAppTab or OpentapsShortcutGroup or OpentapsShortcut or a generic &amp;lt;T extends EntityInterface&amp;gt;) as parameters, and returns the given entity.&lt;br /&gt;
This method is called before display and is then free to modify any part of the entity like url, label which will then affect how it is displayed to the current user; and if the entity should not be displayed it can simply return null.&lt;br /&gt;
handlerParameter can then be used to provide data to a generic handler (like a complex permission to check, a view preference, etc ...)&lt;br /&gt;
&lt;br /&gt;
Example of handlers:&lt;br /&gt;
&lt;br /&gt;
* ''org.opentaps.warehouse.security.WarehouseSecurity.checkFacilityPermission'' : checks the current user permission on the current facility (as selected when entering the warehouse application) against the permission set in handlerParameter&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkSessionValueAbsent'' : checks if the user session does not contain the key specified by handlerParameter (or has a null value)&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkSessionValuePresent'' : checks if the user session contains the key specified by handlerParameter (has a non null value)&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkHasNoCart'' : check the current user session does not have a shopping cart&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkHasCart'' : check the current user session has a shopping cart&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkBoolean'' : check the current context has a value named by handlerParameter as a boolean True or a string Y/y&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkViewPreferenceForTab'' : check the current user view preference in the current tab; handlerParameter should contain 2 colon separated values: prefType:valueToCheck:default (eg: &amp;quot;MY_OR_TEAM_ACCOUNTS:MY_VALUES:TEAM_VALUES&amp;quot; checks if the MY_OR_TEAM_ACCOUNTS view preference is set to MY_VALUES, and use TEAM_VALUES as default if the view preference is empty)&lt;br /&gt;
&lt;br /&gt;
==Controller Injection==&lt;br /&gt;
&lt;br /&gt;
The '''ControllerInject''' entity allows to inject a controller xml file into another. Usually this is done to customize one of the existing application without modifying their controller file directly, and so keeping the customization isolated from the base code.&lt;br /&gt;
&lt;br /&gt;
The ''injectUrl'' field specify the url of the controller to inject, and ''injectIntoUrl'' the target controller.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ControllerInjection injectUrl=&amp;quot;component://controllerinjectex/webapp/controllerinjectex/WEB-INF/controller.xml&amp;quot;&lt;br /&gt;
                       injectIntoUrl=&amp;quot;component://crmsfa/webapp/crmsfa/WEB-INF/controller.xml&amp;quot; sequenceNum=&amp;quot;99&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The result will be the same as the previous and more complex process:&lt;br /&gt;
# commenting the webapp to customize mount point in its ''ofbiz-component.xml''&lt;br /&gt;
# creating a webapp in the custom component (''WEB-INF/web.xml'' and mount point in the ''ofbiz-component.xml'', with the same name as the original webapp mount point)&lt;br /&gt;
# including the controller to customize (eg: ''component://crmsfa/webapp/crmsfa/WEB-INF/controller.xml'') in the custom component controller&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Customizing_opentaps_Applications&amp;diff=6985</id>
		<title>Customizing opentaps Applications</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Customizing_opentaps_Applications&amp;diff=6985"/>
		<updated>2011-02-08T13:17:27Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Webapp User Interface Database Entities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Frequently you will need to customize opentaps applications, such as change the tabs or shortcuts at the top or add new screens.  Beginning with opentaps 1.5, you can make these changes without affecting the core opentaps code, making it easier for you to upgrade later when new versions of opentaps becomes available.  &lt;br /&gt;
&lt;br /&gt;
opentaps 1.5 supports the following new features to help you customize its applications:&lt;br /&gt;
* The tabs and shortcuts available are now stored in the database, so you can rearrange or change the user interface labels.&lt;br /&gt;
* Other user interface elements are also now defined in configuration database entities.&lt;br /&gt;
* You can &amp;quot;inject&amp;quot; new controller entries into opentaps applications, making it possible to load your screens and actions into an opentaps application.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Webapp User Interface Database Entities==&lt;br /&gt;
&lt;br /&gt;
'''OpentapsWebApps''' : defines a webapp (eg: crmsfa, financials), they are listed in the top navigation menu.&lt;br /&gt;
* linkUrl should correspond to the home page of the application (eg: /crmsfa/control/main).&lt;br /&gt;
* shortName, description, applicationName, imageUrl and imageHoverUrl are used in the opentaps main home page (accessed at /opentaps)&lt;br /&gt;
* shortName is also used in top navigation menu as the link label&lt;br /&gt;
* sequenceNum is to specify the display order in the nvaigation menu and the opentaps main home page&lt;br /&gt;
&lt;br /&gt;
'''OpentapsWebAppTab''' : a webapp may have multiple tabs (eg: home, orders, accounts .. in crmsfa), they are listed as tabs in the webapp below the top navigation menu.&lt;br /&gt;
* uiLabel is the label of the tab, this can use a localized string when present in one of the localized resources, else will be displayed as is&lt;br /&gt;
* linkUrl can be just the request name in the application, or if isExternal is set to Y it will be used as is (eg: /opentaps, http://www.example.com/somewhere for external urls)&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
'''OpentapsShortcutGroup''' : a shortcut group is a small menu in the left column of the page with a title and a list of shortcuts (links)&lt;br /&gt;
* uiLabel is the label of the title of the group, this can use a localized string when present in one of the localized resources, else will be displayed as is. If left blank it defaults to the localized string &amp;quot;Shortcuts&amp;quot;&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
'''OpentapsShortcut''' : a link in a shortcut group&lt;br /&gt;
* uiLabel is the label of the shortcut, this can use a localized string when present in one of the localized resources, else will be displayed as is&lt;br /&gt;
* linkUrl can be just the request name in the application, or if isExternal is set to Y it will be used as is (eg: /opentaps, http://www.example.com/somewhere for external urls)&lt;br /&gt;
* sequenceNum is to specify the display order&lt;br /&gt;
* securityModule, securityAction, handlerMethod, handlerParameter see below&lt;br /&gt;
&lt;br /&gt;
===String substitution===&lt;br /&gt;
&lt;br /&gt;
In OpentapsWebAppTab, OpentapsShortcutGroup and OpentapsShortcut the linkUrl and uiLabel supports automatic substitutions according to the current context so &amp;quot;${foo}&amp;quot; will be changed into the context value of &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Permission===&lt;br /&gt;
&lt;br /&gt;
OpentapsWebAppTab, OpentapsShortcutGroup and OpentapsShortcut all have the securityModule and securityAction fields to specify a basic permission the user must have in order to see the corresponding entity. eg: securityModule=&amp;quot;CRMSFA_CONTACTS&amp;quot; securityAction=&amp;quot;VIEW&amp;quot; for the contact tab.&lt;br /&gt;
&lt;br /&gt;
Note: this only affects the display on the page, not actual access control (yet).&lt;br /&gt;
&lt;br /&gt;
===Handlers===&lt;br /&gt;
&lt;br /&gt;
In some cases the basic permission will not be enough, or we need more control over what should actually be displayed or not. For this the handlerMethod and handlerParameter fields can be used.&lt;br /&gt;
&lt;br /&gt;
handlerMethod is java method that takes a context Map (Map&amp;lt;String, Object&amp;gt;) and the entity being checked (OpentapsWebAppTab or OpentapsShortcutGroup or OpentapsShortcut or a generic &amp;lt;T extends EntityInterface&amp;gt;) as parameters, and returns the given entity.&lt;br /&gt;
This method is called before display and is then free to modify any part of the entity like url, label which will then affect how it is displayed to the current user; and if the entity should not be displayed it can simply return null.&lt;br /&gt;
handlerParameter can then be used to provide data to a generic handler (like a complex permission to check, a view preference, etc ...)&lt;br /&gt;
&lt;br /&gt;
Example of handlers:&lt;br /&gt;
&lt;br /&gt;
* ''org.opentaps.warehouse.security.WarehouseSecurity.checkFacilityPermission'' : checks the current user permission on the current facility (as selected when entering the warehouse application) against the permission set in handlerParameter&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkSessionValueAbsent'' : checks if the user session does not contain the key specified by handlerParameter (or has a null value)&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkSessionValuePresent'' : checks if the user session contains the key specified by handlerParameter (has a non null value)&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkHasNoCart'' : check the current user session does not have a shopping cart&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkHasCart'' : check the current user session has a shopping cart&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkBoolean'' : check the current context has a value named by handlerParameter as a boolean True or a string Y/y&lt;br /&gt;
* ''org.opentaps.webapp.handlers.CommonHandlers.checkViewPreferenceForTab'' : check the current user view preference in the current tab; handlerParameter should contain 2 colon separated values: prefType:valueToCheck:default (eg: &amp;quot;MY_OR_TEAM_ACCOUNTS:MY_VALUES:TEAM_VALUES&amp;quot; checks if the MY_OR_TEAM_ACCOUNTS view preference is set to MY_VALUES, and use TEAM_VALUES as default if the view preference is empty)&lt;br /&gt;
&lt;br /&gt;
==Controller Injection==&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Configuring_Authorize.NET&amp;diff=6651</id>
		<title>Configuring Authorize.NET</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Configuring_Authorize.NET&amp;diff=6651"/>
		<updated>2010-08-26T18:21:00Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Testing Your Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Testing Your Setup ==&lt;br /&gt;
&lt;br /&gt;
[http://reseller.authorize.net/application/?id=5553974 Authorize.NET] is a payment gateway for processing credit card and e-check payments. It has a live server and a testing server.  Both servers behave in exactly the same way with the exception that the testing server does not  perform any real financial transactions.  Hence, the testing server should be used to do development work and to trial run Opentaps features such as order fulfillment to see how they behave.&lt;br /&gt;
&lt;br /&gt;
The testing server requires a testing account, which is distinct from a real account.  A testing account can be obtained from,&lt;br /&gt;
&lt;br /&gt;
http://developer.authorize.net/testaccount/&lt;br /&gt;
&lt;br /&gt;
Next, you will need to configure payment.properties for testing.  The following setup is recommended,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
payment.authorizedotnet.url=https://test.authorize.net/gateway/transact.dll&lt;br /&gt;
payment.authorizedotnet.trankey=   Transaction key of the testing account&lt;br /&gt;
payment.authorizedotnet.test=FALSE&lt;br /&gt;
payment.authorizedotnet.logging=TRUE&lt;br /&gt;
payment.authorizedotnet.login=     API Login key of the testing account&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The test parameter should be set to FALSE except for testing special things that will be described below.  Setting it to true will turn on Test Mode, which is a special state that prevents transaction IDs from being generated and affects both the live and testing server.  This is generally not useful, except in specific cases as we'll come to in the next section.  If unsure, always set test to FALSE.&lt;br /&gt;
&lt;br /&gt;
Then you will need to add the certificate from https://secure.authorize.net/ if you use production setup or https://test.authorize.net for testing setup.&lt;br /&gt;
&lt;br /&gt;
Go to that page with a navigator, then export the SSL certificate of the page.&lt;br /&gt;
Then on the server add it to your JDK default keystore:&lt;br /&gt;
&lt;br /&gt;
   cd $JAVA_HOME/jre/lib/security&lt;br /&gt;
   keytool -import -trustcacerts -file secure.authorize.net.cert -alias AUTHORIZE_NET -keystore cacerts&lt;br /&gt;
&lt;br /&gt;
=== Testing Specific Gateway Failures ===&lt;br /&gt;
&lt;br /&gt;
Suppose you wish to see what happens when there is an AVS address verification failure (code 27) that results in an authorization being declined.  We can trigger the test server to return this by using a special VISA credit card number '''4222222222222''' and an authorization amount equal to the error code ($27.00).  Because the CC validation code will not let you create this number, you'll have to create a CreditCard record by hand and a PaymentMethod for it.&lt;br /&gt;
&lt;br /&gt;
Make the following change to '''payment.properties''',&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    payment.authorizedotnet.test=TRUE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart opentaps and create an order with an offline payment.  Cancel the payment and add a new payment for the amount you want to test, in this example $27.  Opentaps will automatically authorize the payment, which should trigger the desired transaction error code 27,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    (TESTMODE) The transaction resulted in an AVS mismatch. The address provided does not match billing address of cardholder.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you're done, be sure to set '''payment.authorizedotnet.test''' back to '''FALSE'''.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6632</id>
		<title>Release Testing</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6632"/>
		<updated>2010-08-13T09:18:54Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Release Packaging */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Release Testing==&lt;br /&gt;
&lt;br /&gt;
These are some general tests, which should be performed prior to releases:&lt;br /&gt;
&lt;br /&gt;
* checkout opentaps from the SVN&lt;br /&gt;
&lt;br /&gt;
* Make sure that ant run-install works. &lt;br /&gt;
* Then check the basic functionality for doing the following:&lt;br /&gt;
** CRM - create leads, qualify them, convert them to accounts, create notes, opportunities, tasks, events&lt;br /&gt;
** Catalog - create new categories and products, make sure they show up on ecommerce&lt;br /&gt;
** ecommerce - see new products, sign up as new customer, place orders, see order history&lt;br /&gt;
** purchasing -- creating new supplier with contact information&lt;br /&gt;
** catalog - create purchasing information for supplier&lt;br /&gt;
** purchasing -- create purchase orders for product&lt;br /&gt;
** warehouse -- receive products on purchase orders, verify that the inventory in the warehouse has increased.&lt;br /&gt;
** warehouse - Pack &amp;amp; ship orders, verify that the inventory has decreased.&lt;br /&gt;
** warehouse -- create a production run for PROD_COST, schedule and confirm it, make sure that it shows up on the calendar, complete the production run, and make sure that the inventory for PROD_COST has increased and the inventory for MAT_A_COST and MAT_B_COST have decreased.&lt;br /&gt;
** Order - create sales and purchase orders&lt;br /&gt;
** Financials - see invoices and trial balances. Trial balances should always be equal on debit &amp;amp; credit.&lt;br /&gt;
&lt;br /&gt;
* Make sure ant run-tests works &lt;br /&gt;
&lt;br /&gt;
==Release Packaging==&lt;br /&gt;
&lt;br /&gt;
* from a fresh checkout, run ant run-install&lt;br /&gt;
* change the release version in framework/common/config/CommonUiLabels.xml&lt;br /&gt;
* make sure the GWT configuration is set to compile for all locals and all browser in opentaps-common/src/common/org/opentaps/gwt/common/common.gwt.xml&lt;br /&gt;
** uncomment all extend-property&lt;br /&gt;
** comment out &amp;lt;set-property name=&amp;quot;user.agent&amp;quot; ..&amp;gt;&lt;br /&gt;
* don't forget to regenerate the labels after that&lt;br /&gt;
* run ant (so the GWT modules are rebuilt)&lt;br /&gt;
* remove logs in runtime/logs&lt;br /&gt;
* make a zip file with the root directory which should be opentaps-{version} (for example opentaps-1.0.2). Also note that we do include the .svn directories in the release (pointing to the trunk).&lt;br /&gt;
* unzip the file and verify that the data has been installed&lt;br /&gt;
&lt;br /&gt;
'''Make sure your package contains the demo data installed in localderby database.'''&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6631</id>
		<title>Release Testing</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6631"/>
		<updated>2010-08-13T09:17:48Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Release Packaging */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Release Testing==&lt;br /&gt;
&lt;br /&gt;
These are some general tests, which should be performed prior to releases:&lt;br /&gt;
&lt;br /&gt;
* checkout opentaps from the SVN&lt;br /&gt;
&lt;br /&gt;
* Make sure that ant run-install works. &lt;br /&gt;
* Then check the basic functionality for doing the following:&lt;br /&gt;
** CRM - create leads, qualify them, convert them to accounts, create notes, opportunities, tasks, events&lt;br /&gt;
** Catalog - create new categories and products, make sure they show up on ecommerce&lt;br /&gt;
** ecommerce - see new products, sign up as new customer, place orders, see order history&lt;br /&gt;
** purchasing -- creating new supplier with contact information&lt;br /&gt;
** catalog - create purchasing information for supplier&lt;br /&gt;
** purchasing -- create purchase orders for product&lt;br /&gt;
** warehouse -- receive products on purchase orders, verify that the inventory in the warehouse has increased.&lt;br /&gt;
** warehouse - Pack &amp;amp; ship orders, verify that the inventory has decreased.&lt;br /&gt;
** warehouse -- create a production run for PROD_COST, schedule and confirm it, make sure that it shows up on the calendar, complete the production run, and make sure that the inventory for PROD_COST has increased and the inventory for MAT_A_COST and MAT_B_COST have decreased.&lt;br /&gt;
** Order - create sales and purchase orders&lt;br /&gt;
** Financials - see invoices and trial balances. Trial balances should always be equal on debit &amp;amp; credit.&lt;br /&gt;
&lt;br /&gt;
* Make sure ant run-tests works &lt;br /&gt;
&lt;br /&gt;
==Release Packaging==&lt;br /&gt;
&lt;br /&gt;
* from a fresh checkout, run ant run-install&lt;br /&gt;
* change the release version in framework/common/config/CommonUiLabels.xml&lt;br /&gt;
* make sure the GWT configuration is set to compile for all locals and all browser in opentaps-common/src/common/org/opentaps/gwt/common/common.gwt.xml&lt;br /&gt;
** uncomment all extend-property&lt;br /&gt;
** comment out &amp;lt;set-property name=&amp;quot;user.agent&amp;quot; ..&amp;gt;&lt;br /&gt;
* don't forget to regenerate the labels after that&lt;br /&gt;
* remove logs in runtime/logs&lt;br /&gt;
* make a zip file with the root directory which should be opentaps-{version} (for example opentaps-1.0.2). Also note that we do include the .svn directories in the release (pointing to the trunk).&lt;br /&gt;
* unzip the file and verify that the data has been installed&lt;br /&gt;
&lt;br /&gt;
'''Make sure your package contains the demo data installed in localderby database.'''&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6630</id>
		<title>Release Testing</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6630"/>
		<updated>2010-08-13T09:16:30Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Release Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Release Testing==&lt;br /&gt;
&lt;br /&gt;
These are some general tests, which should be performed prior to releases:&lt;br /&gt;
&lt;br /&gt;
* checkout opentaps from the SVN&lt;br /&gt;
&lt;br /&gt;
* Make sure that ant run-install works. &lt;br /&gt;
* Then check the basic functionality for doing the following:&lt;br /&gt;
** CRM - create leads, qualify them, convert them to accounts, create notes, opportunities, tasks, events&lt;br /&gt;
** Catalog - create new categories and products, make sure they show up on ecommerce&lt;br /&gt;
** ecommerce - see new products, sign up as new customer, place orders, see order history&lt;br /&gt;
** purchasing -- creating new supplier with contact information&lt;br /&gt;
** catalog - create purchasing information for supplier&lt;br /&gt;
** purchasing -- create purchase orders for product&lt;br /&gt;
** warehouse -- receive products on purchase orders, verify that the inventory in the warehouse has increased.&lt;br /&gt;
** warehouse - Pack &amp;amp; ship orders, verify that the inventory has decreased.&lt;br /&gt;
** warehouse -- create a production run for PROD_COST, schedule and confirm it, make sure that it shows up on the calendar, complete the production run, and make sure that the inventory for PROD_COST has increased and the inventory for MAT_A_COST and MAT_B_COST have decreased.&lt;br /&gt;
** Order - create sales and purchase orders&lt;br /&gt;
** Financials - see invoices and trial balances. Trial balances should always be equal on debit &amp;amp; credit.&lt;br /&gt;
&lt;br /&gt;
* Make sure ant run-tests works &lt;br /&gt;
&lt;br /&gt;
==Release Packaging==&lt;br /&gt;
&lt;br /&gt;
* from a fresh checkout, run ant run-install&lt;br /&gt;
* change the release version in framework/common/config/CommonUiLabels.xml&lt;br /&gt;
* make sure the GWT configuration is set to compile for all locals and all browser in &lt;br /&gt;
** uncomment all extend-property&lt;br /&gt;
** comment out &amp;lt;set-property name=&amp;quot;user.agent&amp;quot; ..&amp;gt;&lt;br /&gt;
* don't forget to regenerate the labels after that&lt;br /&gt;
* remove logs in runtime/logs&lt;br /&gt;
* make a zip file with the root directory which should be opentaps-{version} (for example opentaps-1.0.2). Also note that we do include the .svn directories in the release (pointing to the trunk).&lt;br /&gt;
* unzip the file and verify that the data has been installed&lt;br /&gt;
&lt;br /&gt;
'''Make sure your package contains the demo data installed in localderby database.'''&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6629</id>
		<title>Release Testing</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6629"/>
		<updated>2010-08-13T09:15:45Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Release Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Release Testing==&lt;br /&gt;
&lt;br /&gt;
These are some general tests, which should be performed prior to releases:&lt;br /&gt;
&lt;br /&gt;
* checkout opentaps from the SVN&lt;br /&gt;
&lt;br /&gt;
* Make sure that ant run-install works. &lt;br /&gt;
* Then check the basic functionality for doing the following:&lt;br /&gt;
** CRM - create leads, qualify them, convert them to accounts, create notes, opportunities, tasks, events&lt;br /&gt;
** Catalog - create new categories and products, make sure they show up on ecommerce&lt;br /&gt;
** ecommerce - see new products, sign up as new customer, place orders, see order history&lt;br /&gt;
** purchasing -- creating new supplier with contact information&lt;br /&gt;
** catalog - create purchasing information for supplier&lt;br /&gt;
** purchasing -- create purchase orders for product&lt;br /&gt;
** warehouse -- receive products on purchase orders, verify that the inventory in the warehouse has increased.&lt;br /&gt;
** warehouse - Pack &amp;amp; ship orders, verify that the inventory has decreased.&lt;br /&gt;
** warehouse -- create a production run for PROD_COST, schedule and confirm it, make sure that it shows up on the calendar, complete the production run, and make sure that the inventory for PROD_COST has increased and the inventory for MAT_A_COST and MAT_B_COST have decreased.&lt;br /&gt;
** Order - create sales and purchase orders&lt;br /&gt;
** Financials - see invoices and trial balances. Trial balances should always be equal on debit &amp;amp; credit.&lt;br /&gt;
&lt;br /&gt;
* Make sure ant run-tests works &lt;br /&gt;
&lt;br /&gt;
* make opentaps release package&lt;br /&gt;
** from a fresh checkout, run ant run-install&lt;br /&gt;
** change the release version in framework/common/config/CommonUiLabels.xml&lt;br /&gt;
** make sure the GWT configuration is set to compile for all locals and all browser in &lt;br /&gt;
*** uncomment all extend-property&lt;br /&gt;
*** comment out &amp;lt;set-property name=&amp;quot;user.agent&amp;quot; ..&amp;gt;&lt;br /&gt;
* don't forget to regenerate the labels after that&lt;br /&gt;
** remove logs in runtime/logs&lt;br /&gt;
** make a zip file with the root directory which should be opentaps-{version} (for example opentaps-1.0.2). Also note that we do include the .svn directories in the release (pointing to the trunk).&lt;br /&gt;
** unzip the file and verify that the data has been installed&lt;br /&gt;
&lt;br /&gt;
'''Make sure your package contains the demo data installed in localderby database.'''&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6628</id>
		<title>Release Testing</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Release_Testing&amp;diff=6628"/>
		<updated>2010-08-13T08:41:33Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Release Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Release Testing==&lt;br /&gt;
&lt;br /&gt;
These are some general tests, which should be performed prior to releases:&lt;br /&gt;
&lt;br /&gt;
* checkout opentaps from the SVN&lt;br /&gt;
&lt;br /&gt;
* Make sure that ant run-install works. &lt;br /&gt;
* Then check the basic functionality for doing the following:&lt;br /&gt;
** CRM - create leads, qualify them, convert them to accounts, create notes, opportunities, tasks, events&lt;br /&gt;
** Catalog - create new categories and products, make sure they show up on ecommerce&lt;br /&gt;
** ecommerce - see new products, sign up as new customer, place orders, see order history&lt;br /&gt;
** purchasing -- creating new supplier with contact information&lt;br /&gt;
** catalog - create purchasing information for supplier&lt;br /&gt;
** purchasing -- create purchase orders for product&lt;br /&gt;
** warehouse -- receive products on purchase orders, verify that the inventory in the warehouse has increased.&lt;br /&gt;
** warehouse - Pack &amp;amp; ship orders, verify that the inventory has decreased.&lt;br /&gt;
** warehouse -- create a production run for PROD_COST, schedule and confirm it, make sure that it shows up on the calendar, complete the production run, and make sure that the inventory for PROD_COST has increased and the inventory for MAT_A_COST and MAT_B_COST have decreased.&lt;br /&gt;
** Order - create sales and purchase orders&lt;br /&gt;
** Financials - see invoices and trial balances. Trial balances should always be equal on debit &amp;amp; credit.&lt;br /&gt;
&lt;br /&gt;
* Make sure ant run-tests works &lt;br /&gt;
* Change the release version in framework/common/config/CommonUiLabels.xml&lt;br /&gt;
* make sure the GWT configuration is set to compile for all locals and all browser in &lt;br /&gt;
** uncomment all extend-property&lt;br /&gt;
** comment out &amp;lt;set-property name=&amp;quot;user.agent&amp;quot; ..&amp;gt;&lt;br /&gt;
* don't forget to regenerate the labels after that&lt;br /&gt;
&lt;br /&gt;
* make opentaps release package&lt;br /&gt;
** from a fresh checkout, run ant run-install&lt;br /&gt;
** remove logs in runtime/logs&lt;br /&gt;
** make a zip file with the root directory which should be opentaps-{version} (for example opentaps-1.0.2). Also note that we do include the .svn directories in the release (pointing to the trunk).&lt;br /&gt;
** unzip the file and verify that the data has been installed&lt;br /&gt;
&lt;br /&gt;
'''Make sure your package contains the demo data installed in localderby database.'''&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=How_to_Use_Git:_a_Tutorial&amp;diff=6627</id>
		<title>How to Use Git: a Tutorial</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=How_to_Use_Git:_a_Tutorial&amp;diff=6627"/>
		<updated>2010-08-11T17:05:55Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Merge Request */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document is a work in progress.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==General Concepts==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] is a free open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency...once you learn how to use it.&lt;br /&gt;
&lt;br /&gt;
Git can be (more than) a little confusing at first when coming from a Subversion background.   Let's first try to compare subversion and git:&lt;br /&gt;
* it is '''distributed''': every ''checkout'' is actually a clone of the master repository, this means that there is no higher authority or single point of failure. Effectively every developer has it own repository with its own branches and own commits.&lt;br /&gt;
* because of that, it can also be describe as '''disconnected''': one does not need to access the master repository in order to commit, branch, merge or review the history.&lt;br /&gt;
* this makes all operations that would normally use the Subversion server  __usable__ (checking commit log, blame, branching and merging).&lt;br /&gt;
* it is '''storage efficient''': the Opentaps repository in Git including 1.0.0 / 1.4 / 1.0 and all the branches and tags takes around 900Mo, typically a SVN checkout of 1.4 alone would be more than 600M, multiply this be each branch and by each tag ...&lt;br /&gt;
&lt;br /&gt;
Probably one of the most important point is '''branching'''. Because Subversion branches are difficult to merge and expensive to create (one need to do a whole ''checkout'' to get a branch) they are mostly used as dead branches.&lt;br /&gt;
&lt;br /&gt;
In comparison, in Git branches are very easy to create and merge back.   In the git way of thinking, they are &amp;quot;free,&amp;quot; and because they are local they are actually used all the time. The reason why a complete Git repository of opentaps is only 900Mo instead of a few gigabyte is because they all share a lot of common content.&lt;br /&gt;
&lt;br /&gt;
Git branches are typically used for:&lt;br /&gt;
* local only configuration&lt;br /&gt;
* unit of work (tickets)&lt;br /&gt;
* client and sub projects&lt;br /&gt;
&lt;br /&gt;
=== Local Configuration Branch ===&lt;br /&gt;
&lt;br /&gt;
One of the first thing that we all do is the configuration of the database in `entityengine.xml`, and in subversion we have to lock the file else it ends up accidentally modified.&lt;br /&gt;
&lt;br /&gt;
In Git one could instead use a '''configuration''' branch.&lt;br /&gt;
&lt;br /&gt;
This branch can be considered a floating branch, because we want to apply it on top of whatever branch we are currently working on.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*-----[master]----[work]----[configuration]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unit of work Branch ===&lt;br /&gt;
&lt;br /&gt;
Let's say you want to work on a feature.  With git, You can create a branch for your feature, work on it, and then merge it back to the main branch.  A typical workflow is, from&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*-----[master]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a working branch:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*-----[master][1234-some-ticket]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make some commits, so your 1234-some-ticket branch advances further:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*-----[master]---[1234-some-ticket]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then push the branch on `origin` for review, and have the reviewer merge it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*-----o------[master]&lt;br /&gt;
      |                       &lt;br /&gt;
       \---[1234-some-ticket]&lt;br /&gt;
&lt;br /&gt;
master&amp;gt; git merge 1234-some-ticket&lt;br /&gt;
&lt;br /&gt;
*-----o-----------------------(1234 merged)[master]&lt;br /&gt;
      |                       |&lt;br /&gt;
       \---[1234-some-ticket]/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If we do not want the reviewer to do any conflict resolution and want to do it ourselves, we can merge the master into our 1234-some-ticket branch first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*-----o------[master]&lt;br /&gt;
      |                       &lt;br /&gt;
       \---[1234-some-ticket]&lt;br /&gt;
&lt;br /&gt;
1234-some-ticket&amp;gt; git merge master&lt;br /&gt;
&lt;br /&gt;
*-----o------[master]&lt;br /&gt;
      |             |&lt;br /&gt;
       \------------(master merged)[1234-some-ticket]&lt;br /&gt;
&amp;lt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that all of this do not mean that the branch has be local until ready, it can be pushed little by little.&lt;br /&gt;
&lt;br /&gt;
We can then push it back to the master.  This only produce one merge commit in the `master` branch per ticket / feature.&lt;br /&gt;
This makes it easier for third parties to follow.&lt;br /&gt;
&lt;br /&gt;
=== Client and Sub Projects ===&lt;br /&gt;
&lt;br /&gt;
Typically clients implementing opentaps or developers creating a project based on it use their own subversion repository created from a checkout of opentpas.  Luckily the architecture of opentaps allow them to only store a custom hot-deploy component, but sometimes this is still a bit limited and as we know they end up touching code outside of there own components.  Finally they sometimes request features / bug fixes that we implement in both our and their repository.&lt;br /&gt;
&lt;br /&gt;
Having the ability to clone our repository and branch it easily means that the changes they make are contained in their branch.  It also makes it easier for them to receive updates from the main opentaps repository. Finally, by setting up their repository as a new remote (eg: `client-origin`), you can have many clients in the same local repository (saving some disk space in the process).  All that is needed is an SSH access, which is much easier to setup than a SVN server.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*--o--o-----------------------------[origin/master]&lt;br /&gt;
   |  |                                 |     |&lt;br /&gt;
   |  |                                 |     |  &lt;br /&gt;
   |  \----------[client-origin1/client]-[merged]&lt;br /&gt;
   |                                    |&lt;br /&gt;
   |                                    |&lt;br /&gt;
    \---------[client-origin2/client]-[merged]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using Git==&lt;br /&gt;
&lt;br /&gt;
Now let's actually try to use git.&lt;br /&gt;
&lt;br /&gt;
===Getting the Code===&lt;br /&gt;
&lt;br /&gt;
First, let's take a look at the basic process of getting the code from git and making some local changes. Getting the code is a lot like subversion, at least on the surface.  You would use the &amp;lt;tt&amp;gt;git clone&amp;lt;/tt&amp;gt; command to pull the code from the remote repository to your local computer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git clone git://gitorious.org/opentaps/opentaps.git git-opentaps&lt;br /&gt;
Initialized empty Git repository in /Users/sichen/Documents/workspace/git-opentaps/.git/&lt;br /&gt;
remote: Counting objects: 78173, done.&lt;br /&gt;
remote: Compressing objects: 100% (14699/14699), done.&lt;br /&gt;
remote: Total 78173 (delta 57124), reused 77443 (delta 56698)&lt;br /&gt;
Receiving objects: 100% (78173/78173), 219.74 MiB | 303 KiB/s, done.&lt;br /&gt;
Resolving deltas: 100% (57124/57124), done.&lt;br /&gt;
Checking out files: 100% (15107/15107), done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, let's imagine that you modified a file, such as &amp;lt;tt&amp;gt;framework/entity/config/entityengine.xml&amp;lt;/tt&amp;gt;, and changed it to use mysql instead of the embedded Derby database. You can use &amp;lt;tt&amp;gt;git status&amp;lt;/tt&amp;gt; to get a list of the files that have been modified:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git status&lt;br /&gt;
# On branch master&lt;br /&gt;
# Changed but not updated:&lt;br /&gt;
#   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to update what will be committed)&lt;br /&gt;
#   (use &amp;quot;git checkout -- &amp;lt;file&amp;gt;...&amp;quot; to discard changes in working directory)&lt;br /&gt;
#&lt;br /&gt;
#	modified:   framework/entity/config/entityengine.xml&lt;br /&gt;
#&lt;br /&gt;
no changes added to commit (use &amp;quot;git add&amp;quot; and/or &amp;quot;git commit -a&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;git diff&amp;lt;/tt&amp;gt; will show you the actual modifications, or differences:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git diff&lt;br /&gt;
diff --git a/framework/entity/config/entityengine.xml b/framework/entity/config/entityengine.xml&lt;br /&gt;
index 652c6fc..d6d341e 100644&lt;br /&gt;
--- a/framework/entity/config/entityengine.xml&lt;br /&gt;
+++ b/framework/entity/config/entityengine.xml&lt;br /&gt;
@@ -51,7 +51,7 @@ access. For a detailed description see the core/docs/entityconfig.html file.&lt;br /&gt;
     &amp;lt;connection-factory class=&amp;quot;org.ofbiz.entity.connection.DBCPConnectionFactory&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;delegator name=&amp;quot;default&amp;quot; entity-model-reader=&amp;quot;main&amp;quot; entity-group-reader=&amp;quot;main&amp;quot; entity-eca-reader=&amp;quot;main&amp;quot; distributed-cache-clear-enabled=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
-        &amp;lt;group-map group-name=&amp;quot;org.ofbiz&amp;quot; datasource-name=&amp;quot;localderby&amp;quot;/&amp;gt;&lt;br /&gt;
+        &amp;lt;group-map group-name=&amp;quot;org.ofbiz&amp;quot; datasource-name=&amp;quot;localmysql&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;group-map group-name=&amp;quot;org.ofbiz.olap&amp;quot; datasource-name=&amp;quot;localderbyolap&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;group-map group-name=&amp;quot;org.opentaps.analytics&amp;quot; datasource-name=&amp;quot;analytics&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;group-map group-name=&amp;quot;org.opentaps.testing&amp;quot; datasource-name=&amp;quot;testing&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
etc. etc.&lt;br /&gt;
&lt;br /&gt;
===Updating===&lt;br /&gt;
&lt;br /&gt;
To bring your clone up to date with the remote main opentaps repository,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git fetch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will get updates from all the branches on the remote repository and pull them to your local clone. If you have created local branches from your remote branches, then you would need to update your local branches from the remote branches that were updated (see below):&lt;br /&gt;
&lt;br /&gt;
 $ git rebase origin/1447 1447&lt;br /&gt;
&lt;br /&gt;
If however your local branches have changes, git will complain:&lt;br /&gt;
 cannot rebase: you have unstaged changes&lt;br /&gt;
 M	framework/entity/config/entityengine.xml&lt;br /&gt;
&lt;br /&gt;
If that's the case, you will have to &amp;quot;stash&amp;quot; your changes for the moment:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git stash&lt;br /&gt;
$ git rebase origin/1447 1447&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Committing Your Changes===&lt;br /&gt;
&lt;br /&gt;
To commit your changes, you must first add the change files to the list of files to commit with &amp;lt;tt&amp;gt;git add&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git add opentaps/opentaps-common/src/common/org/opentaps/gwt/common/server/lookup/PartyLookupService.java&lt;br /&gt;
&lt;br /&gt;
This will move the file into the &amp;quot;Changes to be committed&amp;quot; list of files when you do your &amp;lt;tt&amp;gt;git status&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;git add&amp;lt;/tt&amp;gt; is recursive, so if you&lt;br /&gt;
 $ git add opentaps/search/src/&lt;br /&gt;
&lt;br /&gt;
It will add all files which are in subdirectories of &amp;lt;tt&amp;gt;opentaps/search/src/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have added your files, &amp;lt;tt&amp;gt;git commit&amp;lt;/tt&amp;gt; will allow you to save your changes, or &amp;quot;commit&amp;quot; them.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git commit -a&lt;br /&gt;
[master 4516382] Change configuration to use mysql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Here's the big difference:''' After you have committed your change, it is committed to your local clone, '''not''' to the master git repository of opentaps. This means that it is still available to you, and to anybody who makes a clone of your git repository, but not to anybody who is cloning the main opentaps repository.&lt;br /&gt;
&lt;br /&gt;
After you commit, you can get a history of your changes with &amp;lt;tt&amp;gt;git log&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git log framework/entity/config/entityengine.xml &lt;br /&gt;
commit 4516382fb3d17da5a2bdccd1942b01636ea08e4d&lt;br /&gt;
Author: si chen &amp;lt;sichen@si-chens-imac.gateway.2wire.net&amp;gt;&lt;br /&gt;
Date:   Tue Apr 13 11:32:56 2010 -0700&lt;br /&gt;
&lt;br /&gt;
    Change configuration to use mysql&lt;br /&gt;
&lt;br /&gt;
commit b5bf829383d261f7eb2e4c733568dbcce65868f7&lt;br /&gt;
Author: sparksun &amp;lt;sparksun@d3523486-f5fe-0310-a41a-a15a4e76f3c7&amp;gt;&lt;br /&gt;
Date:   Thu Jan 7 13:51:57 2010 +0000&lt;br /&gt;
&lt;br /&gt;
    #1315 add useOldAliasMetadataBehavior parameter in mysql jdbc url for avoid hibernate cannot find column view entity&lt;br /&gt;
    &lt;br /&gt;
    git-svn-id: svn://svn.opentaps.org/opentaps_all/versions/1.4/trunk@14503 d3523486-f5fe-0310-a41a-a15a4e76f3c7&lt;br /&gt;
&lt;br /&gt;
commit 6678504157a4234d051292a336bc623d83107ff2&lt;br /&gt;
Author: jwickers &amp;lt;jwickers@d3523486-f5fe-0310-a41a-a15a4e76f3c7&amp;gt;&lt;br /&gt;
Date:   Fri Nov 27 04:12:00 2009 +0000&lt;br /&gt;
&lt;br /&gt;
    Reset default entity config to use Derby&lt;br /&gt;
    &lt;br /&gt;
    git-svn-id: svn://svn.opentaps.org/opentaps_all/versions/1.4/trunk@14071 d3523486-f5fe-0310-a41a-a15a4e76f3c7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that unlike subversion, you can see a log of all the changes of the file even before your branch was created.&lt;br /&gt;
&lt;br /&gt;
===Reverting a Changed File===&lt;br /&gt;
&lt;br /&gt;
What if you want to revert your changes to a file and go back to the way it was on your local repository?  In git, you would use &amp;lt;tt&amp;gt;checkout&amp;lt;/tt&amp;gt;, like this:&lt;br /&gt;
 git checkout &amp;lt;file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Thanks to http://norbauer.com/notebooks/code/notes/git-revert-reset-a-single-file for this tip!&lt;br /&gt;
&lt;br /&gt;
===Your Stash===&lt;br /&gt;
&lt;br /&gt;
To see the changes you have stashed away,&lt;br /&gt;
 $ git stash list&lt;br /&gt;
&lt;br /&gt;
To see which files have been stashed away, use&lt;br /&gt;
 $ git stash show&lt;br /&gt;
&lt;br /&gt;
and to get it back out of the stash and apply the stashed away changes to your current working branch,&lt;br /&gt;
 $ git stash pop&lt;br /&gt;
&lt;br /&gt;
(Note its' better to &amp;lt;tt&amp;gt;git stash pop&amp;lt;/tt&amp;gt; than &amp;lt;tt&amp;gt;git stash apply&amp;lt;/tt&amp;gt;, or your temporary changes will stay around and accumulate until it's confusing.  In which case, you can &amp;lt;tt&amp;gt;git stash drop&amp;lt;/tt&amp;gt; to get rid of them all and start over again.)&lt;br /&gt;
&lt;br /&gt;
===Pushing Your Changes Up===&lt;br /&gt;
&lt;br /&gt;
To send your changes back up to the main opentaps git repository, you would need to do a&lt;br /&gt;
 $ git push git@gitorious.org:opentaps/opentaps.git&lt;br /&gt;
&lt;br /&gt;
To commit a branch other than the one you are currently on (see below), use&lt;br /&gt;
 $ git push git@gitorious.org:opentaps/opentaps.git name-of-branch&lt;br /&gt;
&lt;br /&gt;
If you get this error message:&lt;br /&gt;
 ! [rejected]        master -&amp;gt; master (non-fast-forward)&lt;br /&gt;
It means that your version is out of date, and you need to do a &amp;lt;tt&amp;gt;git fetch&amp;lt;/tt&amp;gt; to bring your version of the day first before pushing up your changes.&lt;br /&gt;
 Permission denied (publickey).&lt;br /&gt;
You need to upload your public key, usually &amp;lt;/tt&amp;gt;~/.ssh/id_rsa.pub&amp;lt;/tt&amp;gt;, to your profile on gitorious.&lt;br /&gt;
&lt;br /&gt;
===Branching===&lt;br /&gt;
&lt;br /&gt;
First let's take a look at what branches are available:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git branch -a&lt;br /&gt;
* master&lt;br /&gt;
  remotes/origin/HEAD -&amp;gt; origin/master&lt;br /&gt;
  remotes/origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The current branch you're on is the one marked with a &amp;quot;*&amp;quot;.  The branches which start with &amp;quot;/remotes/&amp;quot; are from remote locations, such as gitorious, where you cloned opentaps.  You can't really work with those.&lt;br /&gt;
&lt;br /&gt;
To create your own branch,&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git branch dataimport&lt;br /&gt;
$ git branch -a&lt;br /&gt;
  dataimport&lt;br /&gt;
* master&lt;br /&gt;
  remotes/origin/HEAD -&amp;gt; origin/master&lt;br /&gt;
  remotes/origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, to start working with your new branch, you need to switch to it.  '''The &amp;lt;tt&amp;gt;git checkout&amp;lt;/tt&amp;gt; command is actually for switching between branches, like &amp;lt;tt&amp;gt;svn switch&amp;lt;/tt&amp;gt;''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git checkout dataimport&lt;br /&gt;
Switched to branch 'dataimport'&lt;br /&gt;
$ git branch -a&lt;br /&gt;
* dataimport&lt;br /&gt;
  master&lt;br /&gt;
  remotes/origin/HEAD -&amp;gt; origin/master&lt;br /&gt;
  remotes/origin/master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's something else that will seem strange at first about branches in git: If you make changes but do not commit them, and then switch to a different branch, git will give you a diff against the other branch. So, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git checkout dataimport&lt;br /&gt;
$ vi my-file&lt;br /&gt;
# make some changes&lt;br /&gt;
$ git diff&lt;br /&gt;
# will show the changes you just made against your current branch, or dataimport&lt;br /&gt;
$ git checkout master&lt;br /&gt;
$ git diff&lt;br /&gt;
# will show the same changes, but now against the master branch you just switched to&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You would need to commit the changes to one branch or another. Then, when you switch between the branches with &amp;lt;tt&amp;gt;git checkout&amp;lt;/tt&amp;gt; or see a log of your committed changes with &amp;lt;tt&amp;gt;git log&amp;lt;/tt&amp;gt;, you will see the difference if you are on one branch versus another.&lt;br /&gt;
&lt;br /&gt;
===Deleting a Branch===&lt;br /&gt;
&lt;br /&gt;
If you need to get rid of a branch,&lt;br /&gt;
 $ git branch useless-branch&lt;br /&gt;
 $ git branch -d useless-branch&lt;br /&gt;
&lt;br /&gt;
===Copying Remote Branches===&lt;br /&gt;
&lt;br /&gt;
If you have multiple remote branches, so that&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git branch -a&lt;br /&gt;
* pro-master&lt;br /&gt;
  remotes/origin/1447&lt;br /&gt;
  remotes/origin/1474&lt;br /&gt;
  remotes/origin/1487&lt;br /&gt;
  remotes/origin/HEAD -&amp;gt; origin/pro-master&lt;br /&gt;
  remotes/origin/master&lt;br /&gt;
  remotes/origin/pro-master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should make a local branch which copies a remote branch first before working with it:&lt;br /&gt;
 $ git checkout -b 1447 origin/1447&lt;br /&gt;
&lt;br /&gt;
This will copy the &amp;lt;tt&amp;gt;origin/1447&amp;lt;/tt&amp;gt; branch to &amp;lt;tt&amp;gt;1447&amp;lt;/tt&amp;gt;:&lt;br /&gt;
$ git branch -a&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* 1447&lt;br /&gt;
  pro-master&lt;br /&gt;
  remotes/origin/1447&lt;br /&gt;
  remotes/origin/1474&lt;br /&gt;
  remotes/origin/1487&lt;br /&gt;
  remotes/origin/HEAD -&amp;gt; origin/pro-master&lt;br /&gt;
  remotes/origin/master&lt;br /&gt;
  remotes/origin/pro-master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otherwise, if you try to checkout to a remote branch directly, git will get confused:&lt;br /&gt;
 $ git checkout origin/1447&lt;br /&gt;
 $ git branch -a&lt;br /&gt;
 * (no branch)&lt;br /&gt;
   pro-master&lt;br /&gt;
   remotes/origin/1447&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
===Resetting to a Remote Branch===&lt;br /&gt;
&lt;br /&gt;
Sometimes the remote branch may actually &amp;quot;fall behind&amp;quot; your local branch, so that when you use &amp;lt;tt&amp;gt;git fetch&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;git rebase&amp;lt;/tt&amp;gt;, git could still not correctly mirror it. This might happen if you went back on the remote branch, for example to remove some bad commits, and then moved forward again. For example, this e-mail from git tells you that:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This update added new revisions after undoing existing revisions.  That is&lt;br /&gt;
to say, the old revision is not a strict subset of the new revision.  This&lt;br /&gt;
situation occurs when you --force push a change and generate a repository&lt;br /&gt;
containing something like this:&lt;br /&gt;
&lt;br /&gt;
 * -- * -- B -- O -- O -- O (e678fc2bb071e8d57d428a7c8cb25bc2cfbe28e5)&lt;br /&gt;
           \&lt;br /&gt;
            N -- N -- N (007ba5038c62421d458a02fb66889d271292a48f)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At other times, you may just want to get rid of all your local commits and go back to wherever the remote branch is right now, but &amp;lt;tt&amp;gt;git rebase&amp;lt;/tt&amp;gt; would just merge the changes from the remote branch to your local branch, and not get rid of your commits.&lt;br /&gt;
&lt;br /&gt;
In either case, you can solve the problem with a &amp;lt;tt&amp;gt;git reset&amp;lt;/tt&amp;gt;, for example:&lt;br /&gt;
 $ git reset --hard origin/1447&lt;br /&gt;
&lt;br /&gt;
Before doing this though, you could save your local branch in another branch first:&lt;br /&gt;
 $ git branch clone-my-1447-branch&lt;br /&gt;
 $ git reset --hard origin/1447&lt;br /&gt;
&lt;br /&gt;
and then later, if you ever need it back, you can always use &amp;lt;tt&amp;gt;git rebase&amp;lt;/tt&amp;gt;&lt;br /&gt;
 $ git rebase 1447 clone-my-1447-branch&lt;br /&gt;
&lt;br /&gt;
===Reversing Pushed Changes===&lt;br /&gt;
&lt;br /&gt;
Sometimes you or somebody else might have pushed changes accidentally to the remove repository. To get rid of them, first get a log or history of the push commits:&lt;br /&gt;
 $ git log&lt;br /&gt;
&lt;br /&gt;
Then, use &amp;lt;tt&amp;gt;git reset&amp;lt;/tt&amp;gt; to push back to a particular come it, identified by its SHA1 sequence from the log. For example:&lt;br /&gt;
 $ git reset --hard 6bb3dc30bc0c8fc36421474cf9376d658ee643aa&lt;br /&gt;
&lt;br /&gt;
Sometimes just the first few letters and numbers of the sequence, such as &amp;lt;tt&amp;gt;6bb3dc&amp;lt;/tt&amp;gt; would do.&lt;br /&gt;
&lt;br /&gt;
After you've done the reset, you need to push it back to the server. However, if you just pushed your branch, you will get an error message:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git push git@gitorious.org:opentaps/opentaps.git master&lt;br /&gt;
To git@gitorious.org:opentaps/opentaps.git&lt;br /&gt;
 ! [rejected]        master -&amp;gt; master (non-fast-forward)&lt;br /&gt;
error: failed to push some refs to 'git@gitorious.org:opentaps/opentaps.git'&lt;br /&gt;
To prevent you from losing history, non-fast-forward updates were rejected&lt;br /&gt;
Merge the remote changes before pushing again.  See the 'Note about&lt;br /&gt;
fast-forwards' section of 'git push --help' for details.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To really push it, you would need to add a &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; before your branch name:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git push git@gitorious.org:opentaps/opentaps.git +master&lt;br /&gt;
Total 0 (delta 0), reused 0 (delta 0)&lt;br /&gt;
=&amp;gt; Syncing Gitorious... [OK]&lt;br /&gt;
To git@gitorious.org:opentaps/opentaps.git&lt;br /&gt;
 + 6398f5f...6bb3dc3 master -&amp;gt; master (forced update)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixing Commits Which Have Not Been Pushed===&lt;br /&gt;
&lt;br /&gt;
If you have committed changes but have not pushed him yet, you have several ways of fixing them:&lt;br /&gt;
* git reset  --hard origin/xxx : you will lose all the local commits and changes in your current branch&lt;br /&gt;
* git commit --ammend : you can use the ammend flag to &amp;quot;fix&amp;quot; the previous commit&lt;br /&gt;
* git reset XXX : without --hard it only resets the branch marker, but keeps the changes, so you can recommit the changes in a different way or fix them / etc ..&lt;br /&gt;
* git rebase -i XXX : opens an editor with the list of commits from XXX to your current branch state and you can remove one of those commits / reorder them / merge some together / etc ..&lt;br /&gt;
&lt;br /&gt;
===Merging===&lt;br /&gt;
&lt;br /&gt;
You can merge the changes from branch into another by switching to the target branch first, then doing a &amp;lt;tt&amp;gt;git merge&amp;lt;/tt&amp;gt;.    If you want to get the changes from a remote branch, you should &amp;lt;tt&amp;gt;git fetch&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;git rebase&amp;lt;/tt&amp;gt; first. For example,&lt;br /&gt;
 $ git fetch&lt;br /&gt;
 $ git rebase origin/master master&lt;br /&gt;
 $ git checkout dataimport&lt;br /&gt;
 $ git merge master&lt;br /&gt;
&lt;br /&gt;
This sequence gets all the updates from the remote git server, then updates the local copy of the master branch from the remote one. Next, I switched over to the dataimport branch. Finally, I merged the changes from the master branch to the dataimport branch.&lt;br /&gt;
&lt;br /&gt;
Once you've done this, you may want to send the merged version of your local branch back to the remote repository. In that case, you must push again:&lt;br /&gt;
 $ git push dataimport&lt;br /&gt;
&lt;br /&gt;
Note that you do not need to commit first, because the merge happens on the local repository, so there are no uncommitted changes against the local repository.&lt;br /&gt;
&lt;br /&gt;
You can always undo a rebase&lt;br /&gt;
 $ git rebase --abort&lt;br /&gt;
&lt;br /&gt;
===Merge Request===&lt;br /&gt;
&lt;br /&gt;
Here's an example of something that would be a lot of work with subversion but almost trivial with git:&lt;br /&gt;
&lt;br /&gt;
 git pull git://gitorious.org/opentaps/opentaps.git refs/merge-requests/6&lt;br /&gt;
 git push git://gitorious.org/opentaps/opentaps.git&lt;br /&gt;
&lt;br /&gt;
I've just pulled a merge request from our gitorious repository, which are automatically merged into their branches in my local git repository, and then I pushed them back to gitorious.&lt;br /&gt;
&lt;br /&gt;
====Clean Merge Requests====&lt;br /&gt;
&lt;br /&gt;
Normally when working on a branch one would sometime have to merge the changes from the trunk into it in order to keep working on up-to-date code.&lt;br /&gt;
However when making a merge request this can result in a lot of those merges making the request harder to review.&lt;br /&gt;
&lt;br /&gt;
When possible, instead of merging the trunk into the working branch one could rebase the working branch on top of the trunk.&lt;br /&gt;
For example if the trunk (from gitorious) is ''master'' and the working branch is ''my-feature'' &lt;br /&gt;
&lt;br /&gt;
   git rebase master my-feature&lt;br /&gt;
&lt;br /&gt;
===Experimenting with Git===&lt;br /&gt;
&lt;br /&gt;
When you are first working with git, try this from any branch:&lt;br /&gt;
 $ git branch tmp&lt;br /&gt;
&lt;br /&gt;
This will copy it to a branch called &amp;lt;tt&amp;gt;tmp&amp;lt;/tt&amp;gt;.   You can then do whatever you want, such as&lt;br /&gt;
 $ git reset XXX --hard&lt;br /&gt;
&lt;br /&gt;
If later you decide that's not what you wanted, you can try to get it back with&lt;br /&gt;
 $ git reset --hard tmp&lt;br /&gt;
&lt;br /&gt;
Also, you can use&lt;br /&gt;
 $ git reflog&lt;br /&gt;
&lt;br /&gt;
to get a history.&lt;br /&gt;
&lt;br /&gt;
===Extracting Diff from History===&lt;br /&gt;
&lt;br /&gt;
To get historical changes from git, you can use &amp;lt;tt&amp;gt;git diff&amp;lt;/tt&amp;gt; like this:&lt;br /&gt;
 $ git diff 7cc3f0ce846952196dde68c62595f9 0069e2e46ad591bf4b7cf169d493b9&lt;br /&gt;
&lt;br /&gt;
This will produce a diff file which you can then use the &amp;lt;tt&amp;gt;patch&amp;lt;/tt&amp;gt; command to apply to other files. &lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;git diff&amp;lt;/tt&amp;gt; parameters are in opposite sequence of &amp;lt;tt&amp;gt;svn diff&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ svn diff &amp;lt;earlier&amp;gt;:&amp;lt;later&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is the same as&lt;br /&gt;
 $ git diff &amp;lt;later&amp;gt; &amp;lt;earlier&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Working with Additional Remote Repositories===&lt;br /&gt;
&lt;br /&gt;
The other neat thing about git is that you can add additional remote repositories. For example, you may have cloned your own repository, but then you want to merge in changes from opentaps, or merge some of your changes back against opentaps.   You can do this by adding the gitorious opentaps:&lt;br /&gt;
 $ git remote add gitorious git://gitorious.org/opentaps/opentaps.git &lt;br /&gt;
 $ git fetch -all&lt;br /&gt;
 ....&lt;br /&gt;
 From git://gitorious.org/opentaps/opentaps&lt;br /&gt;
 .... &lt;br /&gt;
 * [new branch]      master     -&amp;gt; gitorious/master&lt;br /&gt;
&lt;br /&gt;
Now if you check your branches, you will see that there is a new &amp;lt;tt&amp;gt;remotes/gitorious/master&amp;lt;/tt&amp;gt; branch:&lt;br /&gt;
 $ git branch -a&lt;br /&gt;
 ....&lt;br /&gt;
  remotes/gitorious/master&lt;br /&gt;
&lt;br /&gt;
To merge in from gitorious opentaps:&lt;br /&gt;
 $ git merge gitorious/master&lt;br /&gt;
&lt;br /&gt;
(That's it!)&lt;br /&gt;
&lt;br /&gt;
To merge back to opentaps, you need to create a patch file&lt;br /&gt;
 $ git diff -p gitorious/master origin/master&lt;br /&gt;
&lt;br /&gt;
or just the specified directories:&lt;br /&gt;
 $ git diff -p gitorious/master origin/master -- opentaps&lt;br /&gt;
 $ git diff -p gitorious/master origin/master -- opentaps/crmsfa opentaps/financials&lt;br /&gt;
&lt;br /&gt;
and use the patch file for merging.&lt;br /&gt;
&lt;br /&gt;
==Other Notes==&lt;br /&gt;
&lt;br /&gt;
===File Formats===&lt;br /&gt;
&lt;br /&gt;
With more frequent branching and merging, it's important that you keep file formats consistent and avoid Unix/Windows file differences.  Make sure your editor is set to use Unix line terminations (use LF instead or CRLF).  '''Before pushing to GIT, make sure your commit does not change the line terminations!'''  Use $ git diff, and you will see the diff change all the file instead of just the relevant part.&lt;br /&gt;
&lt;br /&gt;
If you are not sure about your editor you can also try to find the DOS2UNIX.EXE utility to set the proper formating.&lt;br /&gt;
&lt;br /&gt;
===Untracked Files===&lt;br /&gt;
&lt;br /&gt;
To get a list of files not tracked by git,&lt;br /&gt;
 $ git status&lt;br /&gt;
 &lt;br /&gt;
You can remove files which are not tracked by git with&lt;br /&gt;
 $ git clean -x -f -d&lt;br /&gt;
&lt;br /&gt;
It will remove all the untracked files and directories from your current directory.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
* http://git.or.cz/course/svn.html&lt;br /&gt;
* http://www-cs-students.stanford.edu/~blynn/gitmagic/ch01.html&lt;br /&gt;
* http://jonas.iki.fi/git_guides/HTML/git_guide/&lt;br /&gt;
* http://www.bitsun.com/documents/gittutorcn.htm&lt;br /&gt;
* http://wenku.baidu.com/view/a3490b22192e45361066f56a.html&lt;br /&gt;
* http://wiki.eclipse.org/EGit/User_Guide&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=How_To_Use_Monitoring_Agents&amp;diff=6408</id>
		<title>How To Use Monitoring Agents</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=How_To_Use_Monitoring_Agents&amp;diff=6408"/>
		<updated>2010-07-29T01:20:07Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Example: RPM Relic */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Most monitoring agents will need to be declared as arguments to the JVM.&lt;br /&gt;
In order to do that, dimply edit the ''startofbiz.sh'' (or .bat on windows) script and replace the following:&lt;br /&gt;
&lt;br /&gt;
   VMARGS=&amp;quot;$MEMIF $MISC $DEBUG $RMIIF $ADMIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
By:&lt;br /&gt;
&lt;br /&gt;
   MONITORING=&amp;quot;the agent parameters&amp;quot;&lt;br /&gt;
   VMARGS=&amp;quot;$MEMIF $MISC $DEBUG $RMIIF $ADMIN $MONITORING&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example: JConsole ===&lt;br /&gt;
&lt;br /&gt;
http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html&lt;br /&gt;
&lt;br /&gt;
   MONITORING=&amp;quot;-Dcom.sun.management.jmxremote&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Then start Opentaps with the ''startofbiz.sh'' script and use ''JDK_HOME/bin/jconsole'' to connect to the opentaps JVM and start monitoring.&lt;br /&gt;
&lt;br /&gt;
=== Example: RPM Relic ===&lt;br /&gt;
&lt;br /&gt;
http://rpm.newrelic.com&lt;br /&gt;
&lt;br /&gt;
First download the zip file containing the jar and download the YML file (available on the same page). Unzip the zip file and put the YML file in the same directory.&lt;br /&gt;
&lt;br /&gt;
   MONITORING=&amp;quot;-javaagent:/full/path/to/newrelic.jar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Then start Opentaps with the ''startofbiz.sh'' and you should start receiving data on their dashboard.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Technical_Reference&amp;diff=6202</id>
		<title>Opentaps Technical Reference</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Technical_Reference&amp;diff=6202"/>
		<updated>2010-06-04T00:28:47Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* General Information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Technical Reference==&lt;br /&gt;
&lt;br /&gt;
''These documents are for developers who plan on customizing or extending opentaps''&lt;br /&gt;
&lt;br /&gt;
===General Information===&lt;br /&gt;
&lt;br /&gt;
* [[opentaps Release Process]]&lt;br /&gt;
* [[BPM Integration|SOA and BPM]]&lt;br /&gt;
* [[Importing Data with Dataimport]]&lt;br /&gt;
* [[opentaps Coding Standards]]&lt;br /&gt;
* [[opentaps User Interface Guidelines]]&lt;br /&gt;
* [[Managing Customizations with Upgrades]]&lt;br /&gt;
* [[How to Use Git: a Tutorial]]&lt;br /&gt;
* [[How To Use Monitoring Agents]]&lt;br /&gt;
&lt;br /&gt;
===Developer Documentation===&lt;br /&gt;
&lt;br /&gt;
* [[Technical Highlights of opentaps 1.4]]&lt;br /&gt;
* [http://www.opensourcestrategies.com/ofbiz/tutorials.php ofbiz framework tutorials] &lt;br /&gt;
* [[Domain Driven Architecture]]&lt;br /&gt;
* [[Using the Query Tool]]&lt;br /&gt;
* [[Base Entity Classes]]&lt;br /&gt;
* [[POJO Service Engine]]&lt;br /&gt;
* [[Java Wrapper for OFBiz Services]]&lt;br /&gt;
* [[Java Classes for Constants]]&lt;br /&gt;
* [[Managing Your Configuration Files]]&lt;br /&gt;
* [[Unit Testing]]&lt;br /&gt;
* [[Selenium UI Testing]]&lt;br /&gt;
* [[Working with the Domain Driven Architecture]]&lt;br /&gt;
* [[opentaps Hibernate Integration]]&lt;br /&gt;
* [[opentaps Search Feature]]&lt;br /&gt;
* [[How to use the opentaps Form Macros]]&lt;br /&gt;
* [[opentaps Ajax Pagination Framework]]&lt;br /&gt;
* [[Screen Widget Actions in Java]]&lt;br /&gt;
* [[Writing an ofbiz Container]]&lt;br /&gt;
* [[Checkstyle development tool]]&lt;br /&gt;
* [[Aspect Oriented Programming in opentaps]]&lt;br /&gt;
* [[Optimizations in Javascripts and CSS files]]&lt;br /&gt;
* [[How to Use Java BigDecimal: A Tutorial]]&lt;br /&gt;
&lt;br /&gt;
==== opentaps and Google Web Toolkit ====&lt;br /&gt;
* [[Introduction to Google Web Toolkit (GWT)]]&lt;br /&gt;
* [[opentaps Google Web Toolkit]]&lt;br /&gt;
* [[Debugging GWT with Firebug]]&lt;br /&gt;
* [[Creating a Widget with Google Web Toolkit and opentaps]]&lt;br /&gt;
&lt;br /&gt;
===Tips and Tricks===&lt;br /&gt;
* [[Creating and Applying Patches]]&lt;br /&gt;
* [[Extending opentaps]]&lt;br /&gt;
* [[Working with SSL]]&lt;br /&gt;
* [[Avoiding Database Deadlocks]]&lt;br /&gt;
* [[Database Tips]]&lt;br /&gt;
* Source Code Repository Management:&lt;br /&gt;
** [[SVN Tips]]&lt;br /&gt;
** [[How to use SVK]]&lt;br /&gt;
* [[Trac Tips]]&lt;br /&gt;
* [[CSS Display Bugs in IE]]&lt;br /&gt;
* [[Performance Analysis and Troubleshooting]]&lt;br /&gt;
* [[Running Tsung against opentaps server]]&lt;br /&gt;
* [[Solving the error unable to rename old file FOO to temporary file on Windows]]&lt;br /&gt;
&lt;br /&gt;
===API and Technical Design Reference===&lt;br /&gt;
* [http://www.opentaps.org/javadocs opentaps JavaDocs]&lt;br /&gt;
* [[LiveCatalog XML-RPC API]]&lt;br /&gt;
* [[Amazon Integration]]&lt;br /&gt;
* [[Manufacturing Model]]&lt;br /&gt;
* [[Configuring the POS Store]]&lt;br /&gt;
* [[Configuring Authorize.NET]]&lt;br /&gt;
* [[Implementing CVV Security Code Checking]]&lt;br /&gt;
&lt;br /&gt;
==opentaps Architecture==&lt;br /&gt;
* [[Examples of Modularity]]&lt;br /&gt;
&lt;br /&gt;
==Recommended Reading==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Show me your flowcharts and conceal your tables, and I'll continue to be mystified. &lt;br /&gt;
Show me your tables, and I won't usually need your flowcharts; they'll be obvious.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-- [http://www.amazon.com/exec/obidos/redirect?tag=opensourcestr-20&amp;amp;path=ASIN/0201835959 The Mythical Man Month by Fred Brooks]&lt;br /&gt;
&lt;br /&gt;
Even after four decades, and long after the word &amp;quot;flowchart&amp;quot; has been replaced by &amp;quot;UML&amp;quot;, data models still play a central role in software design.  The following three books will give you three different perspectives on data modeling for enterprise applications and help you understand the heart of opentaps.  You should read all three to get a balanced perspective:&lt;br /&gt;
* [http://www.amazon.com/exec/obidos/redirect?tag=opensourcestr-20&amp;amp;path=ASIN/0471380237 Data Model Resource Book, Volume 1.] -- This comprehensive volume and approaches it from a relational perspective for transactional systems.&lt;br /&gt;
* [http://www.amazon.com/exec/obidos/redirect?tag=opensourcestr-20&amp;amp;path=ASIN/0321125215 Domain Driven Design] -- This book approaches the design of transactional applications from an object-oriented perspective.&lt;br /&gt;
* [http://www.amazon.com/exec/obidos/redirect?tag=opensourcestr-20&amp;amp;path=ASIN/0471200247 Data Warehouse Toolkit] -- This book gives a comprehensive treatment from the analytical perspective.&lt;br /&gt;
&lt;br /&gt;
Other helpful references:&lt;br /&gt;
* [http://www.amazon.com/exec/obidos/redirect?tag=opensourcestr-20&amp;amp;path=ASIN/0131487876 Opentaps Source Licensing] -- If you want to learn more about open source software licenses, read this book instead of all the mailing list graffiti.&lt;br /&gt;
* [http://www.amazon.com/exec/obidos/redirect?tag=opensourcestr-20&amp;amp;path=ASIN/0321344758 Don't Make Me Think], or I will hate your user interface.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=How_To_Use_Monitoring_Agents&amp;diff=6200</id>
		<title>How To Use Monitoring Agents</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=How_To_Use_Monitoring_Agents&amp;diff=6200"/>
		<updated>2010-06-04T00:27:34Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: New page: Most monitoring agents will need to be declared as arguments to the JVM. In order to do that, dimply edit the ''startofbiz.sh'' (or .bat on windows) script and replace the following:     V...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Most monitoring agents will need to be declared as arguments to the JVM.&lt;br /&gt;
In order to do that, dimply edit the ''startofbiz.sh'' (or .bat on windows) script and replace the following:&lt;br /&gt;
&lt;br /&gt;
   VMARGS=&amp;quot;$MEMIF $MISC $DEBUG $RMIIF $ADMIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
By:&lt;br /&gt;
&lt;br /&gt;
   MONITORING=&amp;quot;the agent parameters&amp;quot;&lt;br /&gt;
   VMARGS=&amp;quot;$MEMIF $MISC $DEBUG $RMIIF $ADMIN $MONITORING&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example: JConsole ===&lt;br /&gt;
&lt;br /&gt;
http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html&lt;br /&gt;
&lt;br /&gt;
   MONITORING=&amp;quot;-Dcom.sun.management.jmxremote&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Then start Opentaps with the ''startofbiz.sh'' script and use ''JDK_HOME/bin/jconsole'' to connect to the opentaps JVM and start monitoring.&lt;br /&gt;
&lt;br /&gt;
=== Example: RPM Relic ===&lt;br /&gt;
&lt;br /&gt;
http://rpm.newrelic.com&lt;br /&gt;
&lt;br /&gt;
First download the zip file containing both the jar and yml files, and unzip it in a directory.&lt;br /&gt;
&lt;br /&gt;
   MONITORING=&amp;quot;-javaagent:/full/path/to/newrelic.jar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Then start Opentaps with the ''startofbiz.sh'' and you should start receiving data on their dashboard.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=How_To_Use_Monitoring_Agents&amp;diff=6201</id>
		<title>How To Use Monitoring Agents</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=How_To_Use_Monitoring_Agents&amp;diff=6201"/>
		<updated>2010-06-04T00:27:34Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: Protected &amp;quot;How To Use Monitoring Agents&amp;quot;: Sysop page [edit=sysop:move=sysop]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Most monitoring agents will need to be declared as arguments to the JVM.&lt;br /&gt;
In order to do that, dimply edit the ''startofbiz.sh'' (or .bat on windows) script and replace the following:&lt;br /&gt;
&lt;br /&gt;
   VMARGS=&amp;quot;$MEMIF $MISC $DEBUG $RMIIF $ADMIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
By:&lt;br /&gt;
&lt;br /&gt;
   MONITORING=&amp;quot;the agent parameters&amp;quot;&lt;br /&gt;
   VMARGS=&amp;quot;$MEMIF $MISC $DEBUG $RMIIF $ADMIN $MONITORING&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example: JConsole ===&lt;br /&gt;
&lt;br /&gt;
http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html&lt;br /&gt;
&lt;br /&gt;
   MONITORING=&amp;quot;-Dcom.sun.management.jmxremote&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Then start Opentaps with the ''startofbiz.sh'' script and use ''JDK_HOME/bin/jconsole'' to connect to the opentaps JVM and start monitoring.&lt;br /&gt;
&lt;br /&gt;
=== Example: RPM Relic ===&lt;br /&gt;
&lt;br /&gt;
http://rpm.newrelic.com&lt;br /&gt;
&lt;br /&gt;
First download the zip file containing both the jar and yml files, and unzip it in a directory.&lt;br /&gt;
&lt;br /&gt;
   MONITORING=&amp;quot;-javaagent:/full/path/to/newrelic.jar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Then start Opentaps with the ''startofbiz.sh'' and you should start receiving data on their dashboard.&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Upgrading_from_opentaps_1.0_to_opentaps_1.4&amp;diff=5619</id>
		<title>Upgrading from opentaps 1.0 to opentaps 1.4</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Upgrading_from_opentaps_1.0_to_opentaps_1.4&amp;diff=5619"/>
		<updated>2010-03-04T16:07:16Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: /* Data Changes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Data Changes ==&lt;br /&gt;
&lt;br /&gt;
* Configuration of GL accounts for invoice writeoffs have been changed.  Instead of using &amp;lt;tt&amp;gt;GlAccountTypeDefault&amp;lt;/tt&amp;gt;, they are now configured with &amp;lt;tt&amp;gt;InvoiceAdjustmentGlAccount&amp;lt;/tt&amp;gt; with the adjustment type &amp;quot;WRITEOFF&amp;quot;&lt;br /&gt;
* If you have custom UI labels, they may be loaded by adding them to &amp;lt;tt&amp;gt;LabelConfiguration.properties&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;opentaps-common/config/&amp;lt;/tt&amp;gt;&lt;br /&gt;
** If previously you were using &amp;lt;tt&amp;gt;UtilMessage.registerLabelMap()&amp;lt;/tt&amp;gt; to load custom labels, you may now remove all calls to this function as it is no longer needed.&lt;br /&gt;
* Run the upgrade SQL script in hot-deploy/opentaps-common/scripts/sql for the following:&lt;br /&gt;
** &amp;lt;tt&amp;gt;ProductAverageCost&amp;lt;/tt&amp;gt; has been re-factored to use a single productAverageCostId as its primary key.  The script will alter the table and automatically fill in its values and update &amp;lt;tt&amp;gt;SequenceValueItem&amp;lt;/tt&amp;gt; so that opentaps will generate correct future keys.&lt;br /&gt;
* Add the following to your custom component's build.xml:&lt;br /&gt;
   &amp;lt;fileset dir=&amp;quot;${ofbiz.dir}/hot-deploy/opentaps-common/lib&amp;quot; includes=&amp;quot;*.jar&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;fileset dir=&amp;quot;${ofbiz.dir}/hot-deploy/opentaps-common/lib/hibernate&amp;quot; includes=&amp;quot;*.jar&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Rebuild opentaps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ant&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Run the ant import ext seed in command window: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ant run-install-extseed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start opentaps&lt;br /&gt;
&lt;br /&gt;
* Run the following services to set summary fields:&lt;br /&gt;
** &amp;lt;tt&amp;gt;recalcAllEmptyAmountsPayments&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;recalcAllEmptyAmountsInvoices&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;updatePostedAmountAcctgTrans&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Run the service to populate primary contact data for all parties:&lt;br /&gt;
** &amp;lt;tt&amp;gt;opentaps.setSupplementalDataForAllParties&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Run the following service to create hibernate search index files:&lt;br /&gt;
** &amp;lt;tt&amp;gt;opentaps.createHibernateSearchIndex&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Coding Changes ==&lt;br /&gt;
&lt;br /&gt;
Changes in the ofbiz framework would require the following changes to your code:&lt;br /&gt;
&lt;br /&gt;
=== URL Parameter Security ===&lt;br /&gt;
&lt;br /&gt;
You can no longer pass parameters to a service request directly in the URL.  These requests must be part of a POST form.  To make buttons work as before, you need to change them to forms and then activate them with javascript.  For example, in earlier versions, you could have a button to delete a lead like this:&lt;br /&gt;
  &amp;lt;#assign update_options = update_options + &amp;quot;&amp;lt;a class='subMenuButtonDangerous' &lt;br /&gt;
           href='deleteLead?leadPartyId=&amp;quot; + partySummary.partyId + &amp;quot;'&amp;gt;&amp;quot; + uiLabelMap.CommonDelete + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;  /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In opentaps 1.4, you must do it this way:&lt;br /&gt;
   &amp;lt;form name=&amp;quot;deleteLeadForm&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;@ofbizUrl&amp;gt;deleteLead&amp;lt;/@ofbizUrl&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;@inputHidden name=&amp;quot;leadPartyId&amp;quot; value=&amp;quot;${partySummary.partyId}&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/form&amp;gt;&lt;br /&gt;
   &amp;lt;#assign update_options = update_options + &amp;quot;&amp;lt;a class='subMenuButtonDangerous' &lt;br /&gt;
            href='javascript:document.deleteLeadForm.submit()'&amp;gt;&amp;quot; + uiLabelMap.CommonDelete + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;  /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For your convenience, there is also a new macro to do this (see ''form'' and ''submitFormLink'' in opentapsFormMacro.ftl):&lt;br /&gt;
   &amp;lt;@form name=&amp;quot;deleteLeadForm&amp;quot; url=&amp;quot;deleteLead&amp;quot; leadPartyId=partySummary.partyId /&amp;gt;&lt;br /&gt;
   &amp;lt;#assign update_options&amp;gt;${update_options}&amp;lt;@submitFormLink form=&amp;quot;deleteLeadForm&amp;quot; text=uiLabelMap.CommonDelete class=&amp;quot;subMenuButtonDangerous&amp;quot; /&amp;gt;&amp;lt;/#assign&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ''form'' macro makes hidden inputs for all parameters (except ''name'', ''url'' and ''method'' that are used to define the form element itself), and also accept nested elements for more complex cases.&lt;br /&gt;
&lt;br /&gt;
For the cases where a form has to be used for multiple items, for example when you have an Update form block which must include multiple remove links, instead of writing a JavaScript handler which passes the item Ids to the form before submitting, you can do:&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;@form name=&amp;quot;removeReturnItemAction&amp;quot; url=&amp;quot;removeReturnItem&amp;quot; returnId=returnId returnItemSeqId=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;@form name=&amp;quot;updateReturnItemsAction&amp;quot; url=&amp;quot;updateReturnItems&amp;quot; returnId=returnId&amp;gt;&lt;br /&gt;
     &amp;lt;#list returnItems as item&amp;gt;&lt;br /&gt;
       &amp;lt;!-- some editable fields for the updateReturnItems form --&amp;gt;&lt;br /&gt;
      &amp;lt;@submitFormLinkConfirm form=&amp;quot;removeReturnItemAction&amp;quot; text=uiLabelMap.CommonRemove returnItemSeqId=item.returnItemSeqId /&amp;gt;&lt;br /&gt;
     &amp;lt;/#list&amp;gt;&lt;br /&gt;
   &amp;lt;/@form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also the new ''selectActionForm'' and ''actionForm'' can be used with ''form'' to define a drop-down menu where when an item (''actionForm'') is selected it submits the corresponding ''form'':&lt;br /&gt;
   &amp;lt;@form name=&amp;quot;deleteLeadForm&amp;quot; url=&amp;quot;deleteLead&amp;quot; leadPartyId=partySummary.partyId /&amp;gt;&lt;br /&gt;
   &amp;lt;@form ... /&amp;gt;&lt;br /&gt;
   &amp;lt;@selectActionForm name=&amp;quot;leadActions&amp;quot; prompt=&amp;quot;${uiLabelMap.CommonSelectOne}&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;@actionForm form=&amp;quot;deleteLeadForm&amp;quot; text=&amp;quot;${uiLabelMap.CommonDelete}&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;@actionForm .../&amp;gt;&lt;br /&gt;
   &amp;lt;@selectAction/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Service and HTML inputs ===&lt;br /&gt;
&lt;br /&gt;
As a security feature, the services will filter any input with HTML by default. Some services still require HTML (like emails or templates services) and to allow that there is a new ''allow-html'' parameter. For example:&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;attribute name=&amp;quot;content&amp;quot; type=&amp;quot;String&amp;quot; mode=&amp;quot;IN&amp;quot; optional=&amp;quot;false&amp;quot; allow-html=&amp;quot;safe&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;override name=&amp;quot;mergeFormText&amp;quot; allow-html=&amp;quot;safe&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Form Widget Changes ===&lt;br /&gt;
&lt;br /&gt;
Form widget URL parameters should be specified with &amp;lt;tt&amp;gt;parameter&amp;lt;/tt&amp;gt; tag now, instead of in the URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-            &amp;lt;hyperlink description=&amp;quot;${contactListName} (${contactListId})&amp;quot; target=&amp;quot;viewContactList?contactListId=${contactListId}&amp;quot;&amp;gt;&lt;br /&gt;
+            &amp;lt;hyperlink description=&amp;quot;${contactListName} (${contactListId})&amp;quot; target=&amp;quot;viewContactList&amp;quot;&amp;gt;&lt;br /&gt;
+                &amp;lt;parameter param-name=&amp;quot;contactListId&amp;quot; from-field=&amp;quot;contactListId&amp;quot;/&amp;gt;&lt;br /&gt;
             &amp;lt;/hyperlink&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Do not have it both in the URL and as a &amp;lt;tt&amp;gt;parameter&amp;lt;/tt&amp;gt;, or the parameter will be on the form twice and be passed incorrectly.&lt;br /&gt;
&lt;br /&gt;
=== Controller redirects ===&lt;br /&gt;
&lt;br /&gt;
Redirects have been changed, now ''request-redirect'' will only copy the parameters that were in the URL string by default. To forward posted or service output parameter, use the ''redirect-parameter'' elements (one per parameter).&lt;br /&gt;
   &amp;lt;response name=&amp;quot;success&amp;quot; type=&amp;quot;request-redirect&amp;quot; value=&amp;quot;viewAccount&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;redirect-parameter name=&amp;quot;partyId&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/response&amp;gt;&lt;br /&gt;
Also ''request-redirect-filter-param'' is now considered deprecated.&lt;br /&gt;
&lt;br /&gt;
=== Js dateTime format ===&lt;br /&gt;
&lt;br /&gt;
Js dataTime format in ftl have been changed, now the format will return html encode string which will cause the parse exception, you should use StringUtil.wrapString to avoid this issue. For example, in earlier versions, you could have define a js dataTime format variable like this:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;#assign dateFormat = Static[&amp;quot;org.opentaps.common.util.UtilDate&amp;quot;].getJsDateTimeFormat(Static[&amp;quot;org.opentaps.common.util.UtilDate&amp;quot;].getDateFormat(locale))/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In opentaps 1.4, you must do it this way:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;#assign dateFormat = StringUtil.wrapString(Static[&amp;quot;org.opentaps.common.util.UtilDate&amp;quot;].getJsDateTimeFormat(Static[&amp;quot;org.opentaps.common.util.UtilDate&amp;quot;].getDateFormat(locale)))/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BSH embedded in Forms ===&lt;br /&gt;
&lt;br /&gt;
In Forms widgets you could embed bsh code in order to have more flexibility over the formatting. Those embedded scripts need to be changed to groovy to avoid classpath issues. Fortunately this is as simple as changing the ''${bsh:'' to ''${groovy:''&lt;br /&gt;
&lt;br /&gt;
For example, in earlier versions, you could transform a party Id into the whole party name:&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;field name=&amp;quot;partyId&amp;quot; title=&amp;quot;${uiLabelMap.ProductSupplier}&amp;quot;&amp;gt; &lt;br /&gt;
     &amp;lt;display description=&amp;quot;${bsh:org.ofbiz.party.party.PartyHelper.getPartyName(delegator, partyId, false)} (${partyId})&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In opentaps 1.4, you must change it to:&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;field name=&amp;quot;partyId&amp;quot; title=&amp;quot;${uiLabelMap.ProductSupplier}&amp;quot;&amp;gt; &lt;br /&gt;
     &amp;lt;display description=&amp;quot;${groovy:org.ofbiz.party.party.PartyHelper.getPartyName(delegator, partyId, false)} (${partyId})&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== UEL in Minilang ===&lt;br /&gt;
&lt;br /&gt;
The ofbiz framework now supports unified express language (UEL) in the screen widgets and minilang simple methods.  (See [http://docs.ofbiz.org/display/OFBTECH/Unified+Expression+Language+%28JSR-245%29+in+OFBiz ofbiz wiki])&lt;br /&gt;
&lt;br /&gt;
One side effect is that code in simple methods, for example:&lt;br /&gt;
  someHash.${someVariableAsKey}&lt;br /&gt;
&lt;br /&gt;
In opentaps 1.4, you must change it to:&lt;br /&gt;
  someHash[someVariableAsKey]&lt;br /&gt;
&lt;br /&gt;
=== HTML escaping ===&lt;br /&gt;
&lt;br /&gt;
The ofbiz framework now automatically encodes most of the data displayed on the page. In some cases this is not wanted, and to avoid escaping in form widget use ''encode-output=&amp;quot;false&amp;quot;'' in the field element:&lt;br /&gt;
    &amp;lt;field name=&amp;quot;transactionDate&amp;quot; encode-output=&amp;quot;false&amp;quot;&amp;gt;&amp;lt;date-time/&amp;gt;&amp;lt;/field&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the FTL templates use the ''StringUtil'' class:&lt;br /&gt;
    ${StringUtil.wrapString(someData)}&lt;br /&gt;
&lt;br /&gt;
Some previous helper methods that constructed HTML code will not work anymore. For example ''PartyHelper.createViewPageLink'' has been replaced with the macro:&lt;br /&gt;
    &amp;lt;@displayPartyLink partyId=partyId /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internationalization and Translations ==&lt;br /&gt;
&lt;br /&gt;
In ofbiz09.04, translations are now in XML format instead of .properties.   However, the old .properties translations are supported still as well.&lt;br /&gt;
&lt;br /&gt;
Furthermore, it is possible to define a component with all your translations, instead of putting them into the various existing components. As an example, &amp;lt;tt&amp;gt;hot-deploy/translations&amp;lt;/tt&amp;gt; in opentaps contains a full set of translations for opentaps to Bulgarian.&lt;br /&gt;
&lt;br /&gt;
== Other Changes ==&lt;br /&gt;
&lt;br /&gt;
In some cases the ''screenlet-title-bar'' used in some ofbiz forms and screens is not wanted, in that case simply wrap the form or screen section in a ''noTitleBar'' div.&lt;br /&gt;
&lt;br /&gt;
For example ''ViewShipmentRouteInfo.ftl'' defines such a title, to hide it we added to the screen definition:&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;container style=&amp;quot;noTitleBar&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;platform-specific&amp;gt;&lt;br /&gt;
              &amp;lt;html&amp;gt;&amp;lt;html-template location=&amp;quot;component://product/webapp/facility/shipment/ViewShipmentRouteInfo.ftl&amp;quot;/&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
          &amp;lt;/platform-specific&amp;gt;&lt;br /&gt;
      &amp;lt;/container&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Optimizations_in_Javascripts_and_CSS_files&amp;diff=5612</id>
		<title>Optimizations in Javascripts and CSS files</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Optimizations_in_Javascripts_and_CSS_files&amp;diff=5612"/>
		<updated>2010-03-01T20:08:47Z</updated>

		<summary type="html">&lt;p&gt;Jwickers: New page: == Javascripts ==  === Note on DOJO ===  The DOJO files can be combined using the packager included with the DOJO sources. The opentaps DOJO files are based on the 0.9.0 release.  To make ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Javascripts ==&lt;br /&gt;
&lt;br /&gt;
=== Note on DOJO ===&lt;br /&gt;
&lt;br /&gt;
The DOJO files can be combined using the packager included with the DOJO sources. The opentaps DOJO files are based on the 0.9.0 release.&lt;br /&gt;
&lt;br /&gt;
To make a packaged DOJO:&lt;br /&gt;
* get the release tarball with sources: dojo-release-0.9.0-src.tar.gz&lt;br /&gt;
* define the profile (set of modules included in a package) by creating util/buildscripts/profiles/opentaps.profile.js with:&lt;br /&gt;
   dependencies = {&lt;br /&gt;
        layers: [&lt;br /&gt;
                {&lt;br /&gt;
                        name: &amp;quot;opentaps-dojo.js&amp;quot;,&lt;br /&gt;
                        dependencies: [&lt;br /&gt;
                                       &amp;quot;dojo.fx&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dojo.dnd.source&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dojo.dnd.manager&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dojo.dnd.move&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dojo.currency&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dojo.data.JsonItemStore&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dojo.data.JsonItemStoreAutoComplete&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dijit.Tree&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dijit.Dialog&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dijit.form.window&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dijit.form.Form&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dijit.form.Button&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dijit.form.ComboBox&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dijit.layout.ContentPane&amp;quot;,&lt;br /&gt;
                                       &amp;quot;dijit.nls.loading&amp;quot;&lt;br /&gt;
                        ]&lt;br /&gt;
                }&lt;br /&gt;
        ],&lt;br /&gt;
        prefixes: [&lt;br /&gt;
                   [ &amp;quot;dijit&amp;quot;, &amp;quot;../dijit&amp;quot; ],&lt;br /&gt;
                   [ &amp;quot;dojox&amp;quot;, &amp;quot;../dojox&amp;quot; ]&lt;br /&gt;
        ]&lt;br /&gt;
   }&lt;br /&gt;
* in util/buildscripts : do ./build.sh profile=opentaps action=release copyTests=false&lt;br /&gt;
* get the files from release/dojo&lt;br /&gt;
* this includes a opentaps-dojo.js which will be used later&lt;br /&gt;
&lt;br /&gt;
Note that for opentaps dome patches were applies (see the revision control system).&lt;br /&gt;
&lt;br /&gt;
To include in a HTML page, the simple dojo.js must still be included first&lt;br /&gt;
&lt;br /&gt;
=== Packing other JS files ===&lt;br /&gt;
&lt;br /&gt;
From hot-deploy/opentaps-common/webapp/js:&lt;br /&gt;
* merge the various scripts&lt;br /&gt;
   cat protoaculous.1.8.2.p1.6.1.min.js ../../../../framework/images/webapp/images/calendar_date_select.js opentaps.js selectall.js fieldlookup.js formwidget.js opentapsDisplayEffects.js opentapsWindow.js shortcuts.js jscalendar-1.0/calendar.js jscalendar-1.0/calendar-setup.js &amp;gt; opentaps-packed1.js&lt;br /&gt;
* pack with [[http://www.crockford.com/javascript/jsmin.html jsmin]]&lt;br /&gt;
   jsmin &amp;lt;opentaps-packed1.js &amp;gt;opentaps-packed.js&lt;br /&gt;
* merge with the dojo package in hot-deploy/opentaps-common/webapp/js/dojo_0.90/dojo&lt;br /&gt;
   cat opentaps-dojo.js ../../opentaps-packed.js &amp;gt; opentaps-dojo-packed.js&lt;br /&gt;
&lt;br /&gt;
== CSS files ==&lt;br /&gt;
&lt;br /&gt;
The CSS files where already merged, except the jscalendar CSS (since this is an external module), to merge it, in hot-deploy/opentaps-common/webapp/css&lt;br /&gt;
   cat opentaps.css ../js/jscalendar-1.0/calendar-system.css &amp;gt; opentaps-packed.css&lt;br /&gt;
&lt;br /&gt;
To further reduce the CSS file size an external CSS compressor can be used (for example http://www.cleancss.com/).&lt;/div&gt;</summary>
		<author><name>Jwickers</name></author>
		
	</entry>
</feed>