Difference between revisions of "User:Trifonnt"

From ADempiere
Jump to: navigation, search
This Wiki is read-only for reference purposes to avoid broken links.
m (Adempiere Export/Import Tools)
m (Paid Adempiere development)
 
Line 1: Line 1:
 +
{| cellspacing="5" cellpadding="0" style="width: 100%;background:#f6f6f6;"
 +
|-
 +
|style="width: 33%;border:solid silver;background:#fff;vertical-align:top;"|
 +
{{SummaryView|My Pages|
 +
* Trifon's projects based on Compiere/Adempiere : [[User:Trifonnt/Projects]].
 +
* Trifon's Recent thoughts : [[User:Trifonnt/MyThoughts]]
 +
* Adempiere trackers : [[User:Trifonnt/MyTrackers]]
 +
* My favorite readings: [[User:Trifonnt/MyReadings|Page 1]], [[User:Trifonnt/MyReadings2|Page 2]] and [[User:Trifonnt/MyReadings3|Page 3]]
 +
* See my special page for you: [[User:Trifonnt/Howtos Hints|Howtos and Hints]].
 +
}}
 +
|}
 +
 
{{Userboxtop}}
 
{{Userboxtop}}
 
{{User real name|Trifon Nikolaev Trifonov}}
 
{{User real name|Trifon Nikolaev Trifonov}}
Line 9: Line 21:
 
{{User Sourceforge|http://sourceforge.net/users/trifonnt/}}
 
{{User Sourceforge|http://sourceforge.net/users/trifonnt/}}
 
{{User Wikipedia|http://en.wikipedia.org/wiki/User:Trifonnt}}
 
{{User Wikipedia|http://en.wikipedia.org/wiki/User:Trifonnt}}
 +
 +
{{User Facebook|http://www.facebook.com/trifonnt}}
 +
{{User Blogspot|http://trifonnt.blogspot.com}}
 +
{{User Twitter|http://www.twitter.com/trifonnt}}
 +
 
{{Userboxbottom}}
 
{{Userboxbottom}}
  
== About Me ==
+
= About Me (Yes, i'm one of the founders of ADempiere... so crazy indeed )=
 +
* High School of Economics and Computer Science. It helped me to understand accounting and economics.
 +
* Bachelor degree in Mathematics. Helped me to like mathematics and especially cryptography. Attended many courses in programming, which helped me to became good developer.
 +
* SUN Certified Programmer 1.4. Maybe should try to pass other Certifications programs... But no time last years.
  
I started my own comapny last year providing Adempiere and Compiere consultancy and development.  
+
I started my first company in 2006 year providing ADempiere/Compiere consultancy, training and development services.
I like developing business systems. This makes me headache from tme to time, but also makes me very happy when i see system wokring.
+
I like developing business systems and traveling.
  
As a member of ADempiere Council i like to review patches and SVN commits in order to be sure that code remains stable and system functional.
 
I hope that you have found that i like to help in forums and provide guidance to ADempiere developers how to solve problems they find in their day by day work.
 
  
== Trifon's Paid Services ==
+
== Some nice words about me on the net :) ==
 +
* [http://compjuta.wordpress.com/2009/01/09/adempiere_a_new_beginning/ Adempiere - a new beginning]
 +
 
 +
== My Blogs ==
 +
* [http://trifonnt.blogspot.com/ My blog in blogspot]
 +
** [http://trifonnt.blogspot.com/2007/08/compiere-begging-of-end.html Compiere - Beginning of the end!] Bye, Bye Compiere Inc. no more Open Source. Actually you never understood what it really means.
 +
** [http://test-edi.blogspot.com/ EDI test]
 +
 
 +
* [http://www.jroller.com/trifon My blog in jroller.com]
 +
* [https://trifonnt.wordpress.com My blog in wordpress.com]
 +
 
 +
= Trifon's Paid Services =
 +
 
 +
== ADempiere Technical Support ==
 +
This support consists of answering questions and providing advices.
 +
Unlimited number of questions.
 +
Technical support is available monthly or in chunks of 6 and 12 months from the Adempiere developer, Trifon Trifonov.
 +
For the duration, you can ask Trifon direct questions via a special support mailing address.
 +
Contact is email-only and replies are sent within one business day, often within hours.
 +
 
 +
Prices:
 +
<pre>
 +
1 month ADempiere tech support  :  500 USD (No VAT included)
 +
6 months ADempiere tech support : 2700 USD - 10% discount (No VAT included)
 +
12 months ADempiere tech support: 4800 USD - 20% discount (No VAT included)
 +
</pre>
 +
 
 +
== Contract based ADempiere Support ==
 +
* Please call for the price.
 +
* Included 5 support hours per month. Hours above that are at 40 euro per hour.
 +
* Up to 10 registered ADempiere users.
 +
* One contact person from the side of the customer.
 +
* Communication channels: Phone, Email, Skype, Ticketing system.
 +
* Free bugfixes.
 +
* Free migration to next version of ADempiere.
 +
* Free installation of ADempiere on customer server.
 +
* Free integration with [http://www.oscommerce.com/ osCommerce].
 +
* Free integration with [http://docs.google.com/ Google Documents]. User can import data from Google Docs and Spreadsheets.
 +
* Free integration with [http://www.google.com/calendar/ Google Calendar]. All events created in Adempiere calendar are exported to Google Calendar.
 +
 
 +
* Optional - Dedicated Server
 +
** 130 EURO per month. (No VAT included)
 +
** 650 EURO server setup fee.
 +
** 4 GB RAM.
 +
** 2 x 250 GB HDD. Hardware-RAID 1.
 +
** Traffic 5 000 GB.
 +
 
 +
== ADempiere customized with client's own brand ==
 +
* Please call for the price.
 +
* Client must send two images.
 +
* Services created for small and mid-sized implementation companies which do not have own java developers and find modifying of source code impossible task.
 +
* [[Adempiere Images]]
 +
 
 +
== ADempiere Virtual Appliance ==
 +
* Fully setup and ready to use Adempiere!
 +
* Standard users: Garden Admin and Garden Users can send emails!
 +
 
 +
* VMWare with Linux - Fedora Core - 5/7
 +
* Adempiere
 +
* Sun JDK
 +
* Database - Oracle or Postgres
 +
* Jakarta James email server
 +
* Price 45 EURO (No VAT included)
 +
 
 +
== On demand Adempiere build ==
 +
* Please call for the price.
 +
* Build of Adempiere upon user request.
 +
* 10% will be donated to Adempiere.
 +
* Build can include additional functionality like Fixed Asset or other not included in trunk.
 +
 
 +
== Adempiere DVD by Trifon ==
 +
* Price is: 30 EURO + shipping cost to your place or only 30 EUR and download from FTP Server.
 +
* DVD with complete Adempiere sources, Eclipse IDE and Sun JDK.
 +
* Available version for Linux and Windows.
 +
* Jakarta James email server.
 +
* Please contact me if you would like to have it.
 +
 
 +
Developer need to copy one directory to his local hard drive and can start customizing Adempiere.
 +
 
 +
== Paid Adempiere Urgent support ==
 +
* 3 EURO per minute.
  
=== Paid Adempiere support ===
 
 
* Need urgent advice for your Adempiere implementation or need to talk with experienced Adempiere developer &#45; call now to get friendly help&#46; Ask for Trifon&#46;
 
* Need urgent advice for your Adempiere implementation or need to talk with experienced Adempiere developer &#45; call now to get friendly help&#46; Ask for Trifon&#46;
* Price is 0.80 euro per minute
+
* [http://www.skype.com/go/joinskypeprime?call&skypename=trifonnt Use Skype Prime service to call now.]
[http://www.skype.com/go/joinskypeprime?call&skypename=trifonnt Use Skype Prime service to call now.]
+
* [http://skypeprime.skype.com/ More info about Skype Prime]
[http://skypeprime.skype.com/ More info about Skype Prime]
+
* [http://share.skype.com/sites/en/2007/03/skype_prime_beta_introducing_t.html Skype Prime Beta — introducing the global expertise marketplace]
 +
 
 +
 
 +
* [http://www.bitwine.com/advisors/trifonnt?auid=25850&amp;ctx=button http://www.bitwine.com/presence/1/25850.gif] 3 EUR per minute
 +
 
 +
 
 +
* [http://www.ether.com Ether] Another pay per call service
 +
 
 +
== Paid On-Site ADempiere User training(1 week) ==
 +
* 1500 EUR per week + ticket + hotel (No VAT included)
 +
* Training plan customized to fit client needs.
 +
* Example training plan:
 +
<pre>
 +
01) General overview of ADempiere ERP-CRM system.
 +
02) Introduction to user interface.
 +
03) How to setup new Company in ADempiere.
 +
04) How to setup new Organization in ADempiere.
 +
05) How to create and import Chart of Accounts. Introduction to ADempiere Chart of Accounts Editor.
 +
06) How to create new Product, Product Category and set Product Price and Price List.
 +
07) How to create hierarchical Categories of Services and Products (categories, subcategories, etc)
 +
08) How to import Products from external sources/systems.
 +
09) How to create Discount Schema and Price List and apply specific discount/overcharge for specific Product Group/Product, e.t.c. How to create Discount based on a percent or fixed amount.
 +
10) How to create new Business Partner(Client, Vendor and Employee).
 +
11) How set credit limit for Business Partners. Apply a credit limit to a client and ADempiere lock sales when limit is reached.
 +
12) How to assign discount to specific Business Partner, and change it in every sell.
 +
13) How to import Business Partners from external sources/systems.
 +
14) How to create Purchase Order.
 +
15) How to track purchases: list purchases that are not received, due dates.
 +
15) How to create Material Receipt.
 +
16) How to create Invoice (Vendor)
 +
17) How to enter Landed Costs.
 +
18) How to create Sales Order.
 +
19) How to create Shipment (Customer).
 +
20) How to create Shipment Confirmation.
 +
21) How to create Invoice (Customer).
 +
22) how to enter RMA.
 +
23) How to create Payment.
 +
24) How to match Purchase Order - Material Receipt - Invoice (Vendor).
 +
25) How to match Sales Order - Shipment - Invoice (Customer).
 +
26) How to create Cash Payment and Cash Receipt.
 +
27) How to create Bank Account and Bank transaction.
 +
28) How to modify Print Format of documents.
 +
29) How to setup emails of ADempiere users and send emails with attached document(Purchase Order, Invoice, e.t.c) to clients.
 +
30) How to create Users and assign User permissions.
 +
31) How to setup Window, Tab and Field permissions for specific Roles and Users.
 +
32) How to share data between Organizations and users.
 +
33) How to setup records to be readable only by their creators.
 +
34) How to setup taxes.
 +
</pre>
 +
 
 +
** http://www.adempiere.com/wiki/index.php/Training_Courses
 +
** http://www.adempiere.com/wiki/index.php/Implementation_Manuals
 +
 
 +
== Paid On-Site Flash ADempiere User training(1 day) ==
 +
* 400 EUR + ticket + hotel (No VAT included)
 +
* Training plan customized to fit client needs.
 +
* Example training plan:
 +
<pre>
 +
+01) Introduction to ADempiere user interface.
 +
+02) How to setup new Company in ADempiere.
 +
+03) How to setup new Organization in ADempiere.
 +
+04) How to create new Product, Product Category and set Product Price and Price List.
 +
+05) How to create hierarchical Categories of Services and Products (categories, subcategories, etc)
 +
+06) How to create Discount Schema and Price List and apply specific discount/overcharge for specific Product Group/Product, e.t.c. How to create Discount based on a percent or fixed amount.
 +
+07) How to create new Business Partner(Client, Vendor and Employee).
 +
+08) How to assign discount to specific Business Partner, and change it in every sell.
 +
+09) How to create Purchase Order.
 +
+10) How to track purchases: list purchases that are not received, due dates.
 +
+11) How to create Material Receipt.
 +
+12) How to create Invoice (Vendor)
 +
+13) How to create Sales Order.
 +
+14) How to create Shipment (Customer).
 +
+15) How to create Invoice (Customer).
 +
+16) How to create Payment.
 +
+17) How to match Purchase Order - Material Receipt - Invoice (Vendor).
 +
+18) How to match Sales Order - Shipment - Invoice (Customer).
 +
+19) How to create Cash Payment and Cash Receipt.
 +
+20) How to create Bank Account and Bank transaction.
 +
+21) How to create Users and assign User permissions. (Needed in order to be able to experiment afterwards)
 +
</pre>
 +
 
 +
== Paid on site Adempiere Developer training ==
 +
* 1500 EUR per week + ticket + hotel (No VAT included)
 +
* Training plan customized to fit client needs.
 +
* Example training plan:
 +
<pre>
 +
01) Overview of Adempiere setup in Eclipse.
 +
02) Layers in adempiere and where clases are located in the source tree?
 +
2.1) Model (Domain) layer.
 +
2.2) Business logic layer.
 +
2.3) GUI - Swing layer.
 +
2.4) GUI - Web layer.
 +
03) How to add new table and columns in Adempiere?
 +
04) How to generate Adempiere model classes for the newly created table?
 +
05) How to add validation, pre-pressing and post-processing logic for the new table?
 +
    (beforeSave, afterSave, beforeDelete afterDelete)
 +
    ModelValidator
 +
06) How to add new Window, Tab and Fields?
 +
06.1) How to add new Tab which has Tree?
 +
06.2) How to add Translation Tab?
 +
07) How to add GUI callout?
 +
08) How to define new Document in Adempiere?
 +
09) How to add business logic for the newly created document?
 +
10) How to add Process in Adempiere?
 +
11) How to add java code for the newly defined process?
 +
</pre>
  
=== On site Adempiere training and development ===
+
== Paid Adempiere development ==
* 1500 EURO / week + ticket + hotel
+
* 300 EURO / day (No VAT included)
 +
* Please call for discount if you plan to book more than 150 hours
  
=== Paid EDI @ Adempiere support and training ===
+
== Paid EDI @ ADempiere support and training ==
 
* If you need training or support for EDI in Adempiere, please do not hesitate to contact me.
 
* If you need training or support for EDI in Adempiere, please do not hesitate to contact me.
* Prices start from 30 Euro per hour.
+
* Prices start from 30 EUR per hour.
  
