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 (Q.24 How to display only label in view?)
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}}
{{Userboxbottom}}
 
  
 +
{{User Facebook|http://www.facebook.com/trifonnt}}
 +
{{User Blogspot|http://trifonnt.blogspot.com}}
 +
{{User Twitter|http://www.twitter.com/trifonnt}}
  
 +
{{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 company 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 time to time, but also makes me very happy when i see system working.
+
I like developing business systems and traveling.
  
* I'm SUN Certified Programmer 1.4.
 
* Graduated High School of Economics and Computer Science
 
* Bachelor degree in Mathematics
 
  
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.
+
== 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 ==
 
== My Blogs ==
 
* [http://trifonnt.blogspot.com/ My blog in blogspot]
 
* [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. Actualy you never understood what it really means.
+
** [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://test-edi.blogspot.com/ EDI test]
  
 
* [http://www.jroller.com/trifon My blog in jroller.com]
 
* [http://www.jroller.com/trifon My blog in jroller.com]
 +
* [https://trifonnt.wordpress.com My blog in wordpress.com]
  
 
= Trifon's Paid Services =
 
= Trifon's Paid Services =
  
== Paid Adempiere support ==
+
== ADempiere Technical Support ==
* Need urgent advice for your Adempiere implementation or need to talk with experienced Adempiere developer - call now to get friendly help. Ask for Trifon.
+
This support consists of answering questions and providing advices.
* Price is 0.80 euro per minute
+
Unlimited number of questions.
[http://www.skype.com/go/joinskypeprime?call&skypename=trifonnt Use Skype Prime service to call now.]
+
Technical support is available monthly or in chunks of 6 and 12 months from the Adempiere developer, Trifon Trifonov.
[http://skypeprime.skype.com/ More info about Skype Prime]
+
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.
  
== Paid on site Adempiere training and development ==
+
Prices:
* 1500 EURO / week + ticket + hotel
+
 
+
== Paid EDI @ Adempiere support and training ==
+
* If you need training or support for EDI in Adempiere, please do not hesitate to contact me.
+
* Prices start from 30 Euro per hour.
+
 
+
== 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].
+
 
+
* Suitable for:
+
** Small applications which need to be developed from scratch
+
** 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].
+
** Licensed under LGPL. You can develop commercial application using OpenXava.
+
 
+
* Features:
+
** Applications based on OpenXava can choose [http://en.wikipedia.org/w/index.php?title=Enterprise_JavaBean#EJB_3.0.2C_final_release_.282006-05-02.29 EJB3 JPA], [http://www.hibernate.org/ Hibernate] or [http://en.wikipedia.org/w/index.php?title=Enterprise_JavaBean#EJB_2.1.2C_final_release_.282003-11-24.29 EJB2 CMP] as persistence engine.
+
 
+
** Applications based on OpenXava have [http://en.wikipedia.org/wiki/Multitier_architecture Multitier architecture] or [http://en.wikipedia.org/wiki/Client-server_architecture Client-server architecture].
+
 
+
** 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 ===
+
 
+
* [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/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.
+
 
+
== Paid Java Development ==
+
* Development of java applications.
+
* Please contact me for quotation.
+
 
+
= Trifon's Recent thoughts =
+
 
+
== OpenBravo Green? ==
+
Recently OpenBravo Green came into my mind(Jordi Mash told me about OpenBravo Green at Adempiere conference in Belrin) and i decided to review it and to check status.
+
 
+
First of all they have good document with intentions and requirements. Good number of frameworks and technologies are listed at this page:
+
[http://wiki.openbravo.com/wiki/index.php/Design_principles_for_Openbravo_Green Design principles for Openbravo Green]
+
 
+
They have a prototype and online demo, but i failed to login into demo page.
+
[http://demo.openbravo.com/green/ OpenBravo Green demo]
+
 
+
Source code of prototye was more interesting for me and it was the reason that made me write this post.
+
 
+
* I expected to see more commnents and more TODOs. It is prototype and important is to see what developer intend to do than what has been done. Visibility of ideas and intentions is more important than actual work finished. This is not a minus it is just a note and wish from my side.
+
 
+
* Source code dissapointed me, because:
+
** I saw one regular web based application. No trace from the idea of Model Driven Architecture or Application dictionary. Probably model classes were generated by some tool, but no evidence or comment in the code or in the wiki pages.
+
** Only one author, no participataion from community.
+
** Author is Adrian Romero, who is very good POS developer(Tina POS), but i doubt about his experience in ERP systems and Application Driven systems. It looks that he is the only active visible OpenBravo developer.
+
 
+
 
+
== Adempiere: Which is first Data or Code? ==
+
Recently i modified very deeply core of Adempiere in order to simplify development and to speed it up. I wasn't sure that such modification is possible and i was very happy when it happened and when at the end it even worked. After some tests i decided to revert to old version of persistent classes (X_xxx) and i deleted newly generated classes and started well known old GenerateModel, but... It failed because GenerateModel needs persistent classes in order to connect to Database. But developer can't generate persistent classes because GenerateModel can't connect to DB. So we got cycle... And here comes my queastion: Which is first Data or Code?
+
I think that design of GenerateModel can be improved:
+
 
+
* In order to connect to DB it should not need Adempiere Client.
+
* Data from DB can be moved to external location like (CSV or xml file), but this could creation duplication of data(stored in DB and in file). Not so good idea.
+
** CsvJdbc is a good driver which can be used to query CSV files like DB tables: [http://csvjdbc.sourceforge.net/ CsvJdbc - a JDBC driver for CSV files]
+
** xlSQL Excel JDBC Driver is another alternative [http://xlsql.sourceforge.net/ xlSQL Excel JDBC Driver]
+
 
+
[[User:Trifonnt|Trifonnt]] 12:55, 19 August 2007 (EDT)
+
 
+
== Does Community Open Source project need roadmap? ==
+
* What does Roadmap means for a project?
+
* [http://www.google.com/search?as_q=define%3ARoadmap&hl=en&num=10&btnG=Google+Search&as_epq=&as_oq=&as_eq=&lr=&as_ft=i&as_filetype=&as_qdr=all&as_nlo=&as_nhi=&as_occt=any&as_dt=i&as_sitesearch=&as_rights=&safe=images Goolge define:Roadmap] says few things, but i like mostly one of them:
+
<pre>
+
A program for future development indicating what will be developed and when.
+
</pre>
+
My opinion is that it must be more like:
+
 
<pre>
 
<pre>
A program for future development indicating what will be developed, by who will be developed and when.
+
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>
 
</pre>
  
* Three very important conditions in order to have Roadmap:
+
== 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.
  
** Functionality
+
* Optional - Dedicated Server
This is easy to be done. All we need functionality and all we with pleasure advice what to be done. So i think that here ANY project can produce good number of items.
+
** 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.
  
** Who will develop it?
+
== ADempiere customized with client's own brand ==
UPS, here the problems come. In order to develop something WE need knowledge, so from the big list of ALL only developers can participate in development. All this means that in Roadmap, Open Source project must identify developers or companies that will create new functionality. Ok, let's say that i would like to build this new functionality and i write my name against the feature.
+
* 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]]
  
** When functionality will be developed?
+
== ADempiere Virtual Appliance ==
Who knows? Who can answer? Who is responsible?
+
* Fully setup and ready to use Adempiere!
It looks that WHEN brings more question than it answers. In Open Source project if no one commit his time to develop given functionality no one can answer the questions. Moreover if someone commit his free time does anyone has rights to push him for specific date? I do not think so... It is developers free will to participate and create functionality. And as you guess in most of the time it is hard to find free time for building big functionality.
+
* Standard users: Garden Admin and Garden Users can send emails!
  
My personal opinion is that spending time to create Roadmap without committed developers/companies against specific functionality is just good wast of time. Even worst it is confusing for the end user who read Roadmap and wait for new version and new functionality.
+
* VMWare with Linux - Fedora Core - 5/7
 +
* Adempiere
 +
* Sun JDK
 +
* Database - Oracle or Postgres
 +
* Jakarta James email server
 +
* Price 45 EURO (No VAT included)
  
My big excuse to the users who will be frustrated from ssch Roadmaps.
+
== On demand Adempiere build ==
[[User:Trifonnt|Trifonnt]] 19:31, 8 August 2007 (EDT)
+
* 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.
  
== To be Adempiere Developer or Adempiere Businessman(Seller) ==
+
== Adempiere DVD by Trifon ==
I work with Adempiere/Compiere since more than 3 years. I must say that i like the product and area very much. I like to develop extensions for Adempiere and i do it everyday for 10-12 hours a day and sometimes more. I know it is not healthy, but...  
+
* Price is: 30 EURO + shipping cost to your place or only 30 EUR and download from FTP Server.
But last weeks i started to feel tired from all the rules for Developers and all fights in forums and in email lists. Also i realized that Business people around Adempiere do not have such limitations as Developers. For example:
+
* 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.
  
* On [http://www.adempierebusiness.com/ www.adempierebusiness.com] there are 30 registered Implementation Partners. Good number.
+
Developer need to copy one directory to his local hard drive and can start customizing Adempiere.
** What does this Implementation Partners give to Adempiere project?
+
Some of them nothing. Well business people say that if we limit and ask for money then this will stop add option of Adempiere. But may i ask how developers can survive?
+
** What they get?
+
FREE Advertisement. Perfect... I think that Adempiere is the only project that allows such thing. Most of other Open Source projects take money for advertisement and put money back into the project.  
+
  
* I have read that some of Adempiere Implementation Partners do not work for less than 50 000 USD. Amount which i as developer do not had chance to see till now. Who knows someday Clients may find that contracting developer is much faster and cheaper...
+
== Paid Adempiere Urgent support ==
 +
* 3 EURO per minute.
  
* User expect developers to provide FREE help in Adempiere forums, which gives additional workload to developers.
+
* 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;
 +
* [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://share.skype.com/sites/en/2007/03/skype_prime_beta_introducing_t.html Skype Prime Beta — introducing the global expertise marketplace]
  
* Developers are expected to be open and expose all their information to community.
 
  
So:
+
* [http://www.bitwine.com/advisors/trifonnt?auid=25850&amp;ctx=button http://www.bitwine.com/presence/1/25850.gif] 3 EUR per minute
* I found that i had made mistake.  
+
It looks that to be Businessman and make money around Adempiere is much easy and painless than to be Adempiere developer. :(
+
* I think to reconsider my role in Adempiere project. Role of Implementation Partner looks much safer and giving more incomes.
+
* I should start making advertisements from now... So here it is: I can provide Adempiere on Site Implementation for 1500 EURO / week + expenses(hotel + ticket) in case i need to move to other location.
+
  
= Adempiere trackers =
 
  
== Submitted by Trifon and Assigned to Trifon ==
+
* [http://www.ether.com Ether] Another pay per call service
:*{{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 ==
+
== Paid On-Site ADempiere User training(1 week) ==
:*{{User:Hengsin/SF_Contribution|Bugs|195397|879332}}
+
* 1500 EUR per week + ticket + hotel (No VAT included)
:*[http://sourceforge.net/tracker/index.php?group_id=176962&atid=883808&_category=100&_group=100&order=artifact_id&sort=DESC Contributions]
+
* Training plan customized to fit client needs.
:*{{User:Hengsin/SF_Contribution|Feature Requests|195397|879335}}
+
* Example training plan:
:*{{User:Hengsin/SF_Contribution|Patches|195397|879334}}
+
 
+
== Adempiere contributions ==
+
 
+
=== Functionality Contributions ===
+
 
+
==== EDI @ Adempiere - [http://www.adempiere.com/wiki/index.php/Sponsored_Development:_EDI_Import/Export Sponsored Development: EDI Import/Export] ====
+
 
+
* [http://www.stylusstudio.com/convert_edi_to_xml.html Convert EDI to XML]
+
 
+
==== Replication @ Adempiere - [http://www.adempiere.com/wiki/index.php/Sponsored_Development:_Replication Sponsored Development: Replication] ====
+
 
+
* Links:
+
Resources:
+
http://www.afceurope.com/JMS.html
+
http://www.manageability.org/blog/stuff/open-source-jms-java
+
 
+
Example the Replication with JMS
+
http://www-128.ibm.com/developerworks/library/i-jms/
+
 
+
Use the JMS Synchrony and Asynchrony
+
http://openjms.sourceforge.net/usersguide/using.html
+
 
+
http://www.javalobby.org/articles/distributed-jms/
+
 
+
JMS @ Salesforce.com:
+
* 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]
+
 
+
* [http://www.tibco.com/resources/company/partners/integration_bundle_salesforce_ds.pdf TIBCO and salesforce.com]
+
 
+
* [http://wiki.apexdevnet.com/index.php/Enterprise_Integration_Series salesforce.com Enterprise Integration Series]
+
 
+
==== Simplify and Speedup Adempiere development ====
+
SF.NET forum post [http://sourceforge.net/forum/forum.php?thread_id=1804539&forum_id=610548 here]
+
 
+
Feature Requests:
+
* [http://sourceforge.net/tracker/index.php?func=detail&aid=1772015&group_id=176962&atid=879335 1772015 Generate java Interface and implementation instead of X_ classes]
+
 
+
* [http://sourceforge.net/tracker/index.php?func=detail&aid=1777239&group_id=176962&atid=879335 1777239 Refactor PO class: save() to be static method]
+
 
+
This enhancement allows Adempiere developers to:
+
* Speedup thier day to day work and to have more Object friendly code.
+
* Work with Java Interfaces instead of Java Classes.
+
 
+
For example:
+
 
+
** Adempiere - Old code
+
 
<pre>
 
<pre>
Trx trx = Trx.get(Trx.createTrxName("Test"), true);
+
01) General overview of ADempiere ERP-CRM system.
trx.start();
+
02) Introduction to user interface.
 
+
03) How to setup new Company in ADempiere.
MAlert alertOldWay = new MAlert(Env.getCtx(), 100, trx.getTrxName());
+
04) How to setup new Organization in ADempiere.
log.info(alertOldWay.toString());
+
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.
X_AD_AlertProcessor alertProcessorOldWay = new X_AD_AlertProcessor(Env.getCtx(), alertOldWay.getAD_AlertProcessor_ID(), trx.getTrxName());
+
07) How to create hierarchical Categories of Services and Products (categories, subcategories, etc)
log.info("alertProcessorOldWay.getAD_AlertProcessor_ID = " + alertProcessorOldWay.getAD_AlertProcessor_ID());
+
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.
alertOldWay.setDescription("Trifon test");
+
10) How to create new Business Partner(Client, Vendor and Employee).
//--- Save;
+
11) How set credit limit for Business Partners. Apply a credit limit to a client and ADempiere lock sales when limit is reached.
resultSave = alertOldWay.save();
+
12) How to assign discount to specific Business Partner, and change it in every sell.
log.info("resultSave = " + resultSave);
+
13) How to import Business Partners from external sources/systems.
+
14) How to create Purchase Order.
System.out.println("New value of Description = " + alertOldWay.getDescription());
+
15) How to track purchases: list purchases that are not received, due dates.
 
+
15) How to create Material Receipt.
trx.commit();
+
16) How to create Invoice (Vendor)
trx.close();
+
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>
 
</pre>
  
** Adempiere - New code
+
** http://www.adempiere.com/wiki/index.php/Training_Courses
<pre>
+
** http://www.adempiere.com/wiki/index.php/Implementation_Manuals
Trx trx = Trx.get(Trx.createTrxName("Test"), true);
+
trx.start();
+
  
I_AD_Alert alert = new MAlert(Env.getCtx(), 100, trx.getTrxName());
+
== Paid On-Site Flash ADempiere User training(1 day) ==
log.info(alert.toString());
+
* 400 EUR + ticket + hotel (No VAT included)
 
+
* Training plan customized to fit client needs.
I_AD_AlertProcessor alertProcessor = alert.getI_AD_AlertProcessor();
+
* Example training plan:
log.info("I_AD_AlertProcessor.getAD_AlertProcessor_ID = " + alertProcessor.getAD_AlertProcessor_ID());
+
 
+
alert.setDescription("Trifon Description modified!");
+
//--- Save; PO.save(PO) must be static method!!! Two way of usage: PO.save(Object) or PO.save(PO)
+
//resultSave = PO.save((PO)alert);
+
resultSave = PO.save(alert);  // Overloaded save method; For simple usage!
+
log.info("resultSave = " + resultSave);
+
+
System.out.println("New value of Description = " + alert.getDescription());
+
 
+
trx.commit();
+
trx.close();
+
</pre>
+
 
+
This modificationas make Adempiere code closer to [http://www.hibernate.org/ Hibernate]
+
** Hibernate code. Example code from [http://www.hibernate.org/hib_docs/reference/en/html/tutorial.html here].
+
 
<pre>
 
<pre>
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+
+01) Introduction to ADempiere user interface.
 
+
+02) How to setup new Company in ADempiere.
session.beginTransaction();
+
+03) How to setup new Organization in ADempiere.
 
+
+04) How to create new Product, Product Category and set Product Price and Price List.
Event theEvent = new Event();
+
+05) How to create hierarchical Categories of Services and Products (categories, subcategories, etc)
theEvent.setTitle(title);
+
+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.
theEvent.setDate(theDate);
+
+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.
session.save(theEvent);
+
+09) How to create Purchase Order.
 
+
+10) How to track purchases: list purchases that are not received, due dates.
session.getTransaction().commit();
+
+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>
 
</pre>
  
Proposed by Hengsin modification:
+
== Paid on site Adempiere Developer training ==
* [http://en.wikipedia.org/wiki/Active_record_pattern Active record pattern]
+
* 1500 EUR per week + ticket + hotel (No VAT included)
* [http://blog.emmanuelbernard.com/2007/01/activerecord-pattern-so-what.html  ActiveRecord pattern, so what?]
+
* Training plan customized to fit client needs.
 
+
* Example training plan:
Add second interface I_Persistent with one method save()
+
 
<pre>
 
<pre>
public interface I_Persistent {
+
01) Overview of Adempiere setup in Eclipse.
public boolean save();
+
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>
 
</pre>
  
 +
== Paid Adempiere development ==
 +
* 300 EURO / day (No VAT included)
 +
* Please call for discount if you plan to book more than 150 hours
  
* Using the coding pattern below instead of the old new MAlert(Env.getCtx(), 100, trx.getTrxName()) approach would ensure your code always using the correct model class.
+
== Paid EDI @ ADempiere support and training ==
 +
* If you need training or support for EDI in Adempiere, please do not hesitate to contact me.
 +
* Prices start from 30 EUR per hour.
  
How to load:
+
== Paid [http://www.liferay.com Liferay] setup and extensions development ==
<pre>
+
* Leading Open Source Enterprise Portal
// to load existing record
+
* JSR-168 compliant
int AD_Alert_ID = 100;
+
* Business Friendly Open Source License: MIT License
MTable table = MTable.get(Env.getCtx(), I_AD_Alert.Table_ID);
+
I_AD_Alert alert = (I_AD_Alert)table.getPO(AD_Alert_ID, trxName);
+
  
</pre>
 
  
How to create new record:
+
== Paid OpenXava Development ==
<pre>
+
* Development of custom applications based on [http://www.gestion400.com/web/guest/openxava OpenXava framework].
// to create new record
+
MTable table = MTable.get(Env.getCtx(), I_AD_Alert.Table_ID);
+
I_AD_Alert alert = (I_AD_Alert)table.getPO(0, trxName);
+
...
+
</pre>
+
  
 +
* Suitable for:
 +
** Small applications which need to be developed from scratch
 +
** 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].
 +
** Licensed under LGPL. You can develop commercial application using OpenXava.
  
* Classes which override save() method:
+
* Features:
<pre>
+
** Applications based on OpenXava can choose [http://en.wikipedia.org/w/index.php?title=Enterprise_JavaBean#EJB_3.0.2C_final_release_.282006-05-02.29 EJB3 JPA], [http://www.hibernate.org/ Hibernate] or [http://en.wikipedia.org/w/index.php?title=Enterprise_JavaBean#EJB_2.1.2C_final_release_.282003-11-24.29 EJB2 CMP] as persistence engine.
org.compiere.process.DocActionTemplate
+
org.compiere.model.MClient
+
org.compiere.model.MClientInfo
+
org.compiere.model.MSystem
+
</pre>
+
  
Generated Model class must implement both interfaces and extend PO.
+
** Applications based on OpenXava have [http://en.wikipedia.org/wiki/Multitier_architecture Multitier architecture] or [http://en.wikipedia.org/wiki/Client-server_architecture Client-server architecture].
  
Weak sides that need to be improved:
+
** Applications based on OpenXava can run on any application server (Tomcat, JBoss, WebSphere, etc).
* Hard coded Document Engine
+
* Hard coded lookup of model class
+
* Hard coded list of document type for new client
+
* Incomplete Security Implementation
+
* No plugin/module support. Both ADCK and 2Pack support dynamic deployment of AD changes but doesn't address the need to deploy java code extension ( especially problematic/messy if your extension needs to use additional third party library).
+
* Incomplete web client port
+
* Incomplete workflow engine implementation
+
* Various swing client bug and limitation
+
  
===== Links =====
+
** Applications based on Openxava have easy integration of reports made with JasperReports.
* [http://blog.springframework.com/markf/archives/2006/03/22/pojo-aspects-in-spring-20-a-simple-example/ POJO Aspects in Spring]
+
* [http://www.jdocs.com/hibernate/2.1.8/net/sf/hibernate/persister/ClassPersister.html Hibenrate ClassPersister interface]
+
* [http://www.koders.com/java/fid2E46C5E6D43D933CBC3E4E7E63EE7DEAE6853542.aspx org.hibernate.test.CustomPersister]
+
  
=== Planned Contributions and Tasks ===
+
=== Trifon's contributions to OpenXava ===
* [https://sourceforge.net/forum/forum.php?thread_id=1748020&forum_id=611167 sf.net thread regarding Pentaho training]
+
* [[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]
+
* [http://sourceforge.net/tracker/index.php?func=detail&aid=1749402&group_id=123187&atid=695746 1749402 - GUI display field size]
  
* 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]
+
* [http://sourceforge.net/forum/forum.php?thread_id=1755705&forum_id=419691 Bulgarian flag]
  
== Interesting bugs/patches/Feature Requests ==
+
* [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.
* [https://sourceforge.net/tracker/?func=detail&atid=879332&aid=1721710&group_id=176962 1721710 Changing BPartner in a completed document should be denied]
+
* [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"]
+
* [https://sourceforge.net/tracker/?func=detail&atid=879332&aid=1704785&group_id=176962 1704785 VFile is not firing Vetoable Change]
+
  
Feature Requests
+
* Please contact me for quotation.
* [https://sourceforge.net/tracker/?func=detail&atid=879335&aid=1776484&group_id=176962 Adempiere Google Gadgets]
+
  
= My favorite readings =
+
== Paid Java Development ==
== General ==
+
* Development of java applications.
* [http://www.onlamp.com/lpt/a/7005 Tools for Geographically Distributed Software Development]
+
* Please contact me for quotation.
* [http://www.timeanddate.com/ Time and zone info]
+
* [http://openid.net/ OpenID]
+
* [http://www.x-rates.com Exchange Rates]
+
* [http://ist.berkeley.edu/as/ag/tools/usage/svn-govern-commit-permission.html SVN Repositories: Governing Commit Permissons]
+
 
+
== Interesting ==
+
* [http://www.readingcpl.com/activity-based-costing/2007/05/variable-costing-direct-costing-marginal-costing.php  Variable Costing/Direct Costing/Marginal Costing]
+
* [http://martinfowler.com/articles/languageWorkbench.html Martin Fowler; Language Workbenches: The Killer-App for Domain Specific Languages?]
+
* [http://buildix.thoughtworks.com/ Continuous Integration, Source Control, a Wiki and a Bug-Tracker; by ThoughtWorks]
+
* [http://www.businessweek.com/innovate/content/feb2007/id20070215_251519.htm?chan=globalbiz_europe_the+businessweek+wikinomics+series Ideagoras]
+
 
+
=== Mozilla - Firefox Extensions ===
+
* [http://www.foxmarks.com/ FoxMark - The Bookmark Synchronizer]
+
* [https://addons.mozilla.org/en-US/firefox/addon/673 InFormEnter adds a small, clickable icon next to every input field in a web form, from where you can select the item to be inserted]
+
* [https://addons.mozilla.org/en-US/firefox/addon/60 Web Developer - Adds a menu and a toolbar with various web developer tools.]
+
 
+
=== Project management ===
+
* [http://pdune.sourceforge.net/index.html Project Dune] Web-based issue tracker. Integration with subversion or cvs, code inspections in the browser, SCRUM project management.
+
 
+
=== Open Source articles ===
+
* [http://www.networkworld.com/news/2007/082307-open-source-to-watch.html Open source companies to watch]
+
* [http://itmanagement.earthweb.com/career/article.php/11067_3687096_1 Will Open Source Developers be Well Paid?]
+
* [http://www.riehle.org/computer-science/research/2007/computer-2007-article.html The Economic Motivation of Open Source Software: Stakeholder Perspectives]
+
* [http://news.com.com/8301-10784_3-9753687-7.html Resurrecting Marc Fleury] - very interesting
+
** Can you create an open-source developer? You were able to find them. Did you ever "build" one?
+
 
+
<pre>
+
We tried once to create an open-source developer out of a normal developer, but it completely failed.
+
We never tried it again. Truth be told, I had an aversion to it.
+
</pre>
+
 
+
<pre>
+
An open source developer is a self-starter.
+
He's competitive - this is someone that wants to prove that they can do something better than you can.
+
As such, it's a great recruitment/qualification vehicle, because you can see their work before you ever think of hiring them.
+
You can see if they'll work out for the company.
+
We definitely took that approach to hiring.
+
</pre>
+
 
+
* [http://webdev.computer.org/blog/?p=62 The Beauty of Source Code] found the solution — but only because we had the source code ...
+
 
+
 
+
==== OSS Etiquette & Culture ====
+
* [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]
+
 
+
=== My wish list - Books ===
+
Ordered by my desire!!!
+
* [http://www.eclipsewtp.org/ Discover WTP, the End-to-End Toolset for Java-Based Web Development]
+
* [http://www.packtpub.com/Customize-SugarCRM-PHP-MySQL-Open-Source-Developer-Manual/book SugarCRM Developer's Manual: Customize and extend SugarCRM]
+
* [http://www.mergere.com/m2book_download.jsp Better Builds with Maven]
+
* [http://www.pragmaticprogrammer.com/titles/jaerlang/ Programming Erlang Software for a Concurrent World]
+
 
+
=== Articles and posts from Martin Fowler ===
+
* [http://martinfowler.com/eaaDev/EventCollaboration.html Event Collaboration]
+
 
+
=== 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 standardized 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 organizations.
+
 
+
* [http://buddi.sourceforge.net/en/index.php Personal finance and budgeting program in Java; Well programmed]
+
 
+
=== Comparison of Open Source ERP Systems ===
+
* [http://www.big.tuwien.ac.at/research/publications/diplomatheses/herzog.pdf A Comparison of Open Source ERP Systems]
+
 
+
==== Non IT Technology ====
+
* [http://www.horizonfuelcell.com/store/rees.htm Technology of Future]
+
* [http://netinfo.bg/?tid=40&oid=1062999 Article In Bulgarian]
+
 
+
 
+
=== Social networks ===
+
* [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; [http://www.linkedin.com/in/trifon My page]
+
* [http://www.ecademy.com/ http://www.ecademy.com/user/trifontrifonov]
+
 
+
==== Developer oriented social network ====
+
* [http://www.ohloh.net/ Ohloh] accounts/7957
+
* [http://www.sourcekibitzer.org SourceKibitzer] - [http://www.sourcekibitzer.org/Bio.ext?sp=l133 my account]
+
 
+
=== ERP articles ===
+
 
+
==== Interesting ====
+
* [http://www.revenue.ie/index.htm?/leaflets/warehouse.htm Customs Warehouse]
+
 
+
== Adempiere ==
+
* [http://www.adempiere.com/wiki/index.php/Foundation_Project Adempiere Foundation]
+
* [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/How_to_Configure_Dynamic_Approval_Workflow How to Configure Dynamic Approval Workflow]
+
* [http://www.adempiere.com/wiki/index.php/ADempiere_Motto_Contest ADempiere Motto Contest]
+
* [http://www.adempiere.com/wiki/index.php/ADempiere_Motto_Contest/Qualification_Round Qualification Round ADempiere Motto Contest]
+
* [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] - 1734897 Making Workflows more predictable
+
* [https://sourceforge.net/forum/message.php?msg_id=4496774 Proof of concept for Loans System within ERP]
+
* [http://www.ibm.com/developerworks/forums/dw_thread.jsp?message=13966527&cat=19&thread=167397&treeDisplayType=threadmode1&forum=805#13966527 Adempiere post on IBM site]
+
* [https://sourceforge.net/forum/message.php?msg_id=4451073 Other Architectures for Adempiere - MUMPS]
+
 
+
Adempiere Brazil Localization effort
+
people 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 ===
+
* [[Committers|Committers]]
+
 
+
* [http://sourceforge.net/forum/message.php?msg_id=4384940 Structure and idea of Commit Level]
+
 
+
* Mentor/Commiter approach approved with 11/11 votes, according to this [https://sourceforge.net/forum/forum.php?thread_id=1765233&forum_id=611167 thread].
+
 
+
=== VERY IMPORTANT ===
+
* [https://sourceforge.net/forum/message.php?msg_id=4432961 EU funding Adempiere Development; Postponed as deadlines was passed.]
+
 
+
=== Incoming events ===
+
Time: xx:xx GMT
+
Day: Tuesday June 26
+
Venue: IRC channel #adempiere-team (on irc.freenode.net)
+
 
+
1 - Xxx
+
 
+
2 - Xxx
+
 
+
=== Possible integrations with external systems ===
+
* [http://care2x.org care2x] Care2x is a hospital information system which has lots of feature but no accounting at all.
+
 
+
* [http://code.google.com/apis/blogger/developers_guide_java.html EDI 2 Blog or XML Export 2 Blog]
+
 
+
=== Adempiere Application dictionary vs. Axapta Data dictionary ===
+
* [http://adempiere.com/wiki/index.php/Improvements_on_Adempiere_Data_Dictionary Improvements on Adempiere Data Dictionary] - Thank's to Emilio Arrufat
+
  
* [https://sourceforge.net/forum/message.php?msg_id=4442156 Improvements on Data Dictionary; Thank's to Emilio Arrufat]
 
  
* [http://www.freshpatents.com/Semantic-model-development-and-deployment-dt20070208ptan20070033212.php?type=description Microsoft trying to patent AD idea; Can't anyone get rid of this stupid company???]
 
  
 +
= ADempiere =
 
=== Performance tests & results made by me ===
 
=== Performance tests & results made by me ===
 
This are slower than on my laptop.  
 
This are slower than on my laptop.  
Line 594: Line 360:
 
</pre>
 
</pre>
  
=== Postal Code Web Service ===
+
* [https://sourceforge.net/forum/message.php?msg_id=7529055 post regarding import performance]
* [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]
+
  
=== Implementor hints ===
+
==== 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.
  
==== Show where products are located ====
+
==== Comparison of Posterita Web UI and Robert Klein Ajax Web UI ====
Submitted By: Jan Kantert (jab_doa)
+
* [https://sourceforge.net/forum/message.php?msg_id=4664348 sf.net post]
  
Summary: Show where products are located
+
* 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.
  
sf.net tracker: [https://sourceforge.net/tracker/?func=detail&atid=879335&aid=1768749&group_id=176962 here]
 
  
 +
==== Notes about installation ====
 +
* One Business partner must have column AD_OrgBP_ID set to Organization which is set in POS Terminal.
 +
<pre>
 +
SELECT C_BPartner_ID FROM C_BPartner WHERE AD_OrgBP_ID=
 +
</pre>
  
Initial Comment:
+
* Execution of migration scripts.
Log in as System Administrator. Select "Application Dictionary" -> "Window, Tab & Field" -> Name = Product
+
<pre>
 +
@"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"
  
Click on "Tab".  
+
@"1.6(AD340)\oracle\001_ad_Changes for C_Currency.sql"
Go to the end of the list and add a new row. Zoom in and set Table to "M_Storage_M_Storage", Name to "Located at", Description to "Where are my units located?", Tab Level to "2" and check "read only".
+
@"1.6(AD340)\oracle\002_ad_message.sql"
Now save and click on "Create Fields". Thats it. Now you can see where your units are when zooming into a product.
+
@"1.6(AD340)\oracle\003_C_Currency.sql"
  
==== Security ====
+
@"1.7.0\oracle\001_MixedPayment.sql"
Submitted By: Armen (armenrz)
+
@"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"
  
Summary: Security
+
@"1.7.1\oracle\001_M_Inventory.sql"
  
sf.net tracker: [https://sourceforge.net/forum/message.php?msg_id=4451508 here]
+
@"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"
 +
</pre>
  
1) ADempiere support role based security - Role window.
 
2) Role Data Access. You can also play around with SQLWhere in Window, Tab & Field.
 
  
Example:
+
* Values of web.xml
(instr('@#User_Level@','C')<>0 OR C_BPartner.CreatedBy=@#AD_user_ID@ OR C_BPartner.SalesRep_ID=@#AD_User_ID@)
+
<pre>
 
+
<context-param>
For pricelist, there's one place you can't hide price from user, which is  Product Info. You need to modify some codes to do this. What I did is add IsCanViewPrice option in Role so now each role can be set either they can view price or not.
+
<param-name>#AD_Client_ID</param-name>
 
+
<param-value>11</param-value>
 
+
</context-param>
==== Bank Transfer tips ====
+
<context-param>
Submitted By: usman88
+
<param-name>#AD_Language</param-name>
 
+
<param-value>en_US</param-value>
Summary: Bank Transfer tips
+
</context-param>
 
+
<context-param>
sf.net tracker: [https://sourceforge.net/forum/message.php?msg_id=4467580 here]
+
<param-name>#AD_Org_ID</param-name>
 
+
<param-value>11</param-value>
* [http://www.adempiere.com/wiki/index.php/Bank_to_Bank_Transfer_Transaction_tips Bank to Bank Transfer Transaction tips]
+
</context-param>
 
+
<context-param>
Small tips to handle 1 source Bank to 1 recipient Bank transfer transaction.
+
<param-name>#AD_User_ID</param-name>
 
+
<param-value>102</param-value> <!-- GardenUSer -->
1. Create new cash journal.
+
</context-param>
 
+
<context-param>
2. Select appropriate cash book ( in my case i use dummy cash book to serve this transaction)
+
<param-name>#C_BankAccount_ID</param-name>
 
+
<param-value>100</param-value>
3. Next go to cash line and create a new line and select cash type as bank transfer.
+
</context-param>
 
+
<context-param>
4. Then select source bank account and type in transfer amount
+
<param-name>#SalesRep_ID</param-name>
 
+
<param-value>102</param-value>
5. Create 2nd line as in step 3.
+
</context-param>
 
+
<context-param>
6. This time select recipient bank account and type in transfer amount but in negative sign.
+
<param-name>#AD_Role_ID</param-name>
 
+
<param-value>103</param-value> <!-- Garden User -->
7. Back to cash journal tab, complete and post it.
+
</context-param>
 
+
<context-param>
8. To finalize it create, complete and post Bank statement for each bank account.
+
<param-name>#W_Store_ID</param-name>
 
+
<param-value>11</param-value>
 
+
</context-param>
PS. Above tips can be use for more complex scenario such as transfer from 2 bank to 1 recipient.
+
<context-param>
 
+
<param-name>REPORT_DIRECTORY</param-name>
==== Listing a BOM within a BOM ====
+
<param-value>/config/reports/</param-value>
Submitted By: stingreye
+
</context-param>
 
+
</pre>
Summary: Listing a BOM within a BOM
+
 
+
sf.net tracker: [https://sourceforge.net/forum/message.php?msg_id=4369782 here]
+
 
+
Here is the view in Oracle... Because we have so many parts we ended up doing
+
a materialized view that we update with a process in Compiere everytime we
+
change
+
a BOM.  We did that so we could report off of this view faster.
+
 
+
I am sure someone out here could write a much better query than this but here
+
is what I did.  Basically, created a view on top of itself so that the parent
+
records would null.  Then used the connect by clause to generate the hierarchy.
+
You will also notice the use of connect_by_root = Top level of bill.
+
Connect_by_ISLEAF = bottom level of bill.  Level = what level of the hierarchy.
+
  
 +
* How to setup?
 +
Explained by Colin in irc:
 
<pre>
 
<pre>
CREATE OR REPLACE VIEW BOM_INDENTED
+
-01) Login as System Admin and add new window for the table "U_POSTerminal".
(TOPLEVELID, TOPLEVEL, TOPLEVEL_DESC, PRODUCTNUM, PRODDEC,
+
-02) Use the "Create Fields" button on the "Tab" tab to add all the fields of this table.
M_PRODUCTBOM_ID, BOM_LEVEL, BOMQTY, DESCRIPTION, AD_CLIENT_ID,
+
-03) Go to System Admin->Gerenral Rules->System Rules->Menu window and create a new menu item.
AD_ORG_ID, ROWNUMBER, BOM_LEVEL_NUM, BOTTOMCOMPONENT)
+
-04) Select Window as the Action and point it to the new window you just created (by selecting it in the window dropdown).
AS
+
-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.
SELECT  CONNECT_BY_ROOT M_ProductBom_ID AS TOPLEVELID,CONNECT_BY_ROOT Value
+
-07) Go to Quote-to-Invoice->Sales Orders->Web POS->
AS TOPLEVEL,CONNECT_BY_ROOT b.DESCRIPTION AS TOPLEVEL_DESC, Value AS
+
-08) Go to the role menu here and create a new record with "Web Menu"=smenu.cash.sales and "Role" = "GardenWorld Admin".
ProductNum,
+
    Uou can add more if you wish but I think this is all that's needed for basic sales.
b.DESCRIPTION AS ProdDesc, M_PRODUCTBOM_ID,LPAD(' ',2*(LEVEL-1)) ||
+
TO_CHAR(LEVEL)
+
BOM_Level, BOMQTY, a.DESCRIPTION,a.AD_CLIENT_ID, a.AD_ORG_ID, ROWNUM, LEVEL,
+
Connect_By_ISLEAF
+
  FROM
+
 
+
-- part 2 subquerry combining top level and bom to create null to start from
+
( SELECT
+
"M_PRODUCT_BOM_ID","AD_CLIENT_ID","AD_ORG_ID","ISACTIVE",--"CREATED","C
+
REATEDBY","UPDATED","UPDATEDBY",  (remove becuase unnnecessarry)
+
"LINE","M_PRODUCT_ID","M_PRODUCTBOM_ID","BOMQTY","DESCRIPTION","BOMTYPE"
+
FROM M_PRODUCT_BOM
+
 
+
UNION
+
-- part 1 the tope level querry creating the nulls that is combined in part 2
+
SELECT M_PRODUCT_BOM_1.M_PRODUCT_BOM_ID, M_PRODUCT_BOM.AD_CLIENT_ID,
+
M_PRODUCT_BOM.AD_ORG_ID, M_PRODUCT_BOM_1.ISACTIVE,-- M_PRODUCT_BOM_1.CREATED,
+
M_PRODUCT_BOM_1.CREATEDBY, M_PRODUCT_BOM_1.UPDATED, M_PRODUCT_BOM_1.UPDATEDBY,
+
(removed unnecessary)
+
M_PRODUCT_BOM_1.LINE,M_PRODUCT_BOM_1.M_PRODUCTBOM_ID AS M_PRODUCT_ID,
+
M_PRODUCT_BOM.M_PRODUCT_ID AS M_PRODUCTBOM_ID,  M_PRODUCT_BOM_1.BOMQTY,
+
M_PRODUCT_BOM_1.DESCRIPTION, M_PRODUCT_BOM_1.BOMTYPE
+
FROM M_PRODUCT_BOM LEFT JOIN M_PRODUCT_BOM  M_PRODUCT_BOM_1 ON
+
M_PRODUCT_BOM.M_PRODUCT_ID = M_PRODUCT_BOM_1.M_PRODUCTBOM_ID
+
GROUP BY M_PRODUCT_BOM_1.M_PRODUCT_BOM_ID, M_PRODUCT_BOM.AD_CLIENT_ID,
+
M_PRODUCT_BOM.AD_ORG_ID, M_PRODUCT_BOM_1.ISACTIVE, M_PRODUCT_BOM_1.CREATED,
+
M_PRODUCT_BOM_1.CREATEDBY, M_PRODUCT_BOM_1.UPDATED, M_PRODUCT_BOM_1.UPDATEDBY,
+
M_PRODUCT_BOM_1.LINE, M_PRODUCT_BOM.M_PRODUCT_ID,
+
M_PRODUCT_BOM_1.M_PRODUCTBOM_ID,
+
M_PRODUCT_BOM_1.BOMQTY, M_PRODUCT_BOM_1.DESCRIPTION, M_PRODUCT_BOM_1.BOMTYPE
+
HAVING (((M_PRODUCT_BOM_1.M_PRODUCTBOM_ID) IS NULL))) a
+
-- part 3 continued
+
  INNER JOIN M_PRODUCT b
+
  ON a.M_PRODUCTBOM_ID = b.M_PRODUCT_ID
+
  START WITH a.M_PRODUCT_ID IS NULL
+
  CONNECT BY PRIOR  M_PRODUCTBOM_ID = a.M_PRODUCT_ID
+
  ORDER SIBLINGS BY b.Value
+
/
+
 
+
 
</pre>
 
</pre>
  
If you want to use materialized views... we did it the following way (I really
+
* Printing
know very little about them, so if someone has a better idea of how to use them
+
for this, it would be appreciated)
+
The materialized view would be
+
  
 +
Edit java.policy in
 
<pre>
 
<pre>
CREATE MATERIALIZED VIEW BOM_INDENTED_MV
+
C:\Program Files\Java\jdk1.6.0_10\jre\lib\security
(PTX_Path,TOPLEVELID, TOPLEVEL, TOPLEVEL_DESC, PRODUCTNUM, PRODDEC,
+
M_PRODUCTBOM_ID, BOM_LEVEL, BOMQTY, DESCRIPTION, AD_CLIENT_ID,
+
AD_ORG_ID, BOM_LEVEL_NUM, BOTTOMCOMPONENT,TOPLEVEL_ISACTIVE, COMP_ISACTIVE,
+
TOP_Client)
+
+
Build IMMEDIATE
+
REFRESH ON DEMAND
+
DISABLE QUERY REWRITE
+
+
AS
+
SELECT Path, TOPLEVELID,TOPLEVEL,TOPLEVEL_DESC, ProductNum, ProdDesc,
+
M_PRODUCTBOM_ID, BOM_Level, BOMQTY, f1.DESCRIPTION,mp2.AD_CLIENT_ID,
+
mp2.AD_ORG_ID,
+
BomLevelNum, BottomComponent, MP.ISACTIVE AS TOPLEV_ISACTIVE, MP2.ISACTIVE AS
+
COMP_ISACTIVE, mp.AD_CLIENT_ID AS TOPLEVEL_Client
+
  FROM (
+
SELECT DISTINCT SYS_CONNECT_BY_PATH (M_PRODUCTBOM_ID,'/') AS Path,
+
CONNECT_BY_ROOT
+
M_ProductBom_ID AS TOPLEVELID,CONNECT_BY_ROOT Value AS TOPLEVEL,CONNECT_BY_ROOT
+
b.DESCRIPTION AS TOPLEVEL_DESC, Value AS ProductNum, b.DESCRIPTION AS ProdDesc,
+
M_PRODUCTBOM_ID,LPAD(' ',2*(LEVEL-1)) || TO_CHAR(LEVEL) BOM_Level, BOMQTY,
+
a.DESCRIPTION,a.AD_CLIENT_ID, a.AD_ORG_ID, LEVEL AS BomLevelNum,
+
Connect_By_ISLEAF
+
AS BottomComponent
+
  FROM
+
 
+
-- part 2 subquerry combining top level and bom to create null to start from
+
( SELECT
+
"M_PRODUCT_BOM_ID","AD_CLIENT_ID","AD_ORG_ID","ISACTIVE",--"CREATED","C
+
REATEDBY","UPDATED","UPDATEDBY",  (remove becuase unnnecessarry)
+
"LINE","M_PRODUCT_ID","M_PRODUCTBOM_ID","BOMQTY","DESCRIPTION","BOMTYPE"
+
FROM M_PRODUCT_BOM
+
 
+
UNION
+
-- part 1 the tope level querry creating the nulls that is combined in part 2
+
SELECT M_PRODUCT_BOM_1.M_PRODUCT_BOM_ID, M_PRODUCT_BOM.AD_CLIENT_ID,
+
M_PRODUCT_BOM.AD_ORG_ID, M_PRODUCT_BOM_1.ISACTIVE,-- M_PRODUCT_BOM_1.CREATED,
+
M_PRODUCT_BOM_1.CREATEDBY, M_PRODUCT_BOM_1.UPDATED, M_PRODUCT_BOM_1.UPDATEDBY,
+
(removed unnecessary)
+
M_PRODUCT_BOM_1.LINE,M_PRODUCT_BOM_1.M_PRODUCTBOM_ID AS M_PRODUCT_ID,
+
M_PRODUCT_BOM.M_PRODUCT_ID AS M_PRODUCTBOM_ID,  M_PRODUCT_BOM_1.BOMQTY,
+
M_PRODUCT_BOM_1.DESCRIPTION, M_PRODUCT_BOM_1.BOMTYPE
+
FROM M_PRODUCT_BOM LEFT JOIN M_PRODUCT_BOM  M_PRODUCT_BOM_1 ON
+
M_PRODUCT_BOM.M_PRODUCT_ID = M_PRODUCT_BOM_1.M_PRODUCTBOM_ID
+
GROUP BY M_PRODUCT_BOM_1.M_PRODUCT_BOM_ID, M_PRODUCT_BOM.AD_CLIENT_ID,
+
M_PRODUCT_BOM.AD_ORG_ID, M_PRODUCT_BOM_1.ISACTIVE, M_PRODUCT_BOM_1.CREATED,
+
M_PRODUCT_BOM_1.CREATEDBY, M_PRODUCT_BOM_1.UPDATED, M_PRODUCT_BOM_1.UPDATEDBY,
+
M_PRODUCT_BOM_1.LINE, M_PRODUCT_BOM.M_PRODUCT_ID,
+
M_PRODUCT_BOM_1.M_PRODUCTBOM_ID,
+
M_PRODUCT_BOM_1.BOMQTY, M_PRODUCT_BOM_1.DESCRIPTION, M_PRODUCT_BOM_1.BOMTYPE
+
HAVING (((M_PRODUCT_BOM_1.M_PRODUCTBOM_ID) IS NULL))) a
+
-- part 3 continued
+
  INNER JOIN M_PRODUCT b
+
  ON a.M_PRODUCTBOM_ID = b.M_PRODUCT_ID
+
  START WITH a.M_PRODUCT_ID IS NULL
+
  CONNECT BY PRIOR  M_PRODUCTBOM_ID = a.M_PRODUCT_ID
+
  ORDER SIBLINGS BY b.Value
+
) f1
+
INNER JOIN M_PRODUCT mp ON TOPLEVELID=mp.M_PRODUCT_ID
+
INNER JOIN M_PRODUCT mp2 ON M_PRODUCTBOM_ID = mp2.M_PRODUCT_ID
+
ORDER BY Path
+
/
+
 
+
 
</pre>
 
</pre>
  
Then to refresh the materialize view we used the following database procedure
+
Add the code below
where we used a parameter in the "report process" window to identify which MV
+
to refresh:
+
  
 
<pre>
 
<pre>
CREATE OR REPLACE PROCEDURE Indented_Bom_Mv_Refresh
+
grant codeBase "http://192.168.0.100" {
(
+
      permission java.util.PropertyPermission "org.jpedal.rejectsuperimposedimages", "read, write";
PInstance_ID    IN NUMBER
+
      permission java.util.PropertyPermission "file.separator", "read, write";
)
+
OR
AS
+
      permission java.security.AllPermission;
-- Logistice
+
};
ResultStr VARCHAR2(2000);
+
Message VARCHAR2(2000);
+
Record_ID NUMBER;
+
-- Parameter
+
CURSOR Cur_Parameter (PInstance NUMBER) IS
+
SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
+
FROM AD_PINSTANCE i, AD_PINSTANCE_PARA p
+
WHERE i.AD_PInstance_ID=PInstance
+
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
+
ORDER BY p.SeqNo;
+
-- Parameter Variables
+
p_MVIEW VARCHAR2(2000);
+
 
+
 
+
BEGIN
+
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || PInstance_ID);
+
    ResultStr := 'PInstanceNotFound';
+
    UPDATE AD_PINSTANCE
+
    SET Created = SYSDATE,
+
        IsProcessing = 'Y'
+
    WHERE AD_PInstance_ID=PInstance_ID;
+
    COMMIT;
+
-- Get Parameters
+
ResultStr := 'ReadingParameters';
+
FOR p IN Cur_Parameter (PInstance_ID) LOOP
+
Record_ID := p.Record_ID;
+
IF (p.ParameterName = 'MVIEW') THEN
+
P_PTX_MVIEW := p.P_String;
+
DBMS_OUTPUT.PUT_LINE('  MVIEW=' || p_MVIEW);
+
ELSE
+
DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
+
END IF;
+
END LOOP; -- Get Parameter
+
DBMS_OUTPUT.PUT_LINE('  Record_ID=' || Record_ID);
+
 
+
+
DBMS_MVIEW.REFRESH (p_PTX_MVIEW, 'c');
+
 
+
 
+
<<FINISH_PROCESS>>
+
--  Update AD_PInstance
+
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || Message);
+
    UPDATE  AD_PINSTANCE
+
    SET Updated = SYSDATE,
+
        IsProcessing = 'N',
+
        Result = 1,                -- success
+
        ErrorMsg = Message
+
    WHERE  AD_PInstance_ID=PInstance_ID;
+
    COMMIT;
+
    RETURN;
+
 
+
EXCEPTION
+
    WHEN  OTHERS THEN
+
ResultStr := ResultStr || ': ' || SQLERRM || ' - ' || Message;
+
DBMS_OUTPUT.PUT_LINE(ResultStr);
+
        UPDATE  AD_PINSTANCE
+
        SET Updated = SYSDATE,
+
            IsProcessing = 'N',
+
            Result = 0,            -- failure
+
            ErrorMsg = ResultStr
+
        WHERE  AD_PInstance_ID=PInstance_ID;
+
        COMMIT;
+
        RETURN;
+
END ;
+
/
+
 
+
 
</pre>
 
</pre>
  
 +
=== Seats/tables in a restaurant (or plane or cinema) ===
  
==== User authentication in Adempiere using LDAP ====
+
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.
Submitted By: gemmiti
+
  
Summary: User authentication in Adempiere using LDAP
+
AccommodationClass - description:
 +
It is designed to store classes information (these could be plane, bus classes, table types, chair types, room types etc)
  
sf.net tracker: [https://sourceforge.net/forum/message.php?msg_id=3959888 here]
+
AccommodationClass - definition (based on the book but modified a little)
 +
fields: accClassId, parentAccClassId, description
  
Enabling LDAP Functionality:
 
  
1.  Log in as SysAdmin
+
AccommodationMap - description:
2.  Go to Menu>System Admin>System
+
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)
3.  In Field "Ldap URL" fill in your LDAP URL, i.e. "LDAP://YourLdapServer.com"
+
fields: mapId, accClassId, faId, nrOfSpaces, overBooked, number
4.  In field "LDAP Domain" Your Domain, i.e., "YourLdapServer.com"
+
5.  Log Out as SysAdmin
+
6.  Log In as SuperUser/Admin
+
7.  GoTo Menu>General Rules>Security>User
+
8.  In tab "User Contact" and "Internal" you will find a field for LDAP User
+
Name -- Here (for a particular user) fill in the LDAP use name.
+
  
Upon logging in -- the user can enter his/her LDAP user name and password and
+
Example:
it will associate the correct credentials to the user you have set up in
+
Define two tables.
Compiere.
+
- 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.
 +
<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>
  
==== Add OnHandQty In Product window ====
+
In Accommodationclass define the table/chair classes.
Submitted By: stingreye
+
<pre>
 
+
AccommodationClass: accClassId=tables,        parentAccClassId=NULL
Summary: Add OnHandQty In Product window
+
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;
 +
</pre>
  
sf.net tracker: [https://sourceforge.net/forum/message.php?msg_id=3984175 here]
 
  
 +
In AccommodationMap define how many places each table or chair has and which is its number.
 
<pre>
 
<pre>
First the SQL
+
AccommodationMap: accClassId=tables,        fixedAssetId=table1, nrOfSpaces=3, number=5 //table number 5 has 3 chairs(faId=table1)
1) You want On Hand Qty - Product can be stored in multiple locators in M_Storage table. I assume you want total of all locators
+
AccommodationMap: accClassId=baby_chair,    fixedAssetId=chair11, nrOfSpaces=1, number=1 //chair number 1 has one place(faId=chair11)
2) So SQL = SELECT SUM (QTYONHAND) FROM M_STORAGE s
+
AccommodationMap: accClassId=high_chair,    fixedAssetId=chair12, nrOfSpaces=1, number=2 //chair number 2 has one place(faId=chair12)
3) Now you want to sync with product table, so  we add WHERE s.M_PRODUCT_ID = M_PRODUCT.M_PRODUCT_ID
+
AccommodationMap: accClassId=high_chair,    fixedAssetId=chair13, nrOfSpaces=1, number=3 //chair number 3 has one place(faId=chair13)
4) So the final SQL we need is (SELECT SUM(QTYONHAND) FROM M_STORAGE s WHERE s.M_PRODUCT_ID = M_PRODUCT.M_PRODUCT_ID)
+
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)
Now lets add it to compiere:
+
AccommodationMap: accClassId=normal_chair,  fixedAssetId=chair15, nrOfSpaces=1, number=2 //chair number 2 has one place(faId=chair15)
1) Log in as SuperUser or System
+
2) Role = System Administrator
+
3) Open Table window
+
4) Select Column tab
+
5) Create new record
+
6) Insert a name for DB Column Name
+
7) Choose a system element in this case most likely Qty_OnHand
+
8) Reference = String
+
9) Length = 20 should be plenty
+
10) Click Save
+
11) Click synchronize column, cross fingers
+
12) Look on bottom left of window for alter table M_PRODUCTADD name of the field you just made
+
 
+
Lets add it to the M_Product window.
+
 
+
1) Go to Window Tab Field
+
2) Choose Product Table
+
3) Goto Tab
+
4) Choose the “tab” we want which is Product (it is for the M_PRODUCT table)
+
5) Choose Field Tab
+
6) New Record
+
7) Name your Field (Qty on Hand)
+
8) Column – Choose the new column you created.
+
9) Save
+
 
+
Now open the Product window and it should work!
+
 
+
 
</pre>
 
</pre>
  
==== Workflow Simple approval ====
+
In similar fashion you can define theaters, planes etc.  
* [http://www.adempiere.com/wiki/index.php/How_to_Activate_Document_Approval_Workflow Workflow Simple approval]
+
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.
  
==== Workflow Dynamic approval ====
 
* [http://www.adempiere.com/wiki/index.php/How_to_Configure_Dynamic_Approval_Workflow Workflow Dynamic Approval]
 
  
==== Changelog functionality ====
+
==== How to import product from csv file? ====
changelog functionality consists of two parts: who & what.
+
* [https://sourceforge.net/forum/message.php?msg_id=5507588 sf.net post]
  
* Via tables user can identify "what" wish to log.
+
MySQL script commands to import a simple CSV spreadsheet of products and a collection of image files.
* Via roles "who".
+
  
By this way is possible to finely control the auditing.
+
CSV file MUST have these columns:
This means more tables to be flagged if user wish to log all tables.
+
 
+
=== Developer hints ===
+
* class dbPort/org.compiere.process.DocActionTemplate shows a template for DocAction, i think that it must be updated.
+
 
+
* [http://www.youtube.com/watch?v=tRHyFODLlUE Video created by Tim; part 1]
+
* [http://www.youtube.com/watch?v=tRHyFODLlUE Video created by Tim; part 2]
+
* [http://www.adempiere.com/wiki/index.php/Open_Window_and_Tab Open Window and Tab programmatically]
+
 
+
==== Hint-1; UPDATE columns which must have default value or have checked constraint ====
+
When developer add new column which is NOT NULL or which has checked constrint, please do not forget to execute proper UPDATE TABLE sql statemnts.
+
 
+
Example:
+
 
<pre>
 
<pre>
ALTER TABLE EXP_FormatLine
+
REFERENCE*, NAME*, PRICEBUY, PRICESELL, BARCODE*, CATEGORY
ADD IsPartUniqueIndex CHAR(1) CHECK(IsPartUniqueIndex IN ('Y', 'N'));
+
 
+
UPDATE EXP_FormatLine
+
SET IsPartUniqueIndex = 'N'
+
WHERE IsPartUniqueIndex IS NULL;
+
 
</pre>
 
</pre>
  
==== Hint-2; Be carefull when creating VIEWS ====
+
The columns with a * must have different values for every product, otherwise the script will fail.
Use LEFT/RIGHT OUTER JOINS, because in many cases fields do not have values and INNER JOIN will not show all records.
+
The category IDs in the CSV file also have to match the IDs in the 'categories' database table.
In this example C_Invoice.C_Order_ID is not manadatory so view will not show records which do not have Order associated with Invoice!
+
  
 
<pre>
 
<pre>
FROM C_Invoice i
+
LOAD DATA
    INNER JOIN C_DocType d ON (i.C_DocType_ID=d.C_DocType_ID)
+
INFILE 'C:\\temp\\products.csv'
    LEFT OUTER JOIN C_Order o ON (i.C_Order_ID=o.C_Order_ID)  
+
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>
 
</pre>
  
==== Hint-2; Java on Ubuntu ====
+
# the images are loaded by searching a directory for files that have the same names as the products
Ubuntu came with default version of java 1.4.2 and installing 1.5.0 didn't change that. So developer have to change it. Exporting the path to your newer java to the .bashrc config file of your environment is a standadrd decision but is not system wide and in some cases is not enough.
+
The decision is. When you type at the prompt:
+
 
<pre>
 
<pre>
  $ sudo update-java-alternatives -l
+
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;
 
</pre>
 
</pre>
will see the versions of all javas installed into your system. In order to make the latest one default for the whole system type:
+
 
 +
# to make the products appear in the catalog, their ids must be added to this table
 
<pre>
 
<pre>
  $ sudo update-java-alternatives -s java-newer-ver
+
INSERT INTO products_cat (PRODUCT)
 +
SELECT products.ID FROM products;
 
</pre>
 
</pre>
  
==== Subversion Access ====
 
Adempiere project's SourceForge.net Subversion repository can be checked out through SVN with the following instruction set:
 
svn co https://adempiere.svn.sourceforge.net/svnroot/adempiere adempiere
 
  
* SVN Browse: [http://adempiere.svn.sourceforge.net/viewvc/adempiere/ here]
+
=== OsCommerce db settings ===
 
+
==== MFG ====
+
[http://sourceforge.net/forum/message.php?msg_id=4440920 sf.net forum post]
+
 
+
Important Steps:
+
 
<pre>
 
<pre>
1. Apply the following patches:
+
/var/www/html/admin/includes/configure.php
+
buildbase.patch.tim
+
buildclient.patch.tim
+
buildutils_dev.patch.tim
+
X_AD_WF_Node.patch
+
X_C_DocType.patch
+
X_S_Resource.patch
+
X_AD_Workflow.patch
+
X_M_Cost.patch
+
X_M_Transaction.patch
+
X_M_Product.patch
+
+
2. I copied adempiere/libero/build.xml.tim to adempiere/libero/build.xml
+
+
Build your Adempiere and run it. 
+
 
+
3. Create a new client and import accounting etc...
+
(If you don't do this you won't see all the menus, you can't just login under GardenAdmin/GardenAdmin that is not enough)
+
It looks that 2pack file do not contains proper access records.
+
Must research!!!
+
 
+
4. Login with your new client Admin login you created in step3 and Libero away!!!
+
 
</pre>
 
</pre>
  
 
+
=== Schemas in MySQL DB where OsCommerce is installed ===
==== Template Process ====
+
 
<pre>
 
<pre>
package org.adempiere.process;
+
information_schema
 +
mysql
 +
oscomm
 +
test
 +
</pre>
  
import java.sql.PreparedStatement;
+
=== osCommerce Tables ===
import java.sql.ResultSet;
+
==== products ====
import java.sql.SQLException;
+
import java.util.logging.Level;
+
 
+
import org.compiere.model.MClient;
+
import org.compiere.model.MDocType;
+
import org.compiere.model.X_C_BPartner_EDI;
+
import org.compiere.model.X_C_EDIFormat;
+
import org.compiere.model.X_C_EDIProcessor;
+
import org.compiere.process.ProcessInfoParameter;
+
import org.compiere.process.SvrProcess;
+
import org.compiere.util.DB;
+
import org.compiere.util.Env;
+
import org.compiere.util.Msg;
+
 
+
/**
+
*  @author Trifon Trifonov
+
*  @version $Id:$
+
*/
+
public class ModelImporter extends SvrProcess
+
{
+
/** Client Parameter */
+
protected int p_AD_Client_ID = 0;
+
+
/** Business Partner Parameter */
+
protected int p_C_BPartner_ID = 0;
+
+
/** Document Type Parameter */
+
protected int p_C_DocType_ID = 0;
+
+
/** Record ID */
+
protected int p_Record_ID = 0;
+
+
/** Table ID */
+
int AD_Table_ID = 0;
+
+
/**
+
* Get Parameters
+
*/
+
protected void prepare ()
+
{
+
+
p_Record_ID = getRecord_ID();
+
if (p_AD_Client_ID == 0)
+
p_AD_Client_ID = Env.getAD_Client_ID(getCtx());
+
AD_Table_ID = getTable_ID();
+
+
StringBuffer sb = new StringBuffer ("AD_Table_ID=").append(AD_Table_ID);
+
sb.append("; Record_ID=").append(getRecord_ID());
+
// Parameter
+
ProcessInfoParameter[] para = getParameter();
+
for (int i = 0; i < para.length; i++)
+
{
+
String name = para[i].getParameterName();
+
if (para[i].getParameter() == null)
+
;
+
else if (name.equals("C_BPartner_ID"))
+
p_C_BPartner_ID = para[i].getParameterAsInt();
+
else
+
log.log(Level.SEVERE, "Unknown Parameter: " + name);
+
}
+
+
log.info(sb.toString());
+
}
+
 
+
/**
+
* Process
+
* @return info
+
*/
+
protected String doIt () throws Exception
+
{
+
StringBuffer result = new StringBuffer("");
+
+
MClient client = MClient.get (getCtx(), p_AD_Client_ID);
+
log.info(client.toString());
+
// get proper EDI Format from Document Type
+
MDocType docType = MDocType.get(getCtx(), p_C_DocType_ID);
+
+
int C_EDIFormat_ID = 0;
+
int C_EDIProcessor_ID = 0;
+
String sql1 = "SELECT C_EDIFormat_ID, C_EDIProcessor_ID "
+
  + "FROM " + X_C_BPartner_EDI.Table_Name + " "
+
  + "WHERE AD_Client_ID = ? "
+
  + " AND C_BPartner_ID = ? "
+
  + " AND C_DocType_ID = ? "
+
  + " AND Inbound = 'N' "
+
;
+
ResultSet rs1 = null;
+
PreparedStatement pstmt1 = null;
+
try
+
{
+
pstmt1 = DB.prepareStatement(sql1, get_TrxName());
+
pstmt1.setInt(1, p_AD_Client_ID);
+
pstmt1.setInt(2, p_C_BPartner_ID);
+
pstmt1.setInt(3, p_C_DocType_ID);
+
rs1 = pstmt1.executeQuery();
+
if (rs1.next())
+
{
+
// Found specific C_EDIFormat for given BPartner and C_DocType_ID
+
C_EDIFormat_ID = rs1.getInt(X_C_EDIFormat.COLUMNNAME_C_EDIFormat_ID);
+
C_EDIProcessor_ID = rs1.getInt(X_C_EDIProcessor.COLUMNNAME_C_EDIProcessor_ID);
+
} else {
+
// Get C_EDIFormat_ID from Document Type
+
C_EDIFormat_ID = docType.getC_EDIFormat_ID();
+
}
+
+
} finally {
+
try {
+
if (rs1 != null) rs1.close();
+
if (pstmt1 != null) pstmt1.close();
+
} catch (SQLException ex) {/*ignored*/}
+
rs1 = null;
+
pstmt1 = null;
+
}
+
if (C_EDIFormat_ID == 0) {
+
throw new Exception("EDI Format is not set for C_DocType_ID = [" + p_C_DocType_ID + "]");
+
}
+
if (C_EDIProcessor_ID == 0) {
+
throw new Exception("EDI Processor is not set for C_DocType_ID = [" + p_C_DocType_ID + "]");
+
}
+
+
addLog(0, null, null, Msg.getMsg (getCtx(), "EDISubmitProcessResult") + "\n" + result.toString());
+
return result.toString();
+
}
+
}
+
</pre>
+
==== Migration with SQL statements - AD_Element ====
+
 
<pre>
 
<pre>
INSERT INTO AD_Element
+
products_id int(11)
(AD_Element_ID, AD_Client_ID, AD_Org_ID, IsActive,
+
products_quantity int(4)
Created, CreatedBy,
+
products_model varchar(12)
Cpdated, UpdatedBy,
+
products_image varchar(64)
ColumnName, EntityType, Name,
+
products_price decimal(15,4)
PrintName
+
products_date_added datetime
)
+
products_last_modified datetime
VALUES (500XX, 0, 0, 'Y',
+
products_date_available datetime
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
+
products_weight decimal(5,3)
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
+
products_status tinyint(1)
'[ColumnNameHere]', 'D', '[NameHere]',
+
products_tax_class_id int(11)
'[PrintNameHere]'
+
manufacturers_id int(11)
);
+
products_ordered int(11)
COMMIT;
+
products_quanityt_discount varchar(255)
UPDATE AD_Sequence
+
products_weight_package varchar(255)
SET CurrentNextSys = (SELECT MAX (AD_Element_ID) + 1
+
products_status_hide tinyint(1)
FROM AD_Element
+
WHERE AD_Element_ID < 1000000)
+
WHERE NAME = 'AD_Element';
+
 
</pre>
 
</pre>
  
==== Migration with SQL statements - AD_Column ====
+
==== products_description ====
 
<pre>
 
<pre>
INSERT INTO AD_Column
+
products_id int(11)
(AD_Column_ID, AD_Client_ID, AD_Org_ID, IsActive,
+
language_id int(11)
Created,
+
products_name varchar(128)
Updated, CreatedBy,
+
products_description text
UpdatedBy, Name, Description, VERSION,
+
products_description_short text
EntityType, ColumnName, AD_Table_ID, AD_Reference_ID,
+
products_url varchar(255)
FieldLength, IsKey, IsParent, IsMandatory, IsUpdateable,
+
products_viewed int(5)
IsIdentifier, SeqNo, IsTranslated, IsEncrypted,
+
products_status_translation tinyint(1)
isselectioncolumn, ad_element_id, callout, issyncdatabase,
+
products_meta_title varchar(255)
isalwaysupdateable
+
products_meta_keywords text
)
+
products_meta_description text
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 ====
+
==== tax_class ====
 
<pre>
 
<pre>
INSERT INTO AD_Field
+
tax_class_id int(11)
(ad_field_ID, AD_Client_ID, AD_Org_ID, IsActive,
+
tax_class_title varchar(32)
Created, CreatedBy,
+
tax_class_description varchar(255)
Updated, UpdatedBy,
+
last_modified datetime
Name, Description, IsCentrallyMaintained, SeqNo, AD_Tab_ID,
+
date_added datetime
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 ====
+
==== manufacturers ====
 
<pre>
 
<pre>
INSERT INTO AD_Message
+
manufacturers_id int(11)
(AD_Message_ID, AD_Client_ID, AD_Org_ID, IsActive,
+
manufacturers_name varchar(32)
Created, CreatedBy,
+
manufacturers_image varchar(64)
Updated, UpdatedBy,
+
date_added datetime
Value, MsgText, MsgType
+
last_modified datetime
)
+
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 ====
+
==== manufacturers_info ====
 
<pre>
 
<pre>
INSERT INTO AD_Process_Para
+
manufacturers_id int(11)
(AD_Process_Para_ID, AD_Client_ID, AD_Org_ID, IsActive, Created,
+
languages_id int(11)
CreatedBy, Updated, UpdatedBy, Name,
+
manufacturers_url varchar(255)
Description,
+
url_clicked int(5)
Help,
+
date_last_click datetime
AD_Process_ID, SeqNo, AD_Reference_ID, AD_Reference_Value_ID,
+
AD_Val_Rule_ID, ColumnName, IsCentrallyMaintained, FieldLength,
+
IsMandatory, IsRange, AD_Element_ID, EntityType
+
)
+
VALUES (50019, 0, 0, 'Y', TO_DATE ('2007-03-03', 'YYYY-MM-DD'),
+
100, TO_DATE ('2007-03-03', 'YYYY-MM-DD'), 100, 'Shipment Date',
+
'Date printed on shipment',
+
'The Shipment Date indicates the date printed on the shipment.',
+
118, 15, 15, NULL,
+
NULL, 'MovementDate', 'N', 0,
+
'Y', 'N', 1037, 'D'
+
);
+
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 ===
+
==== languages ====
 
<pre>
 
<pre>
/**********************************************************************
+
languages_id int(11)
* This file is part of Adempiere ERP Bazaar                          *
+
name varchar(32)
* http://www.adempiere.org                                            *
+
code char(2)
*                                                                    *
+
image varchar(64)
* Copyright (C) Trifon Trifonov.                                      *
+
directory varchar(32)
* Copyright (C) Contributors                                          *
+
sort_order int(3)
*                                                                    *
+
* This program is free software; you can redistribute it and/or      *
+
* modify it under the terms of the GNU General Public License        *
+
* as published by the Free Software Foundation; either version 2     *
+
* of the License, or (at your option) any later version.              *
+
*                                                                    *
+
* 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 ===
+
== Eclipse Easy Shell plugin ==
* ADCK can be used in two modes.
+
* [http://pluginbox.sourceforge.net/plugins.html Easy Shell plugin]
** As Development tool. To model DB design and create/modify tables.
+
* Settings for Linux in order to open proper terminal
As Development tool ADCK uses Druid which allows developer to generate CREATE TABLE and ALTER table SQL statement for various DBs: Oracle, Postgres, MySQL, ...
+
As Development tool ADCK can generate xml files for various tools and frameworks like: [http://www.hibernate.org/ hibernate], [http://db.apache.org/torque/ torque].
+
 
+
** As transfer tool for only migrating AD changes from Adempiere instance to instance or from version to version.
+
As transfer tool ADCK require initial just setting of proper settings in properties files.
+
 
+
==== 2Pack vs. ADCK comparison table. ====
+
 
+
This table is made with the sole purpose to help me to organize information regarding import/export tools in Adempiere.
+
I do not have any idea to push any of the tools mentiod here.
+
It is user's choice to use or not to use any of them and also users choice to have headache after thier usage.
+
 
+
WARNING: !!!MAKE A BACKUP BEFORE ANY USAGE OF ANY OF THE TOOLS!!!
+
 
+
<table>
+
<tr><td>2Pack</td><td>ADCK</td></tr>
+
<tr><td>menu</td><td>[[ADCK menu|menu]]</td></tr>
+
<tr><td>window</td><td>[[ADCK window|window]]</td></tr>
+
<tr><td>tab</td><td>[[ADCK tab|tab]]</td></tr>
+
<tr><td>field</td><td>[[ADCK field|field]]</td></tr>
+
<tr><td>process</td><td>[[ADCK process|process]]</td></tr>
+
<tr><td>processpara</td><td>[[ADCK processpara|processpara]]</td></tr>
+
<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 AD_User_Roles|AD_User_Roles]]</td></tr>
+
<tr><td>orgrole</td><td>[[ADCK AD_Role_OrgAccess|AD_Role_OrgAccess]]</td></tr>
+
<tr><td>windowaccess</td><td>[[ADCK AD_Window_Access|AD_Window_Access]]</td></tr>
+
<tr><td>processaccess</td><td>[[ADCK AD_Process_Access|AD_Process_Access]]</td></tr>
+
<tr><td>formaccess</td><td>[[ADCK AD_Form_Access|AD_Form_Access]]</td></tr>
+
<tr><td>workflowaccess</td><td>[[ADCK AD_Workflow_Access|AD_Workflow_Access]]</td></tr>
+
<tr><td>taskaccess</td><td>[[ADCK |]]</td></tr>
+
<tr><td>???</td><td>[[ADCK AD_Column_Access|AD_Column_Access]]</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>[[2Pack Any Table| 2Pack Any Table]]</td><td>[[ADCK Any Table|ADCK Any Table]]</td></tr>
+
 
+
<tr><td>???</td><td>[[ADCK |TEMPLATE]]</td></tr>
+
</table>
+
 
+
==== Weak sides of 2pack according me ====
+
* Require integration at source code level with Adempiere, which means that if i need to customize any import functionality i must rebuild whole application or patch it.
+
** Carlos pointed that 2Pack can import records into any table, even customized.
+
** My comment is regarding main xml elements like: menu, window, tab, field, process, ... First time when i understood that i need to modify main xml elements was for JasperReports integration when i had to add new column into AD_Process table.
+
** I think that GenericPO which is responsible to import records into Any Table had one issue (I have to remember the exact reason. It was regarding Sequences or something related. ).
+
** Format of general imports is complicated.
+
 
<pre>
 
<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>
 
</pre>
  
* Main class(org.adempiere.pipo.PackInHandler) which handle import is very big(3800 lines) and complex, which require lot of time for developer to study it and makes modifications hard task.
 
** Since version 3.3.0 Low Heng Sin refactored org.adempiere.pipo.PackInHandler and now it is split into multiple classes.
 
 
* 2Pack uses SAX Parser which makes developer job harder as developer can't look forward or backward in XML tree.
 
 
==== Weak sides of ADCK according me ====
 
* It is external program, so user do not have such detailed control over security.
 
* It is harder for developer to work with it as do not have automatic changes extraction like 2Pack.
 
 
=== Ideas for extensions  ===
 
 
==== Computerized Maintenance Management System ====
 
[https://sourceforge.net/forum/message.php?msg_id=4465723 sf.net post]
 
CMMS is Computerized Maintenance Management System that designed specially for preventive maintenance for assets such as light vehicle, heavy equipment etc. so that company can create budgeting for repair and maintenance for their assets. Technicaly the module give alert to user when an asset have to get action such as replace fuel filter, oil filter or other item spareparts. Therefore these module related with inventory (internal use). Inventory will decrease its stock when user CMMS request for repair and maintenance their an asset.
 
 
 
==== Additional fields in I_Xxx tables ====
 
[https://sourceforge.net/forum/message.php?msg_id=4441215 sf.net forum post]
 
 
By: Carlos (globalqss)
 
 
Hi, every time I customize tables for a customer (almost all projects) I need
 
to change the importers and/or make some tricks with not used fields on import.
 
[Struggling today with this case]
 
 
Idea!
 
 
Not tested, but I think I could make a ModelValidator on udpate of I_ table
 
(i.e. I_BPartner) and process the corresponding fields.
 
 
The other thing we could do is to add some free fields to every I_ table as
 
wildcards to save customized or non considered fields and process them properly
 
with the ModelValidator.
 
Maybe just adding i.e. 10 fields FreeField01 through FreeField10 on the tables
 
can make the trick.
 
 
=== Recent Adempiere changes ===
 
==== Add more query method to MTable ====
 
* [https://sourceforge.net/tracker/?func=detail&atid=879335&aid=1777787&group_id=176962 Feature Requests-1777787 Add more query method to MTable]
 
  
Date: 2007-08-21
+
== Eclipse Preprocessor Plugin ==
 +
* [http://prebop.sourceforge.net/ Prebop Preprocessor]
  
MTable has new method:
+
* Adempiere Preprocessor Example code-1
 
<pre>
 
<pre>
public Query createQuery(String whereClause, String trxName)  
+
/* $if isAdempiere $
{
+
  Env.setContext(Env.getCtx(), "#AD_Org_ID", AD_Org_ID);  // Adempiere
return new Query(this, whereClause, trxName);
+
$else$ */
}
+
  Env.getCtx().setContext("#AD_Org_ID", AD_Org_ID);       // Compiere
 +
/* $endif$ */
 
</pre>
 
</pre>
  
==== Jar file in 2pack/lib will be packed into Adempiere.jar  ====
 
Starting from revision 3261 of trunk, any jar file that is pack of the lib folder of a 2pack package will be packed into the Adempiere.jar by the run_setup process. What this mean is, you just need to compile all libero specific code, pack it in a jar file and place it under the lib folder of the libero 2pack archive. Please look at the latest FAPack006.zip in the svn packages folder for an example.
 
  
== CRM systems ==
+
* Adempiere Preprocessor Example code-2
* [http://www.vtiger.com vTiger]
+
** [http://www.crm-now.de/ online]
+
** [http://www.vtigerserver.com/ online]
+
 
+
* [http://www.freecrm.com Free CRM; provides free and paid subsription]
+
* [http://yucrm.opencrx.com.cn/crm/ new GUI based on OpenCRX]
+
 
+
=== Comparison of CRM systems ===
+
* [http://www.pc101.com/showthread.php?t=3555 interesting post regarding different offers of CRM packages]
+
 
+
=== Localized in Bulgarian ===
+
* [http://dl.sugarforge.org/bgcrm/bgcrm/bg_bgdocuments/README_bg_bg.txt SugarCRM]
+
 
+
=== Interesting news/Forum post regarding CRM systems ===
+
* [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://www.sugarcrm.com/forums/showthread.php?p=80835#post80835 SugarCRM for blind man's (disabled people)] Very interesting requirements!
+
* [http://sourceforge.net/forum/forum.php?forum_id=728923 Dimdim Sugar CRM Integration Pack Release]
+
* [http://www.sugarcrm.com/forums/showthread.php?p=83961#post83961 SugarCRM osCommerce Integration] It is very strange for me too see how developers make integration at DB level. It looks that for CRM system it is completely OK.
+
 
+
== ERP Systems ==
+
* [http://tinyerp.org/wiki/index.php/DevelopperBook/TechSpecArchProgram TinyERP design]
+
 
+
== Tina POS ==
+
* [http://wiki.openbravo.com/wiki/index.php/TinaPOS_Integration TinaPOS Integration]
+
 
+
=== Weak sides ===
+
* [https://sourceforge.net/forum/message.php?msg_id=4441167 Bill Of Materials]
+
 
+
== Compiere ==
+
My opinion is that this is very outdated information, but who knows...
+
* [http://www.sybase.com/aseex_resources Compiere on Sybase]
+
 
+
=== Open Compiere ===
+
* [http://opencompiere.sourceforge.net/releasenotes/ReleaseNotes-r261-build20070723.xhtml list with bug fixes transfered from Adempiere] Amazing - EDI is part of it :) - Thank you!
+
 
+
== HTML/CSS ==
+
* [http://alistapart.com/articles/multicolumnlists CSS Swag: Multi-Column Lists]
+
 
+
 
+
 
+
 
+
== Java related ==
+
* [[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://chaoticjava.com/posts/how-to-write-iterators-really-really-fast/ How to write Iterators really REALLY fast]
+
* [http://www.terracotta.org/ Terracotta: JVM-level clustering technology]
+
** [http://javathink.blogspot.com/2007/08/extreme-hibernate-performance-delivered.html Extreme Hibernate Performance - Delivered]
+
** [http://coderoshi.blogspot.com/2007/08/terracotta-jetty-awesome.html  Terracotta + Jetty = Awesome]
+
* [http://www.artima.com/articles Good list with articles]
+
* [http://www.codeproject.com/useritems/DBGrid.asp Data Grid for JSP]
+
* [http://jdevelopment.nl/java/java-best-practices/ Java bad practices]
+
* [http://www.javalobby.org/articles/ibatis-introduction/ Introduction to iBatis]
+
* [http://www.bedework.org Bedework: Open Source Calendar for the Enterprise]
+
* [http://blog.elevenworks.com/?p=18 TreeTable example (with source code)]
+
* [http://articles.lightdev.com/gantt/gantt_article.pdf Article: Gantt Charts With JXTreeTable ]
+
 
+
=== Frameworks ===
+
* [http://www.c1-setcon.com/widgetserver/index.html WidgetServer]
+
WidgetServer is a component based, server-side, Java/XML rich-client-framework which enables an application to run as either
+
 
<pre>
 
<pre>
- an application with a rich Web client based on AJAX (HTML, XML, CSS, Javascript)
+
// =================
- an application with a simple Web client based on HTML and CSS
+
/* $if isAdempiere $
- a standalone application with a Swing GUI,
+
Env.setContext(Env.getCtx(), "#AD_User_ID", CreatedBy_ID);  // Adempiere
- a client/server application with a thin Swing client,
+
$else$ */
- or a mobile application on different devices like PDAs or Smartphones
+
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>
 
</pre>
  
 +
= OpenXava hints =
  
=== Java and IM ===
+
* Naming convention
* [http://jymsg9.sourceforge.net/ Yahoo Instant Messenger Support for Java]
+
  
=== Java Content Repository API ===
+
** Utility classes are in org.openxava.util package.
* [http://www.ibm.com/developerworks/java/library/j-jcr/ Introducing the Java Content Repository API]
+
* [http://www.onjava.com/pub/a/onjava/2006/10/04/what-is-java-content-repository.html What is Java Content Repository]
+
* [http://www.artima.com/lejava/articles/contentrepository.html Catch Jackrabbit and the Java Content Repository API]
+
  
=== 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]
+
  
=== Document Management Systems ===
 
* [http://jlibrary.sourceforge.net/ jLibrary]
 
* [http://dev.alfresco.com/ Alfresco]
 
  
=== Content Management Systems ===
+
== OpenXava User hints ==
* [http://www.magnolia.info Magnolia]
+
  
=== Eclipse IDE and Application build on Eclipse ===
+
=== Hint.1 How do to search in detail mode? ===
* [http://wiki.eclipse.org/Using_Sourceforge_with_Mylyn Using Sourceforge.net with Mylyn]
+
Click on 'new', fill the fields, and click on 'Search'.
  
==== Eclipse Easy Shell plugin ====
 
* [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>
 
  
=== Script Languages ===
+
== OpenXava Developer 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]
+
 
+
==== Eclipse plugin ====
+
* [http://eclipse-shell.sourceforge.net/index.html Eclipse Shell]
+
 
+
=== Java FTP Libraries and Articles ===
+
* [http://www.javaworld.com/javaworld/jw-04-2003/jw-0404-ftp.html Java FTP client libraries reviewed]
+
* [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 Developer hints ===
+
  
 
==== Hint.1 Always use different properties names ====
 
==== Hint.1 Always use different properties names ====
Line 1,639: Line 770:
 
also it helps developer to understand well which exactly property he uses/modify.
 
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.
  
=== OpenXava Q & A ===
+
* Nice to have OpenXava features:
Created an entity ticketClass with a method GenerateTickets. Implemented the calculator using an IModelCalculator class.  
+
** 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.
Want to create a button/link when ticketClass is displayed so that user click on it the method gets executed.
+
** Ability to align labels in forums.
  
==== Q.1 How do I set this up? ====
 
* A1. Have to create an action and include it in the controller of your module.
 
In this action, you can obtain the object and call to you method, something like this:
 
<pre>
 
public void execute() throws Exception {
 
  ...
 
  TicketClass ticketClass = (TicketClass) MapFacade.findEntity(getModelName(), getView().getKeyValues());
 
  ticketClass.generateTickets();
 
  getView().findObject(); // This refresh the view (Q2)
 
  ...
 
}
 
</pre>
 
  
==== Q.2 How can I get the view of the entity refreshed after the method is executed. ====
+
* [https://sourceforge.net/forum/message.php?msg_id=4563535 Interesting proposal regarding Actions]
* A2. See the above code
+
  
==== Q.3 How can i reload other modules to reflect the changes made by an action that was performed in one module? ====
 
An action in one module (module A) that changes the value of the data
 
contained in another module (module B), when i execute an action button (in
 
module A), it executes successfully and updates the data in the other entity
 
(entity B) in the database, but when i view module B, the module list view (of
 
module B) is still showing the old data!
 
 
* 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
 
is refreshed without touch filter nor any other action.
 
Look at your web/WEB-INF/portlet.xml, have you <expiration-cache>0</expiration-cache> for your portlets?
 
Since OX2.1 expiration-cache is 0 in the portlet.xml generated by OpenXava.
 
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.
 
 
 
==== Q.4 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.
 
  
==== Q.5 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:
+
  
<pre>
+
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)
public class MyService {
+
  
  public Address getCustomerAddress(String customerId) throws Exception {
+
2.- Edit: To modifiy the record
    // Here you use the POJOs generated by OpenXava
+
    Customer customer = (Customer) Customer.findById(customerId);
+
    return customer.getAddress();
+
  }
+
}
+
</pre>
+
  
Now you can create a Web Service from MyService class using AXIS, or the wizard included in Eclipse WTP.
+
3.- Copy: To create a new record but previously copying the information of an existing record that is very similar to the new one  
But, remember, all this is a Java issue, not an OpenXava one.
+
  
==== Q.7 Magic numbers ====
+
4.- Delete: to delete the record
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>
+
public class MyMagicNumbers {
+
  public final static int MY_MAGIC = 24324;
+
}
+
</pre>
+
  
In XML you can use XML ENTITIES:
+
5.- See: To see the record in detail mode and READ ONLY
<pre>
+
<!ENTITY mymagic "24324">
+
</pre>
+
  
and then use &mymagic; instead of 34324.
 
  
These techniques are not from OpenXava but from Java and XML.
+
= DB change/migration tracking =
  
In XML you can use @mymagic@, and the filter of OpenXava ant build
+
== Liquibase ==
changes it from a value of your properties file. This allows you
+
* [http://www.liquibase.org/ http://www.liquibase.org]
to have a different value of @mymagic@ for each customer or configuration.
+
This is a technique from OpenXava.
+
  
==== Q.8 How to access EJB from OpenXava ====
+
* Articles
* Reference Guide section 3.14.
+
  
* There is a example of using a EJB inside validator.
+
=== Liquibase Questions and Hints ===
  
* Developer can access EJB code in any part of OpenXava applications, for example:
+
==== Hint.1 How to update data? ====
<pre>
+
Is there any way to update a row that already exists in a table (besides using <sql>)?
Delivery delivery = DeliveryUtil.getHome().findByNumber(33);
+
delivery.generateInvoice();
+
</pre>
+
  
==== Q.9 Access rights depending on the user profile ====
+
Currently there is not.  
* [http://sourceforge.net/forum/message.php?msg_id=3973596 sf.net thread]
+
I have considered creating an update tag but have not yet.  
* User should only see fields or to execute actions depending on his user profile (or role).
+
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.
* Certain users to be able to update certain fields while others may only read them.
+
  
===== 1. Option - provided by the container portal =====
+
For example:
*Create two groups of users:  
+
** First with create-delete-edit rights.
+
** Second only with read rights.
+
 
+
* Define two modules:
+
** First with standard CRUD controller.
+
** Second with Print controller.
+
The admin may asign First or Second module (portlet) for each group of users with the portal administrative tools.
+
 
+
===== 2. Option =====
+
Not completly implemented in OpenXava, but there are some useful tools in OX that can help:
+
* Users.getCurrent() return the current user if application is started in portal. This value may be used in any point of the code.
+
+
* Filters: filters the data displayed in the mode list according to the current user.
+
+
A full management of users in OX project implies creation of several modules for storing the info about users, interfaces for change rights and create new users, roles and rights, overwrite standard controllers, to write new actions (tipically "save" action, frequently "new" action too), to write specific validators, to write filters for tabs in list mode, and more... 
+
+
Javier's opinion: I think that part of this stuff can be moved to a new project, instead of be included in OX core. This new project would manage access rights and user profiles, and will be reusable for other projects.
+
 
+
===== Links =====
+
* [http://wiki.liferay.com/index.php/Acegi_Security_for_Liferay Acegi Security for Liferay]
+
* [http://wiki.liferay.com/index.php/Custom_redirect_after_login Custom redirect after login]
+
 
+
==== Q.10 Property displayed as Radio button ====
+
* Existing test case: CustomerWithRadioButtons
+
* Section 4.7 of reference guide shows how editors are full configurable in OpenXava.
+
* /components/SomeComponent.xml file
+
 
<pre>
 
<pre>
<entity>
+
<update table="person">
  <property name="gender" >
+
<column name="username" value="newUsername">
<valid-values>
+
<where>username = 'oldUsername'</where>
<valid-value value="Male"/>
+
</update>
<valid-value value="Female"/>
+
</valid-values>
+
  </property>
+
</entity>
+
<view>
+
  <property-view property="gender" editor="ValidValuesRadioButton"></property-view>
+
  <members >
+
    name;
+
    gender;
+
  </members >
+
<view>
+
 
</pre>
 
</pre>
  
* OpenXava/xava/default-editors.xml contains definition of:
+
seems like a lot of work compared to
** ValidValuesRadioButton
+
<pre>
+
<editor name="ValidValuesRadioButton" url="radioButtonEditor.jsp">
+
<property name="horizontal" value="true" />
+
</editor>
+
</pre>
+
  
** ValidValuesVerticalRadioButton
 
 
<pre>
 
<pre>
<editor name="ValidValuesVerticalRadioButton"
+
<sql>UPDATE person SET username='newUsername' WHERE username='oldUsername'</sql>
url="radioButtonEditor.jsp">
+
<property name="horizontal" value="true" />
+
</editor>
+
 
</pre>
 
</pre>
  
** ValidValuesHorizontalRadioButton
+
Now that there is support for standardizing dates, Boolean values, etc. it may be worth creating however.
<pre>
+
<editor name="ValidValuesHorizontalRadioButton"
+
url="radioButtonEditor.jsp">
+
<property name="horizontal" value="true" />
+
</editor>
+
</pre>
+
 
+
It looks both last have the same value for horizontal request parameter <property name="horizontal" value="true" />.
+
Probably this is a mistake.
+
 
+
==== Q.11 OpenXava design ====
+
* All model classes implement org.openxava.model.IModel interface:
+
<pre>
+
/**
+
* Interface to be implemented by all model classes. <p>
+
*
+
* The model classes may be EntityBeans EJB 2 or POJOs (for JDO, EJB3 or Hibernate).
+
*
+
* @author Javier Paniza
+
*/
+
public interface IModel {
+
+
/**
+
* Returns metadata about object. <p>
+
*
+
* @return  Not null.
+
* @exception XavaException  Any problem related to OpenXava.
+
* @exception RemoteException  System problem.
+
*/
+
MetaModel getMetaModel() throws XavaException, RemoteException;
+
 
+
}
+
</pre>
+
 
+
==== Q.12 How to get logger in class ====
+
OpenXava uses [http://commons.apache.org/logging/ Apache Commons Loggin]
+
 
+
<pre>
+
private static Log log = LogFactory.getLog(Users.class);
+
</pre>
+
 
+
==== Q.13 Using the <transient> tag ====
+
Section 4.10 of Reference guide says:
+
 
+
"put <transient/> at the end of the component definition (1), just in the part for the mappings"
+
 
+
Make sure you write the following:
+
<pre>
+
 
+
<?xml version="1.0" encoding="ISO-8859-1"?>
+
<!DOCTYPE component SYSTEM "dtds/component.dtd">
+
<component name="YourComponent">
+
    <entity>
+
        ...
+
    </entity>
+
    ...
+
    <transient/>  <!--If you put it anywhere else you will see error in the
+
document-->
+
</component>
+
 
+
</pre>
+
 
+
==== Q.14 Search criteria customization in List mode ====
+
Requirement: The user writes his search criteria (Type employee salary for example) and then presses the search button.
+
 
+
Create a module that start in detail mode.
+
Use a view that show just the data for filtering.
+
 
+
Define a controller with your "Search" actions, and in this action change to list mode.
+
 
+
In this way you can achieve your goal.
+
 
+
Read the chapters 7 and 8 of Reference Guide.
+
 
+
 
+
==== Q.15 How to change Action view from link to button? ====
+
1. Create a new property called 'buttonsForNoImageActions' (or so), for use in xava.properties.
+
 
+
2. Add the property in the class XavaPreferences.
+
 
+
3. Modify the class ActionTag.
+
 
+
By default, buttonsForNoImageActions must be 'false', in order to not change the current OX behavior (by default).
+
 
+
==== Q.16 How to open/goto custom jsp? ====
+
DECLARATIVE jsp navigation, as following:
+
 
+
<pre>
+
<action name="goToMyJSP" class="org.openxava.actions.NavigationAction">
+
  <set property="customView" value="mypage.jsp"/>
+
  <set property="nextController" value="MyController"/>
+
</action>
+
 
+
</pre>
+
 
+
In general, action classes can be made reusable, and can be configured in controllers.xml. In this way  can do more configuration and less programming.
+
 
+
==== Q.17 How to make a property as a NOT persistent field in the entity element? ====
+
Yes, it's possible.
+
 
+
Two options:
+
 
+
1. Calculated properties (section 3.8.4 of reference guide)
+
 
+
2. View properties (section 4.5 of reference guide)
+
 
+
==== Q.18 How to implement Wizard form ====
+
First consider seriously to use a single view with several sections. This is more flexible in most cases and easy to implement with OpenXava.
+
 
+
Steps:
+
Your action for navigate must implements IChangeControllersAction, this allows you to change the actions to show in each page, and using
+
 
+
<pre>
+
getView().setViewName( ... );
+
 
+
</pre>
+
 
+
inside execute() of your action,  you can change the view in each step.
+
 
+
Look at the Reference Guide and OpenXavaTest for IChangeControllersAction, and also for INavigationAction.
+
 
+
 
+
==== Q.19 How to forward to a JSP ====
+
Action obtains two values which are important for the JSP.
+
 
+
Create a IForwardAction with a code like:
+
 
+
<pre>
+
public String getForwardURI() {
+
    return "/mypage.jsp?a=" + getA() + "&b=" + getB();
+
}
+
</pre>
+
 
+
And put mypage.jsp in the 'web' folder of your project.
+
 
+
==== Q.20 Change order of error messages ====
+
 
+
Method 'validate' of MapFacadeBean:
+
 
+
<pre>
+
private void validate(Messages errors, MetaModel metaModel, Map values, Map
+
keyValues, Object containerKey, boolean creating)
+
throws XavaException, RemoteException {
+
Iterator it = values.entrySet().iterator();
+
while (it.hasNext()) {
+
Map.Entry en = (Map.Entry) it.next();
+
String name = (String) en.getKey();
+
Object value = en.getValue();
+
validate(errors, metaModel, name, value, creating);
+
}
+
if (metaModel.containsValidadors()) {
+
validateWithModelValidator(errors, metaModel, values, keyValues,
+
containerKey,
+
creating);
+
}
+
}
+
</pre>
+
 
+
In this case the loop is over entrySet of a Map, hence the order is unknown. You can modify this method in order to work by the correct order, some method of MetaModel returns the member names
+
in order of declaration.
+
 
+
 
+
==== Q.21 How to disable the icon in the corner most column in column arrangement view? ====
+
 
+
Modify list.jsp.
+
 
+
 
+
==== Q.22 Is it possible to open custom JSP view in a pop up window? ====
+
 
+
No. The custom JSP must be inside the module.
+
Use IForwardAction that has a method (inNewWindow()) for create a pop up windows.
+
You can put your JSP in a public folder, and send the parameters for this jsp using OX session objects.
+
 
+
 
+
==== Q.23 How to hide view section depending on user rights? ====
+
Some users must be able to see given section from the view while other users must NOT be able to see this section.
+
 
+
At the moment developer can hide (using View.setHidden) members and groups, but not sections.
+
+
There are 4 (at least) options:
+
* Use setSectionEditable
+
* Put your sensible data in a group, and hide/show it.
+
* Create 2 views (one with the critical section, another without it)
+
* Modify OpenXava to allow to hide programatically sections.
+
 
+
 
+
* Which class should change view or hide section?
+
 
+
** SEARCH_ACTION and 'new' Action are good places.
+
** Other options as in an on-each-request action, or an on-init action.
+
+
 
+
* Guide how to develop option 4?
+
** Look at View.setHidden method.
+
 
+
==== Q.24 How to display only label in view? ====
+
Use a property of the view with stereotype LABEL.
+
 
+
<pre>
+
<view>
+
  <property name="selectLabel" stereotype="LABEL">
+
    <!--calculator class="org.openxava.calculators.StringCalculator">
+
<set property="string" from="Select at least one:"/>
+
    </calculator-->
+
  </property>
+
  <members>
+
    selectLabel;
+
    a;
+
    b;
+
  </members>
+
</view>
+
</pre>
+
 
+
File Application_en.properties must contain translation of property:
+
<pre>
+
selectLabel=Select at least one:
+
</pre>
+
 
+
 
+
Another option may be to have a property with no content and 'Select at least one:' as label.
+
 
+
File: xava/editors.xml
+
<pre>
+
<?xml version = "1.0" encoding = "ISO-8859-1"?>
+
<!DOCTYPE editors SYSTEM "dtds/editors.dtd">
+
<editors>
+
<editor url="void.jsp">
+
<for-stereotype stereotype="VOID" />
+
</editor>
+
</editors>
+
</pre>
+
 
+
Create empty file: web/xava/editors/void.jsp
+
 
+
==== Q.25 How to make property required from Action? ====
+
Make a property 'X' required depending on the value of other property 'A'.
+
If property 'A' has value 111 than property 'X' must became required.
+
 
+
<pre>
+
<property-view property="A">
+
    <on-change class="bg.d3soft.openxava.actions.OnChangeA"/>
+
</property-view>
+
</pre>
+
 
+
* Use a validator for property X (reference guide 3.8.6), and inject in the validator the property A (using <set />).
+
 
+
* Use a model level validator (section 3.16).
+
+
You cannot change the state of a property from 'required' to 'not required' at runtime (well, you can, but you shouldn't), because required is a feature of the model, not of a view.
+
You can access to the MetaModel at runtime and change the value of required, but if you do it in this way the value will be change for all modules, and all users at the same time, because you are modifying the meta data of the model.
+
 
+
== Web Services ==
+
* [http://www.artima.com/lejava/articles/threeminutes.html Three Minutes to a Web Service]
+
* [http://www.devshed.com/index2.php?option=content&task=view&id=1164&pop=1&hide_ads=1&page=0&hide_js=1 Developing SOAP Clients using PHP]
+
* [http://ws.apache.org/axis/java/user-guide.html Axis User's Guide]
+
* [http://www.onjava.com/lpt/a/1025 Java and Web Services Primer]
+
 
+
 
+
 
+
== Mashups ==
+
* [http://www.eaipatterns.com/ramblings/59_mashupeai.html Mashups == EAI 2.0?] very good article with example.
+
* [http://www.readwriteweb.com/archives/yahoo_pipes_web_database.php Yahoo! Pipes and The Web As Database]
+
* [http://apatarforge.org/wiki/display/INT/Salesforce.com+SMS+Mashup+using+StrikeIron+SMS+Web+Service Salesforce.com SMS Mashup using StrikeIron SMS Web Service]
+
  
== Liferay ==
+
== JSR-170 Note ==
* [http://wiki.liferay.com/index.php/How_to_use_the_sitemap_protocol_with_Liferay How to use the sitemap protocol with Liferay]
+
* [http://wiki.liferay.com/index.php/Exposing_Microformats_in_Liferay Exposing Microformats in Liferay]
+
* [http://wiki.liferay.com/index.php/Community_Roles Community Roles]
+
* [http://www.liferay.com/web/guest/devzone/forums?p_p_id=19&p_p_action=0&p_p_state=maximized&p_p_mode=view&p_p_col_id=null&p_p_col_pos=0&p_p_col_count=3&_19_struts_action=%2Fmessage_boards%2Fview_message&_19_messageId=39008 600.000 users] Good number of users!
+
* [http://wiki.liferay.com/index.php/Mail_%28JavaMail%29_Setup_For_External_.WAR_Portlets Mail (JavaMail) Setup For External .WAR Portlets]
+
* [http://www.liferay.com/web/guest/devzone/forums/message_boards/message/29306 How to get Liferay user name in a servlet]
+
* [http://www.liferay.com/web/guest/devzone/forums/message_boards/message/32361 How to get user attributes]
+
 
<pre>
 
<pre>
 
I am trying to get user atributes using the JSR-186 specified way.
 
I am trying to get user atributes using the JSR-186 specified way.
Line 2,144: Line 901:
 
</pre>
 
</pre>
  
* [http://www.liferay.com/web/guest/devzone/forums/message_boards/message/27790 How to create user?]
+
= kTable =
* [http://www.liferay.com/web/guest/devzone/forums/message_boards/message/24992 Ho to Authenticate using email address instead of user id?]
+
* [http://www.liferay.com/web/guest/devzone/forums/message_boards/message/37323 Programatically manage community / users]
+
* [http://wiki.liferay.com/index.php/Accessing_the_Document_Library_with_WebDAV Accessing the Document Library with WebDAV]
+
* [http://www.liferay.com/web/guest/devzone/forums/message_boards/message/34311 How to manage users programatically?]
+
* [http://www.liferay.com/web/guest/devzone/forums/message_boards/message/34992 How to hide Liferay portlet's tab?]
+
* [http://www.liferay.com/web/guest/devzone/forums/message_boards/message/29709 ModelListener for listening to user changes]
+
  
 +
== Move Table Header ==
 +
* [https://sourceforge.net/forum/message.php?msg_id=4581708 sf.net post]
  
=== Web Services ===
+
Create following Header Listener
* [http://www.liferay.com/web/guest/devzone/forums?p_p_id=19&p_p_action=0&p_p_state=maximized&p_p_mode=view&p_p_col_id=null&p_p_col_pos=0&p_p_col_count=0&_19_struts_action=%2Fmessage_boards%2Fview_message&_19_messageId=38896 Existing foldes via SOAP]
+
<pre>
 +
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);
  
== XML ==
+
}
* [http://www.devarticles.com/c/a/JavaScript/More-on-JavaScript-and-XML/ More on JavaScript and XML ]
+
 +
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>
  
* [http://www.zvon.org/index.php?nav_id=tutorials Good XML/xPath/CSS/... Tutorials ]
 
  
== Ant related ==
 
* [http://www.javalobby.org/articles/ant-preprocessor/ Using Ant as a Text Substitution Preprocessor]
 
* [http://kcbaltz.blogspot.com/2005/04/someone-on-this-javalobby-post-asked.html Ant and copy filtering as a build configuration mechanism]
 
* [http://blog.seba3y.com/2007/05/using-apache-ant-for-text-manipulation.html Using Apache Ant for Text Manipulation]
 
 
== HTML, CSS ==
 
* [http://yura.thinkweb2.com/scripting/contextMenu/ Context menu functionality on your page]
 
* [http://www.smashingmagazine.com/2007/08/25/20-free-and-fresh-icon-sets/ 20+ Free And Fresh Icon Sets]
 
 
== DB Related ==
 
* [http://schemaspy.sourceforge.net/ Schema Spy] Good tool which can create graphical representation of DB Schema
 
* [http://www.liquibase.org/ Database Refactoring With LiquiBase; DBMS-independent library for tracking, managing and applying database changes; Similar to DDLUtils]
 
** [http://blog.liquibase.org/2007/06/problem-with-database-diffs.html The Problem With Database Diffs] Interesting post regarding automatic diff of DBs; I would say that the same problem applies for ERP system. You can't understand what is semantic of change only from Change Log. For example: Changes regarding Documents (Invoice, Orders, ... ) must be sent only when document status is changed (from Prepared to Completed for example), becaese lines are added after main record is created, that's why upon Document creation his children(Order Lines or Invoice Lines) are empty...
 
 
= Fun =
 
* [http://robocode.sourceforge.net/ Robocode] I love this kind of games where user can develop his own creature with AI.
 
  
 
== Fork developers work in their free time! Excuse Me??? ==
 
== Fork developers work in their free time! Excuse Me??? ==
Line 2,184: Line 1,018:
  
  
* [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/message.php?msg_id=4496149 here]
+
* [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]
 +
 
  
''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 transparrent 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.''
+
[[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