User:Trifonnt
From AdempiereWiki
|
About Me
I started my own company in 2006 year providing Adempiere/Compiere consultancy, training and development services. I like developing business systems.
- SUN Certified Programmer 1.4.
- Bachelor degree in Mathematics
- Graduated High School of Economics and Computer Science
Some nice words about me on the net :)
My Blogs
- My blog in blogspot
- Compiere - Beginning of the end! Bye, Bye Compiere Inc. no more Open Source. Actualy you never understood what it really means.
- EDI test
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 EURO 6 months Adempiere tech support : 2700 EURO - 10% discount 12 months Adempiere tech support: 4800 EURO - 20% discount
Contract based Adempiere Support
- please call for the price.
- Included 5 support hours per month. Hours above that are at 30 euro per hour.
- Up to 10 registered Adempiere users.
- One contact person from the side of the customer.
- Communication channels: Phone, Email, Skype.
- Free bugfixes.
- Free migration to next version of Adempiere.
- Free installation of Adempiere on customer server.
- Free intergation 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.
- 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
On demand Adempiere build
- Please call for the price.
- Build of Adempiere upon user request.
- 10% will be donated to Adempiere.
- Build can include additional functionality like Fixed Asset or other not included in trunk.
Adempiere DVD by Trifon
- Price is: 30 EURO + shipping cost to your place or only 30 EUR and download from FTP Server.
- DVD with complete Adempiere sources, Eclipse IDE and Sun JDK.
- Available version for Linux and Windows.
- Jakarta James email server.
- Please contact me if you would like to have it.
Developer need to copy one directory to his local hard drive and can start customizing Adempiere.
Paid Adempiere Urgent support
- 3 EURO per minute.
- Need urgent advice for your Adempiere implementation or need to talk with experienced Adempiere developer - call now to get friendly help. Ask for Trifon.
- Use Skype Prime service to call now.
- More info about Skype Prime
- Skype Prime Beta — introducing the global expertise marketplace
- Ether Another pay per call service
Paid on site Adempiere User training
- 4500 EUR per week + ticket + hotel
- 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. 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 ammount. 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 create Sales Order. 18) How to create Shipment (Customer). 19) How to create Shipment Confirmation. 20) How to create Invoice (Customer). 21) How to create Payment. 22) How to match Purchase Order - Material Receipt - Invoice (Vendor). 23) How to match Sales Order - Shipment - Invoice (Customer). 24) How to create Cash Payment and Cash Receipt. 25) How to create Bank Account and Bank transaction. 26) How to modify Print Format of documents. 27) How to setup emails of Adempiere users and send emails with attached document(Purchase Order, Invoice, e.t.c) to clients. 28) How to create Users and assign User permissions. 29) How to setup Window, Tab and Field permissions for specific Roles and Users. 30) How to share data between Organizations and users. 31) How to setup records to be readable only by their creators. 32) How to setup taxes.
Paid on site Adempiere Developer training
- 7000 EUR per week + ticket + hotel
- 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?
Paid Adempiere development
- 1000 EURO / day
- Please call for discount if you plan to book more than 150 hours
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.
Paid 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 OpenXava framework.
- 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.
- Features:
- Applications based on OpenXava have Multitier architecture or 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
- 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 projects based on Compiere/Adempiere
Project 0 (area: Supply Chain Management)
Migrated from Microsoft Access based application to Compiere ERP-CRM Company is the biggest distributor of newspapers in Bulgaria. Huge migration effort. Imported definitions of: Vendors, Customers, Sales Agents, Products, Price Lists, Accounts, Purchase Orders, Sales Orders, Billing addresses, Warehouses. Imported ~ 20 000 Product definitions. Imported ~ 100 000 Purchase Orders. Imported ~ 100 000 Sales Orders. Developed new module in Compiere ERP-CRM in order to fit company needs in Product Distribution area. Developed mobile application and data synchronization module for real time tracking of products. Implemented: Product Attributes, Purchase Orders, Material Receipts, Invoices (Vendor), Sales Orders, Shipments, Invoices (Customer), Warehouse management, Price Lists, Accounting, Discount Schema.
Project 1 (area: ERP)
Migrated from 20 years old application to Compiere ERP-CRM. Huge effort in import of data from legacy system. Imported definitions of: Vednors, Customers, Sales Agents, Products, Price Lists, Accounts, Purchase Orders, Sales Orders, Shippers, Billing addresses, Discount Schema. Developed import functionality in Compiere ERP-CRM. Developed Slading Scale Commissions in Compiere ERP-CRM. Developed Bill of Ladding in Compiere ERP-CRM. Implemented: Purchase Orders, Material Receipts, Invoices (Vendor), Sales Orders, Shipments, Invoices (Customer), Warehouse management, Price Lists, Accounting.
Project 2 (area: ERP)
Migrated from Microsoft Solomon to Compiere ERP-CRM. Fast migration path. Imported definitions of: Vendors, Customers, Products, Accounts. Developed better user interface to fit needs of users used to work with Microsoft Solomon. Developed export from Compiere ERP-CRM to People Soft system. Improved traceability of Orders to fit needs of purchasing agency. Implemented: Purchase Orders, Material Receipts, Invoices (Vendor), Sales Orders, Shipments, Invoices (Customer), Warehouse management, Price Lists, Accounting.
Project 3 (area: Supply Chain Management)
Extension for Compiere MFG-SCM project. Developed java application for java enabled mobile phones. Developed web application. Developed connection module that enables data scanned with bluetooth enabled barcode scanner to be transferred to mobile phone and after that to web application. Application allows factory to track in real time product/part availability. Used Java, JSP, Servlet, AJAX and J2ME technologies.
Trifon's Recent thoughts
Strange live
Working in Open Source space is very hard sometime or probably most of the time. Contributor's work is in public space and everyone can see it and make comments. I do not speak only for source code, but wiki contributions, forums posts and so on. Contribution to Open Source project has many faces and this is good as all we are good in different areas. Open Source project gather contributors at one space and gives them freedom to express their self. All this is very very nice, BUT, there is always one big BUT. This word makes me sad sometimes, not the word itself but the words which come after BUT. For me Open Source first of all means Free Will to do something, FREE will to comment something, and so on. Just FREE, like i'm free to do it. I do not want anyone to push me to do anything in my Open Source project especially when this man is a man like me, who works side by side with me. I understand that first job of people is for commercial companies with strict rules for everything, but applying rules to Open Source most of the times leads to mistakes. In Adempiere project i was one of the developers who expressed his opinion against rules and i made it not because i do not like rules, but because rules can't work in the Free world. At least rules which demand a contributor to do something when other contributor contribute. I do not see how a contributor can demand other contributor to review his contribution. Contributor can ask for opinion of other contributor, but trying to push other contributor to do something is just something which is not going to happen. Words 'demand' and 'rule' live outside the Free will world of Open Source and are not compatible with the Free world of Open Source. In Adempiere project we have one prove of my words - Policy which demanded a peer review of committed code was reverted, because trackers were left in not appropriate state (in most of the cases second developer do not took the demanded action). I write this words because i want to remember my thoughts and writing is the best way to save thoughts in time. I predicted that push of rules in Adempiere would fail, but my prediction increased my bad karma image and my image of complainer which makes me sad. I'm not a complainer, i'm a contributor. I was trying to show to other developers that rules will fail but i didn't found enough understanding at that past moment. Sometimes i wish not to see such bad things, i wish to be calm and nice guy applauding nice contributors and consuming their work anonymously. Trifonnt 10:24, 15 February 2008 (EST)
Open Source’s Missed Opportunity
- Open Source’s Missed Opportunity Interesting post from The VAR Guy
Trifonnt 03:07, 18 January 2008 (EST)
Requirements of very small companies
- sf.netInteresting post from OpenBravo forums.
How customers should approach Open source vendor
Very good post from Matt Asay
Yes, I get quite a few requests to have Alfresco integrate with JBoss and Liferay, and I've done business with both. But I didn't need a committee to tell me that. Customers did. Customers have yet to request integration with Compiere, for example, so we haven't done it. Someday we probably will. But when customers vote with dollars.
Interesting requirement: Map Your Contacts By Region
Select a group of accounts based on geography...let's say all accounts in Texas. Then be able to map those accounts on an interactive map that will show the locations of each of those accounts as push pins. When you roll over each push pin, it pops up the name of the account and any specified modules like opportunities, calendar etc. Another cool feature would be select any two accounts to calculate the distance/drive time and even download directions.
Trifonnt 02:07, 11 December 2007 (EST)
Number of Adempiere developers
22 May 2008.
Adempiere has 70 registered developers in sf.net.
trifon 03:28, 22 May 2008 (EDT)
11 December 2007.
Adempiere has 56 registered developers in sf.net.
Trifonnt 02:07, 11 December 2007 (EST)
Risk to be Open Source developer
Here i will try to identify some of the negative sides of being Open Source developer. This are real examples which happen to me and make me sad.
- Help a user and after few days/weeks/months receive a spam message from the company where user work or from him personally.
- NEVER help a user in private emails. Private emails are for paid support only!
- Many times colleagues or other people tell me that i must increase my prices. It sounds quite good as advice, but the bad side is when they start working with you they are not so happy to pay you recommended by them price. ALWAYS RESPECT YOUR PRICE!
It is your price which is good for you and under your conditions.
- Many times Managers invite me on a beer and pay the bill. In a return after few days they send me contacts of their employees to help them with technical question. Bad understanding of Open Source model. The fact that source are free do not gives them right to think that i will help their employees for free. It is developers time which must be paid, no matter if he works on Open Source project or commercial project.
Trifonnt 14:43, 1 November 2007 (EDT)
Idea for additional meta data: AD_Table NamedQuery
JPA has very nice feature 'Named Query'. It would make Application Dictionary more reach if Adempiere has such feature. This idea is very near to Finders, but it allows more wide range of queries. Trifonnt 19:17, 26 October 2007 (EDT)
Idea for additional java interface: DocumentConversion
Adempiere ERP-CRM has processes which generate new document from existing document. For example Generate Invoice from Sales Order. This are quite useful processes, but currently they are not designed with the idea for extendability's. For example if user define new fields in Sales Order and would like to see values of this fields transfered to Invoice and Shipment later then he must modify source code of GenerateInvoice and GenerateShipment processes. This is not easy and i think that design can be improved. Possible improvements:
- Define new java interface and invoke classes which implement this interface. This require changes in existing GenerateXxx classes.
- Define new structure in Application Dictionary which will describe which fields must be transfered during Document Generation process.
Trifonnt 17:59, 26 October 2007 (EDT)
Data Services
Rob Cardwell has very interesting article: Data Services: A Fundamental Building Block of SOA.
In middle of this article i found that Adempiere has this beautiful functionality.
This approach requires tools that can capture existing data structures from reverse-engineered relational database schema's, and can map these existing structures into more business-oriented data views.
Adempiere AD(Application dictionary) on which all tables and windows are based provides meta data for all data structures in the system and even for all graphical components! But with Adempiere user do not need to reverse-engineer database system, all data structures have business oriented view by design.
Trifonnt 22:51, 28 September 2007 (EDT)
Why fights in Open Source projects are bad?
Link to Adempiere post: here
What an ERP system MUST NOT allow user to do?
Recently i read a urgent post in OpenBravo forum.
i have deleted "big bazzar and System", the default clients and i can't enter to OpenBravo now what is the solution?
Interesting? This sounds like:
i have deleted "Local Disk C and D" and i can't enter my windows system what is the solution?
One of the most valuable ideas in Compiere is IsActive column and restriction to delete records in most of the tables. It is good if user can delete some Client, but System records must never be deletable! This makes another question to me. Is ERP for every user? My answer at this moment is NO. User who implement ERP must be very careful, conscious and most importantly must always make backup of data.
Trifonnt 17:01, 4 September 2007 (EDT)
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: Design principles for Openbravo Green
They have a prototype and online demo, but i failed to login into demo page. 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 question: 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: CsvJdbc - a JDBC driver for CSV files
- xlSQL Excel JDBC Driver is another alternative xlSQL Excel JDBC Driver
- Super CSV Super CSV sf.net page
- Jxcell www.jxcell.netPaid!
- Xelem xelem.sourceforge.net
Trifonnt 12:55, 19 August 2007 (EDT)
Does Community Open Source project need roadmap?
- What does Roadmap means for a project?
- Goolge define:Roadmap says few things, but i like mostly one of them:
A program for future development indicating what will be developed and when.
My opinion is that it must be more like:
A program for future development indicating what will be developed, by who will be developed and when.
- Three very important conditions in order to have Roadmap:
- Functionality
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.
- Who will develop it?
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.
- When functionality will be developed?
Who knows? Who can answer? Who is responsible? 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.
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.
My big excuse to the users who will be frustrated from ssch Roadmaps. Trifonnt 19:31, 8 August 2007 (EDT)
To be Adempiere Developer or Adempiere Businessman(Seller)
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... 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:
- On www.adempierebusiness.com there are 30 registered Implementation Partners. Good number.
- 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...
- User expect developers to provide FREE help in Adempiere forums, which gives additional workload to developers.
- Developers are expected to be open and expose all their information to community.
So:
- 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
Assigned to Trifon
Adempiere contributions
Functionality Contributions
EDI @ Adempiere - Sponsored Development: EDI Import/Export
- Convert EDI to XML
- Converting business objects to EDI documents Good functionality.
- EDI Syntax SetsGood description of EDI separators.
- EDI ReaderEDIReader parses EDI input from ANSI X12 and EDIFACT, including documents for HIPAA compliance.
- Supplier Document ConnectorSupplier Document Connector allows automotive suppliers to exchange necessary EDI documents with a major automotive partner/client.
- www.etasoft.com Products for companies working with electronic documents in EDI X12, HIPAA, EDIFACT, XML, flat file and many other formats.
- SmooksSmooks for Mule enables Message Transformation and Routing using the Smooks Engine. Smooks is a Java Framework/Engine for processing XML and non XML data (CSV, EDI etc).
- EDIELThe EAN and Ediel project for invoicing in the downstream electricity power market
- EDI Vendor
Replication @ Adempiere - Sponsored Development: Replication
- Links:
- http://www.afceurope.com/JMS.html
- Open Source JMS (Java Message Service) Implementations
- Integrating Presence into J2EE Environment
- HermesJMSA console that helps you interact with JMS providers making it easy to browse or seach queues and topics, copy messages around and delete them.
- JMS Examples
JMS @ Salesforce.com:
Swing POS @ Adempiere - Sponsored Development: Swing POS
Cash Payments @ Adempiere - Sponsored Development: Cash Payments
Simplify and Speedup Adempiere development
SF.NET forum post here
Feature Requests:
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
Trx trx = Trx.get(Trx.createTrxName("Test"), true);
trx.start();
MAlert alertOldWay = new MAlert(Env.getCtx(), 100, trx.getTrxName());
log.info(alertOldWay.toString());
X_AD_AlertProcessor alertProcessorOldWay = new X_AD_AlertProcessor(Env.getCtx(), alertOldWay.getAD_AlertProcessor_ID(), trx.getTrxName());
log.info("alertProcessorOldWay.getAD_AlertProcessor_ID = " + alertProcessorOldWay.getAD_AlertProcessor_ID());
alertOldWay.setDescription("Trifon test");
//--- Save;
resultSave = alertOldWay.save();
log.info("resultSave = " + resultSave);
System.out.println("New value of Description = " + alertOldWay.getDescription());
trx.commit();
trx.close();
- Adempiere - New code
Trx trx = Trx.get(Trx.createTrxName("Test"), true);
trx.start();
I_AD_Alert alert = new MAlert(Env.getCtx(), 100, trx.getTrxName());
log.info(alert.toString());
I_AD_AlertProcessor alertProcessor = alert.getI_AD_AlertProcessor();
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();
This modificationas make Adempiere code closer to Hibernate
- Hibernate code. Example code from here.
Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Event theEvent = new Event(); theEvent.setTitle(title); theEvent.setDate(theDate); session.save(theEvent); session.getTransaction().commit();
Proposed by Hengsin modification:
Add second interface I_Persistent with one method save()
public interface I_Persistent {
public boolean save();
}
- 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.
How to load:
// to load existing record int AD_Alert_ID = 100; MTable table = MTable.get(Env.getCtx(), I_AD_Alert.Table_ID); I_AD_Alert alert = (I_AD_Alert)table.getPO(AD_Alert_ID, trxName);
How to create new record:
// 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); ...
- Classes which override save() method:
org.compiere.process.DocActionTemplate org.compiere.model.MClient org.compiere.model.MClientInfo org.compiere.model.MSystem
Generated Model class must implement both interfaces and extend PO.
Weak sides that need to be improved:
- 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
Planned Contributions and Tasks
- Restrict form "Generate Invoices (manual)" to show only public records (hide locked records) BUG - 1713337
- Restrict form "Generate Shipments (manual)" to show only public records (hide locked records) BUG - 1713317
Interesting bugs/patches/Feature Requests
- 1721710 Changing BPartner in a completed document should be denied
- 1711594 Workflow is not taking account of "Access All Orgs"
- 1704785 VFile is not firing Vetoable Change
- Sales Tax
- Destination-based Sales Tax
- www.avalara.comEnd to End Sales Tax Automation for Businesses of All Sizes
Feature Requests
- Adempiere A1 enhancement
Adempiere Open Office plug-in by Praneet
My favorite readings
General
- SVN - Subversion
- OpenQA - Selenium a test tool for web applications. Selenium tests run directly in a browser, just as real users do.
- Reusing Functional Tests - Part 1
- WinMerge My favorite diff tool.
- email offer IMAP access
- ImageMagick v6 Examples -- Creating ThumbnailsImageMagick® is a software suite to create, edit, and compose bitmap images. It can read, convert and write images in a variety of formats (over 100) including DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript, SVG, and TIFF
- OpenOffice interesting
- Excel interesting
- PERSONYWEB Conference software.
- Bulgarian alphabet Bg alphabet and it's transcript into Latin Alphabet
- THE BULGARIAN ALPHABET Bg alphabet and it's transcript into Latin Alphabet
- BANKRUPTCY of CommunismIn Bulgarian.
-
- The Dublin Core Metadata Initiative Open organization engaged in the development of interoperable online metadata standards.
Interesting
- Variable Costing/Direct Costing/Marginal Costing
- Continuous Integration, Source Control, a Wiki and a Bug-Tracker; by ThoughtWorks
- Ideagoras
- Eureka - A network for market oriented R&D
- Portable Applications Way to run applications from USB.
- Free DictionaryThe data is kept as XML complying to the TEI DTD.
- manageability Site with categorized open source applications
- www.prosper.comProsper can help you get a personal loan from one of our trusted partners.
- DozerJava Bean to Java Bean mapper that recursively copies data from one object to another. Similar to my idea of Document Transfer interface.
DSL - Domain Specific Languages
- DSL ExamplesApache Camel DSL; Regular Expressions; Structured Query Language (SQL);
- Create Domain-Specific Languages with ANTLRThe latest version of ANTLR provides the tools you need to build a parser for special-purpose languages.
- DSL development: 7 recommendations for Domain Specific Language design based on Domain-Driven Design
Prototyping
- Pencil Projectmission is to build a free and opensource tool for making diagrams and GUI prototyping that everyone can use.
- CreatelyOnline Diagram Tool.
- Terms
MODFM = Mockup-driven fast-prototyping methodology.
Pivot Tables
- How to create Pivot tables in Excel
- Another guide to Excel Pivot tables
- ADAXA How-To: Analysis of Data using Excel Pivot Tables
- OpenOffice.org Calc: Pivot tables by another name
- Open Office - Using the data pilot
- JPivotJSP custom tag library that renders an OLAP table and let users perform typical OLAP navigations like slice and dice, drill down and roll up. It uses Mondrian as its OLAP Server. JPivot also supports XMLA datasource access.
Mozilla - Firefox Extensions
- FoxMark - The Bookmark Synchronizer
- 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
- Web Developer - Adds a menu and a toolbar with various web developer tools.
- XForms support for Firefox and Mozilla A must have Add-on.
- Zoterohelp you collect, manage, and cite your research sources.
- Google Browser Sync
Project/Time/Bug management
- Project Dune Web-based issue tracker. Integration with subversion or cvs, code inspections in the browser, SCRUM project management.
- Open Proj - free, open source desktop alternative to Microsoft Project.
- Open Workbench - Open source project similar to Microsoft Project.
- workeffort Businesses perform work efforts within their organizations to accomplish tasks such as producing products, developing software, mantaining assets etc. This system helps in managing these kind of tasks. It also includes a time tracking system.
- eHourTimesheet Management
- OpenTimeEclipse, SWT/JFace, Hibernate, embedded relational databases, XML.
- Mantis Bug TrackerPHP
- dotProject
- RedmineFlexible project management web application written using Ruby on Rails framework. Similar to sf.net.
- Time4UJava based.
- Project.net
Bug-Finding Tools
- FindBugs
- PMD
- GleanGathering feedback from your code
- - A Comparison of Bug Finding Tools for Java
Communication
- A Communication Model
- How all human communication fails, except by accident, or a commentary of Wiio's laws
- Alan Greenspan sf.net post posted by Colin
"I guess I should warn you, if I turn out to be particularly clear, you've probably misunderstood what I've said."
Good lookiing Resumes/CV
Software Engineers Salaries
Open Source Magazines and Articles
Magazines
Articles
- Glass Cathedrals and Community versus CodeVery good post from David E. Jones.
- Quality Improvement in Volunteer Free and Open Source Software Projects: Exploring the Impact of Release Management
- Open source companies to watch
- Will Open Source Developers be Well Paid?
- The Economic Motivation of Open Source Software: Stakeholder Perspectives
- Why I Can't Stand the FSFVery interesting. Real experience with FSF.
- Resurrecting Marc Fleury - very interesting
- Can you create an open-source developer? You were able to find them. Did you ever "build" one?
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.
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.
- The Beauty of Source Code found the solution — but only because we had the source code ...
- Open source software as a customer capture tool
- FollarsMaking Money from Free & Open Source Software
- Why should i ever contribute? Just give me your stuff. Interesting article and very true. I likes this sentence:
, but don't beg for help, the guys who work owe you nothing.
- Book review: Producing Open Source Software
- Site of Producing Open Source
- VITKIA user who feel completely lost in finding accounting software.
- Australia leading the way in open source ERM and CRM software adoption
OSS Etiquette & Culture
- Mozilla Forum Etiquette
- ArchLinux Forum Etiquette
- WikiMatrix Forum Etiquette
- Forum Etiquette & Rules
Open Source Wars
How to ask questions in public forums?
- Google: "art of asking questions"
- Geek to Live: The art of asking
Open Source Models
- Model of Tiny ERP
- Thoughts from Chris CoppolaInteresting thoughts from Chris Coppola, CEO of rSmart which supports the Sakai open source collaborative learning environment (CLE)
- The Emerging Economic Paradigm of Open Source
Giving It Away
- Giving It AwayBooks
My wish list - Books
Ordered by my desire!!!
- Discover WTP, the End-to-End Toolset for Java-Based Web Development
- OSWorkflow Java open source Business Process Management
- SugarCRM Developer's Manual: Customize and extend SugarCRM
- Better Builds with Maven
- Programming Erlang Software for a Concurrent World
- OpenERP English Book
Online books/Magazines
- SAP J2EE Engine 6.20 - Administration Manual Something which i have been part of!!!
Articles and posts from Martin Fowler
Doing Business
- Economy Rankings
- Organizational Growth Cycles
- Man makes nice software. Sells it. Makes $100,000 in 5 months
- Post affiliateAffiliate Management Solution
- Drupal - Working as a contractor or Freelancer
- Drop Shippper Tips
- License management
- True LicenseThе project aims at managing licensing aspects for closed source Java applications in a secure, reliable, flexible and yet easy way.
- ROI
- ROI should be top of mind in small business ERP rolloutsInteresting article about average time and price of ERP implementation.
Financial based
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.
Creadit Card processing
Acounting Information
- K and K InfoBulgarian site.
Accounting Systems
- 2008 Handbook of International Public Sector Accounting Pronouncements (online version)
- Accounting Standards for the Public Sector
Accounting application
- QuickBooks
- IIF Transaction Creatorconvert Excel spreadsheets or CSV files to the IIF format for import into QuickBooks.
- FrontAccountingFree; Accounting systems for small companies and our popular web based FrontAccounting is a simple, but powerful, system for the entire ERP chain.
Invoice creation/generation
Budgeting
Payment processors
CS and ROT explained
In UK two methods of trading are popular with manufactures and wholesalers - Consignment Stocking(CS) and Retention of Title (ROT). The question is does ERP handle these types correctly?
CS is where stock is supplied and title transferred on sale to the end user.
ROT is where title is transferred on payment by the wholesaler.
This means that some goods held in the wholesalers warehouse will not belong to him and should not be counted as assets until title is transferred in the case of ROT and not at all in the case of CS unless the wholesaler uses ROT himself.
Bank/SWIFT oriented
- WIFEWIFE is an open source Java library for SWIFT messages parsing, writing and processing. The components are heavily tested and running in production environments since 2005.
Venture Capital Companies
Non IT Technology
Social networks
- www.xing.com; Formerly know as openBC; Very strong in Europe
- www.linkedin.com Emerging at the moment; My page
- http://www.ecademy.com/user/trifontrifonov
- BitWine Trusted advice from real people - My account
Call me now![]()
Developer oriented social network
- Ohloh accounts/7957
- SourceKibitzer - my account
The Semantic Web - Information sharing - machine-readable way
- The Friend of a Friend (FOAF) projectThe Friend of a Friend (FOAF) project is creating a Web of machine-readable pages describing people, the links between them and the things they create and do.
- Finding friends with XML and RDFThe Friend-of-a-Friend vocabulary can make it easier to manage online communities
- foafrealm.orgD-FOAF - distributed authentication and trust infrastructure without a centralised authority.
Projects with very high social importance
- Sahana Disaster Management System
Terms
- How Ltd. is written in different languages
Romanian: SRL = Societate Raspundere Limitata
Cloud Computing and Storage
- www.enomalism.comEnomalism is an open source web-based virtual infrastructure platform.
Voting/Survey systems
Adempiere
- irc-adempiere-26.01.2008
- Amount in words
- Idalica Wiki
- Adempiere Foundation
- Adempiere on ZK Demo
- Adempiere Marketing Materials
- Adempiere 3.5 plan
- Radio station to help people learn Adempiere libero by Tim
- Adempiere screen cast by simon
- CentOS adempiere VMWare
- HOWTO Use Jasper On Financial Reports
- Good description of Adempiere project from moyses
- Good general description of Adempiere functionality and account functionality from Colin
- Building Adempiere using mavenNice functionality from Timo. Site: http://tb4smb.org/maven2repo/
- 001 Adempiere Opensource ERP InstallationGood tutorial about Adempiere installation.
- ERP - Manuales de AdempiereAdempiere manuals in Spanish
- ADempiere Accounting by Carlos
- Default Accounts Usage by Carlos
- How to Configure Dynamic Approval Workflow
- Quality Management ModuleSome requirements on Quality Management by Reda Sultan.
- Thoughts from a Adempiere SME
- ADempiere Motto Contest
- Qualification Round ADempiere Motto Contest
- WEB interface from Robert
- Accounting initiative
- Pictures from Adempiere Conference - Berlin 2007
- ADempiere Institute & Center of Excellence
- Making Workflows more predictable
- Revision: 2725; Grid Collapse & Horizontal Tab Improve
- Feature Request - 1734897 Making Workflows more predictable
- Proof of concept for Loans System within ERP
- Article on CNET
- Adempiere post on IBM site
- Other Architectures for Adempiere - MUMPS
- Central Reservation of IDs Very good idea and implementation from Carlos
- HTTP request:
http://adempiere.globalqss.com/cgi-bin/get_ID? USER=user &PASSWORD=pass &TABLE=AD_Column &ALTKEY= &COMMENT=SomeCommentHere
- Show log
http://adempiere.globalqss.com/cgi-bin/showlog?AD_Column
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
- Mentor/Commiter approach approved with 11/11 votes, according to this thread.
VERY IMPORTANT
- Get rid of the Base Language
- Implement Native Sequence Functionality
- Freight handling
- EU funding Adempiere Development; Postponed as deadlines was passed.
- Seventh Research Framework ProgrammeEuropean Union’s chief instrument for the public funding of research, an increase in private funding of R&D is one of the key goals of the EU’s Lisbon Strategy for ‘knowledge for growth’, and the programme is designed with this in mind.
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
OSGI
Hospital Information System
- care2x Care2x is a hospital information system which has lots of feature but no accounting at all.
- NetEpi Open Source, network-enabled tools for epidemiology and public health practice.
- OpenMRS
Siemens
Integration with WEB Shops
- OS-Commerce PHP based.
- Magento Commerce PHP based. Well written with Object Oriented Approach.
Zimbra
IBM WEB Sphere
- Installation Guide for ADempiere using WebSphere Application Server
- Installation Guide for ADempiere on IBM i
- sf.net post
Talend
iButton
SPML
- Service Provisioning Markup languageOpen standard for the integration and interoperation of service provisioning requests. SPML is an OASIS standard based on the concepts of DSML. SPML version 1.0 has been approved in October 2003. SPML version 2.0 has been approved in April 2006. SAML exchanges the authorization data.
X.400
www.skydeck.com
SAF-T (Standard Audit File for Tax Purposes)
- Guidance for Developers of Business and Accounting Software Concerning Tax Audit RequirementsSAF-T (Standard Audit File for Tax Purposes) is an file format to export accounting
data from software. Part of an OECD recommendation for business and accounting software.
Shipping applications
Other
- EDI 2 Blog or XML Export 2 Blog Done by me. See Adempiere EDI.
Adempiere Application dictionary vs. Axapta Data dictionary
- Improvements on Adempiere Data Dictionary - Thank's to Emilio Arrufat
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
Postal Code Web Service
- 1741222 Webservice connector for address lookups
- 1-Postcode lookup propsal by Michael Judd
- 2-Postcode lookup propsal by Michael Judd
- Proposal from Teo
INCOTERMS
Pricing
Interesting Proposal/Requiremnts
Web Service
1. Products - When entering a new product, call an UPC/EAN webservice (http://www.gepir.org/) that validates a product UPC/EAN and populates the item description and trade info (size, weight, etc).
2. Business Partners - When entering a new Business Partner, call a Company Registrar to validate (and populate) company registration / vat numbers and registered address, directors, etc.
3. Credit Checking - When entering a new Business Partner, call a webservice to perform a credit vetting / check after which the report can be populated into a credit check table or attached to the record.
Double UOM
Expectations from Adempreie
* It must be stable. I'm running my business and other's businesses on it and it must not stop working at any time. * When I upgraded to the 3.52a release the invoices stopped printing due to a bug. To get the invoice printing to work Adempiere must be patched. This shouldn't happen in releases. * User friendly - If the system isn't user friendly it's harder to convince people to work in it. * Secure - I posted previously a message about Adempiere being easy to break into and that it can't be on an untrusted network. It's OK to have an insecure application as long as everybody knows it's insecure. For business critical data the implementors must know how to secure Adempiere. I'm working on the user friendliness part (the Account Editor was the first step) and when I have time I'd like to work on the security part. One example on how user friendliness can be improved is to increase the searchability in accounts (you can't zoom to documents from accounts-view today) and make a really simple form for creating manual general ledger entries. Manual general ledger entries today are far too much work than what a normal accountant is used to in other systems.
Posterita WEB POS
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;
};
Adempiere Frequently Asked Question
Practical Use of Document Type & Sequence
- What is its real purpose of Document Sequence
The purpose is to have different sequence (Document No) for each document type. For example: Imagine you want to difference the PO depending on what you buy. You could have the document type "Purchase Order-A" and the "Purchase Order-B".
"Purchase Order-A" --> Sequence (Document no):A00001 "Purchase Order-B" --> Sequence (Document no):B00001
So for the same transaction (Purchase order) you can difference distinct sequence numbers.
How to create new user and restricted access rights?
Define Role for User Create Role:
Click on the General Setup -> Security -> Role Click on the New button(ex: MyRole). Select the Organization from drop down. Enter the Name for role. Select the User Level from User Level drop down. Tick on the Manual Checkbox. Click on the Save button. Click on the Grant Access button (eg:Access to All for Sale Module). Select the Module from drop down that you have to include. Select the Access To from drop down that you have to include. Click on the OK button. Click on the Save button. Click on the Org Access tab. Select the Organization for newely defined role. Click on the Save button.
Create User:
Click on the General Setup -> Security -> User. Select the Organization from organization drop down. (Note: user organization and define role organization must be same.) Enter the Name for user(ex: ABC). Set the Password for user. Click on the Save button.
Assign Role to User:
- Click on the User Roles tab. Select Role from drop down(ex:MyRole). Click on the Save button.
Click on the User tab. Select the Default Role from drop down(ex:MyRole). Select Default Client from drop down. Select the Default Organization from drop down. Click on the Save button. Login as ABC user.
How to modify Invoice(Customer) Posting?
Using Ademepire "GL Distribution"
Default Adempiere Account posting:
---------------------------------------------------------------- Account Debit Credit ---------------------------------------------------------------- Account Receivable 55.000.000 A tax 5.000.000 Service Revenue 50.000.000 ----------------------------------------------------------------
Desired Adempiere Account posting:
---------------------------------------------------------------- Account Debit Credit ---------------------------------------------------------------- Account Receivable 52.750.000 An Account 2.250.000 - which is 4.5%x50.000.000 A tax 5.000.000 Service Revenue 50.000.000 ----------------------------------------------------------------
Desired functionality can be achieved with Account splitting. Rule must be defined in the system which will split posting into Account Receivable on two account entries.
Implementor hints
Show where products are located
Submitted By: Jan Kantert (jab_doa)
Summary: Show where products are located
sf.net tracker: here
Initial Comment:
Log in as System Administrator. Select "Application Dictionary" -> "Window, Tab & Field" -> Name = Product
Click on "Tab". 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". Now save and click on "Create Fields". Thats it. Now you can see where your units are when zooming into a product.
Security
Submitted By: Armen (armenrz)
Summary: Security
sf.net tracker: here
1) ADempiere support role based security - Role window.
2) Role Data Access. You can also play around with SQLWhere in Window, Tab & Field.
Example: (instr('@#User_Level@','C')<>0 OR C_BPartner.CreatedBy=@#AD_user_ID@ OR C_BPartner.SalesRep_ID=@#AD_User_ID@)
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.
Bank Transfer tips
Submitted By: usman88
Summary: Bank Transfer tips
sf.net tracker: here
Small tips to handle 1 source Bank to 1 recipient Bank transfer transaction.
1. Create new cash journal.
2. Select appropriate cash book ( in my case i use dummy cash book to serve this transaction)
3. Next go to cash line and create a new line and select cash type as bank transfer.
4. Then select source bank account and type in transfer amount
5. Create 2nd line as in step 3.
6. This time select recipient bank account and type in transfer amount but in negative sign.
7. Back to cash journal tab, complete and post it.
8. To finalize it create, complete and post Bank statement for each bank account.
PS. Above tips can be use for more complex scenario such as transfer from 2 bank to 1 recipient.
Listing a BOM within a BOM
Submitted By: stingreye
Summary: Listing a BOM within a BOM
sf.net tracker: 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.
CREATE OR REPLACE VIEW BOM_INDENTED
(TOPLEVELID, TOPLEVEL, TOPLEVEL_DESC, PRODUCTNUM, PRODDEC,
M_PRODUCTBOM_ID, BOM_LEVEL, BOMQTY, DESCRIPTION, AD_CLIENT_ID,
AD_ORG_ID, ROWNUMBER, BOM_LEVEL_NUM, BOTTOMCOMPONENT)
AS
SELECT 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, 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
/
If you want to use materialized views... we did it the following way (I really 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
CREATE MATERIALIZED VIEW BOM_INDENTED_MV
(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
/
Then to refresh the materialize view we used the following database procedure where we used a parameter in the "report process" window to identify which MV to refresh:
CREATE OR REPLACE PROCEDURE Indented_Bom_Mv_Refresh
(
PInstance_ID IN NUMBER
)
AS
-- 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 ;
/
User authentication in Adempiere using LDAP
Submitted By: gemmiti
Summary: User authentication in Adempiere using LDAP
sf.net tracker: here
Enabling LDAP Functionality:
1. Log in as SysAdmin
2. Go to Menu > System Admin > System
3. In Field "Ldap URL" fill in your LDAP URL, i.e. "LDAP://YourLdapServer.com"
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 it will associate the correct credentials to the user you have set up in Compiere.
Add OnHandQty In Product window
Submitted By: stingreye
Summary: Add OnHandQty In Product window
sf.net tracker: here
First the SQL 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 2) So SQL = SELECT SUM (QTYONHAND) FROM M_STORAGE s 3) Now you want to sync with product table, so we add WHERE s.M_PRODUCT_ID = M_PRODUCT.M_PRODUCT_ID 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) Now lets add it to compiere: 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!
How to setup Workflow for PO Approval?
Workflow Simple approval
Workflow Dynamic approval
Changelog functionality
changelog functionality consists of two parts: who & what.
- Via tables user can identify "what" wish to log.
- Via roles "who".
By this way is possible to finely control the auditing. This means more tables to be flagged if user wish to log all tables.
Securing JBoss JMX Console and Web Console
SECURE SCENARIO to use Adempiere
- sf.net post by Carlos
Possible SECURE SCENARIO to use Adempiere (applicable Compiere installations also)
CLIENTS
- 1 - Don't install clients
- 2 - Install two servers - one for NX (call it NXServer), and the other for oracle and JBoss (call it ADServer)
- 3 - Allow clients just run through NX connection (you'll have total control of the ADempiere.properties in a linux box)
- 4 - Configure the ADServer to only accept connections from NXServer
- 5 - Configure the Oracle in ADServer to only accept connections from the same ADServer and from NXServer
SERVICES ON WEB
- 1 - Don't expose web services from jboss directly
- 2 - Install an apache server to expose in a controlled way just the needed services and pages from jboss adempiere
In this scenario NX can be replaced with any terminal server software (Microsoft TS, Citrix, Sun Global Secure Desktop, etc).
And you must incur in costs of terminal server software licensing - but security is not free.
And you must ensure all those servers - ensure NX, ensure oracle, ensure jboss, ensure apache, ensure linux, etc.
Product Attribute Instance - Color/Size/Serial number
- Color/Size in Product Attribute per Instance Very good explanation from Colin
Material transaction between two organizations
- sf.net post another good description from Colin
Maintain multiple environments(Postgre multiple schema managing)
- wiki pageGood description from Fernando
PostgreSQL Materialized Views
Report sales figures by product
1. Create a Report Line Set called All Products. 2. Create a Report Line under it called Product with a Line Type of Segment Value (leave Posting and Amount Types blank) 3. Create a Report Source under it with Type=Product and leave the Product field blank 4. Create a Report Column Set called Current Period and YTD 5. Create 2 report columns under it, one for Current Period and YTD. The first one should have Posting Type=Actual, Amount Type=Period Balance, Column Type=Relative Period, Relative Period=0. The second one should be the same except Amount Type=Year Balance. 6. Then create a Financial report using these Report Line and Columns Sets. Make sure to check List Sources when you run to see all the products. Warning, If there are more than 1000 products it won't work (we're obviously aware of this limitation and working on removing it).
You can easily produce a similar report for Sales by Business Partner by just substituting Type=Business Parter in Step 3.
How to monitor Oracle sessions?
SELECT SID, SERIAL#, STATUS, SERVER FROM V$SESSION WHERE USERNAME = 'ADEMPIERE';
How to get Oracle Character set?
SELECT * FROM nls_database_parameters
WHERE parameter = any('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
How to change document numbers?
Go to Performance
Analysis -> Accounting Rules -> Document Type
Here you can see all existing document types like Purchase Order etc. If the 'Document is Number Controlled' checkbox is checked then you will have a Document Sequence field (a drop down). Right click and zoom to the Document Sequence window
Performance Analysis -> Accounting Rules -> Document Sequence
Here you can change the current next value, the increment and you can add prefix and or suffix for your order/invoice numbers.
Where to place JasperReport files?
JasperReport can be defined as:
http:// https:// attachment: file:/ or a direct file_directory path
An easier way to deploy jasper reports could be putting the .jasper in the customization.jar
For that we could add a new prefix like:
resource:org/adempiere/jasper/MyReport.jasper
How to handle imprests?
How to process credit card payments from Java GUI?
How a user could create a payment in the client (not the webstore) that will get passed to the payment processor?
Window 'Invoice (Customer)'.
Complete 'Invoice (Customer)'.
Set Payment Type - Press Button which by default has value 'On Credit'.
A new window open and user can change payment Type from 'On Credit' to 'Credit Card'.
Enter Credit Card data.
How to add comment on printed Invoice?
A line without product, charge and qty = 0 will be printed as a comment on invoice.
BOM price explained.
https://sourceforge.net/forum/message.php?msg_id=4740301
BOM Product price is depend of the price of the products which built it.
For example Product A consist of 1 product B and 1 product C. Product B and C are being priced at USD 5 and USD 6 respectively. The price of Product A would be USD 11. You cannot change it.
Meanwhile we often find a case where the price of Product A IS NOT the price of product B or C combined. It can be higher or lower. I try to add price to product A, which not the combined price but it doesn't work. This is what happen.
I put price of USD 15 for product A. When I created Sales Order, and I chose product A the price was still USD 15. Everything felt right. And then the disaster came. When I click Complete button suddenly the price change to USD 11!
If the BOM is not stocked it is considered a 'basket; and will compute the price based on the component prices.
If you want to assign a price change it to 'stocked'
How to enable Multilingual documents?
Client Window -> Multilingual Documents
Language Window Language Maintenance -> Add missing translations
How Cost centers are implemented in Adempiere?
sf.net post Adempiere support cost center using organization setup( have a look at the organization and organization type setup). Also, the transact organization element could be turned on in accounting schema to handle this.
How to setup Extended Document Number Formatting?
Enhance Document No Formatting
@AD_Org_ID<Value>@ is replace by 'HQ' ( AD_Org.Value )
<Value> can be replaced by any other column from AD_Org table.
How to list General Ledger Transactions?
How to setup Manufacturing process
01. Define a Resource as Plant 02. Create your resource Type this will determinate the capacity for your resource 03. Create your resource (Production Line , Work Center , Work Station) 03. Create a Manufacturing workflow (routing) where you define the process to manufacturing your product, so you need define each step the process and assign the resource where will execute the work. 04. Create the BOM to manufacturing your product, you need define if will use BOM or Formulas. 05. Create Manufacturing Document . 06. Use the BOM and workflow to create a new Manufacturing order 07. Change the Document status from draft to in process 08. Use Component check 09. if your component are available then use Print & Release Order 10. use Order Receipt & issue to report the component and finish good.
How to Merge Business Partner entities?
If you merge Business Partners you may need to run: Partner Relations -> Business Partner Rules -> Validate Business Partner
to get the correct open amounts, Life time value, etc...
If you merge Products, first move any inventory out of the product you will be deleting as that is not done in the merge process.
Costing records are not merged!
How to display Key and Name?
How to Delete Client/Tenant
Both scripts are in svn:
http://adempiere.svn.sourceforge.net/viewvc/adempiere/contributions/stuff/ DeleteAdempiereClient.SQL (for oracle) DeleteAdempiereClient_pg.SQL (for postgresql)
init.d for centOS
Sql which set QtyInvoice = QtyOrdered for given Organization.
update c_orderline ol set ol.QTYINVOICED=ol.QTYORDERED where C_ORDER_ID in (SELECT C_ORDER_ID FROM C_Order o
WHERE DocStatus IN('CO','CL') AND IsSOTrx='Y'
AND AD_Org_ID=1000001
AND EXISTS (SELECT * FROM C_OrderLine ol
WHERE o.C_Order_ID=ol.C_Order_ID AND ol.QtyOrdered<>ol.QtyInvoiced)
);
commit;
How to translate root menu in Ademepire Swing GUI?
change class: org.compiere.grid.tree.VTreePanel.java
change method: public boolean initTree (int AD_Tree_ID)
add lines:
m_root = vTree.getRoot(); m_root.setName(Msg.getMsg(Env.getCtx(), vTree.getName() ) ); // translate name of menu. // m_root.setName(Msg.getMsg(Env.getCtx(), "Menu") ); // @Trifon; this is the hardcoded way.
How to translate root menu in Ademepire Zk Web UI?
change class: webui.desktop.java
change method: doCreatePart()
West w = new West();
layout.appendChild(w);
w.setWidth("300px");
w.setCollapsible(true);
w.setSplittable(true);
w.setTitle("Menu");
w.setTooltiptext("Application Menu");
How to fix issue: Active workflow for this record exists?
Sometimes Adempiere crashes while processing a document. This usually leaves the document jammed in between two states. If you try to reverse it and rather unhelpful error message says there is an active workflow which must be completed first. To complete the work flow go to Workflow -> Workflow process then in the grid view find the work flow process with who's record_ID is the same as the document in question. Switch to the tab view and click Manage Process -> then check 'Abort' -> click okay. Go back to the document, requery (blue arrows), and you should now be able to reverse the document.
How to setup embedded tab?
Example how to setup UOM Conversion tab as embedded in UOM tab.
Steps:
- 1
Window: "Unit of Measure"
Tab: "Unit of Measure"
Field: "C_UOM_ID" make it visible.
Field: "Included Tab" set value to: "Conversion"
- 2
Tab: "Conversion"
Set "Sql Where":
C_UOM_Conversion.C_UOM_ID=@C_UOM_ID@
How to enter Payment from BP to another BP?
easiest - reverse correct the payment and re-enter as if coming from the the BP with the invoices and enter notes/descriptions to show what happened. less easy - create an invoice to the BP who paid and put to a Charge pointing to a suspense account. enter a credit note to the BP with invoices and put to same charge then allocate the credit note against the invoices.
Location of Documantation Chapters?
Chapter 3: http://grovers.us/media/Ch_3_BPG_SetUp.pdf Chapter 4A: http://grovers.us/media/Ch4Sales&MarketingPrt1.pdf Chapter 4B: http://grovers.us/media/Ch4SalesOrderPrt2.pdf Chapter 5: http://grovers.us/media/finished.zip Chapter 6: http://grovers.us/media/ch6open_items.pdf
Developer hints
- class dbPort/org.compiere.process.DocActionTemplate shows a template for DocAction, i think that it must be updated.
- Video created by Tim; part 1
- Video created by Tim; part 2
- Open Window and Tab programmatically, sf.net post
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 constraint, please do not forget to execute proper UPDATE TABLE sql statements.
Example:
ALTER TABLE EXP_FormatLine
ADD IsPartUniqueIndex CHAR(1) CHECK(IsPartUniqueIndex IN ('Y', 'N'));
UPDATE EXP_FormatLine
SET IsPartUniqueIndex = 'N'
WHERE IsPartUniqueIndex IS NULL;
Hint-2; Be carefull when creating VIEWS
Use LEFT/RIGHT OUTER JOINS, because in many cases fields do not have values and INNER JOIN will not show all records. 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!
FROM C_Invoice i
INNER JOIN C_DocType d ON (i.C_DocType_ID=d.C_DocType_ID)
LEFT OUTER JOIN C_Order o ON (i.C_Order_ID=o.C_Order_ID)
Hint-3; Java on Ubuntu
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:
$ sudo update-java-alternatives -l
will see the versions of all javas installed into your system. In order to make the latest one default for the whole system type:
$ sudo update-java-alternatives -s java-newer-ver
Hint-4; How to truncate timestamp
Timestamp today = TimeUtil.trunc(new Timestamp (System.currentTimeMillis() ), TimeUtil.TRUNC_DAY);
Hint-5; How to use MTable.get(..) and MTable.getPO(..)
Class: base/src/org/compiere/model/MProduct.java
public MAttributeInstance getAttributeInstance(String name, String trxName)
{
MAttributeInstance instance = null;
MTable table = MTable.get(Env.getCtx(), MAttribute.Table_ID);
MAttribute attribute = (MAttribute)table.getPO("Name = ?", new Object[]{name}, trxName);
if ( attribute == null ) return null;
table = MTable.get(Env.getCtx(), MAttributeInstance.Table_ID);
instance = (MAttributeInstance)table.getPO(
MAttributeInstance.COLUMNNAME_M_AttributeSetInstance_ID + "=?"
+ " and " + MAttributeInstance.COLUMNNAME_M_Attribute_ID + "=?" ,
new Object[]{getM_AttributeSetInstance_ID(), attribute.getM_Attribute_ID()},
trxName);
return instance;
}
Subversion Access
Subversion Plugin for Eclipse Subversive
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: here
MFG
Important Steps:
1. Apply the following patches: 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!!!
Compiling adempiere + libero from SVN head
Libero Manufacturing functionality is in branch/stable and is not necessary to perform below steps!
1. Check out the head version of both libero and adempiere 2. Build adempiere 3. Build libero 4. Rebuild adempiere (to get the libero.jar into the install) 5. Set up the database. (Create database, run the pljava deployer, drop the sqlj schema, import the dump file) 6. Run the 330-trunk database migrations 7. Copy EE01.zip into the packages directory 8. Run silent setup and start the app server. 9. Launch the Adempiere client 10. Add the EE01 entity type 11. Pack in the EE01.zip 12. Copy libero.jar into the packages/packages/EE01/lib directory. 13. Re-run silentsetup and start the server.
Template Process and steps to create a process
1)create a java class extends org.compiere.process.SvrProcess
2)Implements two methods void doIt() String prepare()
In Prepare method you can get different parameters ProcessInfoParameter[] para = getParameter(); for (int i = 0; i < para.length; i++) { String name = para[i].getParameterName(); if (para[i].getParameter() == null)
else System.out.println(name); } and in doIt method you try to insert this parameters into your table after you create this class Login with system administrator role
3) 'Report and Process' window define your process with parameter 4) 'Table and Column' window choose your table and create a column with Button Reference
5) Choose your process for this Button
package org.adempiere.process;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
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();
}
}
Migration with SQL statements - Oracle - AD_Element
INSERT INTO AD_Element
(AD_Element_ID, AD_Client_ID, AD_Org_ID, IsActive,
Created, CreatedBy,
Cpdated, UpdatedBy,
ColumnName, EntityType, Name,
PrintName
)
VALUES (500XX, 0, 0, 'Y',
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
'[ColumnNameHere]', 'D', '[NameHere]',
'[PrintNameHere]'
);
COMMIT;
UPDATE AD_Sequence
SET CurrentNextSys = (SELECT MAX (AD_Element_ID) + 1
FROM AD_Element
WHERE AD_Element_ID < 1000000)
WHERE NAME = 'AD_Element';
Migration with SQL statements - Oracle - AD_Table
INSERT INTO AD_Table
(AD_Table_ID, AD_Client_ID, AD_Org_ID, IsActive,
Created, CreatedBy,
Updated, UpdatedBy,
Name, Description, Help, TableName,
IsView, AccessLevel, EntityType, AD_Window_ID,
AD_Val_Rule_ID, LoadSeq, IsSecurityEnabled, IsDeleteable,
IsHighVolume, ImportTable, IsChangelog, ReplicationType,
PO_Window_ID, CopyColumnsFromTable
)
VALUES
(53014, 0, 0, 'Y',
TO_DATE ('10/22/2007 09:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
TO_DATE ('10/22/2007 09:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
'[NameHere]', '[DescriptionHere]', '[HelpHere]', '[TableNameHere]',
'N', '4', 'D', null,
null, 0, 'N', 'Y',
'N', 'N', 'N', 'L',
null, 'N'
);
COMMIT;
UPDATE AD_Sequence
SET CurrentNextSys = (SELECT MAX (AD_Table_ID) + 1
FROM AD_Table
WHERE AD_Table_ID < 1000000)
WHERE NAME = 'AD_Table';
Migration with SQL statements - Oracle - AD_Column
INSERT INTO AD_Column
(AD_Column_ID, AD_Client_ID, AD_Org_ID, IsActive,
Created,
Updated, CreatedBy,
UpdatedBy, Name, Description, Version,
EntityType, ColumnName, AD_Table_ID, AD_Reference_ID,
FieldLength, IsKey, IsParent, IsMandatory, IsUpdateable,
IsIdentifier, SeqNo, IsTranslated, IsEncrypted,
IsSelectionColumn, AD_Element_ID, Callout, IsSyncDatabase,
IsAlwaysUpdateable
)
VALUES (502XX, 0, 0, 'Y',
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'),
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
100, '[NameHere]', '[DescriptionHere]', 1,
'D', '[ColumnNameHere]', AD_Table_IDHERE, AD_Reference_IDHere,
1, 'N', 'N', 'Y', 'Y',
'N', 0, 'N', 'N',
'N', 50071, '[CalloutHere]', 'N',
'N'
);
COMMIT;
UPDATE AD_Sequence
SET CurrentNextSys = (SELECT MAX (AD_Column_ID) + 1
FROM AD_Column
WHERE AD_Column_ID < 1000000)
WHERE NAME = 'AD_Column';
Migration with SQL statements - Oracle - AD_Window
INSERT INTO AD_Window
(AD_Window_ID,AD_Client_ID, AD_Org_ID, IsActive,
Created, CreatedBy,
Updated, UpdatedBy,
Name, Description, Help, WindowType,
IsSoTrx, EntityType, Processing, AD_Image_ID,
AD_Color_ID, IsDefault, WinHeight, WinWidth,
IsBetaFunctionality
)
VALUES (53003, 0, 0, 'Y',
TO_DATE ('10/22/2007 09:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
TO_DATE ('10/22/2007 09:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
'[NameHere]', null, null, 'M',
'N', 'D', 'N', null,
null, 'N', 0, 0,
'N'
);
COMMIT;
UPDATE AD_Sequence
SET CurrentNextSys = (SELECT MAX (AD_Window_ID) + 1
FROM AD_Window
WHERE AD_Window_ID < 1000000)
WHERE Name = 'AD_Window';
Migration with SQL statements - Oracle - AD_Tab
INSERT INTO AD_Tab
(AD_Tab_ID, AD_Client_ID, AD_Org_ID, IsActive,
Created, CreatedBy,
Updated, UpdatedBy,
Name, Description, Help, AD_Table_ID,
AD_Window_ID, SeqNo, TabLevel, IsSingleRow,
IsInfoTab, IsTranslationTab, IsReadOnly, AD_Column_ID,
HasTree, WhereClause, OrderByClause, CommitWarning,
AD_Process_ID, Processing, AD_Image_ID, ImportFields,
AD_ColumnSortOrder_ID, AD_ColumnSortYesNo_ID, IsSortTab, EntityType,
Included_Tab_ID, ReadOnlyLogic, DisplayLogic, IsInsertRecord,
IsAdvancedTab
)
VALUES (53014, 0, 0, 'Y',
TO_DATE ('10/22/2007 09:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
TO_DATE ('10/22/2007 09:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
'[NameHere]', null, null, [AD_TableIDHERE],
[AD_Window_IDHERE], [SeqNoHERE], 0, 'N',
'N', 'N', 'N', null,
'N', null, null, null,
null, 'N', null, 'N',
null, null, 'N', 'D',
null, null, null, 'Y',
'N'
);
COMMIT;
UPDATE AD_Sequence
SET CurrentNextSys = (SELECT MAX (AD_Tab_ID) + 1
FROM AD_Tab
WHERE AD_Tab_ID < 1000000)
WHERE Name = 'AD_Tab';
Migration with SQL statements - Oracle - AD_Field
INSERT INTO AD_Field
(AD_Field_ID, AD_Client_ID, AD_Org_ID, IsActive,
Created, CreatedBy,
Updated, UpdatedBy,
Name, Description, IsCentrallyMaintained, SeqNo, AD_Tab_ID,
AD_Column_ID, IsDisplayed, DisplayLength, IsReadonly,
IsSameLine, IsHeading, IsFieldOnly, IsEncrypted, EntityType
)
VALUES (50184, 0, 0, 'Y',
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
'Store Archive On File System', 'Store Archive On File System', 'Y', 250, 145,
50214, 'Y', 1, 'N',
'N', 'N', 'N', 'N', 'D'
);
COMMIT;
UPDATE AD_Sequence
SET CurrentNextSys = (SELECT MAX (AD_Field_ID) + 1
FROM AD_Field
WHERE AD_Field_ID < 1000000)
WHERE Name = 'AD_Field';
Migration with SQL statements - Oracle - AD_Menu
INSERT INTO AD_Menu
(AD_Menu_ID, AD_Client_ID, AD_Org_ID, IsActive,
Created, CreatedBy,
Updated, UpdatedBy,
Name, Description, IsSummary, IsSoTrx,
IsReadOnly, Action, AD_Window_ID, AD_Workflow_ID,
AD_Task_ID, AD_Process_ID, AD_Form_ID, AD_Workbench_ID,
EntityType
)
VALUES( 53012, 0, 0, 'Y',
TO_DATE ('10/22/2007 09:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
TO_DATE ('10/22/2007 09:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
'[NameHERE]', NULL, 'N', 'N',
'N', 'W', [AD_Window_IDHERE], NULL,
NULL, NULL, NULL, NULL,
'D'
);
COMMIT;
UPDATE AD_Sequence
SET CurrentNextSys = (SELECT MAX (AD_Menu_ID) + 1
FROM AD_Menu
WHERE AD_Menu_ID < 1000000)
WHERE Name = 'AD_Menu';
Migration with SQL statements - Oracle - AD_TreeNodeMM
INSERT INTO AD_TreeNodeMM
(AD_Tree_ID, Node_ID, AD_Client_ID, AD_Org_ID, IsActive,
Created, Createdby,
Updated, UpdatedBy, Parent_ID, SeqNo
)
VALUES (10, [Node_IDHERE], 0, 0, 'Y',
TO_DATE ('10/22/2007 09:30:00', 'MM/DD/YYYY HH24:MI:SS'), 0,
TO_DATE ('10/22/2007 09:30:00', 'MM/DD/YYYY HH24:MI:SS'), 0, [Parent_IDHERE], [SeqNoHERE]
);
COMMIT;
UPDATE AD_Sequence
SET CurrentNextSys = (SELECT MAX (AD_Menu_ID) + 1
FROM AD_Menu
WHERE AD_Menu_ID < 1000000)
WHERE Name = 'AD_Menu';
Migration with SQL statements - AD_Message
INSERT INTO AD_Message
(AD_Message_ID, AD_Client_ID, AD_Org_ID, IsActive,
Created, CreatedBy,
Updated, UpdatedBy,
Value, MsgText, MsgType
)
VALUES (500XX, 0, 0, 'Y',
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
TO_DATE ('02/26/2007 12:30:00', 'MM/DD/YYYY HH24:MI:SS'), 100,
'[VaueHere]','[MSG Text Here]','I'
);
COMMIT;
UPDATE AD_Sequence
SET CurrentNextSys = (SELECT MAX (AD_Message_ID) + 1
FROM AD_Message
WHERE AD_message_ID < 1000000)
WHERE NAME = 'AD_Message';
Migration with SQL statements - AD_Process_Para
INSERT INTO AD_Process_Para
(AD_Process_Para_ID, AD_Client_ID, AD_Org_ID, IsActive, Created,
CreatedBy, Updated, UpdatedBy, Name,
Description,
Help,
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';
Migration with SQL statements - AD_Ref_List - Postgre
INSERT INTO AD_Ref_List (
Created, CreatedBy, Updated, UpdatedBy,
AD_Org_ID, AD_Ref_List_ID, AD_Reference_ID,
Value, Name, IsActive, AD_Client_ID, EntityType
) VALUES (
TO_TIMESTAMP('2008-01-19 22:45:00','YYYY-MM-DD HH24:MI:SS'), 0, TO_TIMESTAMP('2008-01-19 22:45:00','YYYY-MM-DD HH24:MI:SS'), 0,
0, 53287, 329,
'DOO', 'Distribution Order', 'Y',0,'EE01'
);
Session_IsChangeLog, AD_Table.IsChangeLog, AD_Column.IsChangeLog combination
1. Session_IsChangeLog=no, AD_Table.IsChangeLog=no, AD_Column.IsChangeLog=no
=>is column logged: no
2. Session_IsChangeLog=no, AD_Table.IsChangeLog=no, AD_Column.IsChangeLog=yes
=>is column logged: no
3. Session_IsChangeLog=no, AD_Table.IsChangeLog=yes, AD_Column.IsChangeLog=no
=>is column logged: no
4. Session_IsChangeLog=no, AD_Table.IsChangeLog=yes, AD_Column.IsChangeLog=yes
=>is column logged: yes
5. Session_IsChangeLog=yes, AD_Table.IsChangeLog=no, AD_Column.IsChangeLog=no
=>is column logged: no
6. Session_IsChangeLog=yes, AD_Table.IsChangeLog=no, AD_Column.IsChangeLog=yes
=>is column logged: yes
7. Session_IsChangeLog=yes, AD_Table.IsChangeLog=yes, AD_Column.IsChangeLog=no
=>is column logged: no
8. Session_IsChangeLog=yes, AD_Table.IsChangeLog=yes, AD_Column.IsChangeLog=yes
=>is column logged: yes
Note: Session_IsChangeLog means: AD_Role.IsChangeLog or is a webstore session.
Observation1: as you see, AD_Column.IsChangeLog=Y means inherit policy from
parent (AD_Table) and AD_Column.IsChangeLog=N means never log this record.
PS: in future, i think we can move from IsChangeLog flag to some
ChangeLogPolicy=(Always, Never, Inherit from parent).
How to use Transactions and Save points in Adempiere
String trxName = Trx.createTrxName("test");
Trx trx = Trx.get(trxName, true);
Savepoint save1 = trx.setSavepoint("save1");
location = new MLocation(m_Ctx, 0, trxName);
...
trx.rollback(save1);
trx.commit();
trx.close();
How to build Adempiere customization.jar
Customization.jar is in the lib directory of trunk. (ie /trunk/lib ) Go to that directory and execute following commands:
jar uvf customization.jar -C ../libero/build/ ./org/compiere/model/ jar uvf customization.jar -C ../libero/build/ ./org/compiere/acct/ jar uvf customization.jar -C ../libero/build/ ./org/compiere/process/
Then goto utils_dev directory and ./RUN_build.sh
After the build has completed the new customized.jar will be in $ADEMPIERE_HOME/lib Adempiere should now use the customized classes.
How to Open Window from source code?
MQuery aQuery = new MQuery ("C_Invoice");
aQuery.setRecordCount(1);
aQuery.addRestriction("C_Invoice_ID", "=", C_Invoice_ID );
AWindow frame = new AWindow();
frame.initWindow(183, aQuery); // 183=window "Invoice (Vendor)"
frame.validate();
AEnv.showCenterScreen(frame);
How to keep parameter window open after view report?
How to create confirmation for inventory move?
How to make Adempiere LDAP username registration compatible with OpenLDAP
- StringBuffer principal = new StringBuffer (userName).append("@").append(domain);
+ // For OpenLDAP uncomment the next line
+ // StringBuffer principal = new StringBuffer("uid=").append(userName).append(",").append(domain);
+ StringBuffer principal = new StringBuffer(userName).append("@").append(domain);
env.put(Context.SECURITY_PRINCIPAL, principal.toString());
env.put(Context.SECURITY_CREDENTIALS, password);
How to use JSR 223: Scripting callouts in Adempiere?
How to get Adempiere/Compiere Home from java class?
org.compiere.util.Ini.findAdempiereHome()
How to set/update column ModelValidationClasses
Nice code from Carlos! Have to check if it works for Oracle and Postgre.
UPDATE AD_Client
SET ModelValidationClasses =
CASE
WHEN ModelValidationClasses LIKE '%org.adempiere.model.LCO_Validator%'
THEN ModelValidationClasses
WHEN LENGTH (TRIM (ModelValidationClasses)) = 0 OR ModelValidationClasses IS NULL
THEN TO_NCHAR ('org.adempiere.model.LCO_Validator')
ELSE
ModelValidationClasses || ';org.adempiere.model.LCO_Validator'
END
WHERE AD_Client_ID != 0
How to use Adempiere sequence from java code?
MSequence sequence = new MSequence(getCtx(), sequenceId, get_TrxName()); int nextId = sequence.getNextID(); sequence.save();
How to setup Adempiere ZK Development Environment
How to add new tab to Info Window
How to copy print format and how to invoke print preview from java?
Language language = Language.getLoginLanguage(); // Base Language
MPrintFormat pf = null;
int pfid = 0;
// get print format for client, else copy system to client
RowSet pfrs = MPrintFormat.getAccessiblePrintFormats(X_RV_PP_Product_BOMLine.Table_ID, -1, null);
pfrs.next();
pfid = pfrs.getInt("AD_PrintFormat_ID");
if(pfrs.getInt("AD_Client_ID") != 0) pf = MPrintFormat.get(getCtx(), pfid, false);
else pf = MPrintFormat.copyToClient(getCtx(), pfid, getAD_Client_ID());
pfrs.close();
if (pf == null) raiseError("Error: ","No Print Format");
pf.setLanguage(language);
pf.setTranslationLanguage(language);
// query
MQuery query = MQuery.get(getCtx(), AD_PInstance_ID, X_RV_PP_Product_BOMLine.Table_Name);
query.addRestriction("AD_PInstance_ID", MQuery.EQUAL, AD_PInstance_ID);
PrintInfo info = new PrintInfo(X_RV_PP_Product_BOMLine.Table_Name,
X_RV_PP_Product_BOMLine.Table_ID, getRecord_ID());
ReportEngine re = new ReportEngine(getCtx(), pf, query, info);
ReportCtl.preview(re);
// wait for report window to be closed as t_bomline
// records are deleted when process ends
while (re.getView().isDisplayable())
{
Env.sleep(1);
}
Some views
CREATE VIEW RV_OpenItemAcct AS SELECT item.AD_Client_ID , item.AD_Org_ID , item.DocumentNo , item.C_Invoice_ID , item.C_Order_ID , item.C_BPartner_ID , item.IsSOTrx , item.DateInvoiced , item.DateAcct , item.NetDays , item.DueDate , item.DaysDue , item.DiscountDate , item.DiscountAmt , item.GrandTotal , item.PaidAmt , item.OpenAmt , item.C_Currency_ID , item.C_ConversionType_ID , item.C_PaymentTerm_ID , item.IsPayScheduleValid , item.C_InvoicePaySchedule_ID , item.InvoiceCollectionType , item.C_Campaign_ID , item.C_Project_ID , item.C_Activity_ID , combCust.Combination AS custCombComination , combCust.Description AS custCombDescription , combVend.Combination AS custVendComination , combVend.Description AS custVendDescription FROM RV_OpenItem item LEFT OUTER JOIN C_BP_Customer_Acct custAcct ON (item.IsSoTrx= 'Y' AND item.C_BPartner_ID = custAcct.C_BPartner_ID AND custAcct.C_AcctSchema_ID=101) LEFT OUTER JOIN C_ValidCombination combCust ON (custAcct.C_Receivable_Acct = combCust.C_ValidCombination_ID) LEFT OUTER JOIN C_BP_Vendor_Acct vendAcct ON (item.IsSoTrx= 'N' AND item.C_BPartner_ID = vendAcct.C_BPartner_ID AND vendAcct.C_AcctSchema_ID=101) LEFT OUTER JOIN C_ValidCombination combVend ON (vendAcct.V_Liability_Acct = combVend.C_ValidCombination_ID)
How to call stored procedure from java?
CallableStatement cs = null;
cs = DB.prepareCall("{call AD_Sequence_Next(?,?,?)}");
cs.setString(1, "A_Asset_Change");
cs.setInt(2,imp.getAD_Client_ID());
cs.registerOutParameter(3, java.sql.Types.INTEGER);
cs.execute();
int value = cs.getInt(3);
How to add Value column to Existing Adempiere table?
- Parameters:
- TableName = 'M_Attribute'
- AD_Client_ID = 11
- Add Value column
ALTER TABLE M_Attribute ADD Value NVARCHAR2(40)
- Make values unique
- Make values unique - version 1
UPDATE M_Attribute Set Value = nextidfunc( (SELECT AD_Sequence_ID FROM AD_Sequence WHERE AD_Client_ID = 0 AND Name = 'M_Attribute')::integer, 'N'::varchar) WHERE M_Attribute.Value IS NULL AND M_Attribute.AD_Client_ID = 11
- Make values unique - version 2
UPDATE M_Attribute Set Value = nextidfunc(691, 'N'::varchar) WHERE M_Attribute.Value IS NULL AND M_Attribute.AD_Client_ID = 11
- Add Unique contraint
- Add Unique contraint - version 1
ALTER TABLE M_Attribute ADD Constraint M_Attribute_Value UNIQUE(AD_Client_ID, Value)
- Add Unique contraint - version 2
CREATE UNIQUE INDEX M_Attribute_Value ON M_Attribute(AD_Client_ID, Value)
How to speedup Record Change Log?
- sf.net post
- Oracle
create index ad_changelog_speed on ad_changelog (ad_table_id, record_id);
- Postgre
create index ad_changelog_speed on ad_changelog (ad_table_id, record_id);
Log management in Adempiere?
Adempiere uses Java logging capabilities. Responsible classes are:
base/src/org.compiere.util.CLogMgt
Configuration files:
base/src/org/compiere/util/logClient.properties base/src/org/compiere/util/logServer.properties
Adempiere initiative: Remove SQL code and Replace with Query class!
- Description to use in svn commits:
One class per day initiative. FR: [ 2214883 ] Remove SQL code and Replace for Query https://sourceforge.net/tracker/?func=detail&atid=879335&aid=2214883&group_id=176962
How to use Adempiere Query class?
How to return only ONE object?
StringBuffer whereClause = null;
whereClause = new StringBuffer("AD_Client_ID=?" // #1
+ " AND AD_Org_ID=?" // #2
+ " AND C_AcctSchema_ID=?" // #3
+ " AND Account_ID=?"); // #4
ArrayList<Object> params = new ArrayList<Object>();
params.add(AD_Client_ID);
params.add(AD_Org_ID);
params.add(C_AcctSchema_ID);
params.add(Account_ID);
Account existingAccount = new Query(ctx, MAccount.Table_Name, whereClause.toString(), null)
.setParameters( params )
.first();
How to return ARRAY of objects?
public static MAchievement[] getOfMeasure (Properties ctx, int PA_Measure_ID)
{
String whereClause = "PA_Measure_ID=? AND IsAchieved='Y'";
List<MAchievement> list = new Query(ctx, MAchievement.Table_Name, whereClause, null)
.setParameters(new Object[]{PA_Measure_ID})
.setOrderBy("SeqNo, DateDoc")
.list()
;
MAchievement[] retValue = new MAchievement[ list.size() ];
retValue = list.toArray (retValue);
return retValue;
}
How to return ARRAY of objects and process elements?
public static MAchievement[] getOfMeasure (Properties ctx, int PA_Measure_ID)
{
String whereClause = "PA_Measure_ID=? AND IsAchieved='Y'";
List<MAchievement> list = new Query(ctx, MAchievement.Table_Name, whereClause, null)
.setParameters(new Object[]{PA_Measure_ID})
.setOrderBy("SeqNo, DateDoc")
.list()
;
for(MAchievement achievement : list)
{
s_log.fine(" - " + achievement);
}
MAchievement[] retValue = new MAchievement[ list.size() ];
retValue = list.toArray (retValue);
return retValue;
}
How to pass Timestamp parameter?
Timestamp dateAcct = ...;
String trxName = ...;
String whereClause = "c.C_CashBook_ID=?" // #1
+ " AND TRUNC(c.StatementDate)=?" // #2
+ " AND c.Processed='N'";
MCash retValue = new Query(ctx, MCash.Table_Name, whereClause, trxName)
.setParameters(new Object[]{C_CashBook_ID, TimeUtil.getDay(dateAcct)})
.first()
;
How to use Query class with complex where clause: EXISTS?
String whereClause = "C_Cash.AD_Org_ID=?" // #1
+ " AND TRUNC(C_Cash.StatementDate)=?" // #2
+ " AND C_Cash.Processed='N'"
+ " AND EXISTS (SELECT * FROM C_CashBook cb "
+ "WHERE C_Cash.C_CashBook_ID=cb.C_CashBook_ID AND cb.AD_Org_ID=C_Cash.AD_Org_ID"
+ " AND cb.C_Currency_ID=?)" // #3
;
MCash retValue = new Query(ctx, MCash.Table_Name, whereClause, trxName)
.setParameters(new Object[]{AD_Org_ID,TimeUtil.getDay(dateAcct),C_Currency_ID})
.first()
;
How to use Adempiere MQuery class?
- example 1
MQuery aQuery = new MQuery(X_C_Invoice.Table_Name);
aQuery.setRecordCount( 1 );
aQuery.addRestriction("C_Invoice_ID", "=", C_Invoice_ID );
- Example 2
MQuery query = MQuery.get(getCtx(), AD_PInstance_ID, X_RV_PP_Product_BOMLine.Table_Name);
query.addRestriction("AD_PInstance_ID", MQuery.EQUAL, AD_PInstance_ID);
Adempiere utility classes?
- base/org.compiere.util.TimeUtil
Base Language functionality
Revision: 6839
http://adempiere.svn.sourceforge.net/adempiere/?rev=6839&view=rev
Revision: 6810
http://adempiere.svn.sourceforge.net/adempiere/?rev=6810&view=rev
contributions/Localizations/Germany/src/migration/postgresql/baselanguage/baselanguage.sql
contributions/Localizations/Germany/src/migration/postgresql/baselanguage/baselanguage_views.sql
Revision: 6809
http://adempiere.svn.sourceforge.net/adempiere/?rev=6809&view=rev
contributions/Localizations/Germany/src/java/org/compiere/apps/ALogin.java
contributions/Localizations/Germany/src/java/org/compiere/cm/utils/CMEnv.java
contributions/Localizations/Germany/src/java/org/compiere/util/Language.java
contributions/Localizations/Germany/src/java/org/compiere/wstore/PriceListTag.java
contributions/Localizations/Germany/src/java/org/posterita/core/businesslogic/ElementManager.java
Differences in source code between Adempiere 3.5.0 and Compiere 3.0.0
Context
- Adempiere
Env.setContext(Env.getCtx(), "#AD_User_ID", CreatedBy_ID);
- Compiere
Env.getCtx().setContext("#AD_User_ID", CreatedBy_ID);
Build, Imports
- Compiere
import org.compiere.util.Ctx; import org.compiere.framework.PO;
add projects 'ad' and 'common' to build path.
Keeping sources compatible with Adempiere 3.5.0 and Compiere 3.0.0
Context
/* $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$ */
Example
// =================
/* $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$ */
How to Validate conditional mandatory field?
Timestamp start = getTimeSlotStart(); if (start == null) throw new FillMandatoryException(COLUMNNAME_TimeSlotStart);
How to enable Query TimeOut in Adempiere?
Specify JVM parameter
-Dorg.adempiere.po.useTimeoutForUpdate=true
How to decrease number of log files created by Java WebStart?
Problem is missing ADEMPIERE_HOME on the machine. Webstart works fine without environment variable set, only resulting in many many logfiles. After setting the variable to c:\adempiere it created the log folder and used just one file per session as expected.
How to post accounting transactions without Application Server?
Add new jvm system property:
org.adempiere.server.embedded
License to use for new classes
/********************************************************************** * This file is part of Adempiere ERP Bazaar * * http://www.adempiere.org * * * * Copyright (C) Trifon Trifonov. * * Copyright (C) Contributors * * * * 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$ */
How to add new Actions to Document Engine
Edit class
base/src/org/compiere/process/DocumentEngine.java
Add new if statements:
+ /********************
+ * Manufacturing Order
+ */
+ else if (AD_Table_ID == MPPOrder.Table_ID)
+ {
+ if (docStatus.equals(DocumentEngine.STATUS_Drafted)
+ || docStatus.equals(DocumentEngine.STATUS_InProgress)
+ || docStatus.equals(DocumentEngine.STATUS_Invalid))
+ {
+ options[index++] = DocumentEngine.ACTION_Prepare;
+ options[index++] = DocumentEngine.ACTION_Close;
+ }
+ // Complete ... CO
+ else if (docStatus.equals(DocumentEngine.STATUS_Completed))
+ {
+ options[index++] = DocumentEngine.ACTION_Void;
+ options[index++] = DocumentEngine.ACTION_ReActivate;
+ }
+ }
Adempiere Export/Import Tools
- ADCK can be used in two modes.
- As Development tool. To model DB design and create/modify tables.
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: hibernate, 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!!!
| 2Pack | ADCK |
| menu | menu |
| window | window |
| tab | tab |
| field | field |
| process | process |
| processpara | processpara |
| table | table |
| column | column |
| impformat | AD_ImpFormat |
| impformatrow | AD_ImpFormat_Row |
| printformat | AD_PrintFormat |
| printformatitem | AD_PrintFormatItem |
| reference | [[ADCK |]] |
| referencelist | [[ADCK |]] |
| referencetable | [[ADCK |]] |
| reportview | [[ADCK |]] |
| reportviewcol | [[ADCK |]] |
| task | [[ADCK |]] |
| form | [[ADCK |]] |
| workbench | [[ADCK |]] |
| preference | [[ADCK |]] |
| role | AD_Role |
| ??? | AD_User |
| userrole | AD_User_Roles |
| orgrole | AD_Role_OrgAccess |
| windowaccess | AD_Window_Access |
| processaccess | AD_Process_Access |
| formaccess | AD_Form_Access |
| workflowaccess | AD_Workflow_Access |
| taskaccess | [[ADCK |]] |
| ??? | AD_Column_Access |
| ??? | AD_Language |
| ??? | AD_Message |
| ??? | AD_PrintTableFormat |
| ??? | AD_Scheduler |
| ??? | C_BP_Group |
| ??? | M_Product_Category |
| ??? | PA_ReportColumnSet |
| ??? | PA_ReportColumn |
| ??? | PA_Report |
| ??? | PA_ReportLineSet |
| ??? | PA_ReportLine |
| ??? | PA_ReportSource |
| ??? | AD_Client |
| 2Pack Any Table | ADCK Any Table |
| ??? | TEMPLATE |
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.
- 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
SOUNDX support
Computerized Maintenance Management System
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
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
Avoid usage of clearing accounts
Tracker also contains a .doc file which show the effect of the change and he scripts to test it with GardenWorld.
Add more query method to MTable
Date: 2007-08-21
MTable has new method:
public Query createQuery(String whereClause, String trxName)
{
return new Query(this, whereClause, trxName);
}
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.
Reorganization of Adempiere menu
<menu name="" >
<menu name="Export Format" >
<window name="Export Format" />
</menu>
</menu>
Suggested menu:
<menu name="Quote-to-Invoice" >
<menu name="Sales Orders" >
<menu name="Rules" >
<window name="" />
...
</menu>
<menu name="Transact" >
<window name="" />
...
</menu>
<menu name="Report and Inquire" >
<window name="" />
...
</menu>
<menu name="Processes" >
<window name="" />
...
</menu>
</menu>
<menu name="Shipments" >
<menu name="Rules" >
<window name="" />
...
</menu>
<menu name="Transact" >
<window name="" />
...
</menu>
<menu name="Report and Inquire" >
<window name="" />
...
</menu>
<menu name="Processes" >
<window name="" />
...
</menu>
</menu>
</menu>
How to add chache suport for persistent class?
Add class variable to hold reference to Cache.
public class MActivity extends X_C_Activity
{
/** Static Cache */
private static CCache<Integer, MActivity> s_cache = new CCache<Integer, MActivity>(Table_Name, 30);
Change getXxxx method
public static MActivity get(Properties ctx, int C_Activity_ID)
{
if (C_Activity_ID <= 0)
{
return null;
}
// Try cache
MActivity activity = s_cache.get(C_Activity_ID);
if (activity != null)
{
return activity;
}
// Load from DB
activity = new MActivity(ctx, C_Activity_ID, null);
if (activity.get_ID() == C_Activity_ID)
{
s_cache.put(C_Activity_ID, activity);
}
else
{
activity = null;
}
return activity;
}
CRM systems
- CiviCRMOriented towards advocacy, non-profit and non-governmental groups.
- Free CRM; provides free and paid subsription
- Zoho CRM Free for up to 3 users
- Import Leads from Excel via Email into Microsoft CRM Interesting. Adempiere has the same two phase approach. Temporary table and after that process which import into real table.
Comparison of CRM systems
- interesting post regarding different offers of CRM packages
- CRM Heaven or CRM Hell? Seven Options Reviewed From the Trenches
Localized in Bulgarian
Interesting news/Forum post regarding CRM systems
- SOAP Performance Issue Loading Accounts Strange advice "database to database conversion"! But for CRM system probably it is OK!
- SugarCRM for blind man's (disabled people) Very interesting requirements!
- DimDim
- vi /usr/local/dimdim/Mediaserver/mods/lighttpd.conf and leave port 80 not 81 then vi /usr/local/dimdim/ConferenceServer/apache-tomcat-5.5.17/webapps/dimdim/WEB-IN F/classes/resources/dimdim.properties dimdim.ServerAddress=SERVER_ADDRESS dimdim.serverPortNumber=81 dimdim.dmsServerAddress=SERVER_ADDRESS:81 dimdim.dmsServerInternalAddress=localhost:81 then - vi /usr/local/dimdim/ConferenceServer/apache-tomcat-5.5.17/webapps/dimdim/WEB -INF/classes/resources/streaming.properties and modifiy port from 80 to 81 streaming_server.2.rtmp_url=http://SERVER_ADDRESS:81/screenshare/ streaming_server.2.rtmpt_url=http://SERVER_ADDRESS:81/screenshare/ streaming_server.2.max_number_of_streams=-1 streaming_server.2.supported_stream_types=DTP locate server.xml and modify port on 81 restart dimdim and go to http://SERVER_ADDRESS:81/dimdim * NOTE if made this cherrypy dont give error for / at final... Control port 443 and 1935 The dimdim start well
- 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.
- www.qinvoicing.comExports data from QInvoice itno OsCommerce.
- Apex Email Services www.salesforce.com
- SugarCRM Model-View-Controller implementation
- Developing a Simple Workflow within SugarCRM
Wiki
XWiki
MFG/MRP - Manufacturing
Articles
- Definition of MRP - Material Requirement Planning
- Materials requirements planning (MRP)
- OpenBravo - User Manual: Production Management
- OpenBravo - Functional Documenation: Production Management
Manufacturing Terminology
Queue time
Amount of time a person, signal, or thing spends before being attended to, or before value adding work is performed to or on it. In many factories queue time constitutes about 90 percent of the total lead time. It is a subset of cycle time.
Queuing time
The time between the arrival of material at a workstation and the start of work on it
Cycle time
Period required to complete one cycle of an operation; or to complete a function, job, or task from start to finish. Cycle time is used in differentiating total duration of a process from its run time.
Waiting time
Period at job for which an employee is paid but is unable to work due to factors beyond his or her control. Also called allowed time, downtime, or idle time.
ERP Systems
- Average price of ERP Good article. Shows TCO.
- TinyERP design
- PostBook Server part build with Postgre SQL procedures.
- Good points[9]:
- - Amazing categories in master data setup - accounting and so on.
- - Very user-friendly forms
- Good points[9]:
- Weak points:
- - PostBooks has not workflow (or i could not find it) and ERP system without workflow is meaningless.
- - Only desktop application
- - Technical weakness are DB Stored procedures.
- Weak points:
- Dolibarr ERP/CRMBuild on Apache, Mysql, PHP.
- OpenBlueLab Model Driven Design
- OpenJades
- GardeniaSource code is older than binary release.
- SAP Bets the Future on Business By DesignQuite expensive solution - min 25 user x 125 / month = 3125 / month x 12 = 37 500 USD year.
- Price comparison
Small ERP/POS/MFG/WMS/Billing systems
- acacia-business-aceAcacia Business Ace is ERP+CRM like system.
- OpenSubsystems
- BlaxJava-Swing application for optimized POS-Management and inventory management.
- StoreMgrintended to be a cross-platform open-source point of sale system for small businesses.
- Financial Portal
- EBI Neutrino R1
- o2StoreWarehouse and Point Of Sale (POS)Managment System
- J Chemical Mixing Manufacturing System
- StrangeBrew Brewing software written in Java.
- PlayBillingWebbased billing system for internet cafe and wireless hotspot.
- Quality Complaint Management SystemAutomotive Quality complaint Management to record Customer incident.
- RaplaMulti-user resource and event management system.
- ASDN"Agile Supply Demand Networks" is software for analyzing and developing logistics networks.
- POS by Linux CanadaLooks like nice POS.
- www.simpleinvoices.orgPHP based
ERP Requirements
Features that a composite of UK government bodies classified as Mandatory, Highly Desirable and nice-to-have in financial systems. Chapter 9 sets out their requirements on fixed assets. List they came up seems to have general application.
- Historic Data
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.
ERP Books
ERP articles
Historic Data
- German Needs in ERP Area
- JTemporal
- Temporal database
- Temporal PatternsMartin Fowler
- Temporal PropertyMartin Fowler
Open Standards
- OAccounts
- OASIS UBL
University ERP systems
On Demand ERP systems
- ERP5
- www.plex.comGood web site.
Comparison of Open Source ERP Systems
SAP
- Shattering the SAP mythLists SAP Business One features
- SAP Business One Pros/Cons
- Data Governance using SAP MDM - Part 1
- Data Governance using SAP MDM – Part 2SAP Master Data Governance
Compiere
My opinion is that this is very outdated information, but who knows...
- Interesting posts from Compiere forums
- sf.net forum postAlbert totally killed Compiere Inc.
Take over Compiere you need Albert
- [10]HR and Payroll built on Compiere;
- sf.net post
- Introduction to CompiereIntersting how people use buzz words like SOA and make produce non true statements. Compiere is not SOA application! Where are the Service in Compiere? Who cares? Important is to make good advertisement :)
OpenBravo
- Web Services
- Openbravo and eZ Publish interoperability
- Google Spreadsheet - product priorities
- Translation and Localization for Bulgaria
- nice mesage about non existing functionality.
this functionality does not exist in Openbravo standard product. However, this should be a relatively simple extension to build, especially in release 2.50 where there is a full layer of APIs that allow you to read and write transactional data using RESTful web services. You could also build this functionality as a reusable module and share it with the rest of the community.
OpenBravo POS
- DB Settings
- hsqlDB as Standalone Server
MUST Start Hsql Db FIRST!
jdbc:hsqldb:hsql://localhost/xdb;shutdown=true
- hsqlDB as Embedded Server - 1
jdbc:hsqldb:file:C:\adempiere-cd\workspace\adempiere-stable\Openbravo POS\sampledb\openbravopos-db;shutdown=true
- hsqlDB as Embedded Server - 2
jdbc:hsqldb:file:C:\Users\trifon\openbravopos-db;shutdown=true
Open Compiere
- list with bug fixes transfered from Adempiere Amazing - EDI is part of it :) - Thank you!
MES - Manufacturing Execution System
WMS - Warehouse Management System
- sf.net
POS
POS Hardware
TouchScreen
Tina POS
Weak sides
Questions and Answers
How to add Dual currency?
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;
- 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;
- 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;
Web Shops
Magento
Summer Cart
osCommerce
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)
Screen capture programs
J2EE
Installer Programs
Java related
- Dynamic Proxy
- Example Adempiere JPA persistance
- Configuring Inheritance for a JPA Entity; Explanation why Teo likes DiscriminatorColumn
- Hello world with standalone java persistence
- JACOBThe JACOB Project: A Java-COM Bridge
- Java based Wizards
- Java DNS
- Java Properties
- Java Tip 135: Layer and compare property filesA utility for comparing and combining property files eases multilayer property file organization
- PropDiff
- Amazon S3Browse site
- Uploading to Amazon S3 using a custom ANT task
- Introduction to Amazon S3 with Java and REST
- What are the common methods used for session tracking
- Reall Java How To
- How to write Iterators really REALLY fast
- JVM-level clustering technology
- Calendar
- Bedework: Open Source Calendar for the Enterprise
- GCALDaemonOS-independent Java program that offers two-way synchronization between Google Calendar and various iCalendar compatible calendar applications. GCALDaemon is primarily designed as a calendar synchronizer but it can also be used as a Gmail notifier, Address Book importer, Gmail terminal and RSS feed converter.
- TreeTable example (with source code)
- Article: Gantt Charts With JXTreeTable
- CheckboxTreeJava Swing component that provides a Tree with Checkboxes in every node.
- Swing app in JDK6 continues to rendering slow in Windows Terminal Server
- RSS lib
- MVN forum Java based forum
- Swing-based tree layouts with CheckboxTreeA configurable tree component with checkable nodes
- How To Simulate Telnet Session in Java
- Glazed Lists
- JTable filtering with Glazed ListsUse list transformations to add text filtering to your application
- Swing model filteringUsing filter objects to reinterpret data and state models
- Java and email clients
- Links to emails clientsnot only in java
- mail clients in java
- JWMAWeb email client written in java.
- ColumbaGood one, but not active since.
- PHP email cleints
- www.atmail.comCommercial, but has good interface and provides php sources.
Tutorial
- www.laliluna.deDifferent tutorials: Database Layer, Java Persistence, Hibernate,
- http://stores.lulu.com/java-successDifferent tutorials: Java, Eclipse, Maven, JSF, Hibernate, Spring, HSQL, JSF, Facelets, Spring-JSF
- www.vogella.deJava Preferences API Tutorial, Java and SAP - Connnecting via the Java Connector (JCo), Programming Mobile Applications with the Java Micro Edition - Tutorial, Developing JavaFX applications with Eclipse - Tutorial
Performance
- Performance Stress Tools
Embedded applications/hardware based on java.
Hibernate
- Hibernate Synchronizer Eclipse plig-in which automatically generate java code when your hibernate mapping files are modified.
Articles/Documentation
- 16.2. Named SQL queries
- 12 things I bet you didn’t know about Hibernate
- Database Configurations
- Avoiding ORM Performance Pitfalls
- Batch inserts in hibernate
- Spatial Search with Hibernate+Lucene
- Interceptors
- Using a Hibernate Interceptor To Set Audit Trail PropertiesVery good article!
DAO - Data Access Object
- DAO - live or Die?
DAO Frameworks
- HadesUtility library to work with Data Access Objects implemented with Spring and JPA. The main goal is to ease the development and operation of a data access layer in applications.
- hibernate-generic-daoGeneric DAO implementation: extendable, detailed search, remote service interface
- JingDAOJava based DAO framework.
JPA
- The Java Persistence API - A Simpler Programming Model for Entity Persistence
- Defining your Object model with JPA Good article
- Optimistic Concurrency Checking
- Object Relational Mapping Persistence Layer Very interesting. It has features which are good and do not exist in JPA. Like getting access to java.sql.Connection.
- Binding Database Table to a Table Component Using JPA
- Good documentation
Dynamic model; Adding columns runtime
- Hibernate
- Using Hibernate to Support Custom Domain Object FieldsDynamic/Runtime column addition.
- Hibernate and dynamic models
Data/Properties Binding
- Mogwai DataBindingframework to bind Java Beans / Pojo's to Swing visual components. It extends the Swing MVC architecture and supports a Mircosoft Document/View style handling.
- Bean-dependent or Bean-independent Properties? Lets Battle it Out!It looks that JSR-295 (Beans Binding) is going to start good discussion regarding type of Ben Properties.
- Synchronizing Properties with Beans Binding (JSR 295)
- Beans Binding: A Java Data-Binding Solution with a Serious Problem
- Beans Binding Via The Road Less Travelled By (Part 1)
Bean Validation
- OValObject validation framework for Java™ 5 or later
Loggin Frameworks
- Pax LoggingThe logging support in the standard Log Service of the OSGi specification is minimalistic and not entirely suitable for enterprise applications. This project tries to address this by extending the standard interface with additional interfaces and using a strong logging backend, the Apache Log4J. Pax Logging defines its own API, but more importantly it supports the Log4J and Jakarta Commons Logging APIs as well, making it easy to create bundles that use these common APIs, either directly in new code or indirectly from inside 3rd party libraries.
Beautiful Code
Java Tips
- Java 7 features
- How to show web start console
- How to debug java applet?
- Unofficial Java Web Start/JNLP FAQ
- Java Thread Dump Ctrl+Break
- An Introduction to Java Stack Traces
- Java ThreadLocal
- Deliver Your Java Application in One-JAR!
- JSON visualization plugin for Eclipse
- Java Expression Languages
- Java Localization and Internationalization
- Iterating through entries of Map or EntrySet
// Assuming map = Map<String, String>
for (Iterator iter = map.entrySet().iterator(); iter.hasNext();)
{
Map.Entry entry = (Map.Entry)iter.next();
String key = (String)entry.getKey();
String value = (String)entry.getValue();
}
- Parsing date with java DateFormat
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.ENGLISH);
df.parse("02/20/08 10:10 pm"); // Works
df.parse("02/20/08 10:10"); // Fails
Frameworks
WidgetServer is a component based, server-side, Java/XML rich-client-framework which enables an application to run as either
- 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 - a standalone application with a Swing GUI, - a client/server application with a thin Swing client, - or a mobile application on different devices like PDAs or Smartphones
- Roma FrameworkRoma allows you to develop enterprise level Java applications with low effort following a real Domain Driven Design approach.
- Woko extensible Object-Oriented Wiki, where you don't browse or edit pages, but objects ! It's a mix of pure OOP, a generous portion of Domain Driven Development, a slice of good old MVC, and lots of other ingredients, all served hot in your browser.
- Qi4jQi4j is an implementation of Composite Oriented Programming, using the standard Java 5 platform, without the use of any pre-processors or new language elements.
- Apache CXFAn Open Source Service Framework. CXF helps you build and develop services using frontend programming APIs, like JAX-WS. These services can speak a variety of protocols such as SOAP, XML/HTTP, RESTful HTTP, or CORBA and work over a variety of transports such as HTTP, JMS or JBI.
Pivot Framework
- PivotPivot is an open-source framework for building high-quality, cross-platform applications that are easily deployable both via the web and to the desktop.
- Pivot ToolkitAn open-source framework for building high-quality, cross-platform applications that are deployable both via the web and to the desktop. It began as an R&D effort at VMware but has now been made available to the community as an option for developers who want to build rich internet (RIA) applications in Java.
Eclipse Riena
- Eclipse Riena: Business-Oriented Client/Server Applications
- Riena Milestone 3 ships new UI for RCP applications
Spring
- Introducing the Spring Framework
- Open-tidesweb foundation framework that can be used to quickly setup a web application using Spring MVC and JPA.
- Built-in security. Integrated with ACEGI Security and pre-configured.
- Support for CRUD pages. Uses JPA/Hibernate for CRUD operations.
- Search By Example. CRUD pages includes built-in search criteria.
- Audit Logging. Entities can be easily audited.
- Email notification. Email notifications and alerts are pre-configured.
- Workflow
Spring Integration
- Spring Integration: a new addition to the Spring portfolio
- [11]
- Spring Integration boosts service-based apps
Impala
- ImpalaA dynamic module framework for Java-based web applications, based on the Spring Framework. With a focus on simplicity and productivity, Impala radically transforms application development using Spring and related technologies, such as Hibernate, JMX, and other technologies.
Struts
- Bridge the gap between Struts and HibernateExtend Struts for a more object-oriented relationship with Hibernate
NetKernel
Apache Beehive
MD4J
- MD4JMD4J is a passive, model driven, extensible J2EE webapp generator. Currently Hibernate 3 mappings are supported as input, with EJB 2.1, Struts 1.x and JSP 2.0 as output for CRUD and Search operations with patterns like MVC, DAO and SessionFacade. Ant task included.
InPowerForms
- http://www.inpowersoft.com/Accelerate Database-Driven Application Development For Java Rich Client Platforms.
CRUD Frameworks
Krank
Test Frameworks
GUI Test Frameworks
- Open Source
- AbbotJava GUI Test Framework.
- FEST Swing Module
Web UI Test Frameworks
- SeleniumVery interesting features.
Design Patterns, Design metrics, QA, UML
- JDepend JDepend traverses Java class file directories and generates design quality metrics for each Java package. JDepend allows you to automatically measure the quality of a design in terms of its extensibility, reusability, and maintainability to manage package dependencies effectively.
UML
- www.websequencediagrams.comUML Sequence Diagrams in web.
Java and IM
- Yahoo Instant Messenger Support for Java
- yowlCentralised notification system for use in web applications
Notification/IM Programs
- growl.infoGrowl lets Mac OS X applications unintrusively tell you when things happen.
- SnarlWindow based notification proglram like Growl.
IRC
- IRClib IRC library
- Martyr - A Java IRC Library
- PircBot Java IRC BotVery nice! SpeechBot, LogBot and other based on PircBot.
IRC Log Analyzers
- pisgLogfile analyzer. Statistics Generator.
IRC Articles
Java Content Repository API
- Introducing the Java Content Repository API
- What is Java Content Repository
- Catch Jackrabbit and the Java Content Repository API
Autocompletion
CI - Continuous Integration
DI (Dependency Injection) or IoC (Inversion of Control)
- Easier Custom Components with Swing Fuse
- Dependency Injection - 3 Questions!
- Create a Simple IoC Container Using Annotations
Java Graph/Report packages
- Linguine MapsProvides clean object-oriented diagramming API for graph visualization. It visualizes Apache Ant files, Hibernate and Apache Object Relational Bridge mapping files, DTD's for XML and more.
- Graphviz - Graph Visualization Software
- Result after google search for "Graphviz Java"