=== OpenXava Development ===
+
== Paid [http://www.liferay.com Liferay] setup and extensions development ==
 +
* Leading Open Source Enterprise Portal
 +
* JSR-168 compliant
 +
* Business Friendly Open Source License: MIT License
 +
 
 +
 
 +
== Paid OpenXava Development ==
 
* Development of custom applications based on [http://www.gestion400.com/web/guest/openxava OpenXava framework].
 
* Development of custom applications based on [http://www.gestion400.com/web/guest/openxava OpenXava framework].
  
Line 41: Line 250:
 
** Development of applications which must be part of a [http://en.wikipedia.org/wiki/Web_portal Web Portal].
 
** Development of applications which must be part of a [http://en.wikipedia.org/wiki/Web_portal Web Portal].
 
** Applications based on OpenXava can run on any DB which is supported by [http://www.hibernate.org/ Hibernate].
 
** Applications based on OpenXava can run on any DB which is supported by [http://www.hibernate.org/ Hibernate].
** Licensed under LGPL. You can develop comercial application using OpenXava.
+
** Licensed under LGPL. You can develop commercial application using OpenXava.
  
 
* Features:
 
* Features:
Line 52: Line 261:
 
** Applications based on Openxava have easy integration of reports made with JasperReports.
 
** Applications based on Openxava have easy integration of reports made with JasperReports.
  
* My contributions to OpenXava:
+
=== Trifon's contributions to OpenXava ===
 +
 
 +
* [http://sourceforge.net/tracker/index.php?func=detail&aid=1749402&group_id=123187&atid=695746 1749402 - GUI display field size]
  
** [http://sourceforge.net/tracker/index.php?func=detail&aid=1749402&group_id=123187&atid=695746 1749402 GUI display field size]
+
* [http://sourceforge.net/forum/forum.php?thread_id=1755705&forum_id=419691 Bulgarian flag]
  
** [http://sourceforge.net/forum/forum.php?thread_id=1755705&forum_id=419691 Bulgarian flag]
+
* [http://sourceforge.net/tracker/index.php?func=detail&aid=1784323&group_id=123187&atid=695746 1784323 - Generate constant PROPERTY_Xxx in java interfaces] Will be part of OpenXava 2.2.2 release.
  
 
* Please contact me for quotation.
 
* Please contact me for quotation.
  
=== Java Development ===
+
== Paid Java Development ==
 
* Development of java applications.
 
* Development of java applications.
 
* Please contact me for quotation.
 
* Please contact me for quotation.
  
== Adempiere trackers ==
 
  
=== Submited by Trifon and Assigned to Trifon ===
 
:*{{User:Hengsin/SF_Tracker|Bugs|trifonnt|879332}}
 
:*{{User:Hengsin/SF_Tracker|Contributions|trifonnt|883808}}
 
:*{{User:Hengsin/SF_Tracker|Feature Requests|trifonnt|879335}}
 
:*{{User:Hengsin/SF_Tracker|Patches|trifonnt|879334}}
 
  
=== Assigned to Trifon ===
+
= ADempiere =
:*{{User:Hengsin/SF_Contribution|Bugs|195397|879332}}
+
=== Performance tests & results made by me ===
:*[http://sourceforge.net/tracker/index.php?group_id=176962&atid=883808&_category=100&_group=100&order=artifact_id&sort=DESC Contributions]
+
This are slower than on my laptop.
:*{{User:Hengsin/SF_Contribution|Feature Requests|195397|879335}}
+
On laptop result was around 17 products / second.
:*{{User:Hengsin/SF_Contribution|Patches|195397|879334}}
+
  
== Adempiere contributions ==
+
<pre>
 +
Processors..........: 2 x Pentium2 800MHz
 +
RAM.................: 2 GB
 +
OS..................: Linux, Fedora Core 5
 +
DB..................: Oracle XE
 +
JDK.................: Sun JDK 1.5.0_11
 +
Adempiere version...: 3.3.0
 +
Note................: Adempiere client on the same machine as DB.
  
=== Functionality Contributions ===
+
Tables where records are inserted:
 +
AD_TREENODEPR    1095095
 +
M_PRODUCT        1095095
 +
M_PRODUCT_ACCT    1095095
 +
M_PRODUCT_TRL    1095095
  
==== EDI @ Adempiere - [http://www.adempiere.com/wiki/index.php/Sponsored_Development:_EDI_Import/Export Sponsored Development: EDI Import/Export] ====
+
Performance table
  
* [http://www.stylusstudio.com/convert_edi_to_xml.html Convert EDI to XML]
+
Start Time      = Thu Aug 09 04:57:01 EEST 2007
 +
End Time        = Thu Aug 09 05:13:54 EEST 2007
 +
Duration(ms)    = 1012585
 +
Duration(sec.)  = 1012
 +
Duration(min.)  = 16
 +
Products        = 5000
 +
Time(seconds)  = 1012
 +
Produsts/Second = 4.9407115
  
==== Replication @ Adempiere - [http://www.adempiere.com/wiki/index.php/Sponsored_Development:_Replication Sponsored Development: Replication] ====
+
Start Time      = Thu Aug 09 05:17:04 EEST 2007
 +
End Time        = Thu Aug 09 09:14:23 EEST 2007
 +
Duration(ms)    = 14239657
 +
Duration(sec.)  = 14239
 +
Duration(min.= 237
 +
Products        = 144000
 +
Time(seconds)  = 14239
 +
Produsts/Second = 10.11307
  
* Links:
 
Resources:
 
http://www.afceurope.com/JMS.html
 
http://www.manageability.org/blog/stuff/open-source-jms-java
 
  
Example the Replication with JMS
+
Start Time      = Fri Aug 10 03:43:13 EEST 2007
http://www-128.ibm.com/developerworks/library/i-jms/
+
End Time        = Fri Aug 10 07:42:25 EEST 2007
 +
Duration(ms)    = 14351454
 +
Duration(sec.)  = 14351
 +
Duration(min.)  = 239
 +
Duration(hours.) = 3
 +
Products        = 144000
 +
Time(seconds)    = 239
 +
Produsts/Second  = 10.03
 +
 +
Start Time      = Fri Aug 10 13:00:23 EEST 2007
 +
End Time        = Fri Aug 10 16:58:42 EEST 2007
 +
Duration(ms)    = 14298664
 +
Duration(sec.)  = 14298
 +
Duration(min.)  = 238
 +
Duration(hours.) = 3
 +
Products        = 144000
 +
Time(seconds)    = 14298
 +
Produsts/Second  = 10.071339
  
Use the JMS Synchrony and Asynchrony
+
Start Time      = Fri Aug 10 19:59:38 EEST 2007
http://openjms.sourceforge.net/usersguide/using.html
+
End Time        = Sat Aug 11 03:59:55 EEST 2007
 +
Duration(ms)    = 28817002
 +
Duration(sec.)  = 28817
 +
Duration(min.)  = 480
 +
Duration(hours.) = 8
 +
Products        = 288000
 +
Time(seconds)    = 28817
 +
Produsts/Second  = 9.994101
  
http://www.javalobby.org/articles/distributed-jms/
+
Start Time      = Sat Aug 11 17:53:38 EEST 2007
 +
End Time        = Sun Aug 12 02:18:17 EEST 2007
 +
Duration(ms)    = 30278812
 +
Duration(sec.)  = 30278
 +
Duration(min.)  = 504
 +
Duration(hours.) = 8
 +
Products        = 288000
 +
Time(seconds)    = 30278
 +
Produsts/Second  = 9.511857
  
JMS @ Salesforce.com:
+
</pre>
* http://www.webservices.org/categories/development/interoperability/strikeiron_introduces_web_services_via_salesforce_com_s_appexchange/(go)/Articles
+
  
* Status: [http://community.salesforce.com/sforce/board/message?board.id=JAVA_development&message.id=3516 feature is called Outbound Messaging and will be in Winter 07]
+
* [https://sourceforge.net/forum/message.php?msg_id=7529055 post regarding import performance]
  
* [http://www.tibco.com/resources/company/partners/integration_bundle_salesforce_ds.pdf TIBCO and salesforce.com]
+
==== Issues found ====
 +
* Posterita WP POS expect that TAX Category has only one Tax Rate assigned to it.
 +
* Posterita create AR Invoice while POS Order type in Adempiere creates Invoice Indirect. This allows to distinguish Invoices creates by POS. Of course Business partner also can allow sot distinguish POS invoices, but more consitent behavior is to create Invoice Indirect.
  
=== Planned Contributions and Tasks ===
+
==== Comparison of Posterita Web UI and Robert Klein Ajax Web UI ====
* [https://sourceforge.net/forum/forum.php?thread_id=1748020&forum_id=611167 sf.net thread regarding Pentaho training]
+
* [https://sourceforge.net/forum/message.php?msg_id=4664348 sf.net post]
* [[Adempiere GUI Enhancements]]
+
  
* Restrict form "Generate Invoices (manual)" to show only public records (hide locked records) [http://sourceforge.net/tracker/index.php?func=detail&aid=1713337&group_id=176962&atid=879332 BUG - 1713337]
+
* Robert Klein Ajax is more usable than Posterita WebUI
 +
** Attachment works in Robert Klein but not in Posterita.
 +
** Grid of Posterita is mess up.
 +
** Scrolling and navigation are mess up in Posterita.
 +
** Decimal point of numeric has many zeros in Posterita.
 +
** Robert Klein Web UI runs fast than Posterita.
  
* Restrict form "Generate Shipments (manual)" to show only public records (hide locked records) [https://sourceforge.net/tracker/index.php?func=detail&aid=1713317&group_id=176962&atid=879332 BUG - 1713317]
 
  
== Interesting bugs/patches ==
+
==== Notes about installation ====
* [https://sourceforge.net/tracker/?func=detail&atid=879332&aid=1721710&group_id=176962 1721710 Changing BPartner in a completed document should be denied]
+
* One Business partner must have column AD_OrgBP_ID set to Organization which is set in POS Terminal.
* [https://sourceforge.net/tracker/index.php?func=detail&aid=1722049&group_id=176962&atid=879332 1711594 Workflow is not taking account of "Access All Orgs"]
+
<pre>
* [https://sourceforge.net/tracker/?func=detail&atid=879332&aid=1704785&group_id=176962 1704785 VFile is not firing Vetoable Change]
+
SELECT C_BPartner_ID FROM C_BPartner WHERE AD_OrgBP_ID=
 +
</pre>
  
== My favourite readings ==
+
* Execution of migration scripts.
* [http://www.onlamp.com/lpt/a/7005 Tools for Geographically Distributed Software Development]
+
<pre>
* [http://www.timeanddate.com/ Time and zone info]
+
@"1.0-1.5 (AD331b)\oracle\001_ad_changes.sql"
* [http://openid.net/ OpenID]
+
@"1.0-1.5 (AD331b)\oracle\002_ad_message.sql"
* [http://www.x-rates.com Exchange Rates]
+
@"1.0-1.5 (AD331b)\oracle\003_m_pricelist.sql"
  
=== Interesting ===
+
@"1.6(AD340)\oracle\001_ad_Changes for C_Currency.sql"
* [http://www.readingcpl.com/activity-based-costing/2007/05/variable-costing-direct-costing-marginal-costing.php  Variable Costing/Direct Costing/Marginal Costing]
+
@"1.6(AD340)\oracle\002_ad_message.sql"
* [http://martinfowler.com/articles/languageWorkbench.html Martin Fowler; Language Workbenches: The Killer-App for Domain Specific Languages?]
+
@"1.6(AD340)\oracle\003_C_Currency.sql"
* [http://buildix.thoughtworks.com/ Continuous Integration, Source Control, a Wiki and a Bug-Tracker; by ThoughtWorks]
+
  
==== Open Source articles ====
+
@"1.7.0\oracle\001_MixedPayment.sql"
* [http://itmanagement.earthweb.com/career/article.php/11067_3687096_1 Will Open Source Developers be Well Paid?]
+
@"1.7.0\oracle\002_Terminals_newTableStructure.sql"
* [http://www.riehle.org/computer-science/research/2007/computer-2007-article.html The Economic Motivation of Open Source Software: Stakeholder Perspectives]
+
@"1.7.0\oracle\003_Terminals_TransferConfiguration.sql"
 +
@"1.7.0\oracle\004_Terminals_newTableDDL.sql"
 +
@"1.7.0\oracle\005_Messages.sql"
  
===== OSS Etiquette & Culture =====
+
@"1.7.1\oracle\001_M_Inventory.sql"
* [http://www.mozilla.org/community/etiquette.html Mozilla Forum Etiquette]
+
* [http://wiki.archlinux.org/index.php/Forum_Etiquette ArchLinux Forum Etiquette]
+
* [http://www.wikimatrix.org/forum/viewtopic.php?id=387 WikiMatrix Forum Etiquette]
+
* [http://www.lilbeginnings.com/forum/et/ Forum Etiquette & Rules]
+
  
==== Books ====
+
@"1.7.2\oracle\001_ADRole.sql"
* [http://www.mergere.com/m2book_download.jsp Better Builds with Maven]
+
  
==== Articles and posts from Martin Fowler ====
+
@"trunk\oracle\002_ADMessage.sql"
* [http://martinfowler.com/eaaDev/EventCollaboration.html Event Collaboration]
+
@"trunk\oracle\003_AD_OrgInfo.sql"
 +
@"trunk\oracle\004_AD_Changes for AD_OrgInfo.sql"
 +
@"trunk\oracle\005_MissingIDs.sql"
 +
@"trunk\oracle\006_PackSize_MProduct.sql"
 +
@"trunk\oracle\007_CashPayment.sql"
 +
</pre>
  
==== Financial based ====
 
* [http://www.xbrl.org/WhatIsXBRL/ XBRL stands for eXtensible Business Reporting Language]
 
Read and respond to this message at:
 
https://sourceforge.net/forum/message.php?msg_id=4366156
 
By: drhayderaziz
 
  
I think that Adempiere would get a lot of kudos if Adempiere went the XBRL route www.xbrl.org for financial reporting. For listed companies (and even for unlisted) XBRL will be the way to go especially for any international company that has to consolidate accounts from multiple legal entities in multiple countries in a standardised manner. This would be an essential component of an ERP system in the 2008-2009 time frame. If Adempiere would have its COA structured the XBRL way and have XBRL compliant financial statements at  company/consolidated level it would be an AMAZING value proposition to so many organisations.
+
* Values of web.xml
 +
<pre>
 +
<context-param>
 +
<param-name>#AD_Client_ID</param-name>
 +
<param-value>11</param-value>
 +
</context-param>
 +
<context-param>
 +
<param-name>#AD_Language</param-name>
 +
<param-value>en_US</param-value>
 +
</context-param>
 +
<context-param>
 +
<param-name>#AD_Org_ID</param-name>
 +
<param-value>11</param-value>
 +
</context-param>
 +
<context-param>
 +
<param-name>#AD_User_ID</param-name>
 +
<param-value>102</param-value> <!-- GardenUSer -->
 +
</context-param>
 +
<context-param>
 +
<param-name>#C_BankAccount_ID</param-name>
 +
<param-value>100</param-value>
 +
</context-param>
 +
<context-param>
 +
<param-name>#SalesRep_ID</param-name>
 +
<param-value>102</param-value>
 +
</context-param>
 +
<context-param>
 +
<param-name>#AD_Role_ID</param-name>
 +
<param-value>103</param-value> <!-- Garden User -->
 +
</context-param>
 +
<context-param>
 +
<param-name>#W_Store_ID</param-name>
 +
<param-value>11</param-value>
 +
</context-param>
 +
<context-param>
 +
<param-name>REPORT_DIRECTORY</param-name>
 +
<param-value>/config/reports/</param-value>
 +
</context-param>
 +
</pre>
  
==== Comparison of Open Source ERP Systems ====
+
* How to setup?
* [http://www.big.tuwien.ac.at/research/publications/diplomatheses/herzog.pdf A Comparison of Open Source ERP Systems]
+
Explained by Colin in irc:
 +
<pre>
 +
-01) Login as System Admin and add new window for the table "U_POSTerminal".
 +
-02) Use the "Create Fields" button on the "Tab" tab to add all the fields of this table.
 +
-03) Go to System Admin->Gerenral Rules->System Rules->Menu window and create a new menu item.
 +
-04) Select Window as the Action and point it to the new window you just created (by selecting it in the window dropdown).
 +
-05) Log out and log back in as Garden Admin.
 +
-06) Using you new window create a new POS terminal. Chose what ever you wish for the settings.
 +
-07) Go to Quote-to-Invoice->Sales Orders->Web POS->
 +
-08) Go to the role menu here and create a new record with "Web Menu"=smenu.cash.sales and "Role" = "GardenWorld Admin".
 +
    Uou can add more if you wish but I think this is all that's needed for basic sales.
 +
</pre>
  
==== Non IT Technology ====
+
* Printing
* [http://www.horizonfuelcell.com/store/rees.htm Technology of Future]
+
* [http://netinfo.bg/?tid=40&oid=1062999 Article In Bulgarian]
+
  
 +
Edit java.policy in
 +
<pre>
 +
C:\Program Files\Java\jdk1.6.0_10\jre\lib\security
 +
</pre>
  
=== Social networks ===
+
Add the code below
* [http://www.xing.com/ www.xing.com; Formerly know as openBC; Very strong in Europe]
+
* [http://www.linkedin.com www.linkedin.com; Emerging at the moment]
+
  
=== ERP articles ===
+
<pre>
 +
grant codeBase "http://192.168.0.100" {
 +
      permission java.util.PropertyPermission "org.jpedal.rejectsuperimposedimages", "read, write";
 +
      permission java.util.PropertyPermission "file.separator", "read, write";
 +
OR
 +
      permission java.security.AllPermission;
 +
};
 +
</pre>
  
==== Interesting ====
+
=== Seats/tables in a restaurant (or plane or cinema) ===
* [http://www.revenue.ie/index.htm?/leaflets/warehouse.htm Customs Warehouse]
+
  
 +
In my opinion the seat/table numbering problematic could be solved with the help of the entities AccommodationClass, AccommodationMap  described in the book vol2. I will give you a short description of these entities and example of the "numbering issue" solution.
  
=== Adempiere ===
+
AccommodationClass - description:
* [http://www.adempiere.com/wiki/index.php/Foundation_Project Adempiere Foundation]
+
It is designed to store classes information (these could be plane, bus classes, table types, chair types, room types etc)
* [http://zkoss.org/demo/adempiereOnZK/adempiereOnZK.html Adempiere on ZK Demo]
+
* [http://www.graysonconsulting.biz:8000/ Radio station to help people learn Adempiere libero by Tim]
+
  
* [http://www.adempiere.com/wiki/index.php/ADempiere_Motto_Contest ADempiere Motto Contest]
+
AccommodationClass - definition (based on the book but modified a little)
* [http://www.adempiere.com/wiki/index.php/ADempiere_Motto_Contest/Qualification_Round Qualification Round ADempiere Motto Contest]
+
fields: accClassId, parentAccClassId, description
* [http://oslabs.dnsalias.org:8080/adempiere/ WEB interface from Robert]
+
* [http://www.adempiere.com/wiki/index.php/Accounting Accounting initiative]
+
* [http://picasaweb.google.com/goanookie/ADempiereEuropeanConference Pictures from Adempiere Conference - Berlin 2007]
+
* [http://www.adempiere.com/wiki/index.php/ADempiere_Institute_%26_Center_of_Excellence ADempiere Institute & Center of Excellence]
+
* [https://sourceforge.net/forum/message.php?msg_id=4355888 Making Workflows more predictable]
+
* [http://svn.sourceforge.net/adempiere/?rev=2725&view=rev Revision: 2725; Grid Collapse & Horizontal Tab Improve]
+
* [https://sourceforge.net/tracker/?func=detail&atid=879334&aid=1734897&group_id=176962 Feature Request]
+
Adempiere Brazil Localisation effort
+
Peope that are cooperating with Adempiere LBR (LBR = Localization Brazil).
+
Those are their names, followed by their sourceforge username.
+
  
Eduardo Montenegro (emontenegro)
 
Alvaro Montenegro (amontenegro)
 
Mario Grigioni (mgrigioni)
 
  
==== Adempiere commit schema ====
+
AccommodationMap - description:
* [http://sourceforge.net/forum/message.php?msg_id=4384940 Structure and idea of Commit Level]
+
Its idea is to provide information of the number of spaces offered by a fa/accClass. Here we can extend it to provide overbooking information and seat numbering information(the last two fields in the definition below)
 +
fields: mapId, accClassId, faId, nrOfSpaces, overBooked, number
  
Mentor/Commiter approach approved with 11/11 votes, according to this thread:
+
Example:
https://sourceforge.net/forum/forum.php?thread_id=1765233&forum_id=611167
+
Define two tables.
 +
- Table number 5 has 3 chairs. Chair with number 1 is baby_chair. The other two chairs with number 2 and 3 are high_chairs.
 +
- Table number 9 has 2 chairs. Chairs number 1 and 2 are normal_chairs.
  
Initial team is:
+
In FixedAsset relate the tables to the chairs.
 +
<pre>
 +
FixedAsset:fixedAssetId=table1,  parentFixedAssetId=NULL
 +
FixedAsset:fixedAssetId=table2,  parentFixedAssetId=NULL
 +
FixedAsset:fixedAssetId=chair11, parentFixedAssetId=table1 //chair11 belongs to table1
 +
FixedAsset:fixedAssetId=chair12, parentFixedAssetId=table1 //chair12 belongs to table1
 +
FixedAsset:fixedAssetId=chair13, parentFixedAssetId=table1 //chair13 belongs to table1
 +
FixedAsset:fixedAssetId=chair14, parentFixedAssetId=table2 //chair14 belongs to table2
 +
FixedAsset:fixedAssetId=chair15, parentFixedAssetId=table2 //chair15 belongs to table2
 +
</pre>
  
Mentors:  
+
In Accommodationclass define the table/chair classes.
* Heng Sin
+
<pre>
* Teo
+
AccommodationClass: accClassId=tables,        parentAccClassId=NULL
* Trifon - (Phib, Ashley )
+
AccommodationClass: accClassId=chairs,        parentAccClassId=NULL
* Victor
+
AccommodationClass: accClassId=plane_classes, parentAccClassId=NULL
* Karsten
+
AccommodationClass: accClassId=baby_chair,   parentAccClassId=chairs;
* Carlos
+
AccommodationClass: accClassId=high_chair,    parentAccClassId=chairs;
 +
AccommodationClass: accClassId=normal_chair,  parentAccClassId=chairs;
 +
</pre>
  
Mentored(Commiters):
 
* Redhuan
 
* Bahman
 
* Johannes
 
* Phib
 
* Ashley
 
* Fer_luck
 
* Tim (for 2pack)
 
* Robert Klein
 
  
==== VERY IMPORTANT ====
+
In AccommodationMap define how many places each table or chair has and which is its number.
* [https://sourceforge.net/forum/message.php?msg_id=4432961 EU funding Adempiere Development]
+
<pre>
 +
AccommodationMap: accClassId=tables,        fixedAssetId=table1,  nrOfSpaces=3, number=5 //table number 5 has 3 chairs(faId=table1)
 +
AccommodationMap: accClassId=baby_chair,    fixedAssetId=chair11, nrOfSpaces=1, number=1 //chair number 1 has one place(faId=chair11)
 +
AccommodationMap: accClassId=high_chair,    fixedAssetId=chair12, nrOfSpaces=1, number=2 //chair number 2 has one place(faId=chair12)
 +
AccommodationMap: accClassId=high_chair,    fixedAssetId=chair13, nrOfSpaces=1, number=3 //chair number 3 has one place(faId=chair13)
 +
AccommodationMap: accClassId=tables,        fixedAssetId=table2,  nrOfSpaces=2, number=9 //table number 9 has two places(faId=table2)
 +
AccommodationMap: accClassId=normal_chair,  fixedAssetId=chair14, nrOfSpaces=1, number=1 //chair number 1 has one place(faId=chair14)
 +
AccommodationMap: accClassId=normal_chair,  fixedAssetId=chair15, nrOfSpaces=1, number=2 //chair number 2 has one place(faId=chair15)
 +
</pre>
  
==== Incoming evenets ====
+
In similar fashion you can define theaters, planes etc.
Time: 15:00 GMT
+
Also overbooking data could be kept in the AccommodationMap entity which could be used for hotel reservations. Hourly reservations could be enabled as well with the introduction of the AccommodationSpot entity.
Day: Tuesday June 26
+
Venue: IRC channel #adempiere-team (on irc.freenode.net)
+
  
1 - Centralized Application Dictionary Management
 
  
2 - The second issue is that developer community is growing and commit committee can't cope with the review of all commits.
+
==== How to import product from csv file? ====
 +
* [https://sourceforge.net/forum/message.php?msg_id=5507588 sf.net post]
  
==== Postal Code Web Service ====
+
MySQL script commands to import a simple CSV spreadsheet of products and a collection of image files.
* [http://sourceforge.net/tracker/index.php?func=detail&aid=1741222&group_id=176962&atid=879335 1741222 Webservice connector for address lookups]
+
* [https://sourceforge.net/forum/message.php?msg_id=4377879 1-Postcode lookup propsal by Michael Judd]
+
* [https://sourceforge.net/forum/message.php?msg_id=4377901 2-Postcode lookup propsal by Michael Judd]
+
* [https://sourceforge.net/forum/message.php?msg_id=4381779 Proposal from Teo]
+
  
==== Developer hints ====
+
CSV file MUST have these columns:
* class dbPort/org.compiere.process.DocActionTemplate shows a template for DocAction, i think that it must be updated.
+
<pre>
 +
REFERENCE*, NAME*, PRICEBUY, PRICESELL, BARCODE*, CATEGORY
 +
</pre>
  
* [http://www.youtube.com/watch?v=tRHyFODLlUE Video created by Tim; part 1]
+
The columns with a * must have different values for every product, otherwise the script will fail.
* [http://www.youtube.com/watch?v=tRHyFODLlUE Video created by Tim; part 2]
+
The category IDs in the CSV file also have to match the IDs in the 'categories' database table.
* [http://www.adempiere.com/wiki/index.php/Open_Window_and_Tab Open Window and Tab programmatically]
+
  
===== Subversion Access =====
+
<pre>
Adempiere project's SourceForge.net Subversion repository can be checked out through SVN with the following instruction set:
+
LOAD DATA
svn co https://adempiere.svn.sourceforge.net/svnroot/adempiere adempiere
+
INFILE 'C:\\temp\\products.csv'
 +
INTO TABLE products
 +
FIELDS TERMINATED BY ','
 +
LINES TERMINATED BY '\r\n'
 +
(REFERENCE, NAME, PRICEBUY, PRICESELL, CODE, CATEGORY)
 +
SET ID = UUID(), TAXCAT = '001', ISCOM = 0, ISSCALE = 0;
 +
</pre>
  
===== Migration with SQL statements - AD_Element =====
+
# the images are loaded by searching a directory for files that have the same names as the products
 
<pre>
 
<pre>
INSERT INTO AD_Element
+
SET @IMAGE_DIR = 'C:\\temp\\products\\images\\';
(AD_Element_ID, AD_Client_ID, AD_Org_ID, IsActive,
+
UPDATE products
Created, CreatedBy,
+
SET IMAGE = IFNULL(LOAD_FILE(CONCAT(@IMAGE_DIR, products.NAME, '.jpg')),
Cpdated, UpdatedBy,
+
            IFNULL(LOAD_FILE(CONCAT(@IMAGE_DIR, products.NAME, '.png')),
ColumnName, EntityType, Name,
+
                    LOAD_FILE(CONCAT(@IMAGE_DIR, products.NAME, '.gif'))))
PrintName
+
WHERE IMAGE IS NULL;
)
+
VALUES (500XX, 0, 0, 'Y',
+
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
+
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
+
'[ColumnNameHere]', 'D', '[NameHere]',
+
'[PrintNameHere]'
+
);
+
COMMIT;
+
UPDATE AD_Sequence
+
SET CurrentNextSys = (SELECT MAX (AD_Element_ID) + 1
+
FROM AD_Element
+
WHERE AD_Element_ID < 1000000)
+
WHERE NAME = 'AD_Element';
+
 
</pre>
 
</pre>
  
===== Migration with SQL statements - AD_Column =====
+
# to make the products appear in the catalog, their ids must be added to this table
 
<pre>
 
<pre>
INSERT INTO AD_Column
+
INSERT INTO products_cat (PRODUCT)
(AD_Column_ID, AD_Client_ID, AD_Org_ID, IsActive,
+
SELECT products.ID FROM products;
Created,
+
Updated, CreatedBy,
+
UpdatedBy, Name, Description, VERSION,
+
EntityType, ColumnName, AD_Table_ID, AD_Reference_ID,
+
FieldLength, IsKey, IsParent, IsMandatory, IsUpdateable,
+
IsIdentifier, SeqNo, IsTranslated, IsEncrypted,
+
isselectioncolumn, ad_element_id, callout, issyncdatabase,
+
isalwaysupdateable
+
)
+
VALUES (502XX, 0, 0, 'Y',
+
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'),
+
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
+
100, '[NameHere]', '[DescriptionHere]', 1,
+
'D', '[ColumnNameHere]', AD_Table_IDHERE, AD_Reference_IDHere,
+
1, 'N', 'N', 'Y', 'Y',
+
'N', 0, 'N', 'N',
+
'N', 50071, '[CalloutHere]', 'N',
+
'N'
+
);
+
COMMIT;
+
UPDATE AD_Sequence
+
SET CurrentNextSys = (SELECT MAX (ad_column_id) + 1
+
FROM AD_Column
+
WHERE AD_Column_ID < 1000000)
+
WHERE NAME = 'AD_Column';
+
 
</pre>
 
</pre>
  
===== Migration with SQL statements - AD_Field =====
+
 
 +
=== OsCommerce db settings ===
 
<pre>
 
<pre>
INSERT INTO AD_Field
+
/var/www/html/admin/includes/configure.php
(ad_field_ID, AD_Client_ID, AD_Org_ID, IsActive,
+
Created, CreatedBy,
+
Updated, UpdatedBy,
+
Name, Description, IsCentrallyMaintained, SeqNo, AD_Tab_ID,
+
AD_Column_ID, IsDisplayed, DisplayLength, IsReadonly,
+
IsSameLine, IsHeading, IsFieldOnly, IsEncrypted, EntityType
+
)
+
VALUES (50184, 0, 0, 'Y',
+
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
+
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
+
'Store Archive On File System', 'Store Archive On File System', 'Y', 250, 145,
+
50214, 'Y', 1, 'N',
+
'N', 'N', 'N', 'N', 'D'
+
);
+
COMMIT;
+
UPDATE AD_Sequence
+
SET currentnextsys = (SELECT MAX (ad_field_id) + 1
+
FROM AD_Field
+
WHERE AD_Field_ID < 1000000)
+
WHERE Name = 'AD_Field';
+
 
</pre>
 
</pre>
  
===== Migration with SQL statements - AD_Message =====
+
=== Schemas in MySQL DB where OsCommerce is installed ===
 
<pre>
 
<pre>
INSERT INTO AD_Message
+
information_schema
(AD_Message_ID, AD_Client_ID, AD_Org_ID, IsActive,
+
mysql
Created, CreatedBy,
+
oscomm
Updated, UpdatedBy,
+
test
Value, MsgText, MsgType
+
)
+
VALUES (500XX, 0, 0, 'Y',
+
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
+
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
+
'[VaueHere]','[MSG Text Here]','I'
+
);
+
COMMIT;
+
UPDATE AD_Sequence
+
SET CurrentNextSys = (SELECT MAX (AD_Message_ID) + 1
+
FROM AD_Message
+
WHERE AD_message_ID < 1000000)
+
WHERE NAME = 'AD_Message';
+
 
</pre>
 
</pre>
  
===== Migration with SQL statements - AD_Process_Para =====
+
=== osCommerce Tables ===
 +
==== products ====
 
<pre>
 
<pre>
INSERT INTO AD_Process_Para
+
products_id int(11)
(AD_Process_Para_ID, AD_Client_ID, AD_Org_ID, IsActive, Created,
+
products_quantity int(4)
CreatedBy, Updated, UpdatedBy, Name,
+
products_model varchar(12)
Description,
+
products_image varchar(64)
Help,
+
products_price decimal(15,4)
AD_Process_ID, SeqNo, AD_Reference_ID, AD_Reference_Value_ID,
+
products_date_added datetime
AD_Val_Rule_ID, ColumnName, IsCentrallyMaintained, FieldLength,
+
products_last_modified datetime
IsMandatory, IsRange, AD_Element_ID, EntityType
+
products_date_available datetime
)
+
products_weight decimal(5,3)
VALUES (50019, 0, 0, 'Y', TO_DATE ('2007-03-03', 'YYYY-MM-DD'),
+
products_status tinyint(1)
100, TO_DATE ('2007-03-03', 'YYYY-MM-DD'), 100, 'Shipment Date',
+
products_tax_class_id int(11)
'Date printed on shipment',
+
manufacturers_id int(11)
'The Shipment Date indicates the date printed on the shipment.',
+
products_ordered int(11)
118, 15, 15, NULL,
+
products_quanityt_discount varchar(255)
NULL, 'MovementDate', 'N', 0,
+
products_weight_package varchar(255)
'Y', 'N', 1037, 'D'
+
products_status_hide tinyint(1)
);
+
COMMIT;
+
UPDATE AD_SEQUENCE
+
SET currentnextsys = (SELECT MAX (ad_process_para_id) + 1
+
FROM AD_Process_Para
+
WHERE AD_Process_Para_ID < 1000000)
+
WHERE NAME = 'AD_Process_Para';
+
 
</pre>
 
</pre>
  
==== License to use for new classes ====
+
==== products_description ====
 
<pre>
 
<pre>
/**********************************************************************
+
products_id int(11)
* This file is part of Adempiere ERP Bazaar                          *
+
language_id int(11)
* http://www.adempiere.org                                            *
+
products_name varchar(128)
*                                                                    *
+
products_description text
* Copyright (C) Trifon Trifonov.                                      *
+
products_description_short text
* Copyright (C) Contributors                                          *
+
products_url varchar(255)
*                                                                    *
+
products_viewed int(5)
* This program is free software; you can redistribute it and/or      *
+
products_status_translation tinyint(1)
* modify it under the terms of the GNU General Public License        *
+
products_meta_title varchar(255)
* as published by the Free Software Foundation; either version 2      *
+
products_meta_keywords text
* of the License, or (at your option) any later version.              *
+
products_meta_description text
*                                                                    *
+
* This program is distributed in the hope that it will be useful,    *
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of      *
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the        *
+
* GNU General Public License for more details.                        *
+
*                                                                    *
+
* You should have received a copy of the GNU General Public License  *
+
* along with this program; if not, write to the Free Software        *
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,          *
+
* MA 02110-1301, USA.                                                *
+
*                                                                    *
+
* Contributors:                                                      *
+
* - Trifon Trifonov (trifonnt@users.sourceforge.net)                 *
+
*                                                                    *
+
* Sponsors:                                                          *
+
* - Company (http://www.site.com)                                     *
+
***********************************************************************/
+
...
+
...
+
/**
+
* @author Trifon Trifonov
+
* @version $Id$
+
*/
+
 
</pre>
 
</pre>
  
==== Adempiere Export/Import Tools ====
+
==== tax_class ====
2Pack can manage in the XML file the following items:
+
<pre>
 +
tax_class_id int(11)
 +
tax_class_title varchar(32)
 +
tax_class_description varchar(255)
 +
last_modified datetime
 +
date_added datetime
 +
</pre>
  
<table>
+
==== manufacturers ====
<tr><td>2Pack</td><td>ADCK</td></tr>
+
<pre>
<tr><td>menu</td><td>[[ADCK menu|menu]]</td></tr>
+
manufacturers_id int(11)
<tr><td>window</td><td>[[ADCK window|window]]</td></tr>
+
manufacturers_name varchar(32)
<tr><td>tab</td><td>[[ADCK tab|tab]]</td></tr>
+
manufacturers_image varchar(64)
<tr><td>field</td><td>[[ADCK field|field]]</td></tr>
+
date_added datetime
<tr><td>process</td><td>[[ADCK process|process]]</td></tr>
+
last_modified datetime
<tr><td>processpara</td><td>[[ADCK processpara|processpara]]</td></tr>
+
</pre>
<tr><td>table</td><td>[[ADCK table|table]]</td></tr>
+
<tr><td>column</td><td>[[ADCK column|column]]</td></tr>
+
<tr><td>impformat</td><td>[[ADCK AD_ImpFormat|AD_ImpFormat]]</td></tr>
+
<tr><td>impformatrow</td><td>[[ADCK AD_ImpFormat|AD_ImpFormat_Row]]</td></tr>
+
<tr><td>printformat</td><td>[[ADCK AD_PrintFormat|AD_PrintFormat]]</td></tr>
+
<tr><td>printformatitem</td><td>[[ADCK AD_PrintFormat|AD_PrintFormatItem]]</td></tr>
+
<tr><td>reference</td><td>[[ADCK |]]</td></tr>
+
<tr><td>referencelist</td><td>[[ADCK |]]</td></tr>
+
<tr><td>referencetable</td><td>[[ADCK |]]</td></tr>
+
<tr><td>reportview</td><td>[[ADCK |]]</td></tr>
+
<tr><td>reportviewcol</td><td>[[ADCK |]]</td></tr>
+
<tr><td>task</td><td>[[ADCK |]]</td></tr>
+
<tr><td>form</td><td>[[ADCK |]]</td></tr>
+
<tr><td>workbench</td><td>[[ADCK |]]</td></tr>
+
<tr><td>preference</td><td>[[ADCK |]]</td></tr>
+
<tr><td>role</td><td>[[ADCK AD_Role|AD_Role]]</td></tr>
+
<tr><td>???</td><td>[[ADCK AD_User|AD_User]]</td></tr>
+
<tr><td>userrole</td><td>[[ADCK |]]</td></tr>
+
<tr><td>orgrole</td><td>[[ADCK |]]</td></tr>
+
<tr><td>windowaccess</td><td>[[ADCK |]]</td></tr>
+
<tr><td>processaccess</td><td>[[ADCK |]]</td></tr>
+
<tr><td>formaccess</td><td>[[ADCK |]]</td></tr>
+
<tr><td>workflowaccess</td><td>[[ADCK |]]</td></tr>
+
<tr><td>taskaccess</td><td>[[ADCK |]]</td></tr>
+
<tr><td>???</td><td>[[ADCK AD_Language|AD_Language]]</td></tr>
+
<tr><td>???</td><td>[[ADCK AD_Message|AD_Message]]</td></tr>
+
<tr><td>???</td><td>[[ADCK AD_PrintTableFormat|AD_PrintTableFormat]]</td></tr>
+
<tr><td>???</td><td>[[ADCK AD_Scheduler|AD_Scheduler]]</td></tr>
+
<tr><td>???</td><td>[[ADCK C_BP_Group|C_BP_Group]]</td></tr>
+
<tr><td>???</td><td>[[ADCK M_Product_Category|M_Product_Category]]</td></tr>
+
<tr><td>???</td><td>[[ADCK PA_ReportColumnSet|PA_ReportColumnSet]]</td></tr>
+
<tr><td>???</td><td>[[ADCK PA_ReportColumnSet|PA_ReportColumn]]</td></tr>
+
<tr><td>???</td><td>[[ADCK PA_Report|PA_Report]]</td></tr>
+
<tr><td>???</td><td>[[ADCK PA_ReportLineSet|PA_ReportLineSet]]</td></tr>
+
<tr><td>???</td><td>[[ADCK PA_ReportLineSet|PA_ReportLine]]</td></tr>
+
<tr><td>???</td><td>[[ADCK PA_ReportLineSet|PA_ReportSource]]</td></tr>
+
<tr><td>???</td><td>[[ADCK AD_Client|AD_Client]]</td></tr>
+
  
<tr><td>???</td><td>[[ADCK |TEMPLATE]]</td></tr>
+
==== manufacturers_info ====
</table>
+
<pre>
 +
manufacturers_id int(11)
 +
languages_id int(11)
 +
manufacturers_url varchar(255)
 +
url_clicked int(5)
 +
date_last_click datetime
 +
</pre>
  
=== CRM systems ===
+
==== languages ====
* [http://www.vtiger.com vTiger]
+
<pre>
* [http://www.freecrm.com Free CRM; provides free and paid subsription]
+
languages_id int(11)
 +
name varchar(32)
 +
code char(2)
 +
image varchar(64)
 +
directory varchar(32)
 +
sort_order int(3)
 +
</pre>
  
==== Comparison of CRM systems ====
+
== Eclipse Easy Shell plugin ==
* [http://www.pc101.com/showthread.php?t=3555 interesting post regarding different offers of CRM packages]
+
* [http://pluginbox.sourceforge.net/plugins.html Easy Shell plugin]
 +
* Settings for Linux in order to open proper terminal
 +
<pre>
 +
gnome-terminal --working-directory {1}
 +
</pre>
 +
* Seetings for windows
 +
<pre>
 +
cmd.exe /C start /D{1} cmd.exe /K "rxvt.exe -fn "Console" -vb +sb -sl 1000 -e bash -I"
 +
</pre>
  
==== Localized in Bulgarian ====
 
* [http://dl.sugarforge.org/bgcrm/bgcrm/bg_bgdocuments/README_bg_bg.txt SugarCRM]
 
  
==== Interesting news/Forum post regarding CRM systems ====
+
== Eclipse Preprocessor Plugin ==
* [http://www.sugarcrm.com/forums/showthread.php?p=81242#post81242 SOAP Performance Issue Loading Accounts] Strange advice "database to database conversion"! But for CRM system probably it is OK!
+
* [http://prebop.sourceforge.net/ Prebop Preprocessor]
* [http://www.sugarcrm.com/forums/showthread.php?p=80835#post80835 SugarCRM for blind man's (disabled people)] Very interesting requirements!
+
  
=== Tina POS ===
+
* Adempiere Preprocessor Example code-1
* [http://wiki.openbravo.com/wiki/index.php/TinaPOS_Integration TinaPOS Integration]
+
<pre>
 +
/* $if isAdempiere $
 +
  Env.setContext(Env.getCtx(), "#AD_Org_ID", AD_Org_ID);  // Adempiere
 +
$else$ */
 +
  Env.getCtx().setContext("#AD_Org_ID", AD_Org_ID);      // Compiere
 +
/* $endif$ */
 +
</pre>
  
=== Compiere ===
 
My opinion is that this is very outdated information, but who knows...
 
* [http://www.sybase.com/aseex_resources Compiere on Sybase]
 
  
=== HTML/CSS ===
+
* Adempiere Preprocessor Example code-2
* [http://alistapart.com/articles/multicolumnlists CSS Swag: Multi-Column Lists]
+
<pre>
 +
// =================
 +
/* $if isAdempiere $
 +
Env.setContext(Env.getCtx(), "#AD_User_ID", CreatedBy_ID);  // Adempiere
 +
$else$ */
 +
Env.getCtx().setContext("#AD_User_ID", CreatedBy_ID);      // Compiere
 +
/* $endif$ */
 +
}
 +
// =================
 +
/* $if isAdempiere $
 +
Env.setContext(Env.getCtx(), "#AD_Client_ID", AD_Client_ID);  // Adempiere
 +
$else$ */
 +
Env.getCtx().setContext("#AD_Client_ID", AD_Client_ID);      // Compiere
 +
/* $endif$ */
 +
    // =================
 +
    /* $if isAdempiere $
 +
Env.setContext(Env.getCtx(), "#AD_Org_ID", AD_Org_ID);  // Adempiere
 +
$else$ */
 +
Env.getCtx().setContext("#AD_Org_ID", AD_Org_ID);      // Compiere
 +
/* $endif$ */
 +
</pre>
  
 +
= OpenXava hints =
  
=== Java related ===
+
* Naming convention
* [[Dynamic Proxy]]
+
* [[Example Adempiere JPA persistance]]
+
* [http://download-east.oracle.com/docs/cd/B31017_01/web.1013/b28221/cmp30cfg016.htm Configuring Inheritance for a JPA Entity; Explanation why Teo likes DiscriminatorColumn]
+
* [http://thought-bytes.blogspot.com/2007/04/hello-world-with-standalone-java.html Hello world with standalone java persistance]
+
* [http://www.javaperformancetuning.com/resources.shtml#ProfilingToolsFree Java Performance Tuning]
+
* [http://s3browse.com/explore/static.springframework.org Amazon S3Browse site]
+
* [http://blog.interface21.com/main/2007/04/25/uploading-to-amazon-s3-using-a-custom-ant-task/ Uploading to Amazon S3 using a custom ANT task]
+
* [http://www.liquibase.org/ Database Refactoring With LiquiBase; DBMS-independent library for tracking, managing and applying database changes; Similar to DDLUtils.]
+
  
==== Java and IM ====
+
** Utility classes are in org.openxava.util package.
* [http://jymsg9.sourceforge.net/ Yahoo Instant Messenger Support for Java]
+
  
==== Autocompletion ====
+
** An utility class must be in plural and its methods have to be static.
* [http://www.orbital-computer.de/JComboBox/ Inside JComboBox: adding automatic completion]
+
* [http://sourceforge.net/tracker/index.php?func=detail&aid=1730452&group_id=176962&atid=879335 Autocompletion in Adempiere by Paul Bowden]
+
  
==== Portal, JCR, ECM, Groupware ====
+
** Example utility class: For dates called Dates.
* [http://www.theserverside.com/tt/articles/article.tss?l=eXoPlatform2 eXo Platform 2]
+
  
==== Eclipse IDE and Application build on Eclipse ====
 
* [http://wiki.eclipse.org/Using_Sourceforge_with_Mylyn Using Sourceforge.net with Mylyn]
 
  
==== Script Languages ====
+
== OpenXava User hints ==
* [http://www.beanshell.org/examples/actionhandler.html Neanshell, example how to invoke scriped ActionListener Interface]
+
* [http://www.cs.put.poznan.pl/dweiss/xml/projects/bsh-binding/index.xml?lang=en Dynamic BeanShell binding and ANT tasks]
+
* [http://www.javaworld.com/javaworld/jw-10-2003/jw-1003-beanshell.html Discover new dimensions of scripted Java]
+
  
==== Java FTP Libraries and Articles ====
+
=== Hint.1 How do to search in detail mode? ===
* [http://www.javaworld.com/javaworld/jw-04-2003/jw-0404-ftp.html Java FTP client libraries reviewed]
+
Click on 'new', fill the fields, and click on 'Search'.
* [http://www.javaworld.com/javaworld/jw-03-2006/jw-0306-ftp.html Update: Java FTP libraries benchmarked]
+
* [http://www.amoebacode.com/ftp/ amoebacode FTP Library]
+
  
===== Commercial which support FTPS (FTP Over SSL)=====
 
* [http://www.example-code.com/java/javaftp.asp Chilkat]
 
* [http://www.jscape.com/articles/secure_ftp_using_java_ssl.html Secure FTP Factory]
 
* [http://www.enterprisedt.com/products/edtftpj/overview.html edtFTPj - LGPL for standard FTP.]
 
  
==== OpenXava Q & A ====
+
== OpenXava Developer hints ==
Created an entity ticketClass with a method GenerateTickets. Implemented the calculator using an IModelCalculator class.
+
+
Want to create a button/link when ticketClass is displayed so that user click on it the method gets executed.
+
  
===== Q1. How do I set this up? =====
+
==== Hint.1 Always use different properties names ====
* A1. Have to create an action and include it in the controller of your module.
+
Let's have component Organization
In this action, you can obtain the object and call to you method, something like this:
+
 
<pre>
 
<pre>
public void execute() throws Exception {
+
<component name="Organization">
  ...
+
<entity>
  TicketClass ticketClass = (TicketClass) MapFacade.findEntity(getModelName(), getView().getKeyValues());
+
<property name="orgId" type="String" key="true" hidden="true" >
  ticketClass.generateTickets();
+
<default-value-calculator class="org.openxava.calculators.UUIDCalculator" on-create="true" />
  getView().findObject(); // This refresh the view (Q2)
+
</property>
  ...
+
<property name="orgName" type="String" size="30" required="false"/>
}
+
...
 +
</component>
 
</pre>
 
</pre>
  
===== Q2. How can I get the view of the entity refreshed after the method is executed. =====
+
and component Warehouse
* A2. See the above code
+
  
===== Q3. How can i reload other modules to reflect the changes made by an action that was performed in one module? =====
+
<pre>
An action in one module (module A) that changes the value of the data
+
<component name="Warehouse">
contained in another module (module B), when i execute an action button (in
+
<entity>
module A), it executes successfully and updates the data in the other entity
+
<property name="warehouseId" type="String" key="true" hidden="true" >
(entity B) in the database, but when i view module B, the module list view (of
+
<default-value-calculator class="org.openxava.calculators.UUIDCalculator" on-create="true" />
module B) is still showing the old data!
+
</property>
 +
<property name="warehouseName" type="String" size="30" required="false"/>
 +
...
 +
</component>
 +
</pre>
  
* A3. In a Liferay 2.1.3 with OX2.2 it works fine, that is, I modify data in a portlet, I move to another and the data
+
by this way in Application_en.properties developer can define different names for properties:
is refreshed without touch filter nor any other action.
+
<pre>
Look at your web/WEB-INF/portlet.xml, have you <expiration-cache>0</expiration-cache> for your portlets?
+
organizationId=Organization ID
Since OX2.1 expiration-cache is 0 in the portlet.xml generated by OpenXava.
+
orgName=Organization Name
Hence, if you are using OX2.1 or better you only need to execute the ant target 'redeployPortlets' in order to fix your portlet.xml file.
+
warehouseId=Warehouse ID
 +
warehouseName=Warehouse Name
 +
</pre>
  
 +
also it helps developer to understand well which exactly property he uses/modify.
 +
 +
==== Hint.2 Always create by hand DB migration scripts. ====
 +
ORM(Hibernate) tools do not create proper DB migration scripts.
 +
 +
=== OpenXava Links & Info ===
 +
* [http://openxava.wiki.sourceforge.net/ OpenXava Wiki page]
 +
* [http://sourceforge.net/projects/qamanager/ qaProjectManager] Web based application used for keeping track of engineering and customer releases, Resource allocations and related information effectively in QA Projects. Powered by openXava.
 +
 +
* Nice to have OpenXava features:
 +
** Icon in header of each column indicating that column can be sorted.
 +
** When hook over header of column to show more information for column. Information to be configured in OpenXava xml files.
 +
** Ability to align labels in forums.
 +
 +
 +
* [https://sourceforge.net/forum/message.php?msg_id=4563535 Interesting proposal regarding Actions]
  
===== Q4. How to avoid warnings that messages are not translated =====
 
* A4.
 
This messages warn you about the labels that you need to put in your i18n/YourProyectName-labels_en.properties.
 
Developer can avoid this messages putting the next line:
 
 
<pre>
 
<pre>
i18nWarnings=false
+
==========================================================================================
 +
                                                                  +----------------------+
 +
                                                          Actions:|1.- Pick              |
 +
                                                                  |2.- Edit              |
 +
                                                                  |3.- Copy              |
 +
                                                                  |4.- Delete            |
 +
                                                                  |5.- See (Detail mode) |
 +
                                                                  +----------------------+
 +
                                                                  |A.- Detail of Subjects|
 +
    +--------+-----+------------------------+----------------+  |B.- Send e-mail      |
 +
    | ACTION |  ID | Pupil                  | Comments      |  |C.- Print curriculum  |
 +
    +--------+-----+------------------------+----------------+  |D.- etc...            |
 +
    |  A    |  1  | Eduard Escrihuela      | Firt pupil    |  +----------------------+
 +
    +--------+-----+------------------------+----------------+
 +
    |  C    |  2  | Enric Selfa            | Second pupil  |
 +
    +--------+-----+------------------------+----------------+
 +
    |  ..    | ..  | ..                    | ...            |
 +
                                                                      +-----------------+
 +
                                                                      | EXECUTE ACTIONS |
 +
                                                                      +-----------------+
 +
==========================================================================================
 
</pre>
 
</pre>
in the file properties/xava.properties of your project.
 
  
===== Q5. Example TestCase =====
+
You can see to the left a grid whith the LIST mode of the PUPILS and the FIRST field is the ACTION to apply to the records. The A action (Detail of subjects of this pupil) is selected for the first pupil and the B action (Printing of his curriculum) is selected for the second pupil.
<pre>
+
public class ExampleTest extends ModuleTestBase {
+
 
   
 
   
  public DepartmentsTest(String testName) {
+
The actions possible are detailed in the combo on the TOP RIGHT of the window. Options 1 to 5 are standard (always available by default). The rest of actions are specific to the model . 
 
+
  super(testName,"ExampleManager", "ExampleModlue");
+
  }
+
 
+
  public void testCreateReadUpdateDelete() throws Exception {
+
 
+
    //Test Create
+
    execute("CRUD.new");
+
    setValue("id", "ENG");
+
    setValue("name", "Example Name");
+
    setValue("description", "Example description");
+
    assertNoErrors();
+
  }
+
}
+
</pre>
+
  
===== Q.6 How to provide a web API for accessing the OpenXava application? =====
+
Finally there is a button for executing ALL the actions at the same time.  
Just use Web Services.
+
The OpenXava applications are standard Java Web applications, therefore you can use any Java API from your OpenXava application.
+
  
In this case you can create a simple Java class, with the services of you application that you want to expose.
+
The default actions are:  
And use from it MapFacade or the model objects generated by OpenXava, or whatever code of your application you want.
+
Something like this:
+
  
 +
1.-Pick: For instance to select a Customer for a invoice. By using this action you choose your customer and return to previous model (invoice)
 +
 +
2.- Edit: To modifiy the record
 +
 +
3.- Copy: To create a new record but previously copying the information of an existing record that is very similar to the new one
 +
 +
4.- Delete: to delete the record
 +
 +
5.- See: To see the record in detail mode and READ ONLY
 +
 +
 +
= DB change/migration tracking =
 +
 +
== Liquibase ==
 +
* [http://www.liquibase.org/ http://www.liquibase.org]
 +
 +
* Articles
 +
 +
=== Liquibase Questions and Hints ===
 +
 +
==== Hint.1 How to update data? ====
 +
Is there any way to update a row that already exists in a table (besides using <sql>)?
 +
 +
Currently there is not.
 +
I have considered creating an update tag but have not yet.
 +
The main reason I did not create it originally is that it seemed to not add a lot of value over the standard <sql> update statement and created a lot of typing.
 +
 +
For example:
 
<pre>
 
<pre>
public class MyService {
+
<update table="person">
 +
<column name="username" value="newUsername">
 +
<where>username = 'oldUsername'</where>
 +
</update>
 +
</pre>
  
  public Address getCustomerAddress(String customerId) throws Exception {
+
seems like a lot of work compared to
    // Here you use the POJOs generated by OpenXava
+
 
    Customer customer = (Customer) Customer.findById(customerId);
+
<pre>
    return customer.getAddress();
+
<sql>UPDATE person SET username='newUsername' WHERE username='oldUsername'</sql>
  }
+
}
+
 
</pre>
 
</pre>
  
Now you can create a Web Service from MyService class using AXIS, or the wizard included in Eclipse WTP.
+
Now that there is support for standardizing dates, Boolean values, etc. it may be worth creating however.
But, remember, all this is a Java issue, not an OpenXava one.
+
  
===== Q7. Magic numbers =====
+
== JSR-170 Note ==
It is possible to define some magic numbers in OX?
+
The Environment Variables are not enough. I want to use the magic numbers in components.
+
* A7. Use standard techniques for Java and XML.
+
In Java you can use "public final static" variables:
+
 
<pre>
 
<pre>
public class MyMagicNumbers {
+
I am trying to get user atributes using the JSR-186 specified way.
   public final static int MY_MAGIC = 24324;
+
Here is the extract from portlet.xml:
}
+
<user-attribute>
 +
   <name>user.name.given</name>
 +
</user-attribute>
 +
<user-attribute>
 +
  <name>user.name.family</name>
 +
</user-attribute>
 +
<user-attribute>
 +
  <name>user.business-info.postal.street</name>
 +
</user-attribute>
 +
<user-attribute>
 +
  <name>user.business-info.postal.city</name>
 +
</user-attribute>
 +
<user-attribute>
 +
  <name>user.business-info.postal.country</name>
 +
</user-attribute>
 +
<user-attribute>
 +
  <name>user.business-info.postal.organization</name>
 +
</user-attribute>
 +
<user-attribute>
 +
  <name>user.business-info.telecom.telephone.number</name>
 +
</user-attribute>
 +
 
 +
Here is the code to get user attributes:
 +
 
 +
HashMap hmUserInfo = (HashMap)request.getAttribute(PortletRequest.USER_INFO);'
 +
log.debug((String)hmUserInfo.get(UserAttributes.USER_NAME_GIVEN));
 +
log.debug(((String)hmUserInfo.get(UserAttributes.USER_NAME_FAMILY));
 +
log.debug((String)hmUserInfo.get(UserAttributes.USER_BUSINESS_INFO_POSTAL_CITY));
 +
log.debug((String)hmUserInfo.get(UserAttributes.USER_BUSINESS_INFO_POSTAL_COUNTRY));
 +
log.debug((String)hmUserInfo.get(UserAttributes.USER_BUSINESS_INFO_POSTAL_ORGANIZATION));
 +
log.debug((String)hmUserInfo.get(UserAttributes.USER_BUSINESS_INFO_POSTAL_STREET));
 +
log.debug((String)hmUserInfo.get(UserAttributes.USER_BUSINESS_INFO_TELECOM_TELEPHONE_NUMBER));
 +
 
 +
Liferay return first/last names ONLY in spite of the fact that all other information is presented for this user.
 +
I entered it using Organization Admin portlet.
 
</pre>
 
</pre>
  
In XML you can use XML ENTITIES:
+
= kTable =
 +
 
 +
== Move Table Header ==
 +
* [https://sourceforge.net/forum/message.php?msg_id=4581708 sf.net post]
 +
 
 +
Create following Header Listener
 
<pre>
 
<pre>
<!ENTITY mymagic "24324">
+
public class HeaderListener implements Listener, ControlListener {
 +
 +
KTable table_ = null;
 +
 +
Point initPoint = null;
 +
 +
Tracker tracker = null;
 +
 +
public HeaderListener(KTable table) {
 +
table_ = table;
 +
}
 +
 +
public void mouseDoubleClick(MouseEvent e) { 
 +
}
 +
 +
public void mouseUp(int x , int y ) {
 +
Point p = table_.getCellForCoordinates(x, y);
 +
 +
System.out.println("Up " + p);
 +
 +
if (
 +
(p.y < table_.getModel().getFixedHeaderRowCount()) && 
 +
(p.x >= table_.getModel().getFixedHeaderColumnCount()) &&
 +
(p.x != initPoint.x) &&
 +
(p.y == initPoint.y)
 +
){
 +
 +
//if (p.y == initPoint.y) {
 +
System.out.println("Move " + initPoint + " to " + p);
 +
((SpanModel)table_.getModel()).switchColumn(p.x, initPoint.x);
 +
}
 +
initPoint = null;
 +
//tracker.close();
 +
}
 +
 +
public void mouseDown(Event e) {
 +
 +
Point p = table_.getCellForCoordinates(e.x, e.y);
 +
if (
 +
(p.y < table_.getModel().getFixedHeaderRowCount()) && 
 +
(p.x >= table_.getModel().getFixedHeaderColumnCount())
 +
)
 +
initPoint = p;
 +
 +
System.out.println("Down " + p);
 +
 
 +
}
 +
 +
public void mouseMove(Event event) { 
 +
int JITTER = 8;
 +
Display display = event.display;
 +
Shell shell = display.getActiveShell();
 +
 +
Rectangle tableLocation = display.map(table_, null, shell.getClientArea ());
 +
System.out.println("table location " + tableLocation); 
 +
 +
Point p = table_.getCellForCoordinates(event.x, event.y); 
 +
Rectangle rect = table_.getCellRect(p.x, p.y);
 +
 +
 +
int deltaX = initPoint.x - event.x, deltaY = initPoint.y - event.y;
 +
if (Math.abs (deltaX) < JITTER && Math.abs (deltaY) < JITTER) {
 +
return;
 +
}
 +
 +
tracker = new Tracker (table_, SWT.LEFT | SWT.RIGHT);
 +
 +
tracker.setRectangles (new Rectangle [] {rect});
 +
tracker.open ();
 +
//FALL THROUGH
 +
 +
Rectangle finalPosition = tracker.getRectangles()[0]; 
 +
System.out.println(finalPosition);
 +
 +
int posX = finalPosition.x + finalPosition.width / 2 ;//- tableLocation.x;
 +
int posY = finalPosition.y + finalPosition.height / 2 ;//- tableLocation.y;
 +
mouseUp (posX,posY);
 +
 +
}
 +
 +
public void handleEvent(Event event) {
 +
switch (event.type) {
 +
case SWT.MouseDown:
 +
mouseDown((event));
 +
break;
 +
case SWT.MouseMove:
 +
if (initPoint == null) return;
 +
mouseMove(event);
 +
 +
case SWT.MouseUp:
 +
break;
 +
 +
}
 +
 +
public void controlMoved(ControlEvent e) {
 +
}
 +
 +
public void controlResized(ControlEvent e) {
 +
// TODO Auto-generated method stub 
 +
}
 
</pre>
 
</pre>
  
and then use &mymagic; instead of 34324.
 
  
These techniques are not from OpenXava but from Java and XML.
 
  
In XML you can use @mymagic@, and the filter of OpenXava ant build
+
== Fork developers work in their free time! Excuse Me??? ==
changes it from a value of your properties file. This allows you
+
What Compiere defenders think.
to have a different value of @mymagic@ for each customer or configuration.
+
 
This is a technique from OpenXava.
+
Can you belive? I work for free? Please do not tell it to my wife... This is top secret.
 +
 
 +
 
 +
* [https://sourceforge.net/forum/message.php?msg_id=4468154 sf.net post] It looks that this post was deleted from Compiere forums. Compiere Inc. do not like what friends of Compiere think??? Just to prove that such post exist i posted whole post [https://sourceforge.net/forum/forum.php?thread_id=1799108&forum_id=611167 here]
 +
 
 +
''Having been in the ERP game for a very long time, I just find the bazaar a bit too risky for real life scenario and most of the clever developers involved are doing out of free time. I honestly dont even have free time to write this email, but I guess some people have more free time than others. So what people do in their free times is entirely up to them? The product is becoming massive yes, and to expect the couple of clever developers to maintain it within their "free" time would be EXTREMELY risky for any  enterprise to put reliance on. Yes it may be more clever and even more transparent and yes many more extremely clever things will be released out of it. Question  though is who is going to maintain it in their free time over the next couple of years and who actually needs to get paid to support it.''
 +
 
 +
 
 +
== Roses ==
 +
1 роза - любов от пръв поглед;
 +
2 рози - взаимна, дълбока любов;
 +
3 рози - Обичам те!;
 +
6 рози - искам да бъда твой;
 +
7 рози - аз съм заслепен от теб;
 +
9 рози - вечна любов, дълъг живот заедно;
 +
10 рози - ти си перфектна;
 +
11 рози - ти си моето съкровище, най-голямата любов в моя живот;
 +
12 рози - бъди моя постоянна приятелка;
 +
13 рози - таен обожател;
 +
15 рози - аз съм наистина съжалявам, моля те не ме забравяй;
 +
20 рози - повярвай ми, аз съм искрен с теб;
 +
21 рози - аз съм отдаден на теб;
 +
24 рози - не мога да спра да мисля за теб, мисля за теб денонощно;
 +
33 рози - голяма привързаност;
 +
36 рози - Ще помня нашите романтични моменти;
 +
40 рози - Моята любов е истинска;
 +
50 рози - любов изпълнена със съжаление;
 +
99 рози - Ще те обичам до деня на смъртта;
 +
100 рози - хармонична любов, останала запазена до дълбока старост;
 +
101 рози - Ти си единствена за мен;
 +
108 рози - Ще се омъжиш ли за мен?;
 +
365 рози - не мога да спра да мисля за теб, всеки ден мисля за теб;
 +
999 рози - вечна любов;
 +
 
 +
= Site Meter =
 +
<!-- Site Meter http://sm9.sitemeter.com/meter.asp?site=sm9trifon&i=t.gif -->
 +
*[http://sm9.sitemeter.com/stats.asp?site=sm9trifon Site Meter]
 +
<!-- Copyright (c)2006 Site Meter -->
 +
 
 +
* [http://www.alexa.com/data/details/traffic_details/adempiere.com www.alexa.com]www.adempiere.com
 +
 
 +
* [http://www.statcounter.com www.statcounter.com]
 +
 
 +
 
 +
[[Category:Community]]
 +
[[Category:HowTo]]

Latest revision as of 00:59, 27 September 2011

My Pages
Name This user real name is : Trifon Nikolaev Trifonov
Sourceforge logo.png This user has a Sourceforge account.
Wikipedia logo.png This user has a Wikipedia account.


Facebook_logo This user has a Facebook account.
Blogspot_logo This user has blogs.
Twitter Logo Follow him on twitter


Contents

About Me (Yes, i'm one of the founders of ADempiere... so crazy indeed )

  • High School of Economics and Computer Science. It helped me to understand accounting and economics.
  • Bachelor degree in Mathematics. Helped me to like mathematics and especially cryptography. Attended many courses in programming, which helped me to became good developer.
  • SUN Certified Programmer 1.4. Maybe should try to pass other Certifications programs... But no time last years.

I started my first company in 2006 year providing ADempiere/Compiere consultancy, training and development services. I like developing business systems and traveling.


Some nice words about me on the net :)

My Blogs

Trifon's Paid Services

ADempiere Technical Support

This support consists of answering questions and providing advices. Unlimited number of questions. Technical support is available monthly or in chunks of 6 and 12 months from the Adempiere developer, Trifon Trifonov. For the duration, you can ask Trifon direct questions via a special support mailing address. Contact is email-only and replies are sent within one business day, often within hours.

Prices:

1 month ADempiere tech support  :  500 USD (No VAT included)
6 months ADempiere tech support : 2700 USD - 10% discount (No VAT included)
12 months ADempiere tech support: 4800 USD - 20% discount (No VAT included)

Contract based ADempiere Support

  • Please call for the price.
  • Included 5 support hours per month. Hours above that are at 40 euro per hour.
  • Up to 10 registered ADempiere users.
  • One contact person from the side of the customer.
  • Communication channels: Phone, Email, Skype, Ticketing system.
  • Free bugfixes.
  • Free migration to next version of ADempiere.
  • Free installation of ADempiere on customer server.
  • Free integration with osCommerce.
  • Free integration with Google Documents. User can import data from Google Docs and Spreadsheets.
  • Free integration with Google Calendar. All events created in Adempiere calendar are exported to Google Calendar.
  • Optional - Dedicated Server
    • 130 EURO per month. (No VAT included)
    • 650 EURO server setup fee.
    • 4 GB RAM.
    • 2 x 250 GB HDD. Hardware-RAID 1.
    • Traffic 5 000 GB.

ADempiere customized with client's own brand

  • Please call for the price.
  • Client must send two images.
  • Services created for small and mid-sized implementation companies which do not have own java developers and find modifying of source code impossible task.
  • Adempiere Images

ADempiere Virtual Appliance

  • Fully setup and ready to use Adempiere!
  • Standard users: Garden Admin and Garden Users can send emails!
  • VMWare with Linux - Fedora Core - 5/7
  • Adempiere
  • Sun JDK
  • Database - Oracle or Postgres
  • Jakarta James email server
  • Price 45 EURO (No VAT included)

On demand Adempiere build

  • Please call for the price.
  • Build of Adempiere upon user request.
  • 10% will be donated to Adempiere.
  • Build can include additional functionality like Fixed Asset or other not included in trunk.

Adempiere DVD by Trifon

  • Price is: 30 EURO + shipping cost to your place or only 30 EUR and download from FTP Server.
  • DVD with complete Adempiere sources, Eclipse IDE and Sun JDK.
  • Available version for Linux and Windows.
  • Jakarta James email server.
  • Please contact me if you would like to have it.

Developer need to copy one directory to his local hard drive and can start customizing Adempiere.

  • 3 EURO per minute.



  • Ether Another pay per call service

  • 1500 EUR per week + ticket + hotel (No VAT included)
  • Training plan customized to fit client needs.
  • Example training plan:
01) General overview of ADempiere ERP-CRM system.
02) Introduction to user interface.
03) How to setup new Company in ADempiere.
04) How to setup new Organization in ADempiere.
05) How to create and import Chart of Accounts. Introduction to ADempiere Chart of Accounts Editor.
06) How to create new Product, Product Category and set Product Price and Price List.
07) How to create hierarchical Categories of Services and Products (categories, subcategories, etc)
08) How to import Products from external sources/systems.
09) How to create Discount Schema and Price List and apply specific discount/overcharge for specific Product Group/Product, e.t.c. How to create Discount based on a percent or fixed amount.
10) How to create new Business Partner(Client, Vendor and Employee).
11) How set credit limit for Business Partners. Apply a credit limit to a client and ADempiere lock sales when limit is reached.
12) How to assign discount to specific Business Partner, and change it in every sell.
13) How to import Business Partners from external sources/systems.
14) How to create Purchase Order.
15) How to track purchases: list purchases that are not received, due dates.
15) How to create Material Receipt.
16) How to create Invoice (Vendor)
17) How to enter Landed Costs.
18) How to create Sales Order.
19) How to create Shipment (Customer).
20) How to create Shipment Confirmation.
21) How to create Invoice (Customer).
22) how to enter RMA.
23) How to create Payment.
24) How to match Purchase Order - Material Receipt - Invoice (Vendor).
25) How to match Sales Order - Shipment - Invoice (Customer).
26) How to create Cash Payment and Cash Receipt.
27) How to create Bank Account and Bank transaction.
28) How to modify Print Format of documents.
29) How to setup emails of ADempiere users and send emails with attached document(Purchase Order, Invoice, e.t.c) to clients.
30) How to create Users and assign User permissions.
31) How to setup Window, Tab and Field permissions for specific Roles and Users.
32) How to share data between Organizations and users.
33) How to setup records to be readable only by their creators.
34) How to setup taxes.

  • 400 EUR + ticket + hotel (No VAT included)
  • Training plan customized to fit client needs.
  • Example training plan:
+01) Introduction to ADempiere user interface.
+02) How to setup new Company in ADempiere.
+03) How to setup new Organization in ADempiere.
+04) How to create new Product, Product Category and set Product Price and Price List.
+05) How to create hierarchical Categories of Services and Products (categories, subcategories, etc)
+06) How to create Discount Schema and Price List and apply specific discount/overcharge for specific Product Group/Product, e.t.c. How to create Discount based on a percent or fixed amount.
+07) How to create new Business Partner(Client, Vendor and Employee).
+08) How to assign discount to specific Business Partner, and change it in every sell.
+09) How to create Purchase Order.
+10) How to track purchases: list purchases that are not received, due dates.
+11) How to create Material Receipt.
+12) How to create Invoice (Vendor)
+13) How to create Sales Order.
+14) How to create Shipment (Customer).
+15) How to create Invoice (Customer).
+16) How to create Payment.
+17) How to match Purchase Order - Material Receipt - Invoice (Vendor).
+18) How to match Sales Order - Shipment - Invoice (Customer).
+19) How to create Cash Payment and Cash Receipt.
+20) How to create Bank Account and Bank transaction.
+21) How to create Users and assign User permissions. (Needed in order to be able to experiment afterwards)

  • 1500 EUR per week + ticket + hotel (No VAT included)
  • Training plan customized to fit client needs.
  • Example training plan:
01) Overview of Adempiere setup in Eclipse.
02) Layers in adempiere and where clases are located in the source tree?
2.1) Model (Domain) layer.
2.2) Business logic layer.
2.3) GUI - Swing layer.
2.4) GUI - Web layer.
03) How to add new table and columns in Adempiere?
04) How to generate Adempiere model classes for the newly created table?
05) How to add validation, pre-pressing and post-processing logic for the new table?
    (beforeSave, afterSave, beforeDelete afterDelete)
    ModelValidator
06) How to add new Window, Tab and Fields?
06.1) How to add new Tab which has Tree?
06.2) How to add Translation Tab?
07) How to add GUI callout?
08) How to define new Document in Adempiere?
09) How to add business logic for the newly created document?
10) How to add Process in Adempiere?
11) How to add java code for the newly defined process?

  • 300 EURO / day (No VAT included)
  • Please call for discount if you plan to book more than 150 hours

  • If you need training or support for EDI in Adempiere, please do not hesitate to contact me.
  • Prices start from 30 EUR per hour.

  • Leading Open Source Enterprise Portal
  • JSR-168 compliant
  • Business Friendly Open Source License: MIT License


  • Suitable for:
    • Small applications which need to be developed from scratch
    • Development of applications which must be part of a Web Portal.
    • Applications based on OpenXava can run on any DB which is supported by Hibernate.
    • Licensed under LGPL. You can develop commercial application using OpenXava.
    • Applications based on OpenXava can run on any application server (Tomcat, JBoss, WebSphere, etc).
    • Applications based on Openxava have easy integration of reports made with JasperReports.

Trifon's contributions to OpenXava

  • Please contact me for quotation.

  • Development of java applications.
  • Please contact me for quotation.


ADempiere

Performance tests & results made by me

This are slower than on my laptop. On laptop result was around 17 products / second.

Processors..........: 2 x Pentium2 800MHz
RAM.................: 2 GB
OS..................: Linux, Fedora Core 5
DB..................: Oracle XE
JDK.................: Sun JDK 1.5.0_11
Adempiere version...: 3.3.0
Note................: Adempiere client on the same machine as DB.

Tables where records are inserted: 
AD_TREENODEPR     1095095
M_PRODUCT         1095095
M_PRODUCT_ACCT    1095095
M_PRODUCT_TRL     1095095

Performance table

Start Time      = Thu Aug 09 04:57:01 EEST 2007
End Time        = Thu Aug 09 05:13:54 EEST 2007
Duration(ms)    = 1012585
Duration(sec.)  = 1012
Duration(min.)  = 16
Products        = 5000
Time(seconds)   = 1012
Produsts/Second = 4.9407115

Start Time      = Thu Aug 09 05:17:04 EEST 2007
End Time        = Thu Aug 09 09:14:23 EEST 2007
Duration(ms)    = 14239657
Duration(sec.)  = 14239
Duration(min.)  = 237
Products        = 144000
Time(seconds)   = 14239
Produsts/Second = 10.11307 


Start Time       = Fri Aug 10 03:43:13 EEST 2007
End Time         = Fri Aug 10 07:42:25 EEST 2007
Duration(ms)     = 14351454
Duration(sec.)   = 14351
Duration(min.)   = 239
Duration(hours.) = 3
Products         = 144000
Time(seconds)    = 239
Produsts/Second  = 10.03
 
Start Time       = Fri Aug 10 13:00:23 EEST 2007
End Time         = Fri Aug 10 16:58:42 EEST 2007
Duration(ms)     = 14298664
Duration(sec.)   = 14298
Duration(min.)   = 238
Duration(hours.) = 3
Products         = 144000
Time(seconds)    = 14298
Produsts/Second  = 10.071339

Start Time       = Fri Aug 10 19:59:38 EEST 2007
End Time         = Sat Aug 11 03:59:55 EEST 2007
Duration(ms)     = 28817002
Duration(sec.)   = 28817
Duration(min.)   = 480
Duration(hours.) = 8
Products         = 288000
Time(seconds)    = 28817
Produsts/Second  = 9.994101

Start Time       = Sat Aug 11 17:53:38 EEST 2007
End Time         = Sun Aug 12 02:18:17 EEST 2007
Duration(ms)     = 30278812
Duration(sec.)   = 30278
Duration(min.)   = 504
Duration(hours.) = 8
Products         = 288000
Time(seconds)    = 30278
Produsts/Second  = 9.511857

Issues found

  • Posterita WP POS expect that TAX Category has only one Tax Rate assigned to it.
  • Posterita create AR Invoice while POS Order type in Adempiere creates Invoice Indirect. This allows to distinguish Invoices creates by POS. Of course Business partner also can allow sot distinguish POS invoices, but more consitent behavior is to create Invoice Indirect.

Comparison of Posterita Web UI and Robert Klein Ajax Web UI

  • Robert Klein Ajax is more usable than Posterita WebUI
    • Attachment works in Robert Klein but not in Posterita.
    • Grid of Posterita is mess up.
    • Scrolling and navigation are mess up in Posterita.
    • Decimal point of numeric has many zeros in Posterita.
    • Robert Klein Web UI runs fast than Posterita.


Notes about installation

  • One Business partner must have column AD_OrgBP_ID set to Organization which is set in POS Terminal.
SELECT C_BPartner_ID FROM C_BPartner WHERE AD_OrgBP_ID=
  • Execution of migration scripts.
@"1.0-1.5 (AD331b)\oracle\001_ad_changes.sql"
@"1.0-1.5 (AD331b)\oracle\002_ad_message.sql"
@"1.0-1.5 (AD331b)\oracle\003_m_pricelist.sql"

@"1.6(AD340)\oracle\001_ad_Changes for C_Currency.sql"
@"1.6(AD340)\oracle\002_ad_message.sql"
@"1.6(AD340)\oracle\003_C_Currency.sql"

@"1.7.0\oracle\001_MixedPayment.sql"
@"1.7.0\oracle\002_Terminals_newTableStructure.sql"
@"1.7.0\oracle\003_Terminals_TransferConfiguration.sql"
@"1.7.0\oracle\004_Terminals_newTableDDL.sql"
@"1.7.0\oracle\005_Messages.sql"

@"1.7.1\oracle\001_M_Inventory.sql"

@"1.7.2\oracle\001_ADRole.sql"

@"trunk\oracle\002_ADMessage.sql"
@"trunk\oracle\003_AD_OrgInfo.sql"
@"trunk\oracle\004_AD_Changes for AD_OrgInfo.sql"
@"trunk\oracle\005_MissingIDs.sql"
@"trunk\oracle\006_PackSize_MProduct.sql"
@"trunk\oracle\007_CashPayment.sql"


  • Values of web.xml
	<context-param>
		<param-name>#AD_Client_ID</param-name>
		<param-value>11</param-value>
	</context-param>
	<context-param>
		<param-name>#AD_Language</param-name>
		<param-value>en_US</param-value>
	</context-param>
	<context-param>
		<param-name>#AD_Org_ID</param-name>
		<param-value>11</param-value>
	</context-param>
	<context-param>
		<param-name>#AD_User_ID</param-name>
		<param-value>102</param-value> <!-- GardenUSer -->
	</context-param>
	<context-param>
		<param-name>#C_BankAccount_ID</param-name>
		<param-value>100</param-value>
	</context-param>
	<context-param>
		<param-name>#SalesRep_ID</param-name>
		<param-value>102</param-value>
	</context-param>
	<context-param>
		<param-name>#AD_Role_ID</param-name>
		<param-value>103</param-value> <!-- Garden User -->
	</context-param>
	<context-param>
		<param-name>#W_Store_ID</param-name>
		<param-value>11</param-value>
	</context-param>
	<context-param>
		<param-name>REPORT_DIRECTORY</param-name>
		<param-value>/config/reports/</param-value>
	</context-param>
  • How to setup?

Explained by Colin in irc:

-01) Login as System Admin and add new window for the table "U_POSTerminal".
-02) Use the "Create Fields" button on the "Tab" tab to add all the fields of this table.
-03) Go to System Admin->Gerenral Rules->System Rules->Menu window and create a new menu item.
-04) Select Window as the Action and point it to the new window you just created (by selecting it in the window dropdown).
-05) Log out and log back in as Garden Admin.
-06) Using you new window create a new POS terminal. Chose what ever you wish for the settings.
-07) Go to Quote-to-Invoice->Sales Orders->Web POS->
-08) Go to the role menu here and create a new record with "Web Menu"=smenu.cash.sales and "Role" = "GardenWorld Admin".
     Uou can add more if you wish but I think this is all that's needed for basic sales.
  • Printing

Edit java.policy in

C:\Program Files\Java\jdk1.6.0_10\jre\lib\security

Add the code below

grant codeBase "http://192.168.0.100" {
       permission java.util.PropertyPermission "org.jpedal.rejectsuperimposedimages", "read, write";
       permission java.util.PropertyPermission "file.separator", "read, write";
OR
       permission java.security.AllPermission;
};

Seats/tables in a restaurant (or plane or cinema)

In my opinion the seat/table numbering problematic could be solved with the help of the entities AccommodationClass, AccommodationMap described in the book vol2. I will give you a short description of these entities and example of the "numbering issue" solution.

AccommodationClass - description: It is designed to store classes information (these could be plane, bus classes, table types, chair types, room types etc)

AccommodationClass - definition (based on the book but modified a little) fields: accClassId, parentAccClassId, description


AccommodationMap - description: Its idea is to provide information of the number of spaces offered by a fa/accClass. Here we can extend it to provide overbooking information and seat numbering information(the last two fields in the definition below) fields: mapId, accClassId, faId, nrOfSpaces, overBooked, number

Example: Define two tables.

- Table number 5 has 3 chairs. Chair with number 1 is baby_chair. The other two chairs with number 2 and 3 are high_chairs.
- Table number 9 has 2 chairs. Chairs number 1 and 2 are normal_chairs.

In FixedAsset relate the tables to the chairs.

FixedAsset:fixedAssetId=table1,  parentFixedAssetId=NULL
FixedAsset:fixedAssetId=table2,  parentFixedAssetId=NULL
FixedAsset:fixedAssetId=chair11, parentFixedAssetId=table1 //chair11 belongs to table1
FixedAsset:fixedAssetId=chair12, parentFixedAssetId=table1 //chair12 belongs to table1
FixedAsset:fixedAssetId=chair13, parentFixedAssetId=table1 //chair13 belongs to table1
FixedAsset:fixedAssetId=chair14, parentFixedAssetId=table2 //chair14 belongs to table2
FixedAsset:fixedAssetId=chair15, parentFixedAssetId=table2 //chair15 belongs to table2

In Accommodationclass define the table/chair classes.

AccommodationClass: accClassId=tables,        parentAccClassId=NULL
AccommodationClass: accClassId=chairs,        parentAccClassId=NULL
AccommodationClass: accClassId=plane_classes, parentAccClassId=NULL
AccommodationClass: accClassId=baby_chair,    parentAccClassId=chairs;
AccommodationClass: accClassId=high_chair,    parentAccClassId=chairs;
AccommodationClass: accClassId=normal_chair,  parentAccClassId=chairs;


In AccommodationMap define how many places each table or chair has and which is its number.

AccommodationMap: accClassId=tables,        fixedAssetId=table1,  nrOfSpaces=3, number=5 //table number 5 has 3 chairs(faId=table1)
AccommodationMap: accClassId=baby_chair,    fixedAssetId=chair11, nrOfSpaces=1, number=1 //chair number 1 has one place(faId=chair11)
AccommodationMap: accClassId=high_chair,    fixedAssetId=chair12, nrOfSpaces=1, number=2 //chair number 2 has one place(faId=chair12)
AccommodationMap: accClassId=high_chair,    fixedAssetId=chair13, nrOfSpaces=1, number=3 //chair number 3 has one place(faId=chair13)
AccommodationMap: accClassId=tables,        fixedAssetId=table2,  nrOfSpaces=2, number=9 //table number 9 has two places(faId=table2)
AccommodationMap: accClassId=normal_chair,  fixedAssetId=chair14, nrOfSpaces=1, number=1 //chair number 1 has one place(faId=chair14)
AccommodationMap: accClassId=normal_chair,  fixedAssetId=chair15, nrOfSpaces=1, number=2 //chair number 2 has one place(faId=chair15)

In similar fashion you can define theaters, planes etc. Also overbooking data could be kept in the AccommodationMap entity which could be used for hotel reservations. Hourly reservations could be enabled as well with the introduction of the AccommodationSpot entity.


How to import product from csv file?

MySQL script commands to import a simple CSV spreadsheet of products and a collection of image files.

CSV file MUST have these columns:

REFERENCE*, NAME*, PRICEBUY, PRICESELL, BARCODE*, CATEGORY

The columns with a * must have different values for every product, otherwise the script will fail. The category IDs in the CSV file also have to match the IDs in the 'categories' database table.

LOAD DATA
 INFILE 'C:\\temp\\products.csv'
 INTO TABLE products
 FIELDS TERMINATED BY ','
 LINES TERMINATED BY '\r\n'
 (REFERENCE, NAME, PRICEBUY, PRICESELL, CODE, CATEGORY)
 SET ID = UUID(), TAXCAT = '001', ISCOM = 0, ISSCALE = 0;
  1. the images are loaded by searching a directory for files that have the same names as the products
SET @IMAGE_DIR = 'C:\\temp\\products\\images\\';
UPDATE products
 SET IMAGE = IFNULL(LOAD_FILE(CONCAT(@IMAGE_DIR, products.NAME, '.jpg')),
             IFNULL(LOAD_FILE(CONCAT(@IMAGE_DIR, products.NAME, '.png')),
                    LOAD_FILE(CONCAT(@IMAGE_DIR, products.NAME, '.gif'))))
 WHERE IMAGE IS NULL;
  1. to make the products appear in the catalog, their ids must be added to this table
INSERT INTO products_cat (PRODUCT)
 SELECT products.ID FROM products;


OsCommerce db settings

/var/www/html/admin/includes/configure.php

Schemas in MySQL DB where OsCommerce is installed

information_schema
mysql
oscomm
test

osCommerce Tables

products

products_id			int(11)
products_quantity		int(4)
products_model			varchar(12)
products_image			varchar(64)
products_price			decimal(15,4)
products_date_added		datetime
products_last_modified		datetime
products_date_available		datetime
products_weight			decimal(5,3)
products_status			tinyint(1)
products_tax_class_id		int(11)
manufacturers_id		int(11)
products_ordered		int(11)
products_quanityt_discount	varchar(255)
products_weight_package		varchar(255)
products_status_hide		tinyint(1)

products_description

products_id			int(11)
language_id			int(11)
products_name			varchar(128)
products_description		text
products_description_short	text
products_url			varchar(255)
products_viewed			int(5)
products_status_translation	tinyint(1)
products_meta_title		varchar(255)
products_meta_keywords		text
products_meta_description	text

tax_class

tax_class_id			int(11)
tax_class_title			varchar(32)
tax_class_description		varchar(255)
last_modified			datetime
date_added			datetime

manufacturers

manufacturers_id		int(11)
manufacturers_name		varchar(32)
manufacturers_image		varchar(64)
date_added			datetime
last_modified			datetime

manufacturers_info

manufacturers_id		int(11)
languages_id			int(11)
manufacturers_url		varchar(255)
url_clicked			int(5)
date_last_click			datetime

languages

languages_id	int(11)
name			varchar(32)
code			char(2)
image			varchar(64)
directory		varchar(32)
sort_order		int(3)

Eclipse Easy Shell plugin

gnome-terminal --working-directory {1}
  • Seetings for windows
cmd.exe /C start /D{1} cmd.exe /K "rxvt.exe -fn "Console" -vb +sb -sl 1000 -e bash -I"


Eclipse Preprocessor Plugin

  • Adempiere Preprocessor Example code-1
/* $if isAdempiere $
  Env.setContext(Env.getCtx(), "#AD_Org_ID", AD_Org_ID);  // Adempiere
$else$ */
  Env.getCtx().setContext("#AD_Org_ID", AD_Org_ID);       // Compiere
/* $endif$ */


  • Adempiere Preprocessor Example code-2
			// =================
			/* $if isAdempiere $
			Env.setContext(Env.getCtx(), "#AD_User_ID", CreatedBy_ID);  // Adempiere
			$else$ */
			Env.getCtx().setContext("#AD_User_ID", CreatedBy_ID);       // Compiere
			/* $endif$ */
		}
		// =================
		/* $if isAdempiere $
		Env.setContext(Env.getCtx(), "#AD_Client_ID", AD_Client_ID);  // Adempiere
		$else$ */
		Env.getCtx().setContext("#AD_Client_ID", AD_Client_ID);       // Compiere
		/* $endif$ */
	    // =================
	    /* $if isAdempiere $
		Env.setContext(Env.getCtx(), "#AD_Org_ID", AD_Org_ID);  // Adempiere
		$else$ */
		Env.getCtx().setContext("#AD_Org_ID", AD_Org_ID);       // Compiere
		/* $endif$ */

OpenXava hints

  • Naming convention
    • Utility classes are in org.openxava.util package.
    • An utility class must be in plural and its methods have to be static.
    • Example utility class: For dates called Dates.


OpenXava User hints

Hint.1 How do to search in detail mode?

Click on 'new', fill the fields, and click on 'Search'.


OpenXava Developer hints

Hint.1 Always use different properties names

Let's have component Organization

<component name="Organization">
	<entity>
		<property name="orgId" type="String" key="true" hidden="true" >
			<default-value-calculator class="org.openxava.calculators.UUIDCalculator" on-create="true" />
		</property>
		<property name="orgName" type="String" size="30" required="false"/>
...
</component>

and component Warehouse

<component name="Warehouse">
	<entity>
		<property name="warehouseId" type="String" key="true" hidden="true" >
			<default-value-calculator class="org.openxava.calculators.UUIDCalculator" on-create="true" />
		</property>
		<property name="warehouseName" type="String" size="30" required="false"/>
...
</component>

by this way in Application_en.properties developer can define different names for properties:

organizationId=Organization ID
orgName=Organization Name
warehouseId=Warehouse ID
warehouseName=Warehouse Name

also it helps developer to understand well which exactly property he uses/modify.

Hint.2 Always create by hand DB migration scripts.

ORM(Hibernate) tools do not create proper DB migration scripts.

OpenXava Links & Info

  • OpenXava Wiki page
  • qaProjectManager Web based application used for keeping track of engineering and customer releases, Resource allocations and related information effectively in QA Projects. Powered by openXava.
  • Nice to have OpenXava features:
    • Icon in header of each column indicating that column can be sorted.
    • When hook over header of column to show more information for column. Information to be configured in OpenXava xml files.
    • Ability to align labels in forums.


==========================================================================================
                                                                  +----------------------+
                                                          Actions:|1.- Pick              |
                                                                  |2.- Edit              |
                                                                  |3.- Copy              |
                                                                  |4.- Delete            |
                                                                  |5.- See (Detail mode) |
                                                                  +----------------------+
                                                                  |A.- Detail of Subjects|
     +--------+-----+------------------------+----------------+   |B.- Send e-mail       |
     | ACTION |  ID | Pupil                  | Comments       |   |C.- Print curriculum  |
     +--------+-----+------------------------+----------------+   |D.- etc...            |
     |   A    |  1  | Eduard Escrihuela      | Firt pupil     |   +----------------------+
     +--------+-----+------------------------+----------------+
     |   C    |  2  | Enric Selfa            | Second pupil   |
     +--------+-----+------------------------+----------------+
     |  ..    | ..  | ..                     | ...            |
                                                                       +-----------------+
                                                                       | EXECUTE ACTIONS |
                                                                       +-----------------+
==========================================================================================

You can see to the left a grid whith the LIST mode of the PUPILS and the FIRST field is the ACTION to apply to the records. The A action (Detail of subjects of this pupil) is selected for the first pupil and the B action (Printing of his curriculum) is selected for the second pupil.

The actions possible are detailed in the combo on the TOP RIGHT of the window. Options 1 to 5 are standard (always available by default). The rest of actions are specific to the model .

Finally there is a button for executing ALL the actions at the same time.

The default actions are:

1.-Pick: For instance to select a Customer for a invoice. By using this action you choose your customer and return to previous model (invoice)

2.- Edit: To modifiy the record

3.- Copy: To create a new record but previously copying the information of an existing record that is very similar to the new one

4.- Delete: to delete the record

5.- See: To see the record in detail mode and READ ONLY


DB change/migration tracking

Liquibase

  • Articles

Liquibase Questions and Hints

Hint.1 How to update data?

Is there any way to update a row that already exists in a table (besides using <sql>)?

Currently there is not. I have considered creating an update tag but have not yet. The main reason I did not create it originally is that it seemed to not add a lot of value over the standard <sql> update statement and created a lot of typing.

For example:

<update table="person">
	<column name="username" value="newUsername">
	<where>username = 'oldUsername'</where>
</update>

seems like a lot of work compared to

<sql>UPDATE person SET username='newUsername' WHERE username='oldUsername'</sql>

Now that there is support for standardizing dates, Boolean values, etc. it may be worth creating however.

JSR-170 Note

I am trying to get user atributes using the JSR-186 specified way.
Here is the extract from portlet.xml:
<user-attribute>
  <name>user.name.given</name>
</user-attribute>
<user-attribute>
  <name>user.name.family</name>
</user-attribute>
<user-attribute>
  <name>user.business-info.postal.street</name>
</user-attribute>
<user-attribute>
  <name>user.business-info.postal.city</name>
</user-attribute>
<user-attribute>
  <name>user.business-info.postal.country</name>
</user-attribute>
<user-attribute>
  <name>user.business-info.postal.organization</name>
</user-attribute>
<user-attribute>
  <name>user.business-info.telecom.telephone.number</name>
</user-attribute>

Here is the code to get user attributes:

HashMap hmUserInfo = (HashMap)request.getAttribute(PortletRequest.USER_INFO);'
log.debug((String)hmUserInfo.get(UserAttributes.USER_NAME_GIVEN));
log.debug(((String)hmUserInfo.get(UserAttributes.USER_NAME_FAMILY));
log.debug((String)hmUserInfo.get(UserAttributes.USER_BUSINESS_INFO_POSTAL_CITY));
log.debug((String)hmUserInfo.get(UserAttributes.USER_BUSINESS_INFO_POSTAL_COUNTRY));
log.debug((String)hmUserInfo.get(UserAttributes.USER_BUSINESS_INFO_POSTAL_ORGANIZATION));
log.debug((String)hmUserInfo.get(UserAttributes.USER_BUSINESS_INFO_POSTAL_STREET));
log.debug((String)hmUserInfo.get(UserAttributes.USER_BUSINESS_INFO_TELECOM_TELEPHONE_NUMBER));

Liferay return first/last names ONLY in spite of the fact that all other information is presented for this user.
I entered it using Organization Admin portlet.

kTable

Move Table Header

Create following Header Listener

public class HeaderListener implements Listener, ControlListener { 
 
KTable table_ = null; 
 
Point initPoint = null; 
 
Tracker tracker = null; 
 
public HeaderListener(KTable table) { 
table_ = table; 
} 
 
public void mouseDoubleClick(MouseEvent e) {  
} 
 
public void mouseUp(int x , int y ) { 
Point p = table_.getCellForCoordinates(x, y); 
 
System.out.println("Up " + p); 
 
if ( 
(p.y < table_.getModel().getFixedHeaderRowCount()) &&  
(p.x >= table_.getModel().getFixedHeaderColumnCount()) && 
(p.x != initPoint.x) && 
(p.y == initPoint.y) 
){ 
 
//if (p.y == initPoint.y) { 
System.out.println("Move " + initPoint + " to " + p); 
((SpanModel)table_.getModel()).switchColumn(p.x, initPoint.x); 
} 
initPoint = null; 
//tracker.close(); 
} 
 
public void mouseDown(Event e) { 
 
Point p = table_.getCellForCoordinates(e.x, e.y); 
if ( 
(p.y < table_.getModel().getFixedHeaderRowCount()) &&  
(p.x >= table_.getModel().getFixedHeaderColumnCount()) 
) 
initPoint = p; 
 
System.out.println("Down " + p); 

} 
 
public void mouseMove(Event event) {  
int JITTER = 8; 
Display display = event.display; 
Shell shell = display.getActiveShell(); 
 
Rectangle tableLocation = display.map(table_, null, shell.getClientArea ()); 
System.out.println("table location " + tableLocation);  
 
Point p = table_.getCellForCoordinates(event.x, event.y);  
Rectangle rect = table_.getCellRect(p.x, p.y); 
 
 
int deltaX = initPoint.x - event.x, deltaY = initPoint.y - event.y; 
if (Math.abs (deltaX) < JITTER && Math.abs (deltaY) < JITTER) { 
return; 
} 
 
tracker = new Tracker (table_, SWT.LEFT | SWT.RIGHT); 
 
tracker.setRectangles (new Rectangle [] {rect}); 
tracker.open (); 
//FALL THROUGH 
 
Rectangle finalPosition = tracker.getRectangles()[0];  
System.out.println(finalPosition); 
 
int posX = finalPosition.x + finalPosition.width / 2 ;//- tableLocation.x; 
int posY = finalPosition.y + finalPosition.height / 2 ;//- tableLocation.y; 
mouseUp (posX,posY); 
 
} 
 
public void handleEvent(Event event) { 
switch (event.type) { 
case SWT.MouseDown: 
mouseDown((event)); 
break; 
case SWT.MouseMove: 
if (initPoint == null) return; 
mouseMove(event); 
 
case SWT.MouseUp: 
break; 
}  
} 
 
public void controlMoved(ControlEvent e) { 
} 
 
public void controlResized(ControlEvent e) { 
// TODO Auto-generated method stub  
} 


Fork developers work in their free time! Excuse Me???

What Compiere defenders think.

Can you belive? I work for free? Please do not tell it to my wife... This is top secret.


  • sf.net post It looks that this post was deleted from Compiere forums. Compiere Inc. do not like what friends of Compiere think??? Just to prove that such post exist i posted whole post here

Having been in the ERP game for a very long time, I just find the bazaar a bit too risky for real life scenario and most of the clever developers involved are doing out of free time. I honestly dont even have free time to write this email, but I guess some people have more free time than others. So what people do in their free times is entirely up to them? The product is becoming massive yes, and to expect the couple of clever developers to maintain it within their "free" time would be EXTREMELY risky for any enterprise to put reliance on. Yes it may be more clever and even more transparent and yes many more extremely clever things will be released out of it. Question though is who is going to maintain it in their free time over the next couple of years and who actually needs to get paid to support it.


Roses

1 роза - любов от пръв поглед; 2 рози - взаимна, дълбока любов; 3 рози - Обичам те!; 6 рози - искам да бъда твой; 7 рози - аз съм заслепен от теб; 9 рози - вечна любов, дълъг живот заедно; 10 рози - ти си перфектна; 11 рози - ти си моето съкровище, най-голямата любов в моя живот; 12 рози - бъди моя постоянна приятелка; 13 рози - таен обожател; 15 рози - аз съм наистина съжалявам, моля те не ме забравяй; 20 рози - повярвай ми, аз съм искрен с теб; 21 рози - аз съм отдаден на теб; 24 рози - не мога да спра да мисля за теб, мисля за теб денонощно; 33 рози - голяма привързаност; 36 рози - Ще помня нашите романтични моменти; 40 рози - Моята любов е истинска; 50 рози - любов изпълнена със съжаление; 99 рози - Ще те обичам до деня на смъртта; 100 рози - хармонична любов, останала запазена до дълбока старост; 101 рози - Ти си единствена за мен; 108 рози - Ще се омъжиш ли за мен?; 365 рози - не мога да спра да мисля за теб, всеки ден мисля за теб; 999 рози - вечна любов;

Site Meter