/****************************************************************************** * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. 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., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * * For the text or an alternative of this public license, you may reach us * * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * * or via info@compiere.org or http://www.compiere.org/license.html * *****************************************************************************/ package org.compiere.model; import static org.compiere.model.SystemIDs.COUNTRY_US; import static org.compiere.model.SystemIDs.SCHEDULE_10_MINUTES; import static org.compiere.model.SystemIDs.SCHEDULE_15_MINUTES; import java.io.File; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; import java.util.UUID; import java.util.logging.Level; import org.adempiere.exceptions.AdempiereException; import org.adempiere.util.ProcessUtil; import org.compiere.process.ProcessInfo; import org.compiere.process.ProcessInfoParameter; import org.compiere.util.AdempiereUserError; import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.KeyNamePair; import org.compiere.util.Msg; import org.compiere.util.Trx; /** * Initial Setup Model * * @author Jorg Janke * @version $Id: MSetup.java,v 1.3 2006/07/30 00:51:02 jjanke Exp $ * * @author Teo Sarca, SC ARHIPAC SERVICE SRL *
  • FR [ 1795384 ] Setup: create default accounts records is too rigid * @author Carlos Ruiz - globalqss *
  • Setup correctly IsSOTrx for return documents */ public final class MSetup { public final static String TRXNAME_PREFIX = "InitialClientSetup"; public final static String TRX_DISPLAYNAME = "org.compiere.model.MSetup_createClient"; /** * Constructor * @param ctx context * @param WindowNo window */ public MSetup(Properties ctx, int WindowNo) { this(ctx, WindowNo, false); } /** * Constructor * @param ctx context * @param WindowNo window */ public MSetup(Properties ctx, int WindowNo, boolean dryRun) { m_ctx = new Properties(ctx); // copy m_lang = Env.getAD_Language(m_ctx); m_WindowNo = WindowNo; m_dryRun = dryRun; } // MSetup /** Logger */ protected CLogger log = CLogger.getCLogger(getClass()); private Trx m_trx = Trx.get(Trx.createTrxName(TRXNAME_PREFIX), true); private Properties m_ctx; private String m_lang; private int m_WindowNo; private StringBuffer m_info; // private String m_clientName; // private String m_stdColumns = "AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy"; private String m_stdValues; private String m_stdValuesOrg; // private NaturalAccountMap m_nap = null; // private MClient m_client; private MOrg m_org; private MAcctSchema m_as; // private int AD_User_ID; private String AD_User_Name; private int AD_User_U_ID; private String AD_User_U_Name; private MCalendar m_calendar; private int m_AD_Tree_Account_ID; private int C_Cycle_ID; // private boolean m_hasProject = false; private boolean m_hasMCampaign = false; private boolean m_hasSRegion = false; private boolean m_hasActivity = false; private boolean m_dryRun = false; /** * Create Client Info.
    * - Client, Trees, Org, Role, User, User_Role * @param clientName client name * @param orgValue org Value * @param orgName org name * @param userClient client user name * @param userOrg org user name * @param phone * @param phone2 * @param fax * @param eMail * @param taxID * @param adminEmail * @param userEmail * @param isSetInitialPassword * @return true if created */ public boolean createClient (String clientName, String orgValue, String orgName, String userClient, String userOrg, String phone, String phone2, String fax, String eMail, String taxID, String adminEmail, String userEmail, boolean isSetInitialPassword) { log.info(clientName); m_trx.setDisplayName(TRX_DISPLAYNAME); m_trx.start(); // info header m_info = new StringBuffer(); // Standard columns String name = null; String sql = null; int no = 0; /** * Create Client */ name = clientName; if (name == null || name.length() == 0) name = "newClient"; m_clientName = name; m_client = new MClient(m_ctx, 0, true, m_trx.getTrxName()); m_client.setValue(m_clientName); if (MSystem.isUseLoginPrefix()) m_client.setLoginPrefix(m_clientName); m_client.setName(m_clientName); if (!m_client.save()) { String err = "Tenant NOT created"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } int AD_Client_ID = m_client.getAD_Client_ID(); Env.setContext(m_ctx, m_WindowNo, "AD_Client_ID", AD_Client_ID); Env.setContext(m_ctx, Env.AD_CLIENT_ID, AD_Client_ID); // Standard Values m_stdValues = String.valueOf(AD_Client_ID) + ",0,'Y',getDate(),0,getDate(),0"; // Info - Client m_info.append(Msg.translate(m_lang, "AD_Client_ID")).append("=").append(name).append("\n"); // Setup Sequences if (!MSequence.checkClientSequences (m_ctx, AD_Client_ID, m_trx.getTrxName())) { String err = "Sequences NOT created"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } // Trees and Client Info if (!m_client.setupClientInfo(m_lang)) { String err = "Tenant Info NOT created"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } m_AD_Tree_Account_ID = m_client.getSetup_AD_Tree_Account_ID(); /** * Create Org */ name = orgName; if (name == null || name.length() == 0) name = "newOrg"; if (orgValue == null || orgValue.length() == 0) orgValue = name; m_org = new MOrg (m_client, orgValue, name); if (!m_org.save()) { String err = "Organization NOT created"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } Env.setContext(m_ctx, m_WindowNo, "AD_Org_ID", getAD_Org_ID()); Env.setContext(m_ctx, Env.AD_ORG_ID, getAD_Org_ID()); m_stdValuesOrg = AD_Client_ID + "," + getAD_Org_ID() + ",'Y',getDate(),0,getDate(),0"; // Info m_info.append(Msg.translate(m_lang, "AD_Org_ID")).append("=").append(name).append("\n"); // Set Organization Phone, Phone2, Fax, EMail MOrgInfo orgInfo = MOrgInfo.getCopy(m_ctx, getAD_Org_ID(), m_trx.getTrxName()); orgInfo.setPhone(phone); orgInfo.setPhone2(phone2); orgInfo.setFax(fax); orgInfo.setEMail(eMail); if (taxID != null && taxID.length() > 0) { orgInfo.setTaxID(taxID); } if (!orgInfo.save()) { String err = "Organization Info NOT Updated"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } /** * Create Roles * - Admin * - User */ name = m_clientName + " Admin"; MRole admin = new MRole(m_ctx, 0, m_trx.getTrxName()); admin.setClientOrg(m_client); admin.setName(name); admin.setUserLevel(MRole.USERLEVEL_ClientPlusOrganization); admin.setPreferenceType(MRole.PREFERENCETYPE_Client); admin.setIsShowAcct(true); admin.setIsAccessAdvanced(true); admin.setIsClientAdministrator(true); if (!admin.save()) { String err = "Admin Role A NOT inserted"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } // OrgAccess x, 0 MRoleOrgAccess adminClientAccess = new MRoleOrgAccess (admin, 0); if (!adminClientAccess.save()) log.log(Level.SEVERE, "Admin Role_OrgAccess 0 NOT created"); // OrgAccess x,y MRoleOrgAccess adminOrgAccess = new MRoleOrgAccess (admin, m_org.getAD_Org_ID()); if (!adminOrgAccess.save()) log.log(Level.SEVERE, "Admin Role_OrgAccess NOT created"); // Info - Admin Role m_info.append(Msg.translate(m_lang, "AD_Role_ID")).append("=").append(name).append("\n"); // name = m_clientName + " User"; MRole user = new MRole (m_ctx, 0, m_trx.getTrxName()); user.setClientOrg(m_client); user.setName(name); user.setIsAccessAdvanced(false); user.setIsClientAdministrator(false); if (!user.save()) { String err = "User Role A NOT inserted"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } // OrgAccess x,y MRoleOrgAccess userOrgAccess = new MRoleOrgAccess (user, m_org.getAD_Org_ID()); if (!userOrgAccess.save()) log.log(Level.SEVERE, "User Role_OrgAccess NOT created"); // Info - Client Role m_info.append(Msg.translate(m_lang, "AD_Role_ID")).append("=").append(name).append("\n"); /** * Create Users * - Client * - Org */ MUser clientAdminUser = new MUser(m_ctx, 0, m_trx.getTrxName()); name = userClient; if (name == null || name.length() == 0) name = m_clientName + "Client"; if (isSetInitialPassword) clientAdminUser.setPassword(name); clientAdminUser.setDescription(name); clientAdminUser.setName(name); clientAdminUser.setAD_Client_ID(AD_Client_ID); clientAdminUser.setAD_Org_ID(0); clientAdminUser.setEMail(adminEmail); try { clientAdminUser.saveEx(); } catch (AdempiereException ex) { String err = "Admin User NOT inserted - " + AD_User_Name; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } AD_User_ID = clientAdminUser.getAD_User_ID(); AD_User_Name = name; // Info m_info.append(Msg.translate(m_lang, "AD_User_ID")).append("=").append(AD_User_Name).append("/").append(AD_User_Name).append("\n"); MUser clientUser = new MUser(m_ctx, 0, m_trx.getTrxName()); name = userOrg; if (name == null || name.length() == 0) name = m_clientName + "Org"; if (isSetInitialPassword) clientUser.setPassword(name); clientUser.setDescription(name); clientUser.setName(name); clientUser.setAD_Client_ID(AD_Client_ID); clientUser.setAD_Org_ID(0); clientUser.setEMail(userEmail); try { clientUser.saveEx(); } catch (AdempiereException ex) { String err = "Org User NOT inserted - " + AD_User_U_Name; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } AD_User_U_ID = clientUser.getAD_User_ID(); AD_User_U_Name = name; // Info m_info.append(Msg.translate(m_lang, "AD_User_ID")).append("=").append(AD_User_U_Name).append("/").append(AD_User_U_Name).append("\n"); /** * Create User-Role */ // ClientUser - Admin & User sql = "INSERT INTO AD_User_Roles(" + m_stdColumns + ",AD_User_ID,AD_Role_ID,AD_User_Roles_UU)" + " VALUES (" + m_stdValues + "," + AD_User_ID + "," + admin.getAD_Role_ID() + "," + DB.TO_STRING(UUID.randomUUID().toString()) + ")"; no = DB.executeUpdateEx(sql, m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "UserRole ClientUser+Admin NOT inserted"); sql = "INSERT INTO AD_User_Roles(" + m_stdColumns + ",AD_User_ID,AD_Role_ID,AD_User_Roles_UU)" + " VALUES (" + m_stdValues + "," + AD_User_ID + "," + user.getAD_Role_ID() + "," + DB.TO_STRING(UUID.randomUUID().toString()) + ")"; no = DB.executeUpdateEx(sql, m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "UserRole ClientUser+User NOT inserted"); // OrgUser - User sql = "INSERT INTO AD_User_Roles(" + m_stdColumns + ",AD_User_ID,AD_Role_ID,AD_User_Roles_UU)" + " VALUES (" + m_stdValues + "," + AD_User_U_ID + "," + user.getAD_Role_ID() + "," + DB.TO_STRING(UUID.randomUUID().toString()) + ")"; no = DB.executeUpdateEx(sql, m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "UserRole OrgUser+Org NOT inserted"); // Processors MAcctProcessor ap = new MAcctProcessor(m_client, AD_User_ID); ap.setAD_Schedule_ID(SCHEDULE_10_MINUTES); ap.saveEx(); MRequestProcessor rp = new MRequestProcessor (m_client, AD_User_ID); rp.setAD_Schedule_ID(SCHEDULE_15_MINUTES); rp.saveEx(); log.info("fini"); return true; } // createClient /** * preserving backward compatibility with swing client * @param currency * @param hasProduct * @param hasBPartner * @param hasProject * @param hasMCampaign * @param hasSRegion * @param AccountingFile * @return true if created * @deprecated */ @Deprecated public boolean createAccounting(KeyNamePair currency, boolean hasProduct, boolean hasBPartner, boolean hasProject, boolean hasMCampaign, boolean hasSRegion, File AccountingFile) { return createAccounting(currency, hasProduct, hasBPartner, hasProject, hasMCampaign, hasSRegion, false, AccountingFile, false, false); } /** *
    	 *  Create Accounting elements.
    	 *  - Calendar
    	 *  - Account Trees
    	 *  - Account Values
    	 *  - Accounting Schema
    	 *  - Default Accounts
    	 *  
    * @param currency currency * @param hasProduct has product segment * @param hasBPartner has bp segment * @param hasProject has project segment * @param hasMCampaign has campaign segment * @param hasSRegion has sales region segment * @param hasActivity has activity segment * @param AccountingFile accounting file * @param useDefaultCoA use the Default CoA (load and group summary account) * @param inactivateDefaults inactivate the default accounts after created * @return true if created */ public boolean createAccounting(KeyNamePair currency, boolean hasProduct, boolean hasBPartner, boolean hasProject, boolean hasMCampaign, boolean hasSRegion, boolean hasActivity, File AccountingFile, boolean useDefaultCoA, boolean inactivateDefaults) { if (log.isLoggable(Level.INFO)) log.info(m_client.toString()); // m_hasProject = hasProject; m_hasMCampaign = hasMCampaign; m_hasSRegion = hasSRegion; m_hasActivity = hasActivity; // Standard variables m_info = new StringBuffer(); String name = null; StringBuilder sqlCmd = null; int no = 0; /** * Create Calendar */ m_calendar = new MCalendar(m_client); if (!m_calendar.save()) { String err = "Calendar NOT inserted"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } // Info m_info.append(Msg.translate(m_lang, "C_Calendar_ID")).append("=").append(m_calendar.getName()).append("\n"); if (m_calendar.createYear(m_client.getLocale()) == null) log.log(Level.SEVERE, "Year NOT inserted"); // Create Account Elements name = m_clientName + " " + Msg.translate(m_lang, "Account_ID"); MElement element = new MElement (m_client, name, MElement.ELEMENTTYPE_Account, m_AD_Tree_Account_ID); if (!element.save()) { String err = "Acct Element NOT inserted"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } int C_Element_ID = element.getC_Element_ID(); m_info.append(Msg.translate(m_lang, "C_Element_ID")).append("=").append(name).append("\n"); // Create Account Values m_nap = new NaturalAccountMap(m_ctx, m_trx.getTrxName()); String errMsg = m_nap.parseFile(AccountingFile); if (errMsg.length() != 0) { log.log(Level.SEVERE, errMsg); m_info.append(errMsg); m_trx.rollback(); m_trx.close(); return false; } if (m_nap.saveAccounts(getAD_Client_ID(), getAD_Org_ID(), C_Element_ID, !inactivateDefaults)) m_info.append(Msg.translate(m_lang, "C_ElementValue_ID")).append(" # ").append(m_nap.size()).append("\n"); else { String err = "Acct Element Values NOT inserted"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } int summary_ID = m_nap.getC_ElementValue_ID("SUMMARY"); if (log.isLoggable(Level.FINE)) log.fine("summary_ID=" + summary_ID); if (summary_ID > 0) { DB.executeUpdateEx("UPDATE AD_TreeNode SET Parent_ID=? WHERE AD_Tree_ID=? AND Node_ID!=?", new Object[] {summary_ID, m_AD_Tree_Account_ID, summary_ID}, m_trx.getTrxName()); } int C_ElementValue_ID = m_nap.getC_ElementValue_ID("DEFAULT_ACCT"); if (log.isLoggable(Level.FINE)) log.fine("C_ElementValue_ID=" + C_ElementValue_ID); /** * Create AccountingSchema */ m_as = new MAcctSchema (m_client, currency); if (!m_as.save()) { String err = "AcctSchema NOT inserted"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } // Info m_info.append(Msg.translate(m_lang, "C_AcctSchema_ID")).append("=").append(m_as.getName()).append("\n"); /** * Create AccountingSchema Elements (Structure) */ String sql2 = null; if (Env.isBaseLanguage(m_lang, "AD_Reference")) // Get ElementTypes & Name sql2 = "SELECT Value, Name FROM AD_Ref_List WHERE AD_Reference_ID=181"; else sql2 = "SELECT l.Value, t.Name FROM AD_Ref_List l, AD_Ref_List_Trl t " + "WHERE l.AD_Reference_ID=181 AND l.AD_Ref_List_ID=t.AD_Ref_List_ID" + " AND t.AD_Language=" + DB.TO_STRING(m_lang); //bug [ 1638421 ] PreparedStatement stmt = null; ResultSet rs = null; try { int AD_Client_ID = m_client.getAD_Client_ID(); stmt = DB.prepareStatement(sql2, m_trx.getTrxName()); rs = stmt.executeQuery(); while (rs.next()) { String ElementType = rs.getString(1); name = rs.getString(2); // String IsMandatory = null; String IsBalanced = "N"; int SeqNo = 0; int C_AcctSchema_Element_ID = 0; if (ElementType.equals("OO")) { C_AcctSchema_Element_ID = getNextID(AD_Client_ID, "C_AcctSchema_Element"); IsMandatory = "Y"; IsBalanced = "Y"; SeqNo = 10; } else if (ElementType.equals("AC")) { C_AcctSchema_Element_ID = getNextID(AD_Client_ID, "C_AcctSchema_Element"); IsMandatory = "Y"; SeqNo = 20; } else if (ElementType.equals("PR") && hasProduct) { C_AcctSchema_Element_ID = getNextID(AD_Client_ID, "C_AcctSchema_Element"); IsMandatory = "N"; SeqNo = 30; } else if (ElementType.equals("BP") && hasBPartner) { C_AcctSchema_Element_ID = getNextID(AD_Client_ID, "C_AcctSchema_Element"); IsMandatory = "N"; SeqNo = 40; } else if (ElementType.equals("PJ") && hasProject) { C_AcctSchema_Element_ID = getNextID(AD_Client_ID, "C_AcctSchema_Element"); IsMandatory = "N"; SeqNo = 50; } else if (ElementType.equals("MC") && hasMCampaign) { C_AcctSchema_Element_ID = getNextID(AD_Client_ID, "C_AcctSchema_Element"); IsMandatory = "N"; SeqNo = 60; } else if (ElementType.equals("SR") && hasSRegion) { C_AcctSchema_Element_ID = getNextID(AD_Client_ID, "C_AcctSchema_Element"); IsMandatory = "N"; SeqNo = 70; } else if (ElementType.equals("AY") && hasActivity) { C_AcctSchema_Element_ID = getNextID(AD_Client_ID, "C_AcctSchema_Element"); IsMandatory = "N"; SeqNo = 80; } // Not OT, LF, LT, U1, U2 if (IsMandatory != null) { sqlCmd = new StringBuilder ("INSERT INTO C_AcctSchema_Element("); sqlCmd.append(m_stdColumns).append(",C_AcctSchema_Element_ID,C_AcctSchema_ID,") .append("ElementType,Name,SeqNo,IsMandatory,IsBalanced,C_AcctSchema_Element_UU) VALUES ("); sqlCmd.append(m_stdValues).append(",").append(C_AcctSchema_Element_ID).append(",").append(m_as.getC_AcctSchema_ID()).append(",") .append("'").append(ElementType).append("','").append(name).append("',").append(SeqNo).append(",'") .append(IsMandatory).append("','").append(IsBalanced).append("',").append(DB.TO_STRING(UUID.randomUUID().toString())).append(")"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no == 1) m_info.append(Msg.translate(m_lang, "C_AcctSchema_Element_ID")).append("=").append(name).append("\n"); /** Default value for mandatory elements: OO and AC */ if (ElementType.equals("OO")) { sqlCmd = new StringBuilder ("UPDATE C_AcctSchema_Element SET Org_ID="); sqlCmd.append(getAD_Org_ID()).append(" WHERE C_AcctSchema_Element_ID=").append(C_AcctSchema_Element_ID); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "Default Org in AcctSchemaElement NOT updated"); } if (ElementType.equals("AC")) { sqlCmd = new StringBuilder ("UPDATE C_AcctSchema_Element SET C_ElementValue_ID="); sqlCmd.append(C_ElementValue_ID).append(", C_Element_ID=").append(C_Element_ID); sqlCmd.append(" WHERE C_AcctSchema_Element_ID=").append(C_AcctSchema_Element_ID); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "Default Account in AcctSchemaElement NOT updated"); } } } } catch (SQLException e1) { log.log(Level.SEVERE, "Elements", e1); m_info.append(e1.getMessage()); m_trx.rollback(); m_trx.close(); return false; } finally { DB.close(rs, stmt); rs = null; stmt = null; } // Create AcctSchema // Create Defaults Accounts try { createAccountingRecord(X_C_AcctSchema_GL.Table_Name); createAccountingRecord(X_C_AcctSchema_Default.Table_Name); } catch (Exception e) { String err = e.getLocalizedMessage(); log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } // GL Categories createGLCategory("Standard", MGLCategory.CATEGORYTYPE_Manual, true); int GL_None = createGLCategory("None", MGLCategory.CATEGORYTYPE_Document, false); int GL_GL = createGLCategory("Manual", MGLCategory.CATEGORYTYPE_Manual, false); int GL_ARI = createGLCategory("AR Invoice", MGLCategory.CATEGORYTYPE_Document, false); int GL_ARR = createGLCategory("AR Receipt", MGLCategory.CATEGORYTYPE_Document, false); int GL_MM = createGLCategory("Material Management", MGLCategory.CATEGORYTYPE_Document, false); int GL_API = createGLCategory("AP Invoice", MGLCategory.CATEGORYTYPE_Document, false); int GL_APP = createGLCategory("AP Payment", MGLCategory.CATEGORYTYPE_Document, false); int GL_CASH = createGLCategory("Cash/Payments", MGLCategory.CATEGORYTYPE_Document, false); int GL_Manufacturing = createGLCategory("Manufacturing", MGLCategory.CATEGORYTYPE_Document, false); int GL_Distribution = createGLCategory("Distribution", MGLCategory.CATEGORYTYPE_Document, false); int GL_Payroll = createGLCategory("Payroll", MGLCategory.CATEGORYTYPE_Document, false); // Base DocumentTypes int ii = createDocType("GL Journal", Msg.getElement(m_ctx, "GL_Journal_ID"), MDocType.DOCBASETYPE_GLJournal, null, 0, 0, 1000, GL_GL, false); if (ii == 0) { String err = "Document Type not created"; m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } createDocType("GL Journal Batch", Msg.getElement(m_ctx, "GL_JournalBatch_ID"), MDocType.DOCBASETYPE_GLJournal, null, 0, 0, 100, GL_GL, false); // MDocType.DOCBASETYPE_GLDocument // int DT_I = createDocType("AR Invoice", Msg.getElement(m_ctx, "C_Invoice_ID", true), MDocType.DOCBASETYPE_ARInvoice, null, 0, 0, 100000, GL_ARI, false); int DT_II = createDocType("AR Invoice Indirect", Msg.getElement(m_ctx, "C_Invoice_ID", true), MDocType.DOCBASETYPE_ARInvoice, null, 0, 0, 150000, GL_ARI, false); int DT_IC = createDocType("AR Credit Memo", Msg.getMsg(m_ctx, "CreditMemo"), MDocType.DOCBASETYPE_ARCreditMemo, null, 0, 0, 170000, GL_ARI, false); // MDocType.DOCBASETYPE_ARProFormaInvoice createDocType("AP Invoice", Msg.getElement(m_ctx, "C_Invoice_ID", false), MDocType.DOCBASETYPE_APInvoice, null, 0, 0, 0, GL_API, false); int DT_IPC = createDocType("AP CreditMemo", Msg.getMsg(m_ctx, "CreditMemo"), MDocType.DOCBASETYPE_APCreditMemo, null, 0, 0, 0, GL_API, false); createDocType("Match Invoice", Msg.getElement(m_ctx, "M_MatchInv_ID", false), MDocType.DOCBASETYPE_MatchInvoice, null, 0, 0, 390000, GL_API, false); createDocType("AR Receipt", Msg.getElement(m_ctx, "C_Payment_ID", true), MDocType.DOCBASETYPE_ARReceipt, null, 0, 0, 0, GL_ARR, false); createDocType("AP Payment", Msg.getElement(m_ctx, "C_Payment_ID", false), MDocType.DOCBASETYPE_APPayment, null, 0, 0, 0, GL_APP, false); createDocType("Allocation", "Allocation", MDocType.DOCBASETYPE_PaymentAllocation, null, 0, 0, 490000, GL_CASH, false); int DT_S = createDocType("MM Shipment", "Delivery Note", MDocType.DOCBASETYPE_MaterialDelivery, null, 0, 0, 500000, GL_MM, false); int DT_SI = createDocType("MM Shipment Indirect", "Delivery Note", MDocType.DOCBASETYPE_MaterialDelivery, null, 0, 0, 550000, GL_MM, false); int DT_VRM = createDocType("MM Vendor Return", "Vendor Return", MDocType.DOCBASETYPE_MaterialDelivery, null, 0, 0, 590000, GL_MM, true); createDocType("MM Receipt", "Vendor Delivery", MDocType.DOCBASETYPE_MaterialReceipt, null, 0, 0, 0, GL_MM, false); int DT_RM = createDocType("MM Customer Return", "Customer Return", MDocType.DOCBASETYPE_MaterialReceipt, null, 0, 0, 570000, GL_MM, true); createDocType("Purchase Order", Msg.getElement(m_ctx, "C_Order_ID", false), MDocType.DOCBASETYPE_PurchaseOrder, null, 0, 0, 800000, GL_None, false); createDocType("Match PO", Msg.getElement(m_ctx, "M_MatchPO_ID", false), MDocType.DOCBASETYPE_MatchPO, null, 0, 0, 890000, GL_None, false); createDocType("Purchase Requisition", Msg.getElement(m_ctx, "M_Requisition_ID", false), MDocType.DOCBASETYPE_PurchaseRequisition, null, 0, 0, 900000, GL_None, false); createDocType("Vendor Return Material", "Vendor Return Material Authorization", MDocType.DOCBASETYPE_PurchaseOrder, MDocType.DOCSUBTYPESO_ReturnMaterial, DT_VRM, DT_IPC, 990000, GL_MM, false); createDocType("Bank Statement", Msg.getElement(m_ctx, "C_BankStatemet_ID", true), MDocType.DOCBASETYPE_BankStatement, null, 0, 0, 700000, GL_CASH, false); createDocType("Cash Journal", Msg.getElement(m_ctx, "C_Cash_ID", true), MDocType.DOCBASETYPE_CashJournal, null, 0, 0, 750000, GL_CASH, false); createDocType("Material Movement", Msg.getElement(m_ctx, "M_Movement_ID", false), MDocType.DOCBASETYPE_MaterialMovement, null, 0, 0, 610000, GL_MM, false); createDocType("Physical Inventory", Msg.getElement(m_ctx, "M_Inventory_ID", false), MDocType.DOCBASETYPE_MaterialPhysicalInventory, MDocType.DOCSUBTYPEINV_PhysicalInventory, 0, 0, 620000, GL_MM, false); createDocType("Material Production", Msg.getElement(m_ctx, "M_Production_ID", false), MDocType.DOCBASETYPE_MaterialProduction, null, 0, 0, 630000, GL_MM, false); createDocType("Project Issue", Msg.getElement(m_ctx, "C_ProjectIssue_ID", false), MDocType.DOCBASETYPE_ProjectIssue, null, 0, 0, 640000, GL_MM, false); createDocType("Internal Use Inventory", "Internal Use Inventory", MDocType.DOCBASETYPE_MaterialPhysicalInventory, MDocType.DOCSUBTYPEINV_InternalUseInventory, 0, 0, 650000, GL_MM, false); createDocType("Cost Adjustment", "Cost Adjustment", MDocType.DOCBASETYPE_MaterialPhysicalInventory, MDocType.DOCSUBTYPEINV_CostAdjustment, 0, 0, 660000, GL_MM, false); // Order Entry createDocType("Binding offer", "Quotation", MDocType.DOCBASETYPE_SalesOrder, MDocType.DOCSUBTYPESO_Quotation, 0, 0, 10000, GL_None, false); createDocType("Non binding offer", "Proposal", MDocType.DOCBASETYPE_SalesOrder, MDocType.DOCSUBTYPESO_Proposal, 0, 0, 20000, GL_None, false); createDocType("Prepay Order", "Prepay Order", MDocType.DOCBASETYPE_SalesOrder, MDocType.DOCSUBTYPESO_PrepayOrder, DT_S, DT_I, 30000, GL_None, false); createDocType("Customer Return Material", "Customer Return Material Authorization", MDocType.DOCBASETYPE_SalesOrder, MDocType.DOCSUBTYPESO_ReturnMaterial, DT_RM, DT_IC, 30000, GL_None, false); createDocType("Standard Order", "Order Confirmation", MDocType.DOCBASETYPE_SalesOrder, MDocType.DOCSUBTYPESO_StandardOrder, DT_S, DT_I, 50000, GL_None, false); createDocType("Credit Order", "Order Confirmation", MDocType.DOCBASETYPE_SalesOrder, MDocType.DOCSUBTYPESO_OnCreditOrder, DT_SI, DT_I, 60000, GL_None, false); // RE createDocType("Warehouse Order", "Order Confirmation", MDocType.DOCBASETYPE_SalesOrder, MDocType.DOCSUBTYPESO_WarehouseOrder, DT_S, DT_I, 70000, GL_None, false); // LS //Manufacturing Document createDocType("Manufacturing Order", "Manufacturing Order", MDocType.DOCBASETYPE_ManufacturingOrder, null, 0, 0, 80000, GL_Manufacturing, false); createDocType("Manufacturing Cost Collector","Cost Collector", MDocType.DOCBASETYPE_ManufacturingCostCollector, null, 0, 0, 81000, GL_Manufacturing, false); createDocType("Maintenance Order","Maintenance Order", MDocType.DOCBASETYPE_MaintenanceOrder, null, 0, 0, 86000, GL_Manufacturing, false); createDocType("Quality Order","Quality Order", MDocType.DOCBASETYPE_QualityOrder, null, 0, 0, 87000, GL_Manufacturing, false); createDocType("Distribution Order","Distribution Order", MDocType.DOCBASETYPE_DistributionOrder, null, 0, 0, 88000, GL_Distribution, false); //Payroll createDocType("Payroll","Payroll", MDocType.DOCBASETYPE_Payroll, null, 0, 0, 90000, GL_Payroll, false); int DT = createDocType("POS Order", "Order Confirmation", MDocType.DOCBASETYPE_SalesOrder, MDocType.DOCSUBTYPESO_POSOrder, DT_SI, DT_II, 80000, GL_None, false); // Bar // POS As Default for window SO createPreference("C_DocTypeTarget_ID", String.valueOf(DT), 143); // Update ClientInfo sqlCmd = new StringBuilder ("UPDATE AD_ClientInfo SET "); sqlCmd.append("C_AcctSchema1_ID=").append(m_as.getC_AcctSchema_ID()) .append(", C_Calendar_ID=").append(m_calendar.getC_Calendar_ID()) .append(" WHERE AD_Client_ID=").append(m_client.getAD_Client_ID()); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) { String err = "ClientInfo not updated"; log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } // Validate Completeness ProcessInfo processInfo = new ProcessInfo("Document Type Verify", 0); processInfo.setAD_Client_ID(getAD_Client_ID()); processInfo.setAD_User_ID(getAD_User_ID()); processInfo.setParameter(new ProcessInfoParameter[0]); processInfo.setClassName("org.compiere.process.DocumentTypeVerify"); if (!ProcessUtil.startJavaProcess(m_ctx, processInfo, m_trx, false)) { String err = "Document type verification failed. Message="+processInfo.getSummary(); log.log(Level.SEVERE, err); m_info.append(err); m_trx.rollback(); m_trx.close(); return false; } // if (log.isLoggable(Level.INFO)) log.info("fini"); return true; } // createAccounting /** * Create new record for accounting table (M_Product_Acct, M_Product_Category_Acct, etc) * @param tableName * @throws Exception */ private void createAccountingRecord(String tableName) throws Exception { MTable table = MTable.get(m_ctx, tableName); PO acct = table.getPO(0, m_trx.getTrxName()); MColumn[] cols = table.getColumns(false); for (MColumn c : cols) { if (!c.isActive()) continue; String columnName = c.getColumnName(); if (c.isStandardColumn()) { } else if (DisplayType.Account == c.getAD_Reference_ID()) { acct.set_Value(columnName, getAcct(columnName)); if (log.isLoggable(Level.INFO)) log.info("Account: " + columnName); } else if (DisplayType.YesNo == c.getAD_Reference_ID()) { acct.set_Value(columnName, Boolean.TRUE); if (log.isLoggable(Level.INFO)) log.info("YesNo: " + c.getColumnName()); } } acct.setAD_Client_ID(m_client.getAD_Client_ID()); acct.set_Value(I_C_AcctSchema.COLUMNNAME_C_AcctSchema_ID, m_as.getC_AcctSchema_ID()); // if (!acct.save()) { throw new AdempiereUserError(CLogger.retrieveErrorString(table.getName() + " not created")); } } /** * Create new valid combination for predefine account column * @param key column name * @return C_ValidCombination_ID * @throws AdempiereUserError */ private Integer getAcct (String key) throws AdempiereUserError { if (log.isLoggable(Level.FINE)) log.fine(key); // Element int C_ElementValue_ID = m_nap.getC_ElementValue_ID(key.toUpperCase()); if (C_ElementValue_ID == 0) { throw new AdempiereUserError("Account not defined: " + key); } MAccount vc = MAccount.getDefault(m_as, true); // optional null vc.setAD_Org_ID(0); // will be overwritten vc.setAccount_ID(C_ElementValue_ID); if (!vc.save()) { throw new AdempiereUserError("Not Saved - Key=" + key + ", C_ElementValue_ID=" + C_ElementValue_ID); } int C_ValidCombination_ID = vc.getC_ValidCombination_ID(); if (C_ValidCombination_ID == 0) { throw new AdempiereUserError("No account - Key=" + key + ", C_ElementValue_ID=" + C_ElementValue_ID); } return C_ValidCombination_ID; } // getAcct /** * Create GL Category * @param Name name * @param CategoryType category type MGLCategory.CATEGORYTYPE_* * @param isDefault is default flag * @return GL_Category_ID */ private int createGLCategory (String Name, String CategoryType, boolean isDefault) { MGLCategory cat = new MGLCategory (m_ctx, 0, m_trx.getTrxName()); cat.setAD_Org_ID(0); cat.setName(Name); cat.setCategoryType(CategoryType); cat.setIsDefault(isDefault); if (!cat.save()) { log.log(Level.SEVERE, "GL Category NOT created - " + Name); return 0; } // return cat.getGL_Category_ID(); } // createGLCategory /** * Create Document Types with Sequence * @param Name name * @param PrintName print name * @param DocBaseType document base type * @param DocSubTypeSO sales order sub type * @param C_DocTypeShipment_ID shipment doc * @param C_DocTypeInvoice_ID invoice doc * @param StartNo start doc no * @param GL_Category_ID gl category * @param isReturnTrx is return trx * @return C_DocType_ID doc type or 0 for error */ private int createDocType (String Name, String PrintName, String DocBaseType, String DocSubTypeSO, int C_DocTypeShipment_ID, int C_DocTypeInvoice_ID, int StartNo, int GL_Category_ID, boolean isReturnTrx) { MSequence sequence = null; if (StartNo != 0) { sequence = new MSequence(m_ctx, getAD_Client_ID(), Name, StartNo, m_trx.getTrxName()); if (!sequence.save()) { log.log(Level.SEVERE, "Sequence NOT created - " + Name); return 0; } } MDocType dt = new MDocType (m_ctx, DocBaseType, Name, m_trx.getTrxName()); if (PrintName != null && PrintName.length() > 0) dt.setPrintName(PrintName); // Defaults to Name if (DocSubTypeSO != null) { if (MDocType.DOCBASETYPE_MaterialPhysicalInventory.equals(DocBaseType)) { dt.setDocSubTypeInv(DocSubTypeSO); } else { dt.setDocSubTypeSO(DocSubTypeSO); } } if (C_DocTypeShipment_ID != 0) dt.setC_DocTypeShipment_ID(C_DocTypeShipment_ID); if (C_DocTypeInvoice_ID != 0) dt.setC_DocTypeInvoice_ID(C_DocTypeInvoice_ID); if (GL_Category_ID != 0) dt.setGL_Category_ID(GL_Category_ID); if (sequence == null) dt.setIsDocNoControlled(false); else { dt.setIsDocNoControlled(true); dt.setDocNoSequence_ID(sequence.getAD_Sequence_ID()); } dt.setIsSOTrx(); if (isReturnTrx) dt.setIsSOTrx(!dt.isSOTrx()); if (!dt.save()) { log.log(Level.SEVERE, "DocType NOT created - " + Name); return 0; } // return dt.getC_DocType_ID(); } // createDocType /** *
    	 *  Create default main entities.
    	 *  - Dimensions, BPGroup and Product Category
    	 *  - Location, Locator, Warehouse
    	 *  - PriceList
    	 *  - Cashbook, PaymentTerm
    	 *  
    * @param C_Country_ID country * @param City city * @param C_Region_ID region * @param C_Currency_ID currency * @param postal * @param address1 * @return true if created */ public boolean createEntities (int C_Country_ID, String City, int C_Region_ID, int C_Currency_ID, String postal, String address1) { if (m_as == null) { log.severe ("No AcctountingSChema"); m_trx.rollback(); m_trx.close(); return false; } if (log.isLoggable(Level.INFO)) log.info("C_Country_ID=" + C_Country_ID + ", City=" + City + ", C_Region_ID=" + C_Region_ID); m_info.append("\n----\n"); // String defaultName = Msg.translate(m_lang, "Standard"); String defaultEntry = "'" + defaultName + "',"; StringBuilder sqlCmd = null; int no = 0; // Create Marketing Channel/Campaign int C_Channel_ID = getNextID(getAD_Client_ID(), "C_Channel"); sqlCmd = new StringBuilder("INSERT INTO C_Channel "); sqlCmd.append("(C_Channel_ID,Name,"); sqlCmd.append(m_stdColumns).append(",C_Channel_UU) VALUES ("); sqlCmd.append(C_Channel_ID).append(",").append(defaultEntry); sqlCmd.append(m_stdValues).append(",").append(DB.TO_STRING(UUID.randomUUID().toString())).append(")"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "Channel NOT inserted"); int C_Campaign_ID = getNextID(getAD_Client_ID(), "C_Campaign"); sqlCmd = new StringBuilder("INSERT INTO C_Campaign "); sqlCmd.append("(C_Campaign_ID,C_Channel_ID,").append(m_stdColumns).append(","); sqlCmd.append(" Value,Name,Costs,C_Campaign_UU) VALUES ("); sqlCmd.append(C_Campaign_ID).append(",").append(C_Channel_ID).append(",").append(m_stdValues).append(","); sqlCmd.append(defaultEntry).append(defaultEntry).append("0").append(",").append(DB.TO_STRING(UUID.randomUUID().toString())).append(")"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no == 1) m_info.append(Msg.translate(m_lang, "C_Campaign_ID")).append("=").append(defaultName).append("\n"); else log.log(Level.SEVERE, "Campaign NOT inserted"); if (m_hasMCampaign) { // Default sqlCmd = new StringBuilder ("UPDATE C_AcctSchema_Element SET "); sqlCmd.append("C_Campaign_ID=").append(C_Campaign_ID); sqlCmd.append(" WHERE C_AcctSchema_ID=").append(m_as.getC_AcctSchema_ID()); sqlCmd.append(" AND ElementType='MC'"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "AcctSchema Element Campaign NOT updated"); } // Campaign Translation sqlCmd = new StringBuilder ("INSERT INTO C_Campaign_Trl (AD_Language,C_Campaign_ID, Description,Name, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,C_Campaign_Trl_UU)"); sqlCmd.append(" SELECT l.AD_Language,t.C_Campaign_ID, t.Description,t.Name, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy, generate_uuid() FROM AD_Language l, C_Campaign t"); sqlCmd.append(" WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.C_Campaign_ID=").append(C_Campaign_ID); sqlCmd.append(" AND NOT EXISTS (SELECT * FROM C_Campaign_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.C_Campaign_ID=t.C_Campaign_ID)"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no < 0) log.log(Level.SEVERE, "Campaign Translation NOT inserted"); // Create Sales Region int C_SalesRegion_ID = getNextID(getAD_Client_ID(), "C_SalesRegion"); sqlCmd = new StringBuilder ("INSERT INTO C_SalesRegion "); sqlCmd.append("(C_SalesRegion_ID,").append(m_stdColumns).append(","); sqlCmd.append(" Value,Name,IsSummary,C_SalesRegion_UU) VALUES ("); sqlCmd.append(C_SalesRegion_ID).append(",").append(m_stdValues).append(", "); sqlCmd.append(defaultEntry).append(defaultEntry).append("'N'").append(",").append(DB.TO_STRING(UUID.randomUUID().toString())).append(")"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no == 1) m_info.append(Msg.translate(m_lang, "C_SalesRegion_ID")).append("=").append(defaultName).append("\n"); else log.log(Level.SEVERE, "SalesRegion NOT inserted"); if (m_hasSRegion) { // Default sqlCmd = new StringBuilder ("UPDATE C_AcctSchema_Element SET "); sqlCmd.append("C_SalesRegion_ID=").append(C_SalesRegion_ID); sqlCmd.append(" WHERE C_AcctSchema_ID=").append(m_as.getC_AcctSchema_ID()); sqlCmd.append(" AND ElementType='SR'"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "AcctSchema Element SalesRegion NOT updated"); } // Sales Region Translation sqlCmd = new StringBuilder ("INSERT INTO C_SalesRegion_Trl (AD_Language,C_SalesRegion_ID, Description,Name, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,C_SalesRegion_Trl_UU)"); sqlCmd.append(" SELECT l.AD_Language,t.C_SalesRegion_ID, t.Description,t.Name, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy, generate_uuid() FROM AD_Language l, C_SalesRegion t"); sqlCmd.append(" WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.C_SalesRegion_ID=").append(C_SalesRegion_ID); sqlCmd.append(" AND NOT EXISTS (SELECT * FROM C_SalesRegion_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.C_SalesRegion_ID=t.C_SalesRegion_ID)"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no < 0) log.log(Level.SEVERE, "Sales Region Translation NOT inserted"); // Create Activity int C_Activity_ID = getNextID(getAD_Client_ID(), "C_Activity"); sqlCmd = new StringBuilder ("INSERT INTO C_Activity "); sqlCmd.append("(C_Activity_ID,").append(m_stdColumns).append(","); sqlCmd.append(" Value,Name,IsSummary,C_Activity_UU) VALUES ("); sqlCmd.append(C_Activity_ID).append(",").append(m_stdValues).append(", "); sqlCmd.append(defaultEntry).append(defaultEntry).append("'N'").append(",").append(DB.TO_STRING(UUID.randomUUID().toString())).append(")"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no == 1) m_info.append(Msg.translate(m_lang, "C_Activity_ID")).append("=").append(defaultName).append("\n"); else log.log(Level.SEVERE, "Activity NOT inserted"); if (m_hasActivity) { // Default sqlCmd = new StringBuilder ("UPDATE C_AcctSchema_Element SET "); sqlCmd.append("C_Activity_ID=").append(C_Activity_ID); sqlCmd.append(" WHERE C_AcctSchema_ID=").append(m_as.getC_AcctSchema_ID()); sqlCmd.append(" AND ElementType='AY'"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "AcctSchema Element Activity NOT updated"); } // Activity Translation sqlCmd = new StringBuilder ("INSERT INTO C_Activity_Trl (AD_Language,C_Activity_ID, Description,Name, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,C_Activity_Trl_UU)"); sqlCmd.append(" SELECT l.AD_Language,t.C_Activity_ID, t.Description,t.Name, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy, generate_uuid() FROM AD_Language l, C_Activity t"); sqlCmd.append(" WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.C_Activity_ID=").append(C_Activity_ID); sqlCmd.append(" AND NOT EXISTS (SELECT * FROM C_Activity_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.C_Activity_ID=t.C_Activity_ID)"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no < 0) log.log(Level.SEVERE, "Activity Translation NOT inserted"); /** * Business Partner */ // Create BP Group MBPGroup bpg = new MBPGroup (m_ctx, 0, m_trx.getTrxName()); bpg.setAD_Org_ID(0); bpg.setValue(defaultName); bpg.setName(defaultName); bpg.setIsDefault(true); if (bpg.save()) m_info.append(Msg.translate(m_lang, "C_BP_Group_ID")).append("=").append(defaultName).append("\n"); else log.log(Level.SEVERE, "BP Group NOT inserted"); // Create BPartner MBPartner bp = new MBPartner (m_ctx, 0, m_trx.getTrxName()); bp.setAD_Org_ID(0); bp.setValue(defaultName); bp.setName(defaultName); bp.setBPGroup(bpg); if (bp.save()) m_info.append(Msg.translate(m_lang, "C_BPartner_ID")).append("=").append(defaultName).append("\n"); else log.log(Level.SEVERE, "BPartner NOT inserted"); // Location for Standard BP MLocation bpLoc = new MLocation(m_ctx, C_Country_ID, C_Region_ID, City, m_trx.getTrxName()); bpLoc.setAD_Org_ID(0); bpLoc.saveEx(); MBPartnerLocation bpl = new MBPartnerLocation(bp); bpl.setC_Location_ID(bpLoc.getC_Location_ID()); if (!bpl.save()) log.log(Level.SEVERE, "BP_Location (Standard) NOT inserted"); // Default sqlCmd = new StringBuilder ("UPDATE C_AcctSchema_Element SET "); sqlCmd.append("C_BPartner_ID=").append(bp.getC_BPartner_ID()); sqlCmd.append(" WHERE C_AcctSchema_ID=").append(m_as.getC_AcctSchema_ID()); sqlCmd.append(" AND ElementType='BP'"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "AcctSchema Element BPartner NOT updated"); createPreference("C_BPartner_ID", String.valueOf(bp.getC_BPartner_ID()), 143); /** * Product */ // Create Product Category MProductCategory pc = new MProductCategory(m_ctx, 0, m_trx.getTrxName()); pc.setAD_Org_ID(0); pc.setValue(defaultName); pc.setName(defaultName); pc.setIsDefault(true); if (pc.save()) m_info.append(Msg.translate(m_lang, "M_Product_Category_ID")).append("=").append(defaultName).append("\n"); else log.log(Level.SEVERE, "Product Category NOT inserted"); // UOM (EA) int C_UOM_ID = 100; // TaxCategory int C_TaxCategory_ID = getNextID(getAD_Client_ID(), "C_TaxCategory"); sqlCmd = new StringBuilder ("INSERT INTO C_TaxCategory "); sqlCmd.append("(C_TaxCategory_ID,").append(m_stdColumns).append(","); sqlCmd.append(" Name,IsDefault,C_TaxCategory_UU) VALUES ("); sqlCmd.append(C_TaxCategory_ID).append(",").append(m_stdValues).append(", "); if (C_Country_ID == COUNTRY_US) // US sqlCmd.append("'Sales Tax','Y',"); else sqlCmd.append(defaultEntry).append("'Y',"); sqlCmd.append(DB.TO_STRING(UUID.randomUUID().toString())).append(")"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "TaxCategory NOT inserted"); // TaxCategory translation sqlCmd = new StringBuilder ("INSERT INTO C_TaxCategory_Trl (AD_Language,C_TaxCategory_ID, Description,Name, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,C_TaxCategory_Trl_UU)"); sqlCmd.append(" SELECT l.AD_Language,t.C_TaxCategory_ID, t.Description,t.Name, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy, generate_uuid() FROM AD_Language l, C_TaxCategory t"); sqlCmd.append(" WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.C_TaxCategory_ID=").append(C_TaxCategory_ID); sqlCmd.append(" AND NOT EXISTS (SELECT * FROM C_TaxCategory_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.C_TaxCategory_ID=t.C_TaxCategory_ID)"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no < 0) log.log(Level.SEVERE, "TaxCategory Translation NOT inserted"); // Tax - Zero Rate MTax tax = new MTax (m_ctx, "Standard", Env.ZERO, C_TaxCategory_ID, m_trx.getTrxName()); tax.setAD_Org_ID(0); tax.setIsDefault(true); if (tax.save()) m_info.append(Msg.translate(m_lang, "C_Tax_ID")) .append("=").append(tax.getName()).append("\n"); else log.log(Level.SEVERE, "Tax NOT inserted"); // Create Product MProduct product = new MProduct (m_ctx, 0, m_trx.getTrxName()); product.setAD_Org_ID(0); product.setValue(defaultName); product.setName(defaultName); product.setC_UOM_ID(C_UOM_ID); product.setM_Product_Category_ID(pc.getM_Product_Category_ID()); product.setC_TaxCategory_ID(C_TaxCategory_ID); if (product.save()) m_info.append(Msg.translate(m_lang, "M_Product_ID")).append("=").append(defaultName).append("\n"); else log.log(Level.SEVERE, "Product NOT inserted"); // Default sqlCmd = new StringBuilder ("UPDATE C_AcctSchema_Element SET "); sqlCmd.append("M_Product_ID=").append(product.getM_Product_ID()); sqlCmd.append(" WHERE C_AcctSchema_ID=").append(m_as.getC_AcctSchema_ID()); sqlCmd.append(" AND ElementType='PR'"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "AcctSchema Element Product NOT updated"); /** * Location, Warehouse, Locator */ // Location (Company) MLocation loc = new MLocation(m_ctx, C_Country_ID, C_Region_ID, City, m_trx.getTrxName()); loc.setAddress1(address1); loc.setPostal(postal); loc.saveEx(); sqlCmd = new StringBuilder ("UPDATE AD_OrgInfo SET C_Location_ID="); sqlCmd.append(loc.getC_Location_ID()).append(" WHERE AD_Org_ID=").append(getAD_Org_ID()); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "Location NOT inserted"); createPreference("C_Country_ID", String.valueOf(C_Country_ID), 0); // Default Warehouse MLocation locwh = new MLocation(m_ctx, C_Country_ID, C_Region_ID, City, m_trx.getTrxName()); locwh.setAddress1(address1); locwh.setPostal(postal); locwh.saveEx(); MWarehouse wh = new MWarehouse(m_ctx, 0, m_trx.getTrxName()); wh.setValue(defaultName); wh.setName(defaultName); wh.setC_Location_ID(locwh.getC_Location_ID()); if (!wh.save()) log.log(Level.SEVERE, "Warehouse NOT inserted"); // Locator MLocator locator = new MLocator(wh, defaultName); locator.setIsDefault(true); if (!locator.save()) log.log(Level.SEVERE, "Locator NOT inserted"); // Update ClientInfo sqlCmd = new StringBuilder ("UPDATE AD_ClientInfo SET "); sqlCmd.append("C_BPartnerCashTrx_ID=").append(bp.getC_BPartner_ID()); sqlCmd.append(",M_ProductFreight_ID=").append(product.getM_Product_ID()); sqlCmd.append(" WHERE AD_Client_ID=").append(getAD_Client_ID()); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) { String err = "ClientInfo not updated"; log.log(Level.SEVERE, err); m_info.append(err); return false; } /** * Other */ // PriceList MPriceList pl = new MPriceList(m_ctx, 0, m_trx.getTrxName()); pl.setAD_Org_ID(0); pl.setName(defaultName); pl.setC_Currency_ID(C_Currency_ID); pl.setIsDefault(true); if (!pl.save()) log.log(Level.SEVERE, "PriceList NOT inserted"); // Price List MDiscountSchema ds = new MDiscountSchema(m_ctx, 0, m_trx.getTrxName()); ds.setAD_Org_ID(0); ds.setName(defaultName); ds.setDiscountType(MDiscountSchema.DISCOUNTTYPE_Pricelist); if (!ds.save()) log.log(Level.SEVERE, "DiscountSchema NOT inserted"); // PriceList Version MPriceListVersion plv = new MPriceListVersion(pl); plv.setAD_Org_ID(0); plv.setName(); plv.setM_DiscountSchema_ID(ds.getM_DiscountSchema_ID()); if (!plv.save()) log.log(Level.SEVERE, "PriceList_Version NOT inserted"); // ProductPrice MProductPrice pp = new MProductPrice(plv, product.getM_Product_ID(), Env.ONE, Env.ONE, Env.ONE); if (!pp.save()) log.log(Level.SEVERE, "ProductPrice NOT inserted"); // Create Sales Rep for Client-User MBPartner bpCU = new MBPartner (m_ctx, 0, m_trx.getTrxName()); bpCU.setAD_Org_ID(0); bpCU.setValue(AD_User_U_Name); bpCU.setName(AD_User_U_Name); bpCU.setBPGroup(bpg); bpCU.setIsEmployee(true); bpCU.setIsSalesRep(true); if (bpCU.save()) m_info.append(Msg.translate(m_lang, "SalesRep_ID")).append("=").append(AD_User_U_Name).append("\n"); else log.log(Level.SEVERE, "SalesRep (User) NOT inserted"); // Location for Client-User MLocation bpLocCU = new MLocation(m_ctx, C_Country_ID, C_Region_ID, City, m_trx.getTrxName()); bpLocCU.setAD_Org_ID(0); bpLocCU.saveEx(); MBPartnerLocation bplCU = new MBPartnerLocation(bpCU); bplCU.setC_Location_ID(bpLocCU.getC_Location_ID()); if (!bplCU.save()) log.log(Level.SEVERE, "BP_Location (User) NOT inserted"); // Update User sqlCmd = new StringBuilder ("UPDATE AD_User SET C_BPartner_ID="); sqlCmd.append(bpCU.getC_BPartner_ID()).append(" WHERE AD_User_ID=").append(AD_User_U_ID); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "User of SalesRep (User) NOT updated"); // Create Sales Rep for Client-Admin MBPartner bpCA = new MBPartner (m_ctx, 0, m_trx.getTrxName()); bpCA.setAD_Org_ID(0); bpCA.setValue(AD_User_Name); bpCA.setName(AD_User_Name); bpCA.setBPGroup(bpg); bpCA.setIsEmployee(true); bpCA.setIsSalesRep(true); if (bpCA.save()) m_info.append(Msg.translate(m_lang, "SalesRep_ID")).append("=").append(AD_User_Name).append("\n"); else log.log(Level.SEVERE, "SalesRep (Admin) NOT inserted"); // Location for Client-Admin MLocation bpLocCA = new MLocation(m_ctx, C_Country_ID, C_Region_ID, City, m_trx.getTrxName()); bpLocCA.setAD_Org_ID(0); bpLocCA.saveEx(); MBPartnerLocation bplCA = new MBPartnerLocation(bpCA); bplCA.setC_Location_ID(bpLocCA.getC_Location_ID()); if (!bplCA.save()) log.log(Level.SEVERE, "BP_Location (Admin) NOT inserted"); // Update User sqlCmd = new StringBuilder ("UPDATE AD_User SET C_BPartner_ID="); sqlCmd.append(bpCA.getC_BPartner_ID()).append(" WHERE AD_User_ID=").append(AD_User_ID); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "User of SalesRep (Admin) NOT updated"); // Payment Term int C_PaymentTerm_ID = getNextID(getAD_Client_ID(), "C_PaymentTerm"); sqlCmd = new StringBuilder ("INSERT INTO C_PaymentTerm "); sqlCmd.append("(C_PaymentTerm_ID,").append(m_stdColumns).append(","); sqlCmd.append("Value,Name,NetDays,GraceDays,DiscountDays,Discount,DiscountDays2,Discount2,IsDefault,C_PaymentTerm_UU) VALUES ("); sqlCmd.append(C_PaymentTerm_ID).append(",").append(m_stdValues).append(","); sqlCmd.append("'Immediate','Immediate',0,0,0,0,0,0,'Y'").append(",").append(DB.TO_STRING(UUID.randomUUID().toString())).append(")"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "PaymentTerm NOT inserted"); // Payment Term Translation sqlCmd = new StringBuilder ("INSERT INTO C_PaymentTerm_Trl (AD_Language,C_PaymentTerm_ID, Description,Name, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,C_PaymentTerm_Trl_UU)"); sqlCmd.append(" SELECT l.AD_Language,t.C_PaymentTerm_ID, t.Description,t.Name, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy, generate_uuid() FROM AD_Language l, C_PaymentTerm t"); sqlCmd.append(" WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.C_PaymentTerm_ID=").append(C_PaymentTerm_ID); sqlCmd.append(" AND NOT EXISTS (SELECT * FROM C_PaymentTerm_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.C_PaymentTerm_ID=t.C_PaymentTerm_ID)"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no < 0) log.log(Level.SEVERE, "Payment Term Translation NOT inserted"); // Project Cycle C_Cycle_ID = getNextID(getAD_Client_ID(), "C_Cycle"); sqlCmd = new StringBuilder ("INSERT INTO C_Cycle "); sqlCmd.append("(C_Cycle_ID,").append(m_stdColumns).append(","); sqlCmd.append(" Name,C_Currency_ID,C_Cycle_UU) VALUES ("); sqlCmd.append(C_Cycle_ID).append(",").append(m_stdValues).append(", "); sqlCmd.append(defaultEntry).append(C_Currency_ID).append(",").append(DB.TO_STRING(UUID.randomUUID().toString())).append(")"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "Cycle NOT inserted"); /** * Organization level data =========================================== */ // Create Default Project int C_Project_ID = getNextID(getAD_Client_ID(), "C_Project"); sqlCmd = new StringBuilder ("INSERT INTO C_Project "); sqlCmd.append("(C_Project_ID,").append(m_stdColumns).append(","); sqlCmd.append(" Value,Name,C_Currency_ID,IsSummary,C_Project_UU) VALUES ("); sqlCmd.append(C_Project_ID).append(",").append(m_stdValuesOrg).append(", "); sqlCmd.append(defaultEntry).append(defaultEntry).append(C_Currency_ID).append(",'N'").append(",").append(DB.TO_STRING(UUID.randomUUID().toString())).append(")"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no == 1) m_info.append(Msg.translate(m_lang, "C_Project_ID")).append("=").append(defaultName).append("\n"); else log.log(Level.SEVERE, "Project NOT inserted"); // Default Project if (m_hasProject) { sqlCmd = new StringBuilder ("UPDATE C_AcctSchema_Element SET "); sqlCmd.append("C_Project_ID=").append(C_Project_ID); sqlCmd.append(" WHERE C_AcctSchema_ID=").append(m_as.getC_AcctSchema_ID()); sqlCmd.append(" AND ElementType='PJ'"); no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "AcctSchema Element Project NOT updated"); } // CashBook MCashBook cb = new MCashBook(m_ctx, 0, m_trx.getTrxName()); cb.setName(defaultName); cb.setC_Currency_ID(C_Currency_ID); if (cb.save()) m_info.append(Msg.translate(m_lang, "C_CashBook_ID")).append("=").append(defaultName).append("\n"); else log.log(Level.SEVERE, "CashBook NOT inserted"); // //do not commit if it is a dry run if (m_dryRun) return true; boolean success = m_trx.commit(); m_trx.close(); if (log.isLoggable(Level.INFO)) log.info("finish"); return success; } // createEntities /** * Create Preference * @param Attribute attribute name * @param Value attribute value * @param AD_Window_ID window */ private void createPreference (String Attribute, String Value, int AD_Window_ID) { int AD_Preference_ID = getNextID(getAD_Client_ID(), "AD_Preference"); StringBuilder sqlCmd = new StringBuilder ("INSERT INTO AD_Preference "); sqlCmd.append("(AD_Preference_ID,").append("AD_Preference_UU,").append(m_stdColumns).append(","); sqlCmd.append("Attribute,Value,AD_Window_ID) VALUES ("); sqlCmd.append(AD_Preference_ID).append(",").append(DB.TO_STRING(UUID.randomUUID().toString())).append(",").append(m_stdValues).append(","); sqlCmd.append("'").append(Attribute).append("','").append(Value).append("',"); if (AD_Window_ID == 0) sqlCmd.append("NULL)"); else sqlCmd.append(AD_Window_ID).append(")"); int no = DB.executeUpdateEx(sqlCmd.toString(), m_trx.getTrxName()); if (no != 1) log.log(Level.SEVERE, "Preference NOT inserted - " + Attribute); } // createPreference /** * Get Next ID * @param AD_Client_ID client * @param TableName table name * @return id */ private int getNextID (int AD_Client_ID, String TableName) { // TODO: Exception return DB.getNextID (AD_Client_ID, TableName, m_trx.getTrxName()); } // getNextID /** * Get Client * @return AD_Client_ID */ public int getAD_Client_ID() { return m_client.getAD_Client_ID(); } /** * Get AD_Org_ID * @return AD_Org_ID */ public int getAD_Org_ID() { return m_org.getAD_Org_ID(); } /** * Get AD_User_ID * @return AD_User_ID */ public int getAD_User_ID() { return AD_User_ID; } /** * Get Info * @return Info */ public String getInfo() { return m_info.toString(); } /** * Rollback Internal Transaction */ public void rollback() { try { m_trx.rollback(); m_trx.close(); } catch (Exception e) {} } /** * * @return trxName */ public String getTrxName() { return m_trx != null ? m_trx.getTrxName() : null; } } // MSetup