<?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=Sichen</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=Sichen"/>
	<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Special:Contributions/Sichen"/>
	<updated>2026-05-15T13:57:29Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.32.1</generator>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Main_Page&amp;diff=7594</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Main_Page&amp;diff=7594"/>
		<updated>2019-05-14T16:42:22Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;opentaps Open Source ERP + CRM is an open source Enterprise Resource Planning (ERP) and Customer Relationship Management (CRM) system.  The system is designed to bring together all aspects of a company, from customers to inventory to accounting, from online stores to the shop floor to the warehouse, so that everyone in the company works together as part of one coordinated process.&lt;br /&gt;
&lt;br /&gt;
For information about opentaps 1.4 and 1.5, see the following sections:&lt;br /&gt;
&lt;br /&gt;
*[[Opentaps_Installation_Manual|opentaps Installation Manual]] describes how to set up and install opentaps.&lt;br /&gt;
&lt;br /&gt;
*[[Opentaps_Users_Manual|The opentaps Users Manual]] describes how opentaps works and how you can use opentaps to perform business tasks.  It contains high-level overviews of the processes in opentaps and many &amp;quot;tips and tricks&amp;quot; for how to make it work the way you want.&lt;br /&gt;
&lt;br /&gt;
*[[Opentaps_Reference_Manual|The opentaps Reference Manual]] provides detailed information about how different screens in opentaps work: what the fields  mean, what data is displayed, what happens if you click that button.  It is meant to be a reference for opentaps users and can be accessed directly from opentaps.  &lt;br /&gt;
&lt;br /&gt;
*[[Opentaps_Testing_Manual|The opentaps Testing Manual]] contains tests which could be run on a demo instance to validate the behavior of opentaps.&lt;br /&gt;
&lt;br /&gt;
*[[Opentaps_Technical_Reference|opentaps Technical Reference]] provides technical references and documentation for developers who are looking to customize or extend opentaps.&lt;br /&gt;
&lt;br /&gt;
*You can also find information about modules for opentaps, including&lt;br /&gt;
** [[opentaps Magento Integration]]: Integrates opentaps with the [http://www.magentocommerce.com Magento ecommerce system].&lt;br /&gt;
** [[opentaps Funambol Integration]] Using [http://www.funambol.com Funambol], opentaps can connect with mobile phones, Microsoft Outlook, and Google apps.&lt;br /&gt;
** [[opentaps Concur Integration]]: Integrates opentaps with the [http://www.concur.com/ Concur travel and expense management system].&lt;br /&gt;
** [[opentaps Distributor Application]]: A B2B online store for opentaps&lt;br /&gt;
** [[opentaps osCommerce Integration]]: Integrates the [http://www.oscommerce.com/ osCommerce] shopping cart with open taps&lt;br /&gt;
** [http://shop.opentaps.org/index.php/featured/vat-module-by-integratingweb.html opentaps VAT Module]: Support for Value Added Taxes (VAT)&lt;br /&gt;
** [http://shop.opentaps.org/index.php/featured/enhanced-financials-module.html Enhanced Financials Module]: Additional reports and screens for ledger analysis, bank reconciliation, check register, and bill payments.&lt;br /&gt;
** [http://shop.opentaps.org/index.php/featured/getresponse-email-marketing-integration-module.html GetResponse Email Marketing Integration Module]: Integrate opentaps with [http://www.getresponse.com/index/sichen GetResponse] for email marketing to your leads and customers. &lt;br /&gt;
** [http://shop.opentaps.org/index.php/featured/opentaps-ofbiz-endicia-integration-module.html Endicia Integration Module]: Integrate opentaps with Endicia to print US Postal Service labels for your shipments.  Requires [https://account.dymoendicia.com/?referredBy=lopn signing up with Endicia Label Server].&lt;br /&gt;
** [[opentaps Analytics Data Loader]]: Loading data from ofbiz or opentaps to opentaps Analytics.&lt;br /&gt;
&lt;br /&gt;
*Documentation for opentaps 1.0.x is available at [http://www.opentaps.org/docs_1_0/ www.opentaps.org/docs_1_0]&lt;br /&gt;
&lt;br /&gt;
*Finally, some documentation is now available in [http://www.opentaps.org/esdocs/ Spanish] and [http://www.opentaps.org/cndocs Chinese], thanks to our community contributors.&lt;br /&gt;
&lt;br /&gt;
All above documents following our standard [[Documentation Notation]].  If you are new to mediawiki, you might want to take a look at our [[Mediawiki cheat sheet]] to see how to use it.&lt;br /&gt;
&lt;br /&gt;
New:&lt;br /&gt;
* [[Opentaps Analytics]]&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Technical_Reference&amp;diff=7593</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=7593"/>
		<updated>2017-10-03T20:47:36Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Recommended Reading */&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;
-- [https://www.amazon.com/gp/product/0201835959/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0201835959&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a 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;
&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471380237&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Data Model Resource Book, Volume 1.] -- This comprehensive volume and approaches it from a relational perspective for transactional systems.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0321125215/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321125215&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Domain Driven Design] -- This book approaches the design of transactional applications from an object-oriented perspective.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471200247/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471200247&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a The Data Warehouse Toolkit] -- This book gives a comprehensive treatment from the analytical perspective.&lt;br /&gt;
&lt;br /&gt;
There are also a couple of books about OFBiz on Amazon:&lt;br /&gt;
* [https://www.amazon.com/gp/product/1847194001/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847194001&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Development]&lt;br /&gt;
* [https://www.amazon.com/gp/product/1847199186/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847199186&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Cookbook]&lt;br /&gt;
&lt;br /&gt;
Other helpful references:&lt;br /&gt;
* [https://www.amazon.com/gp/product/0131487876/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131487876&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a  Open 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;
* [https://www.amazon.com/gp/product/0321344758/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321344758&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Don't Make Me Think], or I will hate your user interface.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Technical_Reference&amp;diff=7592</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=7592"/>
		<updated>2017-10-03T20:47:01Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Recommended Reading */&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;
-- [https://www.amazon.com/gp/product/0201835959/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0201835959&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a 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;
&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471380237&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Data Model Resource Book, Volume 1.] -- This comprehensive volume and approaches it from a relational perspective for transactional systems.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0321125215/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321125215&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Domain Driven Design] -- This book approaches the design of transactional applications from an object-oriented perspective.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471200247/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471200247&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a The Data Model Resource Book, Vol. 1] -- This book gives a comprehensive treatment from the analytical perspective.&lt;br /&gt;
&lt;br /&gt;
There are also a couple of books about OFBiz on Amazon:&lt;br /&gt;
* [https://www.amazon.com/gp/product/1847194001/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847194001&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Development]&lt;br /&gt;
* [https://www.amazon.com/gp/product/1847199186/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847199186&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Cookbook]&lt;br /&gt;
&lt;br /&gt;
Other helpful references:&lt;br /&gt;
* [https://www.amazon.com/gp/product/0131487876/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131487876&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a  Open 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;
* [https://www.amazon.com/gp/product/0321344758/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321344758&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Don't Make Me Think], or I will hate your user interface.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Technical_Reference&amp;diff=7591</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=7591"/>
		<updated>2017-10-03T20:46:37Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Recommended Reading */&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;
-- [https://www.amazon.com/gp/product/0201835959/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0201835959&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a 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;
&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471380237&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Data Model Resource Book, Volume 1.] -- This comprehensive volume and approaches it from a relational perspective for transactional systems.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0321125215/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321125215&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Domain Driven Design] -- This book approaches the design of transactional applications from an object-oriented perspective.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471200247/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471200247&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a The Data Model Resource Book, Vol. 1] -- This book gives a comprehensive treatment from the analytical perspective.&lt;br /&gt;
&lt;br /&gt;
There are also a couple of books about OFBiz on Amazon:&lt;br /&gt;
* [https://www.amazon.com/gp/product/1847194001/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847194001&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Development]&lt;br /&gt;
* [https://www.amazon.com/gp/product/1847199186/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847199186&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Cookbook]&lt;br /&gt;
&lt;br /&gt;
Other helpful references:&lt;br /&gt;
* [https://www.amazon.com/gp/product/0131487876/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131487876&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a  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;
* [https://www.amazon.com/gp/product/0321344758/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321344758&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Don't Make Me Think], or I will hate your user interface.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Technical_Reference&amp;diff=7590</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=7590"/>
		<updated>2017-10-03T20:45:49Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Recommended Reading */&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;
-- [https://www.amazon.com/gp/product/0201835959/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0201835959&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a 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;
&lt;br /&gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;&amp;quot;&amp;gt;The Data Model Resource Book, Vol. 1: A Library of Universal Data Models for All Enterprises&amp;lt;/a&amp;gt;&amp;lt;img src=&amp;quot;//ir-na.amazon-adsystem.com/e/ir?t=racioutyle-20&amp;amp;l=am2&amp;amp;o=1&amp;amp;a=0471380237&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; border=&amp;quot;0&amp;quot; alt=&amp;quot;&amp;quot; style=&amp;quot;border:none !important; margin:0px !important;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471380237&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Data Model Resource Book, Volume 1.] -- This comprehensive volume and approaches it from a relational perspective for transactional systems.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321125215&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Domain Driven Design] -- This book approaches the design of transactional applications from an object-oriented perspective.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471200247&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a The Data Model Resource Book, Vol. 1] -- This book gives a comprehensive treatment from the analytical perspective.&lt;br /&gt;
&lt;br /&gt;
There are also a couple of books about OFBiz on Amazon:&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847194001&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Development]&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847199186&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Cookbook]&lt;br /&gt;
&lt;br /&gt;
Other helpful references:&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131487876&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a  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;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321344758&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Don't Make Me Think], or I will hate your user interface.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Technical_Reference&amp;diff=7589</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=7589"/>
		<updated>2017-10-03T20:44:45Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Recommended Reading */&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;
-- [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0201835959&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a 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;
&lt;br /&gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;&amp;quot;&amp;gt;The Data Model Resource Book, Vol. 1: A Library of Universal Data Models for All Enterprises&amp;lt;/a&amp;gt;&amp;lt;img src=&amp;quot;//ir-na.amazon-adsystem.com/e/ir?t=racioutyle-20&amp;amp;l=am2&amp;amp;o=1&amp;amp;a=0471380237&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; border=&amp;quot;0&amp;quot; alt=&amp;quot;&amp;quot; style=&amp;quot;border:none !important; margin:0px !important;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471380237&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Data Model Resource Book, Volume 1.] -- This comprehensive volume and approaches it from a relational perspective for transactional systems.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321125215&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Domain Driven Design] -- This book approaches the design of transactional applications from an object-oriented perspective.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471200247&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a The Data Model Resource Book, Vol. 1] -- This book gives a comprehensive treatment from the analytical perspective.&lt;br /&gt;
&lt;br /&gt;
There are also a couple of books about OFBiz on Amazon:&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847194001&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Development]&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847199186&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Cookbook]&lt;br /&gt;
&lt;br /&gt;
Other helpful references:&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131487876&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a  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;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321344758&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Don't Make Me Think], or I will hate your user interface.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Technical_Reference&amp;diff=7588</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=7588"/>
		<updated>2017-10-03T20:44:21Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Recommended Reading */&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;
&lt;br /&gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;&amp;quot;&amp;gt;The Data Model Resource Book, Vol. 1: A Library of Universal Data Models for All Enterprises&amp;lt;/a&amp;gt;&amp;lt;img src=&amp;quot;//ir-na.amazon-adsystem.com/e/ir?t=racioutyle-20&amp;amp;l=am2&amp;amp;o=1&amp;amp;a=0471380237&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; border=&amp;quot;0&amp;quot; alt=&amp;quot;&amp;quot; style=&amp;quot;border:none !important; margin:0px !important;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471380237&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Data Model Resource Book, Volume 1.] -- This comprehensive volume and approaches it from a relational perspective for transactional systems.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321125215&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Domain Driven Design] -- This book approaches the design of transactional applications from an object-oriented perspective.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471200247&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a The Data Model Resource Book, Vol. 1] -- This book gives a comprehensive treatment from the analytical perspective.&lt;br /&gt;
&lt;br /&gt;
There are also a couple of books about OFBiz on Amazon:&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847194001&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Development]&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847199186&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Cookbook]&lt;br /&gt;
&lt;br /&gt;
Other helpful references:&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131487876&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a  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;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321344758&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Don't Make Me Think], or I will hate your user interface.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Technical_Reference&amp;diff=7587</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=7587"/>
		<updated>2017-10-03T20:43:54Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Recommended Reading */&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;
&lt;br /&gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;&amp;quot;&amp;gt;The Data Model Resource Book, Vol. 1: A Library of Universal Data Models for All Enterprises&amp;lt;/a&amp;gt;&amp;lt;img src=&amp;quot;//ir-na.amazon-adsystem.com/e/ir?t=racioutyle-20&amp;amp;l=am2&amp;amp;o=1&amp;amp;a=0471380237&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; border=&amp;quot;0&amp;quot; alt=&amp;quot;&amp;quot; style=&amp;quot;border:none !important; margin:0px !important;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471380237&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Data Model Resource Book, Volume 1.] -- This comprehensive volume and approaches it from a relational perspective for transactional systems.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321125215&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Domain Driven Design] -- This book approaches the design of transactional applications from an object-oriented perspective.&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471200247&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a] -- This book gives a comprehensive treatment from the analytical perspective.&lt;br /&gt;
&lt;br /&gt;
There are also a couple of books about OFBiz on Amazon:&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847194001&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Development]&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1847199186&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Apache OFBiz Cookbook]&lt;br /&gt;
&lt;br /&gt;
Other helpful references:&lt;br /&gt;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131487876&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a  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;
* [https://www.amazon.com/gp/product/0471380237/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321344758&amp;amp;linkCode=as2&amp;amp;tag=racioutyle-20&amp;amp;linkId=531758359dc655cd4a9c6527a1abd66a Don't Make Me Think], or I will hate your user interface.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Technical_Reference&amp;diff=7586</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=7586"/>
		<updated>2017-02-03T18:16:36Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &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=opensources08-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=opensources08-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=opensources08-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;
There are also a couple of books about OFBiz on Amazon:&lt;br /&gt;
* [http://www.amazon.com/exec/obidos/redirect?tag=opensources08-20&amp;amp;path=ASIN/1847194001 Apache OFBiz Development]&lt;br /&gt;
* [http://www.amazon.com/exec/obidos/redirect?tag=opensources08-20&amp;amp;path=ASIN/1847199186 Apache OFBiz Cookbook]&lt;br /&gt;
&lt;br /&gt;
Other helpful references:&lt;br /&gt;
* [http://www.amazon.com/exec/obidos/redirect?tag=opensources08-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=opensources08-20&amp;amp;path=ASIN/0321344758 Don't Make Me Think], or I will hate your user interface.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=How_to_Use_Git:_a_Tutorial&amp;diff=7585</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=7585"/>
		<updated>2016-03-08T15:44:34Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Other Notes */&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;
If you have an existing repository, you can also use it as a reference when you clone, like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git clone git://gitorious.org/opentaps/opentaps.git new-opentaps-git --reference /path/to/previous-opentaps-git/&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;
==== Cherry Picking your Update ====&lt;br /&gt;
&lt;br /&gt;
If you don't want to update everything, you can cherry pick a particular commit like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git fetch&lt;br /&gt;
$ git cherry-pick &amp;lt;the-commit-hash&amp;gt;&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;
===Un-Committing Your Changes===&lt;br /&gt;
&lt;br /&gt;
Uh oh, I didn't mean to commit that.&lt;br /&gt;
&lt;br /&gt;
You can un-commit your changes with&lt;br /&gt;
&lt;br /&gt;
 $ git reset HEAD &amp;lt;file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or un-commit all your changes&lt;br /&gt;
 $ git reset HEAD&lt;br /&gt;
&lt;br /&gt;
You can do this before pushing them up (see below.)&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;
This shows a list of files in the stash.  You can see the changes actually stashed with&lt;br /&gt;
 $ git stash show -u&lt;br /&gt;
&lt;br /&gt;
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.  If that happens, you need to get rid of them (see below) and start over again.)&lt;br /&gt;
&lt;br /&gt;
Sometimes every time you &amp;lt;tt&amp;gt;git stash pop&amp;lt;/tt&amp;gt;, you'll get a conflict.  This may have happened because your stash actually contains unresolved conflicts.  The only way to fix it is to get rid of that stash.  &lt;br /&gt;
 $ git stash drop&lt;br /&gt;
will get rid of the last stash.  You can drop a few until the problem goes away.&lt;br /&gt;
&lt;br /&gt;
To get rid of a particular stash, use&lt;br /&gt;
 $ git stash drop &amp;lt;stash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To drop a particular stash.&lt;br /&gt;
&lt;br /&gt;
If you don't need any of your stash, you can clear it all with&lt;br /&gt;
 $ git stash clear&lt;br /&gt;
&lt;br /&gt;
WARNING: If you stash unmerged conflicts, every time you pop from your stash, git will complain about unmerged changes.&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 push 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;
To push a branch which is not linked to a remote branch,&lt;br /&gt;
 $ git push origin local-branch:remote-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;
===What if Git Hangs?===&lt;br /&gt;
&lt;br /&gt;
Sometimes git could get stuck while unpacking objects:&lt;br /&gt;
$ git fetch&lt;br /&gt;
remote: Counting objects: 137, done.&lt;br /&gt;
remote: Compressing objects: 100% (79/79), done.&lt;br /&gt;
Unpacking objects:  13% (12/88) &lt;br /&gt;
&lt;br /&gt;
When I ctrl+c stop it and then check, there's a large list of dangling commits:&lt;br /&gt;
$ git fsck&lt;br /&gt;
Checking object directories: 100% (256/256), done.&lt;br /&gt;
Checking objects: 100% (210332/210332), done.&lt;br /&gt;
dangling commit d70058dada2c537a03d68d79f5c71a2325ae1c8f&lt;br /&gt;
dangling commit 5617c81334112457e6bd8d058b252172cc131562&lt;br /&gt;
dangling commit 942b10e3066e96b8b2311ae3882763a1e06c8179&lt;br /&gt;
dangling commit af3b78d82838f237048a7f1b22032d0e02cd4bbf&lt;br /&gt;
dangling commit 7454907e59d3e340b41ba5bb4d7449d033f1ec53&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
This fixed it:&lt;br /&gt;
$ git gc --aggressive&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>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=How_to_Use_Git:_a_Tutorial&amp;diff=7584</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=7584"/>
		<updated>2016-01-21T21:38:50Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Your Stash */&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;
If you have an existing repository, you can also use it as a reference when you clone, like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git clone git://gitorious.org/opentaps/opentaps.git new-opentaps-git --reference /path/to/previous-opentaps-git/&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;
==== Cherry Picking your Update ====&lt;br /&gt;
&lt;br /&gt;
If you don't want to update everything, you can cherry pick a particular commit like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git fetch&lt;br /&gt;
$ git cherry-pick &amp;lt;the-commit-hash&amp;gt;&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;
===Un-Committing Your Changes===&lt;br /&gt;
&lt;br /&gt;
Uh oh, I didn't mean to commit that.&lt;br /&gt;
&lt;br /&gt;
You can un-commit your changes with&lt;br /&gt;
&lt;br /&gt;
 $ git reset HEAD &amp;lt;file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or un-commit all your changes&lt;br /&gt;
 $ git reset HEAD&lt;br /&gt;
&lt;br /&gt;
You can do this before pushing them up (see below.)&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;
This shows a list of files in the stash.  You can see the changes actually stashed with&lt;br /&gt;
 $ git stash show -u&lt;br /&gt;
&lt;br /&gt;
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.  If that happens, you need to get rid of them (see below) and start over again.)&lt;br /&gt;
&lt;br /&gt;
Sometimes every time you &amp;lt;tt&amp;gt;git stash pop&amp;lt;/tt&amp;gt;, you'll get a conflict.  This may have happened because your stash actually contains unresolved conflicts.  The only way to fix it is to get rid of that stash.  &lt;br /&gt;
 $ git stash drop&lt;br /&gt;
will get rid of the last stash.  You can drop a few until the problem goes away.&lt;br /&gt;
&lt;br /&gt;
To get rid of a particular stash, use&lt;br /&gt;
 $ git stash drop &amp;lt;stash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To drop a particular stash.&lt;br /&gt;
&lt;br /&gt;
If you don't need any of your stash, you can clear it all with&lt;br /&gt;
 $ git stash clear&lt;br /&gt;
&lt;br /&gt;
WARNING: If you stash unmerged conflicts, every time you pop from your stash, git will complain about unmerged changes.&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 push 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;
To push a branch which is not linked to a remote branch,&lt;br /&gt;
 $ git push origin local-branch:remote-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>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=How_to_Use_Git:_a_Tutorial&amp;diff=7583</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=7583"/>
		<updated>2015-06-26T01:37:34Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Your Stash */&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;
If you have an existing repository, you can also use it as a reference when you clone, like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git clone git://gitorious.org/opentaps/opentaps.git new-opentaps-git --reference /path/to/previous-opentaps-git/&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;
==== Cherry Picking your Update ====&lt;br /&gt;
&lt;br /&gt;
If you don't want to update everything, you can cherry pick a particular commit like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git fetch&lt;br /&gt;
$ git cherry-pick &amp;lt;the-commit-hash&amp;gt;&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;
===Un-Committing Your Changes===&lt;br /&gt;
&lt;br /&gt;
Uh oh, I didn't mean to commit that.&lt;br /&gt;
&lt;br /&gt;
You can un-commit your changes with&lt;br /&gt;
&lt;br /&gt;
 $ git reset HEAD &amp;lt;file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or un-commit all your changes&lt;br /&gt;
 $ git reset HEAD&lt;br /&gt;
&lt;br /&gt;
You can do this before pushing them up (see below.)&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;
This shows a list of files in the stash.  You can see the changes actually stashed with&lt;br /&gt;
 $ git stash show -u&lt;br /&gt;
&lt;br /&gt;
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.  If that happens, you need to get rid of them (see below) and start over again.)&lt;br /&gt;
&lt;br /&gt;
To get rid of a particular stash, use&lt;br /&gt;
 $ git stash drop &amp;lt;stash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To drop a particular stash.&lt;br /&gt;
&lt;br /&gt;
If you don't need any of your stash, you can clear it all with&lt;br /&gt;
 $ git stash clear&lt;br /&gt;
&lt;br /&gt;
WARNING: If you stash unmerged conflicts, every time you pop from your stash, git will complain about unmerged changes.&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 push 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;
To push a branch which is not linked to a remote branch,&lt;br /&gt;
 $ git push origin local-branch:remote-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>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=File:Download_authorize_dot_net_SSL_certificate.png&amp;diff=7582</id>
		<title>File:Download authorize dot net SSL certificate.png</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=File:Download_authorize_dot_net_SSL_certificate.png&amp;diff=7582"/>
		<updated>2015-05-28T16:05:03Z</updated>

		<summary type="html">&lt;p&gt;Sichen: Protected &amp;quot;Image:Download authorize dot net SSL certificate.png&amp;quot;: Sysop page [edit=sysop:move=sysop]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=File:Download_authorize_dot_net_SSL_certificate.png&amp;diff=7581</id>
		<title>File:Download authorize dot net SSL certificate.png</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=File:Download_authorize_dot_net_SSL_certificate.png&amp;diff=7581"/>
		<updated>2015-05-28T16:05:02Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7568</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=7568"/>
		<updated>2015-03-20T00:29:42Z</updated>

		<summary type="html">&lt;p&gt;Sichen: New page: 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...&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;
=== 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>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Social_API&amp;diff=7569</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=7569"/>
		<updated>2015-03-20T00:29:42Z</updated>

		<summary type="html">&lt;p&gt;Sichen: Protected &amp;quot;CRM-2 Social API&amp;quot;: Sysop page [edit=sysop:move=sysop]&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;
=== 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>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_API&amp;diff=7567</id>
		<title>CRM-2 API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_API&amp;diff=7567"/>
		<updated>2015-03-20T00:20:28Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CRM-2 API is accessed via RESTful services using your authorization token key.  All access to CRM-2 API follow this common pattern:&lt;br /&gt;
* URL: RESTful URL of the CRM-2 resource&lt;br /&gt;
* operation: &lt;br /&gt;
** POST: creates new value&lt;br /&gt;
** GET: get existing value(s)&lt;br /&gt;
** PUT: update existing value&lt;br /&gt;
** DELETE: delete existing value&lt;br /&gt;
* clientDomain: name of your domain, ie xyz.com&lt;br /&gt;
* authToken: your access token key, a very long alphanumeric string&lt;br /&gt;
* parameters: key value pairs for your API operation&lt;br /&gt;
&lt;br /&gt;
You can also use curl or a visual RESTful client to test the API.  For example,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -X POST 'http://crm-2-url/admin/activity-type' -d clientDomain=newdomain.com -d activityType=&amp;quot;PINNED&amp;quot; &lt;br /&gt;
-d authToken=&amp;lt;token&amp;gt;&lt;br /&gt;
$ curl -X GET &amp;quot;http://crm-2-url/admin/activity-type?clientDomain=newdomain.com&lt;br /&gt;
&amp;amp;authToken=&amp;lt;token&amp;gt;&amp;quot;&lt;br /&gt;
$ curl -X DELETE 'http://crm-2-url/admin/activity-type' -d clientDomain=newdomain.com -d activityType=&amp;quot;PINNED&amp;quot; -d authToken=&amp;lt;token&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
can be used to create, read, and delete data.&lt;br /&gt;
&lt;br /&gt;
To update data, a PUT operation is used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -X PUT --data &amp;quot;clientDomain=xyz.com&amp;amp;mailUser=newemail@gmail.com&amp;amp;mailStoreProtocol=&amp;quot;imaps&amp;quot;&amp;amp;&lt;br /&gt;
mailHost=&amp;quot;pop.googlemail.com&amp;quot;&amp;amp;mailPass=&amp;quot;123456&amp;quot;&lt;br /&gt;
&amp;amp;authToken=&amp;lt;token&amp;gt;&amp;quot; &lt;br /&gt;
http://crm-2-url/admin/email-to-poll&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
API available, grouped by section, are:&lt;br /&gt;
* [[CRM-2 Security Model]]&lt;br /&gt;
* [[CRM-2 Administrative API]]&lt;br /&gt;
* [[CRM-2 Contacts API]]&lt;br /&gt;
* [[CRM-2 Activities API]]&lt;br /&gt;
* [[CRM-2 Tags API]]&lt;br /&gt;
* [[CRM-2 Social API]]&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Ranking_Product_Categories&amp;diff=7566</id>
		<title>Opentaps Analytics Ranking Product Categories</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Ranking_Product_Categories&amp;diff=7566"/>
		<updated>2014-12-20T00:45:12Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;With your sale data, opentaps Analytics can help you rank a list of products and present the best sellers to your customers first.  &lt;br /&gt;
&lt;br /&gt;
But what is a best seller?  This is not as simple as it may first sound.  Should you show your customers the products which have sold the most units, or the products that have higher prices but may sell less frequently?  What if a product is new or hasn't sold too many times, but its brand sells much better than the other brands you carry?  Finally, should you show a product by itself or a category of products first?&lt;br /&gt;
&lt;br /&gt;
opentaps Analytics takes into consideration several factors when ranking your product category's members, including:&lt;br /&gt;
* Value of sales&lt;br /&gt;
* Units sold&lt;br /&gt;
* Sales of the brand &lt;br /&gt;
* Newness of the products&lt;br /&gt;
* Number of clicks for the product or sub-category's web page&lt;br /&gt;
&lt;br /&gt;
So, it could help you balance showing high value/low volume versus low value/high volume products.  In the event several products have similar sales (or no sales), it could help you prioritize based on better-selling brands.  Finally, it'll push the newest products in your category higher.  All these factors are controlled by parameters which you can use to adjust the relative weights or rankings of each one.&lt;br /&gt;
&lt;br /&gt;
To rank your product category, call the API at URL &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://analytics.opentaps.com/analytics/control/productCategoriesRank?userlogin=your_user_name&amp;amp;password=your_password&amp;amp;webkey=your_webkey&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with a JSON string in this format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;categories&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;CATEGORY1&amp;quot;,&lt;br /&gt;
         &amp;quot;introductionDate&amp;quot;:&amp;quot;2012-03-15T21:52:10&amp;quot;,&lt;br /&gt;
         &amp;quot;products&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;id&amp;quot;:&amp;quot;PRODUCT1001&amp;quot;,&lt;br /&gt;
               &amp;quot;introductionDate&amp;quot;:&amp;quot;2012-03-15T21:56:09&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;CATEGORY2&amp;quot;,&lt;br /&gt;
         &amp;quot;introductionDate&amp;quot;:&amp;quot;2012-02-23T01:47:10&amp;quot;,&lt;br /&gt;
         &amp;quot;products&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;id&amp;quot;:&amp;quot;CATEGORY2001&amp;quot;,&lt;br /&gt;
               &amp;quot;introductionDate&amp;quot;:&amp;quot;2012-02-10T19:49:14&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;id&amp;quot;:&amp;quot;CATEGORY2002&amp;quot;,&lt;br /&gt;
               &amp;quot;introductionDate&amp;quot;:&amp;quot;2012-02-10T19:49:16&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;products&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;PRODUCT3001&amp;quot;,&lt;br /&gt;
         &amp;quot;introductionDate&amp;quot;:&amp;quot;2007-08-09T21:19:28&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;PRODUCT3002&amp;quot;,&lt;br /&gt;
         &amp;quot;introductionDate&amp;quot;:&amp;quot;2007-08-09T21:19:28&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;dateFrom&amp;quot;:&amp;quot;2013-01-01T00:00:00&amp;quot;,&lt;br /&gt;
   &amp;quot;dateTo&amp;quot;:&amp;quot;2013-12-31T00:00:00&amp;quot;,&lt;br /&gt;
   &amp;quot;brandBoostFactor&amp;quot;:&amp;quot;1.00&amp;quot;,&lt;br /&gt;
   &amp;quot;newnessBoostFactor&amp;quot;:&amp;quot;1.00&amp;quot;,&lt;br /&gt;
   &amp;quot;quantityBoostFactor&amp;quot;:&amp;quot;2.00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you are passing both a list of products and a list of categories, plus your parameters.  opentaps Analytics will look through your categories and sum up the sales of the products within those categories.&lt;br /&gt;
&lt;br /&gt;
The additional parameters are:&lt;br /&gt;
* dateFrom and dateTo - date range of sales, in JSON format (i.e. 2014-12-01T00:00:00)&lt;br /&gt;
* brand boost factor - weighting of relative sales of this product's or category's brand relative to the average sale of brands, during the time period.  A weight of 1.0 means that the brand weighting is equal to the relative sales weighting.&lt;br /&gt;
* newness factor - relative weight for newness.  Newness starts at 1.0 for new products and linearly amortizes to 0.0 over 30 days.  You can use this boost the factor.&lt;br /&gt;
* quantity boost factor - relative factor for quantity (units) of sales versus value (dollar amount) of sales.  1.0 means quantity and value of sales are equally important.&lt;br /&gt;
* click weight - relative weighting of number of clicks the product or sub-category has received versus the sales data.  This should be a very small number, such as 0.01, since sales are the most important determining factor.  However, it could be used as a &amp;quot;tie breaker&amp;quot; for products with very similar amounts of sales.  You can also use a negative value here in case you want to penalize products that get a lot of clicks but no sales.&lt;br /&gt;
&lt;br /&gt;
The response will be a JSON string with each of the products and categories which are members of your original category and the ranking score from opentaps Analytics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;categories&amp;quot;:{&lt;br /&gt;
      &amp;quot;CATEGORY1&amp;quot;:4.227991,&lt;br /&gt;
      &amp;quot;CATEGORY2&amp;quot;:1.712083,&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;products&amp;quot;:{&lt;br /&gt;
      &amp;quot;PRODUCT3001&amp;quot;:24.52276,&lt;br /&gt;
      &amp;quot;PRODUCT3002&amp;quot;:24.52276&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The higher rankings are the ones that opentaps Analytics recommends more heavily.  Use them in your ecommerce system to rank the category's products and sub-categories.&lt;br /&gt;
&lt;br /&gt;
You should try different combinations of parameters to see if the recommendations make sense.  For example, is it over-relying on brand for this particular category?  Might a brand overall have high sales but in another category altogether?  Should we give the new products more of a chance to prove themselves and increase the newness factor?  Are we over-emphasizing high value, low volume products?  These can all be tweaked with the parameters to get new sets of rankings.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Ranking_Product_Categories&amp;diff=7565</id>
		<title>Opentaps Analytics Ranking Product Categories</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_Analytics_Ranking_Product_Categories&amp;diff=7565"/>
		<updated>2014-12-20T00:37:38Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;With your sale data, opentaps Analytics can help you rank a list of products and present the best sellers to your customers first.  &lt;br /&gt;
&lt;br /&gt;
But what is a best seller?  This is not as simple as it may first sound.  Should you show your customers the products which have sold the most units, or the products that have higher prices but may sell less frequently?  What if a product is new or hasn't sold too many times, but its brand sells much better than the other brands you carry?  Finally, should you show a product by itself or a category of products first?&lt;br /&gt;
&lt;br /&gt;
opentaps Analytics takes into consideration several factors when ranking your product category's members, including:&lt;br /&gt;
* Value of sales&lt;br /&gt;
* Units sold&lt;br /&gt;
* Sales of the brand &lt;br /&gt;
* Newness of the products&lt;br /&gt;
&lt;br /&gt;
So, it could help you balance showing high value/low volume versus low value/high volume products.  In the event several products have similar sales (or no sales), it could help you prioritize based on better-selling brands.  Finally, it'll push the newest products in your category higher.  All these factors are controlled by parameters which you can use to adjust the relative weights or rankings of each one.&lt;br /&gt;
&lt;br /&gt;
To rank your product category, call the API at URL &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://analytics.opentaps.com/analytics/control/productCategoriesRank?userlogin=your_user_name&amp;amp;password=your_password&amp;amp;webkey=your_webkey&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with a JSON string in this format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;categories&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;CATEGORY1&amp;quot;,&lt;br /&gt;
         &amp;quot;introductionDate&amp;quot;:&amp;quot;2012-03-15T21:52:10&amp;quot;,&lt;br /&gt;
         &amp;quot;products&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;id&amp;quot;:&amp;quot;PRODUCT1001&amp;quot;,&lt;br /&gt;
               &amp;quot;introductionDate&amp;quot;:&amp;quot;2012-03-15T21:56:09&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;CATEGORY2&amp;quot;,&lt;br /&gt;
         &amp;quot;introductionDate&amp;quot;:&amp;quot;2012-02-23T01:47:10&amp;quot;,&lt;br /&gt;
         &amp;quot;products&amp;quot;:[&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;id&amp;quot;:&amp;quot;CATEGORY2001&amp;quot;,&lt;br /&gt;
               &amp;quot;introductionDate&amp;quot;:&amp;quot;2012-02-10T19:49:14&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;id&amp;quot;:&amp;quot;CATEGORY2002&amp;quot;,&lt;br /&gt;
               &amp;quot;introductionDate&amp;quot;:&amp;quot;2012-02-10T19:49:16&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ]&lt;br /&gt;
      }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;products&amp;quot;:[&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;PRODUCT3001&amp;quot;,&lt;br /&gt;
         &amp;quot;introductionDate&amp;quot;:&amp;quot;2007-08-09T21:19:28&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;id&amp;quot;:&amp;quot;PRODUCT3002&amp;quot;,&lt;br /&gt;
         &amp;quot;introductionDate&amp;quot;:&amp;quot;2007-08-09T21:19:28&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;dateFrom&amp;quot;:&amp;quot;2013-01-01T00:00:00&amp;quot;,&lt;br /&gt;
   &amp;quot;dateTo&amp;quot;:&amp;quot;2013-12-31T00:00:00&amp;quot;,&lt;br /&gt;
   &amp;quot;brandBoostFactor&amp;quot;:&amp;quot;1.00&amp;quot;,&lt;br /&gt;
   &amp;quot;newnessBoostFactor&amp;quot;:&amp;quot;1.00&amp;quot;,&lt;br /&gt;
   &amp;quot;quantityBoostFactor&amp;quot;:&amp;quot;2.00&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you are passing both a list of products and a list of categories, plus your parameters.  opentaps Analytics will look through your categories and sum up the sales of the products within those categories.&lt;br /&gt;
&lt;br /&gt;
The additional parameters are:&lt;br /&gt;
* dateFrom and dateTo - date range of sales, in JSON format (i.e. 2014-12-01T00:00:00)&lt;br /&gt;
* brand boost factor - weighting of relative sales of this product's or category's brand relative to the average sale of brands, during the time period.  A weight of 1.0 means that the brand weighting is equal to the relative sales weighting.&lt;br /&gt;
* newness factor - relative weight for newness.  Newness starts at 1.0 for new products and linearly amortizes to 0.0 over 30 days.  You can use this boost the factor.&lt;br /&gt;
* quantity boost factor - relative factor for quantity (units) of sales versus value (dollar amount) of sales.  1.0 means quantity and value of sales are equally important.&lt;br /&gt;
&lt;br /&gt;
The response will be a JSON string with each of the products and categories which are members of your original category and the ranking score from opentaps Analytics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;categories&amp;quot;:{&lt;br /&gt;
      &amp;quot;CATEGORY1&amp;quot;:4.227991,&lt;br /&gt;
      &amp;quot;CATEGORY2&amp;quot;:1.712083,&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;products&amp;quot;:{&lt;br /&gt;
      &amp;quot;PRODUCT3001&amp;quot;:24.52276,&lt;br /&gt;
      &amp;quot;PRODUCT3002&amp;quot;:24.52276&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The higher rankings are the ones that opentaps Analytics recommends more heavily.  Use them in your ecommerce system to rank the category's products and sub-categories.&lt;br /&gt;
&lt;br /&gt;
You should try different combinations of parameters to see if the recommendations make sense.  For example, is it over-relying on brand for this particular category?  Might a brand overall have high sales but in another category altogether?  Should we give the new products more of a chance to prove themselves and increase the newness factor?  Are we over-emphasizing high value, low volume products?  These can all be tweaked with the parameters to get new sets of rankings.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Security_Model&amp;diff=7563</id>
		<title>CRM-2 Security Model</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Security_Model&amp;diff=7563"/>
		<updated>2014-11-19T22:57:30Z</updated>

		<summary type="html">&lt;p&gt;Sichen: New page: ===How opentaps CRM2 Security Works===  A Contact may have many User logins, but the Contact (not each of its Users) has security settings for to each domain. This is an important differen...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===How opentaps CRM2 Security Works===&lt;br /&gt;
&lt;br /&gt;
A Contact may have many User logins, but the Contact (not each of its Users) has security settings for to each domain. This is an important difference from opentaps 1.x/ofbiz: security is associated with the Contact (Party), not the User. This means you get the same permissions to the system if you're logged in with your Google, Twitter, or Facebook account.&lt;br /&gt;
&lt;br /&gt;
Security is accessed via authorization tokens.  Each user ID is associated with a permanent authorization token, which is a random alphanumeric string that identifies the user to the system.  This authorization token should be kept secret -- it is the same as having the password for that user.&lt;br /&gt;
 &lt;br /&gt;
We recommend that you obtain a temporary auth token programatically, instead of using the authorization token or asking each user to login.&lt;br /&gt;
&lt;br /&gt;
You can POST a request to https://crm2.opentaps.com/oauth/temp-token with your permanent auth token to obtain a temporary authorization token for the same user as the auth token (ie, your admin user). The temporary token is by default set to expire in 60 minutes. Store it locally in your session to access the crm2 server.&lt;br /&gt;
&lt;br /&gt;
To make sure your temporary token is valid before a call, use /oauth/validate and pass your temporary token.&lt;br /&gt;
&lt;br /&gt;
A good practice is to:&lt;br /&gt;
&lt;br /&gt;
# see if you have a temporary token in your session&lt;br /&gt;
# if so, use /oauth/validate to see if it is still valid&lt;br /&gt;
# if there is no temporary token or it is no longer valid, call /oauth/temp-token to get a new one&lt;br /&gt;
&lt;br /&gt;
See https://github.com/opentaps/opentaps-crm2 for examples of how the authorization token is used.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Security_Model&amp;diff=7564</id>
		<title>CRM-2 Security Model</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Security_Model&amp;diff=7564"/>
		<updated>2014-11-19T22:57:30Z</updated>

		<summary type="html">&lt;p&gt;Sichen: Protected &amp;quot;CRM-2 Security Model&amp;quot;: Sysop page [edit=sysop:move=sysop]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===How opentaps CRM2 Security Works===&lt;br /&gt;
&lt;br /&gt;
A Contact may have many User logins, but the Contact (not each of its Users) has security settings for to each domain. This is an important difference from opentaps 1.x/ofbiz: security is associated with the Contact (Party), not the User. This means you get the same permissions to the system if you're logged in with your Google, Twitter, or Facebook account.&lt;br /&gt;
&lt;br /&gt;
Security is accessed via authorization tokens.  Each user ID is associated with a permanent authorization token, which is a random alphanumeric string that identifies the user to the system.  This authorization token should be kept secret -- it is the same as having the password for that user.&lt;br /&gt;
 &lt;br /&gt;
We recommend that you obtain a temporary auth token programatically, instead of using the authorization token or asking each user to login.&lt;br /&gt;
&lt;br /&gt;
You can POST a request to https://crm2.opentaps.com/oauth/temp-token with your permanent auth token to obtain a temporary authorization token for the same user as the auth token (ie, your admin user). The temporary token is by default set to expire in 60 minutes. Store it locally in your session to access the crm2 server.&lt;br /&gt;
&lt;br /&gt;
To make sure your temporary token is valid before a call, use /oauth/validate and pass your temporary token.&lt;br /&gt;
&lt;br /&gt;
A good practice is to:&lt;br /&gt;
&lt;br /&gt;
# see if you have a temporary token in your session&lt;br /&gt;
# if so, use /oauth/validate to see if it is still valid&lt;br /&gt;
# if there is no temporary token or it is no longer valid, call /oauth/temp-token to get a new one&lt;br /&gt;
&lt;br /&gt;
See https://github.com/opentaps/opentaps-crm2 for examples of how the authorization token is used.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_API&amp;diff=7562</id>
		<title>CRM-2 API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_API&amp;diff=7562"/>
		<updated>2014-11-19T22:52:33Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CRM-2 API is accessed via RESTful services using your authorization token key.  All access to CRM-2 API follow this common pattern:&lt;br /&gt;
* URL: RESTful URL of the CRM-2 resource&lt;br /&gt;
* operation: &lt;br /&gt;
** POST: creates new value&lt;br /&gt;
** GET: get existing value(s)&lt;br /&gt;
** PUT: update existing value&lt;br /&gt;
** DELETE: delete existing value&lt;br /&gt;
* clientDomain: name of your domain, ie xyz.com&lt;br /&gt;
* authToken: your access token key, a very long alphanumeric string&lt;br /&gt;
* parameters: key value pairs for your API operation&lt;br /&gt;
&lt;br /&gt;
You can also use curl or a visual RESTful client to test the API.  For example,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -X POST 'http://crm-2-url/admin/activity-type' -d clientDomain=newdomain.com -d activityType=&amp;quot;PINNED&amp;quot; &lt;br /&gt;
-d authToken=&amp;lt;token&amp;gt;&lt;br /&gt;
$ curl -X GET &amp;quot;http://crm-2-url/admin/activity-type?clientDomain=newdomain.com&lt;br /&gt;
&amp;amp;authToken=&amp;lt;token&amp;gt;&amp;quot;&lt;br /&gt;
$ curl -X DELETE 'http://crm-2-url/admin/activity-type' -d clientDomain=newdomain.com -d activityType=&amp;quot;PINNED&amp;quot; -d authToken=&amp;lt;token&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
can be used to create, read, and delete data.&lt;br /&gt;
&lt;br /&gt;
To update data, a PUT operation is used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -X PUT --data &amp;quot;clientDomain=xyz.com&amp;amp;mailUser=newemail@gmail.com&amp;amp;mailStoreProtocol=&amp;quot;imaps&amp;quot;&amp;amp;&lt;br /&gt;
mailHost=&amp;quot;pop.googlemail.com&amp;quot;&amp;amp;mailPass=&amp;quot;123456&amp;quot;&lt;br /&gt;
&amp;amp;authToken=&amp;lt;token&amp;gt;&amp;quot; &lt;br /&gt;
http://crm-2-url/admin/email-to-poll&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
API available, grouped by section, are:&lt;br /&gt;
* [[CRM-2 Security Model]]&lt;br /&gt;
* [[CRM-2 Administrative API]]&lt;br /&gt;
* [[CRM-2 Contacts API]]&lt;br /&gt;
* [[CRM-2 Activities API]]&lt;br /&gt;
* [[CRM-2 Tags API]]&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7561</id>
		<title>CRM-2 Tags API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7561"/>
		<updated>2014-11-19T20:52:14Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tags are a way to group your activities and tasks and link them to the outside world.  The tags in opentaps crm2 have a tag name, which is the description, plus a URL and keywords.  The URL can be used to link tagged activities to outside data, such as linking emails and notes to a sales order in another system.  The keywords can be used to search for activities which may be related to the tag.   For example, we can use it to search for emails which may be related to an invoice.&lt;br /&gt;
&lt;br /&gt;
Tags are inherited in the following way:&lt;br /&gt;
# When an activity is tagged, a new task created from the activity will have the same tags&lt;br /&gt;
# When a task is tagged, any activity created from the task will be tagged as well.&lt;br /&gt;
# When an existing activity is linked to an existing task, the tags from that task will be inherited by the activity.  However, the activity may have existing tags, and those will still be there as well -- they are not erased when an activity is transferred from one task to another.&lt;br /&gt;
&lt;br /&gt;
==== Tags ====&lt;br /&gt;
&lt;br /&gt;
A tag can store the following data:&lt;br /&gt;
* tagId - unique identifier&lt;br /&gt;
* tag name - descriptive text of the tag&lt;br /&gt;
* an optional URL link which can be used to link to an outside system, such as the order ID or party ID of a legacy ERP or CRM system.&lt;br /&gt;
* keywords which can be used for searching similar documents&lt;br /&gt;
&lt;br /&gt;
Tag names are case insensitive, so the tags opentaps, OPENTAPs, and OpenTaps would all be considered the same.&lt;br /&gt;
&lt;br /&gt;
Tags have a hierarchy based on their name.  If a tag has two colons (&amp;lt;tt&amp;gt;::&amp;lt;/tt&amp;gt;) in its name, then the first part before the &amp;lt;tt&amp;gt;::&amp;lt;/tt&amp;gt; is the parent tag of all tags which contains it.  For example, &amp;lt;tt&amp;gt;Sales Order::&amp;lt;/tt&amp;gt; would be the parent tag of &amp;lt;tt&amp;gt;Sales Order::12345&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Sales Order::45678&amp;lt;/tt&amp;gt;  In the user interface, the parent tags are shown in the Tags tab, and when you click on a parent tag, the child tags are shown.&lt;br /&gt;
&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
Endpoint: https://crm2.opentaps.com/tag&lt;br /&gt;
&lt;br /&gt;
'''POST''': Create a new tag&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
* tagUrl&lt;br /&gt;
* tagKeywords&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* tagId: unique identifier of your tag&lt;br /&gt;
&lt;br /&gt;
If the same tagName (case insensitive) already exists, then the operation would return an error.&lt;br /&gt;
&lt;br /&gt;
'''PUT''': Update an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''GET''': Search for existing tags which contain your tag name (case insensitive)&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including tagId, tagName, tagUrl, tagKeywords for each tag&lt;br /&gt;
&lt;br /&gt;
===== Relating Tags to Tasks and Activities =====&lt;br /&gt;
&lt;br /&gt;
A tag can be added to any task or activity.  &lt;br /&gt;
&lt;br /&gt;
If you append the fields &amp;lt;tt&amp;gt;tagName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagKeywords&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;parentTagId&amp;lt;/tt&amp;gt; to any POST API call to [[CRM-2 Activities API|create an activity or task]], crm2 will check if the tagName already exists.  If so, the activity or task will be associated with your tag.  In that case, the URL and keywords will be ignored.  If the tag name is not found, it will automatically create a new tag with the name, URL, and keywords and associate it with your task or activity.&lt;br /&gt;
&lt;br /&gt;
You can get all the activities and tasks related to a tag with the API call to https://crm2.opentaps.com/tagActivities&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all activities and tasks related to a task&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of activities and tasks related to the tag&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all the tags related to an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including all their tagId, tagName, tagUrl, tagKeywords, related to the activity&lt;br /&gt;
&lt;br /&gt;
'''POST''': Add a tag to an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete a tag from an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
* tagId&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7560</id>
		<title>CRM-2 Tags API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7560"/>
		<updated>2014-11-05T02:20:38Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Relating Tags to Tasks and Activities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tags are a way to group your activities and tasks and link them to the outside world.  The tags in opentaps crm2 have a tag name, which is the description, plus a URL and keywords.  The URL can be used to link tagged activities to outside data, such as linking emails and notes to a sales order in another system.  The keywords can be used to search for activities which may be related to the tag.   For example, we can use it to search for emails which may be related to an invoice.&lt;br /&gt;
&lt;br /&gt;
Tags are inherited in the following way:&lt;br /&gt;
# When an activity is tagged, a new task created from the activity will have the same tags&lt;br /&gt;
# When a task is tagged, any activity created from the task will be tagged as well.&lt;br /&gt;
# When an existing activity is linked to an existing task, the tags from that task will be inherited by the activity.  However, the activity may have existing tags, and those will still be there as well -- they are not erased when an activity is transferred from one task to another.&lt;br /&gt;
&lt;br /&gt;
==== Tags ====&lt;br /&gt;
&lt;br /&gt;
A tag can store the following data:&lt;br /&gt;
* tagId - unique identifier&lt;br /&gt;
* parentTagId - unique ID of the parent tag, or blank if this tag is at the top level.  For example, a parent tag could be &amp;quot;Sales Orders&amp;quot;, and the tag could be &amp;quot;Sales Order 1&amp;quot;, &amp;quot;Sales Order 2&amp;quot;, etc.&lt;br /&gt;
* tag name - descriptive text of the tag&lt;br /&gt;
* an optional URL link which can be used to link to an outside system, such as the order ID or party ID of a legacy ERP or CRM system.&lt;br /&gt;
* keywords which can be used for searching similar documents&lt;br /&gt;
&lt;br /&gt;
Tag names are case insensitive, so the tags opentaps, OPENTAPs, and OpenTaps would all be considered the same.&lt;br /&gt;
&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
Endpoint: https://crm2.opentaps.com/tag&lt;br /&gt;
&lt;br /&gt;
'''POST''': Create a new tag&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
* parentTagId&lt;br /&gt;
* tagUrl&lt;br /&gt;
* tagKeywords&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* tagId: unique identifier of your tag&lt;br /&gt;
&lt;br /&gt;
If the same tagName (case insensitive) already exists, then the operation would return an error.&lt;br /&gt;
&lt;br /&gt;
'''PUT''': Update an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
* parentTagId&lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''GET''': Search for existing tags which contain your tag name (case insensitive)&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including tagId, tagName, tagUrl, tagKeywords for each tag&lt;br /&gt;
&lt;br /&gt;
===== Relating Tags to Tasks and Activities =====&lt;br /&gt;
&lt;br /&gt;
A tag can be added to any task or activity.  &lt;br /&gt;
&lt;br /&gt;
If you append the fields &amp;lt;tt&amp;gt;tagName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagKeywords&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;parentTagId&amp;lt;/tt&amp;gt; to any POST API call to [[CRM-2 Activities API|create an activity or task]], crm2 will check if the tagName already exists.  If so, the activity or task will be associated with your tag.  In that case, the URL and keywords will be ignored.  If the tag name is not found, it will automatically create a new tag with the name, URL, and keywords and associate it with your task or activity.&lt;br /&gt;
&lt;br /&gt;
You can get all the activities and tasks related to a tag with the API call to https://crm2.opentaps.com/tagActivities&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all activities and tasks related to a task&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of activities and tasks related to the tag&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all the tags related to an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including all their tagId, tagName, tagUrl, tagKeywords, related to the activity&lt;br /&gt;
&lt;br /&gt;
'''POST''': Add a tag to an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete a tag from an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
* tagId&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7559</id>
		<title>CRM-2 Tags API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7559"/>
		<updated>2014-11-05T02:18:52Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Tags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tags are a way to group your activities and tasks and link them to the outside world.  The tags in opentaps crm2 have a tag name, which is the description, plus a URL and keywords.  The URL can be used to link tagged activities to outside data, such as linking emails and notes to a sales order in another system.  The keywords can be used to search for activities which may be related to the tag.   For example, we can use it to search for emails which may be related to an invoice.&lt;br /&gt;
&lt;br /&gt;
Tags are inherited in the following way:&lt;br /&gt;
# When an activity is tagged, a new task created from the activity will have the same tags&lt;br /&gt;
# When a task is tagged, any activity created from the task will be tagged as well.&lt;br /&gt;
# When an existing activity is linked to an existing task, the tags from that task will be inherited by the activity.  However, the activity may have existing tags, and those will still be there as well -- they are not erased when an activity is transferred from one task to another.&lt;br /&gt;
&lt;br /&gt;
==== Tags ====&lt;br /&gt;
&lt;br /&gt;
A tag can store the following data:&lt;br /&gt;
* tagId - unique identifier&lt;br /&gt;
* parentTagId - unique ID of the parent tag, or blank if this tag is at the top level.  For example, a parent tag could be &amp;quot;Sales Orders&amp;quot;, and the tag could be &amp;quot;Sales Order 1&amp;quot;, &amp;quot;Sales Order 2&amp;quot;, etc.&lt;br /&gt;
* tag name - descriptive text of the tag&lt;br /&gt;
* an optional URL link which can be used to link to an outside system, such as the order ID or party ID of a legacy ERP or CRM system.&lt;br /&gt;
* keywords which can be used for searching similar documents&lt;br /&gt;
&lt;br /&gt;
Tag names are case insensitive, so the tags opentaps, OPENTAPs, and OpenTaps would all be considered the same.&lt;br /&gt;
&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
Endpoint: https://crm2.opentaps.com/tag&lt;br /&gt;
&lt;br /&gt;
'''POST''': Create a new tag&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
* parentTagId&lt;br /&gt;
* tagUrl&lt;br /&gt;
* tagKeywords&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* tagId: unique identifier of your tag&lt;br /&gt;
&lt;br /&gt;
If the same tagName (case insensitive) already exists, then the operation would return an error.&lt;br /&gt;
&lt;br /&gt;
'''PUT''': Update an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
* parentTagId&lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''GET''': Search for existing tags which contain your tag name (case insensitive)&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including tagId, tagName, tagUrl, tagKeywords for each tag&lt;br /&gt;
&lt;br /&gt;
===== Relating Tags to Tasks and Activities =====&lt;br /&gt;
&lt;br /&gt;
A tag can be added to any task or activity.  &lt;br /&gt;
&lt;br /&gt;
If you append the fields &amp;lt;tt&amp;gt;tagName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagKeywords&amp;lt;/tt&amp;gt; to any POST API call to [[CRM-2 Activities API|create an activity or task]], crm2 will check if the tagName already exists.  If so, the activity or task will be associated with your tag.  In that case, the URL and keywords will be ignored.  If the tag name is not found, it will automatically create a new tag with the name, URL, and keywords and associate it with your task or activity.&lt;br /&gt;
&lt;br /&gt;
You can get all the activities and tasks related to a tag with the API call to https://crm2.opentaps.com/tagActivities&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all activities and tasks related to a task&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of activities and tasks related to the tag&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all the tags related to an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including all their tagId, tagName, tagUrl, tagKeywords, related to the activity&lt;br /&gt;
&lt;br /&gt;
'''POST''': Add a tag to an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete a tag from an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
* tagId&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Set_up_CRM2&amp;diff=7558</id>
		<title>Set up CRM2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Set_up_CRM2&amp;diff=7558"/>
		<updated>2014-11-03T22:41:52Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Setting up the WordPress Contact Form */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
First, go to [http://www.opentaps.com opentaps.com] to sign up for opentaps CRM2.  &lt;br /&gt;
 &lt;br /&gt;
Once you have received your permanent authorization token key by email, reset it &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -X POST 'https://crm2.opentaps.com/admin/reset-token' -d clientDomain= ${yourDomain} -d authToken=${authToken}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Keep your new auth token secret!'''  Someone with this token will be able to access everything in your account.&lt;br /&gt;
&lt;br /&gt;
== opentaps 1.x ==&lt;br /&gt;
&lt;br /&gt;
=== Setting Up with opentaps in the Cloud ===&lt;br /&gt;
&lt;br /&gt;
If you are using an [http://www.opentaps.org/cloud opentaps in the Cloud] Amazon EC2 instance from an instance which says &amp;quot;crm2&amp;quot;, then CRM2 is already pre-loaded for you.  Simply edit the file &amp;lt;tt&amp;gt;hot-deploy/crm2/config/crm2.properties&amp;lt;/tt&amp;gt; and populate your settings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
crm2.activities.widget.baseOpentapsUrl = https://your-ec2-instance-ip.compute-1.amazonaws.com&lt;br /&gt;
crm2.activities.widget.authToken = your-auth-token-value&lt;br /&gt;
crm2.activities.widget.clientDomain = your-domain.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, restart opentaps&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /etc/init.d/opentaps restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see an activities widget similar to those from [[Tour of CRM2]] in your CRM system.&lt;br /&gt;
&lt;br /&gt;
=== Setting up for opentaps 1.x ===&lt;br /&gt;
&lt;br /&gt;
If you are using an older AMI which does not have &amp;quot;crm2&amp;quot; in its name, or if you are running opentaps on your own server, then you will have to get the code for crm2.  This is available directly from github at https://github.com/opentaps/opentaps-crm2, and you can check it out with  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git clone ssh://git@github.com:opentaps/opentaps-crm2.git opentaps-crm2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then copy it to your hot-deploy directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp -r opentaps-crm2/opentaps-1.5/ path-to-opentaps-1.5/hot-deploy/crm2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of the box, this code works for opentaps 1.5.  If you are using opentaps 1.4 or earlier versions,  you will need to replace some of the lines which are for opentaps 1.5 with those for earlier versions.  Edit the file &amp;lt;tt&amp;gt;src/com/opentaps/crm2/ContactExportService.java&amp;lt;/tt&amp;gt; and search for &amp;quot;opentaps 1.5&amp;quot; and follow the instructions to comment out and uncomment the appropriate lines.  &lt;br /&gt;
&lt;br /&gt;
Next, compile the new module with&lt;br /&gt;
&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;
Add the new module to either opentaps/component-load.xml or hot-deploy/component-load.xml file with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;lt;load-component component-location=&amp;quot;crm2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have the [http://www.opentaps.org/services-support/professional-edition opentaps Professional Edition], just uncomment lines between&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Uncomment to use Crm2 application&lt;br /&gt;
and&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
in the following files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opentaps/crmsfa/webapp/crmsfa/orders/viewOrder.ftl&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/accounts/AccountsScreens.xml&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/contacts/ContactsScreens.xml&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/leads/LeadsScreens.xml&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/orders/OrdersScreens.xml&lt;br /&gt;
opentaps/opentaps-common/webapp/common/WEB-INF/common-controller.xml&lt;br /&gt;
opentaps/purchasing/webapp/purchasing/order/viewOrder.ftl&lt;br /&gt;
opentaps/purchasing/widget/purchasing/screens/order/OrderScreens.xml&lt;br /&gt;
opentaps/purchasing/widget/purchasing/screens/supplier/SupplierScreens.xml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If not, download the [http://sourceforge.net/projects/opentaps/files/opentaps%202/CRM2/opentaps-1.5-crm2.patch/download patch file for crm2] and apply it to your opentaps.&lt;br /&gt;
&lt;br /&gt;
Finally, follow the instructions above to configure your &amp;lt;tt&amp;gt;crm2/config/crm2.properties&amp;lt;/tt&amp;gt; file and restart opentaps.&lt;br /&gt;
&lt;br /&gt;
=== Exporting Users to CRM2 ===&lt;br /&gt;
&lt;br /&gt;
To export your users to CRM2, run the service &amp;lt;tt&amp;gt;exportContactsToCrm2&amp;lt;/tt&amp;gt; with the following parameters:&lt;br /&gt;
* authToken&lt;br /&gt;
* clientDomain&lt;br /&gt;
* exportContactUrl: ​https://crm2.opentaps.com/crm2/contact-import&lt;br /&gt;
* exportUserUrl: ​https://crm2.opentaps.com/crm2/users&lt;br /&gt;
&lt;br /&gt;
This services uses entity sync. Newly created or updated contacts will be added. If the party has a user_login which has _VIEW permission to CRMSFA or FINANCIALS (through any of his user_login_security_permission_group), his user_login_id will be imported as a user_id without password&lt;br /&gt;
&lt;br /&gt;
This service can be set up to run regularly as a job, so new users are automatically added to CRM2.&lt;br /&gt;
&lt;br /&gt;
== Setting up the WordPress Contact Form ==&lt;br /&gt;
&lt;br /&gt;
* Copy opentaps_crm2/wordpress/template-crm2-contact.php to your wordpress curent theme directory&lt;br /&gt;
* Modify template-crm2-contact.php to set up your authToken and clientDomain&lt;br /&gt;
* Create new wordpress Page with template-crm2-contact.php template&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Set_up_CRM2&amp;diff=7557</id>
		<title>Set up CRM2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Set_up_CRM2&amp;diff=7557"/>
		<updated>2014-11-03T22:41:30Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Setting up for opentaps 1.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
First, go to [http://www.opentaps.com opentaps.com] to sign up for opentaps CRM2.  &lt;br /&gt;
 &lt;br /&gt;
Once you have received your permanent authorization token key by email, reset it &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -X POST 'https://crm2.opentaps.com/admin/reset-token' -d clientDomain= ${yourDomain} -d authToken=${authToken}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Keep your new auth token secret!'''  Someone with this token will be able to access everything in your account.&lt;br /&gt;
&lt;br /&gt;
== opentaps 1.x ==&lt;br /&gt;
&lt;br /&gt;
=== Setting Up with opentaps in the Cloud ===&lt;br /&gt;
&lt;br /&gt;
If you are using an [http://www.opentaps.org/cloud opentaps in the Cloud] Amazon EC2 instance from an instance which says &amp;quot;crm2&amp;quot;, then CRM2 is already pre-loaded for you.  Simply edit the file &amp;lt;tt&amp;gt;hot-deploy/crm2/config/crm2.properties&amp;lt;/tt&amp;gt; and populate your settings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
crm2.activities.widget.baseOpentapsUrl = https://your-ec2-instance-ip.compute-1.amazonaws.com&lt;br /&gt;
crm2.activities.widget.authToken = your-auth-token-value&lt;br /&gt;
crm2.activities.widget.clientDomain = your-domain.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, restart opentaps&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /etc/init.d/opentaps restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see an activities widget similar to those from [[Tour of CRM2]] in your CRM system.&lt;br /&gt;
&lt;br /&gt;
=== Setting up for opentaps 1.x ===&lt;br /&gt;
&lt;br /&gt;
If you are using an older AMI which does not have &amp;quot;crm2&amp;quot; in its name, or if you are running opentaps on your own server, then you will have to get the code for crm2.  This is available directly from github at https://github.com/opentaps/opentaps-crm2, and you can check it out with  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git clone ssh://git@github.com:opentaps/opentaps-crm2.git opentaps-crm2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then copy it to your hot-deploy directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp -r opentaps-crm2/opentaps-1.5/ path-to-opentaps-1.5/hot-deploy/crm2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of the box, this code works for opentaps 1.5.  If you are using opentaps 1.4 or earlier versions,  you will need to replace some of the lines which are for opentaps 1.5 with those for earlier versions.  Edit the file &amp;lt;tt&amp;gt;src/com/opentaps/crm2/ContactExportService.java&amp;lt;/tt&amp;gt; and search for &amp;quot;opentaps 1.5&amp;quot; and follow the instructions to comment out and uncomment the appropriate lines.  &lt;br /&gt;
&lt;br /&gt;
Next, compile the new module with&lt;br /&gt;
&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;
Add the new module to either opentaps/component-load.xml or hot-deploy/component-load.xml file with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;lt;load-component component-location=&amp;quot;crm2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have the [http://www.opentaps.org/services-support/professional-edition opentaps Professional Edition], just uncomment lines between&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Uncomment to use Crm2 application&lt;br /&gt;
and&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
in the following files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opentaps/crmsfa/webapp/crmsfa/orders/viewOrder.ftl&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/accounts/AccountsScreens.xml&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/contacts/ContactsScreens.xml&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/leads/LeadsScreens.xml&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/orders/OrdersScreens.xml&lt;br /&gt;
opentaps/opentaps-common/webapp/common/WEB-INF/common-controller.xml&lt;br /&gt;
opentaps/purchasing/webapp/purchasing/order/viewOrder.ftl&lt;br /&gt;
opentaps/purchasing/widget/purchasing/screens/order/OrderScreens.xml&lt;br /&gt;
opentaps/purchasing/widget/purchasing/screens/supplier/SupplierScreens.xml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If not, download the [http://sourceforge.net/projects/opentaps/files/opentaps%202/CRM2/opentaps-1.5-crm2.patch/download patch file for crm2] and apply it to your opentaps.&lt;br /&gt;
&lt;br /&gt;
Finally, follow the instructions above to configure your &amp;lt;tt&amp;gt;crm2/config/crm2.properties&amp;lt;/tt&amp;gt; file and restart opentaps.&lt;br /&gt;
&lt;br /&gt;
=== Exporting Users to CRM2 ===&lt;br /&gt;
&lt;br /&gt;
To export your users to CRM2, run the service &amp;lt;tt&amp;gt;exportContactsToCrm2&amp;lt;/tt&amp;gt; with the following parameters:&lt;br /&gt;
* authToken&lt;br /&gt;
* clientDomain&lt;br /&gt;
* exportContactUrl: ​https://crm2.opentaps.com/crm2/contact-import&lt;br /&gt;
* exportUserUrl: ​https://crm2.opentaps.com/crm2/users&lt;br /&gt;
&lt;br /&gt;
This services uses entity sync. Newly created or updated contacts will be added. If the party has a user_login which has _VIEW permission to CRMSFA or FINANCIALS (through any of his user_login_security_permission_group), his user_login_id will be imported as a user_id without password&lt;br /&gt;
&lt;br /&gt;
This service can be set up to run regularly as a job, so new users are automatically added to CRM2.&lt;br /&gt;
&lt;br /&gt;
=== Setting up the WordPress Contact Form ===&lt;br /&gt;
&lt;br /&gt;
* Copy opentaps_crm2/wordpress/template-crm2-contact.php to your wordpress curent theme directory&lt;br /&gt;
* Modify template-crm2-contact.php to set up your authToken and clientDomain&lt;br /&gt;
* Create new wordpress Page with template-crm2-contact.php template&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Set_up_CRM2&amp;diff=7556</id>
		<title>Set up CRM2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Set_up_CRM2&amp;diff=7556"/>
		<updated>2014-11-03T22:37:06Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
First, go to [http://www.opentaps.com opentaps.com] to sign up for opentaps CRM2.  &lt;br /&gt;
 &lt;br /&gt;
Once you have received your permanent authorization token key by email, reset it &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -X POST 'https://crm2.opentaps.com/admin/reset-token' -d clientDomain= ${yourDomain} -d authToken=${authToken}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Keep your new auth token secret!'''  Someone with this token will be able to access everything in your account.&lt;br /&gt;
&lt;br /&gt;
== opentaps 1.x ==&lt;br /&gt;
&lt;br /&gt;
=== Setting Up with opentaps in the Cloud ===&lt;br /&gt;
&lt;br /&gt;
If you are using an [http://www.opentaps.org/cloud opentaps in the Cloud] Amazon EC2 instance from an instance which says &amp;quot;crm2&amp;quot;, then CRM2 is already pre-loaded for you.  Simply edit the file &amp;lt;tt&amp;gt;hot-deploy/crm2/config/crm2.properties&amp;lt;/tt&amp;gt; and populate your settings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
crm2.activities.widget.baseOpentapsUrl = https://your-ec2-instance-ip.compute-1.amazonaws.com&lt;br /&gt;
crm2.activities.widget.authToken = your-auth-token-value&lt;br /&gt;
crm2.activities.widget.clientDomain = your-domain.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, restart opentaps&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /etc/init.d/opentaps restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see an activities widget similar to those from [[Tour of CRM2]] in your CRM system.&lt;br /&gt;
&lt;br /&gt;
=== Setting up for opentaps 1.x ===&lt;br /&gt;
&lt;br /&gt;
If you are using an older AMI which does not have &amp;quot;crm2&amp;quot; in its name, or if you are running opentaps on your own server, then you will have to get the code for crm2.  This is available directly from github at https://github.com/opentaps/opentaps-crm2, and you can check it out with  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git clone ssh://git@github.com:opentaps/opentaps-crm2.git opentaps-crm2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then copy it to your hot-deploy directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp -r opentaps-crm2/opentaps-1.5/ path-to-opentaps-1.5/hot-deploy/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of the box, this code works for opentaps 1.5.  If you are using opentaps 1.4 or earlier versions,  you will need to replace some of the lines which are for opentaps 1.5 with those for earlier versions.  Edit the file &amp;lt;tt&amp;gt;src/com/opentaps/crm2/ContactExportService.java&amp;lt;/tt&amp;gt; and search for &amp;quot;opentaps 1.5&amp;quot; and follow the instructions to comment out and uncomment the appropriate lines.  &lt;br /&gt;
&lt;br /&gt;
Next, compile the new module with&lt;br /&gt;
&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;
Add the new module to either opentaps/component-load.xml or hot-deploy/component-load.xml file with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;lt;load-component component-location=&amp;quot;crm2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have the [http://www.opentaps.org/services-support/professional-edition opentaps Professional Edition], just uncomment lines between&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Uncomment to use Crm2 application&lt;br /&gt;
and&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
in the following files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opentaps/crmsfa/webapp/crmsfa/orders/viewOrder.ftl&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/accounts/AccountsScreens.xml&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/contacts/ContactsScreens.xml&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/leads/LeadsScreens.xml&lt;br /&gt;
opentaps/crmsfa/widget/crmsfa/screens/orders/OrdersScreens.xml&lt;br /&gt;
opentaps/opentaps-common/webapp/common/WEB-INF/common-controller.xml&lt;br /&gt;
opentaps/purchasing/webapp/purchasing/order/viewOrder.ftl&lt;br /&gt;
opentaps/purchasing/widget/purchasing/screens/order/OrderScreens.xml&lt;br /&gt;
opentaps/purchasing/widget/purchasing/screens/supplier/SupplierScreens.xml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If not, download the [http://sourceforge.net/projects/opentaps/files/opentaps%202/CRM2/opentaps-1.5-crm2.patch/download patch file for crm2] and apply it to your opentaps.&lt;br /&gt;
&lt;br /&gt;
Finally, follow the instructions above to configure your &amp;lt;tt&amp;gt;crm2/config/crm2.properties&amp;lt;/tt&amp;gt; file and restart opentaps.&lt;br /&gt;
&lt;br /&gt;
=== Exporting Users to CRM2 ===&lt;br /&gt;
&lt;br /&gt;
To export your users to CRM2, run the service &amp;lt;tt&amp;gt;exportContactsToCrm2&amp;lt;/tt&amp;gt; with the following parameters:&lt;br /&gt;
* authToken&lt;br /&gt;
* clientDomain&lt;br /&gt;
* exportContactUrl: ​https://crm2.opentaps.com/crm2/contact-import&lt;br /&gt;
* exportUserUrl: ​https://crm2.opentaps.com/crm2/users&lt;br /&gt;
&lt;br /&gt;
This services uses entity sync. Newly created or updated contacts will be added. If the party has a user_login which has _VIEW permission to CRMSFA or FINANCIALS (through any of his user_login_security_permission_group), his user_login_id will be imported as a user_id without password&lt;br /&gt;
&lt;br /&gt;
This service can be set up to run regularly as a job, so new users are automatically added to CRM2.&lt;br /&gt;
&lt;br /&gt;
=== Setting up the WordPress Contact Form ===&lt;br /&gt;
&lt;br /&gt;
* Copy opentaps_crm2/wordpress/template-crm2-contact.php to your wordpress curent theme directory&lt;br /&gt;
* Modify template-crm2-contact.php to set up your authToken and clientDomain&lt;br /&gt;
* Create new wordpress Page with template-crm2-contact.php template&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7554</id>
		<title>CRM-2 Tags API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7554"/>
		<updated>2014-10-14T17:53:00Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tags are a way to group your activities and tasks and link them to the outside world.  The tags in opentaps crm2 have a tag name, which is the description, plus a URL and keywords.  The URL can be used to link tagged activities to outside data, such as linking emails and notes to a sales order in another system.  The keywords can be used to search for activities which may be related to the tag.   For example, we can use it to search for emails which may be related to an invoice.&lt;br /&gt;
&lt;br /&gt;
Tags are inherited in the following way:&lt;br /&gt;
# When an activity is tagged, a new task created from the activity will have the same tags&lt;br /&gt;
# When a task is tagged, any activity created from the task will be tagged as well.&lt;br /&gt;
# When an existing activity is linked to an existing task, the tags from that task will be inherited by the activity.  However, the activity may have existing tags, and those will still be there as well -- they are not erased when an activity is transferred from one task to another.&lt;br /&gt;
&lt;br /&gt;
==== Tags ====&lt;br /&gt;
&lt;br /&gt;
A tag can store the following data:&lt;br /&gt;
* tagId - unique identifier&lt;br /&gt;
* tag name - descriptive text of the tag&lt;br /&gt;
* an optional URL link which can be used to link to an outside system, such as the order ID or party ID of a legacy ERP or CRM system.&lt;br /&gt;
* keywords which can be used for searching similar documents&lt;br /&gt;
&lt;br /&gt;
Tag names are case insensitive, so the tags opentaps, OPENTAPs, and OpenTaps would all be considered the same.&lt;br /&gt;
&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
Endpoint: https://crm2.opentaps.com/tag&lt;br /&gt;
&lt;br /&gt;
'''POST''': Create a new tag&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
* tagUrl&lt;br /&gt;
* tagKeywords&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* tagId: unique identifier of your tag&lt;br /&gt;
&lt;br /&gt;
If the same tagName (case insensitive) already exists, then the operation would return an error.&lt;br /&gt;
&lt;br /&gt;
'''PUT''': Update an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''GET''': Search for existing tags which contain your tag name (case insensitive)&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including tagId, tagName, tagUrl, tagKeywords for each tag&lt;br /&gt;
&lt;br /&gt;
===== Relating Tags to Tasks and Activities =====&lt;br /&gt;
&lt;br /&gt;
A tag can be added to any task or activity.  &lt;br /&gt;
&lt;br /&gt;
If you append the fields &amp;lt;tt&amp;gt;tagName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagKeywords&amp;lt;/tt&amp;gt; to any POST API call to [[CRM-2 Activities API|create an activity or task]], crm2 will check if the tagName already exists.  If so, the activity or task will be associated with your tag.  In that case, the URL and keywords will be ignored.  If the tag name is not found, it will automatically create a new tag with the name, URL, and keywords and associate it with your task or activity.&lt;br /&gt;
&lt;br /&gt;
You can get all the activities and tasks related to a tag with the API call to https://crm2.opentaps.com/tagActivities&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all activities and tasks related to a task&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of activities and tasks related to the tag&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all the tags related to an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including all their tagId, tagName, tagUrl, tagKeywords, related to the activity&lt;br /&gt;
&lt;br /&gt;
'''POST''': Add a tag to an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete a tag from an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
* tagId&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7553</id>
		<title>CRM-2 Tags API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7553"/>
		<updated>2014-10-06T22:24:48Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Relating Tags to Tasks and Activities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Tags ====&lt;br /&gt;
&lt;br /&gt;
A tag can store the following data:&lt;br /&gt;
* tagId - unique identifier&lt;br /&gt;
* tag name - descriptive text of the tag&lt;br /&gt;
* an optional URL link which can be used to link to an outside system, such as the order ID or party ID of a legacy ERP or CRM system.&lt;br /&gt;
* keywords which can be used for searching similar documents&lt;br /&gt;
&lt;br /&gt;
Tag names are case insensitive, so the tags opentaps, OPENTAPs, and OpenTaps would all be considered the same.&lt;br /&gt;
&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
Endpoint: https://crm2.opentaps.com/tag&lt;br /&gt;
&lt;br /&gt;
'''POST''': Create a new tag&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
* tagUrl&lt;br /&gt;
* tagKeywords&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* tagId: unique identifier of your tag&lt;br /&gt;
&lt;br /&gt;
If the same tagName (case insensitive) already exists, then the operation would return an error.&lt;br /&gt;
&lt;br /&gt;
'''PUT''': Update an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''GET''': Search for existing tags which contain your tag name (case insensitive)&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including tagId, tagName, tagUrl, tagKeywords for each tag&lt;br /&gt;
&lt;br /&gt;
===== Relating Tags to Tasks and Activities =====&lt;br /&gt;
&lt;br /&gt;
A tag can be added to any task or activity.  &lt;br /&gt;
&lt;br /&gt;
If you append the fields &amp;lt;tt&amp;gt;tagName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagKeywords&amp;lt;/tt&amp;gt; to any POST API call to [[CRM-2 Activities API|create an activity or task]], crm2 will check if the tagName already exists.  If so, the activity or task will be associated with your tag.  In that case, the URL and keywords will be ignored.  If the tag name is not found, it will automatically create a new tag with the name, URL, and keywords and associate it with your task or activity.&lt;br /&gt;
&lt;br /&gt;
You can get all the activities and tasks related to a tag with the API call to https://crm2.opentaps.com/tagActivities&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all activities and tasks related to a task&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of activities and tasks related to the tag&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all the tags related to an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including all their tagId, tagName, tagUrl, tagKeywords, related to the activity&lt;br /&gt;
&lt;br /&gt;
'''POST''': Add a tag to an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete a tag from an activity&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* activityId&lt;br /&gt;
* tagId&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7552</id>
		<title>CRM-2 Tags API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7552"/>
		<updated>2014-10-06T22:03:31Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Relating Tags to Tasks and Activities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Tags ====&lt;br /&gt;
&lt;br /&gt;
A tag can store the following data:&lt;br /&gt;
* tagId - unique identifier&lt;br /&gt;
* tag name - descriptive text of the tag&lt;br /&gt;
* an optional URL link which can be used to link to an outside system, such as the order ID or party ID of a legacy ERP or CRM system.&lt;br /&gt;
* keywords which can be used for searching similar documents&lt;br /&gt;
&lt;br /&gt;
Tag names are case insensitive, so the tags opentaps, OPENTAPs, and OpenTaps would all be considered the same.&lt;br /&gt;
&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
Endpoint: https://crm2.opentaps.com/tag&lt;br /&gt;
&lt;br /&gt;
'''POST''': Create a new tag&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
* tagUrl&lt;br /&gt;
* tagKeywords&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* tagId: unique identifier of your tag&lt;br /&gt;
&lt;br /&gt;
If the same tagName (case insensitive) already exists, then the operation would return an error.&lt;br /&gt;
&lt;br /&gt;
'''PUT''': Update an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''GET''': Search for existing tags which contain your tag name (case insensitive)&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including tagId, tagName, tagUrl, tagKeywords for each tag&lt;br /&gt;
&lt;br /&gt;
===== Relating Tags to Tasks and Activities =====&lt;br /&gt;
&lt;br /&gt;
A tag can be added to any task or activity.  &lt;br /&gt;
&lt;br /&gt;
If you append the fields &amp;lt;tt&amp;gt;tagName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagKeywords&amp;lt;/tt&amp;gt; to any POST API call to [[CRM-2 Activities API|create an activity or task]], crm2 will check if the tagName already exists.  If so, the activity or task will be associated with your tag.  In that case, the URL and keywords will be ignored.  If the tag name is not found, it will automatically create a new tag with the name, URL, and keywords and associate it with your task or activity.&lt;br /&gt;
&lt;br /&gt;
You can get all the activities and tasks related to a tag with the API call to https://crm2.opentaps.com/tagActivities&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all activities and tasks related to a task&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of activities and tasks related to the tag&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7551</id>
		<title>CRM-2 Tags API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7551"/>
		<updated>2014-10-06T22:03:11Z</updated>

		<summary type="html">&lt;p&gt;Sichen: Protected &amp;quot;CRM-2 Tags API&amp;quot;: Sysop page [edit=sysop:move=sysop]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Tags ====&lt;br /&gt;
&lt;br /&gt;
A tag can store the following data:&lt;br /&gt;
* tagId - unique identifier&lt;br /&gt;
* tag name - descriptive text of the tag&lt;br /&gt;
* an optional URL link which can be used to link to an outside system, such as the order ID or party ID of a legacy ERP or CRM system.&lt;br /&gt;
* keywords which can be used for searching similar documents&lt;br /&gt;
&lt;br /&gt;
Tag names are case insensitive, so the tags opentaps, OPENTAPs, and OpenTaps would all be considered the same.&lt;br /&gt;
&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
Endpoint: https://crm2.opentaps.com/tag&lt;br /&gt;
&lt;br /&gt;
'''POST''': Create a new tag&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
* tagUrl&lt;br /&gt;
* tagKeywords&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* tagId: unique identifier of your tag&lt;br /&gt;
&lt;br /&gt;
If the same tagName (case insensitive) already exists, then the operation would return an error.&lt;br /&gt;
&lt;br /&gt;
'''PUT''': Update an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''GET''': Search for existing tags which contain your tag name (case insensitive)&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including tagId, tagName, tagUrl, tagKeywords for each tag&lt;br /&gt;
&lt;br /&gt;
===== Relating Tags to Tasks and Activities =====&lt;br /&gt;
&lt;br /&gt;
A tag can be added to any task or activity.  &lt;br /&gt;
&lt;br /&gt;
If you append the fields &amp;lt;tt&amp;gt;tagName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagKeywords&amp;lt;/tt&amp;gt; to any POST API call to [[CRM-2 Activities API|create an activity or task]], crm2 will check if the tagName already exists.  If so, the activity or task will be associated with your tag.  In that case, the URL and keywords will be ignored.  If the tag name is not found, it will automatically create a new tag with the name, URL, and keywords and associate it with your task or activity.&lt;br /&gt;
&lt;br /&gt;
You can get all the activities and tasks related to a tag with the API call to https://crm2.opentaps.com/tagActivities&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all activities and tasks related to a task&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
List of activities and tasks related to the tag&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7550</id>
		<title>CRM-2 Tags API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_Tags_API&amp;diff=7550"/>
		<updated>2014-10-06T22:03:10Z</updated>

		<summary type="html">&lt;p&gt;Sichen: New page: ==== Tags ====  A tag can store the following data: * tagId - unique identifier * tag name - descriptive text of the tag * an optional URL link which can be used to link to an outside syst...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Tags ====&lt;br /&gt;
&lt;br /&gt;
A tag can store the following data:&lt;br /&gt;
* tagId - unique identifier&lt;br /&gt;
* tag name - descriptive text of the tag&lt;br /&gt;
* an optional URL link which can be used to link to an outside system, such as the order ID or party ID of a legacy ERP or CRM system.&lt;br /&gt;
* keywords which can be used for searching similar documents&lt;br /&gt;
&lt;br /&gt;
Tag names are case insensitive, so the tags opentaps, OPENTAPs, and OpenTaps would all be considered the same.&lt;br /&gt;
&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
Endpoint: https://crm2.opentaps.com/tag&lt;br /&gt;
&lt;br /&gt;
'''POST''': Create a new tag&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
* tagUrl&lt;br /&gt;
* tagKeywords&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* tagId: unique identifier of your tag&lt;br /&gt;
&lt;br /&gt;
If the same tagName (case insensitive) already exists, then the operation would return an error.&lt;br /&gt;
&lt;br /&gt;
'''PUT''': Update an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''DELETE''': Delete an existing tag using the unique tagId&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId &lt;br /&gt;
&lt;br /&gt;
'''GET''': Search for existing tags which contain your tag name (case insensitive)&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagName&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
* List of tags, including tagId, tagName, tagUrl, tagKeywords for each tag&lt;br /&gt;
&lt;br /&gt;
===== Relating Tags to Tasks and Activities =====&lt;br /&gt;
&lt;br /&gt;
A tag can be added to any task or activity.  &lt;br /&gt;
&lt;br /&gt;
If you append the fields &amp;lt;tt&amp;gt;tagName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tagKeywords&amp;lt;/tt&amp;gt; to any POST API call to [[CRM-2 Activities API|create an activity or task]], crm2 will check if the tagName already exists.  If so, the activity or task will be associated with your tag.  In that case, the URL and keywords will be ignored.  If the tag name is not found, it will automatically create a new tag with the name, URL, and keywords and associate it with your task or activity.&lt;br /&gt;
&lt;br /&gt;
You can get all the activities and tasks related to a tag with the API call to https://crm2.opentaps.com/tagActivities&lt;br /&gt;
&lt;br /&gt;
'''GET''': Get all activities and tasks related to a task&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
* clientDomain&lt;br /&gt;
* authToken&lt;br /&gt;
* tagId&lt;br /&gt;
&lt;br /&gt;
Returns&lt;br /&gt;
List of activities and tasks related to the tag&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_API&amp;diff=7549</id>
		<title>CRM-2 API</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=CRM-2_API&amp;diff=7549"/>
		<updated>2014-10-06T21:46:07Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CRM-2 API is accessed via RESTful services using your authorization token key.  All access to CRM-2 API follow this common pattern:&lt;br /&gt;
* URL: RESTful URL of the CRM-2 resource&lt;br /&gt;
* operation: &lt;br /&gt;
** POST: creates new value&lt;br /&gt;
** GET: get existing value(s)&lt;br /&gt;
** PUT: update existing value&lt;br /&gt;
** DELETE: delete existing value&lt;br /&gt;
* clientDomain: name of your domain, ie xyz.com&lt;br /&gt;
* authToken: your access token key, a very long alphanumeric string&lt;br /&gt;
* parameters: key value pairs for your API operation&lt;br /&gt;
&lt;br /&gt;
You can also use curl or a visual RESTful client to test the API.  For example,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -X POST 'http://crm-2-url/admin/activity-type' -d clientDomain=newdomain.com -d activityType=&amp;quot;PINNED&amp;quot; &lt;br /&gt;
-d authToken=&amp;lt;token&amp;gt;&lt;br /&gt;
$ curl -X GET &amp;quot;http://crm-2-url/admin/activity-type?clientDomain=newdomain.com&lt;br /&gt;
&amp;amp;authToken=&amp;lt;token&amp;gt;&amp;quot;&lt;br /&gt;
$ curl -X DELETE 'http://crm-2-url/admin/activity-type' -d clientDomain=newdomain.com -d activityType=&amp;quot;PINNED&amp;quot; -d authToken=&amp;lt;token&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
can be used to create, read, and delete data.&lt;br /&gt;
&lt;br /&gt;
To update data, a PUT operation is used&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -X PUT --data &amp;quot;clientDomain=xyz.com&amp;amp;mailUser=newemail@gmail.com&amp;amp;mailStoreProtocol=&amp;quot;imaps&amp;quot;&amp;amp;&lt;br /&gt;
mailHost=&amp;quot;pop.googlemail.com&amp;quot;&amp;amp;mailPass=&amp;quot;123456&amp;quot;&lt;br /&gt;
&amp;amp;authToken=&amp;lt;token&amp;gt;&amp;quot; &lt;br /&gt;
http://crm-2-url/admin/email-to-poll&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
API available, grouped by section, are:&lt;br /&gt;
* [[CRM-2 Administrative API]]&lt;br /&gt;
* [[CRM-2 Contacts API]]&lt;br /&gt;
* [[CRM-2 Activities API]]&lt;br /&gt;
* [[CRM-2 Tags API]]&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7548</id>
		<title>Opentaps 2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7548"/>
		<updated>2014-10-06T21:45:33Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* For Developers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;opentaps CRM2 has been completely re-designed is a CRM system that helps your team work more effectively using your current tools, without installing or learning new software.   You can access it from the web, from Gmail, and even embed it into your existing order management or business application system.  It lets everybody in your organization work together by sharing their emails, discussions, and activities while using their favorite tools to get their jobs done.&lt;br /&gt;
&lt;br /&gt;
'''opentaps CRM2 is available for a limited time as a free trial, so sign up today at https://crm2.opentaps.com/signup'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Features ===&lt;br /&gt;
&lt;br /&gt;
Please see [http://www.opentaps.com opentaps.com]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to Get It ===&lt;br /&gt;
&lt;br /&gt;
See [http://www.opentaps.com www.opentaps.com]&lt;br /&gt;
&lt;br /&gt;
=== Where to Get Help ===&lt;br /&gt;
&lt;br /&gt;
Use our [http://opentaps.org/forum forum] if you have any questions about using CRM2, or just want to give us your suggestions.  Or just want to say something nice :)&lt;br /&gt;
&lt;br /&gt;
=== User's Manual ===&lt;br /&gt;
&lt;br /&gt;
==== Collaboration ====&lt;br /&gt;
&lt;br /&gt;
When the user enters a note with one or more '@&amp;lt;userid&amp;gt;', this means that he is trying to communicate with that person.  For example, this message&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@sichen The customer just called about this invoice.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the page of invoice 10001 means that this is a message for the user sichen.&lt;br /&gt;
&lt;br /&gt;
An email would be sent to the contact corresponding to that user.  If the user replies to the email, then the reply is added as an additional note to the same attributes (ie, order, invoice, payment, or party).  The email could also embed a link to take the user to chat on the page of the order/invoice/payment/party.  In the body of the email, `-----` is a separator.  Content below the separator in the response will not be recorded in the note.  If you want to have a signature block in your email, put the separator above your signature line.&lt;br /&gt;
&lt;br /&gt;
There is also a line of the @names that will be sent copies of the email.  You can add or remove the forwarding list here.  &lt;br /&gt;
&lt;br /&gt;
The person who writes the note or the reply will not be sent an email.&lt;br /&gt;
&lt;br /&gt;
At the bottom is a line with the UUID of the attributes.  This is used to identify reply emails with the attributes of the message (ie, order/invoice/payment/party).&lt;br /&gt;
&lt;br /&gt;
==== Contacts ====&lt;br /&gt;
&lt;br /&gt;
Contacts are people in the system.  A Contact has first name, last name, and company name.  It could have as many addresses, phone numbers, emails as you'd like, identified by purposes.  The purposes are for your own benefit and have no special meaning for the system.  Each contact is identified by a unique ID.&lt;br /&gt;
&lt;br /&gt;
==== Users ====&lt;br /&gt;
&lt;br /&gt;
A Contact could also have as many user logins as needed.  We currently support authentication with both Google Apps (Gmail) and twitter logins.  You can also import your old opentaps 1.x series with type &amp;quot;INTERNAL&amp;quot;, but we currently don't support logging in with opentaps 1.x usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
The User is not associated with a domain but rather with a Contact.  The security permissions of a User are mapped to a particular domain, so it is possible theoretically for your User to have access to several domains.&lt;br /&gt;
&lt;br /&gt;
However, the user interface is currently implemented so that &lt;br /&gt;
# A User is set up along with a Contact, and the screens for managing the User manages the Contact details as well.&lt;br /&gt;
# The User is particular to your domain, set up by the domain's administrative user.&lt;br /&gt;
&lt;br /&gt;
==== Contact Groups ====&lt;br /&gt;
&lt;br /&gt;
You can also create a group of your contacts:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-contacts.png|700px]]&lt;br /&gt;
&lt;br /&gt;
and then track all their activities, including emails, notes, and tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-activities.png|700px]]&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 will analyze their activities together and show you what they're all talking about, and with whom:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Tasks ====&lt;br /&gt;
&lt;br /&gt;
For any contact, contact group, or any order, invoice, or payment, you can create tasks as well as notes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-create-new-task-widget.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Once you've created your task, you can see it in the Tasks tab:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-list-and-task-view.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Tasks can have notes and tasks of their own, like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-add-notes.png|700px]]&lt;br /&gt;
&lt;br /&gt;
The dashboard in the web interface shows you all the activities and a summary of the different tasks:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-activities-dashboard.png|700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Twitter Integration ====&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 integrates with Twitter, so you can&lt;br /&gt;
* Monitor your contacts' and groups' tweets&lt;br /&gt;
* Analyze tweets to identify trending topics and people&lt;br /&gt;
* Tweet and reply to tweets&lt;br /&gt;
* See the number of people your Contact is following and their number of followers&lt;br /&gt;
&lt;br /&gt;
To use the twitter integration, you must set up a twitter login for yourself and then login at least once with your twitter login to authorize opentaps CRM2 to use your twitter account.  opentaps CRM2 will store your twitter login and authentication token for future use.  If you have multiple users, they will all be authorized to use twitter.  opentaps CRM2 will use the first twitter login stored to interact with twitter.&lt;br /&gt;
&lt;br /&gt;
Tweet history:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Twitter Activities Stream.png]]&lt;br /&gt;
&lt;br /&gt;
Summary of tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Activities Summary.png]]&lt;br /&gt;
&lt;br /&gt;
Composing a new tweet:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-new-tweet.png]]&lt;br /&gt;
&lt;br /&gt;
Reply to a tweet:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-reply-to-tweet.png]]&lt;br /&gt;
&lt;br /&gt;
==== Gmail User Interface ====&lt;br /&gt;
&lt;br /&gt;
The new Gmail user interface lets you see your contact's activities, includes other notes, discussions, and tweets, from Gmail, as you are emailing them:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Gmail UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== For Developers ===&lt;br /&gt;
&lt;br /&gt;
[https://crm2.opentaps.com/signup Sign up for a free trial] and learn how to [[Administer CRM2]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Set up CRM2]] with your legacy opentaps 1.x system and with wordpress.  &lt;br /&gt;
&lt;br /&gt;
==== CRM2 API ====&lt;br /&gt;
&lt;br /&gt;
For developers, please see the [[CRM-2 API]] documentation.&lt;br /&gt;
&lt;br /&gt;
==== Embedded User Interface ====&lt;br /&gt;
&lt;br /&gt;
CRM2 comes with a set of widgets which could be plugged right into your opentaps 1.x series, so that your users can use it on their pages for contacts, orders, invoices, and payments without going to a different application.  This allows them to discuss issues, see history of notes and discussions, and even find relevant emails while they're processing orders/invoices/payments.  These widgets can also be extended to other parts of the system and to other legacy ERP or CRM systems.&lt;br /&gt;
&lt;br /&gt;
See [[Tour of CRM2]] for how it works and [[Set up CRM2]] for instructions on configuring it to work with your legacy opentaps 1.x system.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7547</id>
		<title>Opentaps 2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7547"/>
		<updated>2014-10-06T21:45:13Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Tags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;opentaps CRM2 has been completely re-designed is a CRM system that helps your team work more effectively using your current tools, without installing or learning new software.   You can access it from the web, from Gmail, and even embed it into your existing order management or business application system.  It lets everybody in your organization work together by sharing their emails, discussions, and activities while using their favorite tools to get their jobs done.&lt;br /&gt;
&lt;br /&gt;
'''opentaps CRM2 is available for a limited time as a free trial, so sign up today at https://crm2.opentaps.com/signup'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Features ===&lt;br /&gt;
&lt;br /&gt;
Please see [http://www.opentaps.com opentaps.com]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to Get It ===&lt;br /&gt;
&lt;br /&gt;
See [http://www.opentaps.com www.opentaps.com]&lt;br /&gt;
&lt;br /&gt;
=== Where to Get Help ===&lt;br /&gt;
&lt;br /&gt;
Use our [http://opentaps.org/forum forum] if you have any questions about using CRM2, or just want to give us your suggestions.  Or just want to say something nice :)&lt;br /&gt;
&lt;br /&gt;
=== User's Manual ===&lt;br /&gt;
&lt;br /&gt;
==== Collaboration ====&lt;br /&gt;
&lt;br /&gt;
When the user enters a note with one or more '@&amp;lt;userid&amp;gt;', this means that he is trying to communicate with that person.  For example, this message&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@sichen The customer just called about this invoice.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the page of invoice 10001 means that this is a message for the user sichen.&lt;br /&gt;
&lt;br /&gt;
An email would be sent to the contact corresponding to that user.  If the user replies to the email, then the reply is added as an additional note to the same attributes (ie, order, invoice, payment, or party).  The email could also embed a link to take the user to chat on the page of the order/invoice/payment/party.  In the body of the email, `-----` is a separator.  Content below the separator in the response will not be recorded in the note.  If you want to have a signature block in your email, put the separator above your signature line.&lt;br /&gt;
&lt;br /&gt;
There is also a line of the @names that will be sent copies of the email.  You can add or remove the forwarding list here.  &lt;br /&gt;
&lt;br /&gt;
The person who writes the note or the reply will not be sent an email.&lt;br /&gt;
&lt;br /&gt;
At the bottom is a line with the UUID of the attributes.  This is used to identify reply emails with the attributes of the message (ie, order/invoice/payment/party).&lt;br /&gt;
&lt;br /&gt;
==== Contacts ====&lt;br /&gt;
&lt;br /&gt;
Contacts are people in the system.  A Contact has first name, last name, and company name.  It could have as many addresses, phone numbers, emails as you'd like, identified by purposes.  The purposes are for your own benefit and have no special meaning for the system.  Each contact is identified by a unique ID.&lt;br /&gt;
&lt;br /&gt;
==== Users ====&lt;br /&gt;
&lt;br /&gt;
A Contact could also have as many user logins as needed.  We currently support authentication with both Google Apps (Gmail) and twitter logins.  You can also import your old opentaps 1.x series with type &amp;quot;INTERNAL&amp;quot;, but we currently don't support logging in with opentaps 1.x usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
The User is not associated with a domain but rather with a Contact.  The security permissions of a User are mapped to a particular domain, so it is possible theoretically for your User to have access to several domains.&lt;br /&gt;
&lt;br /&gt;
However, the user interface is currently implemented so that &lt;br /&gt;
# A User is set up along with a Contact, and the screens for managing the User manages the Contact details as well.&lt;br /&gt;
# The User is particular to your domain, set up by the domain's administrative user.&lt;br /&gt;
&lt;br /&gt;
==== Contact Groups ====&lt;br /&gt;
&lt;br /&gt;
You can also create a group of your contacts:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-contacts.png|700px]]&lt;br /&gt;
&lt;br /&gt;
and then track all their activities, including emails, notes, and tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-activities.png|700px]]&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 will analyze their activities together and show you what they're all talking about, and with whom:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Tasks ====&lt;br /&gt;
&lt;br /&gt;
For any contact, contact group, or any order, invoice, or payment, you can create tasks as well as notes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-create-new-task-widget.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Once you've created your task, you can see it in the Tasks tab:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-list-and-task-view.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Tasks can have notes and tasks of their own, like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-add-notes.png|700px]]&lt;br /&gt;
&lt;br /&gt;
The dashboard in the web interface shows you all the activities and a summary of the different tasks:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-activities-dashboard.png|700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Twitter Integration ====&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 integrates with Twitter, so you can&lt;br /&gt;
* Monitor your contacts' and groups' tweets&lt;br /&gt;
* Analyze tweets to identify trending topics and people&lt;br /&gt;
* Tweet and reply to tweets&lt;br /&gt;
* See the number of people your Contact is following and their number of followers&lt;br /&gt;
&lt;br /&gt;
To use the twitter integration, you must set up a twitter login for yourself and then login at least once with your twitter login to authorize opentaps CRM2 to use your twitter account.  opentaps CRM2 will store your twitter login and authentication token for future use.  If you have multiple users, they will all be authorized to use twitter.  opentaps CRM2 will use the first twitter login stored to interact with twitter.&lt;br /&gt;
&lt;br /&gt;
Tweet history:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Twitter Activities Stream.png]]&lt;br /&gt;
&lt;br /&gt;
Summary of tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Activities Summary.png]]&lt;br /&gt;
&lt;br /&gt;
Composing a new tweet:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-new-tweet.png]]&lt;br /&gt;
&lt;br /&gt;
Reply to a tweet:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-reply-to-tweet.png]]&lt;br /&gt;
&lt;br /&gt;
==== Gmail User Interface ====&lt;br /&gt;
&lt;br /&gt;
The new Gmail user interface lets you see your contact's activities, includes other notes, discussions, and tweets, from Gmail, as you are emailing them:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Gmail UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== For Developers ===&lt;br /&gt;
&lt;br /&gt;
[https://crm2.opentaps.com/signup Sign up for a free trial] and learn how to [[Administer CRM2]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Set up CRM2]] with your legacy opentaps 1.x system and with wordpress.  &lt;br /&gt;
&lt;br /&gt;
For developers, please see the [[CRM-2 API]] documentation.&lt;br /&gt;
&lt;br /&gt;
==== Embedded User Interface ====&lt;br /&gt;
&lt;br /&gt;
CRM2 comes with a set of widgets which could be plugged right into your opentaps 1.x series, so that your users can use it on their pages for contacts, orders, invoices, and payments without going to a different application.  This allows them to discuss issues, see history of notes and discussions, and even find relevant emails while they're processing orders/invoices/payments.  These widgets can also be extended to other parts of the system and to other legacy ERP or CRM systems.&lt;br /&gt;
&lt;br /&gt;
See [[Tour of CRM2]] for how it works and [[Set up CRM2]] for instructions on configuring it to work with your legacy opentaps 1.x system.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7546</id>
		<title>Opentaps 2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7546"/>
		<updated>2014-10-06T21:39:51Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Tasks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;opentaps CRM2 has been completely re-designed is a CRM system that helps your team work more effectively using your current tools, without installing or learning new software.   You can access it from the web, from Gmail, and even embed it into your existing order management or business application system.  It lets everybody in your organization work together by sharing their emails, discussions, and activities while using their favorite tools to get their jobs done.&lt;br /&gt;
&lt;br /&gt;
'''opentaps CRM2 is available for a limited time as a free trial, so sign up today at https://crm2.opentaps.com/signup'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Features ===&lt;br /&gt;
&lt;br /&gt;
Please see [http://www.opentaps.com opentaps.com]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to Get It ===&lt;br /&gt;
&lt;br /&gt;
See [http://www.opentaps.com www.opentaps.com]&lt;br /&gt;
&lt;br /&gt;
=== Where to Get Help ===&lt;br /&gt;
&lt;br /&gt;
Use our [http://opentaps.org/forum forum] if you have any questions about using CRM2, or just want to give us your suggestions.  Or just want to say something nice :)&lt;br /&gt;
&lt;br /&gt;
=== User's Manual ===&lt;br /&gt;
&lt;br /&gt;
==== Collaboration ====&lt;br /&gt;
&lt;br /&gt;
When the user enters a note with one or more '@&amp;lt;userid&amp;gt;', this means that he is trying to communicate with that person.  For example, this message&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@sichen The customer just called about this invoice.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the page of invoice 10001 means that this is a message for the user sichen.&lt;br /&gt;
&lt;br /&gt;
An email would be sent to the contact corresponding to that user.  If the user replies to the email, then the reply is added as an additional note to the same attributes (ie, order, invoice, payment, or party).  The email could also embed a link to take the user to chat on the page of the order/invoice/payment/party.  In the body of the email, `-----` is a separator.  Content below the separator in the response will not be recorded in the note.  If you want to have a signature block in your email, put the separator above your signature line.&lt;br /&gt;
&lt;br /&gt;
There is also a line of the @names that will be sent copies of the email.  You can add or remove the forwarding list here.  &lt;br /&gt;
&lt;br /&gt;
The person who writes the note or the reply will not be sent an email.&lt;br /&gt;
&lt;br /&gt;
At the bottom is a line with the UUID of the attributes.  This is used to identify reply emails with the attributes of the message (ie, order/invoice/payment/party).&lt;br /&gt;
&lt;br /&gt;
==== Contacts ====&lt;br /&gt;
&lt;br /&gt;
Contacts are people in the system.  A Contact has first name, last name, and company name.  It could have as many addresses, phone numbers, emails as you'd like, identified by purposes.  The purposes are for your own benefit and have no special meaning for the system.  Each contact is identified by a unique ID.&lt;br /&gt;
&lt;br /&gt;
==== Users ====&lt;br /&gt;
&lt;br /&gt;
A Contact could also have as many user logins as needed.  We currently support authentication with both Google Apps (Gmail) and twitter logins.  You can also import your old opentaps 1.x series with type &amp;quot;INTERNAL&amp;quot;, but we currently don't support logging in with opentaps 1.x usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
The User is not associated with a domain but rather with a Contact.  The security permissions of a User are mapped to a particular domain, so it is possible theoretically for your User to have access to several domains.&lt;br /&gt;
&lt;br /&gt;
However, the user interface is currently implemented so that &lt;br /&gt;
# A User is set up along with a Contact, and the screens for managing the User manages the Contact details as well.&lt;br /&gt;
# The User is particular to your domain, set up by the domain's administrative user.&lt;br /&gt;
&lt;br /&gt;
==== Contact Groups ====&lt;br /&gt;
&lt;br /&gt;
You can also create a group of your contacts:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-contacts.png|700px]]&lt;br /&gt;
&lt;br /&gt;
and then track all their activities, including emails, notes, and tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-activities.png|700px]]&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 will analyze their activities together and show you what they're all talking about, and with whom:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Tasks ====&lt;br /&gt;
&lt;br /&gt;
For any contact, contact group, or any order, invoice, or payment, you can create tasks as well as notes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-create-new-task-widget.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Once you've created your task, you can see it in the Tasks tab:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-list-and-task-view.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Tasks can have notes and tasks of their own, like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-add-notes.png|700px]]&lt;br /&gt;
&lt;br /&gt;
The dashboard in the web interface shows you all the activities and a summary of the different tasks:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-activities-dashboard.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Tags ====&lt;br /&gt;
&lt;br /&gt;
==== Twitter Integration ====&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 integrates with Twitter, so you can&lt;br /&gt;
* Monitor your contacts' and groups' tweets&lt;br /&gt;
* Analyze tweets to identify trending topics and people&lt;br /&gt;
* Tweet and reply to tweets&lt;br /&gt;
* See the number of people your Contact is following and their number of followers&lt;br /&gt;
&lt;br /&gt;
To use the twitter integration, you must set up a twitter login for yourself and then login at least once with your twitter login to authorize opentaps CRM2 to use your twitter account.  opentaps CRM2 will store your twitter login and authentication token for future use.  If you have multiple users, they will all be authorized to use twitter.  opentaps CRM2 will use the first twitter login stored to interact with twitter.&lt;br /&gt;
&lt;br /&gt;
Tweet history:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Twitter Activities Stream.png]]&lt;br /&gt;
&lt;br /&gt;
Summary of tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Activities Summary.png]]&lt;br /&gt;
&lt;br /&gt;
Composing a new tweet:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-new-tweet.png]]&lt;br /&gt;
&lt;br /&gt;
Reply to a tweet:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-reply-to-tweet.png]]&lt;br /&gt;
&lt;br /&gt;
==== Gmail User Interface ====&lt;br /&gt;
&lt;br /&gt;
The new Gmail user interface lets you see your contact's activities, includes other notes, discussions, and tweets, from Gmail, as you are emailing them:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Gmail UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== For Developers ===&lt;br /&gt;
&lt;br /&gt;
[https://crm2.opentaps.com/signup Sign up for a free trial] and learn how to [[Administer CRM2]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Set up CRM2]] with your legacy opentaps 1.x system and with wordpress.  &lt;br /&gt;
&lt;br /&gt;
For developers, please see the [[CRM-2 API]] documentation.&lt;br /&gt;
&lt;br /&gt;
==== Embedded User Interface ====&lt;br /&gt;
&lt;br /&gt;
CRM2 comes with a set of widgets which could be plugged right into your opentaps 1.x series, so that your users can use it on their pages for contacts, orders, invoices, and payments without going to a different application.  This allows them to discuss issues, see history of notes and discussions, and even find relevant emails while they're processing orders/invoices/payments.  These widgets can also be extended to other parts of the system and to other legacy ERP or CRM systems.&lt;br /&gt;
&lt;br /&gt;
See [[Tour of CRM2]] for how it works and [[Set up CRM2]] for instructions on configuring it to work with your legacy opentaps 1.x system.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Administrative_API&amp;diff=7545</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=7545"/>
		<updated>2014-08-08T01:09:57Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* User Permissions */&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;smtps&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;smtp.gmail.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;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>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7543</id>
		<title>Opentaps 2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7543"/>
		<updated>2014-08-06T22:18:33Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Twitter Integration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;opentaps CRM2 has been completely re-designed is a CRM system that helps your team work more effectively using your current tools, without installing or learning new software.   You can access it from the web, from Gmail, and even embed it into your existing order management or business application system.  It lets everybody in your organization work together by sharing their emails, discussions, and activities while using their favorite tools to get their jobs done.&lt;br /&gt;
&lt;br /&gt;
'''opentaps CRM2 is available for a limited time as a free trial, so sign up today at https://crm2.opentaps.com/signup'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Features ===&lt;br /&gt;
&lt;br /&gt;
Please see [http://www.opentaps.com opentaps.com]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to Get It ===&lt;br /&gt;
&lt;br /&gt;
See [http://www.opentaps.com www.opentaps.com]&lt;br /&gt;
&lt;br /&gt;
=== Where to Get Help ===&lt;br /&gt;
&lt;br /&gt;
Use our [http://opentaps.org/forum forum] if you have any questions about using CRM2, or just want to give us your suggestions.  Or just want to say something nice :)&lt;br /&gt;
&lt;br /&gt;
=== User's Manual ===&lt;br /&gt;
&lt;br /&gt;
==== Collaboration ====&lt;br /&gt;
&lt;br /&gt;
When the user enters a note with one or more '@&amp;lt;userid&amp;gt;', this means that he is trying to communicate with that person.  For example, this message&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@sichen The customer just called about this invoice.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the page of invoice 10001 means that this is a message for the user sichen.&lt;br /&gt;
&lt;br /&gt;
An email would be sent to the contact corresponding to that user.  If the user replies to the email, then the reply is added as an additional note to the same attributes (ie, order, invoice, payment, or party).  The email could also embed a link to take the user to chat on the page of the order/invoice/payment/party.  In the body of the email, `-----` is a separator.  Content below the separator in the response will not be recorded in the note.  If you want to have a signature block in your email, put the separator above your signature line.&lt;br /&gt;
&lt;br /&gt;
There is also a line of the @names that will be sent copies of the email.  You can add or remove the forwarding list here.  &lt;br /&gt;
&lt;br /&gt;
The person who writes the note or the reply will not be sent an email.&lt;br /&gt;
&lt;br /&gt;
At the bottom is a line with the UUID of the attributes.  This is used to identify reply emails with the attributes of the message (ie, order/invoice/payment/party).&lt;br /&gt;
&lt;br /&gt;
==== Contacts ====&lt;br /&gt;
&lt;br /&gt;
Contacts are people in the system.  A Contact has first name, last name, and company name.  It could have as many addresses, phone numbers, emails as you'd like, identified by purposes.  The purposes are for your own benefit and have no special meaning for the system.  Each contact is identified by a unique ID.&lt;br /&gt;
&lt;br /&gt;
==== Users ====&lt;br /&gt;
&lt;br /&gt;
A Contact could also have as many user logins as needed.  We currently support authentication with both Google Apps (Gmail) and twitter logins.  You can also import your old opentaps 1.x series with type &amp;quot;INTERNAL&amp;quot;, but we currently don't support logging in with opentaps 1.x usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
The User is not associated with a domain but rather with a Contact.  The security permissions of a User are mapped to a particular domain, so it is possible theoretically for your User to have access to several domains.&lt;br /&gt;
&lt;br /&gt;
However, the user interface is currently implemented so that &lt;br /&gt;
# A User is set up along with a Contact, and the screens for managing the User manages the Contact details as well.&lt;br /&gt;
# The User is particular to your domain, set up by the domain's administrative user.&lt;br /&gt;
&lt;br /&gt;
==== Contact Groups ====&lt;br /&gt;
&lt;br /&gt;
You can also create a group of your contacts:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-contacts.png|700px]]&lt;br /&gt;
&lt;br /&gt;
and then track all their activities, including emails, notes, and tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-activities.png|700px]]&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 will analyze their activities together and show you what they're all talking about, and with whom:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Tasks ====&lt;br /&gt;
&lt;br /&gt;
For any contact, contact group, or any order, invoice, or payment, you can create tasks as well as notes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-create-new-task-widget.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Once you've created your task, you can see it in the Tasks tab:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-list-and-task-view.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Tasks can have notes and tasks of their own, like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-add-notes.png|700px]]&lt;br /&gt;
&lt;br /&gt;
The dashboard in the web interface shows you all the activities and a summary of the different tasks:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-activities-dashboard.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Twitter Integration ====&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 integrates with Twitter, so you can&lt;br /&gt;
* Monitor your contacts' and groups' tweets&lt;br /&gt;
* Analyze tweets to identify trending topics and people&lt;br /&gt;
* Tweet and reply to tweets&lt;br /&gt;
* See the number of people your Contact is following and their number of followers&lt;br /&gt;
&lt;br /&gt;
To use the twitter integration, you must set up a twitter login for yourself and then login at least once with your twitter login to authorize opentaps CRM2 to use your twitter account.  opentaps CRM2 will store your twitter login and authentication token for future use.  If you have multiple users, they will all be authorized to use twitter.  opentaps CRM2 will use the first twitter login stored to interact with twitter.&lt;br /&gt;
&lt;br /&gt;
Tweet history:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Twitter Activities Stream.png]]&lt;br /&gt;
&lt;br /&gt;
Summary of tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Activities Summary.png]]&lt;br /&gt;
&lt;br /&gt;
Composing a new tweet:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-new-tweet.png]]&lt;br /&gt;
&lt;br /&gt;
Reply to a tweet:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-reply-to-tweet.png]]&lt;br /&gt;
&lt;br /&gt;
==== Gmail User Interface ====&lt;br /&gt;
&lt;br /&gt;
The new Gmail user interface lets you see your contact's activities, includes other notes, discussions, and tweets, from Gmail, as you are emailing them:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Gmail UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== For Developers ===&lt;br /&gt;
&lt;br /&gt;
[https://crm2.opentaps.com/signup Sign up for a free trial] and learn how to [[Administer CRM2]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Set up CRM2]] with your legacy opentaps 1.x system and with wordpress.  &lt;br /&gt;
&lt;br /&gt;
For developers, please see the [[CRM-2 API]] documentation.&lt;br /&gt;
&lt;br /&gt;
==== Embedded User Interface ====&lt;br /&gt;
&lt;br /&gt;
CRM2 comes with a set of widgets which could be plugged right into your opentaps 1.x series, so that your users can use it on their pages for contacts, orders, invoices, and payments without going to a different application.  This allows them to discuss issues, see history of notes and discussions, and even find relevant emails while they're processing orders/invoices/payments.  These widgets can also be extended to other parts of the system and to other legacy ERP or CRM systems.&lt;br /&gt;
&lt;br /&gt;
See [[Tour of CRM2]] for how it works and [[Set up CRM2]] for instructions on configuring it to work with your legacy opentaps 1.x system.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7542</id>
		<title>Opentaps 2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7542"/>
		<updated>2014-08-06T22:14:38Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Twitter Integration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;opentaps CRM2 has been completely re-designed is a CRM system that helps your team work more effectively using your current tools, without installing or learning new software.   You can access it from the web, from Gmail, and even embed it into your existing order management or business application system.  It lets everybody in your organization work together by sharing their emails, discussions, and activities while using their favorite tools to get their jobs done.&lt;br /&gt;
&lt;br /&gt;
'''opentaps CRM2 is available for a limited time as a free trial, so sign up today at https://crm2.opentaps.com/signup'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Features ===&lt;br /&gt;
&lt;br /&gt;
Please see [http://www.opentaps.com opentaps.com]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to Get It ===&lt;br /&gt;
&lt;br /&gt;
See [http://www.opentaps.com www.opentaps.com]&lt;br /&gt;
&lt;br /&gt;
=== Where to Get Help ===&lt;br /&gt;
&lt;br /&gt;
Use our [http://opentaps.org/forum forum] if you have any questions about using CRM2, or just want to give us your suggestions.  Or just want to say something nice :)&lt;br /&gt;
&lt;br /&gt;
=== User's Manual ===&lt;br /&gt;
&lt;br /&gt;
==== Collaboration ====&lt;br /&gt;
&lt;br /&gt;
When the user enters a note with one or more '@&amp;lt;userid&amp;gt;', this means that he is trying to communicate with that person.  For example, this message&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@sichen The customer just called about this invoice.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the page of invoice 10001 means that this is a message for the user sichen.&lt;br /&gt;
&lt;br /&gt;
An email would be sent to the contact corresponding to that user.  If the user replies to the email, then the reply is added as an additional note to the same attributes (ie, order, invoice, payment, or party).  The email could also embed a link to take the user to chat on the page of the order/invoice/payment/party.  In the body of the email, `-----` is a separator.  Content below the separator in the response will not be recorded in the note.  If you want to have a signature block in your email, put the separator above your signature line.&lt;br /&gt;
&lt;br /&gt;
There is also a line of the @names that will be sent copies of the email.  You can add or remove the forwarding list here.  &lt;br /&gt;
&lt;br /&gt;
The person who writes the note or the reply will not be sent an email.&lt;br /&gt;
&lt;br /&gt;
At the bottom is a line with the UUID of the attributes.  This is used to identify reply emails with the attributes of the message (ie, order/invoice/payment/party).&lt;br /&gt;
&lt;br /&gt;
==== Contacts ====&lt;br /&gt;
&lt;br /&gt;
Contacts are people in the system.  A Contact has first name, last name, and company name.  It could have as many addresses, phone numbers, emails as you'd like, identified by purposes.  The purposes are for your own benefit and have no special meaning for the system.  Each contact is identified by a unique ID.&lt;br /&gt;
&lt;br /&gt;
==== Users ====&lt;br /&gt;
&lt;br /&gt;
A Contact could also have as many user logins as needed.  We currently support authentication with both Google Apps (Gmail) and twitter logins.  You can also import your old opentaps 1.x series with type &amp;quot;INTERNAL&amp;quot;, but we currently don't support logging in with opentaps 1.x usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
The User is not associated with a domain but rather with a Contact.  The security permissions of a User are mapped to a particular domain, so it is possible theoretically for your User to have access to several domains.&lt;br /&gt;
&lt;br /&gt;
However, the user interface is currently implemented so that &lt;br /&gt;
# A User is set up along with a Contact, and the screens for managing the User manages the Contact details as well.&lt;br /&gt;
# The User is particular to your domain, set up by the domain's administrative user.&lt;br /&gt;
&lt;br /&gt;
==== Contact Groups ====&lt;br /&gt;
&lt;br /&gt;
You can also create a group of your contacts:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-contacts.png|700px]]&lt;br /&gt;
&lt;br /&gt;
and then track all their activities, including emails, notes, and tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-activities.png|700px]]&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 will analyze their activities together and show you what they're all talking about, and with whom:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Tasks ====&lt;br /&gt;
&lt;br /&gt;
For any contact, contact group, or any order, invoice, or payment, you can create tasks as well as notes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-create-new-task-widget.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Once you've created your task, you can see it in the Tasks tab:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-list-and-task-view.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Tasks can have notes and tasks of their own, like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-add-notes.png|700px]]&lt;br /&gt;
&lt;br /&gt;
The dashboard in the web interface shows you all the activities and a summary of the different tasks:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-activities-dashboard.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Twitter Integration ====&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 integrates with Twitter, so you can&lt;br /&gt;
* Monitor your contacts' and groups' tweets&lt;br /&gt;
* Analyze tweets to identify trending topics and people&lt;br /&gt;
* Tweet and reply to tweets&lt;br /&gt;
* See the number of people your Contact is following and their number of followers&lt;br /&gt;
&lt;br /&gt;
To use the twitter integration, you must set up a twitter login for yourself and then login at least once with your twitter login to authorize opentaps CRM2 to use your twitter account.  opentaps CRM2 will store your twitter login and authentication token for future use.  If you have multiple users, they will all be authorized to use twitter.  opentaps CRM2 will use the first twitter login stored to interact with twitter.&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Twitter Activities Stream.png|700px]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Activities Summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-new-tweet.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-reply-to-tweet.png]]&lt;br /&gt;
&lt;br /&gt;
==== Gmail User Interface ====&lt;br /&gt;
&lt;br /&gt;
The new Gmail user interface lets you see your contact's activities, includes other notes, discussions, and tweets, from Gmail, as you are emailing them:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Gmail UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== For Developers ===&lt;br /&gt;
&lt;br /&gt;
[https://crm2.opentaps.com/signup Sign up for a free trial] and learn how to [[Administer CRM2]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Set up CRM2]] with your legacy opentaps 1.x system and with wordpress.  &lt;br /&gt;
&lt;br /&gt;
For developers, please see the [[CRM-2 API]] documentation.&lt;br /&gt;
&lt;br /&gt;
==== Embedded User Interface ====&lt;br /&gt;
&lt;br /&gt;
CRM2 comes with a set of widgets which could be plugged right into your opentaps 1.x series, so that your users can use it on their pages for contacts, orders, invoices, and payments without going to a different application.  This allows them to discuss issues, see history of notes and discussions, and even find relevant emails while they're processing orders/invoices/payments.  These widgets can also be extended to other parts of the system and to other legacy ERP or CRM systems.&lt;br /&gt;
&lt;br /&gt;
See [[Tour of CRM2]] for how it works and [[Set up CRM2]] for instructions on configuring it to work with your legacy opentaps 1.x system.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=File:Crm2-reply-to-tweet.png&amp;diff=7540</id>
		<title>File:Crm2-reply-to-tweet.png</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=File:Crm2-reply-to-tweet.png&amp;diff=7540"/>
		<updated>2014-08-06T22:14:18Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=File:Crm2-reply-to-tweet.png&amp;diff=7541</id>
		<title>File:Crm2-reply-to-tweet.png</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=File:Crm2-reply-to-tweet.png&amp;diff=7541"/>
		<updated>2014-08-06T22:14:18Z</updated>

		<summary type="html">&lt;p&gt;Sichen: Protected &amp;quot;Image:Crm2-reply-to-tweet.png&amp;quot;: Sysop page [edit=sysop:move=sysop]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=File:Crm2-new-tweet.png&amp;diff=7538</id>
		<title>File:Crm2-new-tweet.png</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=File:Crm2-new-tweet.png&amp;diff=7538"/>
		<updated>2014-08-06T22:13:26Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=File:Crm2-new-tweet.png&amp;diff=7539</id>
		<title>File:Crm2-new-tweet.png</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=File:Crm2-new-tweet.png&amp;diff=7539"/>
		<updated>2014-08-06T22:13:26Z</updated>

		<summary type="html">&lt;p&gt;Sichen: Protected &amp;quot;Image:Crm2-new-tweet.png&amp;quot;: Sysop page [edit=sysop:move=sysop]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=CRM-2_Administrative_API&amp;diff=7537</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=7537"/>
		<updated>2014-08-06T21:28:31Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Valid Activity Types */&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;
=== 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;smtps&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;smtp.gmail.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;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;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>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7536</id>
		<title>Opentaps 2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7536"/>
		<updated>2014-07-16T23:28:47Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* How Does it Look? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;opentaps CRM2 has been completely re-designed is a CRM system that helps your team work more effectively using your current tools, without installing or learning new software.   You can access it from the web, from Gmail, and even embed it into your existing order management or business application system.  It lets everybody in your organization work together by sharing their emails, discussions, and activities while using their favorite tools to get their jobs done.&lt;br /&gt;
&lt;br /&gt;
'''opentaps CRM2 is available for a limited time as a free trial, so sign up today at https://crm2.opentaps.com/signup'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Features ===&lt;br /&gt;
&lt;br /&gt;
Please see [http://www.opentaps.com opentaps.com]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to Get It ===&lt;br /&gt;
&lt;br /&gt;
See [http://www.opentaps.com www.opentaps.com]&lt;br /&gt;
&lt;br /&gt;
=== Where to Get Help ===&lt;br /&gt;
&lt;br /&gt;
Use our [http://opentaps.org/forum forum] if you have any questions about using CRM2, or just want to give us your suggestions.  Or just want to say something nice :)&lt;br /&gt;
&lt;br /&gt;
=== User's Manual ===&lt;br /&gt;
&lt;br /&gt;
==== Collaboration ====&lt;br /&gt;
&lt;br /&gt;
When the user enters a note with one or more '@&amp;lt;userid&amp;gt;', this means that he is trying to communicate with that person.  For example, this message&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@sichen The customer just called about this invoice.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the page of invoice 10001 means that this is a message for the user sichen.&lt;br /&gt;
&lt;br /&gt;
An email would be sent to the contact corresponding to that user.  If the user replies to the email, then the reply is added as an additional note to the same attributes (ie, order, invoice, payment, or party).  The email could also embed a link to take the user to chat on the page of the order/invoice/payment/party.  In the body of the email, `-----` is a separator.  Content below the separator in the response will not be recorded in the note.  If you want to have a signature block in your email, put the separator above your signature line.&lt;br /&gt;
&lt;br /&gt;
There is also a line of the @names that will be sent copies of the email.  You can add or remove the forwarding list here.  &lt;br /&gt;
&lt;br /&gt;
The person who writes the note or the reply will not be sent an email.&lt;br /&gt;
&lt;br /&gt;
At the bottom is a line with the UUID of the attributes.  This is used to identify reply emails with the attributes of the message (ie, order/invoice/payment/party).&lt;br /&gt;
&lt;br /&gt;
==== Contacts ====&lt;br /&gt;
&lt;br /&gt;
Contacts are people in the system.  A Contact has first name, last name, and company name.  It could have as many addresses, phone numbers, emails as you'd like, identified by purposes.  The purposes are for your own benefit and have no special meaning for the system.  Each contact is identified by a unique ID.&lt;br /&gt;
&lt;br /&gt;
==== Users ====&lt;br /&gt;
&lt;br /&gt;
A Contact could also have as many user logins as needed.  We currently support authentication with both Google Apps (Gmail) and twitter logins.  You can also import your old opentaps 1.x series with type &amp;quot;INTERNAL&amp;quot;, but we currently don't support logging in with opentaps 1.x usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
The User is not associated with a domain but rather with a Contact.  The security permissions of a User are mapped to a particular domain, so it is possible theoretically for your User to have access to several domains.&lt;br /&gt;
&lt;br /&gt;
However, the user interface is currently implemented so that &lt;br /&gt;
# A User is set up along with a Contact, and the screens for managing the User manages the Contact details as well.&lt;br /&gt;
# The User is particular to your domain, set up by the domain's administrative user.&lt;br /&gt;
&lt;br /&gt;
==== Contact Groups ====&lt;br /&gt;
&lt;br /&gt;
You can also create a group of your contacts:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-contacts.png|700px]]&lt;br /&gt;
&lt;br /&gt;
and then track all their activities, including emails, notes, and tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-activities.png|700px]]&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 will analyze their activities together and show you what they're all talking about, and with whom:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Tasks ====&lt;br /&gt;
&lt;br /&gt;
For any contact, contact group, or any order, invoice, or payment, you can create tasks as well as notes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-create-new-task-widget.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Once you've created your task, you can see it in the Tasks tab:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-list-and-task-view.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Tasks can have notes and tasks of their own, like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-add-notes.png|700px]]&lt;br /&gt;
&lt;br /&gt;
The dashboard in the web interface shows you all the activities and a summary of the different tasks:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-activities-dashboard.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Twitter Integration ====&lt;br /&gt;
&lt;br /&gt;
With the new Twitter integration, you can monitor your contacts' tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Twitter Activities Stream.png|700px]]&lt;br /&gt;
&lt;br /&gt;
You can also see what they like talking about, and who they like talking with:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Activities Summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Gmail User Interface ====&lt;br /&gt;
&lt;br /&gt;
The new Gmail user interface lets you see your contact's activities, includes other notes, discussions, and tweets, from Gmail, as you are emailing them:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Gmail UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== For Developers ===&lt;br /&gt;
&lt;br /&gt;
[https://crm2.opentaps.com/signup Sign up for a free trial] and learn how to [[Administer CRM2]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Set up CRM2]] with your legacy opentaps 1.x system and with wordpress.  &lt;br /&gt;
&lt;br /&gt;
For developers, please see the [[CRM-2 API]] documentation.&lt;br /&gt;
&lt;br /&gt;
==== Embedded User Interface ====&lt;br /&gt;
&lt;br /&gt;
CRM2 comes with a set of widgets which could be plugged right into your opentaps 1.x series, so that your users can use it on their pages for contacts, orders, invoices, and payments without going to a different application.  This allows them to discuss issues, see history of notes and discussions, and even find relevant emails while they're processing orders/invoices/payments.  These widgets can also be extended to other parts of the system and to other legacy ERP or CRM systems.&lt;br /&gt;
&lt;br /&gt;
See [[Tour of CRM2]] for how it works and [[Set up CRM2]] for instructions on configuring it to work with your legacy opentaps 1.x system.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7535</id>
		<title>Opentaps 2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7535"/>
		<updated>2014-07-16T23:28:00Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Giving Customers Real Service */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;opentaps CRM2 has been completely re-designed is a CRM system that helps your team work more effectively using your current tools, without installing or learning new software.   You can access it from the web, from Gmail, and even embed it into your existing order management or business application system.  It lets everybody in your organization work together by sharing their emails, discussions, and activities while using their favorite tools to get their jobs done.&lt;br /&gt;
&lt;br /&gt;
'''opentaps CRM2 is available for a limited time as a free trial, so sign up today at https://crm2.opentaps.com/signup'''&lt;br /&gt;
&lt;br /&gt;
=== How Does it Look? ===&lt;br /&gt;
&lt;br /&gt;
The web user interface of opentaps CRM2 has been completely redesigned:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps_CRM2_Web_UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Take a [[Tour of CRM2]] and see how it could get everyone at your business to work together.&lt;br /&gt;
&lt;br /&gt;
===Features ===&lt;br /&gt;
&lt;br /&gt;
Please see [http://www.opentaps.com opentaps.com]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to Get It ===&lt;br /&gt;
&lt;br /&gt;
See [http://www.opentaps.com www.opentaps.com]&lt;br /&gt;
&lt;br /&gt;
=== Where to Get Help ===&lt;br /&gt;
&lt;br /&gt;
Use our [http://opentaps.org/forum forum] if you have any questions about using CRM2, or just want to give us your suggestions.  Or just want to say something nice :)&lt;br /&gt;
&lt;br /&gt;
=== User's Manual ===&lt;br /&gt;
&lt;br /&gt;
==== Collaboration ====&lt;br /&gt;
&lt;br /&gt;
When the user enters a note with one or more '@&amp;lt;userid&amp;gt;', this means that he is trying to communicate with that person.  For example, this message&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@sichen The customer just called about this invoice.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the page of invoice 10001 means that this is a message for the user sichen.&lt;br /&gt;
&lt;br /&gt;
An email would be sent to the contact corresponding to that user.  If the user replies to the email, then the reply is added as an additional note to the same attributes (ie, order, invoice, payment, or party).  The email could also embed a link to take the user to chat on the page of the order/invoice/payment/party.  In the body of the email, `-----` is a separator.  Content below the separator in the response will not be recorded in the note.  If you want to have a signature block in your email, put the separator above your signature line.&lt;br /&gt;
&lt;br /&gt;
There is also a line of the @names that will be sent copies of the email.  You can add or remove the forwarding list here.  &lt;br /&gt;
&lt;br /&gt;
The person who writes the note or the reply will not be sent an email.&lt;br /&gt;
&lt;br /&gt;
At the bottom is a line with the UUID of the attributes.  This is used to identify reply emails with the attributes of the message (ie, order/invoice/payment/party).&lt;br /&gt;
&lt;br /&gt;
==== Contacts ====&lt;br /&gt;
&lt;br /&gt;
Contacts are people in the system.  A Contact has first name, last name, and company name.  It could have as many addresses, phone numbers, emails as you'd like, identified by purposes.  The purposes are for your own benefit and have no special meaning for the system.  Each contact is identified by a unique ID.&lt;br /&gt;
&lt;br /&gt;
==== Users ====&lt;br /&gt;
&lt;br /&gt;
A Contact could also have as many user logins as needed.  We currently support authentication with both Google Apps (Gmail) and twitter logins.  You can also import your old opentaps 1.x series with type &amp;quot;INTERNAL&amp;quot;, but we currently don't support logging in with opentaps 1.x usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
The User is not associated with a domain but rather with a Contact.  The security permissions of a User are mapped to a particular domain, so it is possible theoretically for your User to have access to several domains.&lt;br /&gt;
&lt;br /&gt;
However, the user interface is currently implemented so that &lt;br /&gt;
# A User is set up along with a Contact, and the screens for managing the User manages the Contact details as well.&lt;br /&gt;
# The User is particular to your domain, set up by the domain's administrative user.&lt;br /&gt;
&lt;br /&gt;
==== Contact Groups ====&lt;br /&gt;
&lt;br /&gt;
You can also create a group of your contacts:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-contacts.png|700px]]&lt;br /&gt;
&lt;br /&gt;
and then track all their activities, including emails, notes, and tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-activities.png|700px]]&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 will analyze their activities together and show you what they're all talking about, and with whom:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Tasks ====&lt;br /&gt;
&lt;br /&gt;
For any contact, contact group, or any order, invoice, or payment, you can create tasks as well as notes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-create-new-task-widget.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Once you've created your task, you can see it in the Tasks tab:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-list-and-task-view.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Tasks can have notes and tasks of their own, like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-add-notes.png|700px]]&lt;br /&gt;
&lt;br /&gt;
The dashboard in the web interface shows you all the activities and a summary of the different tasks:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-activities-dashboard.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Twitter Integration ====&lt;br /&gt;
&lt;br /&gt;
With the new Twitter integration, you can monitor your contacts' tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Twitter Activities Stream.png|700px]]&lt;br /&gt;
&lt;br /&gt;
You can also see what they like talking about, and who they like talking with:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Activities Summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Gmail User Interface ====&lt;br /&gt;
&lt;br /&gt;
The new Gmail user interface lets you see your contact's activities, includes other notes, discussions, and tweets, from Gmail, as you are emailing them:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Gmail UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== For Developers ===&lt;br /&gt;
&lt;br /&gt;
[https://crm2.opentaps.com/signup Sign up for a free trial] and learn how to [[Administer CRM2]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Set up CRM2]] with your legacy opentaps 1.x system and with wordpress.  &lt;br /&gt;
&lt;br /&gt;
For developers, please see the [[CRM-2 API]] documentation.&lt;br /&gt;
&lt;br /&gt;
==== Embedded User Interface ====&lt;br /&gt;
&lt;br /&gt;
CRM2 comes with a set of widgets which could be plugged right into your opentaps 1.x series, so that your users can use it on their pages for contacts, orders, invoices, and payments without going to a different application.  This allows them to discuss issues, see history of notes and discussions, and even find relevant emails while they're processing orders/invoices/payments.  These widgets can also be extended to other parts of the system and to other legacy ERP or CRM systems.&lt;br /&gt;
&lt;br /&gt;
See [[Tour of CRM2]] for how it works and [[Set up CRM2]] for instructions on configuring it to work with your legacy opentaps 1.x system.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7534</id>
		<title>Opentaps 2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7534"/>
		<updated>2014-07-16T23:27:51Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Talking to Each Other */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;opentaps CRM2 has been completely re-designed is a CRM system that helps your team work more effectively using your current tools, without installing or learning new software.   You can access it from the web, from Gmail, and even embed it into your existing order management or business application system.  It lets everybody in your organization work together by sharing their emails, discussions, and activities while using their favorite tools to get their jobs done.&lt;br /&gt;
&lt;br /&gt;
'''opentaps CRM2 is available for a limited time as a free trial, so sign up today at https://crm2.opentaps.com/signup'''&lt;br /&gt;
&lt;br /&gt;
=== How Does it Look? ===&lt;br /&gt;
&lt;br /&gt;
The web user interface of opentaps CRM2 has been completely redesigned:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps_CRM2_Web_UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Take a [[Tour of CRM2]] and see how it could get everyone at your business to work together.&lt;br /&gt;
&lt;br /&gt;
===Features ===&lt;br /&gt;
&lt;br /&gt;
Please see [http://www.opentaps.com opentaps.com]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Giving Customers Real Service ===&lt;br /&gt;
&lt;br /&gt;
Do your customers hate calling you as much as you hate calling your insurance company?&lt;br /&gt;
&lt;br /&gt;
Let's see...  &lt;br /&gt;
# Do your customers get a different person each time they call?  &lt;br /&gt;
# Do your reps have no idea what the same customer called about the last time?  &lt;br /&gt;
# Do they have no access to emails she's sent in, or forms she's filled out online?  &lt;br /&gt;
# If she's already started working with one rep to solve a problem, will your other reps tell her they have no idea who that rep is, or what he's discussed with her, or be able to follow up on what the first rep started?  &lt;br /&gt;
# Is your customer told a different &amp;quot;company policy&amp;quot; each time she calls?  &lt;br /&gt;
&lt;br /&gt;
If the answer to any of the above is &amp;quot;yes,&amp;quot; then your customers probably hate calling you.  Just like you hate calling your insurance company.&lt;br /&gt;
&lt;br /&gt;
=== How to Get It ===&lt;br /&gt;
&lt;br /&gt;
See [http://www.opentaps.com www.opentaps.com]&lt;br /&gt;
&lt;br /&gt;
=== Where to Get Help ===&lt;br /&gt;
&lt;br /&gt;
Use our [http://opentaps.org/forum forum] if you have any questions about using CRM2, or just want to give us your suggestions.  Or just want to say something nice :)&lt;br /&gt;
&lt;br /&gt;
=== User's Manual ===&lt;br /&gt;
&lt;br /&gt;
==== Collaboration ====&lt;br /&gt;
&lt;br /&gt;
When the user enters a note with one or more '@&amp;lt;userid&amp;gt;', this means that he is trying to communicate with that person.  For example, this message&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@sichen The customer just called about this invoice.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the page of invoice 10001 means that this is a message for the user sichen.&lt;br /&gt;
&lt;br /&gt;
An email would be sent to the contact corresponding to that user.  If the user replies to the email, then the reply is added as an additional note to the same attributes (ie, order, invoice, payment, or party).  The email could also embed a link to take the user to chat on the page of the order/invoice/payment/party.  In the body of the email, `-----` is a separator.  Content below the separator in the response will not be recorded in the note.  If you want to have a signature block in your email, put the separator above your signature line.&lt;br /&gt;
&lt;br /&gt;
There is also a line of the @names that will be sent copies of the email.  You can add or remove the forwarding list here.  &lt;br /&gt;
&lt;br /&gt;
The person who writes the note or the reply will not be sent an email.&lt;br /&gt;
&lt;br /&gt;
At the bottom is a line with the UUID of the attributes.  This is used to identify reply emails with the attributes of the message (ie, order/invoice/payment/party).&lt;br /&gt;
&lt;br /&gt;
==== Contacts ====&lt;br /&gt;
&lt;br /&gt;
Contacts are people in the system.  A Contact has first name, last name, and company name.  It could have as many addresses, phone numbers, emails as you'd like, identified by purposes.  The purposes are for your own benefit and have no special meaning for the system.  Each contact is identified by a unique ID.&lt;br /&gt;
&lt;br /&gt;
==== Users ====&lt;br /&gt;
&lt;br /&gt;
A Contact could also have as many user logins as needed.  We currently support authentication with both Google Apps (Gmail) and twitter logins.  You can also import your old opentaps 1.x series with type &amp;quot;INTERNAL&amp;quot;, but we currently don't support logging in with opentaps 1.x usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
The User is not associated with a domain but rather with a Contact.  The security permissions of a User are mapped to a particular domain, so it is possible theoretically for your User to have access to several domains.&lt;br /&gt;
&lt;br /&gt;
However, the user interface is currently implemented so that &lt;br /&gt;
# A User is set up along with a Contact, and the screens for managing the User manages the Contact details as well.&lt;br /&gt;
# The User is particular to your domain, set up by the domain's administrative user.&lt;br /&gt;
&lt;br /&gt;
==== Contact Groups ====&lt;br /&gt;
&lt;br /&gt;
You can also create a group of your contacts:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-contacts.png|700px]]&lt;br /&gt;
&lt;br /&gt;
and then track all their activities, including emails, notes, and tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-activities.png|700px]]&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 will analyze their activities together and show you what they're all talking about, and with whom:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Tasks ====&lt;br /&gt;
&lt;br /&gt;
For any contact, contact group, or any order, invoice, or payment, you can create tasks as well as notes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-create-new-task-widget.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Once you've created your task, you can see it in the Tasks tab:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-list-and-task-view.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Tasks can have notes and tasks of their own, like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-add-notes.png|700px]]&lt;br /&gt;
&lt;br /&gt;
The dashboard in the web interface shows you all the activities and a summary of the different tasks:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-activities-dashboard.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Twitter Integration ====&lt;br /&gt;
&lt;br /&gt;
With the new Twitter integration, you can monitor your contacts' tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Twitter Activities Stream.png|700px]]&lt;br /&gt;
&lt;br /&gt;
You can also see what they like talking about, and who they like talking with:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Activities Summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Gmail User Interface ====&lt;br /&gt;
&lt;br /&gt;
The new Gmail user interface lets you see your contact's activities, includes other notes, discussions, and tweets, from Gmail, as you are emailing them:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Gmail UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== For Developers ===&lt;br /&gt;
&lt;br /&gt;
[https://crm2.opentaps.com/signup Sign up for a free trial] and learn how to [[Administer CRM2]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Set up CRM2]] with your legacy opentaps 1.x system and with wordpress.  &lt;br /&gt;
&lt;br /&gt;
For developers, please see the [[CRM-2 API]] documentation.&lt;br /&gt;
&lt;br /&gt;
==== Embedded User Interface ====&lt;br /&gt;
&lt;br /&gt;
CRM2 comes with a set of widgets which could be plugged right into your opentaps 1.x series, so that your users can use it on their pages for contacts, orders, invoices, and payments without going to a different application.  This allows them to discuss issues, see history of notes and discussions, and even find relevant emails while they're processing orders/invoices/payments.  These widgets can also be extended to other parts of the system and to other legacy ERP or CRM systems.&lt;br /&gt;
&lt;br /&gt;
See [[Tour of CRM2]] for how it works and [[Set up CRM2]] for instructions on configuring it to work with your legacy opentaps 1.x system.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7533</id>
		<title>Opentaps 2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7533"/>
		<updated>2014-07-16T23:27:14Z</updated>

		<summary type="html">&lt;p&gt;Sichen: /* Conquering Email */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;opentaps CRM2 has been completely re-designed is a CRM system that helps your team work more effectively using your current tools, without installing or learning new software.   You can access it from the web, from Gmail, and even embed it into your existing order management or business application system.  It lets everybody in your organization work together by sharing their emails, discussions, and activities while using their favorite tools to get their jobs done.&lt;br /&gt;
&lt;br /&gt;
'''opentaps CRM2 is available for a limited time as a free trial, so sign up today at https://crm2.opentaps.com/signup'''&lt;br /&gt;
&lt;br /&gt;
=== How Does it Look? ===&lt;br /&gt;
&lt;br /&gt;
The web user interface of opentaps CRM2 has been completely redesigned:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps_CRM2_Web_UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Take a [[Tour of CRM2]] and see how it could get everyone at your business to work together.&lt;br /&gt;
&lt;br /&gt;
===Features ===&lt;br /&gt;
&lt;br /&gt;
Please see [http://www.opentaps.com opentaps.com]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Talking to Each Other ===&lt;br /&gt;
&lt;br /&gt;
How do your people ''really'' work together?  Probably by email, chat, or text.  &lt;br /&gt;
&lt;br /&gt;
Do you know how they're making business decisions every day?  Probably not, unless you offer them a convenient way to connect and communicate about the problems at work.  That's why you're scratching your head when you see an order, quote, or project and say &amp;quot;Who decided to do that?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Giving Customers Real Service ===&lt;br /&gt;
&lt;br /&gt;
Do your customers hate calling you as much as you hate calling your insurance company?&lt;br /&gt;
&lt;br /&gt;
Let's see...  &lt;br /&gt;
# Do your customers get a different person each time they call?  &lt;br /&gt;
# Do your reps have no idea what the same customer called about the last time?  &lt;br /&gt;
# Do they have no access to emails she's sent in, or forms she's filled out online?  &lt;br /&gt;
# If she's already started working with one rep to solve a problem, will your other reps tell her they have no idea who that rep is, or what he's discussed with her, or be able to follow up on what the first rep started?  &lt;br /&gt;
# Is your customer told a different &amp;quot;company policy&amp;quot; each time she calls?  &lt;br /&gt;
&lt;br /&gt;
If the answer to any of the above is &amp;quot;yes,&amp;quot; then your customers probably hate calling you.  Just like you hate calling your insurance company.&lt;br /&gt;
&lt;br /&gt;
=== How to Get It ===&lt;br /&gt;
&lt;br /&gt;
See [http://www.opentaps.com www.opentaps.com]&lt;br /&gt;
&lt;br /&gt;
=== Where to Get Help ===&lt;br /&gt;
&lt;br /&gt;
Use our [http://opentaps.org/forum forum] if you have any questions about using CRM2, or just want to give us your suggestions.  Or just want to say something nice :)&lt;br /&gt;
&lt;br /&gt;
=== User's Manual ===&lt;br /&gt;
&lt;br /&gt;
==== Collaboration ====&lt;br /&gt;
&lt;br /&gt;
When the user enters a note with one or more '@&amp;lt;userid&amp;gt;', this means that he is trying to communicate with that person.  For example, this message&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@sichen The customer just called about this invoice.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the page of invoice 10001 means that this is a message for the user sichen.&lt;br /&gt;
&lt;br /&gt;
An email would be sent to the contact corresponding to that user.  If the user replies to the email, then the reply is added as an additional note to the same attributes (ie, order, invoice, payment, or party).  The email could also embed a link to take the user to chat on the page of the order/invoice/payment/party.  In the body of the email, `-----` is a separator.  Content below the separator in the response will not be recorded in the note.  If you want to have a signature block in your email, put the separator above your signature line.&lt;br /&gt;
&lt;br /&gt;
There is also a line of the @names that will be sent copies of the email.  You can add or remove the forwarding list here.  &lt;br /&gt;
&lt;br /&gt;
The person who writes the note or the reply will not be sent an email.&lt;br /&gt;
&lt;br /&gt;
At the bottom is a line with the UUID of the attributes.  This is used to identify reply emails with the attributes of the message (ie, order/invoice/payment/party).&lt;br /&gt;
&lt;br /&gt;
==== Contacts ====&lt;br /&gt;
&lt;br /&gt;
Contacts are people in the system.  A Contact has first name, last name, and company name.  It could have as many addresses, phone numbers, emails as you'd like, identified by purposes.  The purposes are for your own benefit and have no special meaning for the system.  Each contact is identified by a unique ID.&lt;br /&gt;
&lt;br /&gt;
==== Users ====&lt;br /&gt;
&lt;br /&gt;
A Contact could also have as many user logins as needed.  We currently support authentication with both Google Apps (Gmail) and twitter logins.  You can also import your old opentaps 1.x series with type &amp;quot;INTERNAL&amp;quot;, but we currently don't support logging in with opentaps 1.x usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
The User is not associated with a domain but rather with a Contact.  The security permissions of a User are mapped to a particular domain, so it is possible theoretically for your User to have access to several domains.&lt;br /&gt;
&lt;br /&gt;
However, the user interface is currently implemented so that &lt;br /&gt;
# A User is set up along with a Contact, and the screens for managing the User manages the Contact details as well.&lt;br /&gt;
# The User is particular to your domain, set up by the domain's administrative user.&lt;br /&gt;
&lt;br /&gt;
==== Contact Groups ====&lt;br /&gt;
&lt;br /&gt;
You can also create a group of your contacts:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-contacts.png|700px]]&lt;br /&gt;
&lt;br /&gt;
and then track all their activities, including emails, notes, and tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-activities.png|700px]]&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 will analyze their activities together and show you what they're all talking about, and with whom:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Tasks ====&lt;br /&gt;
&lt;br /&gt;
For any contact, contact group, or any order, invoice, or payment, you can create tasks as well as notes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-create-new-task-widget.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Once you've created your task, you can see it in the Tasks tab:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-list-and-task-view.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Tasks can have notes and tasks of their own, like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-add-notes.png|700px]]&lt;br /&gt;
&lt;br /&gt;
The dashboard in the web interface shows you all the activities and a summary of the different tasks:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-activities-dashboard.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Twitter Integration ====&lt;br /&gt;
&lt;br /&gt;
With the new Twitter integration, you can monitor your contacts' tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Twitter Activities Stream.png|700px]]&lt;br /&gt;
&lt;br /&gt;
You can also see what they like talking about, and who they like talking with:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Activities Summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Gmail User Interface ====&lt;br /&gt;
&lt;br /&gt;
The new Gmail user interface lets you see your contact's activities, includes other notes, discussions, and tweets, from Gmail, as you are emailing them:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Gmail UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== For Developers ===&lt;br /&gt;
&lt;br /&gt;
[https://crm2.opentaps.com/signup Sign up for a free trial] and learn how to [[Administer CRM2]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Set up CRM2]] with your legacy opentaps 1.x system and with wordpress.  &lt;br /&gt;
&lt;br /&gt;
For developers, please see the [[CRM-2 API]] documentation.&lt;br /&gt;
&lt;br /&gt;
==== Embedded User Interface ====&lt;br /&gt;
&lt;br /&gt;
CRM2 comes with a set of widgets which could be plugged right into your opentaps 1.x series, so that your users can use it on their pages for contacts, orders, invoices, and payments without going to a different application.  This allows them to discuss issues, see history of notes and discussions, and even find relevant emails while they're processing orders/invoices/payments.  These widgets can also be extended to other parts of the system and to other legacy ERP or CRM systems.&lt;br /&gt;
&lt;br /&gt;
See [[Tour of CRM2]] for how it works and [[Set up CRM2]] for instructions on configuring it to work with your legacy opentaps 1.x system.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
	<entry>
		<id>https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7532</id>
		<title>Opentaps 2</title>
		<link rel="alternate" type="text/html" href="https://docs.opentaps.org/docs/index.php?title=Opentaps_2&amp;diff=7532"/>
		<updated>2014-07-10T17:41:57Z</updated>

		<summary type="html">&lt;p&gt;Sichen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;opentaps CRM2 has been completely re-designed is a CRM system that helps your team work more effectively using your current tools, without installing or learning new software.   You can access it from the web, from Gmail, and even embed it into your existing order management or business application system.  It lets everybody in your organization work together by sharing their emails, discussions, and activities while using their favorite tools to get their jobs done.&lt;br /&gt;
&lt;br /&gt;
'''opentaps CRM2 is available for a limited time as a free trial, so sign up today at https://crm2.opentaps.com/signup'''&lt;br /&gt;
&lt;br /&gt;
=== How Does it Look? ===&lt;br /&gt;
&lt;br /&gt;
The web user interface of opentaps CRM2 has been completely redesigned:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps_CRM2_Web_UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Take a [[Tour of CRM2]] and see how it could get everyone at your business to work together.&lt;br /&gt;
&lt;br /&gt;
===Features ===&lt;br /&gt;
&lt;br /&gt;
Please see [http://www.opentaps.com opentaps.com]&lt;br /&gt;
&lt;br /&gt;
=== Conquering Email ===&lt;br /&gt;
&lt;br /&gt;
Email is the water of your business: You can't live without it, but you could just as easily drown in it.  The volume of emails at your business probably exceeds that of phone calls, texts, and social tweets and likes combined.  Email is where it all happens -- customers ask for quotes, employees discuss problems, and accounting gets you paid.  Many employees spend their whole day in front of a screen, reading and writing emails.&lt;br /&gt;
&lt;br /&gt;
But what are they reading and writing?  Are customer problems being resolved?  Who is making the decisions?  How should problems be solved?&lt;br /&gt;
&lt;br /&gt;
If you're lucky, you're searching back and forth in your inbox to find the answers.  If you're like the rest of us, you simply can't find it -- the answer is lost in all the different mailboxes of all the different people.  Emails go unanswered when employees go on leave or quit.  Customers get upset until they leave or quit.&lt;br /&gt;
&lt;br /&gt;
=== Talking to Each Other ===&lt;br /&gt;
&lt;br /&gt;
How do your people ''really'' work together?  Probably by email, chat, or text.  &lt;br /&gt;
&lt;br /&gt;
Do you know how they're making business decisions every day?  Probably not, unless you offer them a convenient way to connect and communicate about the problems at work.  That's why you're scratching your head when you see an order, quote, or project and say &amp;quot;Who decided to do that?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Giving Customers Real Service ===&lt;br /&gt;
&lt;br /&gt;
Do your customers hate calling you as much as you hate calling your insurance company?&lt;br /&gt;
&lt;br /&gt;
Let's see...  &lt;br /&gt;
# Do your customers get a different person each time they call?  &lt;br /&gt;
# Do your reps have no idea what the same customer called about the last time?  &lt;br /&gt;
# Do they have no access to emails she's sent in, or forms she's filled out online?  &lt;br /&gt;
# If she's already started working with one rep to solve a problem, will your other reps tell her they have no idea who that rep is, or what he's discussed with her, or be able to follow up on what the first rep started?  &lt;br /&gt;
# Is your customer told a different &amp;quot;company policy&amp;quot; each time she calls?  &lt;br /&gt;
&lt;br /&gt;
If the answer to any of the above is &amp;quot;yes,&amp;quot; then your customers probably hate calling you.  Just like you hate calling your insurance company.&lt;br /&gt;
&lt;br /&gt;
=== How to Get It ===&lt;br /&gt;
&lt;br /&gt;
See [http://www.opentaps.com www.opentaps.com]&lt;br /&gt;
&lt;br /&gt;
=== Where to Get Help ===&lt;br /&gt;
&lt;br /&gt;
Use our [http://opentaps.org/forum forum] if you have any questions about using CRM2, or just want to give us your suggestions.  Or just want to say something nice :)&lt;br /&gt;
&lt;br /&gt;
=== User's Manual ===&lt;br /&gt;
&lt;br /&gt;
==== Collaboration ====&lt;br /&gt;
&lt;br /&gt;
When the user enters a note with one or more '@&amp;lt;userid&amp;gt;', this means that he is trying to communicate with that person.  For example, this message&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@sichen The customer just called about this invoice.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the page of invoice 10001 means that this is a message for the user sichen.&lt;br /&gt;
&lt;br /&gt;
An email would be sent to the contact corresponding to that user.  If the user replies to the email, then the reply is added as an additional note to the same attributes (ie, order, invoice, payment, or party).  The email could also embed a link to take the user to chat on the page of the order/invoice/payment/party.  In the body of the email, `-----` is a separator.  Content below the separator in the response will not be recorded in the note.  If you want to have a signature block in your email, put the separator above your signature line.&lt;br /&gt;
&lt;br /&gt;
There is also a line of the @names that will be sent copies of the email.  You can add or remove the forwarding list here.  &lt;br /&gt;
&lt;br /&gt;
The person who writes the note or the reply will not be sent an email.&lt;br /&gt;
&lt;br /&gt;
At the bottom is a line with the UUID of the attributes.  This is used to identify reply emails with the attributes of the message (ie, order/invoice/payment/party).&lt;br /&gt;
&lt;br /&gt;
==== Contacts ====&lt;br /&gt;
&lt;br /&gt;
Contacts are people in the system.  A Contact has first name, last name, and company name.  It could have as many addresses, phone numbers, emails as you'd like, identified by purposes.  The purposes are for your own benefit and have no special meaning for the system.  Each contact is identified by a unique ID.&lt;br /&gt;
&lt;br /&gt;
==== Users ====&lt;br /&gt;
&lt;br /&gt;
A Contact could also have as many user logins as needed.  We currently support authentication with both Google Apps (Gmail) and twitter logins.  You can also import your old opentaps 1.x series with type &amp;quot;INTERNAL&amp;quot;, but we currently don't support logging in with opentaps 1.x usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
The User is not associated with a domain but rather with a Contact.  The security permissions of a User are mapped to a particular domain, so it is possible theoretically for your User to have access to several domains.&lt;br /&gt;
&lt;br /&gt;
However, the user interface is currently implemented so that &lt;br /&gt;
# A User is set up along with a Contact, and the screens for managing the User manages the Contact details as well.&lt;br /&gt;
# The User is particular to your domain, set up by the domain's administrative user.&lt;br /&gt;
&lt;br /&gt;
==== Contact Groups ====&lt;br /&gt;
&lt;br /&gt;
You can also create a group of your contacts:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-contacts.png|700px]]&lt;br /&gt;
&lt;br /&gt;
and then track all their activities, including emails, notes, and tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-activities.png|700px]]&lt;br /&gt;
&lt;br /&gt;
opentaps CRM2 will analyze their activities together and show you what they're all talking about, and with whom:&lt;br /&gt;
&lt;br /&gt;
[[Image:Contact-group-summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Tasks ====&lt;br /&gt;
&lt;br /&gt;
For any contact, contact group, or any order, invoice, or payment, you can create tasks as well as notes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-create-new-task-widget.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Once you've created your task, you can see it in the Tasks tab:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-list-and-task-view.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Tasks can have notes and tasks of their own, like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-add-notes.png|700px]]&lt;br /&gt;
&lt;br /&gt;
The dashboard in the web interface shows you all the activities and a summary of the different tasks:&lt;br /&gt;
&lt;br /&gt;
[[Image:Crm2-task-activities-dashboard.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Twitter Integration ====&lt;br /&gt;
&lt;br /&gt;
With the new Twitter integration, you can monitor your contacts' tweets:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Twitter Activities Stream.png|700px]]&lt;br /&gt;
&lt;br /&gt;
You can also see what they like talking about, and who they like talking with:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Activities Summary.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==== Gmail User Interface ====&lt;br /&gt;
&lt;br /&gt;
The new Gmail user interface lets you see your contact's activities, includes other notes, discussions, and tweets, from Gmail, as you are emailing them:&lt;br /&gt;
&lt;br /&gt;
[[Image:Opentaps CRM2 Gmail UI.png|700px]]&lt;br /&gt;
&lt;br /&gt;
=== For Developers ===&lt;br /&gt;
&lt;br /&gt;
[https://crm2.opentaps.com/signup Sign up for a free trial] and learn how to [[Administer CRM2]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Set up CRM2]] with your legacy opentaps 1.x system and with wordpress.  &lt;br /&gt;
&lt;br /&gt;
For developers, please see the [[CRM-2 API]] documentation.&lt;br /&gt;
&lt;br /&gt;
==== Embedded User Interface ====&lt;br /&gt;
&lt;br /&gt;
CRM2 comes with a set of widgets which could be plugged right into your opentaps 1.x series, so that your users can use it on their pages for contacts, orders, invoices, and payments without going to a different application.  This allows them to discuss issues, see history of notes and discussions, and even find relevant emails while they're processing orders/invoices/payments.  These widgets can also be extended to other parts of the system and to other legacy ERP or CRM systems.&lt;br /&gt;
&lt;br /&gt;
See [[Tour of CRM2]] for how it works and [[Set up CRM2]] for instructions on configuring it to work with your legacy opentaps 1.x system.&lt;/div&gt;</summary>
		<author><name>Sichen</name></author>
		
	</entry>
</feed>