From 39c44b637307d6a0b04eca8f708b38c58fb541a2 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 9 May 2007 11:08:52 +0000 Subject: [PATCH] Implemented FR [ 1696228 ] ModelValidator for BeforePost and AfterPost Moved lots of sources and packages to base as discussed in forums --- JasperReportsWebApp/build.xml | 4 +- base/build.xml | 5 +- .../src/org/adempiere/pdf/Document.java | 0 .../pdf/viewer/22x22/document-print.png | Bin .../pdf/viewer/22x22/document-save.png | Bin .../adempiere/pdf/viewer/22x22/go-first.png | Bin .../adempiere/pdf/viewer/22x22/go-last.png | Bin .../adempiere/pdf/viewer/22x22/go-next.png | Bin .../pdf/viewer/22x22/go-previous.png | Bin .../pdf/viewer/22x22/rotate-cclock.png | Bin .../pdf/viewer/22x22/rotate-clock.png | Bin .../org/adempiere/pdf/viewer/22x22/rotate.png | Bin .../pdf/viewer/22x22/system-search.png | Bin .../adempiere/pdf/viewer/22x22/zoom-in.png | Bin .../adempiere/pdf/viewer/22x22/zoom-out.png | Bin .../pdf/viewer/48x48/document-print.png | Bin .../pdf/viewer/48x48/document-save.png | Bin .../adempiere/pdf/viewer/48x48/go-first.png | Bin .../adempiere/pdf/viewer/48x48/go-last.png | Bin .../adempiere/pdf/viewer/48x48/go-next.png | Bin .../pdf/viewer/48x48/go-previous.png | Bin .../pdf/viewer/48x48/system-search.png | Bin .../adempiere/pdf/viewer/PDFViewerBean.java | 0 .../org/adempiere/util/GenerateModelJPA.java | 0 .../src/org/compiere/Adempiere.java | 0 .../src/org/compiere/Adempiere.properties | 0 base/src/org/compiere/acct/Doc.java | 2189 +++++++++++++++++ base/src/org/compiere/acct/DocLine.java | 1033 ++++++++ .../org/compiere/acct/DocLine_Allocation.java | 142 ++ base/src/org/compiere/acct/DocLine_Bank.java | 122 + base/src/org/compiere/acct/DocLine_Cash.java | 138 ++ base/src/org/compiere/acct/DocTax.java | 240 ++ .../src/org/compiere/acct/Doc_Allocation.java | 895 +++++++ base/src/org/compiere/acct/Doc_Bank.java | 223 ++ base/src/org/compiere/acct/Doc_Cash.java | 254 ++ base/src/org/compiere/acct/Doc_GLJournal.java | 168 ++ base/src/org/compiere/acct/Doc_InOut.java | 305 +++ base/src/org/compiere/acct/Doc_Inventory.java | 179 ++ base/src/org/compiere/acct/Doc_Invoice.java | 967 ++++++++ base/src/org/compiere/acct/Doc_MatchInv.java | 327 +++ base/src/org/compiere/acct/Doc_MatchPO.java | 251 ++ base/src/org/compiere/acct/Doc_Movement.java | 179 ++ base/src/org/compiere/acct/Doc_Order.java | 646 +++++ base/src/org/compiere/acct/Doc_Payment.java | 183 ++ .../src/org/compiere/acct/Doc_Production.java | 216 ++ .../org/compiere/acct/Doc_ProjectIssue.java | 221 ++ .../org/compiere/acct/Doc_Requisition.java | 153 ++ base/src/org/compiere/acct/Fact.java | 861 +++++++ base/src/org/compiere/acct/FactLine.java | 1059 ++++++++ base/src/org/compiere/acct/Matcher.java | 165 ++ base/src/org/compiere/acct/ProductInfo.java | 390 +++ .../org/compiere/db/AdempiereDatabase.java | 0 .../src/org/compiere/db/CConnection.java | 0 .../org/compiere/db/CConnectionDialog.java | 0 .../org/compiere/db/CConnectionEditor.java | 0 .../src/org/compiere/db/CreateAdempiere.java | 0 .../src/org/compiere/db/DBRes.java | 0 .../src/org/compiere/db/DBRes_ar.java | 0 .../src/org/compiere/db/DBRes_bg.java | 0 .../src/org/compiere/db/DBRes_ca.java | 0 .../src/org/compiere/db/DBRes_da.java | 0 .../src/org/compiere/db/DBRes_de.java | 0 .../src/org/compiere/db/DBRes_es.java | 0 .../src/org/compiere/db/DBRes_fa.java | 0 .../src/org/compiere/db/DBRes_fr.java | 0 .../src/org/compiere/db/DBRes_hr.java | 0 .../src/org/compiere/db/DBRes_in.java | 0 .../src/org/compiere/db/DBRes_it.java | 0 .../src/org/compiere/db/DBRes_ja.java | 0 .../src/org/compiere/db/DBRes_ml.java | 0 .../src/org/compiere/db/DBRes_nl.java | 0 .../src/org/compiere/db/DBRes_no.java | 0 .../src/org/compiere/db/DBRes_pl.java | 0 .../src/org/compiere/db/DBRes_pt.java | 0 .../src/org/compiere/db/DBRes_ro.java | 0 .../src/org/compiere/db/DBRes_ru.java | 0 .../src/org/compiere/db/DBRes_sl.java | 0 .../src/org/compiere/db/DBRes_sv.java | 0 .../src/org/compiere/db/DBRes_th.java | 0 .../src/org/compiere/db/DBRes_vi.java | 0 .../src/org/compiere/db/DBRes_zh.java | 0 .../src/org/compiere/db/DBRes_zh_CN.java | 0 .../src/org/compiere/db/DB_Oracle.java | 0 .../src/org/compiere/db/DB_PostgreSQL.java | 0 .../src/org/compiere/db/Database.java | 0 .../src/org/compiere/db/Database16.gif | Bin .../src/org/compiere/db/JDBCInfo.java | 0 .../src/org/compiere/db/LDAP.java | 0 .../src/org/compiere/db/Server16.gif | Bin .../src/org/compiere/db/TestConnection.java | 0 .../src/org/compiere/db/TestEJB.java | 0 .../src/org/compiere/db/package.html | 0 .../src/org/compiere/dbPort/Convert.java | 0 .../org/compiere/dbPort/ConvertDialog.java | 0 .../dbPort/ConvertMap_PostgreSQL.java | 0 .../org/compiere/dbPort/Convert_Oracle.java | 0 .../compiere/dbPort/Convert_PostgreSQL.java | 0 .../dbPort/Convert_PostgreSQLTest.java | 0 .../org/compiere/dbPort/Convert_SQL92.java | 0 .../src/org/compiere/dbPort/JdbcTest.java | 0 .../src/org/compiere/dbPort/JdbcTestPG.java | 0 .../src/org/compiere/dbPort/Join.java | 0 .../compiere/dbPort/PostgresConvertTest.java | 0 .../src/org/compiere/dbPort/package.html | 0 .../src/org/compiere/interfaces/Server.java | 0 .../org/compiere/interfaces/ServerHome.java | 0 .../org/compiere/interfaces/ServerLocal.java | 0 .../compiere/interfaces/ServerLocalHome.java | 0 .../src/org/compiere/interfaces/Status.java | 0 .../org/compiere/interfaces/StatusHome.java | 0 .../org/compiere/interfaces/StatusLocal.java | 0 .../compiere/interfaces/StatusLocalHome.java | 0 .../src/org/compiere/license.html | 0 .../org/compiere/model/AccessSqlParser.java | 0 .../compiere/model/AccessSqlParserTest.java | 0 .../org/compiere/model/DocWorkflowMgr.java | 0 .../src/org/compiere/model/GridFieldVO.java | 0 .../src/org/compiere/model/GridTabVO.java | 0 .../src/org/compiere/model/GridWindowVO.java | 0 .../src/org/compiere/model/Lookup.java | 0 .../compiere/model/LookupDisplayColumn.java | 0 .../src/org/compiere/model/MAccessLog.java | 0 .../src/org/compiere/model/MAccount.java | 0 .../org/compiere/model/MAccountLookup.java | 0 .../src/org/compiere/model/MAcctSchema.java | 0 .../compiere/model/MAcctSchemaDefault.java | 0 .../compiere/model/MAcctSchemaElement.java | 0 .../src/org/compiere/model/MAcctSchemaGL.java | 0 .../src/org/compiere/model/MArchive.java | 0 .../src/org/compiere/model/MAttachment.java | 0 .../org/compiere/model/MAttachmentEntry.java | 0 .../org/compiere/model/MAttachmentNote.java | 0 .../src/org/compiere/model/MChangeLog.java | 0 .../src/org/compiere/model/MClient.java | 0 .../src/org/compiere/model/MClientInfo.java | 0 .../src/org/compiere/model/MClientShare.java | 0 .../src/org/compiere/model/MColumn.java | 0 .../src/org/compiere/model/MColumnAccess.java | 0 .../org/compiere/model/MConversionRate.java | 0 .../org/compiere/model/MConversionType.java | 0 .../src/org/compiere/model/MCostElement.java | 0 .../src/org/compiere/model/MCostType.java | 0 .../src/org/compiere/model/MCountry.java | 0 .../src/org/compiere/model/MCurrency.java | 0 .../src/org/compiere/model/MCurrencyAcct.java | 0 .../src/org/compiere/model/MDocType.java | 0 .../src/org/compiere/model/MElement.java | 0 .../src/org/compiere/model/MElementValue.java | 0 .../src/org/compiere/model/MField.java | 0 .../src/org/compiere/model/MImage.java | 0 .../src/org/compiere/model/MIssue.java | 0 .../src/org/compiere/model/MIssueProject.java | 0 .../src/org/compiere/model/MIssueSystem.java | 0 .../src/org/compiere/model/MIssueUser.java | 0 .../src/org/compiere/model/MLanguage.java | 0 .../src/org/compiere/model/MLocation.java | 0 .../org/compiere/model/MLocationLookup.java | 0 .../src/org/compiere/model/MLocator.java | 0 .../org/compiere/model/MLocatorLookup.java | 0 .../src/org/compiere/model/MLookup.java | 0 .../src/org/compiere/model/MLookupCache.java | 0 .../org/compiere/model/MLookupFactory.java | 0 .../src/org/compiere/model/MLookupInfo.java | 0 .../src/org/compiere/model/MMenu.java | 0 .../src/org/compiere/model/MMessage.java | 0 .../src/org/compiere/model/MNote.java | 0 .../src/org/compiere/model/MOrg.java | 0 .../src/org/compiere/model/MOrgInfo.java | 0 .../org/compiere/model/MPAttributeLookup.java | 0 .../src/org/compiere/model/MPInstance.java | 0 .../src/org/compiere/model/MPInstanceLog.java | 0 .../org/compiere/model/MPInstancePara.java | 0 .../src/org/compiere/model/MPackageExp.java | 0 .../org/compiere/model/MPackageExpCommon.java | 0 .../org/compiere/model/MPackageExpDetail.java | 0 .../org/compiere/model/MPrivateAccess.java | 0 .../src/org/compiere/model/MProcess.java | 0 .../org/compiere/model/MProcessAccess.java | 0 .../src/org/compiere/model/MProcessPara.java | 0 .../src/org/compiere/model/MQuery.java | 0 .../src/org/compiere/model/MRecordAccess.java | 0 .../src/org/compiere/model/MRefList.java | 0 .../src/org/compiere/model/MRegion.java | 0 .../src/org/compiere/model/MRole.java | 0 .../org/compiere/model/MRoleOrgAccess.java | 0 .../src/org/compiere/model/MRoleTest.java | 0 .../src/org/compiere/model/MSalesRegion.java | 0 .../src/org/compiere/model/MSequence.java | 0 .../src/org/compiere/model/MSession.java | 0 .../src/org/compiere/model/MSysConfig.java | 0 .../src/org/compiere/model/MSystem.java | 0 .../src/org/compiere/model/MTab.java | 0 .../src/org/compiere/model/MTable.java | 0 .../src/org/compiere/model/MTableAccess.java | 0 .../src/org/compiere/model/MTest.java | 0 .../src/org/compiere/model/MTree_Base.java | 0 .../src/org/compiere/model/MTree_Node.java | 0 .../src/org/compiere/model/MTree_NodeBP.java | 0 .../src/org/compiere/model/MTree_NodeCMC.java | 0 .../src/org/compiere/model/MTree_NodeCMS.java | 0 .../src/org/compiere/model/MTree_NodeMM.java | 0 .../src/org/compiere/model/MTree_NodePR.java | 0 .../src/org/compiere/model/MUser.java | 0 .../org/compiere/model/MUserOrgAccess.java | 0 .../src/org/compiere/model/MUserRoles.java | 0 .../src/org/compiere/model/MWarehouse.java | 0 .../src/org/compiere/model/MWindow.java | 0 .../src/org/compiere/model/MWindowAccess.java | 0 .../src/org/compiere/model/M_Element.java | 0 .../org/compiere/model/M_Registration.java | 0 .../compiere/model/ModelValidationEngine.java | 0 .../org/compiere/model/ModelValidator.java | 6 +- .../src/org/compiere/model/Null.java | 0 .../src/org/compiere/model/Obscure.java | 0 .../src/org/compiere/model/PO.java | 20 + .../src/org/compiere/model/POInfo.java | 0 .../src/org/compiere/model/POInfoColumn.java | 0 .../src/org/compiere/model/PO_LOB.java | 0 .../src/org/compiere/model/PO_Record.java | 0 .../src/org/compiere/model/PrintInfo.java | 0 .../org/compiere/model/TranslationTable.java | 0 .../src/org/compiere/model/VO.java | 0 .../org/compiere/model/X_AD_AccessLog.java | 0 .../src/org/compiere/model/X_AD_Alert.java | 0 .../compiere/model/X_AD_AlertProcessor.java | 0 .../model/X_AD_AlertProcessorLog.java | 0 .../compiere/model/X_AD_AlertRecipient.java | 0 .../org/compiere/model/X_AD_AlertRule.java | 0 .../src/org/compiere/model/X_AD_Archive.java | 0 .../org/compiere/model/X_AD_Attachment.java | 0 .../compiere/model/X_AD_AttachmentNote.java | 0 .../org/compiere/model/X_AD_Attribute.java | 0 .../compiere/model/X_AD_Attribute_Value.java | 0 .../org/compiere/model/X_AD_ChangeLog.java | 0 .../src/org/compiere/model/X_AD_Client.java | 0 .../org/compiere/model/X_AD_ClientInfo.java | 0 .../org/compiere/model/X_AD_ClientShare.java | 0 .../src/org/compiere/model/X_AD_Color.java | 0 .../src/org/compiere/model/X_AD_Column.java | 0 .../compiere/model/X_AD_Column_Access.java | 0 .../src/org/compiere/model/X_AD_Desktop.java | 0 .../compiere/model/X_AD_DesktopWorkbench.java | 0 .../src/org/compiere/model/X_AD_Element.java | 0 .../org/compiere/model/X_AD_EntityType.java | 0 .../src/org/compiere/model/X_AD_Error.java | 0 .../src/org/compiere/model/X_AD_Field.java | 0 .../org/compiere/model/X_AD_FieldGroup.java | 0 .../src/org/compiere/model/X_AD_Find.java | 0 .../src/org/compiere/model/X_AD_Form.java | 0 .../org/compiere/model/X_AD_Form_Access.java | 0 .../src/org/compiere/model/X_AD_Image.java | 0 .../org/compiere/model/X_AD_ImpFormat.java | 0 .../compiere/model/X_AD_ImpFormat_Row.java | 0 .../org/compiere/model/X_AD_InfoColumn.java | 0 .../org/compiere/model/X_AD_InfoWindow.java | 0 .../src/org/compiere/model/X_AD_Issue.java | 0 .../org/compiere/model/X_AD_LabelPrinter.java | 0 .../model/X_AD_LabelPrinterFunction.java | 0 .../src/org/compiere/model/X_AD_Language.java | 0 .../org/compiere/model/X_AD_LdapAccess.java | 0 .../compiere/model/X_AD_LdapProcessor.java | 0 .../compiere/model/X_AD_LdapProcessorLog.java | 0 .../src/org/compiere/model/X_AD_Menu.java | 0 .../src/org/compiere/model/X_AD_Message.java | 0 .../org/compiere/model/X_AD_Modification.java | 0 .../src/org/compiere/model/X_AD_Note.java | 0 .../src/org/compiere/model/X_AD_Org.java | 0 .../src/org/compiere/model/X_AD_OrgInfo.java | 0 .../src/org/compiere/model/X_AD_OrgType.java | 0 .../org/compiere/model/X_AD_PInstance.java | 0 .../compiere/model/X_AD_PInstance_Log.java | 0 .../compiere/model/X_AD_PInstance_Para.java | 0 .../org/compiere/model/X_AD_Package_Exp.java | 0 .../model/X_AD_Package_Exp_Common.java | 0 .../model/X_AD_Package_Exp_Detail.java | 0 .../org/compiere/model/X_AD_Package_Imp.java | 0 .../model/X_AD_Package_Imp_Backup.java | 0 .../model/X_AD_Package_Imp_Detail.java | 0 .../compiere/model/X_AD_Package_Imp_Inst.java | 0 .../compiere/model/X_AD_Package_Imp_Proc.java | 0 .../org/compiere/model/X_AD_Preference.java | 0 .../org/compiere/model/X_AD_PrintColor.java | 0 .../org/compiere/model/X_AD_PrintFont.java | 0 .../org/compiere/model/X_AD_PrintForm.java | 0 .../org/compiere/model/X_AD_PrintFormat.java | 0 .../compiere/model/X_AD_PrintFormatItem.java | 0 .../org/compiere/model/X_AD_PrintGraph.java | 0 .../org/compiere/model/X_AD_PrintLabel.java | 0 .../compiere/model/X_AD_PrintLabelLine.java | 0 .../org/compiere/model/X_AD_PrintPaper.java | 0 .../compiere/model/X_AD_PrintTableFormat.java | 0 .../compiere/model/X_AD_Private_Access.java | 0 .../src/org/compiere/model/X_AD_Process.java | 0 .../compiere/model/X_AD_Process_Access.java | 0 .../org/compiere/model/X_AD_Process_Para.java | 0 .../compiere/model/X_AD_Record_Access.java | 0 .../src/org/compiere/model/X_AD_Ref_List.java | 0 .../org/compiere/model/X_AD_Ref_Table.java | 0 .../org/compiere/model/X_AD_Reference.java | 0 .../org/compiere/model/X_AD_Registration.java | 0 .../org/compiere/model/X_AD_Replication.java | 0 .../model/X_AD_ReplicationStrategy.java | 0 .../compiere/model/X_AD_ReplicationTable.java | 0 .../compiere/model/X_AD_Replication_Log.java | 0 .../compiere/model/X_AD_Replication_Run.java | 0 .../org/compiere/model/X_AD_ReportView.java | 0 .../compiere/model/X_AD_ReportView_Col.java | 0 .../src/org/compiere/model/X_AD_Role.java | 0 .../compiere/model/X_AD_Role_OrgAccess.java | 0 .../org/compiere/model/X_AD_Scheduler.java | 0 .../org/compiere/model/X_AD_SchedulerLog.java | 0 .../model/X_AD_SchedulerRecipient.java | 0 .../compiere/model/X_AD_Scheduler_Para.java | 0 .../src/org/compiere/model/X_AD_Sequence.java | 0 .../compiere/model/X_AD_Sequence_Audit.java | 0 .../org/compiere/model/X_AD_Sequence_No.java | 0 .../src/org/compiere/model/X_AD_Session.java | 0 .../org/compiere/model/X_AD_SysConfig.java | 0 .../src/org/compiere/model/X_AD_System.java | 0 .../src/org/compiere/model/X_AD_Tab.java | 0 .../src/org/compiere/model/X_AD_Table.java | 0 .../org/compiere/model/X_AD_Table_Access.java | 0 .../src/org/compiere/model/X_AD_Task.java | 0 .../org/compiere/model/X_AD_TaskInstance.java | 0 .../org/compiere/model/X_AD_Task_Access.java | 0 .../src/org/compiere/model/X_AD_Tree.java | 0 .../src/org/compiere/model/X_AD_TreeBar.java | 0 .../src/org/compiere/model/X_AD_TreeNode.java | 0 .../org/compiere/model/X_AD_TreeNodeBP.java | 0 .../org/compiere/model/X_AD_TreeNodeCMC.java | 0 .../org/compiere/model/X_AD_TreeNodeCMM.java | 0 .../org/compiere/model/X_AD_TreeNodeCMS.java | 0 .../org/compiere/model/X_AD_TreeNodeCMT.java | 0 .../org/compiere/model/X_AD_TreeNodeMM.java | 0 .../org/compiere/model/X_AD_TreeNodePR.java | 0 .../org/compiere/model/X_AD_TreeNodeU1.java | 0 .../org/compiere/model/X_AD_TreeNodeU2.java | 0 .../org/compiere/model/X_AD_TreeNodeU3.java | 0 .../org/compiere/model/X_AD_TreeNodeU4.java | 0 .../src/org/compiere/model/X_AD_User.java | 0 .../org/compiere/model/X_AD_UserBPAccess.java | 0 .../compiere/model/X_AD_UserDef_Field.java | 0 .../org/compiere/model/X_AD_UserDef_Tab.java | 0 .../org/compiere/model/X_AD_UserDef_Win.java | 0 .../src/org/compiere/model/X_AD_UserMail.java | 0 .../org/compiere/model/X_AD_UserQuery.java | 0 .../compiere/model/X_AD_User_OrgAccess.java | 0 .../org/compiere/model/X_AD_User_Roles.java | 0 .../compiere/model/X_AD_User_Substitute.java | 0 .../src/org/compiere/model/X_AD_Val_Rule.java | 0 .../org/compiere/model/X_AD_WF_Activity.java | 0 .../model/X_AD_WF_ActivityResult.java | 0 .../src/org/compiere/model/X_AD_WF_Block.java | 0 .../compiere/model/X_AD_WF_EventAudit.java | 0 .../compiere/model/X_AD_WF_NextCondition.java | 0 .../src/org/compiere/model/X_AD_WF_Node.java | 0 .../org/compiere/model/X_AD_WF_NodeNext.java | 0 .../org/compiere/model/X_AD_WF_Node_Para.java | 0 .../org/compiere/model/X_AD_WF_Process.java | 0 .../compiere/model/X_AD_WF_ProcessData.java | 0 .../compiere/model/X_AD_WF_Responsible.java | 0 .../src/org/compiere/model/X_AD_Window.java | 0 .../compiere/model/X_AD_Window_Access.java | 0 .../org/compiere/model/X_AD_Workbench.java | 0 .../compiere/model/X_AD_WorkbenchWindow.java | 0 .../src/org/compiere/model/X_AD_Workflow.java | 0 .../model/X_AD_WorkflowProcessor.java | 0 .../model/X_AD_WorkflowProcessorLog.java | 0 .../compiere/model/X_AD_Workflow_Access.java | 0 .../src/org/compiere/model/X_A_Asset.java | 0 .../compiere/model/X_A_Asset_Delivery.java | 0 .../org/compiere/model/X_A_Asset_Group.java | 0 .../compiere/model/X_A_Asset_Retirement.java | 0 .../org/compiere/model/X_A_Registration.java | 0 .../model/X_A_RegistrationAttribute.java | 0 .../model/X_A_RegistrationProduct.java | 0 .../compiere/model/X_A_RegistrationValue.java | 0 .../src/org/compiere/model/X_B_Bid.java | 0 .../org/compiere/model/X_B_BidComment.java | 0 .../src/org/compiere/model/X_B_Buyer.java | 0 .../org/compiere/model/X_B_BuyerFunds.java | 0 .../src/org/compiere/model/X_B_Offer.java | 0 .../src/org/compiere/model/X_B_Seller.java | 0 .../org/compiere/model/X_B_SellerFunds.java | 0 .../src/org/compiere/model/X_B_Topic.java | 0 .../org/compiere/model/X_B_TopicCategory.java | 0 .../src/org/compiere/model/X_B_TopicType.java | 0 .../compiere/model/X_CM_AccessContainer.java | 0 .../model/X_CM_AccessListBPGroup.java | 0 .../compiere/model/X_CM_AccessListRole.java | 0 .../org/compiere/model/X_CM_AccessMedia.java | 0 .../model/X_CM_AccessNewsChannel.java | 0 .../compiere/model/X_CM_AccessProfile.java | 0 .../org/compiere/model/X_CM_AccessStage.java | 0 .../src/org/compiere/model/X_CM_Ad.java | 0 .../src/org/compiere/model/X_CM_Ad_Cat.java | 0 .../compiere/model/X_CM_BroadcastServer.java | 0 .../src/org/compiere/model/X_CM_CStage.java | 0 .../org/compiere/model/X_CM_CStageTTable.java | 0 .../compiere/model/X_CM_CStage_Element.java | 0 .../src/org/compiere/model/X_CM_Chat.java | 0 .../org/compiere/model/X_CM_ChatEntry.java | 0 .../src/org/compiere/model/X_CM_ChatType.java | 0 .../compiere/model/X_CM_ChatTypeUpdate.java | 0 .../org/compiere/model/X_CM_ChatUpdate.java | 0 .../org/compiere/model/X_CM_Container.java | 0 .../compiere/model/X_CM_ContainerTTable.java | 0 .../model/X_CM_Container_Element.java | 0 .../compiere/model/X_CM_Container_Index.java | 0 .../compiere/model/X_CM_Container_ToDo.java | 0 .../compiere/model/X_CM_Container_URL.java | 0 .../src/org/compiere/model/X_CM_Media.java | 0 .../org/compiere/model/X_CM_MediaDeploy.java | 0 .../org/compiere/model/X_CM_Media_Server.java | 0 .../org/compiere/model/X_CM_NewsChannel.java | 0 .../src/org/compiere/model/X_CM_NewsItem.java | 0 .../src/org/compiere/model/X_CM_Template.java | 0 .../compiere/model/X_CM_TemplateTable.java | 0 .../compiere/model/X_CM_Template_Ad_Cat.java | 0 .../org/compiere/model/X_CM_WebAccessLog.java | 0 .../org/compiere/model/X_CM_WebProject.java | 0 .../model/X_CM_WebProject_Domain.java | 0 .../org/compiere/model/X_CM_WikiToken.java | 0 .../org/compiere/model/X_C_AcctProcessor.java | 0 .../compiere/model/X_C_AcctProcessorLog.java | 0 .../org/compiere/model/X_C_AcctSchema.java | 0 .../model/X_C_AcctSchema_Default.java | 0 .../model/X_C_AcctSchema_Element.java | 0 .../org/compiere/model/X_C_AcctSchema_GL.java | 0 .../src/org/compiere/model/X_C_Activity.java | 0 .../org/compiere/model/X_C_AllocationHdr.java | 0 .../compiere/model/X_C_AllocationLine.java | 0 .../compiere/model/X_C_BP_BankAccount.java | 0 .../compiere/model/X_C_BP_Customer_Acct.java | 0 .../src/org/compiere/model/X_C_BP_EDI.java | 0 .../compiere/model/X_C_BP_Employee_Acct.java | 0 .../src/org/compiere/model/X_C_BP_Group.java | 0 .../org/compiere/model/X_C_BP_Group_Acct.java | 0 .../org/compiere/model/X_C_BP_Relation.java | 0 .../compiere/model/X_C_BP_Vendor_Acct.java | 0 .../compiere/model/X_C_BP_Withholding.java | 0 .../src/org/compiere/model/X_C_BPartner.java | 0 .../compiere/model/X_C_BPartner_Location.java | 0 .../compiere/model/X_C_BPartner_Product.java | 0 .../src/org/compiere/model/X_C_Bank.java | 0 .../org/compiere/model/X_C_BankAccount.java | 0 .../compiere/model/X_C_BankAccountDoc.java | 0 .../compiere/model/X_C_BankAccount_Acct.java | 0 .../org/compiere/model/X_C_BankStatement.java | 0 .../compiere/model/X_C_BankStatementLine.java | 0 .../model/X_C_BankStatementLoader.java | 0 .../model/X_C_BankStatementMatcher.java | 0 .../src/org/compiere/model/X_C_Calendar.java | 0 .../src/org/compiere/model/X_C_Campaign.java | 0 .../src/org/compiere/model/X_C_Cash.java | 0 .../src/org/compiere/model/X_C_CashBook.java | 0 .../org/compiere/model/X_C_CashBook_Acct.java | 0 .../src/org/compiere/model/X_C_CashLine.java | 0 .../src/org/compiere/model/X_C_Channel.java | 0 .../src/org/compiere/model/X_C_Charge.java | 0 .../org/compiere/model/X_C_Charge_Acct.java | 0 .../src/org/compiere/model/X_C_City.java | 0 .../org/compiere/model/X_C_Commission.java | 0 .../org/compiere/model/X_C_CommissionAmt.java | 0 .../compiere/model/X_C_CommissionDetail.java | 0 .../compiere/model/X_C_CommissionLine.java | 0 .../org/compiere/model/X_C_CommissionRun.java | 0 .../compiere/model/X_C_ConversionType.java | 0 .../compiere/model/X_C_Conversion_Rate.java | 0 .../src/org/compiere/model/X_C_Country.java | 0 .../src/org/compiere/model/X_C_Currency.java | 0 .../org/compiere/model/X_C_Currency_Acct.java | 0 .../src/org/compiere/model/X_C_Cycle.java | 0 .../org/compiere/model/X_C_CyclePhase.java | 0 .../src/org/compiere/model/X_C_CycleStep.java | 0 .../src/org/compiere/model/X_C_DocType.java | 0 .../compiere/model/X_C_DocTypeCounter.java | 0 .../src/org/compiere/model/X_C_Dunning.java | 0 .../org/compiere/model/X_C_DunningLevel.java | 0 .../org/compiere/model/X_C_DunningRun.java | 0 .../compiere/model/X_C_DunningRunEntry.java | 0 .../compiere/model/X_C_DunningRunLine.java | 0 .../src/org/compiere/model/X_C_Element.java | 0 .../org/compiere/model/X_C_ElementValue.java | 0 .../src/org/compiere/model/X_C_Greeting.java | 0 .../org/compiere/model/X_C_InterOrg_Acct.java | 0 .../src/org/compiere/model/X_C_Invoice.java | 0 .../org/compiere/model/X_C_InvoiceBatch.java | 0 .../compiere/model/X_C_InvoiceBatchLine.java | 0 .../org/compiere/model/X_C_InvoiceLine.java | 0 .../model/X_C_InvoicePaySchedule.java | 0 .../compiere/model/X_C_InvoiceSchedule.java | 0 .../org/compiere/model/X_C_InvoiceTax.java | 0 .../src/org/compiere/model/X_C_Job.java | 0 .../org/compiere/model/X_C_JobAssignment.java | 0 .../org/compiere/model/X_C_JobCategory.java | 0 .../compiere/model/X_C_JobRemuneration.java | 0 .../org/compiere/model/X_C_LandedCost.java | 0 .../model/X_C_LandedCostAllocation.java | 0 .../src/org/compiere/model/X_C_Location.java | 0 .../compiere/model/X_C_NonBusinessDay.java | 0 .../src/org/compiere/model/X_C_Order.java | 0 .../src/org/compiere/model/X_C_OrderLine.java | 0 .../src/org/compiere/model/X_C_OrderTax.java | 0 .../org/compiere/model/X_C_OrgAssignment.java | 0 .../src/org/compiere/model/X_C_POS.java | 0 .../src/org/compiere/model/X_C_POSKey.java | 0 .../org/compiere/model/X_C_POSKeyLayout.java | 0 .../org/compiere/model/X_C_PaySchedule.java | 0 .../org/compiere/model/X_C_PaySelection.java | 0 .../compiere/model/X_C_PaySelectionCheck.java | 0 .../compiere/model/X_C_PaySelectionLine.java | 0 .../src/org/compiere/model/X_C_Payment.java | 0 .../compiere/model/X_C_PaymentAllocate.java | 0 .../org/compiere/model/X_C_PaymentBatch.java | 0 .../compiere/model/X_C_PaymentProcessor.java | 0 .../org/compiere/model/X_C_PaymentTerm.java | 0 .../src/org/compiere/model/X_C_Period.java | 0 .../org/compiere/model/X_C_PeriodControl.java | 0 .../src/org/compiere/model/X_C_Phase.java | 0 .../src/org/compiere/model/X_C_Project.java | 0 .../org/compiere/model/X_C_ProjectIssue.java | 0 .../compiere/model/X_C_ProjectIssueMA.java | 0 .../org/compiere/model/X_C_ProjectLine.java | 0 .../org/compiere/model/X_C_ProjectPhase.java | 0 .../org/compiere/model/X_C_ProjectTask.java | 0 .../org/compiere/model/X_C_ProjectType.java | 0 .../org/compiere/model/X_C_Project_Acct.java | 0 .../src/org/compiere/model/X_C_Recurring.java | 0 .../org/compiere/model/X_C_Recurring_Run.java | 0 .../src/org/compiere/model/X_C_Region.java | 0 .../org/compiere/model/X_C_Remuneration.java | 0 .../model/X_C_RevenueRecognition.java | 0 .../model/X_C_RevenueRecognition_Plan.java | 0 .../model/X_C_RevenueRecognition_Run.java | 0 .../src/org/compiere/model/X_C_RfQ.java | 0 .../src/org/compiere/model/X_C_RfQLine.java | 0 .../org/compiere/model/X_C_RfQLineQty.java | 0 .../org/compiere/model/X_C_RfQResponse.java | 0 .../compiere/model/X_C_RfQResponseLine.java | 0 .../model/X_C_RfQResponseLineQty.java | 0 .../src/org/compiere/model/X_C_RfQ_Topic.java | 0 .../model/X_C_RfQ_TopicSubscriber.java | 0 .../model/X_C_RfQ_TopicSubscriberOnly.java | 0 .../org/compiere/model/X_C_SalesRegion.java | 0 .../org/compiere/model/X_C_ServiceLevel.java | 0 .../compiere/model/X_C_ServiceLevelLine.java | 0 .../src/org/compiere/model/X_C_SubAcct.java | 0 .../org/compiere/model/X_C_Subscription.java | 0 .../compiere/model/X_C_SubscriptionType.java | 0 .../model/X_C_Subscription_Delivery.java | 0 .../src/org/compiere/model/X_C_Task.java | 0 .../src/org/compiere/model/X_C_Tax.java | 0 .../org/compiere/model/X_C_TaxCategory.java | 0 .../compiere/model/X_C_TaxDeclaration.java | 0 .../model/X_C_TaxDeclarationAcct.java | 0 .../model/X_C_TaxDeclarationLine.java | 0 .../src/org/compiere/model/X_C_TaxPostal.java | 0 .../src/org/compiere/model/X_C_Tax_Acct.java | 0 .../src/org/compiere/model/X_C_UOM.java | 0 .../compiere/model/X_C_UOM_Conversion.java | 0 .../compiere/model/X_C_UserRemuneration.java | 0 .../compiere/model/X_C_ValidCombination.java | 0 .../org/compiere/model/X_C_Withholding.java | 0 .../compiere/model/X_C_Withholding_Acct.java | 0 .../src/org/compiere/model/X_C_Year.java | 0 .../src/org/compiere/model/X_Fact_Acct.java | 0 .../compiere/model/X_Fact_Acct_Balance.java | 0 .../src/org/compiere/model/X_GL_Budget.java | 0 .../compiere/model/X_GL_BudgetControl.java | 0 .../src/org/compiere/model/X_GL_Category.java | 0 .../org/compiere/model/X_GL_Distribution.java | 0 .../compiere/model/X_GL_DistributionLine.java | 0 .../src/org/compiere/model/X_GL_Fund.java | 0 .../compiere/model/X_GL_FundRestriction.java | 0 .../src/org/compiere/model/X_GL_Journal.java | 0 .../org/compiere/model/X_GL_JournalBatch.java | 0 .../org/compiere/model/X_GL_JournalLine.java | 0 .../src/org/compiere/model/X_I_BPartner.java | 0 .../org/compiere/model/X_I_BankStatement.java | 0 .../compiere/model/X_I_Conversion_Rate.java | 0 .../org/compiere/model/X_I_ElementValue.java | 0 .../src/org/compiere/model/X_I_GLJournal.java | 0 .../compiere/model/X_I_InOutLineConfirm.java | 0 .../src/org/compiere/model/X_I_Inventory.java | 0 .../src/org/compiere/model/X_I_Invoice.java | 0 .../src/org/compiere/model/X_I_Order.java | 0 .../src/org/compiere/model/X_I_Payment.java | 0 .../src/org/compiere/model/X_I_Product.java | 0 .../org/compiere/model/X_I_ReportLine.java | 0 .../src/org/compiere/model/X_K_Category.java | 0 .../org/compiere/model/X_K_CategoryValue.java | 0 .../src/org/compiere/model/X_K_Comment.java | 0 .../src/org/compiere/model/X_K_Entry.java | 0 .../org/compiere/model/X_K_EntryCategory.java | 0 .../org/compiere/model/X_K_EntryRelated.java | 0 .../src/org/compiere/model/X_K_Index.java | 0 .../src/org/compiere/model/X_K_IndexLog.java | 0 .../src/org/compiere/model/X_K_IndexStop.java | 0 .../src/org/compiere/model/X_K_Source.java | 0 .../src/org/compiere/model/X_K_Synonym.java | 0 .../src/org/compiere/model/X_K_Topic.java | 0 .../src/org/compiere/model/X_K_Type.java | 0 .../src/org/compiere/model/X_M_Attribute.java | 0 .../compiere/model/X_M_AttributeInstance.java | 0 .../compiere/model/X_M_AttributeSearch.java | 0 .../org/compiere/model/X_M_AttributeSet.java | 0 .../model/X_M_AttributeSetExclude.java | 0 .../model/X_M_AttributeSetInstance.java | 0 .../org/compiere/model/X_M_AttributeUse.java | 0 .../compiere/model/X_M_AttributeValue.java | 0 .../src/org/compiere/model/X_M_BOM.java | 0 .../compiere/model/X_M_BOMAlternative.java | 0 .../org/compiere/model/X_M_BOMProduct.java | 0 .../org/compiere/model/X_M_ChangeNotice.java | 0 .../org/compiere/model/X_M_ChangeRequest.java | 0 .../src/org/compiere/model/X_M_Cost.java | 0 .../org/compiere/model/X_M_CostDetail.java | 0 .../org/compiere/model/X_M_CostElement.java | 0 .../src/org/compiere/model/X_M_CostQueue.java | 0 .../src/org/compiere/model/X_M_CostType.java | 0 .../src/org/compiere/model/X_M_Demand.java | 0 .../org/compiere/model/X_M_DemandDetail.java | 0 .../org/compiere/model/X_M_DemandLine.java | 0 .../compiere/model/X_M_DiscountSchema.java | 0 .../model/X_M_DiscountSchemaBreak.java | 0 .../model/X_M_DiscountSchemaLine.java | 0 .../compiere/model/X_M_DistributionList.java | 0 .../model/X_M_DistributionListLine.java | 0 .../compiere/model/X_M_DistributionRun.java | 0 .../model/X_M_DistributionRunLine.java | 0 .../src/org/compiere/model/X_M_EDI.java | 0 .../src/org/compiere/model/X_M_EDI_Info.java | 0 .../src/org/compiere/model/X_M_Forecast.java | 0 .../org/compiere/model/X_M_ForecastLine.java | 0 .../src/org/compiere/model/X_M_Freight.java | 0 .../compiere/model/X_M_FreightCategory.java | 0 .../src/org/compiere/model/X_M_InOut.java | 0 .../org/compiere/model/X_M_InOutConfirm.java | 0 .../src/org/compiere/model/X_M_InOutLine.java | 0 .../compiere/model/X_M_InOutLineConfirm.java | 0 .../org/compiere/model/X_M_InOutLineMA.java | 0 .../src/org/compiere/model/X_M_Inventory.java | 0 .../org/compiere/model/X_M_InventoryLine.java | 0 .../compiere/model/X_M_InventoryLineMA.java | 0 .../src/org/compiere/model/X_M_Locator.java | 0 .../src/org/compiere/model/X_M_Lot.java | 0 .../src/org/compiere/model/X_M_LotCtl.java | 0 .../org/compiere/model/X_M_LotCtlExclude.java | 0 .../src/org/compiere/model/X_M_MatchInv.java | 0 .../src/org/compiere/model/X_M_MatchPO.java | 0 .../src/org/compiere/model/X_M_Movement.java | 0 .../compiere/model/X_M_MovementConfirm.java | 0 .../org/compiere/model/X_M_MovementLine.java | 0 .../model/X_M_MovementLineConfirm.java | 0 .../compiere/model/X_M_MovementLineMA.java | 0 .../compiere/model/X_M_OperationResource.java | 0 .../src/org/compiere/model/X_M_Package.java | 0 .../org/compiere/model/X_M_PackageLine.java | 0 .../org/compiere/model/X_M_PerpetualInv.java | 0 .../src/org/compiere/model/X_M_PriceList.java | 0 .../compiere/model/X_M_PriceList_Version.java | 0 .../src/org/compiere/model/X_M_Product.java | 0 .../compiere/model/X_M_ProductDownload.java | 0 .../compiere/model/X_M_ProductOperation.java | 0 .../org/compiere/model/X_M_ProductPrice.java | 0 .../org/compiere/model/X_M_Product_Acct.java | 0 .../org/compiere/model/X_M_Product_BOM.java | 0 .../compiere/model/X_M_Product_Category.java | 0 .../model/X_M_Product_Category_Acct.java | 0 .../compiere/model/X_M_Product_Costing.java | 0 .../org/compiere/model/X_M_Product_PO.java | 0 .../org/compiere/model/X_M_Production.java | 0 .../compiere/model/X_M_ProductionLine.java | 0 .../compiere/model/X_M_ProductionLineMA.java | 0 .../compiere/model/X_M_ProductionPlan.java | 0 .../src/org/compiere/model/X_M_RMA.java | 0 .../src/org/compiere/model/X_M_RMALine.java | 0 .../src/org/compiere/model/X_M_RMAType.java | 0 .../compiere/model/X_M_RelatedProduct.java | 0 .../src/org/compiere/model/X_M_Replenish.java | 0 .../org/compiere/model/X_M_Requisition.java | 0 .../compiere/model/X_M_RequisitionLine.java | 0 .../src/org/compiere/model/X_M_SerNoCtl.java | 0 .../compiere/model/X_M_SerNoCtlExclude.java | 0 .../src/org/compiere/model/X_M_Shipper.java | 0 .../src/org/compiere/model/X_M_Storage.java | 0 .../org/compiere/model/X_M_Substitute.java | 0 .../org/compiere/model/X_M_Transaction.java | 0 .../model/X_M_TransactionAllocation.java | 0 .../src/org/compiere/model/X_M_Warehouse.java | 0 .../compiere/model/X_M_Warehouse_Acct.java | 0 .../org/compiere/model/X_PA_Achievement.java | 0 .../org/compiere/model/X_PA_Benchmark.java | 0 .../compiere/model/X_PA_BenchmarkData.java | 0 .../org/compiere/model/X_PA_ColorSchema.java | 0 .../src/org/compiere/model/X_PA_Goal.java | 0 .../compiere/model/X_PA_GoalRestriction.java | 0 .../org/compiere/model/X_PA_Hierarchy.java | 0 .../src/org/compiere/model/X_PA_Measure.java | 0 .../org/compiere/model/X_PA_MeasureCalc.java | 0 .../src/org/compiere/model/X_PA_Ratio.java | 0 .../org/compiere/model/X_PA_RatioElement.java | 0 .../src/org/compiere/model/X_PA_Report.java | 0 .../org/compiere/model/X_PA_ReportColumn.java | 0 .../compiere/model/X_PA_ReportColumnSet.java | 0 .../org/compiere/model/X_PA_ReportLine.java | 0 .../compiere/model/X_PA_ReportLineSet.java | 0 .../org/compiere/model/X_PA_ReportSource.java | 0 .../org/compiere/model/X_PA_SLA_Criteria.java | 0 .../src/org/compiere/model/X_PA_SLA_Goal.java | 0 .../org/compiere/model/X_PA_SLA_Measure.java | 0 .../src/org/compiere/model/X_RV_BPartner.java | 0 .../compiere/model/X_RV_WarehousePrice.java | 0 .../src/org/compiere/model/X_R_Category.java | 0 .../compiere/model/X_R_CategoryUpdates.java | 0 .../compiere/model/X_R_ContactInterest.java | 0 .../src/org/compiere/model/X_R_Group.java | 0 .../org/compiere/model/X_R_GroupUpdates.java | 0 .../org/compiere/model/X_R_InterestArea.java | 0 .../org/compiere/model/X_R_IssueKnown.java | 0 .../org/compiere/model/X_R_IssueProject.java | 0 .../model/X_R_IssueRecommendation.java | 0 .../org/compiere/model/X_R_IssueStatus.java | 0 .../org/compiere/model/X_R_IssueSystem.java | 0 .../src/org/compiere/model/X_R_IssueUser.java | 0 .../src/org/compiere/model/X_R_MailText.java | 0 .../src/org/compiere/model/X_R_Request.java | 0 .../org/compiere/model/X_R_RequestAction.java | 0 .../compiere/model/X_R_RequestProcessor.java | 0 .../model/X_R_RequestProcessorLog.java | 0 .../model/X_R_RequestProcessor_Route.java | 0 .../org/compiere/model/X_R_RequestType.java | 0 .../model/X_R_RequestTypeUpdates.java | 0 .../org/compiere/model/X_R_RequestUpdate.java | 0 .../compiere/model/X_R_RequestUpdates.java | 0 .../org/compiere/model/X_R_Resolution.java | 0 .../compiere/model/X_R_StandardResponse.java | 0 .../src/org/compiere/model/X_R_Status.java | 0 .../compiere/model/X_R_StatusCategory.java | 0 .../org/compiere/model/X_S_ExpenseType.java | 0 .../src/org/compiere/model/X_S_Resource.java | 0 .../model/X_S_ResourceAssignment.java | 0 .../org/compiere/model/X_S_ResourceType.java | 0 .../model/X_S_ResourceUnAvailable.java | 0 .../org/compiere/model/X_S_TimeExpense.java | 0 .../compiere/model/X_S_TimeExpenseLine.java | 0 .../src/org/compiere/model/X_S_TimeType.java | 0 .../src/org/compiere/model/X_S_Training.java | 0 .../compiere/model/X_S_Training_Class.java | 0 .../src/org/compiere/model/X_T_Aging.java | 0 .../model/X_T_DistributionRunDetail.java | 0 .../compiere/model/X_T_InventoryValue.java | 0 .../src/org/compiere/model/X_T_InvoiceGL.java | 0 .../src/org/compiere/model/X_T_Replenish.java | 0 .../src/org/compiere/model/X_T_Report.java | 0 .../compiere/model/X_T_ReportStatement.java | 0 .../org/compiere/model/X_T_Transaction.java | 0 .../src/org/compiere/model/X_Test.java | 0 .../org/compiere/model/X_W_Advertisement.java | 0 .../src/org/compiere/model/X_W_Basket.java | 0 .../org/compiere/model/X_W_BasketLine.java | 0 .../src/org/compiere/model/X_W_Click.java | 0 .../org/compiere/model/X_W_ClickCount.java | 0 .../src/org/compiere/model/X_W_Counter.java | 0 .../org/compiere/model/X_W_CounterCount.java | 0 .../src/org/compiere/model/X_W_MailMsg.java | 0 .../src/org/compiere/model/X_W_Store.java | 0 .../src/org/compiere/package.html | 0 .../src/org/compiere/print/ArchiveEngine.java | 0 .../src/org/compiere/print/CPaper.java | 0 .../src/org/compiere/print/CPrinter.java | 0 .../src/org/compiere/print/DataEngine.java | 0 .../src/org/compiere/print/MPrintColor.java | 0 .../src/org/compiere/print/MPrintFont.java | 0 .../src/org/compiere/print/MPrintFormat.java | 0 .../org/compiere/print/MPrintFormatItem.java | 0 .../compiere/print/MPrintFormatProcess.java | 0 .../src/org/compiere/print/MPrintGraph.java | 0 .../src/org/compiere/print/MPrintPaper.java | 0 .../org/compiere/print/MPrintTableFormat.java | 0 .../src/org/compiere/print/PrintData.java | 0 .../org/compiere/print/PrintDataColumn.java | 0 .../org/compiere/print/PrintDataElement.java | 0 .../org/compiere/print/PrintDataFunction.java | 0 .../org/compiere/print/PrintDataGroup.java | 0 .../org/compiere/print/PrintDataHandler.java | 0 .../org/compiere/print/PrintFormatUtil.java | 0 .../src/org/compiere/print/PrintUtil.java | 0 .../src/org/compiere/print/ReportEngine.java | 0 .../src/org/compiere/print/View.java | 0 .../compiere/print/layout/BarcodeElement.java | 0 .../org/compiere/print/layout/BoxElement.java | 0 .../print/layout/Dimension2DImpl.java | 0 .../compiere/print/layout/GraphElement.java | 0 .../compiere/print/layout/GridElement.java | 0 .../compiere/print/layout/HTMLElement.java | 0 .../compiere/print/layout/HTMLRenderer.java | 0 .../compiere/print/layout/HeaderFooter.java | 0 .../compiere/print/layout/ImageElement.java | 0 .../compiere/print/layout/LayoutEngine.java | 0 .../print/layout/LocationElement.java | 0 .../src/org/compiere/print/layout/Page.java | 0 .../print/layout/ParameterElement.java | 0 .../compiere/print/layout/PrintElement.java | 0 .../compiere/print/layout/StringElement.java | 0 .../compiere/print/layout/TableElement.java | 0 .../src/org/compiere/print/layout/false10.gif | Bin .../src/org/compiere/print/layout/true10.gif | Bin .../src/org/compiere/print/package.html | 0 .../org/compiere/process/AdempiereServer.java | 0 .../compiere/process/AdempiereService.java | 0 .../org/compiere/process/ClientProcess.java | 0 .../src/org/compiere/process/DocAction.java | 0 .../compiere/process/DocActionTemplate.java | 0 .../org/compiere/process/DocumentEngine.java | 0 .../src/org/compiere/process/IssueReport.java | 0 .../src/org/compiere/process/ProcessCall.java | 0 .../src/org/compiere/process/ProcessInfo.java | 0 .../org/compiere/process/ProcessInfoLog.java | 0 .../process/ProcessInfoParameter.java | 0 .../org/compiere/process/ProcessInfoUtil.java | 0 .../org/compiere/process/SequenceCheck.java | 0 .../src/org/compiere/process/StateEngine.java | 0 .../src/org/compiere/process/SvrProcess.java | 0 .../org/compiere/process/SystemValidate.java | 0 .../src/org/compiere/process/package.html | 0 .../compiere/util/AdempiereSystemError.java | 0 .../org/compiere/util/AdempiereUserError.java | 0 .../src/org/compiere/util/AmtInWords.java | 0 .../src/org/compiere/util/AmtInWords_CA.java | 0 .../src/org/compiere/util/AmtInWords_EN.java | 0 .../src/org/compiere/util/AmtInWords_ES.java | 0 .../src/org/compiere/util/AmtInWords_FA.java | 0 .../src/org/compiere/util/AmtInWords_FR.java | 0 .../src/org/compiere/util/AmtInWords_IN.java | 0 .../src/org/compiere/util/AmtInWords_PL.java | 0 .../src/org/compiere/util/AmtInWords_TH.java | 0 .../compiere/util/ByteArrayDataSource.java | 0 .../src/org/compiere/util/CCache.java | 0 .../src/org/compiere/util/CCachedRowSet.java | 0 .../src/org/compiere/util/CLogConsole.java | 0 .../org/compiere/util/CLogErrorBuffer.java | 0 .../src/org/compiere/util/CLogFile.java | 0 .../src/org/compiere/util/CLogFilter.java | 0 .../src/org/compiere/util/CLogFormatter.java | 0 .../src/org/compiere/util/CLogMgt.java | 0 .../src/org/compiere/util/CLogMgtLog4J.java | 0 .../src/org/compiere/util/CLogger.java | 0 .../src/org/compiere/util/CMemoryUsage.java | 0 .../org/compiere/util/CPreparedStatement.java | 0 .../src/org/compiere/util/CStatement.java | 0 .../src/org/compiere/util/CStatementVO.java | 0 .../src/org/compiere/util/CacheInterface.java | 0 .../src/org/compiere/util/CacheMgt.java | 0 .../src/org/compiere/util/ConnectTest.java | 0 .../src/org/compiere/util/DB.java | 0 .../src/org/compiere/util/DBException.java | 0 .../src/org/compiere/util/DisplayType.java | 0 .../src/org/compiere/util/EMail.java | 0 .../org/compiere/util/EMailAuthenticator.java | 0 .../src/org/compiere/util/EMailTest.java | 0 .../src/org/compiere/util/Env.java | 0 .../src/org/compiere/util/Evaluatee.java | 0 .../src/org/compiere/util/Evaluator.java | 0 .../src/org/compiere/util/GenerateModel.java | 0 .../src/org/compiere/util/Login.java | 0 .../src/org/compiere/util/MimeType.java | 0 .../src/org/compiere/util/Msg.java | 0 .../src/org/compiere/util/NullParameter.java | 0 .../src/org/compiere/util/Splash.java | 0 .../src/org/compiere/util/TimeUtil.java | 0 .../src/org/compiere/util/Trx.java | 0 .../src/org/compiere/util/ZipUtil.java | 0 .../org/compiere/util/logClient.properties | 0 .../org/compiere/util/logServer.properties | 0 utils_dev/RUN_build.bat | 2 + utils_dev/RUN_buildIncremental.bat | 10 +- 878 files changed, 11541 insertions(+), 12 deletions(-) rename {print => base}/src/org/adempiere/pdf/Document.java (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/document-print.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/document-save.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/go-first.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/go-last.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/go-next.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/go-previous.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/rotate-cclock.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/rotate-clock.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/rotate.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/system-search.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/zoom-in.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/22x22/zoom-out.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/48x48/document-print.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/48x48/document-save.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/48x48/go-first.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/48x48/go-last.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/48x48/go-next.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/48x48/go-previous.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/48x48/system-search.png (100%) rename {print => base}/src/org/adempiere/pdf/viewer/PDFViewerBean.java (100%) rename {dbPort => base}/src/org/adempiere/util/GenerateModelJPA.java (100%) rename {dbPort => base}/src/org/compiere/Adempiere.java (100%) rename {dbPort => base}/src/org/compiere/Adempiere.properties (100%) create mode 100644 base/src/org/compiere/acct/Doc.java create mode 100644 base/src/org/compiere/acct/DocLine.java create mode 100644 base/src/org/compiere/acct/DocLine_Allocation.java create mode 100644 base/src/org/compiere/acct/DocLine_Bank.java create mode 100644 base/src/org/compiere/acct/DocLine_Cash.java create mode 100644 base/src/org/compiere/acct/DocTax.java create mode 100644 base/src/org/compiere/acct/Doc_Allocation.java create mode 100644 base/src/org/compiere/acct/Doc_Bank.java create mode 100644 base/src/org/compiere/acct/Doc_Cash.java create mode 100644 base/src/org/compiere/acct/Doc_GLJournal.java create mode 100644 base/src/org/compiere/acct/Doc_InOut.java create mode 100644 base/src/org/compiere/acct/Doc_Inventory.java create mode 100644 base/src/org/compiere/acct/Doc_Invoice.java create mode 100644 base/src/org/compiere/acct/Doc_MatchInv.java create mode 100644 base/src/org/compiere/acct/Doc_MatchPO.java create mode 100644 base/src/org/compiere/acct/Doc_Movement.java create mode 100644 base/src/org/compiere/acct/Doc_Order.java create mode 100644 base/src/org/compiere/acct/Doc_Payment.java create mode 100644 base/src/org/compiere/acct/Doc_Production.java create mode 100644 base/src/org/compiere/acct/Doc_ProjectIssue.java create mode 100644 base/src/org/compiere/acct/Doc_Requisition.java create mode 100644 base/src/org/compiere/acct/Fact.java create mode 100644 base/src/org/compiere/acct/FactLine.java create mode 100644 base/src/org/compiere/acct/Matcher.java create mode 100644 base/src/org/compiere/acct/ProductInfo.java rename {dbPort => base}/src/org/compiere/db/AdempiereDatabase.java (100%) rename {dbPort => base}/src/org/compiere/db/CConnection.java (100%) rename {dbPort => base}/src/org/compiere/db/CConnectionDialog.java (100%) rename {dbPort => base}/src/org/compiere/db/CConnectionEditor.java (100%) rename {dbPort => base}/src/org/compiere/db/CreateAdempiere.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_ar.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_bg.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_ca.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_da.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_de.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_es.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_fa.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_fr.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_hr.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_in.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_it.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_ja.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_ml.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_nl.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_no.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_pl.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_pt.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_ro.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_ru.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_sl.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_sv.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_th.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_vi.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_zh.java (100%) rename {dbPort => base}/src/org/compiere/db/DBRes_zh_CN.java (100%) rename {dbPort => base}/src/org/compiere/db/DB_Oracle.java (100%) rename {dbPort => base}/src/org/compiere/db/DB_PostgreSQL.java (100%) rename {dbPort => base}/src/org/compiere/db/Database.java (100%) rename {dbPort => base}/src/org/compiere/db/Database16.gif (100%) rename {dbPort => base}/src/org/compiere/db/JDBCInfo.java (100%) rename {dbPort => base}/src/org/compiere/db/LDAP.java (100%) rename {dbPort => base}/src/org/compiere/db/Server16.gif (100%) rename {dbPort => base}/src/org/compiere/db/TestConnection.java (100%) rename {dbPort => base}/src/org/compiere/db/TestEJB.java (100%) rename {dbPort => base}/src/org/compiere/db/package.html (100%) rename {dbPort => base}/src/org/compiere/dbPort/Convert.java (100%) rename {dbPort => base}/src/org/compiere/dbPort/ConvertDialog.java (100%) rename {dbPort => base}/src/org/compiere/dbPort/ConvertMap_PostgreSQL.java (100%) rename {dbPort => base}/src/org/compiere/dbPort/Convert_Oracle.java (100%) rename {dbPort => base}/src/org/compiere/dbPort/Convert_PostgreSQL.java (100%) rename {dbPort => base}/src/org/compiere/dbPort/Convert_PostgreSQLTest.java (100%) rename {dbPort => base}/src/org/compiere/dbPort/Convert_SQL92.java (100%) rename {dbPort => base}/src/org/compiere/dbPort/JdbcTest.java (100%) rename {dbPort => base}/src/org/compiere/dbPort/JdbcTestPG.java (100%) rename {dbPort => base}/src/org/compiere/dbPort/Join.java (100%) rename {dbPort => base}/src/org/compiere/dbPort/PostgresConvertTest.java (100%) rename {dbPort => base}/src/org/compiere/dbPort/package.html (100%) rename {interfaces => base}/src/org/compiere/interfaces/Server.java (100%) rename {interfaces => base}/src/org/compiere/interfaces/ServerHome.java (100%) rename {interfaces => base}/src/org/compiere/interfaces/ServerLocal.java (100%) rename {interfaces => base}/src/org/compiere/interfaces/ServerLocalHome.java (100%) rename {interfaces => base}/src/org/compiere/interfaces/Status.java (100%) rename {interfaces => base}/src/org/compiere/interfaces/StatusHome.java (100%) rename {interfaces => base}/src/org/compiere/interfaces/StatusLocal.java (100%) rename {interfaces => base}/src/org/compiere/interfaces/StatusLocalHome.java (100%) rename {dbPort => base}/src/org/compiere/license.html (100%) rename {dbPort => base}/src/org/compiere/model/AccessSqlParser.java (100%) rename {dbPort => base}/src/org/compiere/model/AccessSqlParserTest.java (100%) rename {dbPort => base}/src/org/compiere/model/DocWorkflowMgr.java (100%) rename {dbPort => base}/src/org/compiere/model/GridFieldVO.java (100%) rename {dbPort => base}/src/org/compiere/model/GridTabVO.java (100%) rename {dbPort => base}/src/org/compiere/model/GridWindowVO.java (100%) rename {dbPort => base}/src/org/compiere/model/Lookup.java (100%) rename {dbPort => base}/src/org/compiere/model/LookupDisplayColumn.java (100%) rename {dbPort => base}/src/org/compiere/model/MAccessLog.java (100%) rename {dbPort => base}/src/org/compiere/model/MAccount.java (100%) rename {dbPort => base}/src/org/compiere/model/MAccountLookup.java (100%) rename {dbPort => base}/src/org/compiere/model/MAcctSchema.java (100%) rename {dbPort => base}/src/org/compiere/model/MAcctSchemaDefault.java (100%) rename {dbPort => base}/src/org/compiere/model/MAcctSchemaElement.java (100%) rename {dbPort => base}/src/org/compiere/model/MAcctSchemaGL.java (100%) rename {dbPort => base}/src/org/compiere/model/MArchive.java (100%) rename {dbPort => base}/src/org/compiere/model/MAttachment.java (100%) rename {dbPort => base}/src/org/compiere/model/MAttachmentEntry.java (100%) rename {dbPort => base}/src/org/compiere/model/MAttachmentNote.java (100%) rename {dbPort => base}/src/org/compiere/model/MChangeLog.java (100%) rename {dbPort => base}/src/org/compiere/model/MClient.java (100%) rename {dbPort => base}/src/org/compiere/model/MClientInfo.java (100%) rename {dbPort => base}/src/org/compiere/model/MClientShare.java (100%) rename {dbPort => base}/src/org/compiere/model/MColumn.java (100%) rename {dbPort => base}/src/org/compiere/model/MColumnAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/MConversionRate.java (100%) rename {dbPort => base}/src/org/compiere/model/MConversionType.java (100%) rename {dbPort => base}/src/org/compiere/model/MCostElement.java (100%) rename {dbPort => base}/src/org/compiere/model/MCostType.java (100%) rename {dbPort => base}/src/org/compiere/model/MCountry.java (100%) rename {dbPort => base}/src/org/compiere/model/MCurrency.java (100%) rename {dbPort => base}/src/org/compiere/model/MCurrencyAcct.java (100%) rename {dbPort => base}/src/org/compiere/model/MDocType.java (100%) rename {dbPort => base}/src/org/compiere/model/MElement.java (100%) rename {dbPort => base}/src/org/compiere/model/MElementValue.java (100%) rename {dbPort => base}/src/org/compiere/model/MField.java (100%) rename {dbPort => base}/src/org/compiere/model/MImage.java (100%) rename {dbPort => base}/src/org/compiere/model/MIssue.java (100%) rename {dbPort => base}/src/org/compiere/model/MIssueProject.java (100%) rename {dbPort => base}/src/org/compiere/model/MIssueSystem.java (100%) rename {dbPort => base}/src/org/compiere/model/MIssueUser.java (100%) rename {dbPort => base}/src/org/compiere/model/MLanguage.java (100%) rename {dbPort => base}/src/org/compiere/model/MLocation.java (100%) rename {dbPort => base}/src/org/compiere/model/MLocationLookup.java (100%) rename {dbPort => base}/src/org/compiere/model/MLocator.java (100%) rename {dbPort => base}/src/org/compiere/model/MLocatorLookup.java (100%) rename {dbPort => base}/src/org/compiere/model/MLookup.java (100%) rename {dbPort => base}/src/org/compiere/model/MLookupCache.java (100%) rename {dbPort => base}/src/org/compiere/model/MLookupFactory.java (100%) rename {dbPort => base}/src/org/compiere/model/MLookupInfo.java (100%) rename {dbPort => base}/src/org/compiere/model/MMenu.java (100%) rename {dbPort => base}/src/org/compiere/model/MMessage.java (100%) rename {dbPort => base}/src/org/compiere/model/MNote.java (100%) rename {dbPort => base}/src/org/compiere/model/MOrg.java (100%) rename {dbPort => base}/src/org/compiere/model/MOrgInfo.java (100%) rename {dbPort => base}/src/org/compiere/model/MPAttributeLookup.java (100%) rename {dbPort => base}/src/org/compiere/model/MPInstance.java (100%) rename {dbPort => base}/src/org/compiere/model/MPInstanceLog.java (100%) rename {dbPort => base}/src/org/compiere/model/MPInstancePara.java (100%) rename {dbPort => base}/src/org/compiere/model/MPackageExp.java (100%) rename {dbPort => base}/src/org/compiere/model/MPackageExpCommon.java (100%) rename {dbPort => base}/src/org/compiere/model/MPackageExpDetail.java (100%) rename {dbPort => base}/src/org/compiere/model/MPrivateAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/MProcess.java (100%) rename {dbPort => base}/src/org/compiere/model/MProcessAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/MProcessPara.java (100%) rename {dbPort => base}/src/org/compiere/model/MQuery.java (100%) rename {dbPort => base}/src/org/compiere/model/MRecordAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/MRefList.java (100%) rename {dbPort => base}/src/org/compiere/model/MRegion.java (100%) rename {dbPort => base}/src/org/compiere/model/MRole.java (100%) rename {dbPort => base}/src/org/compiere/model/MRoleOrgAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/MRoleTest.java (100%) rename {dbPort => base}/src/org/compiere/model/MSalesRegion.java (100%) rename {dbPort => base}/src/org/compiere/model/MSequence.java (100%) rename {dbPort => base}/src/org/compiere/model/MSession.java (100%) rename {dbPort => base}/src/org/compiere/model/MSysConfig.java (100%) rename {dbPort => base}/src/org/compiere/model/MSystem.java (100%) rename {dbPort => base}/src/org/compiere/model/MTab.java (100%) rename {dbPort => base}/src/org/compiere/model/MTable.java (100%) rename {dbPort => base}/src/org/compiere/model/MTableAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/MTest.java (100%) rename {dbPort => base}/src/org/compiere/model/MTree_Base.java (100%) rename {dbPort => base}/src/org/compiere/model/MTree_Node.java (100%) rename {dbPort => base}/src/org/compiere/model/MTree_NodeBP.java (100%) rename {dbPort => base}/src/org/compiere/model/MTree_NodeCMC.java (100%) rename {dbPort => base}/src/org/compiere/model/MTree_NodeCMS.java (100%) rename {dbPort => base}/src/org/compiere/model/MTree_NodeMM.java (100%) rename {dbPort => base}/src/org/compiere/model/MTree_NodePR.java (100%) rename {dbPort => base}/src/org/compiere/model/MUser.java (100%) rename {dbPort => base}/src/org/compiere/model/MUserOrgAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/MUserRoles.java (100%) rename {dbPort => base}/src/org/compiere/model/MWarehouse.java (100%) rename {dbPort => base}/src/org/compiere/model/MWindow.java (100%) rename {dbPort => base}/src/org/compiere/model/MWindowAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/M_Element.java (100%) rename {dbPort => base}/src/org/compiere/model/M_Registration.java (100%) rename {dbPort => base}/src/org/compiere/model/ModelValidationEngine.java (100%) rename {dbPort => base}/src/org/compiere/model/ModelValidator.java (94%) rename {dbPort => base}/src/org/compiere/model/Null.java (100%) rename {dbPort => base}/src/org/compiere/model/Obscure.java (100%) rename {dbPort => base}/src/org/compiere/model/PO.java (95%) rename {dbPort => base}/src/org/compiere/model/POInfo.java (100%) rename {dbPort => base}/src/org/compiere/model/POInfoColumn.java (100%) rename {dbPort => base}/src/org/compiere/model/PO_LOB.java (100%) rename {dbPort => base}/src/org/compiere/model/PO_Record.java (100%) rename {dbPort => base}/src/org/compiere/model/PrintInfo.java (100%) rename {dbPort => base}/src/org/compiere/model/TranslationTable.java (100%) rename {dbPort => base}/src/org/compiere/model/VO.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_AccessLog.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Alert.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_AlertProcessor.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_AlertProcessorLog.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_AlertRecipient.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_AlertRule.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Archive.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Attachment.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_AttachmentNote.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Attribute.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Attribute_Value.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_ChangeLog.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Client.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_ClientInfo.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_ClientShare.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Color.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Column.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Column_Access.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Desktop.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_DesktopWorkbench.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Element.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_EntityType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Error.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Field.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_FieldGroup.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Find.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Form.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Form_Access.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Image.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_ImpFormat.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_ImpFormat_Row.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_InfoColumn.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_InfoWindow.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Issue.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_LabelPrinter.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_LabelPrinterFunction.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Language.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_LdapAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_LdapProcessor.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_LdapProcessorLog.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Menu.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Message.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Modification.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Note.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Org.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_OrgInfo.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_OrgType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PInstance.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PInstance_Log.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PInstance_Para.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Package_Exp.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Package_Exp_Common.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Package_Exp_Detail.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Package_Imp.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Package_Imp_Backup.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Package_Imp_Detail.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Package_Imp_Inst.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Package_Imp_Proc.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Preference.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PrintColor.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PrintFont.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PrintForm.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PrintFormat.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PrintFormatItem.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PrintGraph.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PrintLabel.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PrintLabelLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PrintPaper.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_PrintTableFormat.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Private_Access.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Process.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Process_Access.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Process_Para.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Record_Access.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Ref_List.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Ref_Table.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Reference.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Registration.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Replication.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_ReplicationStrategy.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_ReplicationTable.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Replication_Log.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Replication_Run.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_ReportView.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_ReportView_Col.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Role.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Role_OrgAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Scheduler.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_SchedulerLog.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_SchedulerRecipient.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Scheduler_Para.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Sequence.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Sequence_Audit.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Sequence_No.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Session.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_SysConfig.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_System.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Tab.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Table.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Table_Access.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Task.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TaskInstance.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Task_Access.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Tree.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeBar.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNode.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNodeBP.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNodeCMC.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNodeCMM.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNodeCMS.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNodeCMT.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNodeMM.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNodePR.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNodeU1.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNodeU2.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNodeU3.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_TreeNodeU4.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_User.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_UserBPAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_UserDef_Field.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_UserDef_Tab.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_UserDef_Win.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_UserMail.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_UserQuery.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_User_OrgAccess.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_User_Roles.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_User_Substitute.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Val_Rule.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WF_Activity.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WF_ActivityResult.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WF_Block.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WF_EventAudit.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WF_NextCondition.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WF_Node.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WF_NodeNext.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WF_Node_Para.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WF_Process.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WF_ProcessData.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WF_Responsible.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Window.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Window_Access.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Workbench.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WorkbenchWindow.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Workflow.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WorkflowProcessor.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_WorkflowProcessorLog.java (100%) rename {dbPort => base}/src/org/compiere/model/X_AD_Workflow_Access.java (100%) rename {dbPort => base}/src/org/compiere/model/X_A_Asset.java (100%) rename {dbPort => base}/src/org/compiere/model/X_A_Asset_Delivery.java (100%) rename {dbPort => base}/src/org/compiere/model/X_A_Asset_Group.java (100%) rename {dbPort => base}/src/org/compiere/model/X_A_Asset_Retirement.java (100%) rename {dbPort => base}/src/org/compiere/model/X_A_Registration.java (100%) rename {dbPort => base}/src/org/compiere/model/X_A_RegistrationAttribute.java (100%) rename {dbPort => base}/src/org/compiere/model/X_A_RegistrationProduct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_A_RegistrationValue.java (100%) rename {dbPort => base}/src/org/compiere/model/X_B_Bid.java (100%) rename {dbPort => base}/src/org/compiere/model/X_B_BidComment.java (100%) rename {dbPort => base}/src/org/compiere/model/X_B_Buyer.java (100%) rename {dbPort => base}/src/org/compiere/model/X_B_BuyerFunds.java (100%) rename {dbPort => base}/src/org/compiere/model/X_B_Offer.java (100%) rename {dbPort => base}/src/org/compiere/model/X_B_Seller.java (100%) rename {dbPort => base}/src/org/compiere/model/X_B_SellerFunds.java (100%) rename {dbPort => base}/src/org/compiere/model/X_B_Topic.java (100%) rename {dbPort => base}/src/org/compiere/model/X_B_TopicCategory.java (100%) rename {dbPort => base}/src/org/compiere/model/X_B_TopicType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_AccessContainer.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_AccessListBPGroup.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_AccessListRole.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_AccessMedia.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_AccessNewsChannel.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_AccessProfile.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_AccessStage.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Ad.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Ad_Cat.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_BroadcastServer.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_CStage.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_CStageTTable.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_CStage_Element.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Chat.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_ChatEntry.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_ChatType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_ChatTypeUpdate.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_ChatUpdate.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Container.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_ContainerTTable.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Container_Element.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Container_Index.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Container_ToDo.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Container_URL.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Media.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_MediaDeploy.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Media_Server.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_NewsChannel.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_NewsItem.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Template.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_TemplateTable.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_Template_Ad_Cat.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_WebAccessLog.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_WebProject.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_WebProject_Domain.java (100%) rename {dbPort => base}/src/org/compiere/model/X_CM_WikiToken.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_AcctProcessor.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_AcctProcessorLog.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_AcctSchema.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_AcctSchema_Default.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_AcctSchema_Element.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_AcctSchema_GL.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Activity.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_AllocationHdr.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_AllocationLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BP_BankAccount.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BP_Customer_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BP_EDI.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BP_Employee_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BP_Group.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BP_Group_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BP_Relation.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BP_Vendor_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BP_Withholding.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BPartner.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BPartner_Location.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BPartner_Product.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Bank.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BankAccount.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BankAccountDoc.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BankAccount_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BankStatement.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BankStatementLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BankStatementLoader.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_BankStatementMatcher.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Calendar.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Campaign.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Cash.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_CashBook.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_CashBook_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_CashLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Channel.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Charge.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Charge_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_City.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Commission.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_CommissionAmt.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_CommissionDetail.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_CommissionLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_CommissionRun.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_ConversionType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Conversion_Rate.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Country.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Currency.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Currency_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Cycle.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_CyclePhase.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_CycleStep.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_DocType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_DocTypeCounter.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Dunning.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_DunningLevel.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_DunningRun.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_DunningRunEntry.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_DunningRunLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Element.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_ElementValue.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Greeting.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_InterOrg_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Invoice.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_InvoiceBatch.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_InvoiceBatchLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_InvoiceLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_InvoicePaySchedule.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_InvoiceSchedule.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_InvoiceTax.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Job.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_JobAssignment.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_JobCategory.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_JobRemuneration.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_LandedCost.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_LandedCostAllocation.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Location.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_NonBusinessDay.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Order.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_OrderLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_OrderTax.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_OrgAssignment.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_POS.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_POSKey.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_POSKeyLayout.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_PaySchedule.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_PaySelection.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_PaySelectionCheck.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_PaySelectionLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Payment.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_PaymentAllocate.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_PaymentBatch.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_PaymentProcessor.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_PaymentTerm.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Period.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_PeriodControl.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Phase.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Project.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_ProjectIssue.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_ProjectIssueMA.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_ProjectLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_ProjectPhase.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_ProjectTask.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_ProjectType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Project_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Recurring.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Recurring_Run.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Region.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Remuneration.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RevenueRecognition.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RevenueRecognition_Plan.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RevenueRecognition_Run.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RfQ.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RfQLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RfQLineQty.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RfQResponse.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RfQResponseLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RfQResponseLineQty.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RfQ_Topic.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RfQ_TopicSubscriber.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_RfQ_TopicSubscriberOnly.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_SalesRegion.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_ServiceLevel.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_ServiceLevelLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_SubAcct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Subscription.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_SubscriptionType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Subscription_Delivery.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Task.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Tax.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_TaxCategory.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_TaxDeclaration.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_TaxDeclarationAcct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_TaxDeclarationLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_TaxPostal.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Tax_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_UOM.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_UOM_Conversion.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_UserRemuneration.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_ValidCombination.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Withholding.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Withholding_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_C_Year.java (100%) rename {dbPort => base}/src/org/compiere/model/X_Fact_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_Fact_Acct_Balance.java (100%) rename {dbPort => base}/src/org/compiere/model/X_GL_Budget.java (100%) rename {dbPort => base}/src/org/compiere/model/X_GL_BudgetControl.java (100%) rename {dbPort => base}/src/org/compiere/model/X_GL_Category.java (100%) rename {dbPort => base}/src/org/compiere/model/X_GL_Distribution.java (100%) rename {dbPort => base}/src/org/compiere/model/X_GL_DistributionLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_GL_Fund.java (100%) rename {dbPort => base}/src/org/compiere/model/X_GL_FundRestriction.java (100%) rename {dbPort => base}/src/org/compiere/model/X_GL_Journal.java (100%) rename {dbPort => base}/src/org/compiere/model/X_GL_JournalBatch.java (100%) rename {dbPort => base}/src/org/compiere/model/X_GL_JournalLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_BPartner.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_BankStatement.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_Conversion_Rate.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_ElementValue.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_GLJournal.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_InOutLineConfirm.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_Inventory.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_Invoice.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_Order.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_Payment.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_Product.java (100%) rename {dbPort => base}/src/org/compiere/model/X_I_ReportLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_Category.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_CategoryValue.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_Comment.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_Entry.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_EntryCategory.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_EntryRelated.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_Index.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_IndexLog.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_IndexStop.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_Source.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_Synonym.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_Topic.java (100%) rename {dbPort => base}/src/org/compiere/model/X_K_Type.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Attribute.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_AttributeInstance.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_AttributeSearch.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_AttributeSet.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_AttributeSetExclude.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_AttributeSetInstance.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_AttributeUse.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_AttributeValue.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_BOM.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_BOMAlternative.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_BOMProduct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_ChangeNotice.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_ChangeRequest.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Cost.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_CostDetail.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_CostElement.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_CostQueue.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_CostType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Demand.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_DemandDetail.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_DemandLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_DiscountSchema.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_DiscountSchemaBreak.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_DiscountSchemaLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_DistributionList.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_DistributionListLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_DistributionRun.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_DistributionRunLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_EDI.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_EDI_Info.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Forecast.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_ForecastLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Freight.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_FreightCategory.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_InOut.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_InOutConfirm.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_InOutLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_InOutLineConfirm.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_InOutLineMA.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Inventory.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_InventoryLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_InventoryLineMA.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Locator.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Lot.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_LotCtl.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_LotCtlExclude.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_MatchInv.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_MatchPO.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Movement.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_MovementConfirm.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_MovementLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_MovementLineConfirm.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_MovementLineMA.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_OperationResource.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Package.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_PackageLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_PerpetualInv.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_PriceList.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_PriceList_Version.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Product.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_ProductDownload.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_ProductOperation.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_ProductPrice.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Product_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Product_BOM.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Product_Category.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Product_Category_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Product_Costing.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Product_PO.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Production.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_ProductionLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_ProductionLineMA.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_ProductionPlan.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_RMA.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_RMALine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_RMAType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_RelatedProduct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Replenish.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Requisition.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_RequisitionLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_SerNoCtl.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_SerNoCtlExclude.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Shipper.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Storage.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Substitute.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Transaction.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_TransactionAllocation.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Warehouse.java (100%) rename {dbPort => base}/src/org/compiere/model/X_M_Warehouse_Acct.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_Achievement.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_Benchmark.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_BenchmarkData.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_ColorSchema.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_Goal.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_GoalRestriction.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_Hierarchy.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_Measure.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_MeasureCalc.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_Ratio.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_RatioElement.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_Report.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_ReportColumn.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_ReportColumnSet.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_ReportLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_ReportLineSet.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_ReportSource.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_SLA_Criteria.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_SLA_Goal.java (100%) rename {dbPort => base}/src/org/compiere/model/X_PA_SLA_Measure.java (100%) rename {dbPort => base}/src/org/compiere/model/X_RV_BPartner.java (100%) rename {dbPort => base}/src/org/compiere/model/X_RV_WarehousePrice.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_Category.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_CategoryUpdates.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_ContactInterest.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_Group.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_GroupUpdates.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_InterestArea.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_IssueKnown.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_IssueProject.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_IssueRecommendation.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_IssueStatus.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_IssueSystem.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_IssueUser.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_MailText.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_Request.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_RequestAction.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_RequestProcessor.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_RequestProcessorLog.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_RequestProcessor_Route.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_RequestType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_RequestTypeUpdates.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_RequestUpdate.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_RequestUpdates.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_Resolution.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_StandardResponse.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_Status.java (100%) rename {dbPort => base}/src/org/compiere/model/X_R_StatusCategory.java (100%) rename {dbPort => base}/src/org/compiere/model/X_S_ExpenseType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_S_Resource.java (100%) rename {dbPort => base}/src/org/compiere/model/X_S_ResourceAssignment.java (100%) rename {dbPort => base}/src/org/compiere/model/X_S_ResourceType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_S_ResourceUnAvailable.java (100%) rename {dbPort => base}/src/org/compiere/model/X_S_TimeExpense.java (100%) rename {dbPort => base}/src/org/compiere/model/X_S_TimeExpenseLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_S_TimeType.java (100%) rename {dbPort => base}/src/org/compiere/model/X_S_Training.java (100%) rename {dbPort => base}/src/org/compiere/model/X_S_Training_Class.java (100%) rename {dbPort => base}/src/org/compiere/model/X_T_Aging.java (100%) rename {dbPort => base}/src/org/compiere/model/X_T_DistributionRunDetail.java (100%) rename {dbPort => base}/src/org/compiere/model/X_T_InventoryValue.java (100%) rename {dbPort => base}/src/org/compiere/model/X_T_InvoiceGL.java (100%) rename {dbPort => base}/src/org/compiere/model/X_T_Replenish.java (100%) rename {dbPort => base}/src/org/compiere/model/X_T_Report.java (100%) rename {dbPort => base}/src/org/compiere/model/X_T_ReportStatement.java (100%) rename {dbPort => base}/src/org/compiere/model/X_T_Transaction.java (100%) rename {dbPort => base}/src/org/compiere/model/X_Test.java (100%) rename {dbPort => base}/src/org/compiere/model/X_W_Advertisement.java (100%) rename {dbPort => base}/src/org/compiere/model/X_W_Basket.java (100%) rename {dbPort => base}/src/org/compiere/model/X_W_BasketLine.java (100%) rename {dbPort => base}/src/org/compiere/model/X_W_Click.java (100%) rename {dbPort => base}/src/org/compiere/model/X_W_ClickCount.java (100%) rename {dbPort => base}/src/org/compiere/model/X_W_Counter.java (100%) rename {dbPort => base}/src/org/compiere/model/X_W_CounterCount.java (100%) rename {dbPort => base}/src/org/compiere/model/X_W_MailMsg.java (100%) rename {dbPort => base}/src/org/compiere/model/X_W_Store.java (100%) rename {dbPort => base}/src/org/compiere/package.html (100%) rename {print => base}/src/org/compiere/print/ArchiveEngine.java (100%) rename {print => base}/src/org/compiere/print/CPaper.java (100%) rename {print => base}/src/org/compiere/print/CPrinter.java (100%) rename {print => base}/src/org/compiere/print/DataEngine.java (100%) rename {print => base}/src/org/compiere/print/MPrintColor.java (100%) rename {print => base}/src/org/compiere/print/MPrintFont.java (100%) rename {print => base}/src/org/compiere/print/MPrintFormat.java (100%) rename {print => base}/src/org/compiere/print/MPrintFormatItem.java (100%) rename {print => base}/src/org/compiere/print/MPrintFormatProcess.java (100%) rename {print => base}/src/org/compiere/print/MPrintGraph.java (100%) rename {print => base}/src/org/compiere/print/MPrintPaper.java (100%) rename {print => base}/src/org/compiere/print/MPrintTableFormat.java (100%) rename {print => base}/src/org/compiere/print/PrintData.java (100%) rename {print => base}/src/org/compiere/print/PrintDataColumn.java (100%) rename {print => base}/src/org/compiere/print/PrintDataElement.java (100%) rename {print => base}/src/org/compiere/print/PrintDataFunction.java (100%) rename {print => base}/src/org/compiere/print/PrintDataGroup.java (100%) rename {print => base}/src/org/compiere/print/PrintDataHandler.java (100%) rename {print => base}/src/org/compiere/print/PrintFormatUtil.java (100%) rename {print => base}/src/org/compiere/print/PrintUtil.java (100%) rename {print => base}/src/org/compiere/print/ReportEngine.java (100%) rename {print => base}/src/org/compiere/print/View.java (100%) rename {print => base}/src/org/compiere/print/layout/BarcodeElement.java (100%) rename {print => base}/src/org/compiere/print/layout/BoxElement.java (100%) rename {print => base}/src/org/compiere/print/layout/Dimension2DImpl.java (100%) rename {print => base}/src/org/compiere/print/layout/GraphElement.java (100%) rename {print => base}/src/org/compiere/print/layout/GridElement.java (100%) rename {print => base}/src/org/compiere/print/layout/HTMLElement.java (100%) rename {print => base}/src/org/compiere/print/layout/HTMLRenderer.java (100%) rename {print => base}/src/org/compiere/print/layout/HeaderFooter.java (100%) rename {print => base}/src/org/compiere/print/layout/ImageElement.java (100%) rename {print => base}/src/org/compiere/print/layout/LayoutEngine.java (100%) rename {print => base}/src/org/compiere/print/layout/LocationElement.java (100%) rename {print => base}/src/org/compiere/print/layout/Page.java (100%) rename {print => base}/src/org/compiere/print/layout/ParameterElement.java (100%) rename {print => base}/src/org/compiere/print/layout/PrintElement.java (100%) rename {print => base}/src/org/compiere/print/layout/StringElement.java (100%) rename {print => base}/src/org/compiere/print/layout/TableElement.java (100%) rename {print => base}/src/org/compiere/print/layout/false10.gif (100%) rename {print => base}/src/org/compiere/print/layout/true10.gif (100%) rename {print => base}/src/org/compiere/print/package.html (100%) rename {dbPort => base}/src/org/compiere/process/AdempiereServer.java (100%) rename {dbPort => base}/src/org/compiere/process/AdempiereService.java (100%) rename {dbPort => base}/src/org/compiere/process/ClientProcess.java (100%) rename {dbPort => base}/src/org/compiere/process/DocAction.java (100%) rename {dbPort => base}/src/org/compiere/process/DocActionTemplate.java (100%) rename {dbPort => base}/src/org/compiere/process/DocumentEngine.java (100%) rename {dbPort => base}/src/org/compiere/process/IssueReport.java (100%) rename {dbPort => base}/src/org/compiere/process/ProcessCall.java (100%) rename {dbPort => base}/src/org/compiere/process/ProcessInfo.java (100%) rename {dbPort => base}/src/org/compiere/process/ProcessInfoLog.java (100%) rename {dbPort => base}/src/org/compiere/process/ProcessInfoParameter.java (100%) rename {dbPort => base}/src/org/compiere/process/ProcessInfoUtil.java (100%) rename {dbPort => base}/src/org/compiere/process/SequenceCheck.java (100%) rename {dbPort => base}/src/org/compiere/process/StateEngine.java (100%) rename {dbPort => base}/src/org/compiere/process/SvrProcess.java (100%) rename {dbPort => base}/src/org/compiere/process/SystemValidate.java (100%) rename {dbPort => base}/src/org/compiere/process/package.html (100%) rename {dbPort => base}/src/org/compiere/util/AdempiereSystemError.java (100%) rename {dbPort => base}/src/org/compiere/util/AdempiereUserError.java (100%) rename {dbPort => base}/src/org/compiere/util/AmtInWords.java (100%) rename {dbPort => base}/src/org/compiere/util/AmtInWords_CA.java (100%) rename {dbPort => base}/src/org/compiere/util/AmtInWords_EN.java (100%) rename {dbPort => base}/src/org/compiere/util/AmtInWords_ES.java (100%) rename {dbPort => base}/src/org/compiere/util/AmtInWords_FA.java (100%) rename {dbPort => base}/src/org/compiere/util/AmtInWords_FR.java (100%) rename {dbPort => base}/src/org/compiere/util/AmtInWords_IN.java (100%) rename {dbPort => base}/src/org/compiere/util/AmtInWords_PL.java (100%) rename {dbPort => base}/src/org/compiere/util/AmtInWords_TH.java (100%) rename {dbPort => base}/src/org/compiere/util/ByteArrayDataSource.java (100%) rename {dbPort => base}/src/org/compiere/util/CCache.java (100%) rename {dbPort => base}/src/org/compiere/util/CCachedRowSet.java (100%) rename {dbPort => base}/src/org/compiere/util/CLogConsole.java (100%) rename {dbPort => base}/src/org/compiere/util/CLogErrorBuffer.java (100%) rename {dbPort => base}/src/org/compiere/util/CLogFile.java (100%) rename {dbPort => base}/src/org/compiere/util/CLogFilter.java (100%) rename {dbPort => base}/src/org/compiere/util/CLogFormatter.java (100%) rename {dbPort => base}/src/org/compiere/util/CLogMgt.java (100%) rename {dbPort => base}/src/org/compiere/util/CLogMgtLog4J.java (100%) rename {dbPort => base}/src/org/compiere/util/CLogger.java (100%) rename {dbPort => base}/src/org/compiere/util/CMemoryUsage.java (100%) rename {dbPort => base}/src/org/compiere/util/CPreparedStatement.java (100%) rename {dbPort => base}/src/org/compiere/util/CStatement.java (100%) rename {dbPort => base}/src/org/compiere/util/CStatementVO.java (100%) rename {dbPort => base}/src/org/compiere/util/CacheInterface.java (100%) rename {dbPort => base}/src/org/compiere/util/CacheMgt.java (100%) rename {dbPort => base}/src/org/compiere/util/ConnectTest.java (100%) rename {dbPort => base}/src/org/compiere/util/DB.java (100%) rename {dbPort => base}/src/org/compiere/util/DBException.java (100%) rename {dbPort => base}/src/org/compiere/util/DisplayType.java (100%) rename {dbPort => base}/src/org/compiere/util/EMail.java (100%) rename {dbPort => base}/src/org/compiere/util/EMailAuthenticator.java (100%) rename {dbPort => base}/src/org/compiere/util/EMailTest.java (100%) rename {dbPort => base}/src/org/compiere/util/Env.java (100%) rename {dbPort => base}/src/org/compiere/util/Evaluatee.java (100%) rename {dbPort => base}/src/org/compiere/util/Evaluator.java (100%) rename {dbPort => base}/src/org/compiere/util/GenerateModel.java (100%) rename {dbPort => base}/src/org/compiere/util/Login.java (100%) rename {dbPort => base}/src/org/compiere/util/MimeType.java (100%) rename {dbPort => base}/src/org/compiere/util/Msg.java (100%) rename {dbPort => base}/src/org/compiere/util/NullParameter.java (100%) rename {dbPort => base}/src/org/compiere/util/Splash.java (100%) rename {dbPort => base}/src/org/compiere/util/TimeUtil.java (100%) rename {dbPort => base}/src/org/compiere/util/Trx.java (100%) rename {dbPort => base}/src/org/compiere/util/ZipUtil.java (100%) rename {dbPort => base}/src/org/compiere/util/logClient.properties (100%) rename {dbPort => base}/src/org/compiere/util/logServer.properties (100%) diff --git a/JasperReportsWebApp/build.xml b/JasperReportsWebApp/build.xml index a4b72c156b..da22a6de0c 100644 --- a/JasperReportsWebApp/build.xml +++ b/JasperReportsWebApp/build.xml @@ -21,7 +21,7 @@ - + @@ -61,4 +61,4 @@ - \ No newline at end of file + diff --git a/base/build.xml b/base/build.xml index c0e30a1033..e65aafa5a1 100644 --- a/base/build.xml +++ b/base/build.xml @@ -22,6 +22,9 @@ + + + @@ -52,7 +55,7 @@ - + diff --git a/print/src/org/adempiere/pdf/Document.java b/base/src/org/adempiere/pdf/Document.java similarity index 100% rename from print/src/org/adempiere/pdf/Document.java rename to base/src/org/adempiere/pdf/Document.java diff --git a/print/src/org/adempiere/pdf/viewer/22x22/document-print.png b/base/src/org/adempiere/pdf/viewer/22x22/document-print.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/document-print.png rename to base/src/org/adempiere/pdf/viewer/22x22/document-print.png diff --git a/print/src/org/adempiere/pdf/viewer/22x22/document-save.png b/base/src/org/adempiere/pdf/viewer/22x22/document-save.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/document-save.png rename to base/src/org/adempiere/pdf/viewer/22x22/document-save.png diff --git a/print/src/org/adempiere/pdf/viewer/22x22/go-first.png b/base/src/org/adempiere/pdf/viewer/22x22/go-first.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/go-first.png rename to base/src/org/adempiere/pdf/viewer/22x22/go-first.png diff --git a/print/src/org/adempiere/pdf/viewer/22x22/go-last.png b/base/src/org/adempiere/pdf/viewer/22x22/go-last.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/go-last.png rename to base/src/org/adempiere/pdf/viewer/22x22/go-last.png diff --git a/print/src/org/adempiere/pdf/viewer/22x22/go-next.png b/base/src/org/adempiere/pdf/viewer/22x22/go-next.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/go-next.png rename to base/src/org/adempiere/pdf/viewer/22x22/go-next.png diff --git a/print/src/org/adempiere/pdf/viewer/22x22/go-previous.png b/base/src/org/adempiere/pdf/viewer/22x22/go-previous.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/go-previous.png rename to base/src/org/adempiere/pdf/viewer/22x22/go-previous.png diff --git a/print/src/org/adempiere/pdf/viewer/22x22/rotate-cclock.png b/base/src/org/adempiere/pdf/viewer/22x22/rotate-cclock.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/rotate-cclock.png rename to base/src/org/adempiere/pdf/viewer/22x22/rotate-cclock.png diff --git a/print/src/org/adempiere/pdf/viewer/22x22/rotate-clock.png b/base/src/org/adempiere/pdf/viewer/22x22/rotate-clock.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/rotate-clock.png rename to base/src/org/adempiere/pdf/viewer/22x22/rotate-clock.png diff --git a/print/src/org/adempiere/pdf/viewer/22x22/rotate.png b/base/src/org/adempiere/pdf/viewer/22x22/rotate.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/rotate.png rename to base/src/org/adempiere/pdf/viewer/22x22/rotate.png diff --git a/print/src/org/adempiere/pdf/viewer/22x22/system-search.png b/base/src/org/adempiere/pdf/viewer/22x22/system-search.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/system-search.png rename to base/src/org/adempiere/pdf/viewer/22x22/system-search.png diff --git a/print/src/org/adempiere/pdf/viewer/22x22/zoom-in.png b/base/src/org/adempiere/pdf/viewer/22x22/zoom-in.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/zoom-in.png rename to base/src/org/adempiere/pdf/viewer/22x22/zoom-in.png diff --git a/print/src/org/adempiere/pdf/viewer/22x22/zoom-out.png b/base/src/org/adempiere/pdf/viewer/22x22/zoom-out.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/22x22/zoom-out.png rename to base/src/org/adempiere/pdf/viewer/22x22/zoom-out.png diff --git a/print/src/org/adempiere/pdf/viewer/48x48/document-print.png b/base/src/org/adempiere/pdf/viewer/48x48/document-print.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/48x48/document-print.png rename to base/src/org/adempiere/pdf/viewer/48x48/document-print.png diff --git a/print/src/org/adempiere/pdf/viewer/48x48/document-save.png b/base/src/org/adempiere/pdf/viewer/48x48/document-save.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/48x48/document-save.png rename to base/src/org/adempiere/pdf/viewer/48x48/document-save.png diff --git a/print/src/org/adempiere/pdf/viewer/48x48/go-first.png b/base/src/org/adempiere/pdf/viewer/48x48/go-first.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/48x48/go-first.png rename to base/src/org/adempiere/pdf/viewer/48x48/go-first.png diff --git a/print/src/org/adempiere/pdf/viewer/48x48/go-last.png b/base/src/org/adempiere/pdf/viewer/48x48/go-last.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/48x48/go-last.png rename to base/src/org/adempiere/pdf/viewer/48x48/go-last.png diff --git a/print/src/org/adempiere/pdf/viewer/48x48/go-next.png b/base/src/org/adempiere/pdf/viewer/48x48/go-next.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/48x48/go-next.png rename to base/src/org/adempiere/pdf/viewer/48x48/go-next.png diff --git a/print/src/org/adempiere/pdf/viewer/48x48/go-previous.png b/base/src/org/adempiere/pdf/viewer/48x48/go-previous.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/48x48/go-previous.png rename to base/src/org/adempiere/pdf/viewer/48x48/go-previous.png diff --git a/print/src/org/adempiere/pdf/viewer/48x48/system-search.png b/base/src/org/adempiere/pdf/viewer/48x48/system-search.png similarity index 100% rename from print/src/org/adempiere/pdf/viewer/48x48/system-search.png rename to base/src/org/adempiere/pdf/viewer/48x48/system-search.png diff --git a/print/src/org/adempiere/pdf/viewer/PDFViewerBean.java b/base/src/org/adempiere/pdf/viewer/PDFViewerBean.java similarity index 100% rename from print/src/org/adempiere/pdf/viewer/PDFViewerBean.java rename to base/src/org/adempiere/pdf/viewer/PDFViewerBean.java diff --git a/dbPort/src/org/adempiere/util/GenerateModelJPA.java b/base/src/org/adempiere/util/GenerateModelJPA.java similarity index 100% rename from dbPort/src/org/adempiere/util/GenerateModelJPA.java rename to base/src/org/adempiere/util/GenerateModelJPA.java diff --git a/dbPort/src/org/compiere/Adempiere.java b/base/src/org/compiere/Adempiere.java similarity index 100% rename from dbPort/src/org/compiere/Adempiere.java rename to base/src/org/compiere/Adempiere.java diff --git a/dbPort/src/org/compiere/Adempiere.properties b/base/src/org/compiere/Adempiere.properties similarity index 100% rename from dbPort/src/org/compiere/Adempiere.properties rename to base/src/org/compiere/Adempiere.properties diff --git a/base/src/org/compiere/acct/Doc.java b/base/src/org/compiere/acct/Doc.java new file mode 100644 index 0000000000..77c3733600 --- /dev/null +++ b/base/src/org/compiere/acct/Doc.java @@ -0,0 +1,2189 @@ +/****************************************************************************** + * 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.acct; + +import java.lang.reflect.*; +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.logging.*; + +import org.compiere.model.*; +import org.compiere.process.*; +import org.compiere.report.*; +import org.compiere.util.*; + +/** + * Posting Document Root. + * + *
+ *  Table               Base Document Types (C_DocType.DocBaseType & AD_Reference_ID=183)
+ *      Class           AD_Table_ID
+ *  ------------------  ------------------------------
+ *  C_Invoice:          ARI, ARC, ARF, API, APC
+ *      Doc_Invoice     318 - has C_DocType_ID
+ *
+ *  C_Payment:          ARP, APP
+ *      Doc_Payment     335 - has C_DocType_ID
+ *
+ *  C_Order:            SOO, POO,  POR (Requisition)
+ *      Doc_Order       259 - has C_DocType_ID
+ *
+ *  M_InOut:            MMS, MMR
+ *      Doc_InOut       319 - DocType derived
+ *
+ *  M_Inventory:        MMI
+ *      Doc_Inventory   321 - DocType fixed
+ *
+ *  M_Movement:         MMM
+ *      Doc_Movement    323 - DocType fixed
+ *
+ *  M_Production:       MMP
+ *      Doc_Production  325 - DocType fixed
+ *
+ *  C_BankStatement:    CMB
+ *      Doc_Bank        392 - DocType fixed
+ *
+ *  C_Cash:             CMC
+ *      Doc_Cash        407 - DocType fixed
+ *
+ *  C_Allocation:       CMA
+ *      Doc_Allocation  390 - DocType fixed
+ *
+ *  GL_Journal:         GLJ
+ *      Doc_GLJournal   224 = has C_DocType_ID
+ *
+ *  Matching Invoice    MXI
+ *      M_MatchInv      472 - DocType fixed
+ *
+ *  Matching PO         MXP
+ *      M_MatchPO       473 - DocType fixed
+ *
+ *	Project Issue		PJI
+ *		C_ProjectIssue	623 - DocType fixed
+ *	
+ *  
+ * @author Jorg Janke + * @version $Id: Doc.java,v 1.6 2006/07/30 00:53:33 jjanke Exp $ + */ +public abstract class Doc +{ + /** AD_Table_ID's of documents */ + public static int[] documentsTableID = new int[] { + MInvoice.Table_ID, // C_Invoice + MAllocationHdr.Table_ID, // C_Allocation + MCash.Table_ID, // C_Cash + MBankStatement.Table_ID, // C_BankStatement + MOrder.Table_ID, // C_Order + MPayment.Table_ID, // C_Payment + MInOut.Table_ID, // M_InOut + MInventory.Table_ID, // M_Inventory + MMovement.Table_ID, // M_Movement + X_M_Production.Table_ID, // M_Production + MJournal.Table_ID, // GL_Journal + MMatchInv.Table_ID, // M_MatchInv + MMatchPO.Table_ID, // M_MatchPO + MProjectIssue.Table_ID, // C_ProjectIssue + MRequisition.Table_ID // M_Requisition + }; + + /** Table Names of documents */ + public static String[] documentsTableName = new String[] { + MInvoice.Table_Name, // C_Invoice + MAllocationHdr.Table_Name, // C_Allocation + MCash.Table_Name, // C_Cash + MBankStatement.Table_Name, // C_BankStatement + MOrder.Table_Name, // C_Order + MPayment.Table_Name, // C_Payment + MInOut.Table_Name, // M_InOut + MInventory.Table_Name, // M_Inventory + MMovement.Table_Name, // M_Movement + X_M_Production.Table_Name, // M_Production + MJournal.Table_Name, // GL_Journal + MMatchInv.Table_Name, // M_MatchInv + MMatchPO.Table_Name, // M_MatchPO + MProjectIssue.Table_Name, // C_ProjectIssue + MRequisition.Table_Name // M_Requisition + }; + + /************************************************************************** + * Document Types + * -------------- + * C_DocType.DocBaseType & AD_Reference_ID=183 + * C_Invoice: ARI, ARC, ARF, API, APC + * C_Payment: ARP, APP + * C_Order: SOO, POO + * M_Transaction: MMI, MMM, MMS, MMR + * C_BankStatement: CMB + * C_Cash: CMC + * C_Allocation: CMA + * GL_Journal: GLJ + * C_ProjectIssue PJI + * M_Requisition POR + **************************************************************************/ + + /** AR Invoices - ARI */ + public static final String DOCTYPE_ARInvoice = MDocType.DOCBASETYPE_ARInvoice; + /** AR Credit Memo */ + public static final String DOCTYPE_ARCredit = "ARC"; + /** AR Receipt */ + public static final String DOCTYPE_ARReceipt = "ARR"; + /** AR ProForma */ + public static final String DOCTYPE_ARProForma = "ARF"; + /** AP Invoices */ + public static final String DOCTYPE_APInvoice = "API"; + /** AP Credit Memo */ + public static final String DOCTYPE_APCredit = "APC"; + /** AP Payment */ + public static final String DOCTYPE_APPayment = "APP"; + /** CashManagement Bank Statement */ + public static final String DOCTYPE_BankStatement = "CMB"; + /** CashManagement Cash Journals */ + public static final String DOCTYPE_CashJournal = "CMC"; + /** CashManagement Allocations */ + public static final String DOCTYPE_Allocation = "CMA"; + /** Material Shipment */ + public static final String DOCTYPE_MatShipment = "MMS"; + /** Material Receipt */ + public static final String DOCTYPE_MatReceipt = "MMR"; + /** Material Inventory */ + public static final String DOCTYPE_MatInventory = "MMI"; + /** Material Movement */ + public static final String DOCTYPE_MatMovement = "MMM"; + /** Material Production */ + public static final String DOCTYPE_MatProduction = "MMP"; + /** Match Invoice */ + public static final String DOCTYPE_MatMatchInv = "MXI"; + /** Match PO */ + public static final String DOCTYPE_MatMatchPO = "MXP"; + /** GL Journal */ + public static final String DOCTYPE_GLJournal = "GLJ"; + /** Purchase Order */ + public static final String DOCTYPE_POrder = "POO"; + /** Sales Order */ + public static final String DOCTYPE_SOrder = "SOO"; + /** Project Issue */ + public static final String DOCTYPE_ProjectIssue = "PJI"; + /** Purchase Requisition */ + public static final String DOCTYPE_PurchaseRequisition = "POR"; + + + + // Posting Status - AD_Reference_ID=234 // + /** Document Status */ + public static final String STATUS_NotPosted = "N"; + /** Document Status */ + public static final String STATUS_NotBalanced = "b"; + /** Document Status */ + public static final String STATUS_NotConvertible = "c"; + /** Document Status */ + public static final String STATUS_PeriodClosed = "p"; + /** Document Status */ + public static final String STATUS_InvalidAccount = "i"; + /** Document Status */ + public static final String STATUS_PostPrepared = "y"; + /** Document Status */ + public static final String STATUS_Posted = "Y"; + /** Document Status */ + public static final String STATUS_Error = "E"; + + + /** + * Create Posting document + * @param ass accounting schema + * @param AD_Table_ID Table ID of Documents + * @param Record_ID record ID to load + * @param trxName transaction name + * @return Document or null + */ + public static Doc get (MAcctSchema[] ass, int AD_Table_ID, int Record_ID, String trxName) + { + String TableName = null; + for (int i = 0; i < documentsTableID.length; i++) + { + if (documentsTableID[i] == AD_Table_ID) + { + TableName = documentsTableName[i]; + break; + } + } + if (TableName == null) + { + s_log.severe("Not found AD_Table_ID=" + AD_Table_ID); + return null; + } + // + Doc doc = null; + StringBuffer sql = new StringBuffer("SELECT * FROM ") + .append(TableName) + .append(" WHERE ").append(TableName).append("_ID=? AND Processed='Y'"); + PreparedStatement pstmt = null; + try + { + pstmt = DB.prepareStatement (sql.toString(), trxName); + pstmt.setInt (1, Record_ID); + ResultSet rs = pstmt.executeQuery (); + if (rs.next ()) + { + doc = get (ass, AD_Table_ID, rs, trxName); + } + else + s_log.severe("Not Found: " + TableName + "_ID=" + Record_ID); + rs.close (); + pstmt.close (); + pstmt = null; + } + catch (Exception e) + { + s_log.log (Level.SEVERE, sql.toString(), e); + } + try + { + if (pstmt != null) + pstmt.close (); + pstmt = null; + } + catch (Exception e) + { + pstmt = null; + } + return doc; + } // get + + /** + * Create Posting document + * @param ass accounting schema + * @param AD_Table_ID Table ID of Documents + * @param rs ResultSet + * @param trxName transaction name + * @return Document + */ + public static Doc get (MAcctSchema[] ass, int AD_Table_ID, ResultSet rs, String trxName) + { + Doc doc = null; + if (AD_Table_ID == MInvoice.Table_ID) + doc = new Doc_Invoice (ass, rs, trxName); + else if (AD_Table_ID == MAllocationHdr.Table_ID) + doc = new Doc_Allocation (ass, rs, trxName); + else if (AD_Table_ID == MCash.Table_ID) + doc = new Doc_Cash (ass, rs, trxName); + else if (AD_Table_ID == MBankStatement.Table_ID) + doc = new Doc_Bank (ass, rs, trxName); + else if (AD_Table_ID == MOrder.Table_ID) + doc = new Doc_Order (ass, rs, trxName); + else if (AD_Table_ID == MPayment.Table_ID) + doc = new Doc_Payment (ass, rs, trxName); + else if (AD_Table_ID == MInOut.Table_ID) + doc = new Doc_InOut (ass, rs, trxName); + else if (AD_Table_ID == MInventory.Table_ID) + doc = new Doc_Inventory (ass, rs, trxName); + else if (AD_Table_ID == MMovement.Table_ID) + doc = new Doc_Movement (ass, rs, trxName); + else if (AD_Table_ID == X_M_Production.Table_ID) + doc = new Doc_Production (ass, rs, trxName); + else if (AD_Table_ID == MJournal.Table_ID) + doc = new Doc_GLJournal (ass, rs, trxName); + else if (AD_Table_ID == MMatchInv.Table_ID) + doc = new Doc_MatchInv (ass, rs, trxName); + else if (AD_Table_ID == MMatchPO.Table_ID) + doc = new Doc_MatchPO (ass, rs, trxName); + else if (AD_Table_ID == MProjectIssue.Table_ID) + doc = new Doc_ProjectIssue (ass, rs, trxName); + else if (AD_Table_ID == MRequisition.Table_ID) + doc = new Doc_Requisition (ass, rs, trxName); + if (doc == null) + s_log.log(Level.SEVERE, "Unknown AD_Table_ID=" + AD_Table_ID); + return doc; + } // get + + /** + * Post Document + * @param ass accounting schemata + * @param AD_Table_ID Transaction table + * @param Record_ID Record ID of this document + * @param force force posting + * @param trxName transaction + * @return null if the document was posted or error message + */ + public static String postImmediate (MAcctSchema[] ass, + int AD_Table_ID, int Record_ID, boolean force, String trxName) + { + Doc doc = get (ass, AD_Table_ID, Record_ID, trxName); + if (doc != null) + return doc.post (force, true); // repost + return "NoDoc"; + } // post + + /** Static Log */ + protected static CLogger s_log = CLogger.getCLogger(Doc.class); + /** Log per Document */ + protected CLogger log = CLogger.getCLogger(getClass()); + + + /************************************************************************** + * Constructor + * @param ass accounting schemata + * @param clazz Document Class + * @param rs result set + * @param defaultDocumentType default document type or null + * @param trxName trx + */ + Doc (MAcctSchema[] ass, Class clazz, ResultSet rs, String defaultDocumentType, String trxName) + { + p_Status = STATUS_Error; + m_ass = ass; + m_ctx = new Properties(m_ass[0].getCtx()); + m_ctx.setProperty("#AD_Client_ID", String.valueOf(m_ass[0].getAD_Client_ID())); + + String className = clazz.getName(); + className = className.substring(className.lastIndexOf('.')+1); + try + { + Constructor constructor = clazz.getConstructor(new Class[]{Properties.class, ResultSet.class, String.class}); + p_po = (PO)constructor.newInstance(new Object[]{m_ctx, rs, trxName}); + } + catch (Exception e) + { + String msg = className + ": " + e.getLocalizedMessage(); + log.severe(msg); + throw new IllegalArgumentException(msg); + } + + // DocStatus + int index = p_po.get_ColumnIndex("DocStatus"); + if (index != -1) + m_DocStatus = (String)p_po.get_Value(index); + + // Document Type + setDocumentType (defaultDocumentType); + m_trxName = trxName; + if (m_trxName == null) + m_trxName = "Post" + m_DocumentType + p_po.get_ID(); + p_po.set_TrxName(m_trxName); + + // Amounts + m_Amounts[0] = Env.ZERO; + m_Amounts[1] = Env.ZERO; + m_Amounts[2] = Env.ZERO; + m_Amounts[3] = Env.ZERO; + } // Doc + + /** Accounting Schema Array */ + private MAcctSchema[] m_ass = null; + /** Properties */ + private Properties m_ctx = null; + /** Transaction Name */ + private String m_trxName = null; + /** The Document */ + protected PO p_po = null; + /** Document Type */ + private String m_DocumentType = null; + /** Document Status */ + private String m_DocStatus = null; + /** Document No */ + private String m_DocumentNo = null; + /** Description */ + private String m_Description = null; + /** GL Category */ + private int m_GL_Category_ID = 0; + /** GL Period */ + private MPeriod m_period = null; + /** Period ID */ + private int m_C_Period_ID = 0; + /** Location From */ + private int m_C_LocFrom_ID = 0; + /** Location To */ + private int m_C_LocTo_ID = 0; + /** Accounting Date */ + private Timestamp m_DateAcct = null; + /** Document Date */ + private Timestamp m_DateDoc = null; + /** Tax Included */ + private boolean m_TaxIncluded = false; + /** Is (Source) Multi-Currency Document - i.e. the document has different currencies + * (if true, the document will not be source balanced) */ + private boolean m_MultiCurrency = false; + /** BP Sales Region */ + private int m_BP_C_SalesRegion_ID = -1; + /** B Partner */ + private int m_C_BPartner_ID = -1; + + /** Bank Account */ + private int m_C_BankAccount_ID = -1; + /** Cach Book */ + private int m_C_CashBook_ID = -1; + /** Currency */ + private int m_C_Currency_ID = -1; + + /** Contained Doc Lines */ + protected DocLine[] p_lines; + + /** Facts */ + private ArrayList m_fact = null; + + /** No Currency in Document Indicator (-1) */ + protected static final int NO_CURRENCY = -2; + + /** Actual Document Status */ + protected String p_Status = null; + /** Error Message */ + protected String p_Error = null; + + + /** + * Get Context + * @return context + */ + protected Properties getCtx() + { + return m_ctx; + } // getCtx + + /** + * Get Table Name + * @return table name + */ + public String get_TableName() + { + return p_po.get_TableName(); + } // get_TableName + + /** + * Get Table ID + * @return table id + */ + public int get_Table_ID() + { + return p_po.get_Table_ID(); + } // get_Table_ID + + /** + * Get Record_ID + * @return record id + */ + public int get_ID() + { + return p_po.get_ID(); + } // get_ID + + /** + * Get Persistent Object + * @return po + */ + protected PO getPO() + { + return p_po; + } // getPO + + /** + * Post Document. + *
+	 *  - try to lock document (Processed='Y' (AND Processing='N' AND Posted='N'))
+	 * 		- if not ok - return false
+	 *          - postlogic (for all Accounting Schema)
+	 *              - create Fact lines
+	 *          - postCommit
+	 *              - commits Fact lines and Document & sets Processing = 'N'
+	 *              - if error - create Note
+	 *  
+ * @param force if true ignore that locked + * @param repost if true ignore that already posted + * @return null if posted error otherwise + */ + public final String post (boolean force, boolean repost) + { + if (m_DocStatus == null) + ; // return "No DocStatus for DocumentNo=" + getDocumentNo(); + else if (m_DocStatus.equals(DocumentEngine.STATUS_Completed) + || m_DocStatus.equals(DocumentEngine.STATUS_Closed) + || m_DocStatus.equals(DocumentEngine.STATUS_Voided) + || m_DocStatus.equals(DocumentEngine.STATUS_Reversed)) + ; + else + return "Invalid DocStatus='" + m_DocStatus + "' for DocumentNo=" + getDocumentNo(); + // + if (p_po.getAD_Client_ID() != m_ass[0].getAD_Client_ID()) + { + String error = "AD_Client_ID Conflict - Document=" + p_po.getAD_Client_ID() + + ", AcctSchema=" + m_ass[0].getAD_Client_ID(); + log.severe(error); + return error; + } + + // Lock Record ---- + StringBuffer sql = new StringBuffer ("UPDATE "); + sql.append(get_TableName()).append( " SET Processing='Y' WHERE ") + .append(get_TableName()).append("_ID=").append(get_ID()) + .append(" AND Processed='Y' AND IsActive='Y'"); + if (!force) + sql.append(" AND (Processing='N' OR Processing IS NULL)"); + if (!repost) + sql.append(" AND Posted='N'"); + if (DB.executeUpdate(sql.toString(), null) == 1) // outside trx + log.info("Locked: " + get_TableName() + "_ID=" + get_ID()); + else + { + log.log(Level.SEVERE, "Resubmit - Cannot lock " + get_TableName() + "_ID=" + + get_ID() + ", Force=" + force + ",RePost=" + repost); + if (force) + return "Cannot Lock - ReSubmit"; + return "Cannot Lock - ReSubmit or RePost with Force"; + } + + p_Error = loadDocumentDetails(); + if (p_Error != null) + return p_Error; + + // Delete existing Accounting + if (repost) + { + if (isPosted() && !isPeriodOpen()) // already posted - don't delete if period closed + { + log.log(Level.SEVERE, toString() + " - Period Closed for already posed document"); + unlock(); + return "PeriodClosed"; + } + // delete it + deleteAcct(); + } + else if (isPosted()) + { + log.log(Level.SEVERE, toString() + " - Document already posted"); + unlock(); + return "AlreadyPosted"; + } + + p_Status = STATUS_NotPosted; + + // Create Fact per AcctSchema + m_fact = new ArrayList(); + + // for all Accounting Schema + boolean OK = true; + try + { + for (int i = 0; OK && i < m_ass.length; i++) + { + // if acct schema has "only" org, skip + boolean skip = false; + if (m_ass[i].getAD_OrgOnly_ID() != 0) + { + if (m_ass[i].getOnlyOrgs() == null) + m_ass[i].setOnlyOrgs(MReportTree.getChildIDs(getCtx(), + 0, MAcctSchemaElement.ELEMENTTYPE_Organization, + m_ass[i].getAD_OrgOnly_ID())); + + // Header Level Org + skip = m_ass[i].isSkipOrg(getAD_Org_ID()); + // Line Level Org + if (p_lines != null) + { + for (int line = 0; skip && line < p_lines.length; line++) + { + skip = m_ass[i].isSkipOrg(p_lines[line].getAD_Org_ID()); + if (!skip) + break; + } + } + } + if (skip) + continue; + // post + log.info("(" + i + ") " + p_po); + p_Status = postLogic (i); + if (!p_Status.equals(STATUS_Posted)) + OK = false; + } + } + catch (Exception e) + { + log.log(Level.SEVERE, "", e); + p_Status = STATUS_Error; + p_Error = e.toString(); + OK = false; + } + + String validatorMsg = null; + // Call validator on before post + if (!p_Status.equals(STATUS_Error)) { + getPO().setDoc(this); + validatorMsg = ModelValidationEngine.get().fireDocValidate(getPO(), ModelValidator.TIMING_BEFORE_POST); + if (validatorMsg != null) { + p_Status = STATUS_Error; + p_Error = validatorMsg; + OK = false; + } + } + + // commitFact + p_Status = postCommit (p_Status); + + if (!p_Status.equals(STATUS_Error)) { + validatorMsg = ModelValidationEngine.get().fireDocValidate(getPO(), ModelValidator.TIMING_AFTER_POST); + if (validatorMsg != null) { + p_Status = STATUS_Error; + p_Error = validatorMsg; + OK = false; + } + } + + // Create Note + if (!p_Status.equals(STATUS_Posted)) + { + // Insert Note + String AD_MessageValue = "PostingError-" + p_Status; + int AD_User_ID = p_po.getUpdatedBy(); + MNote note = new MNote (getCtx(), AD_MessageValue, AD_User_ID, + getAD_Client_ID(), getAD_Org_ID(), null); + note.setRecord(p_po.get_Table_ID(), p_po.get_ID()); + // Reference + note.setReference(toString()); // Document + // Text + StringBuffer Text = new StringBuffer (Msg.getMsg(Env.getCtx(), AD_MessageValue)); + if (p_Error != null) + Text.append(" (").append(p_Error).append(")"); + String cn = getClass().getName(); + Text.append(" - ").append(cn.substring(cn.lastIndexOf('.'))) + .append(" (").append(getDocumentType()) + .append(" - DocumentNo=").append(getDocumentNo()) + .append(", DateAcct=").append(getDateAcct().toString().substring(0,10)) + .append(", Amount=").append(getAmount()) + .append(", Sta=").append(p_Status) + .append(" - PeriodOpen=").append(isPeriodOpen()) + .append(", Balanced=").append(isBalanced()); + note.setTextMsg(Text.toString()); + note.save(); + } + + // dispose facts + for (int i = 0; i < m_fact.size(); i++) + { + Fact fact = m_fact.get(i); + if (fact != null) + fact.dispose(); + } + p_lines = null; + + if (p_Status.equals(STATUS_Posted)) + return null; + return p_Error; + } // post + + /** + * Delete Accounting + * @return number of records + */ + private int deleteAcct() + { + StringBuffer sql = new StringBuffer ("DELETE Fact_Acct WHERE AD_Table_ID=") + .append(get_Table_ID()) + .append(" AND Record_ID=").append(p_po.get_ID()); + int no = DB.executeUpdate(sql.toString(), getTrxName()); + if (no != 0) + log.info("deleted=" + no); + return no; + } // deleteAcct + + /** + * Posting logic for Accounting Schema index + * @param index Accounting Schema index + * @return posting status/error code + */ + private final String postLogic (int index) + { + log.info("(" + index + ") " + p_po); + + // rejectUnbalanced + if (!m_ass[index].isSuspenseBalancing() && !isBalanced()) + return STATUS_NotBalanced; + + // rejectUnconvertible + if (!isConvertible(m_ass[index])) + return STATUS_NotConvertible; + + // rejectPeriodClosed + if (!isPeriodOpen()) + return STATUS_PeriodClosed; + + // createFacts + ArrayList facts = createFacts (m_ass[index]); + if (facts == null) + return STATUS_Error; + for (int f = 0; f < facts.size(); f++) + { + Fact fact = facts.get(f); + if (fact == null) + return STATUS_Error; + m_fact.add(fact); + // + p_Status = STATUS_PostPrepared; + + // check accounts + if (!fact.checkAccounts()) + return STATUS_InvalidAccount; + + // distribute + if (!fact.distribute()) + return STATUS_Error; + + // balanceSource + if (!fact.isSourceBalanced()) + { + fact.balanceSource(); + if (!fact.isSourceBalanced()) + return STATUS_NotBalanced; + } + + // balanceSegments + if (!fact.isSegmentBalanced()) + { + fact.balanceSegments(); + if (!fact.isSegmentBalanced()) + return STATUS_NotBalanced; + } + + // balanceAccounting + if (!fact.isAcctBalanced()) + { + fact.balanceAccounting(); + if (!fact.isAcctBalanced()) + return STATUS_NotBalanced; + } + + } // for all facts + + return STATUS_Posted; + } // postLogic + + /** + * Post Commit. + * Save Facts & Document + * @param status status + * @return Posting Status + */ + private final String postCommit (String status) + { + log.info("Sta=" + status + " DT=" + getDocumentType() + + " ID=" + p_po.get_ID()); + p_Status = status; + + Trx trx = Trx.get(getTrxName(), true); + try + { + // *** Transaction Start *** + // Commit Facts + if (status.equals(STATUS_Posted)) + { + for (int i = 0; i < m_fact.size(); i++) + { + Fact fact = m_fact.get(i); + if (fact == null) + ; + else if (fact.save(getTrxName())) + ; + else + { + log.log(Level.SEVERE, "(fact not saved) ... rolling back"); + trx.rollback(); + trx.close(); + unlock(); + return STATUS_Error; + } + } + } + // Commit Doc + if (!save(getTrxName())) // contains unlock & document status update + { + log.log(Level.SEVERE, "(doc not saved) ... rolling back"); + trx.rollback(); + trx.close(); + unlock(); + return STATUS_Error; + } + // Success + trx.commit(true); + trx.close(); + trx = null; + // *** Transaction End *** + } + catch (Exception e) + { + log.log(Level.SEVERE, "... rolling back", e); + status = STATUS_Error; + try { + if (trx != null) + trx.rollback(); + } catch (Exception e2) {} + try { + if (trx != null) + trx.close(); + trx = null; + } catch (Exception e3) {} + unlock(); + } + p_Status = status; + return status; + } // postCommit + + /** + * Get Trx Name and create Transaction + * @return Trx Name + */ + protected String getTrxName() + { + return m_trxName; + } // getTrxName + + /** + * Unlock Document + */ + private void unlock() + { + StringBuffer sql = new StringBuffer ("UPDATE "); + sql.append(get_TableName()).append( " SET Processing='N' WHERE ") + .append(get_TableName()).append("_ID=").append(p_po.get_ID()); + DB.executeUpdate(sql.toString(), null); // outside trx + } // unlock + + + /************************************************************************** + * Load Document Type and GL Info. + * Set p_DocumentType and p_GL_Category_ID + * @return document type + */ + protected String getDocumentType() + { + if (m_DocumentType == null) + setDocumentType(null); + return m_DocumentType; + } // getDocumentType + + /** + * Load Document Type and GL Info. + * Set p_DocumentType and p_GL_Category_ID + * @param DocumentType + */ + public void setDocumentType (String DocumentType) + { + if (DocumentType != null) + m_DocumentType = DocumentType; + // No Document Type defined + if (m_DocumentType == null && getC_DocType_ID() != 0) + { + String sql = "SELECT DocBaseType, GL_Category_ID FROM C_DocType WHERE C_DocType_ID=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, getC_DocType_ID()); + ResultSet rsDT = pstmt.executeQuery(); + if (rsDT.next()) + { + m_DocumentType = rsDT.getString(1); + m_GL_Category_ID = rsDT.getInt(2); + } + rsDT.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + } + if (m_DocumentType == null) + { + log.log(Level.SEVERE, "No DocBaseType for C_DocType_ID=" + + getC_DocType_ID() + ", DocumentNo=" + getDocumentNo()); + } + + // We have a document Type, but no GL info - search for DocType + if (m_GL_Category_ID == 0) + { + String sql = "SELECT GL_Category_ID FROM C_DocType " + + "WHERE AD_Client_ID=? AND DocBaseType=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, getAD_Client_ID()); + pstmt.setString(2, m_DocumentType); + ResultSet rsDT = pstmt.executeQuery(); + if (rsDT.next()) + m_GL_Category_ID = rsDT.getInt(1); + rsDT.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + } + + // Still no GL_Category - get Default GL Category + if (m_GL_Category_ID == 0) + { + String sql = "SELECT GL_Category_ID FROM GL_Category " + + "WHERE AD_Client_ID=? " + + "ORDER BY IsDefault DESC"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, getAD_Client_ID()); + ResultSet rsDT = pstmt.executeQuery(); + if (rsDT.next()) + m_GL_Category_ID = rsDT.getInt(1); + rsDT.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + } + // + if (m_GL_Category_ID == 0) + log.log(Level.SEVERE, "No default GL_Category - " + toString()); + + if (m_DocumentType == null) + throw new IllegalStateException("Document Type not found"); + } // setDocumentType + + + /************************************************************************** + * Is the Source Document Balanced + * @return true if (source) baanced + */ + public boolean isBalanced() + { + // Multi-Currency documents are source balanced by definition + if (isMultiCurrency()) + return true; + // + boolean retValue = getBalance().signum() == 0; + if (retValue) + log.fine("Yes " + toString()); + else + log.warning("NO - " + toString()); + return retValue; + } // isBalanced + + /** + * Is Document convertible to currency and Conversion Type + * @param acctSchema accounting schema + * @return true, if vonvertable to accounting currency + */ + public boolean isConvertible (MAcctSchema acctSchema) + { + // No Currency in document + if (getC_Currency_ID() == NO_CURRENCY) + { + log.fine("(none) - " + toString()); + return true; + } + // Get All Currencies + HashSet set = new HashSet(); + set.add(new Integer(getC_Currency_ID())); + for (int i = 0; p_lines != null && i < p_lines.length; i++) + { + int C_Currency_ID = p_lines[i].getC_Currency_ID(); + if (C_Currency_ID != NO_CURRENCY) + set.add(new Integer(C_Currency_ID)); + } + + // just one and the same + if (set.size() == 1 && acctSchema.getC_Currency_ID() == getC_Currency_ID()) + { + log.fine("(same) Cur=" + getC_Currency_ID() + " - " + toString()); + return true; + } + + boolean convertible = true; + Iterator it = set.iterator(); + while (it.hasNext() && convertible) + { + int C_Currency_ID = ((Integer)it.next()).intValue(); + if (C_Currency_ID != acctSchema.getC_Currency_ID()) + { + BigDecimal amt = MConversionRate.getRate (C_Currency_ID, acctSchema.getC_Currency_ID(), + getDateAcct(), getC_ConversionType_ID(), getAD_Client_ID(), getAD_Org_ID()); + if (amt == null) + { + convertible = false; + log.warning ("NOT from C_Currency_ID=" + C_Currency_ID + + " to " + acctSchema.getC_Currency_ID() + + " - " + toString()); + } + else + log.fine("From C_Currency_ID=" + C_Currency_ID); + } + } + + log.fine("Convertible=" + convertible + ", AcctSchema C_Currency_ID=" + acctSchema.getC_Currency_ID() + " - " + toString()); + return convertible; + } // isConvertible + + /** + * Calculate Period from DateAcct. + * m_C_Period_ID is set to -1 of not open to 0 if not found + */ + public void setPeriod() + { + if (m_period != null) + return; + + // Period defined in GL Journal (e.g. adjustment period) + int index = p_po.get_ColumnIndex("C_Period_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + m_period = MPeriod.get(getCtx(), ii.intValue()); + } + if (m_period == null) + m_period = MPeriod.get(getCtx(), getDateAcct()); + // Is Period Open? + if (m_period != null + && m_period.isOpen(getDocumentType())) + m_C_Period_ID = m_period.getC_Period_ID(); + else + m_C_Period_ID = -1; + // + log.fine( // + AD_Client_ID + " - " + getDateAcct() + " - " + getDocumentType() + " => " + m_C_Period_ID); + } // setC_Period_ID + + /** + * Get C_Period_ID + * @return period + */ + public int getC_Period_ID() + { + if (m_period == null) + setPeriod(); + return m_C_Period_ID; + } // getC_Period_ID + + /** + * Is Period Open + * @return true if period is open + */ + public boolean isPeriodOpen() + { + setPeriod(); + boolean open = m_C_Period_ID > 0; + if (open) + log.fine("Yes - " + toString()); + else + log.warning("NO - " + toString()); + return open; + } // isPeriodOpen + + /*************************************************************************/ + + /** Amount Type - Invoice - Gross */ + public static final int AMTTYPE_Gross = 0; + /** Amount Type - Invoice - Net */ + public static final int AMTTYPE_Net = 1; + /** Amount Type - Invoice - Charge */ + public static final int AMTTYPE_Charge = 2; + + /** Source Amounts (may not all be used) */ + private BigDecimal[] m_Amounts = new BigDecimal[4]; + /** Quantity */ + private BigDecimal m_qty = null; + + /** + * Get the Amount + * (loaded in loadDocumentDetails) + * + * @param AmtType see AMTTYPE_* + * @return Amount + */ + public BigDecimal getAmount(int AmtType) + { + if (AmtType < 0 || AmtType >= m_Amounts.length) + return null; + return m_Amounts[AmtType]; + } // getAmount + + /** + * Set the Amount + * @param AmtType see AMTTYPE_* + * @param amt Amount + */ + public void setAmount(int AmtType, BigDecimal amt) + { + if (AmtType < 0 || AmtType >= m_Amounts.length) + return; + if (amt == null) + m_Amounts[AmtType] = Env.ZERO; + else + m_Amounts[AmtType] = amt; + } // setAmount + + /** + * Get Amount with index 0 + * @return Amount (primary document amount) + */ + public BigDecimal getAmount() + { + return m_Amounts[0]; + } // getAmount + + /** + * Set Quantity + * @param qty Quantity + */ + public void setQty (BigDecimal qty) + { + m_qty = qty; + } // setQty + + /** + * Get Quantity + * @return Quantity + */ + public BigDecimal getQty() + { + if (m_qty == null) + { + int index = p_po.get_ColumnIndex("Qty"); + if (index != -1) + m_qty = (BigDecimal)p_po.get_Value(index); + else + m_qty = Env.ZERO; + } + return m_qty; + } // getQty + + /*************************************************************************/ + + /** Account Type - Invoice - Charge */ + public static final int ACCTTYPE_Charge = 0; + /** Account Type - Invoice - AR */ + public static final int ACCTTYPE_C_Receivable = 1; + /** Account Type - Invoice - AP */ + public static final int ACCTTYPE_V_Liability = 2; + /** Account Type - Invoice - AP Service */ + public static final int ACCTTYPE_V_Liability_Services = 3; + /** Account Type - Invoice - AR Service */ + public static final int ACCTTYPE_C_Receivable_Services = 4; + + /** Account Type - Payment - Unallocated */ + public static final int ACCTTYPE_UnallocatedCash = 10; + /** Account Type - Payment - Transfer */ + public static final int ACCTTYPE_BankInTransit = 11; + /** Account Type - Payment - Selection */ + public static final int ACCTTYPE_PaymentSelect = 12; + /** Account Type - Payment - Prepayment */ + public static final int ACCTTYPE_C_Prepayment = 13; + /** Account Type - Payment - Prepayment */ + public static final int ACCTTYPE_V_Prepayment = 14; + + /** Account Type - Cash - Asset */ + public static final int ACCTTYPE_CashAsset = 20; + /** Account Type - Cash - Transfer */ + public static final int ACCTTYPE_CashTransfer = 21; + /** Account Type - Cash - Expense */ + public static final int ACCTTYPE_CashExpense = 22; + /** Account Type - Cash - Receipt */ + public static final int ACCTTYPE_CashReceipt = 23; + /** Account Type - Cash - Difference */ + public static final int ACCTTYPE_CashDifference = 24; + + /** Account Type - Allocation - Discount Expense (AR) */ + public static final int ACCTTYPE_DiscountExp = 30; + /** Account Type - Allocation - Discount Revenue (AP) */ + public static final int ACCTTYPE_DiscountRev = 31; + /** Account Type - Allocation - Write Off */ + public static final int ACCTTYPE_WriteOff = 32; + + /** Account Type - Bank Statement - Asset */ + public static final int ACCTTYPE_BankAsset = 40; + /** Account Type - Bank Statement - Interest Revenue */ + public static final int ACCTTYPE_InterestRev = 41; + /** Account Type - Bank Statement - Interest Exp */ + public static final int ACCTTYPE_InterestExp = 42; + + /** Inventory Accounts - Differnces */ + public static final int ACCTTYPE_InvDifferences = 50; + /** Inventory Accounts - NIR */ + public static final int ACCTTYPE_NotInvoicedReceipts = 51; + + /** Project Accounts - Assets */ + public static final int ACCTTYPE_ProjectAsset = 61; + /** Project Accounts - WIP */ + public static final int ACCTTYPE_ProjectWIP = 62; + + /** GL Accounts - PPV Offset */ + public static final int ACCTTYPE_PPVOffset = 101; + /** GL Accounts - Commitment Offset */ + public static final int ACCTTYPE_CommitmentOffset = 111; + + + /** + * Get the Valid Combination id for Accounting Schema + * @param AcctType see ACCTTYPE_* + * @param as accounting schema + * @return C_ValidCombination_ID + */ + public int getValidCombination_ID (int AcctType, MAcctSchema as) + { + int para_1 = 0; // first parameter (second is always AcctSchema) + String sql = null; + + /** Account Type - Invoice */ + if (AcctType == ACCTTYPE_Charge) // see getChargeAccount in DocLine + { + int cmp = getAmount(AMTTYPE_Charge).compareTo(Env.ZERO); + if (cmp == 0) + return 0; + else if (cmp < 0) + sql = "SELECT CH_Expense_Acct FROM C_Charge_Acct WHERE C_Charge_ID=? AND C_AcctSchema_ID=?"; + else + sql = "SELECT CH_Revenue_Acct FROM C_Charge_Acct WHERE C_Charge_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_Charge_ID(); + } + else if (AcctType == ACCTTYPE_V_Liability) + { + sql = "SELECT V_Liability_Acct FROM C_BP_Vendor_Acct WHERE C_BPartner_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BPartner_ID(); + } + else if (AcctType == ACCTTYPE_V_Liability_Services) + { + sql = "SELECT V_Liability_Services_Acct FROM C_BP_Vendor_Acct WHERE C_BPartner_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BPartner_ID(); + } + else if (AcctType == ACCTTYPE_C_Receivable) + { + sql = "SELECT C_Receivable_Acct FROM C_BP_Customer_Acct WHERE C_BPartner_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BPartner_ID(); + } + else if (AcctType == ACCTTYPE_C_Receivable_Services) + { + sql = "SELECT C_Receivable_Services_Acct FROM C_BP_Customer_Acct WHERE C_BPartner_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BPartner_ID(); + } + else if (AcctType == ACCTTYPE_V_Prepayment) + { + sql = "SELECT V_Prepayment_Acct FROM C_BP_Vendor_Acct WHERE C_BPartner_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BPartner_ID(); + } + else if (AcctType == ACCTTYPE_C_Prepayment) + { + sql = "SELECT C_Prepayment_Acct FROM C_BP_Customer_Acct WHERE C_BPartner_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BPartner_ID(); + } + + /** Account Type - Payment */ + else if (AcctType == ACCTTYPE_UnallocatedCash) + { + sql = "SELECT B_UnallocatedCash_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BankAccount_ID(); + } + else if (AcctType == ACCTTYPE_BankInTransit) + { + sql = "SELECT B_InTransit_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BankAccount_ID(); + } + else if (AcctType == ACCTTYPE_PaymentSelect) + { + sql = "SELECT B_PaymentSelect_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BankAccount_ID(); + } + + /** Account Type - Allocation */ + else if (AcctType == ACCTTYPE_DiscountExp) + { + sql = "SELECT a.PayDiscount_Exp_Acct FROM C_BP_Group_Acct a, C_BPartner bp " + + "WHERE a.C_BP_Group_ID=bp.C_BP_Group_ID AND bp.C_BPartner_ID=? AND a.C_AcctSchema_ID=?"; + para_1 = getC_BPartner_ID(); + } + else if (AcctType == ACCTTYPE_DiscountRev) + { + sql = "SELECT PayDiscount_Rev_Acct FROM C_BP_Group_Acct a, C_BPartner bp " + + "WHERE a.C_BP_Group_ID=bp.C_BP_Group_ID AND bp.C_BPartner_ID=? AND a.C_AcctSchema_ID=?"; + para_1 = getC_BPartner_ID(); + } + else if (AcctType == ACCTTYPE_WriteOff) + { + sql = "SELECT WriteOff_Acct FROM C_BP_Group_Acct a, C_BPartner bp " + + "WHERE a.C_BP_Group_ID=bp.C_BP_Group_ID AND bp.C_BPartner_ID=? AND a.C_AcctSchema_ID=?"; + para_1 = getC_BPartner_ID(); + } + + /** Account Type - Bank Statement */ + else if (AcctType == ACCTTYPE_BankAsset) + { + sql = "SELECT B_Asset_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BankAccount_ID(); + } + else if (AcctType == ACCTTYPE_InterestRev) + { + sql = "SELECT B_InterestRev_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BankAccount_ID(); + } + else if (AcctType == ACCTTYPE_InterestExp) + { + sql = "SELECT B_InterestExp_Acct FROM C_BankAccount_Acct WHERE C_BankAccount_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_BankAccount_ID(); + } + + /** Account Type - Cash */ + else if (AcctType == ACCTTYPE_CashAsset) + { + sql = "SELECT CB_Asset_Acct FROM C_CashBook_Acct WHERE C_CashBook_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_CashBook_ID(); + } + else if (AcctType == ACCTTYPE_CashTransfer) + { + sql = "SELECT CB_CashTransfer_Acct FROM C_CashBook_Acct WHERE C_CashBook_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_CashBook_ID(); + } + else if (AcctType == ACCTTYPE_CashExpense) + { + sql = "SELECT CB_Expense_Acct FROM C_CashBook_Acct WHERE C_CashBook_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_CashBook_ID(); + } + else if (AcctType == ACCTTYPE_CashReceipt) + { + sql = "SELECT CB_Receipt_Acct FROM C_CashBook_Acct WHERE C_CashBook_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_CashBook_ID(); + } + else if (AcctType == ACCTTYPE_CashDifference) + { + sql = "SELECT CB_Differences_Acct FROM C_CashBook_Acct WHERE C_CashBook_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_CashBook_ID(); + } + + /** Inventory Accounts */ + else if (AcctType == ACCTTYPE_InvDifferences) + { + sql = "SELECT W_Differences_Acct FROM M_Warehouse_Acct WHERE M_Warehouse_ID=? AND C_AcctSchema_ID=?"; + // "SELECT W_Inventory_Acct, W_Revaluation_Acct, W_InvActualAdjust_Acct FROM M_Warehouse_Acct WHERE M_Warehouse_ID=? AND C_AcctSchema_ID=?"; + para_1 = getM_Warehouse_ID(); + } + else if (AcctType == ACCTTYPE_NotInvoicedReceipts) + { + sql = "SELECT NotInvoicedReceipts_Acct FROM C_BP_Group_Acct a, C_BPartner bp " + + "WHERE a.C_BP_Group_ID=bp.C_BP_Group_ID AND bp.C_BPartner_ID=? AND a.C_AcctSchema_ID=?"; + para_1 = getC_BPartner_ID(); + } + + /** Project Accounts */ + else if (AcctType == ACCTTYPE_ProjectAsset) + { + sql = "SELECT PJ_Asset_Acct FROM C_Project_Acct WHERE C_Project_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_Project_ID(); + } + else if (AcctType == ACCTTYPE_ProjectWIP) + { + sql = "SELECT PJ_WIP_Acct FROM C_Project_Acct WHERE C_Project_ID=? AND C_AcctSchema_ID=?"; + para_1 = getC_Project_ID(); + } + + /** GL Accounts */ + else if (AcctType == ACCTTYPE_PPVOffset) + { + sql = "SELECT PPVOffset_Acct FROM C_AcctSchema_GL WHERE C_AcctSchema_ID=?"; + para_1 = -1; + } + else if (AcctType == ACCTTYPE_CommitmentOffset) + { + sql = "SELECT CommitmentOffset_Acct FROM C_AcctSchema_GL WHERE C_AcctSchema_ID=?"; + para_1 = -1; + } + + else + { + log.severe ("Not found AcctType=" + AcctType); + return 0; + } + // Do we have sql & Parameter + if (sql == null || para_1 == 0) + { + log.severe ("No Parameter for AcctType=" + AcctType + " - SQL=" + sql); + return 0; + } + + // Get Acct + int Account_ID = 0; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + if (para_1 == -1) // GL Accounts + pstmt.setInt (1, as.getC_AcctSchema_ID()); + else + { + pstmt.setInt (1, para_1); + pstmt.setInt (2, as.getC_AcctSchema_ID()); + } + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + Account_ID = rs.getInt(1); + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, "AcctType=" + AcctType + " - SQL=" + sql, e); + return 0; + } + // No account + if (Account_ID == 0) + { + log.severe ("NO account Type=" + + AcctType + ", Record=" + p_po.get_ID()); + return 0; + } + return Account_ID; + } // getAccount_ID + + /** + * Get the account for Accounting Schema + * @param AcctType see ACCTTYPE_* + * @param as accounting schema + * @return Account + */ + public final MAccount getAccount (int AcctType, MAcctSchema as) + { + int C_ValidCombination_ID = getValidCombination_ID(AcctType, as); + if (C_ValidCombination_ID == 0) + return null; + // Return Account + MAccount acct = MAccount.get (as.getCtx(), C_ValidCombination_ID); + return acct; + } // getAccount + + + /************************************************************************** + * Save to Disk - set posted flag + * @param trxName transaction name + * @return true if saved + */ + private final boolean save (String trxName) + { + log.fine(toString() + "->" + p_Status); + + StringBuffer sql = new StringBuffer("UPDATE "); + sql.append(get_TableName()).append(" SET Posted='").append(p_Status) + .append("',Processing='N' ") + .append("WHERE ") + .append(get_TableName()).append("_ID=").append(p_po.get_ID()); + int no = DB.executeUpdate(sql.toString(), trxName); + return no == 1; + } // save + + /** + * Get DocLine with ID + * @param Record_ID Record ID + * @return DocLine + */ + public DocLine getDocLine (int Record_ID) + { + if (p_lines == null || p_lines.length == 0 || Record_ID == 0) + return null; + + for (int i = 0; i < p_lines.length; i++) + { + if (p_lines[i].get_ID() == Record_ID) + return p_lines[i]; + } + return null; + } // getDocLine + + /** + * String Representation + * @return String + */ + public String toString() + { + return p_po.toString(); + } // toString + + + /** + * Get AD_Client_ID + * @return client + */ + public int getAD_Client_ID() + { + return p_po.getAD_Client_ID(); + } // getAD_Client_ID + + /** + * Get AD_Org_ID + * @return org + */ + public int getAD_Org_ID() + { + return p_po.getAD_Org_ID(); + } // getAD_Org_ID + + /** + * Get Document No + * @return document No + */ + public String getDocumentNo() + { + if (m_DocumentNo != null) + return m_DocumentNo; + int index = p_po.get_ColumnIndex("DocumentNo"); + if (index == -1) + index = p_po.get_ColumnIndex("Name"); + if (index == -1) + throw new UnsupportedOperationException("No DocumentNo"); + m_DocumentNo = (String)p_po.get_Value(index); + return m_DocumentNo; + } // getDocumentNo + + /** + * Get Description + * @return Description + */ + public String getDescription() + { + if (m_Description == null) + { + int index = p_po.get_ColumnIndex("Description"); + if (index != -1) + m_Description = (String)p_po.get_Value(index); + else + m_Description = ""; + } + return m_Description; + } // getDescription + + /** + * Get C_Currency_ID + * @return currency + */ + public int getC_Currency_ID() + { + if (m_C_Currency_ID == -1) + { + int index = p_po.get_ColumnIndex("C_Currency_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + m_C_Currency_ID = ii.intValue(); + } + if (m_C_Currency_ID == -1) + m_C_Currency_ID = NO_CURRENCY; + } + return m_C_Currency_ID; + } // getC_Currency_ID + + /** + * Set C_Currency_ID + * @param C_Currency_ID id + */ + public void setC_Currency_ID (int C_Currency_ID) + { + m_C_Currency_ID = C_Currency_ID; + } // setC_Currency_ID + + /** + * Is Multi Currency + * @return mc + */ + public boolean isMultiCurrency() + { + return m_MultiCurrency; + } // isMultiCurrency + + /** + * Set Multi Currency + * @param mc multi currency + */ + public void setIsMultiCurrency (boolean mc) + { + m_MultiCurrency = mc; + } // setIsMultiCurrency + + /** + * Is Tax Included + * @return tax incl + */ + public boolean isTaxIncluded() + { + return m_TaxIncluded; + } // isTaxIncluded + + /** + * Set Tax Includedy + * @param ti Tax Included + */ + public void setIsTaxIncluded (boolean ti) + { + m_TaxIncluded = ti; + } // setIsTaxIncluded + + /** + * Get C_ConversionType_ID + * @return ConversionType + */ + public int getC_ConversionType_ID() + { + int index = p_po.get_ColumnIndex("C_ConversionType_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_ConversionType_ID + + /** + * Get GL_Category_ID + * @return categoory + */ + public int getGL_Category_ID() + { + return m_GL_Category_ID; + } // getGL_Category_ID + + /** + * Get GL_Category_ID + * @return categoory + */ + public int getGL_Budget_ID() + { + int index = p_po.get_ColumnIndex("GL_Budget_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getGL_Budget_ID + + /** + * Get Accounting Date + * @return currency + */ + public Timestamp getDateAcct() + { + if (m_DateAcct != null) + return m_DateAcct; + int index = p_po.get_ColumnIndex("DateAcct"); + if (index != -1) + { + m_DateAcct = (Timestamp)p_po.get_Value(index); + if (m_DateAcct != null) + return m_DateAcct; + } + throw new IllegalStateException("No DateAcct"); + } // getDateAcct + + /** + * Set Date Acct + * @param da accounting date + */ + public void setDateAcct (Timestamp da) + { + m_DateAcct = da; + } // setDateAcct + + /** + * Get Document Date + * @return currency + */ + public Timestamp getDateDoc() + { + if (m_DateDoc != null) + return m_DateDoc; + int index = p_po.get_ColumnIndex("DateDoc"); + if (index == -1) + index = p_po.get_ColumnIndex("MovementDate"); + if (index != -1) + { + m_DateDoc = (Timestamp)p_po.get_Value(index); + if (m_DateDoc != null) + return m_DateDoc; + } + throw new IllegalStateException("No DateDoc"); + } // getDateDoc + + /** + * Set Date Doc + * @param dd document date + */ + public void setDateDoc (Timestamp dd) + { + m_DateDoc = dd; + } // setDateDoc + + /** + * Is Document Posted + * @return true if posted + */ + public boolean isPosted() + { + int index = p_po.get_ColumnIndex("Posted"); + if (index != -1) + { + Object posted = p_po.get_Value(index); + if (posted instanceof Boolean) + return ((Boolean)posted).booleanValue(); + if (posted instanceof String) + return "Y".equals(posted); + } + throw new IllegalStateException("No Posted"); + } // isPosted + + /** + * Is Sales Trx + * @return true if posted + */ + public boolean isSOTrx() + { + int index = p_po.get_ColumnIndex("IsSOTrx"); + if (index == -1) + index = p_po.get_ColumnIndex("IsReceipt"); + if (index != -1) + { + Object posted = p_po.get_Value(index); + if (posted instanceof Boolean) + return ((Boolean)posted).booleanValue(); + if (posted instanceof String) + return "Y".equals(posted); + } + return false; + } // isSOTrx + + /** + * Get C_DocType_ID + * @return DocType + */ + public int getC_DocType_ID() + { + int index = p_po.get_ColumnIndex("C_DocType_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + // DocType does not exist - get DocTypeTarget + if (ii != null && ii.intValue() == 0) + { + index = p_po.get_ColumnIndex("C_DocTypeTarget_ID"); + if (index != -1) + ii = (Integer)p_po.get_Value(index); + } + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_DocType_ID + + /** + * Get header level C_Charge_ID + * @return Charge + */ + public int getC_Charge_ID() + { + int index = p_po.get_ColumnIndex("C_Charge_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_Charge_ID + + /** + * Get SalesRep_ID + * @return SalesRep + */ + public int getSalesRep_ID() + { + int index = p_po.get_ColumnIndex("SalesRep_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getSalesRep_ID + + /** + * Get C_BankAccount_ID + * @return BankAccount + */ + public int getC_BankAccount_ID() + { + if (m_C_BankAccount_ID == -1) + { + int index = p_po.get_ColumnIndex("C_BankAccount_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + m_C_BankAccount_ID = ii.intValue(); + } + if (m_C_BankAccount_ID == -1) + m_C_BankAccount_ID = 0; + } + return m_C_BankAccount_ID; + } // getC_BankAccount_ID + + /** + * Set C_BankAccount_ID + * @param C_BankAccount_ID bank acct + */ + public void setC_BankAccount_ID (int C_BankAccount_ID) + { + m_C_BankAccount_ID = C_BankAccount_ID; + } // setC_BankAccount_ID + + /** + * Get C_CashBook_ID + * @return CashBook + */ + public int getC_CashBook_ID() + { + if (m_C_CashBook_ID == -1) + { + int index = p_po.get_ColumnIndex("C_CashBook_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + m_C_CashBook_ID = ii.intValue(); + } + if (m_C_CashBook_ID == -1) + m_C_CashBook_ID = 0; + } + return m_C_CashBook_ID; + } // getC_CashBook_ID + + /** + * Set C_CashBook_ID + * @param C_CashBook_ID cash book + */ + public void setC_CashBook_ID (int C_CashBook_ID) + { + m_C_CashBook_ID = C_CashBook_ID; + } // setC_CashBook_ID + + /** + * Get M_Warehouse_ID + * @return Warehouse + */ + public int getM_Warehouse_ID() + { + int index = p_po.get_ColumnIndex("M_Warehouse_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getM_Warehouse_ID + + + /** + * Get C_BPartner_ID + * @return BPartner + */ + public int getC_BPartner_ID() + { + if (m_C_BPartner_ID == -1) + { + int index = p_po.get_ColumnIndex("C_BPartner_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + m_C_BPartner_ID = ii.intValue(); + } + if (m_C_BPartner_ID == -1) + m_C_BPartner_ID = 0; + } + return m_C_BPartner_ID; + } // getC_BPartner_ID + + /** + * Set C_BPartner_ID + * @param C_BPartner_ID bp + */ + public void setC_BPartner_ID (int C_BPartner_ID) + { + m_C_BPartner_ID = C_BPartner_ID; + } // setC_BPartner_ID + + /** + * Get C_BPartner_Location_ID + * @return BPartner Location + */ + public int getC_BPartner_Location_ID() + { + int index = p_po.get_ColumnIndex("C_BPartner_Location_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_BPartner_Location_ID + + /** + * Get C_Project_ID + * @return Project + */ + public int getC_Project_ID() + { + int index = p_po.get_ColumnIndex("C_Project_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_Project_ID + + /** + * Get C_SalesRegion_ID + * @return Sales Region + */ + public int getC_SalesRegion_ID() + { + int index = p_po.get_ColumnIndex("C_SalesRegion_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_SalesRegion_ID + + /** + * Get C_SalesRegion_ID + * @return Sales Region + */ + public int getBP_C_SalesRegion_ID() + { + if (m_BP_C_SalesRegion_ID == -1) + { + int index = p_po.get_ColumnIndex("C_SalesRegion_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + m_BP_C_SalesRegion_ID = ii.intValue(); + } + if (m_BP_C_SalesRegion_ID == -1) + m_BP_C_SalesRegion_ID = 0; + } + return m_BP_C_SalesRegion_ID; + } // getBP_C_SalesRegion_ID + + /** + * Set C_SalesRegion_ID + * @param C_SalesRegion_ID id + */ + public void setBP_C_SalesRegion_ID (int C_SalesRegion_ID) + { + m_BP_C_SalesRegion_ID = C_SalesRegion_ID; + } // setBP_C_SalesRegion_ID + + /** + * Get C_Activity_ID + * @return Activity + */ + public int getC_Activity_ID() + { + int index = p_po.get_ColumnIndex("C_Activity_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_Activity_ID + + /** + * Get C_Campaign_ID + * @return Campaign + */ + public int getC_Campaign_ID() + { + int index = p_po.get_ColumnIndex("C_Campaign_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_Campaign_ID + + /** + * Get M_Product_ID + * @return Product + */ + public int getM_Product_ID() + { + int index = p_po.get_ColumnIndex("M_Product_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getM_Product_ID + + /** + * Get AD_OrgTrx_ID + * @return Trx Org + */ + public int getAD_OrgTrx_ID() + { + int index = p_po.get_ColumnIndex("AD_OrgTrx_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getAD_OrgTrx_ID + + /** + * Get C_LocFrom_ID + * @return loc from + */ + public int getC_LocFrom_ID() + { + return m_C_LocFrom_ID; + } // getC_LocFrom_ID + + /** + * Set C_LocFrom_ID + * @param C_LocFrom_ID loc from + */ + public void setC_LocFrom_ID(int C_LocFrom_ID) + { + m_C_LocFrom_ID = C_LocFrom_ID; + } // setC_LocFrom_ID + + /** + * Get C_LocTo_ID + * @return loc to + */ + public int getC_LocTo_ID() + { + return m_C_LocTo_ID; + } // getC_LocTo_ID + + /** + * Set C_LocTo_ID + * @param C_LocTo_ID loc to + */ + public void setC_LocTo_ID(int C_LocTo_ID) + { + m_C_LocTo_ID = C_LocTo_ID; + } // setC_LocTo_ID + + /** + * Get User1_ID + * @return Campaign + */ + public int getUser1_ID() + { + int index = p_po.get_ColumnIndex("User1_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getUser1_ID + + /** + * Get User2_ID + * @return Campaign + */ + public int getUser2_ID() + { + int index = p_po.get_ColumnIndex("User2_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getUser2_ID + + /** + * Get User Defined value + * @return User defined + */ + public int getValue (String ColumnName) + { + int index = p_po.get_ColumnIndex(ColumnName); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getValue + + + /*************************************************************************/ + // To be overwritten by Subclasses + + /** + * Load Document Details + * @return error message or null + */ + protected abstract String loadDocumentDetails (); + + /** + * Get Source Currency Balance - subtracts line (and tax) amounts from total - no rounding + * @return positive amount, if total header is bigger than lines + */ + public abstract BigDecimal getBalance(); + + /** + * Create Facts (the accounting logic) + * @param as accounting schema + * @return Facts + */ + public abstract ArrayList createFacts (MAcctSchema as); + + /** + * Get Facts (the accounting logic) + * @return Facts + */ + public ArrayList getFacts() { + return m_fact; + } + +} // Doc diff --git a/base/src/org/compiere/acct/DocLine.java b/base/src/org/compiere/acct/DocLine.java new file mode 100644 index 0000000000..81240c176a --- /dev/null +++ b/base/src/org/compiere/acct/DocLine.java @@ -0,0 +1,1033 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; + +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Standard Document Line + * + * @author Jorg Janke + * @version $Id: DocLine.java,v 1.2 2006/07/30 00:53:33 jjanke Exp $ + */ +public class DocLine +{ + /** + * Create Document Line + * @param po line persistent object + * @param doc header + */ + public DocLine (PO po, Doc doc) + { + if (po == null) + throw new IllegalArgumentException("PO is null"); + p_po = po; + m_doc = doc; + // + // Document Consistency + if (p_po.getAD_Org_ID() == 0) + p_po.setAD_Org_ID(m_doc.getAD_Org_ID()); + } // DocLine + + /** Persistent Object */ + protected PO p_po = null; + /** Parent */ + private Doc m_doc = null; + /** Log */ + protected CLogger log = CLogger.getCLogger(getClass()); + + /** Qty */ + private BigDecimal m_qty = null; + + // -- GL Amounts + /** Debit Journal Amt */ + private BigDecimal m_AmtSourceDr = Env.ZERO; + /** Credit Journal Amt */ + private BigDecimal m_AmtSourceCr = Env.ZERO; + /** Net Line Amt */ + private BigDecimal m_LineNetAmt = null; + /** List Amount */ + private BigDecimal m_ListAmt = Env.ZERO; + /** Discount Amount */ + private BigDecimal m_DiscountAmt = Env.ZERO; + + /** Converted Amounts */ + private BigDecimal m_AmtAcctDr = null; + private BigDecimal m_AmtAcctCr = null; + /** Acct Schema */ + private int m_C_AcctSchema_ID = 0; + + /** Product Costs */ + private ProductCost m_productCost = null; + /** Production indicator */ + private boolean m_productionBOM = false; + /** Account used only for GL Journal */ + private MAccount m_account = null; + + /** Accounting Date */ + private Timestamp m_DateAcct = null; + /** Document Date */ + private Timestamp m_DateDoc = null; + /** Sales Region */ + private int m_C_SalesRegion_ID = -1; + /** Sales Region */ + private int m_C_BPartner_ID = -1; + /** Location From */ + private int m_C_LocFrom_ID = 0; + /** Location To */ + private int m_C_LocTo_ID = 0; + /** Item */ + private Boolean m_isItem = null; + /** Currency */ + private int m_C_Currency_ID = -1; + /** Conversion Type */ + private int m_C_ConversionType_ID = -1; + /** Period */ + private int m_C_Period_ID = -1; + + /** + * Get Currency + * @return c_Currency_ID + */ + public int getC_Currency_ID () + { + if (m_C_Currency_ID == -1) + { + int index = p_po.get_ColumnIndex("C_Currency_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + m_C_Currency_ID = ii.intValue(); + } + if (m_C_Currency_ID <= 0) + m_C_Currency_ID = m_doc.getC_Currency_ID(); + } + return m_C_Currency_ID; + } // getC_Currency_ID + + /** + * Get Conversion Type + * @return C_ConversionType_ID + */ + public int getC_ConversionType_ID () + { + if (m_C_ConversionType_ID == -1) + { + int index = p_po.get_ColumnIndex("C_ConversionType_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + m_C_ConversionType_ID = ii.intValue(); + } + if (m_C_ConversionType_ID <= 0) + m_C_ConversionType_ID = m_doc.getC_ConversionType_ID(); + } + return m_C_ConversionType_ID; + } // getC_ConversionType_ID + + /** + * Set C_ConversionType_ID + * @param C_ConversionType_ID id + */ + protected void setC_ConversionType_ID(int C_ConversionType_ID) + { + m_C_ConversionType_ID = C_ConversionType_ID; + } // setC_ConversionType_ID + + /** + * Set Amount (DR) + * @param sourceAmt source amt + */ + public void setAmount (BigDecimal sourceAmt) + { + m_AmtSourceDr = sourceAmt == null ? Env.ZERO : sourceAmt; + m_AmtSourceCr = Env.ZERO; + } // setAmounts + + /** + * Set Amounts + * @param amtSourceDr source amount dr + * @param amtSourceCr source amount cr + */ + public void setAmount (BigDecimal amtSourceDr, BigDecimal amtSourceCr) + { + m_AmtSourceDr = amtSourceDr == null ? Env.ZERO : amtSourceDr; + m_AmtSourceCr = amtSourceCr == null ? Env.ZERO : amtSourceCr; + } // setAmounts + + /** + * Set Converted Amounts + * @param C_AcctSchema_ID acct schema + * @param amtAcctDr acct amount dr + * @param amtAcctCr acct amount cr + */ + public void setConvertedAmt (int C_AcctSchema_ID, BigDecimal amtAcctDr, BigDecimal amtAcctCr) + { + m_C_AcctSchema_ID = C_AcctSchema_ID; + m_AmtAcctDr = amtAcctDr; + m_AmtAcctCr = amtAcctCr; + } // setConvertedAmt + + /** + * Line Net Amount or Dr-Cr + * @return balance + */ + public BigDecimal getAmtSource() + { + return m_AmtSourceDr.subtract(m_AmtSourceCr); + } // getAmount + + /** + * Get (Journal) Line Source Dr Amount + * @return DR source amount + */ + public BigDecimal getAmtSourceDr() + { + return m_AmtSourceDr; + } // getAmtSourceDr + + /** + * Get (Journal) Line Source Cr Amount + * @return CR source amount + */ + public BigDecimal getAmtSourceCr() + { + return m_AmtSourceCr; + } // getAmtSourceCr + + /** + * Line Journal Accounted Dr Amount + * @return DR accounted amount + */ + public BigDecimal getAmtAcctDr() + { + return m_AmtAcctDr; + } // getAmtAcctDr + + /** + * Line Journal Accounted Cr Amount + * @return CR accounted amount + */ + public BigDecimal getAmtAcctCr() + { + return m_AmtAcctCr; + } // getAmtAccrCr + + /** + * Charge Amount + * @return charge amount + */ + public BigDecimal getChargeAmt() + { + int index = p_po.get_ColumnIndex("ChargeAmt"); + if (index != -1) + { + BigDecimal bd = (BigDecimal)p_po.get_Value(index); + if (bd != null) + return bd; + } + return Env.ZERO; + } // getChargeAmt + + /** + * Set Product Amounts + * @param LineNetAmt Line Net Amt + * @param PriceList Price List + * @param Qty Qty for discount calc + */ + public void setAmount (BigDecimal LineNetAmt, BigDecimal PriceList, BigDecimal Qty) + { + m_LineNetAmt = LineNetAmt == null ? Env.ZERO : LineNetAmt; + + if (PriceList != null && Qty != null) + m_ListAmt = PriceList.multiply(Qty); + if (m_ListAmt.equals(Env.ZERO)) + m_ListAmt = m_LineNetAmt; + m_DiscountAmt = m_ListAmt.subtract(m_LineNetAmt); + // + setAmount (m_ListAmt, m_DiscountAmt); + // Log.trace(this,Log.l6_Database, "DocLine_Invoice.setAmount", + // "LineNet=" + m_LineNetAmt + ", List=" + m_ListAmt + ", Discount=" + m_DiscountAmt + // + " => Amount=" + getAmount()); + } // setAmounts + + /** + * Line Discount + * @return discount amount + */ + public BigDecimal getDiscount() + { + return m_DiscountAmt; + } // getDiscount + + /** + * Line List Amount + * @return list amount + */ + public BigDecimal getListAmount() + { + return m_ListAmt; + } // getListAmount + + /** + * Set Line Net Amt Difference + * @param diff difference (to be subtracted) + */ + public void setLineNetAmtDifference (BigDecimal diff) + { + String msg = "Diff=" + diff + + " - LineNetAmt=" + m_LineNetAmt; + m_LineNetAmt = m_LineNetAmt.subtract(diff); + m_DiscountAmt = m_ListAmt.subtract(m_LineNetAmt); + setAmount (m_ListAmt, m_DiscountAmt); + msg += " -> " + m_LineNetAmt; + log.fine(msg); + } // setLineNetAmtDifference + + /************************************************************************** + * Set Accounting Date + * @param dateAcct acct date + */ + public void setDateAcct (Timestamp dateAcct) + { + m_DateAcct = dateAcct; + } // setDateAcct + + /** + * Get Accounting Date + * @return accounting date + */ + public Timestamp getDateAcct () + { + if (m_DateAcct != null) + return m_DateAcct; + int index = p_po.get_ColumnIndex("DateAcct"); + if (index != -1) + { + m_DateAcct = (Timestamp)p_po.get_Value(index); + if (m_DateAcct != null) + return m_DateAcct; + } + m_DateAcct = m_doc.getDateAcct(); + return m_DateAcct; + } // getDateAcct + + /** + * Set Document Date + * @param dateDoc doc date + */ + public void setDateDoc (Timestamp dateDoc) + { + m_DateDoc = dateDoc; + } // setDateDoc + + /** + * Get Document Date + * @return document date + */ + public Timestamp getDateDoc () + { + if (m_DateDoc != null) + return m_DateDoc; + int index = p_po.get_ColumnIndex("DateDoc"); + if (index != -1) + { + m_DateDoc = (Timestamp)p_po.get_Value(index); + if (m_DateDoc != null) + return m_DateDoc; + } + m_DateDoc = m_doc.getDateDoc(); + return m_DateDoc; + } // getDateDoc + + + /************************************************************************** + * Set GL Journal Account + * @param acct account + */ + public void setAccount (MAccount acct) + { + m_account = acct; + } // setAccount + + /** + * Get GL Journal Account + * @return account + */ + public MAccount getAccount() + { + return m_account; + } // getAccount + + /** + * Line Account from Product (or Charge). + * + * @param AcctType see ProductCost.ACCTTYPE_* (0..3) + * @param as Accounting schema + * @return Requested Product Account + */ + public MAccount getAccount (int AcctType, MAcctSchema as) + { + // Charge Account + if (getM_Product_ID() == 0 && getC_Charge_ID() != 0) + { + BigDecimal amt = new BigDecimal (-1); // Revenue (-) + if (!m_doc.isSOTrx()) + amt = new BigDecimal (+1); // Expense (+) + MAccount acct = getChargeAccount(as, amt); + if (acct != null) + return acct; + } + // Product Account + return getProductCost().getAccount (AcctType, as); + } // getAccount + + /** + * Get Charge + * @return C_Charge_ID + */ + protected int getC_Charge_ID() + { + int index = p_po.get_ColumnIndex("C_Charge_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_Charge_ID + + /** + * Get Charge Account + * @param as account schema + * @param amount amount for expense(+)/revenue(-) + * @return Charge Account or null + */ + public MAccount getChargeAccount (MAcctSchema as, BigDecimal amount) + { + int C_Charge_ID = getC_Charge_ID(); + if (C_Charge_ID == 0) + return null; + return MCharge.getAccount(C_Charge_ID, as, amount); + } // getChargeAccount + + /** + * Get Period + * @return C_Period_ID + */ + protected int getC_Period_ID() + { + if (m_C_Period_ID == -1) + { + int index = p_po.get_ColumnIndex("C_Period_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + m_C_Period_ID = ii.intValue(); + } + if (m_C_Period_ID == -1) + m_C_Period_ID = 0; + } + return m_C_Period_ID; + } // getC_Period_ID + + /** + * Set C_Period_ID + * @param C_Period_ID id + */ + protected void setC_Period_ID (int C_Period_ID) + { + m_C_Period_ID = C_Period_ID; + } // setC_Period_ID + + /************************************************************************** + * Get (Journal) AcctSchema + * @return C_AcctSchema_ID + */ + public int getC_AcctSchema_ID() + { + return m_C_AcctSchema_ID; + } // getC_AcctSchema_ID + + /** + * Get Line ID + * @return id + */ + public int get_ID() + { + return p_po.get_ID(); + } // get_ID + + /** + * Get AD_Org_ID + * @return org + */ + public int getAD_Org_ID() + { + return p_po.getAD_Org_ID(); + } // getAD_Org_ID + + /** + * Get Order AD_Org_ID + * @return order org if defined + */ + public int getOrder_Org_ID() + { + int C_OrderLine_ID = getC_OrderLine_ID(); + if (C_OrderLine_ID != 0) + { + String sql = "SELECT AD_Org_ID FROM C_OrderLine WHERE C_OrderLine_ID=?"; + int AD_Org_ID = DB.getSQLValue(null, sql, C_OrderLine_ID); + if (AD_Org_ID > 0) + return AD_Org_ID; + } + return getAD_Org_ID(); + } // getOrder_Org_ID + + /** + * Product + * @return M_Product_ID + */ + public int getM_Product_ID() + { + int index = p_po.get_ColumnIndex("M_Product_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getM_Product_ID + + /** + * Is this an Item Product (vs. not a Service, a charge) + * @return true if product + */ + public boolean isItem() + { + if (m_isItem != null) + return m_isItem.booleanValue(); + + m_isItem = Boolean.FALSE; + if (getM_Product_ID() != 0) + { + MProduct product = MProduct.get(Env.getCtx(), getM_Product_ID()); + if (product.get_ID() == getM_Product_ID() && product.isItem()) + m_isItem = Boolean.TRUE; + } + return m_isItem.booleanValue(); + } // isItem + + /** + * ASI + * @return M_AttributeSetInstance_ID + */ + public int getM_AttributeSetInstance_ID() + { + int index = p_po.get_ColumnIndex("M_AttributeSetInstance_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getM_AttributeSetInstance_ID + + /** + * Get Warehouse Locator (from) + * @return M_Locator_ID + */ + public int getM_Locator_ID() + { + int index = p_po.get_ColumnIndex("M_Locator_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getM_Locator_ID + + /** + * Get Warehouse Locator To + * @return M_Locator_ID + */ + public int getM_LocatorTo_ID() + { + int index = p_po.get_ColumnIndex("M_LocatorTo_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getM_LocatorTo_ID + + /** + * Set Production BOM flag + * @param productionBOM flag + */ + public void setProductionBOM(boolean productionBOM) + { + m_productionBOM = productionBOM; + } // setProductionBOM + + /** + * Is this the BOM to be produced + * @return true if BOM + */ + public boolean isProductionBOM() + { + return m_productionBOM; + } // isProductionBOM + + /** + * Get Production Plan + * @return M_ProductionPlan_ID + */ + public int getM_ProductionPlan_ID() + { + int index = p_po.get_ColumnIndex("M_ProductionPlan_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getM_ProductionPlan_ID + + /** + * Get Order Line Reference + * @return C_OrderLine_ID + */ + public int getC_OrderLine_ID() + { + int index = p_po.get_ColumnIndex("C_OrderLine_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_OrderLine_ID + + /** + * Get C_LocFrom_ID + * @return loc from + */ + public int getC_LocFrom_ID() + { + return m_C_LocFrom_ID; + } // getC_LocFrom_ID + + /** + * Set C_LocFrom_ID + * @param C_LocFrom_ID loc from + */ + public void setC_LocFrom_ID(int C_LocFrom_ID) + { + m_C_LocFrom_ID = C_LocFrom_ID; + } // setC_LocFrom_ID + + /** + * Get C_LocTo_ID + * @return loc to + */ + public int getC_LocTo_ID() + { + return m_C_LocTo_ID; + } // getC_LocTo_ID + + /** + * Set C_LocTo_ID + * @param C_LocTo_ID loc to + */ + public void setC_LocTo_ID(int C_LocTo_ID) + { + m_C_LocTo_ID = C_LocTo_ID; + } // setC_LocTo_ID + + /** + * Get Product Cost Info + * @return product cost + */ + public ProductCost getProductCost() + { + if (m_productCost == null) + m_productCost = new ProductCost (Env.getCtx(), + getM_Product_ID(), getM_AttributeSetInstance_ID(), p_po.get_TrxName()); + return m_productCost; + } // getProductCost + + /** + * Get Total Product Costs + * @param as accounting schema + * @param AD_Org_ID trx org + * @param zeroCostsOK zero/no costs are OK + * @return costs + */ + public BigDecimal getProductCosts (MAcctSchema as, int AD_Org_ID, boolean zeroCostsOK) + { + ProductCost pc = getProductCost(); + int C_OrderLine_ID = getC_OrderLine_ID(); + String costingMethod = null; + BigDecimal costs = pc.getProductCosts(as, AD_Org_ID, costingMethod, + C_OrderLine_ID, zeroCostsOK); + if (costs != null) + return costs; + return Env.ZERO; + } // getProductCosts + + /** + * Get Product + * @return product or null if no product + */ + public MProduct getProduct() + { + if (m_productCost == null) + m_productCost = new ProductCost (Env.getCtx(), + getM_Product_ID(), getM_AttributeSetInstance_ID(), p_po.get_TrxName()); + if (m_productCost != null) + return m_productCost.getProduct(); + return null; + } // getProduct + + /** + * Get Revenue Recognition + * @return C_RevenueRecognition_ID or 0 + */ + public int getC_RevenueRecognition_ID() + { + MProduct product = getProduct(); + if (product != null) + return product.getC_RevenueRecognition_ID(); + return 0; + } // getC_RevenueRecognition_ID + + /** + * Quantity UOM + * @return Transaction or Storage M_UOM_ID + */ + public int getC_UOM_ID() + { + // Trx UOM + int index = p_po.get_ColumnIndex("C_UOM_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + // Storage UOM + MProduct product = getProduct(); + if (product != null) + return product.getC_UOM_ID(); + // + return 0; + } // getC_UOM + + /** + * Quantity + * @param qty transaction Qty + * @param isSOTrx SL order trx (i.e. negative qty) + */ + public void setQty (BigDecimal qty, boolean isSOTrx) + { + if (qty == null) + m_qty = Env.ZERO; + else if (isSOTrx) + m_qty = qty.negate(); + else + m_qty = qty; + getProductCost().setQty (qty); + } // setQty + + /** + * Quantity + * @return transaction Qty + */ + public BigDecimal getQty() + { + return m_qty; + } // getQty + + + + /** + * Description + * @return doc line description + */ + public String getDescription() + { + int index = p_po.get_ColumnIndex("Description"); + if (index != -1) + return (String)p_po.get_Value(index); + return null; + } // getDescription + + /** + * Line Tax + * @return C_Tax_ID + */ + public int getC_Tax_ID() + { + int index = p_po.get_ColumnIndex("C_Tax_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_Tax_ID + + /** + * Get Line Number + * @return line no + */ + public int getLine() + { + int index = p_po.get_ColumnIndex("Line"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getLine + + /** + * Get BPartner + * @return C_BPartner_ID + */ + public int getC_BPartner_ID() + { + if (m_C_BPartner_ID == -1) + { + int index = p_po.get_ColumnIndex("C_BPartner_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + m_C_BPartner_ID = ii.intValue(); + } + if (m_C_BPartner_ID <= 0) + m_C_BPartner_ID = m_doc.getC_BPartner_ID(); + } + return m_C_BPartner_ID; + } // getC_BPartner_ID + + /** + * Set C_BPartner_ID + * @param C_BPartner_ID id + */ + protected void setC_BPartner_ID (int C_BPartner_ID) + { + m_C_BPartner_ID = C_BPartner_ID; + } // setC_BPartner_ID + + + /** + * Get C_BPartner_Location_ID + * @return BPartner Location + */ + public int getC_BPartner_Location_ID() + { + int index = p_po.get_ColumnIndex("C_BPartner_Location_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return m_doc.getC_BPartner_Location_ID(); + } // getC_BPartner_Location_ID + + /** + * Get TrxOrg + * @return AD_OrgTrx_ID + */ + public int getAD_OrgTrx_ID() + { + int index = p_po.get_ColumnIndex("AD_OrgTrx_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getAD_OrgTrx_ID + + /** + * Get SalesRegion. + * - get Sales Region from BPartner + * @return C_SalesRegion_ID + */ + public int getC_SalesRegion_ID() + { + if (m_C_SalesRegion_ID == -1) // never tried + { + if (getC_BPartner_Location_ID() != 0) + // && m_acctSchema.isAcctSchemaElement(MAcctSchemaElement.ELEMENTTYPE_SalesRegion)) + { + String sql = "SELECT COALESCE(C_SalesRegion_ID,0) FROM C_BPartner_Location WHERE C_BPartner_Location_ID=?"; + m_C_SalesRegion_ID = DB.getSQLValue (null, + sql, getC_BPartner_Location_ID()); + log.fine("C_SalesRegion_ID=" + m_C_SalesRegion_ID + " (from BPL)" ); + if (m_C_SalesRegion_ID == 0) + m_C_SalesRegion_ID = -2; // don't try again + } + else + m_C_SalesRegion_ID = -2; // don't try again + } + if (m_C_SalesRegion_ID < 0) // invalid + return 0; + return m_C_SalesRegion_ID; + } // getC_SalesRegion_ID + + /** + * Get Project + * @return C_Project_ID + */ + public int getC_Project_ID() + { + int index = p_po.get_ColumnIndex("C_Project_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_Project_ID + + /** + * Get Campaign + * @return C_Campaign_ID + */ + public int getC_Campaign_ID() + { + int index = p_po.get_ColumnIndex("C_Campaign_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_Campaign_ID + + /** + * Get Activity + * @return C_Activity_ID + */ + public int getC_Activity_ID() + { + int index = p_po.get_ColumnIndex("C_Activity_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getC_Activity_ID + + /** + * Get User 1 + * @return user defined 1 + */ + public int getUser1_ID() + { + int index = p_po.get_ColumnIndex("User1_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getUser1_ID + + /** + * Get User 2 + * @return user defined 2 + */ + public int getUser2_ID() + { + int index = p_po.get_ColumnIndex("User2_ID"); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getUser2_ID + + /** + * Get User Defined Column + * @param ColumnName column name + * @return user defined column value + */ + public int getValue(String ColumnName) + { + int index = p_po.get_ColumnIndex(ColumnName); + if (index != -1) + { + Integer ii = (Integer)p_po.get_Value(index); + if (ii != null) + return ii.intValue(); + } + return 0; + } // getValue + + /** + * String representation + * @return String + */ + public String toString() + { + StringBuffer sb = new StringBuffer("DocLine=["); + sb.append(p_po.get_ID()); + if (getDescription() != null) + sb.append(",").append(getDescription()); + if (getM_Product_ID() != 0) + sb.append(",M_Product_ID=").append(getM_Product_ID()); + sb.append(",Qty=").append(m_qty) + .append(",Amt=").append(getAmtSource()) + .append("]"); + return sb.toString(); + } // toString + +} // DocumentLine diff --git a/base/src/org/compiere/acct/DocLine_Allocation.java b/base/src/org/compiere/acct/DocLine_Allocation.java new file mode 100644 index 0000000000..3005fb2c2f --- /dev/null +++ b/base/src/org/compiere/acct/DocLine_Allocation.java @@ -0,0 +1,142 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Allocation Line + * + * @author Jorg Janke + * @version $Id: DocLine_Allocation.java,v 1.2 2006/07/30 00:53:33 jjanke Exp $ + */ +public class DocLine_Allocation extends DocLine +{ + /** + * DocLine_Allocation + * @param line allocation line + * @param doc header + */ + public DocLine_Allocation (MAllocationLine line, Doc doc) + { + super (line, doc); + m_C_Payment_ID = line.getC_Payment_ID(); + m_C_CashLine_ID = line.getC_CashLine_ID(); + m_C_Invoice_ID = line.getC_Invoice_ID(); + m_C_Order_ID = line.getC_Order_ID(); + // + setAmount(line.getAmount()); + m_DiscountAmt = line.getDiscountAmt(); + m_WriteOffAmt = line.getWriteOffAmt(); + m_OverUnderAmt = line.getOverUnderAmt(); + } // DocLine_Allocation + + private int m_C_Invoice_ID; + private int m_C_Payment_ID; + private int m_C_CashLine_ID; + private int m_C_Order_ID; + private BigDecimal m_DiscountAmt; + private BigDecimal m_WriteOffAmt; + private BigDecimal m_OverUnderAmt; + + + /** + * Get Invoice C_Currency_ID + * @return 0 if no invoice -1 if not found + */ + public int getInvoiceC_Currency_ID() + { + if (m_C_Invoice_ID == 0) + return 0; + String sql = "SELECT C_Currency_ID " + + "FROM C_Invoice " + + "WHERE C_Invoice_ID=?"; + return DB.getSQLValue(null, sql, m_C_Invoice_ID); + } // getInvoiceC_Currency_ID + + /** + * String Representation + * @return info + */ + public String toString () + { + StringBuffer sb = new StringBuffer ("DocLine_Allocation["); + sb.append(get_ID()) + .append(",Amt=").append(getAmtSource()) + .append(",Discount=").append(getDiscountAmt()) + .append(",WriteOff=").append(getWriteOffAmt()) + .append(",OverUnderAmt=").append(getOverUnderAmt()) + .append(" - C_Payment_ID=").append(m_C_Payment_ID) + .append(",C_CashLine_ID=").append(m_C_CashLine_ID) + .append(",C_Invoice_ID=").append(m_C_Invoice_ID) + .append("]"); + return sb.toString (); + } // toString + + + /** + * @return Returns the c_Order_ID. + */ + public int getC_Order_ID () + { + return m_C_Order_ID; + } + /** + * @return Returns the discountAmt. + */ + public BigDecimal getDiscountAmt () + { + return m_DiscountAmt; + } + /** + * @return Returns the overUnderAmt. + */ + public BigDecimal getOverUnderAmt () + { + return m_OverUnderAmt; + } + /** + * @return Returns the writeOffAmt. + */ + public BigDecimal getWriteOffAmt () + { + return m_WriteOffAmt; + } + /** + * @return Returns the c_CashLine_ID. + */ + public int getC_CashLine_ID () + { + return m_C_CashLine_ID; + } + /** + * @return Returns the c_Invoice_ID. + */ + public int getC_Invoice_ID () + { + return m_C_Invoice_ID; + } + /** + * @return Returns the c_Payment_ID. + */ + public int getC_Payment_ID () + { + return m_C_Payment_ID; + } +} // DocLine_Allocation diff --git a/base/src/org/compiere/acct/DocLine_Bank.java b/base/src/org/compiere/acct/DocLine_Bank.java new file mode 100644 index 0000000000..112a24997b --- /dev/null +++ b/base/src/org/compiere/acct/DocLine_Bank.java @@ -0,0 +1,122 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import org.compiere.model.*; +import org.compiere.util.*; +//import org.compiere.model.*; + +/** + * Bank Statement Line + * + * @author Jorg Janke + * @version $Id: DocLine_Bank.java,v 1.2 2006/07/30 00:53:33 jjanke Exp $ + */ +public class DocLine_Bank extends DocLine +{ + /** + * Constructor + * @param line statement line + * @param doc header + */ + public DocLine_Bank (MBankStatementLine line, Doc_Bank doc) + { + super (line, doc); + m_C_Payment_ID = line.getC_Payment_ID(); + m_IsReversal = line.isReversal(); + // + m_StmtAmt = line.getStmtAmt(); + m_InterestAmt = line.getInterestAmt(); + m_TrxAmt = line.getTrxAmt(); + // + setDateDoc(line.getValutaDate()); + setC_BPartner_ID(line.getC_BPartner_ID()); + } // DocLine_Bank + + /** Reversal Flag */ + private boolean m_IsReversal = false; + /** Payment */ + private int m_C_Payment_ID = 0; + + private BigDecimal m_TrxAmt = Env.ZERO; + private BigDecimal m_StmtAmt = Env.ZERO; + private BigDecimal m_InterestAmt = Env.ZERO; + + /** + * Get Payment + * @return C_Paymnet_ID + */ + public int getC_Payment_ID() + { + return m_C_Payment_ID; + } // getC_Payment_ID + + /** + * Get AD_Org_ID + * @param payment if true get Org from payment + * @return org + */ + public int getAD_Org_ID (boolean payment) + { + if (payment && getC_Payment_ID() != 0) + { + String sql = "SELECT AD_Org_ID FROM C_Payment WHERE C_Payment_ID=?"; + int id = DB.getSQLValue(null, sql, getC_Payment_ID()); + if (id > 0) + return id; + } + return super.getAD_Org_ID(); + } // getAD_Org_ID + + /** + * Is Reversal + * @return true if reversal + */ + public boolean isReversal() + { + return m_IsReversal; + } // isReversal + + /** + * Get Interest + * @return InterestAmount + */ + public BigDecimal getInterestAmt() + { + return m_InterestAmt; + } // getInterestAmt + + /** + * Get Statement + * @return Starement Amount + */ + public BigDecimal getStmtAmt() + { + return m_StmtAmt; + } // getStrmtAmt + + /** + * Get Transaction + * @return transaction amount + */ + public BigDecimal getTrxAmt() + { + return m_TrxAmt; + } // getTrxAmt + +} // DocLine_Bank diff --git a/base/src/org/compiere/acct/DocLine_Cash.java b/base/src/org/compiere/acct/DocLine_Cash.java new file mode 100644 index 0000000000..d25c260d48 --- /dev/null +++ b/base/src/org/compiere/acct/DocLine_Cash.java @@ -0,0 +1,138 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; + +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Cash Journal Line + * + * @author Jorg Janke + * @version $Id: DocLine_Cash.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class DocLine_Cash extends DocLine +{ + /** + * Constructor + * @param line cash line + * @param doc header + */ + public DocLine_Cash (MCashLine line, Doc_Cash doc) + { + super (line, doc); + m_CashType = line.getCashType(); + m_C_BankAccount_ID = line.getC_BankAccount_ID(); + m_C_Invoice_ID = line.getC_Invoice_ID(); + // + if (m_C_Invoice_ID != 0) + { + MInvoice invoice = MInvoice.get(line.getCtx(), m_C_Invoice_ID); + setC_BPartner_ID(invoice.getC_BPartner_ID()); + } + + // + m_Amount = line.getAmount(); + m_DiscountAmt = line.getDiscountAmt(); + m_WriteOffAmt = line.getWriteOffAmt(); + setAmount(m_Amount); + + + } // DocLine_Cash + + /** Cash Type */ + private String m_CashType = ""; + + // AD_Reference_ID=217 + /** Charge - C */ + public static final String CASHTYPE_CHARGE = "C"; + /** Difference - D */ + public static final String CASHTYPE_DIFFERENCE = "D"; + /** Expense - E */ + public static final String CASHTYPE_EXPENSE = "E"; + /** Onvoice - I */ + public static final String CASHTYPE_INVOICE = "I"; + /** Receipt - R */ + public static final String CASHTYPE_RECEIPT = "R"; + /** Transfer - T */ + public static final String CASHTYPE_TRANSFER = "T"; + + // References + private int m_C_BankAccount_ID = 0; + private int m_C_Invoice_ID = 0; + + // Amounts + private BigDecimal m_Amount = Env.ZERO; + private BigDecimal m_DiscountAmt = Env.ZERO; + private BigDecimal m_WriteOffAmt = Env.ZERO; + + + /** + * Get Cash Type + * @return cash type + */ + public String getCashType() + { + return m_CashType; + } // getCashType + + /** + * Get Bank Account + * @return Bank Account + */ + public int getC_BankAccount_ID() + { + return m_C_BankAccount_ID; + } // getC_BankAccount_ID + + /** + * Get Invoice + * @return C_Invoice_ID + */ + public int getC_Invoice_ID() + { + return m_C_Invoice_ID; + } // getC_Invoice_ID + + /** + * Get Amount + * @return Payment Amount + */ + public BigDecimal getAmount() + { + return m_Amount; + } + /** + * Get Discount + * @return Discount Amount + */ + public BigDecimal getDiscountAmt() + { + return m_DiscountAmt; + } + /** + * Get WriteOff + * @return Write-Off Amount + */ + public BigDecimal getWriteOffAmt() + { + return m_WriteOffAmt; + } + +} // DocLine_Cash diff --git a/base/src/org/compiere/acct/DocTax.java b/base/src/org/compiere/acct/DocTax.java new file mode 100644 index 0000000000..3a3725f325 --- /dev/null +++ b/base/src/org/compiere/acct/DocTax.java @@ -0,0 +1,240 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import org.compiere.model.*; +import java.util.logging.*; +import org.compiere.util.*; + +/** + * Document Tax Line + * + * @author Jorg Janke + * @version $Id: DocTax.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public final class DocTax +{ + /** + * Create Tax + * @param C_Tax_ID tax + * @param name name + * @param rate rate + * @param taxBaseAmt tax base amount + * @param amount amount + * @param salesTax sales tax flag + */ + public DocTax (int C_Tax_ID, String name, BigDecimal rate, + BigDecimal taxBaseAmt, BigDecimal amount, boolean salesTax) + { + m_C_Tax_ID = C_Tax_ID; + m_name = name; + m_rate = rate; + m_amount = amount; + m_salesTax = salesTax; + } // DocTax + + /** Tax ID */ + private int m_C_Tax_ID = 0; + /** Amount */ + private BigDecimal m_amount = null; + /** Tax Rate */ + private BigDecimal m_rate = null; + /** Name */ + private String m_name = null; + /** Base Tax Amt */ + private BigDecimal m_taxBaseAmt = null; + /** Included Tax */ + private BigDecimal m_includedTax = Env.ZERO; + /** Sales Tax */ + private boolean m_salesTax = false; + + /** Logger */ + private static CLogger log = CLogger.getCLogger(DocTax.class); + + + /** Tax Due Acct */ + public static final int ACCTTYPE_TaxDue = 0; + /** Tax Liability */ + public static final int ACCTTYPE_TaxLiability = 1; + /** Tax Credit */ + public static final int ACCTTYPE_TaxCredit = 2; + /** Tax Receivables */ + public static final int ACCTTYPE_TaxReceivables = 3; + /** Tax Expense */ + public static final int ACCTTYPE_TaxExpense = 4; + + /** + * Get Account + * @param AcctType see ACCTTYPE_* + * @param as account schema + * @return Account + */ + public MAccount getAccount (int AcctType, MAcctSchema as) + { + if (AcctType < 0 || AcctType > 4) + return null; + // + String sql = "SELECT T_Due_Acct, T_Liability_Acct, T_Credit_Acct, T_Receivables_Acct, T_Expense_Acct " + + "FROM C_Tax_Acct WHERE C_Tax_ID=? AND C_AcctSchema_ID=?"; + int validCombination_ID = 0; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, m_C_Tax_ID); + pstmt.setInt(2, as.getC_AcctSchema_ID()); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + validCombination_ID = rs.getInt(AcctType+1); // 1..5 + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + if (validCombination_ID == 0) + return null; + return MAccount.get(as.getCtx(), validCombination_ID); + } // getAccount + + /** + * Get Amount + * @return gross amount + */ + public BigDecimal getAmount() + { + return m_amount; + } + + /** + * Get Base Amount + * @return net amount + */ + public BigDecimal getTaxBaseAmt() + { + return m_taxBaseAmt; + } + + /** + * Get Rate + * @return tax rate in percent + */ + public BigDecimal getRate() + { + return m_rate; + } + + /** + * Get Name of Tax + * @return name + */ + public String getName() + { + return m_name; + } + + /** + * Get C_Tax_ID + * @return tax id + */ + public int getC_Tax_ID() + { + return m_C_Tax_ID; + } // getC_Tax_ID + + /** + * Get Description (Tax Name and Base Amount) + * @return tax anme and base amount + */ + public String getDescription() + { + return m_name + " " + m_taxBaseAmt.toString(); + } // getDescription + + /** + * Add to Included Tax + * @param amt amount + */ + public void addIncludedTax (BigDecimal amt) + { + m_includedTax = m_includedTax.add(amt); + } // addIncludedTax + + /** + * Get Included Tax + * @return tax amount + */ + public BigDecimal getIncludedTax() + { + return m_includedTax; + } // getIncludedTax + + /** + * Get Included Tax Difference + * @return tax ampunt - included amount + */ + public BigDecimal getIncludedTaxDifference() + { + return m_amount.subtract(m_includedTax); + } // getIncludedTaxDifference + + /** + * Included Tax differs from tax amount + * @return true if difference + */ + public boolean isIncludedTaxDifference() + { + return Env.ZERO.compareTo(getIncludedTaxDifference()) != 0; + } // isIncludedTaxDifference + + /** + * Get AP Tax Type + * @return AP tax type (Credit or Expense) + */ + public int getAPTaxType() + { + if (isSalesTax()) + return ACCTTYPE_TaxExpense; + return ACCTTYPE_TaxCredit; + } // getAPTaxAcctType + + /** + * Is Sales Tax + * @return sales tax + */ + public boolean isSalesTax() + { + return m_salesTax; + } // isSalesTax + + + /** + * Return String representation + * @return tax anme and base amount + */ + public String toString() + { + StringBuffer sb = new StringBuffer("Tax=("); + sb.append(m_name); + sb.append(" Amt=").append(m_amount); + sb.append(")"); + return sb.toString(); + } // toString + +} // DocTax diff --git a/base/src/org/compiere/acct/Doc_Allocation.java b/base/src/org/compiere/acct/Doc_Allocation.java new file mode 100644 index 0000000000..94e8fb3a42 --- /dev/null +++ b/base/src/org/compiere/acct/Doc_Allocation.java @@ -0,0 +1,895 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.logging.*; +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Post Allocation Documents. + *
+ *  Table:              C_AllocationHdr
+ *  Document Types:     CMA
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_Allocation.java,v 1.6 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_Allocation extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + protected Doc_Allocation (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super (ass, MAllocationHdr.class, rs, DOCTYPE_Allocation, trxName); + } // Doc_Allocation + + /** Tolearance G&L */ + private static final BigDecimal TOLERANCE = new BigDecimal (0.02); + /** Facts */ + private ArrayList m_facts = null; + + + /** + * Load Specific Document Details + * @return error message or null + */ + protected String loadDocumentDetails () + { + MAllocationHdr alloc = (MAllocationHdr)getPO(); + setDateDoc(alloc.getDateTrx()); + // Contained Objects + p_lines = loadLines(alloc); + return null; + } // loadDocumentDetails + + /** + * Load Invoice Line + * @param alloc header + * @return DocLine Array + */ + private DocLine[] loadLines(MAllocationHdr alloc) + { + ArrayList list = new ArrayList(); + MAllocationLine[] lines = alloc.getLines(false); + for (int i = 0; i < lines.length; i++) + { + MAllocationLine line = lines[i]; + DocLine_Allocation docLine = new DocLine_Allocation(line, this); + + // Get Payment Conversion Rate + if (line.getC_Payment_ID() != 0) + { + MPayment payment = new MPayment (getCtx(), line.getC_Payment_ID(), getTrxName()); + int C_ConversionType_ID = payment.getC_ConversionType_ID(); + docLine.setC_ConversionType_ID(C_ConversionType_ID); + } + // + log.fine(docLine.toString()); + list.add (docLine); + } + + // Return Array + DocLine[] dls = new DocLine[list.size()]; + list.toArray(dls); + return dls; + } // loadLines + + + /************************************************************************** + * Get Source Currency Balance - subtracts line and tax amounts from total - no rounding + * @return positive amount, if total invoice is bigger than lines + */ + public BigDecimal getBalance() + { + BigDecimal retValue = Env.ZERO; + return retValue; + } // getBalance + + /** + * Create Facts (the accounting logic) for + * CMA. + *
+	 *  AR_Invoice_Payment
+	 *      UnAllocatedCash DR
+	 *      or C_Prepayment
+	 *      DiscountExp     DR
+	 *      WriteOff        DR
+	 *      Receivables             CR
+	 *  AR_Invoice_Cash
+	 *      CashTransfer    DR
+	 *      DiscountExp     DR
+	 *      WriteOff        DR
+	 *      Receivables             CR
+	 * 
+	 *  AP_Invoice_Payment
+	 *      Liability       DR
+	 *      DiscountRev             CR
+	 *      WriteOff                CR
+	 *      PaymentSelect           CR
+	 *      or V_Prepayment
+	 *  AP_Invoice_Cash
+	 *      Liability       DR
+	 *      DiscountRev             CR
+	 *      WriteOff                CR
+	 *      CashTransfer            CR
+	 *  CashBankTransfer
+	 *      -
+	 *  ==============================
+	 *  Realized Gain & Loss
+	 * 		AR/AP			DR		CR
+	 * 		Realized G/L	DR		CR
+	 * 
+	 *
+	 *  
+ * Tax needs to be corrected for discount & write-off; + * Currency gain & loss is realized here. + * @param as accounting schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + m_facts = new ArrayList(); + + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + + for (int i = 0; i < p_lines.length; i++) + { + DocLine_Allocation line = (DocLine_Allocation)p_lines[i]; + setC_BPartner_ID(line.getC_BPartner_ID()); + + // CashBankTransfer - all references null and Discount/WriteOff = 0 + if (line.getC_Payment_ID() != 0 + && line.getC_Invoice_ID() == 0 && line.getC_Order_ID() == 0 + && line.getC_CashLine_ID() == 0 && line.getC_BPartner_ID() == 0 + && Env.ZERO.compareTo(line.getDiscountAmt()) == 0 + && Env.ZERO.compareTo(line.getWriteOffAmt()) == 0) + continue; + + // Receivables/Liability Amt + BigDecimal allocationSource = line.getAmtSource() + .add(line.getDiscountAmt()) + .add(line.getWriteOffAmt()); + //Modified Lines by Armen + //Old: + //BigDecimal allocationAccounted = null; // AR/AP balance corrected + BigDecimal allocationAccounted = Env.ZERO; // AR/AP balance corrected + //End of Modified Lines + + FactLine fl = null; + MAccount bpAcct = null; // Liability/Receivables + // + MPayment payment = null; + if (line.getC_Payment_ID() != 0) + payment = new MPayment (getCtx(), line.getC_Payment_ID(), getTrxName()); + MInvoice invoice = null; + if (line.getC_Invoice_ID() != 0) + invoice = new MInvoice (getCtx(), line.getC_Invoice_ID(), null); + + // No Invoice + if (invoice == null) + { + // Payment Only + if (line.getC_Invoice_ID() == 0 && line.getC_Payment_ID() != 0) + { + fl = fact.createLine (line, getPaymentAcct(as, line.getC_Payment_ID()), + getC_Currency_ID(), line.getAmtSource(), null); + if (fl != null && payment != null) + fl.setAD_Org_ID(payment.getAD_Org_ID()); + } + else + { + p_Error = "Cannot determine SO/PO"; + log.log(Level.SEVERE, p_Error); + return null; + } + } + // Sales Invoice + else if (invoice.isSOTrx()) + { + // Payment/Cash DR + if (line.getC_Payment_ID() != 0) + { + fl = fact.createLine (line, getPaymentAcct(as, line.getC_Payment_ID()), + getC_Currency_ID(), line.getAmtSource(), null); + if (fl != null && payment != null) + fl.setAD_Org_ID(payment.getAD_Org_ID()); + } + else if (line.getC_CashLine_ID() != 0) + { + fl = fact.createLine (line, getCashAcct(as, line.getC_CashLine_ID()), + getC_Currency_ID(), line.getAmtSource(), null); + MCashLine cashLine = new MCashLine (getCtx(), line.getC_CashLine_ID(), getTrxName()); + if (fl != null && cashLine.get_ID() != 0) + fl.setAD_Org_ID(cashLine.getAD_Org_ID()); + } + // Discount DR + if (Env.ZERO.compareTo(line.getDiscountAmt()) != 0) + { + fl = fact.createLine (line, getAccount(Doc.ACCTTYPE_DiscountExp, as), + getC_Currency_ID(), line.getDiscountAmt(), null); + if (fl != null && payment != null) + fl.setAD_Org_ID(payment.getAD_Org_ID()); + } + // Write off DR + if (Env.ZERO.compareTo(line.getWriteOffAmt()) != 0) + { + fl = fact.createLine (line, getAccount(Doc.ACCTTYPE_WriteOff, as), + getC_Currency_ID(), line.getWriteOffAmt(), null); + if (fl != null && payment != null) + fl.setAD_Org_ID(payment.getAD_Org_ID()); + } + + // AR Invoice Amount CR + if (as.isAccrual()) + { + bpAcct = getAccount(Doc.ACCTTYPE_C_Receivable, as); + fl = fact.createLine (line, bpAcct, + getC_Currency_ID(), null, allocationSource); // payment currency + if (fl != null) + allocationAccounted = fl.getAcctBalance().negate(); + if (fl != null && invoice != null) + fl.setAD_Org_ID(invoice.getAD_Org_ID()); + } + else // Cash Based + { + allocationAccounted = createCashBasedAcct (as, fact, + invoice, allocationSource); + } + } + // Purchase Invoice + else + { + allocationSource = allocationSource.negate(); // allocation is negative + // AP Invoice Amount DR + if (as.isAccrual()) + { + bpAcct = getAccount(Doc.ACCTTYPE_V_Liability, as); + fl = fact.createLine (line, bpAcct, + getC_Currency_ID(), allocationSource, null); // payment currency + if (fl != null) + allocationAccounted = fl.getAcctBalance(); + if (fl != null && invoice != null) + fl.setAD_Org_ID(invoice.getAD_Org_ID()); + } + else // Cash Based + { + allocationAccounted = createCashBasedAcct (as, fact, + invoice, allocationSource); + } + + // Discount CR + if (Env.ZERO.compareTo(line.getDiscountAmt()) != 0) + { + fl = fact.createLine (line, getAccount(Doc.ACCTTYPE_DiscountRev, as), + getC_Currency_ID(), null, line.getDiscountAmt().negate()); + if (fl != null && payment != null) + fl.setAD_Org_ID(payment.getAD_Org_ID()); + } + // Write off CR + if (Env.ZERO.compareTo(line.getWriteOffAmt()) != 0) + { + fl = fact.createLine (line, getAccount(Doc.ACCTTYPE_WriteOff, as), + getC_Currency_ID(), null, line.getWriteOffAmt().negate()); + if (fl != null && payment != null) + fl.setAD_Org_ID(payment.getAD_Org_ID()); + } + // Payment/Cash CR + if (line.getC_Payment_ID() != 0) + { + fl = fact.createLine (line, getPaymentAcct(as, line.getC_Payment_ID()), + getC_Currency_ID(), null, line.getAmtSource().negate()); + if (fl != null && payment != null) + fl.setAD_Org_ID(payment.getAD_Org_ID()); + } + else if (line.getC_CashLine_ID() != 0) + { + fl = fact.createLine (line, getCashAcct(as, line.getC_CashLine_ID()), + getC_Currency_ID(), null, line.getAmtSource().negate()); + MCashLine cashLine = new MCashLine (getCtx(), line.getC_CashLine_ID(), getTrxName()); + if (fl != null && cashLine.get_ID() != 0) + fl.setAD_Org_ID(cashLine.getAD_Org_ID()); + } + } + + // VAT Tax Correction + if (invoice != null && as.isTaxCorrection()) + { + BigDecimal taxCorrectionAmt = Env.ZERO; + if (as.isTaxCorrectionDiscount()) + taxCorrectionAmt = line.getDiscountAmt(); + if (as.isTaxCorrectionWriteOff()) + taxCorrectionAmt = taxCorrectionAmt.add(line.getWriteOffAmt()); + // + if (taxCorrectionAmt.signum() != 0) + { + if (!createTaxCorrection(as, fact, line, + getAccount(invoice.isSOTrx() ? Doc.ACCTTYPE_DiscountExp : Doc.ACCTTYPE_DiscountRev, as), + getAccount(Doc.ACCTTYPE_WriteOff, as))) + { + p_Error = "Cannot create Tax correction"; + return null; + } + } + } + + // Realized Gain & Loss + if (invoice != null + && (getC_Currency_ID() != as.getC_Currency_ID() // payment allocation in foreign currency + || getC_Currency_ID() != line.getInvoiceC_Currency_ID())) // allocation <> invoice currency + { + p_Error = createRealizedGainLoss (as, fact, bpAcct, invoice, + allocationSource, allocationAccounted); + if (p_Error != null) + return null; + } + + } // for all lines + + // reset line info + setC_BPartner_ID(0); + // + m_facts.add(fact); + return m_facts; + } // createFact + + /** + * Create Cash Based Acct + * @param as accounting schema + * @param fact fact + * @param invoice invoice + * @param allocationSource allocation amount (incl discount, writeoff) + * @return Accounted Amt + */ + private BigDecimal createCashBasedAcct (MAcctSchema as, Fact fact, MInvoice invoice, + BigDecimal allocationSource) + { + BigDecimal allocationAccounted = Env.ZERO; + // Multiplier + double percent = invoice.getGrandTotal().doubleValue() / allocationSource.doubleValue(); + if (percent > 0.99 && percent < 1.01) + percent = 1.0; + log.config("Multiplier=" + percent + " - GrandTotal=" + invoice.getGrandTotal() + + " - Allocation Source=" + allocationSource); + + // Get Invoice Postings + Doc_Invoice docInvoice = (Doc_Invoice)Doc.get(new MAcctSchema[]{as}, + MInvoice.Table_ID, invoice.getC_Invoice_ID(), getTrxName()); + docInvoice.loadDocumentDetails(); + allocationAccounted = docInvoice.createFactCash(as, fact, new BigDecimal(percent)); + log.config("Allocation Accounted=" + allocationAccounted); + + // Cash Based Commitment Release + if (as.isCreateCommitment() && !invoice.isSOTrx()) + { + MInvoiceLine[] lines = invoice.getLines(); + for (int i = 0; i < lines.length; i++) + { + Fact factC = Doc_Order.getCommitmentRelease(as, this, + lines[i].getQtyInvoiced(), lines[i].getC_InvoiceLine_ID(), new BigDecimal(percent)); + if (factC == null) + return null; + m_facts.add(factC); + } + } // Commitment + + return allocationAccounted; + } // createCashBasedAcct + + + /** + * Get Payment (Unallocated Payment or Payment Selection) Acct of Bank Account + * @param as accounting schema + * @param C_Payment_ID payment + * @return acct + */ + private MAccount getPaymentAcct (MAcctSchema as, int C_Payment_ID) + { + setC_BankAccount_ID(0); + // Doc.ACCTTYPE_UnallocatedCash (AR) or C_Prepayment + // or Doc.ACCTTYPE_PaymentSelect (AP) or V_Prepayment + int accountType = Doc.ACCTTYPE_UnallocatedCash; + // + String sql = "SELECT p.C_BankAccount_ID, d.DocBaseType, p.IsReceipt, p.IsPrepayment " + + "FROM C_Payment p INNER JOIN C_DocType d ON (p.C_DocType_ID=d.C_DocType_ID) " + + "WHERE C_Payment_ID=?"; + PreparedStatement pstmt = null; + try + { + pstmt = DB.prepareStatement (sql, getTrxName()); + pstmt.setInt (1, C_Payment_ID); + ResultSet rs = pstmt.executeQuery (); + if (rs.next ()) + { + setC_BankAccount_ID(rs.getInt(1)); + if (DOCTYPE_APPayment.equals(rs.getString(2))) + accountType = Doc.ACCTTYPE_PaymentSelect; + // Prepayment + if ("Y".equals(rs.getString(4))) // Prepayment + { + if ("Y".equals(rs.getString(3))) // Receipt + accountType = Doc.ACCTTYPE_C_Prepayment; + else + accountType = Doc.ACCTTYPE_V_Prepayment; + } + } + rs.close (); + pstmt.close (); + pstmt = null; + } + catch (Exception e) + { + log.log(Level.SEVERE, sql, e); + } + try + { + if (pstmt != null) + pstmt.close (); + pstmt = null; + } + catch (Exception e) + { + pstmt = null; + } + + // + if (getC_BankAccount_ID() <= 0) + { + log.log(Level.SEVERE, "NONE for C_Payment_ID=" + C_Payment_ID); + return null; + } + return getAccount (accountType, as); + } // getPaymentAcct + + /** + * Get Cash (Transfer) Acct of CashBook + * @param as accounting schema + * @param C_CashLine_ID + * @return acct + */ + private MAccount getCashAcct (MAcctSchema as, int C_CashLine_ID) + { + String sql = "SELECT c.C_CashBook_ID " + + "FROM C_Cash c, C_CashLine cl " + + "WHERE c.C_Cash_ID=cl.C_Cash_ID AND cl.C_CashLine_ID=?"; + setC_CashBook_ID(DB.getSQLValue(null, sql, C_CashLine_ID)); + if (getC_CashBook_ID() <= 0) + { + log.log(Level.SEVERE, "NONE for C_CashLine_ID=" + C_CashLine_ID); + return null; + } + return getAccount(Doc.ACCTTYPE_CashTransfer, as); + } // getCashAcct + + + /************************************************************************** + * Create Realized Gain & Loss. + * Compares the Accounted Amount of the Invoice to the + * Accounted Amount of the Allocation + * @param as accounting schema + * @param fact fact + * @param acct account + * @param invoice invoice + * @param allocationSource source amt + * @param allocationAccounted acct amt + * @return Error Message or null if OK + */ + private String createRealizedGainLoss (MAcctSchema as, Fact fact, MAccount acct, + MInvoice invoice, BigDecimal allocationSource, BigDecimal allocationAccounted) + { + BigDecimal invoiceSource = null; + BigDecimal invoiceAccounted = null; + // + String sql = "SELECT " + + (invoice.isSOTrx() + ? "SUM(AmtSourceDr), SUM(AmtAcctDr)" // so + : "SUM(AmtSourceCr), SUM(AmtAcctCr)") // po + + " FROM Fact_Acct " + + "WHERE AD_Table_ID=318 AND Record_ID=?" // Invoice + + " AND C_AcctSchema_ID=?" + + " AND PostingType='A'"; + //AND C_Currency_ID=102 + PreparedStatement pstmt = null; + try + { + pstmt = DB.prepareStatement(sql, getTrxName()); + pstmt.setInt(1, invoice.getC_Invoice_ID()); + pstmt.setInt(2, as.getC_AcctSchema_ID()); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + invoiceSource = rs.getBigDecimal(1); + invoiceAccounted = rs.getBigDecimal(2); + } + rs.close(); + pstmt.close(); + pstmt = null; + } + catch (Exception e) + { + log.log(Level.SEVERE, sql, e); + } + try + { + if (pstmt != null) + pstmt.close(); + pstmt = null; + } + catch (Exception e) + { + pstmt = null; + } + // Requires that Invoice is Posted + if (invoiceSource == null || invoiceAccounted == null) + return "Gain/Loss - Invoice not posted yet"; + // + String description = "Invoice=(" + invoice.getC_Currency_ID() + ")" + invoiceSource + "/" + invoiceAccounted + + " - Allocation=(" + getC_Currency_ID() + ")" + allocationSource + "/" + allocationAccounted; + log.fine(description); + // Allocation not Invoice Currency + if (getC_Currency_ID() != invoice.getC_Currency_ID()) + { + BigDecimal allocationSourceNew = MConversionRate.convert(getCtx(), + allocationSource, getC_Currency_ID(), + invoice.getC_Currency_ID(), getDateAcct(), + invoice.getC_ConversionType_ID(), invoice.getAD_Client_ID(), invoice.getAD_Org_ID()); + if (allocationSourceNew == null) + return "Gain/Loss - No Conversion from Allocation->Invoice"; + String d2 = "Allocation=(" + getC_Currency_ID() + ")" + allocationSource + + "->(" + invoice.getC_Currency_ID() + ")" + allocationSourceNew; + log.fine(d2); + description += " - " + d2; + allocationSource = allocationSourceNew; + } + + BigDecimal acctDifference = null; // gain is negative + // Full Payment in currency + if (allocationSource.compareTo(invoiceSource) == 0) + { + acctDifference = invoiceAccounted.subtract(allocationAccounted); // gain is negative + String d2 = "(full) = " + acctDifference; + log.fine(d2); + description += " - " + d2; + } + else // partial or MC + { + // percent of total payment + double multiplier = allocationSource.doubleValue() / invoiceSource.doubleValue(); + // Reduce Orig Invoice Accounted + invoiceAccounted = invoiceAccounted.multiply(new BigDecimal(multiplier)); + // Difference based on percentage of Orig Invoice + acctDifference = invoiceAccounted.subtract(allocationAccounted); // gain is negative + // ignore Tolerance + if (acctDifference.abs().compareTo(TOLERANCE) < 0) + acctDifference = Env.ZERO; + // Round + int precision = as.getStdPrecision(); + if (acctDifference.scale() > precision) + acctDifference = acctDifference.setScale(precision, BigDecimal.ROUND_HALF_UP); + String d2 = "(partial) = " + acctDifference + " - Multiplier=" + multiplier; + log.fine(d2); + description += " - " + d2; + } + + if (acctDifference.signum() == 0) + { + log.fine("No Difference"); + return null; + } + + MAccount gain = MAccount.get (as.getCtx(), as.getAcctSchemaDefault().getRealizedGain_Acct()); + MAccount loss = MAccount.get (as.getCtx(), as.getAcctSchemaDefault().getRealizedLoss_Acct()); + // + if (invoice.isSOTrx()) + { + FactLine fl = fact.createLine (null, loss, gain, + as.getC_Currency_ID(), acctDifference); + fl.setDescription(description); + fact.createLine (null, acct, + as.getC_Currency_ID(), acctDifference.negate()); + fl.setDescription(description); + } + else + { + fact.createLine (null, acct, + as.getC_Currency_ID(), acctDifference); + FactLine fl = fact.createLine (null, loss, gain, + as.getC_Currency_ID(), acctDifference.negate()); + } + return null; + } // createRealizedGainLoss + + + /************************************************************************** + * Create Tax Correction. + * Requirement: Adjust the tax amount, if you did not receive the full + * amount of the invoice (payment discount, write-off). + * Applies to many countries with VAT. + * Example: + * Invoice: Net $100 + Tax1 $15 + Tax2 $5 = Total $120 + * Payment: $115 (i.e. $5 underpayment) + * Tax Adjustment = Tax1 = 0.63 (15/120*5) Tax2 = 0.21 (5/120/5) + * + * @param as accounting schema + * @param fact fact + * @param line Allocation line + * @param DiscountAccount discount acct + * @param WriteOffAccoint write off acct + * @return true if created + */ + private boolean createTaxCorrection (MAcctSchema as, Fact fact, + DocLine_Allocation line, + MAccount DiscountAccount, MAccount WriteOffAccoint) + { + log.info (line.toString()); + BigDecimal discount = Env.ZERO; + if (as.isTaxCorrectionDiscount()) + discount = line.getDiscountAmt(); + BigDecimal writeOff = Env.ZERO; + if (as.isTaxCorrectionWriteOff()) + writeOff = line.getWriteOffAmt(); + + Doc_AllocationTax tax = new Doc_AllocationTax ( + DiscountAccount, discount, WriteOffAccoint, writeOff); + + // Get Source Amounts with account + String sql = "SELECT * " + + "FROM Fact_Acct " + + "WHERE AD_Table_ID=318 AND Record_ID=?" // Invoice + + " AND C_AcctSchema_ID=?" + + " AND Line_ID IS NULL"; // header lines like tax or total + PreparedStatement pstmt = null; + try + { + pstmt = DB.prepareStatement(sql, getTrxName()); + pstmt.setInt(1, line.getC_Invoice_ID()); + pstmt.setInt(2, as.getC_AcctSchema_ID()); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) + tax.addInvoiceFact (new MFactAcct(getCtx(), rs, fact.get_TrxName())); + rs.close(); + pstmt.close(); + pstmt = null; + } + catch (Exception e) + { + log.log(Level.SEVERE, sql, e); + } + try + { + if (pstmt != null) + pstmt.close(); + pstmt = null; + } + catch (Exception e) + { + pstmt = null; + } + // Invoice Not posted + if (tax.getLineCount() == 0) + { + log.warning ("Invoice not posted yet - " + line); + return false; + } + // size = 1 if no tax + if (tax.getLineCount() < 2) + return true; + return tax.createEntries (as, fact, line); + + } // createTaxCorrection + +} // Doc_Allocation + +/** + * Allocation Document Tax Handing + * + * @author Jorg Janke + * @version $Id: Doc_Allocation.java,v 1.6 2006/07/30 00:53:33 jjanke Exp $ + */ +class Doc_AllocationTax +{ + /** + * Allocation Tax Adjustment + * @param DiscountAccount discount acct + * @param DiscountAmt discount amt + * @param WriteOffAccount write off acct + * @param WriteOffAmt write off amt + */ + public Doc_AllocationTax (MAccount DiscountAccount, BigDecimal DiscountAmt, + MAccount WriteOffAccount, BigDecimal WriteOffAmt) + { + m_DiscountAccount = DiscountAccount; + m_DiscountAmt = DiscountAmt; + m_WriteOffAccount = WriteOffAccount; + m_WriteOffAmt = WriteOffAmt; + } // Doc_AllocationTax + + private CLogger log = CLogger.getCLogger(getClass()); + + private MAccount m_DiscountAccount; + private BigDecimal m_DiscountAmt; + private MAccount m_WriteOffAccount; + private BigDecimal m_WriteOffAmt; + + private ArrayList m_facts = new ArrayList(); + private int m_totalIndex = 0; + + /** + * Add Invoice Fact Line + * @param fact fact line + */ + public void addInvoiceFact (MFactAcct fact) + { + m_facts.add(fact); + } // addInvoiceLine + + /** + * Get Line Count + * @return number of lines + */ + public int getLineCount() + { + return m_facts.size(); + } // getLineCount + + /** + * Create Accounting Entries + * @param as account schema + * @param fact fact to add lines + * @param line line + * @return true if created + */ + public boolean createEntries (MAcctSchema as, Fact fact, DocLine line) + { + // get total index (the Receivables/Liabilities line) + BigDecimal total = Env.ZERO; + for (int i = 0; i < m_facts.size(); i++) + { + MFactAcct factAcct = (MFactAcct)m_facts.get(i); + if (factAcct.getAmtSourceDr().compareTo(total) > 0) + { + total = factAcct.getAmtSourceDr(); + m_totalIndex = i; + } + if (factAcct.getAmtSourceCr().compareTo(total) > 0) + { + total = factAcct.getAmtSourceCr(); + m_totalIndex = i; + } + } + + MFactAcct factAcct = (MFactAcct)m_facts.get(m_totalIndex); + log.info ("Total Invoice = " + total + " - " + factAcct); + int precision = as.getStdPrecision(); + for (int i = 0; i < m_facts.size(); i++) + { + // No Tax Line + if (i == m_totalIndex) + continue; + + factAcct = (MFactAcct)m_facts.get(i); + log.info (i + ": " + factAcct); + + // Create Tax Account + MAccount taxAcct = factAcct.getMAccount(); + if (taxAcct == null || taxAcct.get_ID() == 0) + { + log.severe ("Tax Account not found/created"); + return false; + } + + + // Discount Amount + if (m_DiscountAmt.signum() != 0) + { + // Original Tax is DR - need to correct it CR + if (Env.ZERO.compareTo(factAcct.getAmtSourceDr()) != 0) + { + BigDecimal amount = calcAmount(factAcct.getAmtSourceDr(), + total, m_DiscountAmt, precision); + if (amount.signum() != 0) + { + fact.createLine (line, m_DiscountAccount, + as.getC_Currency_ID(), amount, null); + fact.createLine (line, taxAcct, + as.getC_Currency_ID(), null, amount); + } + } + // Original Tax is CR - need to correct it DR + else + { + BigDecimal amount = calcAmount(factAcct.getAmtSourceCr(), + total, m_DiscountAmt, precision); + if (amount.signum() != 0) + { + fact.createLine (line, taxAcct, + as.getC_Currency_ID(), amount, null); + fact.createLine (line, m_DiscountAccount, + as.getC_Currency_ID(), null, amount); + } + } + } // Discount + + // WriteOff Amount + if (m_WriteOffAmt.signum() != 0) + { + // Original Tax is DR - need to correct it CR + if (Env.ZERO.compareTo(factAcct.getAmtSourceDr()) != 0) + { + BigDecimal amount = calcAmount(factAcct.getAmtSourceDr(), + total, m_WriteOffAmt, precision); + if (amount.signum() != 0) + { + fact.createLine (line, m_WriteOffAccount, + as.getC_Currency_ID(), amount, null); + fact.createLine (line, taxAcct, + as.getC_Currency_ID(), null, amount); + } + } + // Original Tax is CR - need to correct it DR + else + { + BigDecimal amount = calcAmount(factAcct.getAmtSourceCr(), + total, m_WriteOffAmt, precision); + if (amount.signum() != 0) + { + fact.createLine (line, taxAcct, + as.getC_Currency_ID(), amount, null); + fact.createLine (line, m_WriteOffAccount, + as.getC_Currency_ID(), null, amount); + } + } + } // WriteOff + + } // for all lines + return true; + } // createEntries + + /** + * Calc Amount tax / (total-tax) * amt + * @param tax tax + * @param total total + * @param amt reduction amt + * @param precision precision + * @return tax / total * amt + */ + private BigDecimal calcAmount (BigDecimal tax, BigDecimal total, BigDecimal amt, int precision) + { + log.fine("Amt=" + amt + " - Total=" + total + ", Tax=" + tax); + if (tax.signum() == 0 + || total.signum() == 0 + || amt.signum() == 0) + return Env.ZERO; + // + BigDecimal devisor = total.subtract(tax); + BigDecimal multiplier = tax.divide(devisor, 10, BigDecimal.ROUND_HALF_UP); + BigDecimal retValue = multiplier.multiply(amt); + if (retValue.scale() > precision) + retValue = retValue.setScale(precision, BigDecimal.ROUND_HALF_UP); + log.fine(retValue + " (Mult=" + multiplier + "(Prec=" + precision + ")"); + return retValue; + } // calcAmount + +} // Doc_AllocationTax diff --git a/base/src/org/compiere/acct/Doc_Bank.java b/base/src/org/compiere/acct/Doc_Bank.java new file mode 100644 index 0000000000..ee67d3b554 --- /dev/null +++ b/base/src/org/compiere/acct/Doc_Bank.java @@ -0,0 +1,223 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; + +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Post Invoice Documents. + *
+ *  Table:              C_BankStatement (392)
+ *  Document Types:     CMB
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_Bank.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_Bank extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + protected Doc_Bank (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super (ass, MBankStatement.class, rs, DOCTYPE_BankStatement, trxName); + } // Doc_Bank + + /** Bank Account */ + private int m_C_BankAccount_ID = 0; + + /** + * Load Specific Document Details + * @return error message or null + */ + protected String loadDocumentDetails () + { + MBankStatement bs = (MBankStatement)getPO(); + setDateDoc(bs.getStatementDate()); + setDateAcct(bs.getStatementDate()); // Overwritten on Line Level + + m_C_BankAccount_ID = bs.getC_BankAccount_ID(); + // Amounts + setAmount(AMTTYPE_Gross, bs.getStatementDifference()); + + // Set Bank Account Info (Currency) + MBankAccount ba = MBankAccount.get (getCtx(), m_C_BankAccount_ID); + setC_Currency_ID (ba.getC_Currency_ID()); + + // Contained Objects + p_lines = loadLines(bs); + log.fine("Lines=" + p_lines.length); + return null; + } // loadDocumentDetails + + /** + * Load Invoice Line. + * @param bs bank statement + * 4 amounts + * AMTTYPE_Payment + * AMTTYPE_Statement2 + * AMTTYPE_Charge + * AMTTYPE_Interest + * @return DocLine Array + */ + private DocLine[] loadLines(MBankStatement bs) + { + ArrayList list = new ArrayList(); + MBankStatementLine[] lines = bs.getLines(false); + for (int i = 0; i < lines.length; i++) + { + MBankStatementLine line = lines[i]; + DocLine_Bank docLine = new DocLine_Bank(line, this); + // Set Date Acct + if (i == 0) + setDateAcct(line.getDateAcct()); + MPeriod period = MPeriod.get(getCtx(), line.getDateAcct()); + if (period != null && period.isOpen(DOCTYPE_BankStatement)) + docLine.setC_Period_ID(period.getC_Period_ID()); + // + list.add(docLine); + } + + // Return Array + DocLine[] dls = new DocLine[list.size()]; + list.toArray(dls); + return dls; + } // loadLines + + + /************************************************************************** + * Get Source Currency Balance - subtracts line amounts from total - no rounding + * @return positive amount, if total invoice is bigger than lines + */ + public BigDecimal getBalance() + { + BigDecimal retValue = Env.ZERO; + StringBuffer sb = new StringBuffer (" ["); + // Total + retValue = retValue.add(getAmount(Doc.AMTTYPE_Gross)); + sb.append(getAmount(Doc.AMTTYPE_Gross)); + // - Lines + for (int i = 0; i < p_lines.length; i++) + { + BigDecimal lineBalance = ((DocLine_Bank)p_lines[i]).getStmtAmt(); + retValue = retValue.subtract(lineBalance); + sb.append("-").append(lineBalance); + } + sb.append("]"); + // + log.fine(toString() + " Balance=" + retValue + sb.toString()); + return retValue; + } // getBalance + + /** + * Create Facts (the accounting logic) for + * CMB. + *
+	 *      BankAsset       DR      CR  (Statement)
+	 *      BankInTransit   DR      CR              (Payment)
+	 *      Charge          DR          (Charge)
+	 *      Interest        DR      CR  (Interest)
+	 *  
+ * @param as accounting schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + + // Header -- there may be different currency amounts + + FactLine fl = null; + int AD_Org_ID = getBank_Org_ID(); // Bank Account Org + // Lines + for (int i = 0; i < p_lines.length; i++) + { + DocLine_Bank line = (DocLine_Bank)p_lines[i]; + int C_BPartner_ID = line.getC_BPartner_ID(); + + // BankAsset DR CR (Statement) + fl = fact.createLine(line, + getAccount(Doc.ACCTTYPE_BankAsset, as), + line.getC_Currency_ID(), line.getStmtAmt()); + if (fl != null && AD_Org_ID != 0) + fl.setAD_Org_ID(AD_Org_ID); + if (fl != null && C_BPartner_ID != 0) + fl.setC_BPartner_ID(C_BPartner_ID); + + // BankInTransit DR CR (Payment) + fl = fact.createLine(line, + getAccount(Doc.ACCTTYPE_BankInTransit, as), + line.getC_Currency_ID(), line.getTrxAmt().negate()); + if (fl != null) + { + if (C_BPartner_ID != 0) + fl.setC_BPartner_ID(C_BPartner_ID); + if (AD_Org_ID != 0) + fl.setAD_Org_ID(AD_Org_ID); + else + fl.setAD_Org_ID(line.getAD_Org_ID(true)); // from payment + } + // Charge DR (Charge) + fl = fact.createLine(line, + line.getChargeAccount(as, line.getChargeAmt().negate()), + line.getC_Currency_ID(), line.getChargeAmt().negate(), null); + if (fl != null && C_BPartner_ID != 0) + fl.setC_BPartner_ID(C_BPartner_ID); + + // Interest DR CR (Interest) + if (line.getInterestAmt().signum() < 0) + fl = fact.createLine(line, + getAccount(Doc.ACCTTYPE_InterestExp, as), getAccount(Doc.ACCTTYPE_InterestExp, as), + line.getC_Currency_ID(), line.getInterestAmt().negate()); + else + fl = fact.createLine(line, + getAccount(Doc.ACCTTYPE_InterestRev, as), getAccount(Doc.ACCTTYPE_InterestRev, as), + line.getC_Currency_ID(), line.getInterestAmt().negate()); + if (fl != null && C_BPartner_ID != 0) + fl.setC_BPartner_ID(C_BPartner_ID); + // + // fact.createTaxCorrection(); + } + // + ArrayList facts = new ArrayList(); + facts.add(fact); + return facts; + } // createFact + + /** + * Get AD_Org_ID from Bank Account + * @return AD_Org_ID or 0 + */ + private int getBank_Org_ID () + { + if (m_C_BankAccount_ID == 0) + return 0; + // + MBankAccount ba = MBankAccount.get(getCtx(), m_C_BankAccount_ID); + return ba.getAD_Org_ID(); + } // getBank_Org_ID + +} // Doc_Bank diff --git a/base/src/org/compiere/acct/Doc_Cash.java b/base/src/org/compiere/acct/Doc_Cash.java new file mode 100644 index 0000000000..568031b9e7 --- /dev/null +++ b/base/src/org/compiere/acct/Doc_Cash.java @@ -0,0 +1,254 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; + +import org.compiere.model.*; +import java.util.logging.*; +import org.compiere.util.*; + +/** + * Post Invoice Documents. + *
+ *  Table:              C_Cash (407)
+ *  Document Types:     CMC
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_Cash.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_Cash extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + protected Doc_Cash (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super(ass, MCash.class, rs, DOCTYPE_CashJournal, trxName); + } // Doc_Cash + + /** + * Load Specific Document Details + * @return error message or null + */ + protected String loadDocumentDetails () + { + MCash cash = (MCash)getPO(); + setDateDoc(cash.getStatementDate()); + + // Amounts + setAmount(Doc.AMTTYPE_Gross, cash.getStatementDifference()); + + // Set CashBook Org & Currency + MCashBook cb = MCashBook.get(getCtx(), cash.getC_CashBook_ID()); + setC_CashBook_ID(cb.getC_CashBook_ID()); + setC_Currency_ID(cb.getC_Currency_ID()); + + // Contained Objects + p_lines = loadLines(cash, cb); + log.fine("Lines=" + p_lines.length); + return null; + } // loadDocumentDetails + + + /** + * Load Cash Line + * @param cash journal + * @param cb cash book + * @return DocLine Array + */ + private DocLine[] loadLines(MCash cash, MCashBook cb) + { + ArrayList list = new ArrayList(); + MCashLine[] lines = cash.getLines(false); + for (int i = 0; i < lines.length; i++) + { + MCashLine line = lines[i]; + DocLine_Cash docLine = new DocLine_Cash (line, this); + // + list.add(docLine); + } + + // Return Array + DocLine[] dls = new DocLine[list.size()]; + list.toArray(dls); + return dls; + } // loadLines + + + /************************************************************************** + * Get Source Currency Balance - subtracts line amounts from total - no rounding + * @return positive amount, if total invoice is bigger than lines + */ + public BigDecimal getBalance() + { + BigDecimal retValue = Env.ZERO; + StringBuffer sb = new StringBuffer (" ["); + // Total + retValue = retValue.add(getAmount(Doc.AMTTYPE_Gross)); + sb.append(getAmount(Doc.AMTTYPE_Gross)); + // - Lines + for (int i = 0; i < p_lines.length; i++) + { + retValue = retValue.subtract(p_lines[i].getAmtSource()); + sb.append("-").append(p_lines[i].getAmtSource()); + } + sb.append("]"); + // + log.fine(toString() + " Balance=" + retValue + sb.toString()); + // return retValue; + return Env.ZERO; // Lines are balanced + } // getBalance + + /** + * Create Facts (the accounting logic) for + * CMC. + *
+	 *  Expense
+	 *          CashExpense     DR
+	 *          CashAsset               CR
+	 *  Receipt
+	 *          CashAsset       DR
+	 *          CashReceipt             CR
+	 *  Charge
+	 *          Charge          DR
+	 *          CashAsset               CR
+	 *  Difference
+	 *          CashDifference  DR
+	 *          CashAsset               CR
+	 *  Invoice
+	 *          CashAsset       DR
+	 *          CashTransfer            CR
+	 *  Transfer
+	 *          BankInTransit   DR
+	 *          CashAsset               CR
+	 *  
+ * @param as account schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + // Need to have CashBook + if (getC_CashBook_ID() == 0) + { + p_Error = "C_CashBook_ID not set"; + log.log(Level.SEVERE, p_Error); + return null; + } + + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + + // Header posting amt as Invoices and Transfer could be differenet currency + // CashAsset Total + BigDecimal assetAmt = Env.ZERO; + + // Lines + for (int i = 0; i < p_lines.length; i++) + { + DocLine_Cash line = (DocLine_Cash)p_lines[i]; + String CashType = line.getCashType(); + + if (CashType.equals(DocLine_Cash.CASHTYPE_EXPENSE)) + { // amount is negative + // CashExpense DR + // CashAsset CR + fact.createLine(line, getAccount(Doc.ACCTTYPE_CashExpense, as), + getC_Currency_ID(), line.getAmount().negate(), null); + // fact.createLine(line, getAccount(Doc.ACCTTYPE_CashAsset, as), + // p_vo.C_Currency_ID, null, line.getAmount().negate()); + assetAmt = assetAmt.subtract(line.getAmount().negate()); + } + else if (CashType.equals(DocLine_Cash.CASHTYPE_RECEIPT)) + { // amount is positive + // CashAsset DR + // CashReceipt CR + // fact.createLine(line, getAccount(Doc.ACCTTYPE_CashAsset, as), + // p_vo.C_Currency_ID, line.getAmount(), null); + assetAmt = assetAmt.add(line.getAmount()); + fact.createLine(line, getAccount(Doc.ACCTTYPE_CashReceipt, as), + getC_Currency_ID(), null, line.getAmount()); + } + else if (CashType.equals(DocLine_Cash.CASHTYPE_CHARGE)) + { // amount is negative + // Charge DR + // CashAsset CR + fact.createLine(line, line.getChargeAccount(as, getAmount()), + getC_Currency_ID(), line.getAmount().negate(), null); + // fact.createLine(line, getAccount(Doc.ACCTTYPE_CashAsset, as), + // p_vo.C_Currency_ID, null, line.getAmount().negate()); + assetAmt = assetAmt.subtract(line.getAmount().negate()); + } + else if (CashType.equals(DocLine_Cash.CASHTYPE_DIFFERENCE)) + { // amount is pos/neg + // CashDifference DR + // CashAsset CR + fact.createLine(line, getAccount(Doc.ACCTTYPE_CashDifference, as), + getC_Currency_ID(), line.getAmount().negate()); + // fact.createLine(line, getAccount(Doc.ACCTTYPE_CashAsset, as), + // p_vo.C_Currency_ID, line.getAmount()); + assetAmt = assetAmt.add(line.getAmount()); + } + else if (CashType.equals(DocLine_Cash.CASHTYPE_INVOICE)) + { // amount is pos/neg + // CashAsset DR dr -- Invoice is in Invoice Currency ! + // CashTransfer cr CR + if (line.getC_Currency_ID() == getC_Currency_ID()) + assetAmt = assetAmt.add (line.getAmount()); + else + fact.createLine(line, + getAccount(Doc.ACCTTYPE_CashAsset, as), + line.getC_Currency_ID(), line.getAmount()); + fact.createLine(line, + getAccount(Doc.ACCTTYPE_CashTransfer, as), + line.getC_Currency_ID(), line.getAmount().negate()); + } + else if (CashType.equals(DocLine_Cash.CASHTYPE_TRANSFER)) + { // amount is pos/neg + // BankInTransit DR dr -- Transfer is in Bank Account Currency + // CashAsset dr CR + int temp = getC_BankAccount_ID(); + setC_BankAccount_ID (line.getC_BankAccount_ID()); + fact.createLine(line, + getAccount(Doc.ACCTTYPE_BankInTransit, as), + line.getC_Currency_ID(), line.getAmount().negate()); + setC_BankAccount_ID(temp); + if (line.getC_Currency_ID() == getC_Currency_ID()) + assetAmt = assetAmt.add (line.getAmount()); + else + fact.createLine(line, + getAccount(Doc.ACCTTYPE_CashAsset, as), + line.getC_Currency_ID(), line.getAmount()); + } + } // lines + + // Cash Asset + fact.createLine(null, getAccount(Doc.ACCTTYPE_CashAsset, as), + getC_Currency_ID(), assetAmt); + + // + ArrayList facts = new ArrayList(); + facts.add(fact); + return facts; + } // createFact + +} // Doc_Cash diff --git a/base/src/org/compiere/acct/Doc_GLJournal.java b/base/src/org/compiere/acct/Doc_GLJournal.java new file mode 100644 index 0000000000..d7fa2da090 --- /dev/null +++ b/base/src/org/compiere/acct/Doc_GLJournal.java @@ -0,0 +1,168 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; + +import org.compiere.model.*; +import java.util.logging.*; +import org.compiere.util.*; + +/** + * Post Invoice Documents. + *
+ *  Table:              GL_Journal (224)
+ *  Document Types:     GLJ
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_GLJournal.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_GLJournal extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + protected Doc_GLJournal (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super(ass, MJournal.class, rs, null, trxName); + } // Foc_GL_Journal + + /** Posting Type */ + private String m_PostingType = null; + private int m_C_AcctSchema_ID = 0; + + /** + * Load Specific Document Details + * @return error message or null + */ + protected String loadDocumentDetails () + { + MJournal journal = (MJournal)getPO(); + m_PostingType = journal.getPostingType(); + m_C_AcctSchema_ID = journal.getC_AcctSchema_ID(); + + // Contained Objects + p_lines = loadLines(journal); + log.fine("Lines=" + p_lines.length); + return null; + } // loadDocumentDetails + + + /** + * Load Invoice Line + * @param journal journal + * @return DocLine Array + */ + private DocLine[] loadLines(MJournal journal) + { + ArrayList list = new ArrayList(); + MJournalLine[] lines = journal.getLines(false); + for (int i = 0; i < lines.length; i++) + { + MJournalLine line = lines[i]; + DocLine docLine = new DocLine (line, this); + // -- Source Amounts + docLine.setAmount (line.getAmtSourceDr(), line.getAmtSourceCr()); + // -- Converted Amounts + docLine.setConvertedAmt (m_C_AcctSchema_ID, line.getAmtAcctDr(), line.getAmtAcctCr()); + // -- Account + MAccount account = line.getAccount(); + docLine.setAccount (account); + // -- Organization of Line was set to Org of Account + list.add(docLine); + } + // Return Array + int size = list.size(); + DocLine[] dls = new DocLine[size]; + list.toArray(dls); + return dls; + } // loadLines + + + /************************************************************************** + * Get Source Currency Balance - subtracts line and tax amounts from total - no rounding + * @return positive amount, if total invoice is bigger than lines + */ + public BigDecimal getBalance() + { + BigDecimal retValue = Env.ZERO; + StringBuffer sb = new StringBuffer (" ["); + // Lines + for (int i = 0; i < p_lines.length; i++) + { + retValue = retValue.add(p_lines[i].getAmtSource()); + sb.append("+").append(p_lines[i].getAmtSource()); + } + sb.append("]"); + // + log.fine(toString() + " Balance=" + retValue + sb.toString()); + return retValue; + } // getBalance + + /** + * Create Facts (the accounting logic) for + * GLJ. + * (only for the accounting scheme, it was created) + *
+	 *      account     DR          CR
+	 *  
+ * @param as acct schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + ArrayList facts = new ArrayList(); + // Other Acct Schema + if (as.getC_AcctSchema_ID() != m_C_AcctSchema_ID) + return facts; + + // create Fact Header + Fact fact = new Fact (this, as, m_PostingType); + + // GLJ + if (getDocumentType().equals(DOCTYPE_GLJournal)) + { + // account DR CR + for (int i = 0; i < p_lines.length; i++) + { + if (p_lines[i].getC_AcctSchema_ID () == as.getC_AcctSchema_ID ()) + { + FactLine line = fact.createLine (p_lines[i], + p_lines[i].getAccount (), + getC_Currency_ID(), + p_lines[i].getAmtSourceDr (), + p_lines[i].getAmtSourceCr ()); + } + } // for all lines + } + else + { + p_Error = "DocumentType unknown: " + getDocumentType(); + log.log(Level.SEVERE, p_Error); + fact = null; + } + // + facts.add(fact); + return facts; + } // createFact + +} // Doc_GLJournal diff --git a/base/src/org/compiere/acct/Doc_InOut.java b/base/src/org/compiere/acct/Doc_InOut.java new file mode 100644 index 0000000000..099c7df10d --- /dev/null +++ b/base/src/org/compiere/acct/Doc_InOut.java @@ -0,0 +1,305 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; + +import org.compiere.model.*; + +import java.util.logging.*; +import org.compiere.util.*; + +/** + * Post Shipment/Receipt Documents. + *
+ *  Table:              M_InOut (319)
+ *  Document Types:     MMS, MMR
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_InOut.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_InOut extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + public Doc_InOut (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super (ass, MInOut.class, rs, null, trxName); + } // DocInOut + + /** + * Load Document Details + * @return error message or null + */ + protected String loadDocumentDetails() + { + setC_Currency_ID(NO_CURRENCY); + MInOut inout = (MInOut)getPO(); + setDateDoc (inout.getMovementDate()); + // Contained Objects + p_lines = loadLines(inout); + log.fine("Lines=" + p_lines.length); + return null; + } // loadDocumentDetails + + /** + * Load InOut Line + * @param inout shipment/receipt + * @return DocLine Array + */ + private DocLine[] loadLines(MInOut inout) + { + ArrayList list = new ArrayList(); + MInOutLine[] lines = inout.getLines(false); + for (int i = 0; i < lines.length; i++) + { + MInOutLine line = lines[i]; + if (line.isDescription() + || line.getM_Product_ID() == 0 + || line.getMovementQty().signum() == 0) + { + log.finer("Ignored: " + line); + continue; + } + + DocLine docLine = new DocLine (line, this); + BigDecimal Qty = line.getMovementQty(); + docLine.setQty (Qty, getDocumentType().equals(DOCTYPE_MatShipment)); // sets Trx and Storage Qty + // + log.fine(docLine.toString()); + list.add (docLine); + } + + // Return Array + DocLine[] dls = new DocLine[list.size()]; + list.toArray(dls); + return dls; + } // loadLines + + /** + * Get Balance + * @return Zero (always balanced) + */ + public BigDecimal getBalance() + { + BigDecimal retValue = Env.ZERO; + return retValue; + } // getBalance + + /** + * Create Facts (the accounting logic) for + * MMS, MMR. + *
+	 *  Shipment
+	 *      CoGS (RevOrg)   DR
+	 *      Inventory               CR
+	 *  Shipment of Project Issue
+	 *      CoGS            DR
+	 *      Project                 CR
+	 *  Receipt
+	 *      Inventory       DR
+	 *      NotInvoicedReceipt      CR
+	 *  
+ * @param as accounting schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + setC_Currency_ID (as.getC_Currency_ID()); + + // Line pointers + FactLine dr = null; + FactLine cr = null; + + // *** Sales - Shipment + if (getDocumentType().equals(DOCTYPE_MatShipment)) + { + for (int i = 0; i < p_lines.length; i++) + { + DocLine line = p_lines[i]; + BigDecimal costs = line.getProductCosts(as, line.getAD_Org_ID(), true); + if (costs == null || costs.signum() == 0) // zero costs OK + { + MProduct product = line.getProduct(); + if (product.isStocked()) + { + p_Error = "No Costs for " + line.getProduct().getName(); + log.log(Level.WARNING, p_Error); + return null; + } + else // ignore service + continue; + } + // CoGS DR + dr = fact.createLine(line, + line.getAccount(ProductCost.ACCTTYPE_P_Cogs, as), + as.getC_Currency_ID(), costs, null); + if (dr == null) + { + p_Error = "FactLine DR not created: " + line; + log.log(Level.WARNING, p_Error); + return null; + } + dr.setM_Locator_ID(line.getM_Locator_ID()); + dr.setLocationFromLocator(line.getM_Locator_ID(), true); // from Loc + dr.setLocationFromBPartner(getC_BPartner_Location_ID(), false); // to Loc + dr.setAD_Org_ID(line.getOrder_Org_ID()); // Revenue X-Org + dr.setQty(line.getQty().negate()); + + // Inventory CR + cr = fact.createLine(line, + line.getAccount(ProductCost.ACCTTYPE_P_Asset, as), + as.getC_Currency_ID(), null, costs); + if (cr == null) + { + p_Error = "FactLine CR not created: " + line; + log.log(Level.WARNING, p_Error); + return null; + } + cr.setM_Locator_ID(line.getM_Locator_ID()); + cr.setLocationFromLocator(line.getM_Locator_ID(), true); // from Loc + cr.setLocationFromBPartner(getC_BPartner_Location_ID(), false); // to Loc + // + if (line.getM_Product_ID() != 0) + { + MCostDetail.createShipment(as, line.getAD_Org_ID(), + line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(), + line.get_ID(), 0, + costs, line.getQty(), + line.getDescription(), true, getTrxName()); + } + } // for all lines + updateProductInfo(as.getC_AcctSchema_ID()); // only for SO! + } // Shipment + + // *** Purchasing - Receipt + else if (getDocumentType().equals(DOCTYPE_MatReceipt)) + { + for (int i = 0; i < p_lines.length; i++) + { + DocLine line = p_lines[i]; + BigDecimal costs = null; + MProduct product = line.getProduct(); + //get costing method for product + String costingMethod = as.getCostingMethod(); + MProductCategoryAcct pca = MProductCategoryAcct.get(getCtx(), + product.getM_Product_Category_ID(), as.getC_AcctSchema_ID(), getTrxName()); + if (pca.getCostingMethod() != null) + costingMethod = pca.getCostingMethod(); + if (MAcctSchema.COSTINGMETHOD_AveragePO.equals(costingMethod) || + MAcctSchema.COSTINGMETHOD_LastPOPrice.equals(costingMethod) ) + { + int C_OrderLine_ID = line.getC_OrderLine_ID(); + MOrderLine orderLine = new MOrderLine (getCtx(), C_OrderLine_ID, getTrxName()); + costs = orderLine.getPriceCost(); + if (costs == null || costs.signum() == 0) + costs = orderLine.getPriceActual(); + costs = costs.multiply(line.getQty()); + } + else + { + costs = line.getProductCosts(as, line.getAD_Org_ID(), false); // current costs + } + if (costs == null || costs.signum() == 0) + { + p_Error = "Resubmit - No Costs for " + product.getName(); + log.log(Level.WARNING, p_Error); + return null; + } + // Inventory/Asset DR + MAccount assets = line.getAccount(ProductCost.ACCTTYPE_P_Asset, as); + if (product.isService()) + assets = line.getAccount(ProductCost.ACCTTYPE_P_Expense, as); + dr = fact.createLine(line, assets, + as.getC_Currency_ID(), costs, null); + if (dr == null) + { + p_Error = "DR not created: " + line; + log.log(Level.WARNING, p_Error); + return null; + } + dr.setM_Locator_ID(line.getM_Locator_ID()); + dr.setLocationFromBPartner(getC_BPartner_Location_ID(), true); // from Loc + dr.setLocationFromLocator(line.getM_Locator_ID(), false); // to Loc + // NotInvoicedReceipt CR + cr = fact.createLine(line, + getAccount(Doc.ACCTTYPE_NotInvoicedReceipts, as), + as.getC_Currency_ID(), null, costs); + if (cr == null) + { + p_Error = "CR not created: " + line; + log.log(Level.WARNING, p_Error); + return null; + } + cr.setM_Locator_ID(line.getM_Locator_ID()); + cr.setLocationFromBPartner(getC_BPartner_Location_ID(), true); // from Loc + cr.setLocationFromLocator(line.getM_Locator_ID(), false); // to Loc + cr.setQty(line.getQty().negate()); + } + } // Receipt + else + { + p_Error = "DocumentType unknown: " + getDocumentType(); + log.log(Level.SEVERE, p_Error); + return null; + } + // + ArrayList facts = new ArrayList(); + facts.add(fact); + return facts; + } // createFact + + + /** + * Update Sales Order Costing Product Info (old). + * Purchase side handeled in Invoice Matching. + *
+ * decrease average cumulatives + * @param C_AcctSchema_ID accounting schema + * @deprecated old costing + */ + private void updateProductInfo (int C_AcctSchema_ID) + { + log.fine("M_InOut_ID=" + get_ID()); + // Old Model + StringBuffer sql = new StringBuffer( + //FYRACLE add pc. everywhere + "UPDATE M_Product_Costing pc " + + "SET (CostAverageCumQty, CostAverageCumAmt)=" + + "(SELECT pc.CostAverageCumQty - SUM(il.MovementQty)," + + " pc.CostAverageCumAmt - SUM(il.MovementQty*pc.CurrentCostPrice) " + + "FROM M_InOutLine il " + + "WHERE pc.M_Product_ID=il.M_Product_ID" + + " AND il.M_InOut_ID=").append(get_ID()).append(") ") + .append("WHERE EXISTS (SELECT * " + + "FROM M_InOutLine il " + + "WHERE pc.M_Product_ID=il.M_Product_ID" + + " AND il.M_InOut_ID=").append(get_ID()).append(")"); + int no = DB.executeUpdate(sql.toString(), getTrxName()); + log.fine("M_Product_Costing - Updated=" + no); + // + } // updateProductInfo + +} // Doc_InOut diff --git a/base/src/org/compiere/acct/Doc_Inventory.java b/base/src/org/compiere/acct/Doc_Inventory.java new file mode 100644 index 0000000000..fc8e902f51 --- /dev/null +++ b/base/src/org/compiere/acct/Doc_Inventory.java @@ -0,0 +1,179 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; + +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Post Inventory Documents. + *
+ *  Table:              M_Inventory (321)
+ *  Document Types:     MMI
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_Inventory.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_Inventory extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + public Doc_Inventory (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super (ass, MInventory.class, rs, DOCTYPE_MatInventory, trxName); + } // Doc_Inventory + + /** + * Load Document Details + * @return error message or null + */ + protected String loadDocumentDetails() + { + setC_Currency_ID (NO_CURRENCY); + MInventory inventory = (MInventory)getPO(); + setDateDoc (inventory.getMovementDate()); + setDateAcct(inventory.getMovementDate()); + // Contained Objects + p_lines = loadLines(inventory); + log.fine("Lines=" + p_lines.length); + return null; + } // loadDocumentDetails + + /** + * Load Invoice Line + * @param inventory inventory + * @return DocLine Array + */ + private DocLine[] loadLines(MInventory inventory) + { + ArrayList list = new ArrayList(); + MInventoryLine[] lines = inventory.getLines(false); + for (int i = 0; i < lines.length; i++) + { + MInventoryLine line = lines[i]; + // nothing to post + if (line.getQtyBook().compareTo(line.getQtyCount()) == 0 + && line.getQtyInternalUse().signum() == 0) + continue; + // + DocLine docLine = new DocLine (line, this); + BigDecimal Qty = line.getQtyInternalUse(); + if (Qty.signum() != 0) + Qty = Qty.negate(); // Internal Use entered positive + else + { + BigDecimal QtyBook = line.getQtyBook(); + BigDecimal QtyCount = line.getQtyCount(); + Qty = QtyCount.subtract(QtyBook); + } + docLine.setQty (Qty, false); // -5 => -5 + // + log.fine(docLine.toString()); + list.add (docLine); + } + + // Return Array + DocLine[] dls = new DocLine[list.size()]; + list.toArray(dls); + return dls; + } // loadLines + + /** + * Get Balance + * @return Zero (always balanced) + */ + public BigDecimal getBalance() + { + BigDecimal retValue = Env.ZERO; + return retValue; + } // getBalance + + /** + * Create Facts (the accounting logic) for + * MMI. + *
+	 *  Inventory
+	 *      Inventory       DR      CR
+	 *      InventoryDiff   DR      CR   (or Charge)
+	 *  
+ * @param as account schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + setC_Currency_ID(as.getC_Currency_ID()); + + // Line pointers + FactLine dr = null; + FactLine cr = null; + + for (int i = 0; i < p_lines.length; i++) + { + DocLine line = p_lines[i]; + BigDecimal costs = line.getProductCosts(as, line.getAD_Org_ID(), false); + if (costs == null || costs.signum() == 0) + { + p_Error = "No Costs for " + line.getProduct().getName(); + return null; + } + // Inventory DR CR + dr = fact.createLine(line, + line.getAccount(ProductCost.ACCTTYPE_P_Asset, as), + as.getC_Currency_ID(), costs); + // may be zero difference - no line created. + if (dr == null) + continue; + dr.setM_Locator_ID(line.getM_Locator_ID()); + + // InventoryDiff DR CR + // or Charge + MAccount invDiff = line.getChargeAccount(as, costs.negate()); + if (invDiff == null) + invDiff = getAccount(Doc.ACCTTYPE_InvDifferences, as); + cr = fact.createLine(line, invDiff, + as.getC_Currency_ID(), costs.negate()); + if (cr == null) + continue; + cr.setM_Locator_ID(line.getM_Locator_ID()); + cr.setQty(line.getQty().negate()); + if (line.getC_Charge_ID() != 0) // explicit overwrite for charge + cr.setAD_Org_ID(line.getAD_Org_ID()); + + // Cost Detail + MCostDetail.createInventory(as, line.getAD_Org_ID(), + line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(), + line.get_ID(), 0, + costs, line.getQty(), + line.getDescription(), getTrxName()); + } + // + ArrayList facts = new ArrayList(); + facts.add(fact); + return facts; + } // createFact + +} // Doc_Inventory diff --git a/base/src/org/compiere/acct/Doc_Invoice.java b/base/src/org/compiere/acct/Doc_Invoice.java new file mode 100644 index 0000000000..cde49cbe7d --- /dev/null +++ b/base/src/org/compiere/acct/Doc_Invoice.java @@ -0,0 +1,967 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.logging.*; +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Post Invoice Documents. + *
+ *  Table:              C_Invoice (318)
+ *  Document Types:     ARI, ARC, ARF, API, APC
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_Invoice.java,v 1.2 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_Invoice extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + protected Doc_Invoice(MAcctSchema[] ass, ResultSet rs, String trxName) + { + super (ass, MInvoice.class, rs, null, trxName); + } // Doc_Invoice + + /** Contained Optional Tax Lines */ + private DocTax[] m_taxes = null; + /** Currency Precision */ + private int m_precision = -1; + /** All lines are Service */ + private boolean m_allLinesService = true; + /** All lines are product item */ + private boolean m_allLinesItem = true; + + /** + * Load Specific Document Details + * @return error message or null + */ + protected String loadDocumentDetails () + { + MInvoice invoice = (MInvoice)getPO(); + setDateDoc(invoice.getDateInvoiced()); + setIsTaxIncluded(invoice.isTaxIncluded()); + // Amounts + setAmount(Doc.AMTTYPE_Gross, invoice.getGrandTotal()); + setAmount(Doc.AMTTYPE_Net, invoice.getTotalLines()); + setAmount(Doc.AMTTYPE_Charge, invoice.getChargeAmt()); + + // Contained Objects + m_taxes = loadTaxes(); + p_lines = loadLines(invoice); + log.fine("Lines=" + p_lines.length + ", Taxes=" + m_taxes.length); + return null; + } // loadDocumentDetails + + /** + * Load Invoice Taxes + * @return DocTax Array + */ + private DocTax[] loadTaxes() + { + ArrayList list = new ArrayList(); + String sql = "SELECT it.C_Tax_ID, t.Name, t.Rate, it.TaxBaseAmt, it.TaxAmt, t.IsSalesTax " + + "FROM C_Tax t, C_InvoiceTax it " + + "WHERE t.C_Tax_ID=it.C_Tax_ID AND it.C_Invoice_ID=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, getTrxName()); + pstmt.setInt(1, get_ID()); + ResultSet rs = pstmt.executeQuery(); + // + while (rs.next()) + { + int C_Tax_ID = rs.getInt(1); + String name = rs.getString(2); + BigDecimal rate = rs.getBigDecimal(3); + BigDecimal taxBaseAmt = rs.getBigDecimal(4); + BigDecimal amount = rs.getBigDecimal(5); + boolean salesTax = "Y".equals(rs.getString(6)); + // + DocTax taxLine = new DocTax(C_Tax_ID, name, rate, + taxBaseAmt, amount, salesTax); + log.fine(taxLine.toString()); + list.add(taxLine); + } + // + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + return null; + } + + // Return Array + DocTax[] tl = new DocTax[list.size()]; + list.toArray(tl); + return tl; + } // loadTaxes + + /** + * Load Invoice Line + * @param invoice invoice + * @return DocLine Array + */ + private DocLine[] loadLines (MInvoice invoice) + { + ArrayList list = new ArrayList(); + // + MInvoiceLine[] lines = invoice.getLines(false); + for (int i = 0; i < lines.length; i++) + { + MInvoiceLine line = lines[i]; + if (line.isDescription()) + continue; + DocLine docLine = new DocLine(line, this); + // Qty + BigDecimal Qty = line.getQtyInvoiced(); + boolean cm = getDocumentType().equals(DOCTYPE_ARCredit) + || getDocumentType().equals(DOCTYPE_APCredit); + docLine.setQty(cm ? Qty.negate() : Qty, invoice.isSOTrx()); + // + BigDecimal LineNetAmt = line.getLineNetAmt(); + BigDecimal PriceList = line.getPriceList(); + int C_Tax_ID = docLine.getC_Tax_ID(); + // Correct included Tax + if (isTaxIncluded() && C_Tax_ID != 0) + { + MTax tax = MTax.get(getCtx(), C_Tax_ID); + if (!tax.isZeroTax()) + { + BigDecimal LineNetAmtTax = tax.calculateTax(LineNetAmt, true, getStdPercision()); + log.fine("LineNetAmt=" + LineNetAmt + " - Tax=" + LineNetAmtTax); + LineNetAmt = LineNetAmt.subtract(LineNetAmtTax); + for (int t = 0; t < m_taxes.length; t++) + { + if (m_taxes[t].getC_Tax_ID() == C_Tax_ID) + { + m_taxes[t].addIncludedTax(LineNetAmtTax); + break; + } + } + BigDecimal PriceListTax = tax.calculateTax(PriceList, true, getStdPercision()); + PriceList = PriceList.subtract(PriceListTax); + } + } // correct included Tax + + docLine.setAmount (LineNetAmt, PriceList, Qty); // qty for discount calc + if (docLine.isItem()) + m_allLinesService = false; + else + m_allLinesItem = false; + // + log.fine(docLine.toString()); + list.add(docLine); + } + + // Convert to Array + DocLine[] dls = new DocLine[list.size()]; + list.toArray(dls); + + // Included Tax - make sure that no difference + if (isTaxIncluded()) + { + for (int i = 0; i < m_taxes.length; i++) + { + if (m_taxes[i].isIncludedTaxDifference()) + { + BigDecimal diff = m_taxes[i].getIncludedTaxDifference(); + for (int j = 0; j < dls.length; j++) + { + if (dls[j].getC_Tax_ID() == m_taxes[i].getC_Tax_ID()) + { + dls[j].setLineNetAmtDifference(diff); + break; + } + } // for all lines + } // tax difference + } // for all taxes + } // Included Tax difference + + // Return Array + return dls; + } // loadLines + + /** + * Get Currency Percision + * @return precision + */ + private int getStdPercision() + { + if (m_precision == -1) + m_precision = MCurrency.getStdPrecision(getCtx(), getC_Currency_ID()); + return m_precision; + } // getPrecision + + + /************************************************************************** + * Get Source Currency Balance - subtracts line and tax amounts from total - no rounding + * @return positive amount, if total invoice is bigger than lines + */ + public BigDecimal getBalance() + { + BigDecimal retValue = Env.ZERO; + StringBuffer sb = new StringBuffer (" ["); + // Total + retValue = retValue.add(getAmount(Doc.AMTTYPE_Gross)); + sb.append(getAmount(Doc.AMTTYPE_Gross)); + // - Header Charge + retValue = retValue.subtract(getAmount(Doc.AMTTYPE_Charge)); + sb.append("-").append(getAmount(Doc.AMTTYPE_Charge)); + // - Tax + for (int i = 0; i < m_taxes.length; i++) + { + retValue = retValue.subtract(m_taxes[i].getAmount()); + sb.append("-").append(m_taxes[i].getAmount()); + } + // - Lines + for (int i = 0; i < p_lines.length; i++) + { + retValue = retValue.subtract(p_lines[i].getAmtSource()); + sb.append("-").append(p_lines[i].getAmtSource()); + } + sb.append("]"); + // + log.fine(toString() + " Balance=" + retValue + sb.toString()); + return retValue; + } // getBalance + + /** + * Create Facts (the accounting logic) for + * ARI, ARC, ARF, API, APC. + *
+	 *  ARI, ARF
+	 *      Receivables     DR
+	 *      Charge                  CR
+	 *      TaxDue                  CR
+	 *      Revenue                 CR
+	 *
+	 *  ARC
+	 *      Receivables             CR
+	 *      Charge          DR
+	 *      TaxDue          DR
+	 *      Revenue         RR
+	 *
+	 *  API
+	 *      Payables                CR
+	 *      Charge          DR
+	 *      TaxCredit       DR
+	 *      Expense         DR
+	 *
+	 *  APC
+	 *      Payables        DR
+	 *      Charge                  CR
+	 *      TaxCredit               CR
+	 *      Expense                 CR
+	 *  
+ * @param as accounting schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + // + ArrayList facts = new ArrayList(); + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + + // Cash based accounting + if (!as.isAccrual()) + return facts; + + // ** ARI, ARF + if (getDocumentType().equals(DOCTYPE_ARInvoice) + || getDocumentType().equals(DOCTYPE_ARProForma)) + { + BigDecimal grossAmt = getAmount(Doc.AMTTYPE_Gross); + BigDecimal serviceAmt = Env.ZERO; + + // Header Charge CR + BigDecimal amt = getAmount(Doc.AMTTYPE_Charge); + if (amt != null && amt.signum() != 0) + fact.createLine(null, getAccount(Doc.ACCTTYPE_Charge, as), + getC_Currency_ID(), null, amt); + // TaxDue CR + for (int i = 0; i < m_taxes.length; i++) + { + amt = m_taxes[i].getAmount(); + if (amt != null && amt.signum() != 0) + { + FactLine tl = fact.createLine(null, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxDue, as), + getC_Currency_ID(), null, amt); + if (tl != null) + tl.setC_Tax_ID(m_taxes[i].getC_Tax_ID()); + } + } + // Revenue CR + for (int i = 0; i < p_lines.length; i++) + { + amt = p_lines[i].getAmtSource(); + BigDecimal dAmt = null; + if (as.isTradeDiscountPosted()) + { + BigDecimal discount = p_lines[i].getDiscount(); + if (discount != null && discount.signum() != 0) + { + amt = amt.add(discount); + dAmt = discount; + } + } + fact.createLine (p_lines[i], + p_lines[i].getAccount(ProductCost.ACCTTYPE_P_Revenue, as), + getC_Currency_ID(), dAmt, amt); + if (!p_lines[i].isItem()) + { + grossAmt = grossAmt.subtract(amt); + serviceAmt = serviceAmt.add(amt); + } + } + // Set Locations + FactLine[] fLines = fact.getLines(); + for (int i = 0; i < fLines.length; i++) + { + if (fLines[i] != null) + { + fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), true); // from Loc + fLines[i].setLocationFromBPartner(getC_BPartner_Location_ID(), false); // to Loc + } + } + + // Receivables DR + int receivables_ID = getValidCombination_ID(Doc.ACCTTYPE_C_Receivable, as); + int receivablesServices_ID = getValidCombination_ID (Doc.ACCTTYPE_C_Receivable_Services, as); + if (m_allLinesItem || !as.isPostServices() + || receivables_ID == receivablesServices_ID) + { + grossAmt = getAmount(Doc.AMTTYPE_Gross); + serviceAmt = Env.ZERO; + } + else if (m_allLinesService) + { + serviceAmt = getAmount(Doc.AMTTYPE_Gross); + grossAmt = Env.ZERO; + } + if (grossAmt.signum() != 0) + fact.createLine(null, MAccount.get(getCtx(), receivables_ID), + getC_Currency_ID(), grossAmt, null); + if (serviceAmt.signum() != 0) + fact.createLine(null, MAccount.get(getCtx(), receivablesServices_ID), + getC_Currency_ID(), serviceAmt, null); + } + // ARC + else if (getDocumentType().equals(DOCTYPE_ARCredit)) + { + BigDecimal grossAmt = getAmount(Doc.AMTTYPE_Gross); + BigDecimal serviceAmt = Env.ZERO; + + // Header Charge DR + BigDecimal amt = getAmount(Doc.AMTTYPE_Charge); + if (amt != null && amt.signum() != 0) + fact.createLine(null, getAccount(Doc.ACCTTYPE_Charge, as), + getC_Currency_ID(), amt, null); + // TaxDue DR + for (int i = 0; i < m_taxes.length; i++) + { + amt = m_taxes[i].getAmount(); + if (amt != null && amt.signum() != 0) + { + FactLine tl = fact.createLine(null, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxDue, as), + getC_Currency_ID(), amt, null); + if (tl != null) + tl.setC_Tax_ID(m_taxes[i].getC_Tax_ID()); + } + } + // Revenue CR + for (int i = 0; i < p_lines.length; i++) + { + amt = p_lines[i].getAmtSource(); + BigDecimal dAmt = null; + if (as.isTradeDiscountPosted()) + { + BigDecimal discount = p_lines[i].getDiscount(); + if (discount != null && discount.signum() != 0) + { + amt = amt.add(discount); + dAmt = discount; + } + } + fact.createLine (p_lines[i], + p_lines[i].getAccount (ProductCost.ACCTTYPE_P_Revenue, as), + getC_Currency_ID(), amt, dAmt); + if (!p_lines[i].isItem()) + { + grossAmt = grossAmt.subtract(amt); + serviceAmt = serviceAmt.add(amt); + } + } + // Set Locations + FactLine[] fLines = fact.getLines(); + for (int i = 0; i < fLines.length; i++) + { + if (fLines[i] != null) + { + fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), true); // from Loc + fLines[i].setLocationFromBPartner(getC_BPartner_Location_ID(), false); // to Loc + } + } + // Receivables CR + int receivables_ID = getValidCombination_ID (Doc.ACCTTYPE_C_Receivable, as); + int receivablesServices_ID = getValidCombination_ID (Doc.ACCTTYPE_C_Receivable_Services, as); + if (m_allLinesItem || !as.isPostServices() + || receivables_ID == receivablesServices_ID) + { + grossAmt = getAmount(Doc.AMTTYPE_Gross); + serviceAmt = Env.ZERO; + } + else if (m_allLinesService) + { + serviceAmt = getAmount(Doc.AMTTYPE_Gross); + grossAmt = Env.ZERO; + } + if (grossAmt.signum() != 0) + fact.createLine(null, MAccount.get(getCtx(), receivables_ID), + getC_Currency_ID(), null, grossAmt); + if (serviceAmt.signum() != 0) + fact.createLine(null, MAccount.get(getCtx(), receivablesServices_ID), + getC_Currency_ID(), null, serviceAmt); + } + + // ** API + else if (getDocumentType().equals(DOCTYPE_APInvoice)) + { + BigDecimal grossAmt = getAmount(Doc.AMTTYPE_Gross); + BigDecimal serviceAmt = Env.ZERO; + + // Charge DR + fact.createLine(null, getAccount(Doc.ACCTTYPE_Charge, as), + getC_Currency_ID(), getAmount(Doc.AMTTYPE_Charge), null); + // TaxCredit DR + for (int i = 0; i < m_taxes.length; i++) + { + FactLine tl = fact.createLine(null, m_taxes[i].getAccount(m_taxes[i].getAPTaxType(), as), + getC_Currency_ID(), m_taxes[i].getAmount(), null); + if (tl != null) + tl.setC_Tax_ID(m_taxes[i].getC_Tax_ID()); + } + // Expense DR + for (int i = 0; i < p_lines.length; i++) + { + DocLine line = p_lines[i]; + boolean landedCost = landedCost(as, fact, line, true); + if (landedCost && as.isExplicitCostAdjustment()) + { + fact.createLine (line, line.getAccount(ProductCost.ACCTTYPE_P_Expense, as), + getC_Currency_ID(), line.getAmtSource(), null); + // + FactLine fl = fact.createLine (line, line.getAccount(ProductCost.ACCTTYPE_P_Expense, as), + getC_Currency_ID(), null, line.getAmtSource()); + String desc = line.getDescription(); + if (desc == null) + desc = "100%"; + else + desc += " 100%"; + fl.setDescription(desc); + } + if (!landedCost) + { + MAccount expense = line.getAccount(ProductCost.ACCTTYPE_P_Expense, as); + if (line.isItem()) + expense = line.getAccount (ProductCost.ACCTTYPE_P_InventoryClearing, as); + BigDecimal amt = line.getAmtSource(); + BigDecimal dAmt = null; + if (as.isTradeDiscountPosted() && !line.isItem()) + { + BigDecimal discount = line.getDiscount(); + if (discount != null && discount.signum() != 0) + { + amt = amt.add(discount); + dAmt = discount; + } + } + fact.createLine (line, expense, + getC_Currency_ID(), amt, dAmt); + if (!line.isItem()) + { + grossAmt = grossAmt.subtract(amt); + serviceAmt = serviceAmt.add(amt); + } + // + if (line.getM_Product_ID() != 0 + && line.getProduct().isService()) // otherwise Inv Matching + MCostDetail.createInvoice(as, line.getAD_Org_ID(), + line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(), + line.get_ID(), 0, // No Cost Element + line.getAmtSource(), line.getQty(), + line.getDescription(), getTrxName()); + } + } + // Set Locations + FactLine[] fLines = fact.getLines(); + for (int i = 0; i < fLines.length; i++) + { + if (fLines[i] != null) + { + fLines[i].setLocationFromBPartner(getC_BPartner_Location_ID(), true); // from Loc + fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), false); // to Loc + } + } + + // Liability CR + int payables_ID = getValidCombination_ID (Doc.ACCTTYPE_V_Liability, as); + int payablesServices_ID = getValidCombination_ID (Doc.ACCTTYPE_V_Liability_Services, as); + if (m_allLinesItem || !as.isPostServices() + || payables_ID == payablesServices_ID) + { + grossAmt = getAmount(Doc.AMTTYPE_Gross); + serviceAmt = Env.ZERO; + } + else if (m_allLinesService) + { + serviceAmt = getAmount(Doc.AMTTYPE_Gross); + grossAmt = Env.ZERO; + } + if (grossAmt.signum() != 0) + fact.createLine(null, MAccount.get(getCtx(), payables_ID), + getC_Currency_ID(), null, grossAmt); + if (serviceAmt.signum() != 0) + fact.createLine(null, MAccount.get(getCtx(), payablesServices_ID), + getC_Currency_ID(), null, serviceAmt); + // + updateProductPO(as); // Only API + updateProductInfo (as.getC_AcctSchema_ID()); // only API + } + // APC + else if (getDocumentType().equals(DOCTYPE_APCredit)) + { + BigDecimal grossAmt = getAmount(Doc.AMTTYPE_Gross); + BigDecimal serviceAmt = Env.ZERO; + // Charge CR + fact.createLine (null, getAccount(Doc.ACCTTYPE_Charge, as), + getC_Currency_ID(), null, getAmount(Doc.AMTTYPE_Charge)); + // TaxCredit CR + for (int i = 0; i < m_taxes.length; i++) + { + FactLine tl = fact.createLine (null, m_taxes[i].getAccount(m_taxes[i].getAPTaxType(), as), + getC_Currency_ID(), null, m_taxes[i].getAmount()); + if (tl != null) + tl.setC_Tax_ID(m_taxes[i].getC_Tax_ID()); + } + // Expense CR + for (int i = 0; i < p_lines.length; i++) + { + DocLine line = p_lines[i]; + boolean landedCost = landedCost(as, fact, line, false); + if (landedCost && as.isExplicitCostAdjustment()) + { + fact.createLine (line, line.getAccount(ProductCost.ACCTTYPE_P_Expense, as), + getC_Currency_ID(), null, line.getAmtSource()); + // + FactLine fl = fact.createLine (line, line.getAccount(ProductCost.ACCTTYPE_P_Expense, as), + getC_Currency_ID(), line.getAmtSource(), null); + String desc = line.getDescription(); + if (desc == null) + desc = "100%"; + else + desc += " 100%"; + fl.setDescription(desc); + } + if (!landedCost) + { + MAccount expense = line.getAccount(ProductCost.ACCTTYPE_P_Expense, as); + if (line.isItem()) + expense = line.getAccount (ProductCost.ACCTTYPE_P_InventoryClearing, as); + BigDecimal amt = line.getAmtSource(); + BigDecimal dAmt = null; + if (as.isTradeDiscountPosted() && !line.isItem()) + { + BigDecimal discount = line.getDiscount(); + if (discount != null && discount.signum() != 0) + { + amt = amt.add(discount); + dAmt = discount; + } + } + fact.createLine (line, expense, + getC_Currency_ID(), dAmt, amt); + if (!line.isItem()) + { + grossAmt = grossAmt.subtract(amt); + serviceAmt = serviceAmt.add(amt); + } + // + if (line.getM_Product_ID() != 0 + && line.getProduct().isService()) // otherwise Inv Matching + MCostDetail.createInvoice(as, line.getAD_Org_ID(), + line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(), + line.get_ID(), 0, // No Cost Element + line.getAmtSource().negate(), line.getQty(), + line.getDescription(), getTrxName()); + } + } + // Set Locations + FactLine[] fLines = fact.getLines(); + for (int i = 0; i < fLines.length; i++) + { + if (fLines[i] != null) + { + fLines[i].setLocationFromBPartner(getC_BPartner_Location_ID(), true); // from Loc + fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), false); // to Loc + } + } + // Liability DR + int payables_ID = getValidCombination_ID (Doc.ACCTTYPE_V_Liability, as); + int payablesServices_ID = getValidCombination_ID (Doc.ACCTTYPE_V_Liability_Services, as); + if (m_allLinesItem || !as.isPostServices() + || payables_ID == payablesServices_ID) + { + grossAmt = getAmount(Doc.AMTTYPE_Gross); + serviceAmt = Env.ZERO; + } + else if (m_allLinesService) + { + serviceAmt = getAmount(Doc.AMTTYPE_Gross); + grossAmt = Env.ZERO; + } + if (grossAmt.signum() != 0) + fact.createLine(null, MAccount.get(getCtx(), payables_ID), + getC_Currency_ID(), grossAmt, null); + if (serviceAmt.signum() != 0) + fact.createLine(null, MAccount.get(getCtx(), payablesServices_ID), + getC_Currency_ID(), serviceAmt, null); + } + else + { + p_Error = "DocumentType unknown: " + getDocumentType(); + log.log(Level.SEVERE, p_Error); + fact = null; + } + // + facts.add(fact); + return facts; + } // createFact + + /** + * Create Fact Cash Based (i.e. only revenue/expense) + * @param as accounting schema + * @param fact fact to add lines to + * @param multiplier source amount multiplier + * @return accounted amount + */ + public BigDecimal createFactCash (MAcctSchema as, Fact fact, BigDecimal multiplier) + { + boolean creditMemo = getDocumentType().equals(DOCTYPE_ARCredit) + || getDocumentType().equals(DOCTYPE_APCredit); + boolean payables = getDocumentType().equals(DOCTYPE_APInvoice) + || getDocumentType().equals(DOCTYPE_APCredit); + BigDecimal acctAmt = Env.ZERO; + FactLine fl = null; + // Revenue/Cost + for (int i = 0; i < p_lines.length; i++) + { + DocLine line = p_lines[i]; + boolean landedCost = false; + if (payables) + landedCost = landedCost(as, fact, line, false); + if (landedCost && as.isExplicitCostAdjustment()) + { + fact.createLine (line, line.getAccount(ProductCost.ACCTTYPE_P_Expense, as), + getC_Currency_ID(), null, line.getAmtSource()); + // + fl = fact.createLine (line, line.getAccount(ProductCost.ACCTTYPE_P_Expense, as), + getC_Currency_ID(), line.getAmtSource(), null); + String desc = line.getDescription(); + if (desc == null) + desc = "100%"; + else + desc += " 100%"; + fl.setDescription(desc); + } + if (!landedCost) + { + MAccount acct = line.getAccount( + payables ? ProductCost.ACCTTYPE_P_Expense : ProductCost.ACCTTYPE_P_Revenue, as); + if (payables) + { + // if Fixed Asset + if (line.isItem()) + acct = line.getAccount (ProductCost.ACCTTYPE_P_InventoryClearing, as); + } + BigDecimal amt = line.getAmtSource().multiply(multiplier); + BigDecimal amt2 = null; + if (creditMemo) + { + amt2 = amt; + amt = null; + } + if (payables) // Vendor = DR + fl = fact.createLine (line, acct, + getC_Currency_ID(), amt, amt2); + else // Customer = CR + fl = fact.createLine (line, acct, + getC_Currency_ID(), amt2, amt); + if (fl != null) + acctAmt = acctAmt.add(fl.getAcctBalance()); + } + } + // Tax + for (int i = 0; i < m_taxes.length; i++) + { + BigDecimal amt = m_taxes[i].getAmount(); + BigDecimal amt2 = null; + if (creditMemo) + { + amt2 = amt; + amt = null; + } + FactLine tl = null; + if (payables) + tl = fact.createLine (null, m_taxes[i].getAccount(m_taxes[i].getAPTaxType(), as), + getC_Currency_ID(), amt, amt2); + else + tl = fact.createLine (null, m_taxes[i].getAccount(DocTax.ACCTTYPE_TaxDue, as), + getC_Currency_ID(), amt2, amt); + if (tl != null) + tl.setC_Tax_ID(m_taxes[i].getC_Tax_ID()); + } + // Set Locations + FactLine[] fLines = fact.getLines(); + for (int i = 0; i < fLines.length; i++) + { + if (fLines[i] != null) + { + if (payables) + { + fLines[i].setLocationFromBPartner(getC_BPartner_Location_ID(), true); // from Loc + fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), false); // to Loc + } + else + { + fLines[i].setLocationFromOrg(fLines[i].getAD_Org_ID(), true); // from Loc + fLines[i].setLocationFromBPartner(getC_BPartner_Location_ID(), false); // to Loc + } + } + } + return acctAmt; + } // createFactCash + + + /** + * Create Landed Cost accounting & Cost lines + * @param as accounting schema + * @param fact fact + * @param line document line + * @param dr DR entry (normal api) + * @return true if landed costs were created + */ + private boolean landedCost (MAcctSchema as, Fact fact, DocLine line, boolean dr) + { + int C_InvoiceLine_ID = line.get_ID(); + MLandedCostAllocation[] lcas = MLandedCostAllocation.getOfInvoiceLine( + getCtx(), C_InvoiceLine_ID, getTrxName()); + if (lcas.length == 0) + return false; + + // Delete Old + String sql = "DELETE M_CostDetail WHERE C_InvoiceLine_ID=" + C_InvoiceLine_ID; + int no = DB.executeUpdate(sql, getTrxName()); + if (no != 0) + log.config("CostDetail Deleted #" + no); + + // Calculate Total Base + double totalBase = 0; + for (int i = 0; i < lcas.length; i++) + totalBase += lcas[i].getBase().doubleValue(); + + // Create New + MInvoiceLine il = new MInvoiceLine (getCtx(), C_InvoiceLine_ID, getTrxName()); + for (int i = 0; i < lcas.length; i++) + { + MLandedCostAllocation lca = lcas[i]; + if (lca.getBase().signum() == 0) + continue; + double percent = totalBase / lca.getBase().doubleValue(); + String desc = il.getDescription(); + if (desc == null) + desc = percent + "%"; + else + desc += " - " + percent + "%"; + if (line.getDescription() != null) + desc += " - " + line.getDescription(); + + // Accounting + ProductCost pc = new ProductCost (Env.getCtx(), + lca.getM_Product_ID(), lca.getM_AttributeSetInstance_ID(), getTrxName()); + BigDecimal drAmt = null; + BigDecimal crAmt = null; + if (dr) + drAmt = lca.getAmt(); + else + crAmt = lca.getAmt(); + FactLine fl = fact.createLine (line, pc.getAccount(ProductCost.ACCTTYPE_P_CostAdjustment, as), + getC_Currency_ID(), drAmt, crAmt); + fl.setDescription(desc); + + // Cost Detail - Convert to AcctCurrency + BigDecimal allocationAmt = lca.getAmt(); + if (getC_Currency_ID() != as.getC_Currency_ID()) + allocationAmt = MConversionRate.convert(getCtx(), allocationAmt, + getC_Currency_ID(), as.getC_Currency_ID(), + getDateAcct(), getC_ConversionType_ID(), + getAD_Client_ID(), getAD_Org_ID()); + if (allocationAmt.scale() > as.getCostingPrecision()) + allocationAmt = allocationAmt.setScale(as.getCostingPrecision(), BigDecimal.ROUND_HALF_UP); + if (!dr) + allocationAmt = allocationAmt.negate(); + MCostDetail cd = new MCostDetail (as, lca.getAD_Org_ID(), + lca.getM_Product_ID(), lca.getM_AttributeSetInstance_ID(), + lca.getM_CostElement_ID(), + allocationAmt, Env.ZERO, // Qty + desc, getTrxName()); + cd.setC_InvoiceLine_ID(C_InvoiceLine_ID); + boolean ok = cd.save(); + if (ok && !cd.isProcessed()) + { + MClient client = MClient.get(as.getCtx(), as.getAD_Client_ID()); + if (client.isCostImmediate()) + cd.process(); + } + } + + log.config("Created #" + lcas.length); + return true; + } // landedCosts + + /** + * Update ProductPO PriceLastInv + * @param as accounting schema + */ + private void updateProductPO (MAcctSchema as) + { + MClientInfo ci = MClientInfo.get(getCtx(), as.getAD_Client_ID()); + if (ci.getC_AcctSchema1_ID() != as.getC_AcctSchema_ID()) + return; + + StringBuffer sql = new StringBuffer ( + "UPDATE M_Product_PO po " + + "SET PriceLastInv = " + // select + + "(SELECT currencyConvert(il.PriceActual,i.C_Currency_ID,po.C_Currency_ID,i.DateInvoiced,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID) " + + "FROM C_Invoice i, C_InvoiceLine il " + + "WHERE i.C_Invoice_ID=il.C_Invoice_ID" + + " AND po.M_Product_ID=il.M_Product_ID AND po.C_BPartner_ID=i.C_BPartner_ID"); + //jz + " AND ROWNUM=1 AND i.C_Invoice_ID=").append(get_ID()).append(") ") + if (DB.isOracle()) //jz + { + sql.append(" AND ROWNUM=1 "); + } + else + { + sql.append(" AND il.C_InvoiceLine_ID = (SELECT MIN(il1.C_InvoiceLine_ID) " + + "FROM C_Invoice i1, C_InvoiceLine il1 " + + "WHERE i1.C_Invoice_ID=il1.C_Invoice_ID" + + " AND po.M_Product_ID=il1.M_Product_ID AND po.C_BPartner_ID=i1.C_BPartner_ID") + .append(" AND i1.C_Invoice_ID=").append(get_ID()).append(") "); + } + sql.append(" AND i.C_Invoice_ID=").append(get_ID()).append(") ") + // update + .append("WHERE EXISTS (SELECT * " + + "FROM C_Invoice i, C_InvoiceLine il " + + "WHERE i.C_Invoice_ID=il.C_Invoice_ID" + + " AND po.M_Product_ID=il.M_Product_ID AND po.C_BPartner_ID=i.C_BPartner_ID" + + " AND i.C_Invoice_ID=").append(get_ID()).append(")"); + int no = DB.executeUpdate(sql.toString(), getTrxName()); + log.fine("Updated=" + no); + } // updateProductPO + + /** + * Update Product Info (old). + * - Costing (PriceLastInv) + * - PO (PriceLastInv) + * @param C_AcctSchema_ID accounting schema + * @deprecated old costing + */ + private void updateProductInfo (int C_AcctSchema_ID) + { + log.fine("C_Invoice_ID=" + get_ID()); + + /** @todo Last.. would need to compare document/last updated date + * would need to maintain LastPriceUpdateDate on _PO and _Costing */ + + // update Product Costing + // requires existence of currency conversion !! + // if there are multiple lines of the same product last price uses first + // -> TotalInvAmt is sometimes NULL !! -> error + // begin globalqss 2005-10-19 + // postgresql doesn't support LIMIT on UPDATE or DELETE statements + /* + StringBuffer sql = new StringBuffer ( + "UPDATE M_Product_Costing pc " + + "SET (PriceLastInv, TotalInvAmt,TotalInvQty) = " + // select + + "(SELECT currencyConvert(il.PriceActual,i.C_Currency_ID,a.C_Currency_ID,i.DateInvoiced,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID)," + + " currencyConvert(il.LineNetAmt,i.C_Currency_ID,a.C_Currency_ID,i.DateInvoiced,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID),il.QtyInvoiced " + + "FROM C_Invoice i, C_InvoiceLine il, C_AcctSchema a " + + "WHERE i.C_Invoice_ID=il.C_Invoice_ID" + + " AND pc.M_Product_ID=il.M_Product_ID AND pc.C_AcctSchema_ID=a.C_AcctSchema_ID" + + " AND ROWNUM=1" + + " AND pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append(" AND i.C_Invoice_ID=") + .append(get_ID()).append(") ") + // update + .append("WHERE EXISTS (SELECT * " + + "FROM C_Invoice i, C_InvoiceLine il, C_AcctSchema a " + + "WHERE i.C_Invoice_ID=il.C_Invoice_ID" + + " AND pc.M_Product_ID=il.M_Product_ID AND pc.C_AcctSchema_ID=a.C_AcctSchema_ID" + + " AND pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append(" AND i.C_Invoice_ID=") + .append(get_ID()).append(")"); + */ + // the next command is equivalent and works in postgresql and oracle + StringBuffer sql = new StringBuffer ( + "UPDATE M_Product_Costing pc " + + "SET (PriceLastInv, TotalInvAmt,TotalInvQty) = " + // select + + "(SELECT currencyConvert(il.PriceActual,i.C_Currency_ID,a.C_Currency_ID,i.DateInvoiced,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID)," + + " currencyConvert(il.LineNetAmt,i.C_Currency_ID,a.C_Currency_ID,i.DateInvoiced,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID),il.QtyInvoiced " + + "FROM C_Invoice i, C_InvoiceLine il, C_AcctSchema a " + + "WHERE i.C_Invoice_ID=il.C_Invoice_ID" + + " AND il.c_invoiceline_id = (SELECT MIN(C_InvoiceLine_ID) FROM C_InvoiceLine il2" + + " WHERE il2.M_PRODUCT_ID=il.M_PRODUCT_ID AND C_Invoice_ID=") + .append(get_ID()).append(")" + + " AND pc.M_Product_ID=il.M_Product_ID AND pc.C_AcctSchema_ID=a.C_AcctSchema_ID" + + " AND pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append(" AND i.C_Invoice_ID=") + .append(get_ID()).append(") ") + // update + .append("WHERE EXISTS (SELECT * " + + "FROM C_Invoice i, C_InvoiceLine il, C_AcctSchema a " + + "WHERE i.C_Invoice_ID=il.C_Invoice_ID" + + " AND pc.M_Product_ID=il.M_Product_ID AND pc.C_AcctSchema_ID=a.C_AcctSchema_ID" + + " AND pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append(" AND i.C_Invoice_ID=") + .append(get_ID()).append(")"); + // end globalqss 2005-10-19 + int no = DB.executeUpdate(sql.toString(), getTrxName()); + log.fine("M_Product_Costing - Updated=" + no); + } // updateProductInfo + +} // Doc_Invoice diff --git a/base/src/org/compiere/acct/Doc_MatchInv.java b/base/src/org/compiere/acct/Doc_MatchInv.java new file mode 100644 index 0000000000..f6e253ce71 --- /dev/null +++ b/base/src/org/compiere/acct/Doc_MatchInv.java @@ -0,0 +1,327 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Post MatchInv Documents. + *
+ *  Table:              M_MatchInv (472)
+ *  Document Types:     MXI
+ *  
+ * Update Costing Records + * @author Jorg Janke + * @version $Id: Doc_MatchInv.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_MatchInv extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + protected Doc_MatchInv (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super(ass, MMatchInv.class, rs, DOCTYPE_MatMatchInv, trxName); + } // Doc_MatchInv + + /** Invoice Line */ + private MInvoiceLine m_invoiceLine = null; + /** Material Receipt */ + private MInOutLine m_receiptLine = null; + + private ProductCost m_pc = null; + + /** Commitments */ + private DocLine[] m_commitments = null; + + /** + * Load Specific Document Details + * @return error message or null + */ + protected String loadDocumentDetails () + { + setC_Currency_ID (Doc.NO_CURRENCY); + MMatchInv matchInv = (MMatchInv)getPO(); + setDateDoc(matchInv.getDateTrx()); + setQty (matchInv.getQty()); + // Invoice Info + int C_InvoiceLine_ID = matchInv.getC_InvoiceLine_ID(); + m_invoiceLine = new MInvoiceLine (getCtx(), C_InvoiceLine_ID, null); + // BP for NotInvoicedReceipts + int C_BPartner_ID = m_invoiceLine.getParent().getC_BPartner_ID(); + setC_BPartner_ID(C_BPartner_ID); + // + int M_InOutLine_ID = matchInv.getM_InOutLine_ID(); + m_receiptLine = new MInOutLine (getCtx(), M_InOutLine_ID, null); + // + m_pc = new ProductCost (Env.getCtx(), + getM_Product_ID(), matchInv.getM_AttributeSetInstance_ID(), null); + m_pc.setQty(getQty()); + + return null; + } // loadDocumentDetails + + + /************************************************************************** + * Get Source Currency Balance - subtracts line and tax amounts from total - no rounding + * @return Zero (always balanced) + */ + public BigDecimal getBalance() + { + return Env.ZERO; + } // getBalance + + + /** + * Create Facts (the accounting logic) for + * MXI. + * (single line) + *
+	 *      NotInvoicedReceipts     DR			(Receipt Org)
+	 *      InventoryClearing               CR
+	 *      InvoicePV               DR      CR  (difference)
+	 *  Commitment
+	 * 		Expense							CR
+	 * 		Offset					DR
+	 *  
+ * @param as accounting schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + ArrayList facts = new ArrayList(); + // Nothing to do + if (getM_Product_ID() == 0 // no Product + || getQty().signum() == 0 + || m_receiptLine.getMovementQty().signum() == 0) // Qty = 0 + { + log.fine("No Product/Qty - M_Product_ID=" + getM_Product_ID() + + ",Qty=" + getQty() + ",InOutQty=" + m_receiptLine.getMovementQty()); + return facts; + } + MMatchInv matchInv = (MMatchInv)getPO(); + + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + setC_Currency_ID (as.getC_Currency_ID()); + + /** Needs to be handeled in PO Matching as no Receipt info + if (m_pc.isService()) + { + log.fine("Service - skipped"); + return fact; + } + **/ + + + // NotInvoicedReceipt DR + // From Receipt + BigDecimal multiplier = getQty() + .divide(m_receiptLine.getMovementQty(), 12, BigDecimal.ROUND_HALF_UP) + .abs(); + FactLine dr = fact.createLine (null, + getAccount(Doc.ACCTTYPE_NotInvoicedReceipts, as), + as.getC_Currency_ID(), Env.ONE, null); // updated below + if (dr == null) + { + p_Error = "No Product Costs"; + return null; + } + dr.setQty(getQty()); + // dr.setM_Locator_ID(m_receiptLine.getM_Locator_ID()); + // MInOut receipt = m_receiptLine.getParent(); + // dr.setLocationFromBPartner(receipt.getC_BPartner_Location_ID(), true); // from Loc + // dr.setLocationFromLocator(m_receiptLine.getM_Locator_ID(), false); // to Loc + BigDecimal temp = dr.getAcctBalance(); + // Set AmtAcctCr/Dr from Receipt (sets also Project) + if (!dr.updateReverseLine (MInOut.Table_ID, // Amt updated + m_receiptLine.getM_InOut_ID(), m_receiptLine.getM_InOutLine_ID(), + multiplier)) + { + p_Error = "Mat.Receipt not posted yet"; + return null; + } + log.fine("CR - Amt(" + temp + "->" + dr.getAcctBalance() + + ") - " + dr.toString()); + + // InventoryClearing CR + // From Invoice + MAccount expense = m_pc.getAccount(ProductCost.ACCTTYPE_P_InventoryClearing, as); + if (m_pc.isService()) + expense = m_pc.getAccount(ProductCost.ACCTTYPE_P_Expense, as); + BigDecimal LineNetAmt = m_invoiceLine.getLineNetAmt(); + multiplier = getQty() + .divide(m_invoiceLine.getQtyInvoiced(), 12, BigDecimal.ROUND_HALF_UP) + .abs(); + if (multiplier.compareTo(Env.ONE) != 0) + LineNetAmt = LineNetAmt.multiply(multiplier); + if (m_pc.isService()) + LineNetAmt = dr.getAcctBalance(); // book out exact receipt amt + FactLine cr = null; + if (as.isAccrual()) + { + cr = fact.createLine (null, expense, + as.getC_Currency_ID(), null, LineNetAmt); // updated below + if (cr == null) + { + log.fine("Line Net Amt=0 - M_Product_ID=" + getM_Product_ID() + + ",Qty=" + getQty() + ",InOutQty=" + m_receiptLine.getMovementQty()); + facts.add(fact); + return facts; + } + cr.setQty(getQty().negate()); + temp = cr.getAcctBalance(); + // Set AmtAcctCr/Dr from Invoice (sets also Project) + if (as.isAccrual() && !cr.updateReverseLine (MInvoice.Table_ID, // Amt updated + m_invoiceLine.getC_Invoice_ID(), m_invoiceLine.getC_InvoiceLine_ID(), multiplier)) + { + p_Error = "Invoice not posted yet"; + return null; + } + log.fine("DR - Amt(" + temp + "->" + cr.getAcctBalance() + + ") - " + cr.toString()); + } + else // Cash Acct + { + MInvoice invoice = m_invoiceLine.getParent(); + if (as.getC_Currency_ID() == invoice.getC_Currency_ID()) + LineNetAmt = MConversionRate.convert(getCtx(), LineNetAmt, + invoice.getC_Currency_ID(), as.getC_Currency_ID(), + invoice.getDateAcct(), invoice.getC_ConversionType_ID(), + invoice.getAD_Client_ID(), invoice.getAD_Org_ID()); + cr = fact.createLine (null, expense, + as.getC_Currency_ID(), null, LineNetAmt); + cr.setQty(getQty().multiply(multiplier).negate()); + } + cr.setC_Activity_ID(m_invoiceLine.getC_Activity_ID()); + cr.setC_Campaign_ID(m_invoiceLine.getC_Campaign_ID()); + cr.setC_Project_ID(m_invoiceLine.getC_Project_ID()); + cr.setC_UOM_ID(m_invoiceLine.getC_UOM_ID()); + cr.setUser1_ID(m_invoiceLine.getUser1_ID()); + cr.setUser2_ID(m_invoiceLine.getUser2_ID()); + + + // Invoice Price Variance difference + BigDecimal ipv = cr.getAcctBalance().add(dr.getAcctBalance()).negate(); + if (ipv.signum() != 0) + { + FactLine pv = fact.createLine(null, + m_pc.getAccount(ProductCost.ACCTTYPE_P_IPV, as), + as.getC_Currency_ID(), ipv); + pv.setC_Activity_ID(m_invoiceLine.getC_Activity_ID()); + pv.setC_Campaign_ID(m_invoiceLine.getC_Campaign_ID()); + pv.setC_Project_ID(m_invoiceLine.getC_Project_ID()); + pv.setC_UOM_ID(m_invoiceLine.getC_UOM_ID()); + pv.setUser1_ID(m_invoiceLine.getUser1_ID()); + pv.setUser2_ID(m_invoiceLine.getUser2_ID()); + } + log.fine("IPV=" + ipv + "; Balance=" + fact.getSourceBalance()); + + // Cost Detail Record - data from Expense/IncClearing (CR) record + MCostDetail.createInvoice(as, getAD_Org_ID(), + getM_Product_ID(), matchInv.getM_AttributeSetInstance_ID(), + m_invoiceLine.getC_InvoiceLine_ID(), 0, // No cost element + cr.getAcctBalance().negate(), getQty(), // correcting + getDescription(), getTrxName()); + + // Update Costing + updateProductInfo(as.getC_AcctSchema_ID(), + MAcctSchema.COSTINGMETHOD_StandardCosting.equals(as.getCostingMethod())); + // + facts.add(fact); + + /** Commitment release ****/ + if (as.isAccrual() && as.isCreateCommitment()) + { + fact = Doc_Order.getCommitmentRelease(as, this, + getQty(), m_invoiceLine.getC_InvoiceLine_ID(), Env.ONE); + if (fact == null) + return null; + facts.add(fact); + } // Commitment + + return facts; + } // createFact + + /** + * Update Product Info (old). + * - Costing (CostStandardCumQty, CostStandardCumAmt, CostAverageCumQty, CostAverageCumAmt) + * @param C_AcctSchema_ID accounting schema + * @param standardCosting true if std costing + * @return true if updated + * @deprecated old costing + */ + private boolean updateProductInfo (int C_AcctSchema_ID, boolean standardCosting) + { + log.fine("M_MatchInv_ID=" + get_ID()); + + // update Product Costing Qty/Amt + // requires existence of currency conversion !! + StringBuffer sql = new StringBuffer ( + "UPDATE M_Product_Costing pc " + + "SET (CostStandardCumQty,CostStandardCumAmt, CostAverageCumQty,CostAverageCumAmt) = " + + "(SELECT pc.CostStandardCumQty + m.Qty," + + "pc.CostStandardCumAmt + currencyConvert(il.PriceActual,i.C_Currency_ID,a.C_Currency_ID,i.DateInvoiced,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID)*m.Qty, " + + "pc.CostAverageCumQty + m.Qty," + + "pc.CostAverageCumAmt + currencyConvert(il.PriceActual,i.C_Currency_ID,a.C_Currency_ID,i.DateInvoiced,i.C_ConversionType_ID,i.AD_Client_ID,i.AD_Org_ID)*m.Qty " + + "FROM M_MatchInv m" + + " INNER JOIN C_InvoiceLine il ON (m.C_InvoiceLine_ID=il.C_InvoiceLine_ID)" + + " INNER JOIN C_Invoice i ON (il.C_Invoice_ID=i.C_Invoice_ID)," + + " C_AcctSchema a " + + "WHERE pc.C_AcctSchema_ID=a.C_AcctSchema_ID" + + " AND pc.M_Product_ID=m.M_Product_ID" + + " AND m.M_MatchInv_ID=").append(get_ID()).append(")" + // + + "WHERE pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append( + " AND EXISTS (SELECT * FROM M_MatchInv m " + + "WHERE pc.M_Product_ID=m.M_Product_ID" + + " AND m.M_MatchInv_ID=").append(get_ID()).append(")"); + int no = DB.executeUpdate(sql.toString(), getTrxName()); + log.fine("M_Product_Costing - Qty/Amt Updated #=" + no); + + // Update Average Cost + sql = new StringBuffer ( + "UPDATE M_Product_Costing " + + "SET CostAverage = CostAverageCumAmt/DECODE(CostAverageCumQty, 0,1, CostAverageCumQty) " + + "WHERE C_AcctSchema_ID=").append(C_AcctSchema_ID) + .append(" AND M_Product_ID=").append(getM_Product_ID()); + no = DB.executeUpdate(sql.toString(), getTrxName()); + log.fine("M_Product_Costing - AvgCost Updated #=" + no); + + + // Update Current Cost + if (!standardCosting) + { + sql = new StringBuffer ( + "UPDATE M_Product_Costing " + + "SET CurrentCostPrice = CostAverage " + + "WHERE C_AcctSchema_ID=").append(C_AcctSchema_ID) + .append(" AND M_Product_ID=").append(getM_Product_ID()); + no = DB.executeUpdate(sql.toString(), getTrxName()); + log.fine("M_Product_Costing - CurrentCost Updated=" + no); + } + return true; + } // updateProductInfo + +} // Doc_MatchInv diff --git a/base/src/org/compiere/acct/Doc_MatchPO.java b/base/src/org/compiere/acct/Doc_MatchPO.java new file mode 100644 index 0000000000..eef7c8cb26 --- /dev/null +++ b/base/src/org/compiere/acct/Doc_MatchPO.java @@ -0,0 +1,251 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.logging.*; + +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Post MatchPO Documents. + *
+ *  Table:              C_MatchPO (473)
+ *  Document Types:     MXP
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_MatchPO.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_MatchPO extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + protected Doc_MatchPO (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super(ass, MMatchPO.class, rs, DOCTYPE_MatMatchPO, trxName); + } // Doc_MatchPO + + private int m_C_OrderLine_ID = 0; + private MOrderLine m_oLine = null; + // + private int m_M_InOutLine_ID = 0; + private int m_C_InvoiceLine_ID = 0; + private ProductCost m_pc; + private int m_M_AttributeSetInstance_ID = 0; + + /** + * Load Specific Document Details + * @return error message or null + */ + protected String loadDocumentDetails () + { + setC_Currency_ID (Doc.NO_CURRENCY); + MMatchPO matchPO = (MMatchPO)getPO(); + setDateDoc(matchPO.getDateTrx()); + // + m_M_AttributeSetInstance_ID = matchPO.getM_AttributeSetInstance_ID(); + setQty (matchPO.getQty()); + // + m_C_OrderLine_ID = matchPO.getC_OrderLine_ID(); + m_oLine = new MOrderLine (getCtx(), m_C_OrderLine_ID, getTrxName()); + // + m_M_InOutLine_ID = matchPO.getM_InOutLine_ID(); + m_C_InvoiceLine_ID = matchPO.getC_InvoiceLine_ID(); + // + m_pc = new ProductCost (Env.getCtx(), + getM_Product_ID(), m_M_AttributeSetInstance_ID, getTrxName()); + m_pc.setQty(getQty()); + return null; + } // loadDocumentDetails + + + /************************************************************************** + * Get Source Currency Balance - subtracts line and tax amounts from total - no rounding + * @return Zero - always balanced + */ + public BigDecimal getBalance() + { + return Env.ZERO; + } // getBalance + + + /** + * Create Facts (the accounting logic) for + * MXP. + *
+	 *      Product PPV     
+	 *      PPV_Offset                  
+	 *  
+ * @param as accounting schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + ArrayList facts = new ArrayList(); + // + if (getM_Product_ID() == 0 // Nothing to do if no Product + || getQty().signum() == 0 + || m_M_InOutLine_ID == 0) // No posting if not matched to Shipment + { + log.fine("No Product/Qty - M_Product_ID=" + getM_Product_ID() + + ",Qty=" + getQty()); + return facts; + } + + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + setC_Currency_ID(as.getC_Currency_ID()); + + // Purchase Order Line + BigDecimal poCost = m_oLine.getPriceCost(); + if (poCost == null || poCost.signum() == 0) + poCost = m_oLine.getPriceActual(); + poCost = poCost.multiply(getQty()); // Delivered so far + // Different currency + if (m_oLine.getC_Currency_ID() != as.getC_Currency_ID()) + { + MOrder order = m_oLine.getParent(); + BigDecimal rate = MConversionRate.getRate( + order.getC_Currency_ID(), as.getC_Currency_ID(), + order.getDateAcct(), order.getC_ConversionType_ID(), + m_oLine.getAD_Client_ID(), m_oLine.getAD_Org_ID()); + if (rate == null) + { + p_Error = "Purchase Order not convertible - " + as.getName(); + return null; + } + poCost = poCost.multiply(rate); + if (poCost.scale() > as.getCostingPrecision()) + poCost = poCost.setScale(as.getCostingPrecision(), BigDecimal.ROUND_HALF_UP); + } + + // Create PO Cost Detail Record firs + MCostDetail.createOrder(as, m_oLine.getAD_Org_ID(), + getM_Product_ID(), m_M_AttributeSetInstance_ID, + m_C_OrderLine_ID, 0, // no cost element + poCost, getQty(), // Delivered + m_oLine.getDescription(), getTrxName()); + + // Calculate PPV for standard costing + String costingMethod = as.getCostingMethod(); + MProduct product = MProduct.get(getCtx(), getM_Product_ID()); + MProductCategoryAcct pca = MProductCategoryAcct.get(getCtx(), + product.getM_Product_Category_ID(), as.getC_AcctSchema_ID(), getTrxName()); + if (pca.getCostingMethod() != null) + costingMethod = pca.getCostingMethod(); + + //get standard cost and also makesure cost for other costing method is updated + BigDecimal costs = m_pc.getProductCosts(as, getAD_Org_ID(), + MAcctSchema.COSTINGMETHOD_StandardCosting, m_C_OrderLine_ID, false); // non-zero costs + + if (MAcctSchema.COSTINGMETHOD_StandardCosting.equals(costingMethod)) + { + // No Costs yet - no PPV + if (costs == null || costs.signum() == 0) + { + p_Error = "Resubmit - No Costs for " + product.getName(); + log.log(Level.SEVERE, p_Error); + return null; + } + + // Difference + BigDecimal difference = poCost.subtract(costs); + // Nothing to post + if (difference.signum() == 0) + { + log.log(Level.FINE, "No Cost Difference for M_Product_ID=" + getM_Product_ID()); + return facts; + } + + // Product PPV + FactLine cr = fact.createLine(null, + m_pc.getAccount(ProductCost.ACCTTYPE_P_PPV, as), + as.getC_Currency_ID(), difference); + if (cr != null) + { + cr.setQty(getQty()); + cr.setC_BPartner_ID(m_oLine.getC_BPartner_ID()); + cr.setC_Activity_ID(m_oLine.getC_Activity_ID()); + cr.setC_Campaign_ID(m_oLine.getC_Campaign_ID()); + cr.setC_Project_ID(m_oLine.getC_Project_ID()); + cr.setC_UOM_ID(m_oLine.getC_UOM_ID()); + cr.setUser1_ID(m_oLine.getUser1_ID()); + cr.setUser2_ID(m_oLine.getUser2_ID()); + } + + // PPV Offset + FactLine dr = fact.createLine(null, + getAccount(Doc.ACCTTYPE_PPVOffset, as), + as.getC_Currency_ID(), difference.negate()); + if (dr != null) + { + dr.setQty(getQty().negate()); + dr.setC_BPartner_ID(m_oLine.getC_BPartner_ID()); + dr.setC_Activity_ID(m_oLine.getC_Activity_ID()); + dr.setC_Campaign_ID(m_oLine.getC_Campaign_ID()); + dr.setC_Project_ID(m_oLine.getC_Project_ID()); + dr.setC_UOM_ID(m_oLine.getC_UOM_ID()); + dr.setUser1_ID(m_oLine.getUser1_ID()); + dr.setUser2_ID(m_oLine.getUser2_ID()); + } + + // + facts.add(fact); + return facts; + } + else + { + return facts; + } + } // createFact + + /** + * Update Product Info (old). + * - Costing (CostStandardPOQty, CostStandardPOAmt) + * @param C_AcctSchema_ID accounting schema + * @deprecated old costing + */ + private void updateProductInfo (int C_AcctSchema_ID) + { + log.fine("M_MatchPO_ID=" + get_ID()); + + // update Product Costing + // requires existence of currency conversion !! + StringBuffer sql = new StringBuffer ( + "UPDATE M_Product_Costing pc " + + "SET (CostStandardPOQty,CostStandardPOAmt) = " + + "(SELECT CostStandardPOQty + m.Qty," + + " CostStandardPOAmt + currencyConvert(ol.PriceActual,ol.C_Currency_ID,a.C_Currency_ID,ol.DateOrdered,null,ol.AD_Client_ID,ol.AD_Org_ID)*m.Qty " + + "FROM M_MatchPO m, C_OrderLine ol, C_AcctSchema a " + + "WHERE m.C_OrderLine_ID=ol.C_OrderLine_ID" + + " AND pc.M_Product_ID=ol.M_Product_ID" + + " AND pc.C_AcctSchema_ID=a.C_AcctSchema_ID" + + "AND m.M_MatchPO_ID=").append(get_ID()).append(") ") + .append("WHERE pc.C_AcctSchema_ID=").append(C_AcctSchema_ID) + .append(" AND pc.M_Product_ID=").append(getM_Product_ID()); + int no = DB.executeUpdate(sql.toString(), getTrxName()); + log.fine("M_Product_Costing - Updated=" + no); + } // updateProductInfo + +} // Doc_MatchPO diff --git a/base/src/org/compiere/acct/Doc_Movement.java b/base/src/org/compiere/acct/Doc_Movement.java new file mode 100644 index 0000000000..5a2ab5b025 --- /dev/null +++ b/base/src/org/compiere/acct/Doc_Movement.java @@ -0,0 +1,179 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; + +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Post Invoice Documents. + *
+ *  Table:              M_Movement (323)
+ *  Document Types:     MMM
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_Movement.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_Movement extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + public Doc_Movement (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super (ass, MMovement.class, rs, DOCTYPE_MatMovement, trxName); + } // Doc_Movement + + /** + * Load Document Details + * @return error message or null + */ + protected String loadDocumentDetails() + { + setC_Currency_ID(NO_CURRENCY); + MMovement move = (MMovement)getPO(); + setDateDoc (move.getMovementDate()); + setDateAcct(move.getMovementDate()); + // Contained Objects + p_lines = loadLines(move); + log.fine("Lines=" + p_lines.length); + return null; + } // loadDocumentDetails + + /** + * Load Invoice Line + * @param move move + * @return document lines (DocLine_Material) + */ + private DocLine[] loadLines(MMovement move) + { + ArrayList list = new ArrayList(); + MMovementLine[] lines = move.getLines(false); + for (int i = 0; i < lines.length; i++) + { + MMovementLine line = lines[i]; + DocLine docLine = new DocLine (line, this); + docLine.setQty(line.getMovementQty(), false); + // + log.fine(docLine.toString()); + list.add (docLine); + } + + // Return Array + DocLine[] dls = new DocLine[list.size()]; + list.toArray(dls); + return dls; + } // loadLines + + /** + * Get Balance + * @return balance (ZERO) - always balanced + */ + public BigDecimal getBalance() + { + BigDecimal retValue = Env.ZERO; + return retValue; + } // getBalance + + /** + * Create Facts (the accounting logic) for + * MMM. + *
+	 *  Movement
+	 *      Inventory       DR      CR
+	 *      InventoryTo     DR      CR
+	 *  
+ * @param as account schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + setC_Currency_ID(as.getC_Currency_ID()); + + // Line pointers + FactLine dr = null; + FactLine cr = null; + + for (int i = 0; i < p_lines.length; i++) + { + DocLine line = p_lines[i]; + BigDecimal costs = line.getProductCosts(as, line.getAD_Org_ID(), false); + + // ** Inventory DR CR + dr = fact.createLine(line, + line.getAccount(ProductCost.ACCTTYPE_P_Asset, as), + as.getC_Currency_ID(), costs.negate()); // from (-) CR + if (dr == null) + continue; + dr.setM_Locator_ID(line.getM_Locator_ID()); + dr.setQty(line.getQty().negate()); // outgoing + + // ** InventoryTo DR CR + cr = fact.createLine(line, + line.getAccount(ProductCost.ACCTTYPE_P_Asset, as), + as.getC_Currency_ID(), costs); // to (+) DR + if (cr == null) + continue; + cr.setM_Locator_ID(line.getM_LocatorTo_ID()); + cr.setQty(line.getQty()); + + // Only for between-org movements + if (dr.getAD_Org_ID() != cr.getAD_Org_ID()) + { + String costingLevel = as.getCostingLevel(); + MProductCategoryAcct pca = MProductCategoryAcct.get(getCtx(), + line.getProduct().getM_Product_Category_ID(), + as.getC_AcctSchema_ID(), getTrxName()); + if (pca.getCostingLevel() != null) + costingLevel = pca.getCostingLevel(); + if (!MAcctSchema.COSTINGLEVEL_Organization.equals(costingLevel)) + continue; + // + String description = line.getDescription(); + if (description == null) + description = ""; + // Cost Detail From + MCostDetail.createMovement(as, dr.getAD_Org_ID(), // locator org + line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(), + line.get_ID(), 0, + costs.negate(), line.getQty().negate(), true, + description + "(|->)", getTrxName()); + // Cost Detail To + MCostDetail.createMovement(as, cr.getAD_Org_ID(), // locator org + line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(), + line.get_ID(), 0, + costs, line.getQty(), false, + description + "(|<-)", getTrxName()); + } + } + + // + ArrayList facts = new ArrayList(); + facts.add(fact); + return facts; + } // createFact + +} // Doc_Movement diff --git a/base/src/org/compiere/acct/Doc_Order.java b/base/src/org/compiere/acct/Doc_Order.java new file mode 100644 index 0000000000..07cc7994da --- /dev/null +++ b/base/src/org/compiere/acct/Doc_Order.java @@ -0,0 +1,646 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.logging.*; +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Post Order Documents. + *
+ *  Table:              C_Order (259)
+ *  Document Types:     SOO, POO
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_Order.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_Order extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + protected Doc_Order (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super (ass, MOrder.class, rs, null, trxName); + } // Doc_Order + + /** Contained Optional Tax Lines */ + private DocTax[] m_taxes = null; + /** Requisitions */ + private DocLine[] m_requisitions = null; + /** Order Currency Precision */ + private int m_precision = -1; + + /** + * Load Specific Document Details + * @return error message or null + */ + protected String loadDocumentDetails () + { + MOrder order = (MOrder)getPO(); + setDateDoc(order.getDateOrdered()); + setIsTaxIncluded(order.isTaxIncluded()); + // Amounts + setAmount(AMTTYPE_Gross, order.getGrandTotal()); + setAmount(AMTTYPE_Net, order.getTotalLines()); + setAmount(AMTTYPE_Charge, order.getChargeAmt()); + + // Contained Objects + m_taxes = loadTaxes(); + p_lines = loadLines(order); + // log.fine( "Lines=" + p_lines.length + ", Taxes=" + m_taxes.length); + return null; + } // loadDocumentDetails + + + /** + * Load Invoice Line + * @param order order + * @return DocLine Array + */ + private DocLine[] loadLines(MOrder order) + { + ArrayList list = new ArrayList(); + MOrderLine[] lines = order.getLines(); + for (int i = 0; i < lines.length; i++) + { + MOrderLine line = lines[i]; + DocLine docLine = new DocLine (line, this); + BigDecimal Qty = line.getQtyOrdered(); + docLine.setQty(Qty, order.isSOTrx()); + // + BigDecimal PriceActual = line.getPriceActual(); + BigDecimal PriceCost = null; + if (getDocumentType().equals(DOCTYPE_POrder)) // PO + PriceCost = line.getPriceCost(); + BigDecimal LineNetAmt = null; + if (PriceCost != null && PriceCost.signum() != 0) + LineNetAmt = Qty.multiply(PriceCost); + else + LineNetAmt = line.getLineNetAmt(); + docLine.setAmount (LineNetAmt); // DR + BigDecimal PriceList = line.getPriceList(); + int C_Tax_ID = docLine.getC_Tax_ID(); + // Correct included Tax + if (isTaxIncluded() && C_Tax_ID != 0) + { + MTax tax = MTax.get(getCtx(), C_Tax_ID); + if (!tax.isZeroTax()) + { + BigDecimal LineNetAmtTax = tax.calculateTax(LineNetAmt, true, getStdPrecision()); + log.fine("LineNetAmt=" + LineNetAmt + " - Tax=" + LineNetAmtTax); + LineNetAmt = LineNetAmt.subtract(LineNetAmtTax); + for (int t = 0; t < m_taxes.length; t++) + { + if (m_taxes[t].getC_Tax_ID() == C_Tax_ID) + { + m_taxes[t].addIncludedTax(LineNetAmtTax); + break; + } + } + BigDecimal PriceListTax = tax.calculateTax(PriceList, true, getStdPrecision()); + PriceList = PriceList.subtract(PriceListTax); + } + } // correct included Tax + + docLine.setAmount (LineNetAmt, PriceList, Qty); + list.add(docLine); + } + + // Return Array + DocLine[] dl = new DocLine[list.size()]; + list.toArray(dl); + return dl; + } // loadLines + + + /** + * Load Requisitions + * @return requisition lines of Order + */ + private DocLine[] loadRequisitions () + { + MOrder order = (MOrder)getPO(); + MOrderLine[] oLines = order.getLines(); + HashMap qtys = new HashMap(); + for (int i = 0; i < oLines.length; i++) + { + MOrderLine line = oLines[i]; + qtys.put(new Integer(line.getC_OrderLine_ID()), line.getQtyOrdered()); + } + // + ArrayList list = new ArrayList(); + String sql = "SELECT * FROM M_RequisitionLine rl " + + "WHERE EXISTS (SELECT * FROM C_Order o " + + " INNER JOIN C_OrderLine ol ON (o.C_Order_ID=ol.C_Order_ID) " + + "WHERE ol.C_OrderLine_ID=rl.C_OrderLine_ID" + + " AND o.C_Order_ID=?) " + + "ORDER BY rl.C_OrderLine_ID"; + PreparedStatement pstmt = null; + try + { + pstmt = DB.prepareStatement (sql, null); + pstmt.setInt (1, order.getC_Order_ID()); + ResultSet rs = pstmt.executeQuery (); + while (rs.next ()) + { + MRequisitionLine line = new MRequisitionLine (getCtx(), rs, null); + DocLine docLine = new DocLine (line, this); + // Quantity - not more then OrderLine + // Issue: Split of Requisition to multiple POs & different price + Integer key = new Integer(line.getC_OrderLine_ID()); + BigDecimal maxQty = qtys.get(key); + BigDecimal Qty = line.getQty().max(maxQty); + if (Qty.signum() == 0) + continue; + docLine.setQty (Qty, false); + qtys.put(key, maxQty.subtract(Qty)); + // + BigDecimal PriceActual = line.getPriceActual(); + BigDecimal LineNetAmt = line.getLineNetAmt(); + if (line.getQty().compareTo(Qty) != 0) + LineNetAmt = PriceActual.multiply(Qty); + docLine.setAmount (LineNetAmt); // DR + list.add (docLine); + } + rs.close (); + pstmt.close (); + pstmt = null; + } + catch (Exception e) + { + log.log (Level.SEVERE, sql, e); + } + try + { + if (pstmt != null) + pstmt.close (); + pstmt = null; + } + catch (Exception e) + { + pstmt = null; + } + + // Return Array + DocLine[] dls = new DocLine[list.size ()]; + list.toArray (dls); + return dls; + } // loadRequisitions + + + /** + * Get Currency Precision + * @return precision + */ + private int getStdPrecision() + { + if (m_precision == -1) + m_precision = MCurrency.getStdPrecision(getCtx(), getC_Currency_ID()); + return m_precision; + } // getPrecision + + /** + * Load Invoice Taxes + * @return DocTax Array + */ + private DocTax[] loadTaxes() + { + ArrayList list = new ArrayList(); + String sql = "SELECT it.C_Tax_ID, t.Name, t.Rate, it.TaxBaseAmt, it.TaxAmt, t.IsSalesTax " + + "FROM C_Tax t, C_OrderTax it " + + "WHERE t.C_Tax_ID=it.C_Tax_ID AND it.C_Order_ID=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, getTrxName()); + pstmt.setInt(1, get_ID()); + ResultSet rs = pstmt.executeQuery(); + // + while (rs.next()) + { + int C_Tax_ID = rs.getInt(1); + String name = rs.getString(2); + BigDecimal rate = rs.getBigDecimal(3); + BigDecimal taxBaseAmt = rs.getBigDecimal(4); + BigDecimal amount = rs.getBigDecimal(5); + boolean salesTax = "Y".equals(rs.getString(6)); + // + DocTax taxLine = new DocTax(C_Tax_ID, name, rate, + taxBaseAmt, amount, salesTax); + list.add(taxLine); + } + // + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + + // Return Array + DocTax[] tl = new DocTax[list.size()]; + list.toArray(tl); + return tl; + } // loadTaxes + + + /************************************************************************** + * Get Source Currency Balance - subtracts line and tax amounts from total - no rounding + * @return positive amount, if total invoice is bigger than lines + */ + public BigDecimal getBalance() + { + BigDecimal retValue = new BigDecimal(0.0); + StringBuffer sb = new StringBuffer (" ["); + // Total + retValue = retValue.add(getAmount(Doc.AMTTYPE_Gross)); + sb.append(getAmount(Doc.AMTTYPE_Gross)); + // - Header Charge + retValue = retValue.subtract(getAmount(Doc.AMTTYPE_Charge)); + sb.append("-").append(getAmount(Doc.AMTTYPE_Charge)); + // - Tax + if (m_taxes != null) + { + for (int i = 0; i < m_taxes.length; i++) + { + retValue = retValue.subtract(m_taxes[i].getAmount()); + sb.append("-").append(m_taxes[i].getAmount()); + } + } + // - Lines + if (p_lines != null) + { + for (int i = 0; i < p_lines.length; i++) + { + retValue = retValue.subtract(p_lines[i].getAmtSource()); + sb.append("-").append(p_lines[i].getAmtSource()); + } + sb.append("]"); + } + // + if (retValue.signum() != 0 // Sum of Cost(vs. Price) in lines may not add up + && getDocumentType().equals(DOCTYPE_POrder)) // PO + { + log.fine(toString() + " Balance=" + retValue + sb.toString() + " (ignored)"); + retValue = Env.ZERO; + } + else + log.fine(toString() + " Balance=" + retValue + sb.toString()); + return retValue; + } // getBalance + + + /************************************************************************* + * Create Facts (the accounting logic) for + * SOO, POO. + *
+	 *  Reservation (release)
+	 * 		Expense			DR
+	 * 		Offset					CR
+	 *  Commitment
+	 *  (to be released by Invoice Matching)
+	 * 		Expense					CR
+	 * 		Offset			DR
+	 *  
+ * @param as accounting schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + ArrayList facts = new ArrayList(); + // Purchase Order + if (getDocumentType().equals(DOCTYPE_POrder)) + { + updateProductPO(as); + updateProductInfo(as.getC_AcctSchema_ID()); + + BigDecimal grossAmt = getAmount(Doc.AMTTYPE_Gross); + + // Commitment + FactLine fl = null; + if (as.isCreateCommitment()) + { + Fact fact = new Fact(this, as, Fact.POST_Commitment); + BigDecimal total = Env.ZERO; + for (int i = 0; i < p_lines.length; i++) + { + DocLine line = p_lines[i]; + BigDecimal cost = line.getAmtSource(); + total = total.add(cost); + + // Account + MAccount expense = line.getAccount(ProductCost.ACCTTYPE_P_Expense, as); + fl = fact.createLine (line, expense, + getC_Currency_ID(), cost, null); + } + // Offset + MAccount offset = getAccount(ACCTTYPE_CommitmentOffset, as); + if (offset == null) + { + p_Error = "@NotFound@ @CommitmentOffset_Acct@"; + log.log(Level.SEVERE, p_Error); + return null; + } + fact.createLine (null, offset, + getC_Currency_ID(), null, total); + // + facts.add(fact); + } + + // Reverse Reservation + if (as.isCreateReservation()) + { + Fact fact = new Fact(this, as, Fact.POST_Reservation); + BigDecimal total = Env.ZERO; + if (m_requisitions == null) + m_requisitions = loadRequisitions(); + for (int i = 0; i < m_requisitions.length; i++) + { + DocLine line = m_requisitions[i]; + BigDecimal cost = line.getAmtSource(); + total = total.add(cost); + + // Account + MAccount expense = line.getAccount(ProductCost.ACCTTYPE_P_Expense, as); + fl = fact.createLine (line, expense, + getC_Currency_ID(), null, cost); + } + // Offset + MAccount offset = getAccount(ACCTTYPE_CommitmentOffset, as); + if (offset == null) + { + p_Error = "@NotFound@ @CommitmentOffset_Acct@"; + log.log(Level.SEVERE, p_Error); + return null; + } + fact.createLine (null, offset, + getC_Currency_ID(), total, null); + // + facts.add(fact); + } // reservations + } + // SO + return facts; + } // createFact + + + /** + * Update ProductPO PriceLastPO + * @param as accounting schema + */ + private void updateProductPO(MAcctSchema as) + { + MClientInfo ci = MClientInfo.get(getCtx(), as.getAD_Client_ID()); + if (ci.getC_AcctSchema1_ID() != as.getC_AcctSchema_ID()) + return; + + StringBuffer sql = new StringBuffer ( + "UPDATE M_Product_PO po " + + "SET PriceLastPO = (SELECT currencyConvert(ol.PriceActual,ol.C_Currency_ID,po.C_Currency_ID,o.DateOrdered,o.C_ConversionType_ID,o.AD_Client_ID,o.AD_Org_ID) " + + "FROM C_Order o, C_OrderLine ol " + + "WHERE o.C_Order_ID=ol.C_Order_ID" + + " AND po.M_Product_ID=ol.M_Product_ID AND po.C_BPartner_ID=o.C_BPartner_ID "); + //jz + " AND ROWNUM=1 AND o.C_Order_ID=").append(get_ID()).append(") ") + if (DB.isOracle()) //jz + { + sql.append(" AND ROWNUM=1 "); + } + else + sql.append(" AND ol.C_OrderLine_ID = (SELECT MIN(ol1.C_OrderLine_ID) " + + "FROM C_Order o1, C_OrderLine ol1 " + + "WHERE o1.C_Order_ID=ol1.C_Order_ID" + + " AND po.M_Product_ID=ol1.M_Product_ID AND po.C_BPartner_ID=o1.C_BPartner_ID") + .append(" AND o1.C_Order_ID=").append(get_ID()).append(") "); + sql.append(" AND o.C_Order_ID=").append(get_ID()).append(") ") + .append("WHERE EXISTS (SELECT * " + + "FROM C_Order o, C_OrderLine ol " + + "WHERE o.C_Order_ID=ol.C_Order_ID" + + " AND po.M_Product_ID=ol.M_Product_ID AND po.C_BPartner_ID=o.C_BPartner_ID" + + " AND o.C_Order_ID=").append(get_ID()).append(")"); + int no = DB.executeUpdate(sql.toString(), getTrxName()); + log.fine("Updated=" + no); + } // updateProductPO + + + /** + * Get Commitments + * @param doc document + * @param maxQty Qty invoiced/matched + * @param C_InvoiceLine_ID invoice line + * @return commitments (order lines) + */ + protected static DocLine[] getCommitments(Doc doc, BigDecimal maxQty, int C_InvoiceLine_ID) + { + int precision = -1; + // + ArrayList list = new ArrayList(); + String sql = "SELECT * FROM C_OrderLine ol " + + "WHERE EXISTS " + + "(SELECT * FROM C_InvoiceLine il " + + "WHERE il.C_OrderLine_ID=ol.C_OrderLine_ID" + + " AND il.C_InvoiceLine_ID=?)" + + " OR EXISTS " + + "(SELECT * FROM M_MatchPO po " + + "WHERE po.C_OrderLine_ID=ol.C_OrderLine_ID" + + " AND po.C_InvoiceLine_ID=?)"; + PreparedStatement pstmt = null; + try + { + pstmt = DB.prepareStatement (sql, null); + pstmt.setInt (1, C_InvoiceLine_ID); + pstmt.setInt (2, C_InvoiceLine_ID); + ResultSet rs = pstmt.executeQuery (); + while (rs.next ()) + { + if (maxQty.signum() == 0) + continue; + MOrderLine line = new MOrderLine (doc.getCtx(), rs, null); + DocLine docLine = new DocLine (line, doc); + // Currency + if (precision == -1) + { + doc.setC_Currency_ID(docLine.getC_Currency_ID()); + precision = MCurrency.getStdPrecision(doc.getCtx(), docLine.getC_Currency_ID()); + } + // Qty + BigDecimal Qty = line.getQtyOrdered().max(maxQty); + docLine.setQty(Qty, false); + // + BigDecimal PriceActual = line.getPriceActual(); + BigDecimal PriceCost = line.getPriceCost(); + BigDecimal LineNetAmt = null; + if (PriceCost != null && PriceCost.signum() != 0) + LineNetAmt = Qty.multiply(PriceCost); + else if (Qty.equals(maxQty)) + LineNetAmt = line.getLineNetAmt(); + else + LineNetAmt = Qty.multiply(PriceActual); + maxQty = maxQty.subtract(Qty); + + docLine.setAmount (LineNetAmt); // DR + BigDecimal PriceList = line.getPriceList(); + int C_Tax_ID = docLine.getC_Tax_ID(); + // Correct included Tax + if (C_Tax_ID != 0 && line.getParent().isTaxIncluded()) + { + MTax tax = MTax.get(doc.getCtx(), C_Tax_ID); + if (!tax.isZeroTax()) + { + BigDecimal LineNetAmtTax = tax.calculateTax(LineNetAmt, true, precision); + s_log.fine("LineNetAmt=" + LineNetAmt + " - Tax=" + LineNetAmtTax); + LineNetAmt = LineNetAmt.subtract(LineNetAmtTax); + BigDecimal PriceListTax = tax.calculateTax(PriceList, true, precision); + PriceList = PriceList.subtract(PriceListTax); + } + } // correct included Tax + + docLine.setAmount (LineNetAmt, PriceList, Qty); + list.add(docLine); + } + rs.close (); + pstmt.close (); + pstmt = null; + } + catch (Exception e) + { + s_log.log (Level.SEVERE, sql, e); + } + try + { + if (pstmt != null) + pstmt.close (); + pstmt = null; + } + catch (Exception e) + { + pstmt = null; + } + + // Return Array + DocLine[] dl = new DocLine[list.size()]; + list.toArray(dl); + return dl; + } // getCommitments + + /** + * Get Commitment Release. + * Called from MatchInv for accrual and Allocation for Cash Based + * @param as accounting schema + * @param doc doc + * @param Qty qty invoiced/matched + * @param C_InvoiceLine_ID line + * @param multiplier 1 for accrual + * @return Fact + */ + protected static Fact getCommitmentRelease(MAcctSchema as, Doc doc, + BigDecimal Qty, int C_InvoiceLine_ID, BigDecimal multiplier) + { + Fact fact = new Fact(doc, as, Fact.POST_Commitment); + DocLine[] commitments = Doc_Order.getCommitments(doc, Qty, + C_InvoiceLine_ID); + + BigDecimal total = Env.ZERO; + FactLine fl = null; + int C_Currency_ID = -1; + for (int i = 0; i < commitments.length; i++) + { + DocLine line = commitments[i]; + if (C_Currency_ID == -1) + C_Currency_ID = line.getC_Currency_ID(); + else if (C_Currency_ID != line.getC_Currency_ID()) + { + doc.p_Error = "Different Currencies of Order Lines"; + s_log.log(Level.SEVERE, doc.p_Error); + return null; + } + BigDecimal cost = line.getAmtSource().multiply(multiplier); + total = total.add(cost); + + // Account + MAccount expense = line.getAccount(ProductCost.ACCTTYPE_P_Expense, as); + fl = fact.createLine (line, expense, + C_Currency_ID, null, cost); + } + // Offset + MAccount offset = doc.getAccount(ACCTTYPE_CommitmentOffset, as); + if (offset == null) + { + doc.p_Error = "@NotFound@ @CommitmentOffset_Acct@"; + s_log.log(Level.SEVERE, doc.p_Error); + return null; + } + fact.createLine (null, offset, + C_Currency_ID, total, null); + return fact; + } // getCommitmentRelease + + + /************************************************************************** + * Update Product Info (old) + * - Costing (PriceLastPO) + * - PO (PriceLastPO) + * @param C_AcctSchema_ID accounting schema + * @deprecated old costing + */ + private void updateProductInfo (int C_AcctSchema_ID) + { + log.fine("C_Order_ID=" + get_ID()); + + /** @todo Last.. would need to compare document/last updated date + * would need to maintain LastPriceUpdateDate on _PO and _Costing */ + + // update Product Costing + // requires existence of currency conversion !! + // if there are multiple lines of the same product last price uses first + StringBuffer sql = new StringBuffer ( + "UPDATE M_Product_Costing pc " + + "SET PriceLastPO = " + + "(SELECT currencyConvert(ol.PriceActual,ol.C_Currency_ID,a.C_Currency_ID,o.DateOrdered,o.C_ConversionType_ID,o.AD_Client_ID,o.AD_Org_ID) " + + "FROM C_Order o, C_OrderLine ol, C_AcctSchema a " + + "WHERE o.C_Order_ID=ol.C_Order_ID" + + " AND pc.M_Product_ID=ol.M_Product_ID AND pc.C_AcctSchema_ID=a.C_AcctSchema_ID "); + if (DB.isOracle()) //jz + { + sql.append(" AND ROWNUM=1 "); + } + else + sql.append(" AND ol.C_OrderLine_ID = (SELECT MIN(ol1.C_OrderLine_ID) " + + "FROM C_Order o1, C_OrderLine ol1 " + + "WHERE o1.C_Order_ID=ol1.C_Order_ID" + + " AND pc.M_Product_ID=ol1.M_Product_ID ") + .append(" AND o1.C_Order_ID=").append(get_ID()).append(") "); + sql.append(" AND pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append(" AND o.C_Order_ID=") + .append(get_ID()).append(") ") + .append("WHERE EXISTS (SELECT * " + + "FROM C_Order o, C_OrderLine ol, C_AcctSchema a " + + "WHERE o.C_Order_ID=ol.C_Order_ID" + + " AND pc.M_Product_ID=ol.M_Product_ID AND pc.C_AcctSchema_ID=a.C_AcctSchema_ID" + + " AND pc.C_AcctSchema_ID=").append(C_AcctSchema_ID).append(" AND o.C_Order_ID=") + .append(get_ID()).append(")"); + int no = DB.executeUpdate(sql.toString(), getTrxName()); + log.fine("M_Product_Costing - Updated=" + no); + } // updateProductInfo + +} // Doc_Order \ No newline at end of file diff --git a/base/src/org/compiere/acct/Doc_Payment.java b/base/src/org/compiere/acct/Doc_Payment.java new file mode 100644 index 0000000000..766c357f74 --- /dev/null +++ b/base/src/org/compiere/acct/Doc_Payment.java @@ -0,0 +1,183 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.logging.*; + +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Post Invoice Documents. + *
+ *  Table:              C_Payment (335)
+ *  Document Types      ARP, APP
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_Payment.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_Payment extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + protected Doc_Payment (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super (ass, MPayment.class, rs, null, trxName); + } // Doc_Payment + + /** Tender Type */ + private String m_TenderType = null; + /** Prepayment */ + private boolean m_Prepayment = false; + /** Bank Account */ + private int m_C_BankAccount_ID = 0; + + /** + * Load Specific Document Details + * @return error message or null + */ + protected String loadDocumentDetails () + { + MPayment pay = (MPayment)getPO(); + setDateDoc(pay.getDateTrx()); + m_TenderType = pay.getTenderType(); + m_Prepayment = pay.isPrepayment(); + m_C_BankAccount_ID = pay.getC_BankAccount_ID(); + // Amount + setAmount(Doc.AMTTYPE_Gross, pay.getPayAmt()); + return null; + } // loadDocumentDetails + + + /************************************************************************** + * Get Source Currency Balance - always zero + * @return Zero (always balanced) + */ + public BigDecimal getBalance() + { + BigDecimal retValue = Env.ZERO; + // log.config( toString() + " Balance=" + retValue); + return retValue; + } // getBalance + + /** + * Create Facts (the accounting logic) for + * ARP, APP. + *
+	 *  ARP
+	 *      BankInTransit   DR
+	 *      UnallocatedCash         CR
+	 *      or Charge/C_Prepayment
+	 *  APP
+	 *      PaymentSelect   DR
+	 *      or Charge/V_Prepayment
+	 *      BankInTransit           CR
+	 *  CashBankTransfer
+	 *      -
+	 *  
+ * @param as accounting schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + // Cash Transfer + if ("X".equals(m_TenderType)) + { + ArrayList facts = new ArrayList(); + facts.add(fact); + return facts; + } + + int AD_Org_ID = getBank_Org_ID(); // Bank Account Org + if (getDocumentType().equals(DOCTYPE_ARReceipt)) + { + // Asset + FactLine fl = fact.createLine(null, getAccount(Doc.ACCTTYPE_BankInTransit, as), + getC_Currency_ID(), getAmount(), null); + if (fl != null && AD_Org_ID != 0) + fl.setAD_Org_ID(AD_Org_ID); + // + MAccount acct = null; + if (getC_Charge_ID() != 0) + acct = MCharge.getAccount(getC_Charge_ID(), as, getAmount()); + else if (m_Prepayment) + acct = getAccount(Doc.ACCTTYPE_C_Prepayment, as); + else + acct = getAccount(Doc.ACCTTYPE_UnallocatedCash, as); + fl = fact.createLine(null, acct, + getC_Currency_ID(), null, getAmount()); + if (fl != null && AD_Org_ID != 0 + && getC_Charge_ID() == 0) // don't overwrite charge + fl.setAD_Org_ID(AD_Org_ID); + } + // APP + else if (getDocumentType().equals(DOCTYPE_APPayment)) + { + MAccount acct = null; + if (getC_Charge_ID() != 0) + acct = MCharge.getAccount(getC_Charge_ID(), as, getAmount()); + else if (m_Prepayment) + acct = getAccount(Doc.ACCTTYPE_V_Prepayment, as); + else + acct = getAccount(Doc.ACCTTYPE_PaymentSelect, as); + FactLine fl = fact.createLine(null, acct, + getC_Currency_ID(), getAmount(), null); + if (fl != null && AD_Org_ID != 0 + && getC_Charge_ID() == 0) // don't overwrite charge + fl.setAD_Org_ID(AD_Org_ID); + + // Asset + fl = fact.createLine(null, getAccount(Doc.ACCTTYPE_BankInTransit, as), + getC_Currency_ID(), null, getAmount()); + if (fl != null && AD_Org_ID != 0) + fl.setAD_Org_ID(AD_Org_ID); + } + else + { + p_Error = "DocumentType unknown: " + getDocumentType(); + log.log(Level.SEVERE, p_Error); + fact = null; + } + // + ArrayList facts = new ArrayList(); + facts.add(fact); + return facts; + } // createFact + + /** + * Get AD_Org_ID from Bank Account + * @return AD_Org_ID or 0 + */ + private int getBank_Org_ID () + { + if (m_C_BankAccount_ID == 0) + return 0; + // + MBankAccount ba = MBankAccount.get(getCtx(), m_C_BankAccount_ID); + return ba.getAD_Org_ID(); + } // getBank_Org_ID + +} // Doc_Payment diff --git a/base/src/org/compiere/acct/Doc_Production.java b/base/src/org/compiere/acct/Doc_Production.java new file mode 100644 index 0000000000..fb2615d4c0 --- /dev/null +++ b/base/src/org/compiere/acct/Doc_Production.java @@ -0,0 +1,216 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; + +import org.compiere.model.*; +import java.util.logging.*; +import org.compiere.util.*; + +/** + * Post Invoice Documents. + *
+ *  Table:              M_Production (325)
+ *  Document Types:     MMP
+ *  
+ * @author Jorg Janke + * @version $Id: Doc_Production.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_Production extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + public Doc_Production (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super (ass, X_M_Production.class, rs, DOCTYPE_MatProduction, trxName); + } // Doc_Production + + /** + * Load Document Details + * @return error message or null + */ + protected String loadDocumentDetails() + { + setC_Currency_ID (NO_CURRENCY); + X_M_Production prod = (X_M_Production)getPO(); + setDateDoc (prod.getMovementDate()); + setDateAcct(prod.getMovementDate()); + // Contained Objects + p_lines = loadLines(prod); + log.fine("Lines=" + p_lines.length); + return null; + } // loadDocumentDetails + + /** + * Load Invoice Line + * @param prod production + * @return DoaLine Array + */ + private DocLine[] loadLines(X_M_Production prod) + { + ArrayList list = new ArrayList(); + // Production + // -- ProductionPlan + // -- -- ProductionLine - the real level + String sqlPP = "SELECT * FROM M_ProductionPlan pp " + + "WHERE pp.M_Production_ID=? " + + "ORDER BY pp.Line"; + String sqlPL = "SELECT * FROM M_ProductionLine pl " + + "WHERE pl.M_ProductionPlan_ID=? " + + "ORDER BY pl.Line"; + + try + { + PreparedStatement pstmtPP = DB.prepareStatement(sqlPP, getTrxName()); + pstmtPP.setInt(1, get_ID()); + ResultSet rsPP = pstmtPP.executeQuery(); + // + while (rsPP.next()) + { + int M_Product_ID = rsPP.getInt("M_Product_ID"); + int M_ProductionPlan_ID = rsPP.getInt("M_ProductionPlan_ID"); + // + try + { + PreparedStatement pstmtPL = DB.prepareStatement(sqlPL, getTrxName()); + pstmtPL.setInt(1, M_ProductionPlan_ID); + ResultSet rsPL = pstmtPL.executeQuery(); + while (rsPL.next()) + { + X_M_ProductionLine line = new X_M_ProductionLine(getCtx(), rsPL, getTrxName()); + if (line.getMovementQty().signum() == 0) + { + log.info("LineQty=0 - " + line); + continue; + } + DocLine docLine = new DocLine (line, this); + docLine.setQty (line.getMovementQty(), false); + // Identify finished BOM Product + docLine.setProductionBOM(line.getM_Product_ID() == M_Product_ID); + // + log.fine(docLine.toString()); + list.add (docLine); + } + rsPL.close(); + pstmtPL.close(); + } + catch (Exception ee) + { + log.log(Level.SEVERE, sqlPL, ee); + } + } + rsPP.close(); + pstmtPP.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sqlPP, e); + } + // Return Array + DocLine[] dl = new DocLine[list.size()]; + list.toArray(dl); + return dl; + } // loadLines + + /** + * Get Balance + * @return Zero (always balanced) + */ + public BigDecimal getBalance() + { + BigDecimal retValue = Env.ZERO; + return retValue; + } // getBalance + + /** + * Create Facts (the accounting logic) for + * MMP. + *
+	 *  Production
+	 *      Inventory       DR      CR
+	 *  
+ * @param as account schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + setC_Currency_ID (as.getC_Currency_ID()); + + // Line pointer + FactLine fl = null; + for (int i = 0; i < p_lines.length; i++) + { + DocLine line = p_lines[i]; + // Calculate Costs + BigDecimal costs = null; + if (line.isProductionBOM()) + { + // Get BOM Cost - Sum of individual lines + BigDecimal bomCost = Env.ZERO; + for (int ii = 0; ii < p_lines.length; ii++) + { + DocLine line0 = p_lines[ii]; + if (line0.getM_ProductionPlan_ID() != line.getM_ProductionPlan_ID()) + continue; + if (!line0.isProductionBOM()) + bomCost = bomCost.add(line0.getProductCosts(as, line.getAD_Org_ID(), false)); + } + costs = bomCost.negate(); + } + else + costs = line.getProductCosts(as, line.getAD_Org_ID(), false); + + // Inventory DR CR + fl = fact.createLine(line, + line.getAccount(ProductCost.ACCTTYPE_P_Asset, as), + as.getC_Currency_ID(), costs); + if (fl == null) + { + p_Error = "No Costs for Line " + line.getLine() + " - " + line; + return null; + } + fl.setM_Locator_ID(line.getM_Locator_ID()); + fl.setQty(line.getQty()); + + // Cost Detail + String description = line.getDescription(); + if (description == null) + description = ""; + if (line.isProductionBOM()) + description += "(*)"; + MCostDetail.createProduction(as, line.getAD_Org_ID(), + line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(), + line.get_ID(), 0, + costs, line.getQty(), + description, getTrxName()); + } + // + ArrayList facts = new ArrayList(); + facts.add(fact); + return facts; + } // createFact + +} // Doc_Production diff --git a/base/src/org/compiere/acct/Doc_ProjectIssue.java b/base/src/org/compiere/acct/Doc_ProjectIssue.java new file mode 100644 index 0000000000..f128dc07bc --- /dev/null +++ b/base/src/org/compiere/acct/Doc_ProjectIssue.java @@ -0,0 +1,221 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; + +import org.compiere.model.*; +import java.util.*; +import java.util.logging.*; +import org.compiere.util.*; + +/** + * Project Issue. + * Note: + * Will load the default GL Category. + * Set up a document type to set the GL Category. + * + * @author Jorg Janke + * @version $Id: Doc_ProjectIssue.java,v 1.2 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_ProjectIssue extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + public Doc_ProjectIssue (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super (ass, MProjectIssue.class, rs, DOCTYPE_ProjectIssue, trxName); + } // Doc_ProjectIssue + + /** Pseudo Line */ + private DocLine m_line = null; + /** Issue */ + private MProjectIssue m_issue = null; + + /** + * Load Document Details + * @return error message or null + */ + protected String loadDocumentDetails() + { + setC_Currency_ID(NO_CURRENCY); + m_issue = (MProjectIssue)getPO(); + setDateDoc (m_issue.getMovementDate()); + setDateAcct(m_issue.getMovementDate()); + + // Pseudo Line + m_line = new DocLine (m_issue, this); + m_line.setQty (m_issue.getMovementQty(), true); // sets Trx and Storage Qty + + // Pseudo Line Check + if (m_line.getM_Product_ID() == 0) + log.warning(m_line.toString() + " - No Product"); + log.fine(m_line.toString()); + return null; + } // loadDocumentDetails + + /** + * Get DocumentNo + * @return document no + */ + public String getDocumentNo () + { + MProject p = m_issue.getParent(); + if (p != null) + return p.getValue() + " #" + m_issue.getLine(); + return "(" + m_issue.get_ID() + ")"; + } // getDocumentNo + + /** + * Get Balance + * @return Zero (always balanced) + */ + public BigDecimal getBalance() + { + BigDecimal retValue = Env.ZERO; + return retValue; + } // getBalance + + /** + * Create Facts (the accounting logic) for + * PJI + *
+	 *  Issue
+	 *      ProjectWIP      DR
+	 *      Inventory               CR
+	 *  
+ * Project Account is either Asset or WIP depending on Project Type + * @param as accounting schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + // create Fact Header + Fact fact = new Fact(this, as, Fact.POST_Actual); + setC_Currency_ID (as.getC_Currency_ID()); + + MProject project = new MProject (getCtx(), m_issue.getC_Project_ID(), null); + String ProjectCategory = project.getProjectCategory(); + MProduct product = MProduct.get(getCtx(), m_issue.getM_Product_ID()); + + // Line pointers + FactLine dr = null; + FactLine cr = null; + + // Issue Cost + BigDecimal cost = null; + if (m_issue.getM_InOutLine_ID() != 0) + cost = getPOCost(as); + else if (m_issue.getS_TimeExpenseLine_ID() != 0) + cost = getLaborCost(as); + if (cost == null) // standard Product Costs + cost = m_line.getProductCosts(as, getAD_Org_ID(), false); + + // Project DR + int acctType = ACCTTYPE_ProjectWIP; + if (MProject.PROJECTCATEGORY_AssetProject.equals(ProjectCategory)) + acctType = ACCTTYPE_ProjectAsset; + dr = fact.createLine(m_line, + getAccount(acctType, as), as.getC_Currency_ID(), cost, null); + dr.setQty(m_line.getQty().negate()); + + // Inventory CR + acctType = ProductCost.ACCTTYPE_P_Asset; + if (product.isService()) + acctType = ProductCost.ACCTTYPE_P_Expense; + cr = fact.createLine(m_line, + m_line.getAccount(acctType, as), + as.getC_Currency_ID(), null, cost); + cr.setM_Locator_ID(m_line.getM_Locator_ID()); + cr.setLocationFromLocator(m_line.getM_Locator_ID(), true); // from Loc + // + ArrayList facts = new ArrayList(); + facts.add(fact); + return facts; + } // createFact + + /** + * Get PO Costs in Currency of AcctSchema + * @param as Account Schema + * @return Unit PO Cost + */ + private BigDecimal getPOCost(MAcctSchema as) + { + BigDecimal retValue = null; + // Uses PO Date + String sql = "SELECT currencyConvert(ol.PriceActual, o.C_Currency_ID, ?, o.DateOrdered, o.C_ConversionType_ID, ?, ?) " + + "FROM C_OrderLine ol" + + " INNER JOIN M_InOutLine iol ON (iol.C_OrderLine_ID=ol.C_OrderLine_ID)" + + " INNER JOIN C_Order o ON (o.C_Order_ID=ol.C_Order_ID) " + + "WHERE iol.M_InOutLine_ID=?"; + PreparedStatement pstmt = null; + try + { + pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, as.getC_Currency_ID()); + pstmt.setInt(2, getAD_Client_ID()); + pstmt.setInt(3, getAD_Org_ID()); + pstmt.setInt(4, m_issue.getM_InOutLine_ID()); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + retValue = rs.getBigDecimal(1); + log.fine("POCost = " + retValue); + } + else + log.warning("Not found for M_InOutLine_ID=" + m_issue.getM_InOutLine_ID()); + rs.close(); + pstmt.close(); + pstmt = null; + } + catch (Exception e) + { + log.log(Level.SEVERE, sql, e); + } + try + { + if (pstmt != null) + pstmt.close(); + pstmt = null; + } + catch (Exception e) + { + pstmt = null; + } + return retValue; + } // getPOCost(); + + /** + * Get Labor Cost from Expense Report + * @param as Account Schema + * @return Unit Labor Cost + */ + private BigDecimal getLaborCost(MAcctSchema as) + { + BigDecimal retValue = null; + + /** TODO Labor Cost */ + return retValue; + } // getLaborCost + +} // DocProjectIssue + diff --git a/base/src/org/compiere/acct/Doc_Requisition.java b/base/src/org/compiere/acct/Doc_Requisition.java new file mode 100644 index 0000000000..75e6065ca2 --- /dev/null +++ b/base/src/org/compiere/acct/Doc_Requisition.java @@ -0,0 +1,153 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.util.*; +import java.util.logging.*; +import java.sql.*; + +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Post Order Documents. + * + *
+ *   Table:              M_Requisition
+ *   Document Types:     POR (Requisition)
+ * 
+ * + * @author Jorg Janke + * @version $Id: Doc_Requisition.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Doc_Requisition extends Doc +{ + /** + * Constructor + * @param ass accounting schemata + * @param rs record + * @param trxName trx + */ + protected Doc_Requisition (MAcctSchema[] ass, ResultSet rs, String trxName) + { + super (ass, MRequisition.class, rs, DOCTYPE_PurchaseRequisition, trxName); + } // Doc_Requisition + + /** + * Load Specific Document Details + * @return error message or null + */ + protected String loadDocumentDetails () + { + setC_Currency_ID(NO_CURRENCY); + MRequisition req = (MRequisition)getPO(); + setDateDoc (req.getDateDoc()); + setDateAcct (req.getDateDoc()); + // Amounts + setAmount(AMTTYPE_Gross, req.getTotalLines()); + setAmount(AMTTYPE_Net, req.getTotalLines()); + // Contained Objects + p_lines = loadLines (req); + // log.fine( "Lines=" + p_lines.length + ", Taxes=" + m_taxes.length); + return null; + } // loadDocumentDetails + + /** + * Load Requisition Lines + * @param req requisition + * @return DocLine Array + */ + private DocLine[] loadLines (MRequisition req) + { + ArrayList list = new ArrayList (); + MRequisitionLine[] lines = req.getLines(); + for (int i = 0; i < lines.length; i++) + { + MRequisitionLine line = lines[i]; + DocLine docLine = new DocLine (line, this); + BigDecimal Qty = line.getQty(); + docLine.setQty (Qty, false); + BigDecimal PriceActual = line.getPriceActual(); + BigDecimal LineNetAmt = line.getLineNetAmt(); + docLine.setAmount (LineNetAmt); // DR + list.add (docLine); + } + // Return Array + DocLine[] dls = new DocLine[list.size ()]; + list.toArray (dls); + return dls; + } // loadLines + + /*************************************************************************** + * Get Source Currency Balance - subtracts line and tax amounts from total - + * no rounding + * + * @return positive amount, if total invoice is bigger than lines + */ + public BigDecimal getBalance () + { + BigDecimal retValue = new BigDecimal (0.0); + return retValue; + } // getBalance + + /*************************************************************************** + * Create Facts (the accounting logic) for POR. + *
+	 * Reservation
+	 * 	Expense		CR
+	 * 	Offset			DR
+	 * 
+ * @param as accounting schema + * @return Fact + */ + public ArrayList createFacts (MAcctSchema as) + { + ArrayList facts = new ArrayList(); + Fact fact = new Fact (this, as, Fact.POST_Reservation); + setC_Currency_ID(as.getC_Currency_ID()); + // + BigDecimal grossAmt = getAmount (Doc.AMTTYPE_Gross); + // Commitment + if (as.isCreateReservation ()) + { + BigDecimal total = Env.ZERO; + for (int i = 0; i < p_lines.length; i++) + { + DocLine line = p_lines[i]; + BigDecimal cost = line.getAmtSource(); + total = total.add (cost); + // Account + MAccount expense = line.getAccount(ProductCost.ACCTTYPE_P_Expense, as); + // + fact.createLine (line, expense, as.getC_Currency_ID(), cost, null); + } + // Offset + MAccount offset = getAccount (ACCTTYPE_CommitmentOffset, as); + if (offset == null) + { + p_Error = "@NotFound@ @CommitmentOffset_Acct@"; + log.log (Level.SEVERE, p_Error); + return null; + } + fact.createLine (null, offset, getC_Currency_ID(), null, total); + facts.add(fact); + } + + return facts; + } // createFact +} // Doc_Requisition diff --git a/base/src/org/compiere/acct/Fact.java b/base/src/org/compiere/acct/Fact.java new file mode 100644 index 0000000000..779e3f50b8 --- /dev/null +++ b/base/src/org/compiere/acct/Fact.java @@ -0,0 +1,861 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.util.*; +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Accounting Fact + * + * @author Jorg Janke + * @version $Id: Fact.java,v 1.2 2006/07/30 00:53:33 jjanke Exp $ + */ +public final class Fact +{ + /** + * Constructor + * @param document pointer to document + * @param acctSchema Account Schema to create accounts + * @param defaultPostingType the default Posting type (actual,..) for this posting + */ + public Fact (Doc document, MAcctSchema acctSchema, String defaultPostingType) + { + m_doc = document; + m_acctSchema = acctSchema; + m_postingType = defaultPostingType; + // + log.config(toString()); + } // Fact + + + /** Log */ + private CLogger log = CLogger.getCLogger(getClass()); + + /** Document */ + private Doc m_doc = null; + /** Accounting Schema */ + private MAcctSchema m_acctSchema = null; + /** Transaction */ + private String m_trxName; + + /** Posting Type */ + private String m_postingType = null; + + /** Actual Balance Type */ + public static final String POST_Actual = MFactAcct.POSTINGTYPE_Actual; + /** Budget Balance Type */ + public static final String POST_Budget = MFactAcct.POSTINGTYPE_Budget;; + /** Encumbrance Posting */ + public static final String POST_Commitment = MFactAcct.POSTINGTYPE_Commitment; + /** Encumbrance Posting */ + public static final String POST_Reservation = MFactAcct.POSTINGTYPE_Reservation; + + + /** Is Converted */ + private boolean m_converted = false; + + /** Lines */ + private ArrayList m_lines = new ArrayList(); + + + /** + * Dispose + */ + public void dispose() + { + m_lines.clear(); + m_lines = null; + } // dispose + + /** + * Create and convert Fact Line. + * Used to create a DR and/or CR entry + * + * @param docLine the document line or null + * @param account if null, line is not created + * @param C_Currency_ID the currency + * @param debitAmt debit amount, can be null + * @param creditAmt credit amount, can be null + * @return Fact Line + */ + public FactLine createLine (DocLine docLine, MAccount account, + int C_Currency_ID, BigDecimal debitAmt, BigDecimal creditAmt) + { + // log.fine("createLine - " + account + " - Dr=" + debitAmt + ", Cr=" + creditAmt); + + // Data Check + if (account == null) + { + log.info("No account for " + docLine + + ": Amt=" + debitAmt + "/" + creditAmt + + " - " + toString()); + return null; + } + // + FactLine line = new FactLine (m_doc.getCtx(), m_doc.get_Table_ID(), + m_doc.get_ID(), + docLine == null ? 0 : docLine.get_ID(), m_trxName); + // Set Info & Account + line.setDocumentInfo(m_doc, docLine); + line.setPostingType(m_postingType); + line.setAccount(m_acctSchema, account); + + // Amounts - one needs to not zero + if (!line.setAmtSource(C_Currency_ID, debitAmt, creditAmt)) + { + if (docLine == null || docLine.getQty() == null || docLine.getQty().signum() == 0) + { + log.fine("Both amounts & qty = 0/Null - " + docLine + + " - " + toString()); + return null; + } + log.fine("Both amounts = 0/Null, Qty=" + docLine.getQty() + " - " + docLine + + " - " + toString()); + } + // Convert + line.convert(); + // Optionally overwrite Acct Amount + if (docLine != null + && (docLine.getAmtAcctDr() != null || docLine.getAmtAcctCr() != null)) + line.setAmtAcct(docLine.getAmtAcctDr(), docLine.getAmtAcctCr()); + // + log.fine(line.toString()); + add(line); + return line; + } // createLine + + /** + * Add Fact Line + * @param line fact line + */ + void add (FactLine line) + { + m_lines.add(line); + } // add + + /** + * Create and convert Fact Line. + * Used to create either a DR or CR entry + * + * @param docLine Document Line or null + * @param accountDr Account to be used if Amt is DR balance + * @param accountCr Account to be used if Amt is CR balance + * @param C_Currency_ID Currency + * @param Amt if negative Cr else Dr + * @return FactLine + */ + public FactLine createLine (DocLine docLine, MAccount accountDr, MAccount accountCr, + int C_Currency_ID, BigDecimal Amt) + { + if (Amt.signum() < 0) + return createLine (docLine, accountCr, C_Currency_ID, null, Amt.abs()); + else + return createLine (docLine, accountDr, C_Currency_ID, Amt, null); + } // createLine + + /** + * Create and convert Fact Line. + * Used to create either a DR or CR entry + * + * @param docLine Document line or null + * @param account Account to be used + * @param C_Currency_ID Currency + * @param Amt if negative Cr else Dr + * @return FactLine + */ + public FactLine createLine (DocLine docLine, MAccount account, + int C_Currency_ID, BigDecimal Amt) + { + if (Amt.signum() < 0) + return createLine (docLine, account, C_Currency_ID, null, Amt.abs()); + else + return createLine (docLine, account, C_Currency_ID, Amt, null); + } // createLine + + /** + * Is Posting Type + * @param PostingType - see POST_* + * @return true if document is posting type + */ + public boolean isPostingType (String PostingType) + { + return m_postingType.equals(PostingType); + } // isPostingType + + /** + * Is converted + * @return true if converted + */ + public boolean isConverted() + { + return m_converted; + } // isConverted + + /** + * Get AcctSchema + * @return AcctSchema + */ + public MAcctSchema getAcctSchema() + { + return m_acctSchema; + } // getAcctSchema + + + /************************************************************************** + * Are the lines Source Balanced + * @return true if source lines balanced + */ + public boolean isSourceBalanced() + { + // No lines -> balanded + if (m_lines.size() == 0) + return true; + BigDecimal balance = getSourceBalance(); + boolean retValue = balance.signum() == 0; + if (retValue) + log.finer(toString()); + else + log.warning ("NO - Diff=" + balance + " - " + toString()); + return retValue; + } // isSourceBalanced + + /** + * Return Source Balance + * @return source balance + */ + protected BigDecimal getSourceBalance() + { + BigDecimal result = Env.ZERO; + for (int i = 0; i < m_lines.size(); i++) + { + FactLine line = (FactLine)m_lines.get(i); + result = result.add (line.getSourceBalance()); + } + // log.fine("getSourceBalance - " + result.toString()); + return result; + } // getSourceBalance + + /** + * Create Source Line for Suspense Balancing. + * Only if Suspense Balancing is enabled and not a multi-currency document + * (double check as otherwise the rule should not have fired) + * If not balanced create balancing entry in currency of the document + * @return FactLine + */ + public FactLine balanceSource() + { + if (!m_acctSchema.isSuspenseBalancing() || m_doc.isMultiCurrency()) + return null; + BigDecimal diff = getSourceBalance(); + log.finer("Diff=" + diff); + + // new line + FactLine line = new FactLine (m_doc.getCtx(), m_doc.get_Table_ID(), + m_doc.get_ID(), 0, m_trxName); + line.setDocumentInfo(m_doc, null); + line.setPostingType(m_postingType); + + // Account + line.setAccount(m_acctSchema, m_acctSchema.getSuspenseBalancing_Acct()); + + // Amount + if (diff.signum() < 0) // negative balance => DR + line.setAmtSource(m_doc.getC_Currency_ID(), diff.abs(), Env.ZERO); + else // positive balance => CR + line.setAmtSource(m_doc.getC_Currency_ID(), Env.ZERO, diff); + + // Convert + line.convert(); + // + log.fine(line.toString()); + m_lines.add(line); + return line; + } // balancingSource + + + /************************************************************************** + * Are all segments balanced + * @return true if segments are balanced + */ + public boolean isSegmentBalanced() + { + if (m_lines.size() == 0) + return true; + + MAcctSchemaElement[] elements = m_acctSchema.getAcctSchemaElements(); + // check all balancing segments + for (int i = 0; i < elements.length; i++) + { + MAcctSchemaElement ase = elements[i]; + if (ase.isBalanced() && !isSegmentBalanced (ase.getElementType())) + return false; + } + return true; + } // isSegmentBalanced + + /** + * Is Source Segment balanced. + * @param segmentType - see AcctSchemaElement.SEGMENT_* + * Implemented only for Org + * Other sensible candidates are Project, User1/2 + * @return true if segments are balanced + */ + public boolean isSegmentBalanced (String segmentType) + { + if (segmentType.equals(MAcctSchemaElement.ELEMENTTYPE_Organization)) + { + HashMap map = new HashMap(); + // Add up values by key + for (int i = 0; i < m_lines.size(); i++) + { + FactLine line = (FactLine)m_lines.get(i); + Integer key = new Integer(line.getAD_Org_ID()); + BigDecimal bal = line.getSourceBalance(); + BigDecimal oldBal = (BigDecimal)map.get(key); + if (oldBal != null) + bal = bal.add(oldBal); + map.put(key, bal); + // System.out.println("Add Key=" + key + ", Bal=" + bal + " <- " + line); + } + // check if all keys are zero + Iterator values = map.values().iterator(); + while (values.hasNext()) + { + BigDecimal bal = (BigDecimal)values.next(); + if (bal.signum() != 0) + { + map.clear(); + log.warning ("(" + segmentType + ") NO - " + toString() + ", Balance=" + bal); + return false; + } + } + map.clear(); + log.finer("(" + segmentType + ") - " + toString()); + return true; + } + log.finer("(" + segmentType + ") (not checked) - " + toString()); + return true; + } // isSegmentBalanced + + /** + * Balance all segments. + * - For all balancing segments + * - For all segment values + * - If balance <> 0 create dueTo/dueFrom line + * overwriting the segment value + */ + public void balanceSegments() + { + MAcctSchemaElement[] elements = m_acctSchema.getAcctSchemaElements(); + // check all balancing segments + for (int i = 0; i < elements.length; i++) + { + MAcctSchemaElement ase = elements[i]; + if (ase.isBalanced()) + balanceSegment (ase.getElementType()); + } + } // balanceSegments + + /** + * Balance Source Segment + * @param elementType segment element type + */ + private void balanceSegment (String elementType) + { + // no lines -> balanced + if (m_lines.size() == 0) + return; + + log.fine ("(" + elementType + ") - " + toString()); + + // Org + if (elementType.equals(MAcctSchemaElement.ELEMENTTYPE_Organization)) + { + HashMap map = new HashMap(); + // Add up values by key + for (int i = 0; i < m_lines.size(); i++) + { + FactLine line = (FactLine)m_lines.get(i); + Integer key = new Integer(line.getAD_Org_ID()); + // BigDecimal balance = line.getSourceBalance(); + Balance oldBalance = (Balance)map.get(key); + if (oldBalance == null) + { + oldBalance = new Balance (line.getAmtSourceDr(), line.getAmtSourceCr()); + map.put(key, oldBalance); + } + else + oldBalance.add(line.getAmtSourceDr(), line.getAmtSourceCr()); + // log.info ("Key=" + key + ", Balance=" + balance + " - " + line); + } + + // Create entry for non-zero element + Iterator keys = map.keySet().iterator(); + while (keys.hasNext()) + { + Integer key = (Integer)keys.next(); + Balance difference = (Balance)map.get(key); + log.info (elementType + "=" + key + ", " + difference); + // + if (!difference.isZeroBalance()) + { + // Create Balancing Entry + FactLine line = new FactLine (m_doc.getCtx(), m_doc.get_Table_ID(), + m_doc.get_ID(), 0, m_trxName); + line.setDocumentInfo(m_doc, null); + line.setPostingType(m_postingType); + // Amount & Account + if (difference.getBalance().signum() < 0) + { + if (difference.isReversal()) + { + line.setAmtSource(m_doc.getC_Currency_ID(), Env.ZERO, difference.getPostBalance()); + line.setAccount(m_acctSchema, m_acctSchema.getDueTo_Acct(elementType)); + } + else + { + line.setAmtSource(m_doc.getC_Currency_ID(), difference.getPostBalance(), Env.ZERO); + line.setAccount(m_acctSchema, m_acctSchema.getDueFrom_Acct(elementType)); + } + } + else + { + if (difference.isReversal()) + { + line.setAmtSource(m_doc.getC_Currency_ID(), difference.getPostBalance(), Env.ZERO); + line.setAccount(m_acctSchema, m_acctSchema.getDueFrom_Acct(elementType)); + } + else + { + line.setAmtSource(m_doc.getC_Currency_ID(), Env.ZERO, difference.getPostBalance()); + line.setAccount(m_acctSchema, m_acctSchema.getDueTo_Acct(elementType)); + } + } + line.convert(); + line.setAD_Org_ID(key.intValue()); + // + m_lines.add(line); + log.fine("(" + elementType + ") - " + line); + } + } + map.clear(); + } + } // balanceSegment + + + /************************************************************************** + * Are the lines Accounting Balanced + * @return true if accounting lines are balanced + */ + public boolean isAcctBalanced() + { + // no lines -> balanced + if (m_lines.size() == 0) + return true; + BigDecimal balance = getAcctBalance(); + boolean retValue = balance.signum() == 0; + if (retValue) + log.finer(toString()); + else + log.warning("NO - Diff=" + balance + " - " + toString()); + return retValue; + } // isAcctBalanced + + /** + * Return Accounting Balance + * @return true if accounting lines are balanced + */ + protected BigDecimal getAcctBalance() + { + BigDecimal result = Env.ZERO; + for (int i = 0; i < m_lines.size(); i++) + { + FactLine line = (FactLine)m_lines.get(i); + result = result.add(line.getAcctBalance()); + } + // log.fine(result.toString()); + return result; + } // getAcctBalance + + /** + * Balance Accounting Currency. + * If the accounting currency is not balanced, + * if Currency balancing is enabled + * create a new line using the currency balancing account with zero source balance + * or + * adjust the line with the largest balance sheet account + * or if no balance sheet account exist, the line with the largest amount + * @return FactLine + */ + public FactLine balanceAccounting() + { + BigDecimal diff = getAcctBalance(); // DR-CR + log.fine("Balance=" + diff + + ", CurrBal=" + m_acctSchema.isCurrencyBalancing() + + " - " + toString()); + FactLine line = null; + + BigDecimal BSamount = Env.ZERO; + FactLine BSline = null; + BigDecimal PLamount = Env.ZERO; + FactLine PLline = null; + + // Find line biggest BalanceSheet or P&L line + for (int i = 0; i < m_lines.size(); i++) + { + FactLine l = (FactLine)m_lines.get(i); + BigDecimal amt = l.getAcctBalance().abs(); + if (l.isBalanceSheet() && amt.compareTo(BSamount) > 0) + { + BSamount = amt; + BSline = l; + } + else if (!l.isBalanceSheet() && amt.compareTo(PLamount) > 0) + { + PLamount = amt; + PLline = l; + } + } + + // Create Currency Balancing Entry + if (m_acctSchema.isCurrencyBalancing()) + { + line = new FactLine (m_doc.getCtx(), m_doc.get_Table_ID(), + m_doc.get_ID(), 0, m_trxName); + line.setDocumentInfo (m_doc, null); + line.setPostingType (m_postingType); + line.setAccount (m_acctSchema, m_acctSchema.getCurrencyBalancing_Acct()); + + // Amount + line.setAmtSource(m_doc.getC_Currency_ID(), Env.ZERO, Env.ZERO); + line.convert(); + // Accounted + BigDecimal drAmt = Env.ZERO; + BigDecimal crAmt = Env.ZERO; + boolean isDR = diff.signum() < 0; + BigDecimal difference = diff.abs(); + if (isDR) + drAmt = difference; + else + crAmt = difference; + // Switch sides + boolean switchIt = BSline != null + && ((BSline.isDrSourceBalance() && isDR) + || (!BSline.isDrSourceBalance() && !isDR)); + if (switchIt) + { + drAmt = Env.ZERO; + crAmt = Env.ZERO; + if (isDR) + crAmt = difference.negate(); + else + drAmt = difference.negate(); + } + line.setAmtAcct(drAmt, crAmt); + log.fine(line.toString()); + m_lines.add(line); + } + else // Adjust biggest (Balance Sheet) line amount + { + if (BSline != null) + line = BSline; + else + line = PLline; + if (line == null) + log.severe ("No Line found"); + else + { + log.fine("Adjusting Amt=" + diff + "; Line=" + line); + line.currencyCorrect(diff); + log.fine(line.toString()); + } + } // correct biggest amount + + return line; + } // balanceAccounting + + /** + * Check Accounts of Fact Lines + * @return true if success + */ + public boolean checkAccounts() + { + // no lines -> nothing to distribute + if (m_lines.size() == 0) + return true; + + // For all fact lines + for (int i = 0; i < m_lines.size(); i++) + { + FactLine line = (FactLine)m_lines.get(i); + MAccount account = line.getAccount(); + if (account == null) + { + log.warning("No Account for " + line); + return false; + } + MElementValue ev = account.getAccount(); + if (ev == null) + { + log.warning("No Element Value for " + account + + ": " + line); + return false; + } + if (ev.isSummary()) + { + log.warning("Cannot post to Summary Account " + ev + + ": " + line); + return false; + } + if (!ev.isActive()) + { + log.warning("Cannot post to Inactive Account " + ev + + ": " + line); + return false; + } + + } // for all lines + + return true; + } // checkAccounts + + /** + * GL Distribution of Fact Lines + * @return true if success + */ + public boolean distribute() + { + // no lines -> nothing to distribute + if (m_lines.size() == 0) + return true; + + ArrayList newLines = new ArrayList(); + // For all fact lines + for (int i = 0; i < m_lines.size(); i++) + { + FactLine dLine = (FactLine)m_lines.get(i); + MDistribution[] distributions = MDistribution.get (dLine.getAccount(), + m_postingType, m_doc.getC_DocType_ID()); + // No Distribution for this line + if (distributions == null || distributions.length == 0) + continue; + // Just the first + if (distributions.length > 1) + log.warning("More then one Distributiion for " + dLine.getAccount()); + MDistribution distribution = distributions[0]; + // Add Reversal + FactLine reversal = dLine.reverse(distribution.getName()); + log.info("Reversal=" + reversal); + newLines.add(reversal); // saved in postCommit + // Prepare + distribution.distribute(dLine.getAccount(), dLine.getSourceBalance(), dLine.getC_Currency_ID()); + MDistributionLine[] lines = distribution.getLines(false); + for (int j = 0; j < lines.length; j++) + { + MDistributionLine dl = lines[j]; + if (!dl.isActive() || dl.getAmt().signum() == 0) + continue; + FactLine factLine = new FactLine (m_doc.getCtx(), m_doc.get_Table_ID(), + m_doc.get_ID(), 0, m_trxName); + // Set Info & Account + factLine.setDocumentInfo(m_doc, dLine.getDocLine()); + factLine.setAccount(m_acctSchema, dl.getAccount()); + factLine.setPostingType(m_postingType); + if (dl.isOverwriteOrg()) // set Org explicitly + factLine.setAD_Org_ID(dl.getOrg_ID()); + // + if (dl.getAmt().signum() < 0) + factLine.setAmtSource(dLine.getC_Currency_ID(), null, dl.getAmt().abs()); + else + factLine.setAmtSource(dLine.getC_Currency_ID(), dl.getAmt(), null); + // Convert + factLine.convert(); + // + String description = distribution.getName() + " #" + dl.getLine(); + if (dl.getDescription() != null) + description += " - " + dl.getDescription(); + factLine.addDescription(description); + // + log.info(factLine.toString()); + newLines.add(factLine); + } + } // for all lines + + // Add Lines + for (int i = 0; i < newLines.size(); i++) + m_lines.add(newLines.get(i)); + + return true; + } // distribute + + + /************************************************************************** + * String representation + * @return String + */ + public String toString() + { + StringBuffer sb = new StringBuffer("Fact["); + sb.append(m_doc.toString()); + sb.append(",").append(m_acctSchema.toString()); + sb.append(",PostType=").append(m_postingType); + sb.append("]"); + return sb.toString(); + } // toString + + /** + * Get Lines + * @return FactLine Array + */ + public FactLine[] getLines() + { + FactLine[] temp = new FactLine[m_lines.size()]; + m_lines.toArray(temp); + return temp; + } // getLines + + /** + * Save Fact + * @param trxName transaction + * @return true if all lines were saved + */ + public boolean save (String trxName) + { + // save Lines + for (int i = 0; i < m_lines.size(); i++) + { + FactLine fl = (FactLine)m_lines.get(i); + // log.fine("save - " + fl); + if (!fl.save(trxName)) // abort on first error + return false; + } + return true; + } // commit + + /** + * Get Transaction + * @return trx + */ + public String get_TrxName() + { + return m_trxName; + } // getTrxName + + /** + * Set Transaction name + * @param trxName + */ + @SuppressWarnings("unused") + private void set_TrxName(String trxName) + { + m_trxName = trxName; + } // set_TrxName + + /** + * Fact Balance Utility + * + * @author Jorg Janke + * @version $Id: Fact.java,v 1.2 2006/07/30 00:53:33 jjanke Exp $ + */ + public class Balance + { + /** + * New Balance + * @param dr DR + * @param cr CR + */ + public Balance (BigDecimal dr, BigDecimal cr) + { + DR = dr; + CR = cr; + } + + /** DR Amount */ + public BigDecimal DR = Env.ZERO; + /** CR Amount */ + public BigDecimal CR = Env.ZERO; + + /** + * Add + * @param dr DR + * @param cr CR + */ + public void add (BigDecimal dr, BigDecimal cr) + { + DR = DR.add(dr); + CR = CR.add(cr); + } + + /** + * Get Balance + * @return balance + */ + public BigDecimal getBalance() + { + return DR.subtract(CR); + } // getBalance + + /** + * Get Post Balance + * @return absolute balance - negative if reversal + */ + public BigDecimal getPostBalance() + { + BigDecimal bd = getBalance().abs(); + if (isReversal()) + return bd.negate(); + return bd; + } // getPostBalance + + /** + * Zero Balance + * @return true if 0 + */ + public boolean isZeroBalance() + { + return getBalance().signum() == 0; + } // isZeroBalance + + /** + * Reversal + * @return true if both DR/CR are negative or zero + */ + public boolean isReversal() + { + return DR.signum() <= 0 && CR.signum() <= 0; + } // isReversal + + /** + * String Representation + * @return info + */ + public String toString () + { + StringBuffer sb = new StringBuffer ("Balance["); + sb.append ("DR=").append(DR) + .append ("-CR=").append(CR) + .append(" = ").append(getBalance()) + .append ("]"); + return sb.toString (); + } // toString + + } // Balance + +} // Fact \ No newline at end of file diff --git a/base/src/org/compiere/acct/FactLine.java b/base/src/org/compiere/acct/FactLine.java new file mode 100644 index 0000000000..bae4b5f045 --- /dev/null +++ b/base/src/org/compiere/acct/FactLine.java @@ -0,0 +1,1059 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.logging.*; +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Accounting Fact Entry. + * + * @author Jorg Janke + * @version $Id: FactLine.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $ + * + * Contributor(s): + * Chris Farley: Fix Bug [ 1657372 ] M_MatchInv records can not be balanced + * https://sourceforge.net/forum/message.php?msg_id=4151117 + * Carlos Ruiz - globalqss: Add setAmtAcct method rounded by Currency + * + */ +public final class FactLine extends X_Fact_Acct +{ + /** + * Constructor + * @param ctx context + * @param AD_Table_ID - Table of Document Source + * @param Record_ID - Record of document + * @param Line_ID - Optional line id + * @param trxName transaction + */ + public FactLine (Properties ctx, int AD_Table_ID, int Record_ID, int Line_ID, String trxName) + { + super(ctx, 0, trxName); + setAD_Client_ID(0); // do not derive + setAD_Org_ID(0); // do not derive + // + setAmtAcctCr (Env.ZERO); + setAmtAcctDr (Env.ZERO); + setAmtSourceCr (Env.ZERO); + setAmtSourceDr (Env.ZERO); + // Log.trace(this,Log.l1_User, "FactLine " + AD_Table_ID + ":" + Record_ID); + setAD_Table_ID (AD_Table_ID); + setRecord_ID (Record_ID); + setLine_ID (Line_ID); + } // FactLine + + /** Account */ + private MAccount m_acct = null; + /** Accounting Schema */ + private MAcctSchema m_acctSchema = null; + /** Document Header */ + private Doc m_doc = null; + /** Document Line */ + private DocLine m_docLine = null; + + /** + * Create Reversal (negate DR/CR) of the line + * @param description new description + * @return reversal line + */ + public FactLine reverse (String description) + { + FactLine reversal = new FactLine (getCtx(), getAD_Table_ID(), getRecord_ID(), getLine_ID(), get_TrxName()); + reversal.setClientOrg(this); // needs to be set explicitly + reversal.setDocumentInfo(m_doc, m_docLine); + reversal.setAccount(m_acctSchema, m_acct); + reversal.setPostingType(getPostingType()); + // + reversal.setAmtSource(getC_Currency_ID(), getAmtSourceDr().negate(), getAmtSourceCr().negate()); + reversal.convert(); + reversal.setDescription(description); + return reversal; + } // reverse + + /** + * Create Accrual (flip CR/DR) of the line + * @param description new description + * @return accrual line + */ + public FactLine accrue (String description) + { + FactLine accrual = new FactLine (getCtx(), getAD_Table_ID(), getRecord_ID(), getLine_ID(), get_TrxName()); + accrual.setClientOrg(this); // needs to be set explicitly + accrual.setDocumentInfo(m_doc, m_docLine); + accrual.setAccount(m_acctSchema, m_acct); + accrual.setPostingType(getPostingType()); + // + accrual.setAmtSource(getC_Currency_ID(), getAmtSourceCr(), getAmtSourceDr()); + accrual.convert(); + accrual.setDescription(description); + return accrual; + } // reverse + + /** + * Set Account Info + * @param acctSchema account schema + * @param acct account + */ + public void setAccount (MAcctSchema acctSchema, MAccount acct) + { + m_acctSchema = acctSchema; + setC_AcctSchema_ID (acctSchema.getC_AcctSchema_ID()); + // + m_acct = acct; + if (getAD_Client_ID() == 0) + setAD_Client_ID(m_acct.getAD_Client_ID()); + setAccount_ID (m_acct.getAccount_ID()); + setC_SubAcct_ID(m_acct.getC_SubAcct_ID()); + + // User Defined References + MAcctSchemaElement ud1 = m_acctSchema.getAcctSchemaElement( + X_C_AcctSchema_Element.ELEMENTTYPE_UserElement1); + if (ud1 != null) + { + String ColumnName1 = ud1.getDisplayColumnName(); + if (ColumnName1 != null) + { + int ID1 = 0; + if (m_docLine != null) + ID1 = m_docLine.getValue(ColumnName1); + if (ID1 == 0) + { + if (m_doc == null) + throw new IllegalArgumentException("Document not set yet"); + ID1 = m_doc.getValue(ColumnName1); + } + if (ID1 != 0) + setUserElement1_ID(ID1); + } + } + MAcctSchemaElement ud2 = m_acctSchema.getAcctSchemaElement( + X_C_AcctSchema_Element.ELEMENTTYPE_UserElement2); + if (ud2 != null) + { + String ColumnName2 = ud2.getDisplayColumnName(); + if (ColumnName2 != null) + { + int ID2 = 0; + if (m_docLine != null) + ID2 = m_docLine.getValue(ColumnName2); + if (ID2 == 0) + { + if (m_doc == null) + throw new IllegalArgumentException("Document not set yet"); + ID2 = m_doc.getValue(ColumnName2); + } + if (ID2 != 0) + setUserElement2_ID(ID2); + } + } + } // setAccount + + /** + * Set Source Amounts + * @param C_Currency_ID currency + * @param AmtSourceDr source amount dr + * @param AmtSourceCr source amount cr + * @return true, if any if the amount is not zero + */ + public boolean setAmtSource (int C_Currency_ID, BigDecimal AmtSourceDr, BigDecimal AmtSourceCr) + { + if (! m_acctSchema.isAllowNegativePosting()) { + // begin Victor Perez e-evolution 30.08.2005 + // fix Debit & Credit + if (AmtSourceDr != null) + { + if (AmtSourceDr.compareTo(Env.ZERO) == -1) + { + AmtSourceCr = AmtSourceDr.abs(); + AmtSourceDr = Env.ZERO; + } + } + if (AmtSourceCr != null) + { + if (AmtSourceCr.compareTo(Env.ZERO) == -1) + { + AmtSourceDr = AmtSourceCr.abs(); + AmtSourceCr = Env.ZERO; + } + } + // end Victor Perez e-evolution 30.08.2005 + } + + setC_Currency_ID (C_Currency_ID); + if (AmtSourceDr != null) + setAmtSourceDr (AmtSourceDr); + if (AmtSourceCr != null) + setAmtSourceCr (AmtSourceCr); + // one needs to be non zero + if (getAmtSourceDr().equals(Env.ZERO) && getAmtSourceCr().equals(Env.ZERO)) + return false; + // Currency Precision + int precision = MCurrency.getStdPrecision(getCtx(), C_Currency_ID); + if (AmtSourceDr != null && AmtSourceDr.scale() > precision) + { + BigDecimal AmtSourceDr1 = AmtSourceDr.setScale(precision, BigDecimal.ROUND_HALF_UP); + log.warning("Source DR Precision " + AmtSourceDr + " -> " + AmtSourceDr1); + setAmtSourceDr(AmtSourceDr1); + } + if (AmtSourceCr != null && AmtSourceCr.scale() > precision) + { + BigDecimal AmtSourceCr1 = AmtSourceCr.setScale(precision, BigDecimal.ROUND_HALF_UP); + log.warning("Source CR Precision " + AmtSourceCr + " -> " + AmtSourceCr1); + setAmtSourceCr(AmtSourceCr1); + } + return true; + } // setAmtSource + + /** + * Set Accounted Amounts (alternative: call convert) + * @param AmtAcctDr acct amount dr + * @param AmtAcctCr acct amount cr + */ + public void setAmtAcct(BigDecimal AmtAcctDr, BigDecimal AmtAcctCr) + { + if (! m_acctSchema.isAllowNegativePosting()) { + // begin Victor Perez e-evolution 30.08.2005 + // fix Debit & Credit + if (AmtAcctDr.compareTo(Env.ZERO) == -1) + { + AmtAcctCr = AmtAcctDr.abs(); + AmtAcctDr = Env.ZERO; + } + if (AmtAcctCr.compareTo(Env.ZERO) == -1) + { + AmtAcctDr = AmtAcctCr.abs(); + AmtAcctCr = Env.ZERO; + } + // end Victor Perez e-evolution 30.08.2005 + } + setAmtAcctDr (AmtAcctDr); + setAmtAcctCr (AmtAcctCr); + } // setAmtAcct + + /** + * Set Accounted Amounts rounded by currency + * @param C_Currency_ID currency + * @param AmtAcctDr acct amount dr + * @param AmtAcctCr acct amount cr + */ + public void setAmtAcct(int C_Currency_ID, BigDecimal AmtAcctDr, BigDecimal AmtAcctCr) + { + setAmtAcctDr (AmtAcctDr); + setAmtAcctCr (AmtAcctCr); + // Currency Precision + int precision = MCurrency.getStdPrecision(getCtx(), C_Currency_ID); + if (AmtAcctDr != null && AmtAcctDr.scale() > precision) + { + BigDecimal AmtAcctDr1 = AmtAcctDr.setScale(precision, BigDecimal.ROUND_HALF_UP); + log.warning("Accounted DR Precision " + AmtAcctDr + " -> " + AmtAcctDr1); + setAmtAcctDr(AmtAcctDr1); + } + if (AmtAcctCr != null && AmtAcctCr.scale() > precision) + { + BigDecimal AmtAcctCr1 = AmtAcctCr.setScale(precision, BigDecimal.ROUND_HALF_UP); + log.warning("Accounted CR Precision " + AmtAcctCr + " -> " + AmtAcctCr1); + setAmtAcctCr(AmtAcctCr1); + } + } // setAmtAcct + + /** + * Set Document Info + * @param doc document + * @param docLine doc line + */ + public void setDocumentInfo(Doc doc, DocLine docLine) + { + m_doc = doc; + m_docLine = docLine; + // reset + setAD_Org_ID(0); + setC_SalesRegion_ID(0); + // Client + if (getAD_Client_ID() == 0) + setAD_Client_ID (m_doc.getAD_Client_ID()); + // Date Trx + setDateTrx (m_doc.getDateDoc()); + if (m_docLine != null && m_docLine.getDateDoc() != null) + setDateTrx (m_docLine.getDateDoc()); + // Date Acct + setDateAcct (m_doc.getDateAcct()); + if (m_docLine != null && m_docLine.getDateAcct() != null) + setDateAcct (m_docLine.getDateAcct()); + // Period, Tax + if (m_docLine != null && m_docLine.getC_Period_ID() != 0) + setC_Period_ID(m_docLine.getC_Period_ID()); + else + setC_Period_ID (m_doc.getC_Period_ID()); + if (m_docLine != null) + setC_Tax_ID (m_docLine.getC_Tax_ID()); + // Description + StringBuffer description = new StringBuffer(m_doc.getDocumentNo()); + if (m_docLine != null) + { + description.append(" #").append(m_docLine.getLine()); + if (m_docLine.getDescription() != null) + description.append(" (").append(m_docLine.getDescription()).append(")"); + else if (m_doc.getDescription() != null && m_doc.getDescription().length() > 0) + description.append(" (").append(m_doc.getDescription()).append(")"); + } + else if (m_doc.getDescription() != null && m_doc.getDescription().length() > 0) + description.append(" (").append(m_doc.getDescription()).append(")"); + setDescription(description.toString()); + // Journal Info + setGL_Budget_ID (m_doc.getGL_Budget_ID()); + setGL_Category_ID (m_doc.getGL_Category_ID()); + + // Product + if (m_docLine != null) + setM_Product_ID (m_docLine.getM_Product_ID()); + if (getM_Product_ID() == 0) + setM_Product_ID (m_doc.getM_Product_ID()); + // UOM + if (m_docLine != null) + setC_UOM_ID (m_docLine.getC_UOM_ID()); + // Qty + if (get_Value("Qty") == null) // not previously set + { + setQty (m_doc.getQty()); // neg = outgoing + if (m_docLine != null) + setQty (m_docLine.getQty()); + } + + // Loc From (maybe set earlier) + if (getC_LocFrom_ID() == 0 && m_docLine != null) + setC_LocFrom_ID (m_docLine.getC_LocFrom_ID()); + if (getC_LocFrom_ID() == 0) + setC_LocFrom_ID (m_doc.getC_LocFrom_ID()); + // Loc To (maybe set earlier) + if (getC_LocTo_ID() == 0 && m_docLine != null) + setC_LocTo_ID (m_docLine.getC_LocTo_ID()); + if (getC_LocTo_ID() == 0) + setC_LocTo_ID (m_doc.getC_LocTo_ID()); + // BPartner + if (m_docLine != null) + setC_BPartner_ID (m_docLine.getC_BPartner_ID()); + if (getC_BPartner_ID() == 0) + setC_BPartner_ID (m_doc.getC_BPartner_ID()); + // Sales Region from BPLocation/Sales Rep + // Trx Org + if (m_docLine != null) + setAD_OrgTrx_ID (m_docLine.getAD_OrgTrx_ID()); + if (getAD_OrgTrx_ID() == 0) + setAD_OrgTrx_ID (m_doc.getAD_OrgTrx_ID()); + // Project + if (m_docLine != null) + setC_Project_ID (m_docLine.getC_Project_ID()); + if (getC_Project_ID() == 0) + setC_Project_ID (m_doc.getC_Project_ID()); + // Campaign + if (m_docLine != null) + setC_Campaign_ID (m_docLine.getC_Campaign_ID()); + if (getC_Campaign_ID() == 0) + setC_Campaign_ID (m_doc.getC_Campaign_ID()); + // Activity + if (m_docLine != null) + setC_Activity_ID (m_docLine.getC_Activity_ID()); + if (getC_Activity_ID() == 0) + setC_Activity_ID (m_doc.getC_Activity_ID()); + // User List 1 + if (m_docLine != null) + setUser1_ID (m_docLine.getUser1_ID()); + if (getUser1_ID() == 0) + setUser1_ID (m_doc.getUser1_ID()); + // User List 2 + if (m_docLine != null) + setUser2_ID (m_docLine.getUser2_ID()); + if (getUser2_ID() == 0) + setUser2_ID (m_doc.getUser2_ID()); + // References in setAccount + } // setDocumentInfo + + /** + * Get Document Line + * @return doc line + */ + protected DocLine getDocLine() + { + return m_docLine; + } // getDocLine + + /** + * Set Description + * @param description description + */ + public void addDescription (String description) + { + String original = getDescription(); + if (original == null || original.trim().length() == 0) + super.setDescription(description); + else + super.setDescription(original + " - " + description); + } // addDescription + + /** + * Set Warehouse Locator. + * - will overwrite Organization - + * @param M_Locator_ID locator + */ + public void setM_Locator_ID (int M_Locator_ID) + { + super.setM_Locator_ID (M_Locator_ID); + setAD_Org_ID(0); // reset + } // setM_Locator_ID + + + /************************************************************************** + * Set Location + * @param C_Location_ID location + * @param isFrom from + */ + public void setLocation (int C_Location_ID, boolean isFrom) + { + if (isFrom) + setC_LocFrom_ID (C_Location_ID); + else + setC_LocTo_ID (C_Location_ID); + } // setLocator + + /** + * Set Location from Locator + * @param M_Locator_ID locator + * @param isFrom from + */ + public void setLocationFromLocator (int M_Locator_ID, boolean isFrom) + { + if (M_Locator_ID == 0) + return; + int C_Location_ID = 0; + String sql = "SELECT w.C_Location_ID FROM M_Warehouse w, M_Locator l " + + "WHERE w.M_Warehouse_ID=l.M_Warehouse_ID AND l.M_Locator_ID=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName()); + pstmt.setInt(1, M_Locator_ID); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + C_Location_ID = rs.getInt(1); + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + return; + } + if (C_Location_ID != 0) + setLocation (C_Location_ID, isFrom); + } // setLocationFromLocator + + /** + * Set Location from Busoness Partner Location + * @param C_BPartner_Location_ID bp location + * @param isFrom from + */ + public void setLocationFromBPartner (int C_BPartner_Location_ID, boolean isFrom) + { + if (C_BPartner_Location_ID == 0) + return; + int C_Location_ID = 0; + String sql = "SELECT C_Location_ID FROM C_BPartner_Location WHERE C_BPartner_Location_ID=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName()); + pstmt.setInt(1, C_BPartner_Location_ID); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + C_Location_ID = rs.getInt(1); + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + return; + } + if (C_Location_ID != 0) + setLocation (C_Location_ID, isFrom); + } // setLocationFromBPartner + + /** + * Set Location from Organization + * @param AD_Org_ID org + * @param isFrom from + */ + public void setLocationFromOrg (int AD_Org_ID, boolean isFrom) + { + if (AD_Org_ID == 0) + return; + int C_Location_ID = 0; + String sql = "SELECT C_Location_ID FROM AD_OrgInfo WHERE AD_Org_ID=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName()); + pstmt.setInt(1, AD_Org_ID); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + C_Location_ID = rs.getInt(1); + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + return; + } + if (C_Location_ID != 0) + setLocation (C_Location_ID, isFrom); + } // setLocationFromOrg + + + /************************************************************************** + * Returns Source Balance of line + * @return source balance + */ + public BigDecimal getSourceBalance() + { + if (getAmtSourceDr() == null) + setAmtSourceDr (Env.ZERO); + if (getAmtSourceCr() == null) + setAmtSourceCr (Env.ZERO); + // + return getAmtSourceDr().subtract(getAmtSourceCr()); + } // getSourceBalance + + /** + * Is Debit Source Balance + * @return true if DR source balance + */ + public boolean isDrSourceBalance() + { + return getSourceBalance().signum() != -1; + } // isDrSourceBalance + + /** + * Get Accounted Balance + * @return accounting balance + */ + public BigDecimal getAcctBalance() + { + if (getAmtAcctDr() == null) + setAmtAcctDr (Env.ZERO); + if (getAmtAcctCr() == null) + setAmtAcctCr (Env.ZERO); + return getAmtAcctDr().subtract(getAmtAcctCr()); + } // getAcctBalance + + /** + * Is Account on Balance Sheet + * @return true if account is a balance sheet account + */ + public boolean isBalanceSheet() + { + return m_acct.isBalanceSheet(); + } // isBalanceSheet + + /** + * Currect Accounting Amount. + *
+	 *  Example:    1       -1      1       -1
+	 *  Old         100/0   100/0   0/100   0/100
+	 *  New         99/0    101/0   0/99    0/101
+	 *  
+ * @param deltaAmount delta amount + */ + public void currencyCorrect (BigDecimal deltaAmount) + { + boolean negative = deltaAmount.compareTo(Env.ZERO) < 0; + boolean adjustDr = getAmtAcctDr().abs().compareTo(getAmtAcctCr().abs()) > 0; + + log.fine(deltaAmount.toString() + + "; Old-AcctDr=" + getAmtAcctDr() + ",AcctCr=" + getAmtAcctCr() + + "; Negative=" + negative + "; AdjustDr=" + adjustDr); + + if (adjustDr) + if (negative) + setAmtAcctDr (getAmtAcctDr().subtract(deltaAmount)); + else + setAmtAcctDr (getAmtAcctDr().subtract(deltaAmount)); + else + if (negative) + setAmtAcctCr (getAmtAcctCr().add(deltaAmount)); + else + setAmtAcctCr (getAmtAcctCr().add(deltaAmount)); + + log.fine("New-AcctDr=" + getAmtAcctDr() + ",AcctCr=" + getAmtAcctCr()); + } // currencyCorrect + + /** + * Convert to Accounted Currency + * @return true if converted + */ + public boolean convert () + { + // Document has no currency + if (getC_Currency_ID() == Doc.NO_CURRENCY) + setC_Currency_ID (m_acctSchema.getC_Currency_ID()); + + if (m_acctSchema.getC_Currency_ID() == getC_Currency_ID()) + { + setAmtAcctDr (getAmtSourceDr()); + setAmtAcctCr (getAmtSourceCr()); + return true; + } + // Get Conversion Type from Line or Header + int C_ConversionType_ID = 0; + int AD_Org_ID = 0; + if (m_docLine != null) // get from line + { + C_ConversionType_ID = m_docLine.getC_ConversionType_ID(); + AD_Org_ID = m_docLine.getAD_Org_ID(); + } + if (C_ConversionType_ID == 0) // get from header + { + if (m_doc == null) + { + log.severe ("No Document VO"); + return false; + } + C_ConversionType_ID = m_doc.getC_ConversionType_ID(); + if (AD_Org_ID == 0) + AD_Org_ID = m_doc.getAD_Org_ID(); + } + setAmtAcctDr (MConversionRate.convert (getCtx(), + getAmtSourceDr(), getC_Currency_ID(), m_acctSchema.getC_Currency_ID(), + getDateAcct(), C_ConversionType_ID, m_doc.getAD_Client_ID(), AD_Org_ID)); + if (getAmtAcctDr() == null) + return false; + setAmtAcctCr (MConversionRate.convert (getCtx(), + getAmtSourceCr(), getC_Currency_ID(), m_acctSchema.getC_Currency_ID(), + getDateAcct(), C_ConversionType_ID, m_doc.getAD_Client_ID(), AD_Org_ID)); + return true; + } // convert + + /** + * Get Account + * @return account + */ + public MAccount getAccount() + { + return m_acct; + } // getAccount + + /** + * To String + * @return String + */ + public String toString() + { + StringBuffer sb = new StringBuffer("FactLine=["); + sb.append(getAD_Table_ID()).append(":").append(getRecord_ID()) + .append(",").append(m_acct) + .append(",Cur=").append(getC_Currency_ID()) + .append(", DR=").append(getAmtSourceDr()).append("|").append(getAmtAcctDr()) + .append(", CR=").append(getAmtSourceCr()).append("|").append(getAmtAcctCr()) + .append("]"); + return sb.toString(); + } // toString + + + /** + * Get AD_Org_ID (balancing segment). + * (if not set directly - from document line, document, account, locator) + *

+ * Note that Locator needs to be set before - otherwise + * segment balancing might produce the wrong results + * @return AD_Org_ID + */ + public int getAD_Org_ID() + { + if (super.getAD_Org_ID() != 0) // set earlier + return super.getAD_Org_ID(); + // Prio 1 - get from locator - if exist + if (getM_Locator_ID() != 0) + { + String sql = "SELECT AD_Org_ID FROM M_Locator WHERE M_Locator_ID=? AND AD_Client_ID=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName()); + pstmt.setInt(1, getM_Locator_ID()); + pstmt.setInt(2, getAD_Client_ID()); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + setAD_Org_ID (rs.getInt(1)); + log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (1 from M_Locator_ID=" + getM_Locator_ID() + ")"); + } + else + log.log(Level.SEVERE, "AD_Org_ID - Did not find M_Locator_ID=" + getM_Locator_ID()); + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + } // M_Locator_ID != 0 + + // Prio 2 - get from doc line - if exists (document context overwrites) + if (m_docLine != null && super.getAD_Org_ID() == 0) + { + setAD_Org_ID (m_docLine.getAD_Org_ID()); + log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (2 from DocumentLine)"); + } + // Prio 3 - get from doc - if not GL + if (m_doc != null && super.getAD_Org_ID() == 0) + { + if (Doc.DOCTYPE_GLJournal.equals (m_doc.getDocumentType())) + { + setAD_Org_ID (m_acct.getAD_Org_ID()); // inter-company GL + log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (3 from Acct)"); + } + else + { + setAD_Org_ID (m_doc.getAD_Org_ID()); + log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (3 from Document)"); + } + } + // Prio 4 - get from account - if not GL + if (m_doc != null && super.getAD_Org_ID() == 0) + { + if (Doc.DOCTYPE_GLJournal.equals (m_doc.getDocumentType())) + { + setAD_Org_ID (m_doc.getAD_Org_ID()); + log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (4 from Document)"); + } + else + { + setAD_Org_ID (m_acct.getAD_Org_ID()); + log.finer("AD_Org_ID=" + super.getAD_Org_ID() + " (4 from Acct)"); + } + } + return super.getAD_Org_ID(); + } // setAD_Org_ID + + + /** + * Get/derive Sales Region + * @return Sales Region + */ + public int getC_SalesRegion_ID () + { + if (super.getC_SalesRegion_ID() != 0) + return super.getC_SalesRegion_ID(); + // + if (m_docLine != null) + setC_SalesRegion_ID (m_docLine.getC_SalesRegion_ID()); + if (m_doc != null) + { + if (super.getC_SalesRegion_ID() == 0) + setC_SalesRegion_ID (m_doc.getC_SalesRegion_ID()); + if (super.getC_SalesRegion_ID() == 0 && m_doc.getBP_C_SalesRegion_ID() > 0) + setC_SalesRegion_ID (m_doc.getBP_C_SalesRegion_ID()); + // derive SalesRegion if AcctSegment + if (super.getC_SalesRegion_ID() == 0 + && m_doc.getC_BPartner_Location_ID() != 0 + && m_doc.getBP_C_SalesRegion_ID() == -1) // never tried + // && m_acctSchema.isAcctSchemaElement(MAcctSchemaElement.ELEMENTTYPE_SalesRegion)) + { + String sql = "SELECT COALESCE(C_SalesRegion_ID,0) FROM C_BPartner_Location WHERE C_BPartner_Location_ID=?"; + setC_SalesRegion_ID (DB.getSQLValue(null, + sql, m_doc.getC_BPartner_Location_ID())); + if (super.getC_SalesRegion_ID() != 0) // save in VO + { + m_doc.setBP_C_SalesRegion_ID(super.getC_SalesRegion_ID()); + log.fine("C_SalesRegion_ID=" + super.getC_SalesRegion_ID() + " (from BPL)" ); + } + else // From Sales Rep of Document -> Sales Region + { + sql = "SELECT COALESCE(MAX(C_SalesRegion_ID),0) FROM C_SalesRegion WHERE SalesRep_ID=?"; + setC_SalesRegion_ID (DB.getSQLValue(null, + sql, m_doc.getSalesRep_ID())); + if (super.getC_SalesRegion_ID() != 0) // save in VO + { + m_doc.setBP_C_SalesRegion_ID(super.getC_SalesRegion_ID()); + log.fine("C_SalesRegion_ID=" + super.getC_SalesRegion_ID() + " (from SR)" ); + } + else + m_doc.setBP_C_SalesRegion_ID(-2); // don't try again + } + } + if (m_acct != null && super.getC_SalesRegion_ID() == 0) + setC_SalesRegion_ID (m_acct.getC_SalesRegion_ID()); + } + // + // log.fine("C_SalesRegion_ID=" + super.getC_SalesRegion_ID() + // + ", C_BPartner_Location_ID=" + m_docVO.C_BPartner_Location_ID + // + ", BP_C_SalesRegion_ID=" + m_docVO.BP_C_SalesRegion_ID + // + ", SR=" + m_acctSchema.isAcctSchemaElement(MAcctSchemaElement.ELEMENTTYPE_SalesRegion)); + return super.getC_SalesRegion_ID(); + } // getC_SalesRegion_ID + + + /** + * Before Save + * @param newRecord new + * @return true + */ + protected boolean beforeSave (boolean newRecord) + { + if (newRecord) + { + log.fine(toString()); + // + getAD_Org_ID(); + getC_SalesRegion_ID(); + // Set Default Account Info + if (getM_Product_ID() == 0) + setM_Product_ID (m_acct.getM_Product_ID()); + if (getC_LocFrom_ID() == 0) + setC_LocFrom_ID (m_acct.getC_LocFrom_ID()); + if (getC_LocTo_ID() == 0) + setC_LocTo_ID (m_acct.getC_LocTo_ID()); + if (getC_BPartner_ID() == 0) + setC_BPartner_ID (m_acct.getC_BPartner_ID()); + if (getAD_OrgTrx_ID() == 0) + setAD_OrgTrx_ID (m_acct.getAD_OrgTrx_ID()); + if (getC_Project_ID() == 0) + setC_Project_ID (m_acct.getC_Project_ID()); + if (getC_Campaign_ID() == 0) + setC_Campaign_ID (m_acct.getC_Campaign_ID()); + if (getC_Activity_ID() == 0) + setC_Activity_ID (m_acct.getC_Activity_ID()); + if (getUser1_ID() == 0) + setUser1_ID (m_acct.getUser1_ID()); + if (getUser2_ID() == 0) + setUser2_ID (m_acct.getUser2_ID()); + + // Revenue Recognition for AR Invoices + if (m_doc.getDocumentType().equals(Doc.DOCTYPE_ARInvoice) + && m_docLine != null + && m_docLine.getC_RevenueRecognition_ID() != 0) + { + int AD_User_ID = 0; + setAccount_ID ( + createRevenueRecognition ( + m_docLine.getC_RevenueRecognition_ID(), m_docLine.get_ID(), + getAD_Client_ID(), getAD_Org_ID(), AD_User_ID, + getAccount_ID(), getC_SubAcct_ID(), + getM_Product_ID(), getC_BPartner_ID(), getAD_OrgTrx_ID(), + getC_LocFrom_ID(), getC_LocTo_ID(), + getC_SalesRegion_ID(), getC_Project_ID(), + getC_Campaign_ID(), getC_Activity_ID(), + getUser1_ID(), getUser2_ID(), + getUserElement1_ID(), getUserElement2_ID()) + ); + } + } + return true; + } // beforeSave + + + /************************************************************************** + * Revenue Recognition. + * Called from FactLine.save + *

+ * Create Revenue recognition plan and return Unearned Revenue account + * to be used instead of Revenue Account. If not found, it returns + * the revenue account. + * + * @param C_RevenueRecognition_ID revenue recognition + * @param C_InvoiceLine_ID invoice line + * @param AD_Client_ID client + * @param AD_Org_ID org + * @param AD_User_ID user + * @param Account_ID of Revenue Account + * @param C_SubAcct_ID sub account + * @param M_Product_ID product + * @param C_BPartner_ID bpartner + * @param AD_OrgTrx_ID trx org + * @param C_LocFrom_ID loc from + * @param C_LocTo_ID loc to + * @param C_SRegion_ID sales region + * @param C_Project_ID project + * @param C_Campaign_ID campaign + * @param C_Activity_ID activity + * @param User1_ID user1 + * @param User2_ID user2 + * @param UserElement1_ID user element 1 + * @param UserElement2_ID user element 2 + * @return Account_ID for Unearned Revenue or Revenue Account if not found + */ + private int createRevenueRecognition ( + int C_RevenueRecognition_ID, int C_InvoiceLine_ID, + int AD_Client_ID, int AD_Org_ID, int AD_User_ID, + int Account_ID, int C_SubAcct_ID, + int M_Product_ID, int C_BPartner_ID, int AD_OrgTrx_ID, + int C_LocFrom_ID, int C_LocTo_ID, int C_SRegion_ID, int C_Project_ID, + int C_Campaign_ID, int C_Activity_ID, + int User1_ID, int User2_ID, int UserElement1_ID, int UserElement2_ID) + { + log.fine("From Accout_ID=" + Account_ID); + // get VC for P_Revenue (from Product) + MAccount revenue = MAccount.get(getCtx(), + AD_Client_ID, AD_Org_ID, getC_AcctSchema_ID(), Account_ID, C_SubAcct_ID, + M_Product_ID, C_BPartner_ID, AD_OrgTrx_ID, C_LocFrom_ID, C_LocTo_ID, C_SRegion_ID, + C_Project_ID, C_Campaign_ID, C_Activity_ID, + User1_ID, User2_ID, UserElement1_ID, UserElement2_ID); + if (revenue != null && revenue.get_ID() == 0) + revenue.save(); + if (revenue == null || revenue.get_ID() == 0) + { + log.severe ("Revenue_Acct not found"); + return Account_ID; + } + int P_Revenue_Acct = revenue.get_ID(); + + // get Unearned Revenue Acct from BPartner Group + int UnearnedRevenue_Acct = 0; + int new_Account_ID = 0; + String sql = "SELECT ga.UnearnedRevenue_Acct, vc.Account_ID " + + "FROM C_BP_Group_Acct ga, C_BPartner p, C_ValidCombination vc " + + "WHERE ga.C_BP_Group_ID=p.C_BP_Group_ID" + + " AND ga.UnearnedRevenue_Acct=vc.C_ValidCombination_ID" + + " AND ga.C_AcctSchema_ID=? AND p.C_BPartner_ID=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName()); + pstmt.setInt(1, getC_AcctSchema_ID()); + pstmt.setInt(2, C_BPartner_ID); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + UnearnedRevenue_Acct = rs.getInt(1); + new_Account_ID = rs.getInt(2); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + if (new_Account_ID == 0) + { + log.severe ("UnearnedRevenue_Acct not found"); + return Account_ID; + } + + MRevenueRecognitionPlan plan = new MRevenueRecognitionPlan(getCtx(), 0, null); + plan.setC_RevenueRecognition_ID (C_RevenueRecognition_ID); + plan.setC_AcctSchema_ID (getC_AcctSchema_ID()); + plan.setC_InvoiceLine_ID (C_InvoiceLine_ID); + plan.setUnEarnedRevenue_Acct (UnearnedRevenue_Acct); + plan.setP_Revenue_Acct (P_Revenue_Acct); + plan.setC_Currency_ID (getC_Currency_ID()); + plan.setTotalAmt (getAcctBalance()); + if (!plan.save(get_TrxName())) + { + log.severe ("Plan NOT created"); + return Account_ID; + } + log.fine("From Acctount_ID=" + Account_ID + " to " + new_Account_ID + + " - Plan from UnearnedRevenue_Acct=" + UnearnedRevenue_Acct + " to Revenue_Acct=" + P_Revenue_Acct); + return new_Account_ID; + } // createRevenueRecognition + + + /************************************************************************** + * Update Line with reversed Original Amount in Accounting Currency. + * Also copies original dimensions like Project, etc. + * Called from Doc_MatchInv + * @param AD_Table_ID table + * @param Record_ID record + * @param Line_ID line + * @param multiplier targetQty/documentQty + * @return true if success + */ + public boolean updateReverseLine (int AD_Table_ID, int Record_ID, int Line_ID, + BigDecimal multiplier) + { + boolean success = false; + + String sql = "SELECT * " + + "FROM Fact_Acct " + + "WHERE C_AcctSchema_ID=? AND AD_Table_ID=? AND Record_ID=?" + + " AND Line_ID=? AND Account_ID=?"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName()); + pstmt.setInt(1, getC_AcctSchema_ID()); + pstmt.setInt(2, AD_Table_ID); + pstmt.setInt(3, Record_ID); + pstmt.setInt(4, Line_ID); + pstmt.setInt(5, m_acct.getAccount_ID()); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + MFactAcct fact = new MFactAcct(getCtx(), rs, get_TrxName()); + // Accounted Amounts - reverse + BigDecimal dr = fact.getAmtAcctDr(); + BigDecimal cr = fact.getAmtAcctCr(); + // setAmtAcctDr (cr.multiply(multiplier)); + // setAmtAcctCr (dr.multiply(multiplier)); + setAmtAcct(fact.getC_Currency_ID(), cr.multiply(multiplier), dr.multiply(multiplier)); + // Source Amounts + setAmtSource(fact.getC_Currency_ID(), getAmtAcctDr(), getAmtAcctCr()); + // + success = true; + log.fine(new StringBuffer("(Table=").append(AD_Table_ID) + .append(",Record_ID=").append(Record_ID) + .append(",Line=").append(Record_ID) + .append(", Account=").append(m_acct) + .append(",dr=").append(dr).append(",cr=").append(cr) + .append(") - DR=").append(getAmtSourceDr()).append("|").append(getAmtAcctDr()) + .append(", CR=").append(getAmtSourceCr()).append("|").append(getAmtAcctCr()) + .toString()); + // Dimensions + setAD_OrgTrx_ID(fact.getAD_OrgTrx_ID()); + setC_Project_ID (fact.getC_Project_ID()); + setC_Activity_ID(fact.getC_Activity_ID()); + setC_Campaign_ID(fact.getC_Campaign_ID()); + setC_SalesRegion_ID(fact.getC_SalesRegion_ID()); + setC_LocFrom_ID(fact.getC_LocFrom_ID()); + setC_LocTo_ID(fact.getC_LocTo_ID()); + setM_Product_ID(fact.getM_Product_ID()); + setM_Locator_ID(fact.getM_Locator_ID()); + setUser1_ID(fact.getUser1_ID()); + setUser2_ID(fact.getUser2_ID()); + setC_UOM_ID(fact.getC_UOM_ID()); + setC_Tax_ID(fact.getC_Tax_ID()); + // Org for cross charge + setAD_Org_ID (fact.getAD_Org_ID()); + } + else + log.warning(new StringBuffer("Not Found (try later) ") + .append(",C_AcctSchema_ID=").append(getC_AcctSchema_ID()) + .append(", AD_Table_ID=").append(AD_Table_ID) + .append(",Record_ID=").append(Record_ID) + .append(",Line_ID=").append(Line_ID) + .append(", Account_ID=").append(m_acct.getAccount_ID()).toString()); + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + return success; + } // updateReverseLine + +} // FactLine diff --git a/base/src/org/compiere/acct/Matcher.java b/base/src/org/compiere/acct/Matcher.java new file mode 100644 index 0000000000..0a7e8886b3 --- /dev/null +++ b/base/src/org/compiere/acct/Matcher.java @@ -0,0 +1,165 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.logging.*; +import org.compiere.util.*; + +/** + * Automatic Matching. + * Inv + * + * @author Jorg Janke + * @version $Id: Matcher.java,v 1.2 2006/07/30 00:53:33 jjanke Exp $ + */ +public class Matcher +{ + /** + * Constructor + * @param AD_Client_ID Client + * @param trxName transaction + */ + public Matcher (int AD_Client_ID, String trxName) + { + m_AD_Client_ID = AD_Client_ID; + m_trxName = trxName; + } // Matcher + + /** Client */ + private int m_AD_Client_ID; + /** Transaction */ + private String m_trxName = null; + /** Logger */ + protected CLogger log = CLogger.getCLogger (getClass()); + + /** + * Matching + *

+	 *  Derive Invoice-Receipt Match from PO-Invoice and PO-Receipt
+	 * 	Purchase Order (20)
+	 *  - Invoice1 (10)
+	 *  - Invoice2 (10)
+	 *  - Receipt1 (5)
+	 *  - Receipt2 (15)
+	 *
+	 * 	(a) Creates Directs
+	 * 		- Invoice1 - Receipt1 (5)
+	 * 		- Invoice2 - Receipt2 (10)
+	 *
+	 *  (b) Creates Indirects
+	 * 		- Invoice1 - Receipt2 (5)
+	 *  (Not imlemented)
+	 *
+	 *
+	 *  
+ * @return number of records created + */ + public int match() + { + int counter = 0; + // (a) Direct Matches + String sql = "SELECT m1.AD_Client_ID,m2.AD_Org_ID, " // 1..2 + + "m1.C_InvoiceLine_ID,m2.M_InOutLine_ID,m1.M_Product_ID, " // 3..5 + + "m1.DateTrx,m2.DateTrx, m1.Qty, m2.Qty " // 6..9 + + "FROM M_MatchPO m1, M_MatchPO m2 " + + "WHERE m1.C_OrderLine_ID=m2.C_OrderLine_ID" + + " AND m1.M_InOutLine_ID IS NULL" + + " AND m2.C_InvoiceLine_ID IS NULL" + + " AND m1.M_Product_ID=m2.M_Product_ID" + + " AND m1.AD_Client_ID=?" // #1 + // Not existing Inv Matches + + " AND NOT EXISTS (SELECT * FROM M_MatchInv mi " + + "WHERE mi.C_InvoiceLine_ID=m1.C_InvoiceLine_ID AND mi.M_InOutLine_ID=m2.M_InOutLine_ID)"; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, m_AD_Client_ID); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) + { + BigDecimal qty1 = rs.getBigDecimal(8); + BigDecimal qty2 = rs.getBigDecimal(9); + BigDecimal Qty = qty1.min(qty2); + if (Qty.equals(Env.ZERO)) + continue; + Timestamp dateTrx1 = rs.getTimestamp(6); + Timestamp dateTrx2 = rs.getTimestamp(7); + Timestamp DateTrx = dateTrx1; + if (dateTrx1.before(dateTrx2)) + DateTrx = dateTrx2; + // + int AD_Client_ID = rs.getInt(1); + int AD_Org_ID = rs.getInt(2); + int C_InvoiceLine_ID = rs.getInt(3); + int M_InOutLine_ID = rs.getInt(4); + int M_Product_ID = rs.getInt(5); + // + if (createMatchInv(AD_Client_ID, AD_Org_ID, + M_InOutLine_ID, C_InvoiceLine_ID, + M_Product_ID, DateTrx, Qty)) + counter++; + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, "match", e); + } + log.fine("Matcher.match - Client_ID=" + m_AD_Client_ID + + ", Records created=" + counter); + return counter; + } // match + + /** + * Create MatchInv record + * @param AD_Client_ID Client + * @param AD_Org_ID Org + * @param M_InOutLine_ID Receipt + * @param C_InvoiceLine_ID Invoice + * @param M_Product_ID Product + * @param DateTrx Date + * @param Qty Qty + * @return true if record created + */ + private boolean createMatchInv (int AD_Client_ID, int AD_Org_ID, + int M_InOutLine_ID, int C_InvoiceLine_ID, + int M_Product_ID, Timestamp DateTrx, BigDecimal Qty) + { + log.fine("InvLine=" + C_InvoiceLine_ID + ",Rec=" + M_InOutLine_ID + ", Qty=" + Qty + ", " + DateTrx); + + // MMatchInv inv = new MMatchInv (); + int M_MatchInv_ID = DB.getNextID (AD_Client_ID, "M_MatchInv", m_trxName); + // + StringBuffer sql = new StringBuffer("INSERT INTO M_MatchInv (" + + "M_MatchInv_ID, " + + "AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy, " + + "M_InOutLine_ID,C_InvoiceLine_ID, " + + "M_Product_ID,DateTrx,Qty, " + + "Processing,Processed,Posted) VALUES (") + .append(M_MatchInv_ID).append(", ") + .append(AD_Client_ID).append(",").append(AD_Org_ID).append(",'Y',SysDate,0,SysDate,0, ") + .append(M_InOutLine_ID).append(",").append(C_InvoiceLine_ID).append(", ") + .append(M_Product_ID).append(",").append(DB.TO_DATE(DateTrx,true)).append(",").append(Qty) + .append(", 'N','Y','N')"); + int no = DB.executeUpdate(sql.toString(), m_trxName); + return no == 1; + } // createMatchInv + +} // Matcher diff --git a/base/src/org/compiere/acct/ProductInfo.java b/base/src/org/compiere/acct/ProductInfo.java new file mode 100644 index 0000000000..fd744a3644 --- /dev/null +++ b/base/src/org/compiere/acct/ProductInfo.java @@ -0,0 +1,390 @@ +/****************************************************************************** + * 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.acct; + +import java.math.*; +import java.sql.*; +import java.util.logging.*; +import org.compiere.model.*; +import org.compiere.util.*; + +/** + * Product Costing Information. + * + * @author Jorg Janke + * @version $Id: ProductInfo.java,v 1.2 2006/07/30 00:53:33 jjanke Exp $ + */ +public class ProductInfo +{ + /** + * Constructor + * @param M_Product_ID Product + * @param trxName transcation + */ + public ProductInfo (int M_Product_ID, String trxName) + { + m_trxName = trxName; + init (M_Product_ID); + } // ProductInfo + + /** The Product Key */ + private int m_M_Product_ID = 0; + /** Transaction */ + private String m_trxName = null; + + // Product Info + private int m_AD_Client_ID = 0; + private int m_AD_Org_ID = 0; + + private String m_productType = null; + private String m_ProductCategory = null; + + private boolean m_isBOM = false; + private boolean m_isStocked = true; + + private int m_C_RevenueRecognition_ID = 0; + + private int m_C_UOM_ID = 0; + private BigDecimal m_qty = Env.ZERO; + + /** Logger */ + protected CLogger log = CLogger.getCLogger (getClass()); + + /** + * Get Product Info (Service, Revenue Recognition). + * automatically called by constructor + * @param M_Product_ID Product + */ + private void init (int M_Product_ID) + { + m_M_Product_ID = M_Product_ID; + if (m_M_Product_ID == 0) + return; + + String sql = "SELECT p.ProductType, pc.Value, " // 1..2 + + "p.C_RevenueRecognition_ID,p.C_UOM_ID, " // 3..4 + + "p.AD_Client_ID,p.AD_Org_ID, " // 5..6 + + "p.IsBOM, p.IsStocked " // 7..8 + + "FROM M_Product_Category pc" + + " INNER JOIN M_Product p ON (pc.M_Product_Category_ID=p.M_Product_Category_ID) " + + "WHERE p.M_Product_ID=?"; // #1 + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, m_M_Product_ID); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + m_productType = rs.getString(1); + m_ProductCategory = rs.getString(2); + m_C_RevenueRecognition_ID = rs.getInt(3); + m_C_UOM_ID = rs.getInt(4); + // reference + m_AD_Client_ID = rs.getInt(5); + m_AD_Org_ID = rs.getInt(6); + // + m_isBOM = "Y".equals(rs.getString(7)); + m_isStocked = "Y".equals(rs.getString(8)); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + } // init + + /** + * Is Product/Item + * @return true if product + */ + public boolean isProduct() + { + return MProduct.PRODUCTTYPE_Item.equals(m_productType); + } // isProduct + + /** + * Is it a BOM + * @return true if BOM + */ + public boolean isBOM() + { + return m_isBOM; + } // isBOM + + /** + * Is it stocked + * @return true if stocked + */ + public boolean isStocked() + { + return m_isStocked; + } // isStocked + + /** + * Is Service + * @return true if service + */ + public boolean isService() + { + return MProduct.PRODUCTTYPE_Service.equals(m_productType); + } // isService + + /** + * Get Product Category (Value) + * @return M_Product_Category_ID + */ + public String getProductCategory() + { + return m_ProductCategory; + } // getProductCategory + + /** + * Has Revenue Recognition + * @return true if product/service has revenue recognition + */ + public boolean isRevenueRecognition() + { + return m_C_RevenueRecognition_ID != 0; + } // isRevenueRecognition + + /** + * Get Revenue Recognition + * @return C_RevenueRecognition_ID + */ + public int getC_RevenueRecognition_ID() + { + return m_C_RevenueRecognition_ID; + } // getC_RevenueRecognition_ID + + /** + * Quantity UOM + * @return C_UOM_ID + */ + public int getC_UOM_ID() + { + return m_C_UOM_ID; + } // getC_UOM_ID + + /*************************************************************************/ + + /** + * Set Quantity in Storage UOM + * @param qty quantity + */ + public void setQty (BigDecimal qty) + { + m_qty = qty; + } // setQty + + /** + * Set Quantity in UOM + * @param qty quantity + * @param C_UOM_ID UOM + */ + public void setQty (BigDecimal qty, int C_UOM_ID) + { + m_qty = MUOMConversion.convert (C_UOM_ID, m_C_UOM_ID, qty, true); // StdPrecision + if (qty != null && m_qty == null) // conversion error + { + log.severe ("Conversion error - set to " + qty); + m_qty = qty; + } + } // setQty + + /** + * Get Qty in Storage UOM + * @return qty + */ + public BigDecimal getQty() + { + return m_qty; + } // getQty + + + + /** + * Update/Create initial Cost Record. + * Check first for Purchase Price List, + * then Product Purchase Costs + * and then Price List + * @param as accounting schema + * @param create create record + * @return costs + */ + private BigDecimal updateCosts (MAcctSchema as, boolean create) + { + // Create Zero Record + if (create) + { + StringBuffer sql = new StringBuffer ("INSERT INTO M_Product_Costing " + + "(M_Product_ID,C_AcctSchema_ID," + + " AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy," + + " CurrentCostPrice,CostStandard,FutureCostPrice," + + " CostStandardPOQty,CostStandardPOAmt,CostStandardCumQty,CostStandardCumAmt," + + " CostAverage,CostAverageCumQty,CostAverageCumAmt," + + " PriceLastPO,PriceLastInv, TotalInvQty,TotalInvAmt) " + + "VALUES ("); + sql.append(m_M_Product_ID).append(",").append(as.getC_AcctSchema_ID()).append(",") + .append(m_AD_Client_ID).append(",").append(m_AD_Org_ID).append(",") + .append("'Y',SysDate,0,SysDate,0, 0,0,0, 0,0,0,0, 0,0,0, 0,0, 0,0)"); + int no = DB.executeUpdate(sql.toString(), m_trxName); + if (no == 1) + log.fine("CostingCreated"); + } + + // Try to find non ZERO Price + String costSource = "PriceList-PO"; + BigDecimal costs = getPriceList (as, true); + if (costs == null || costs.equals(Env.ZERO)) + { + costSource = "PO Cost"; + costs = getPOCost(as); + } + if (costs == null || costs.equals(Env.ZERO)) + { + costSource = "PriceList"; + costs = getPriceList (as, false); + } + + // if not found use $1 (to be able to do material transactions) + if (costs == null || costs.equals(Env.ZERO)) + { + costSource = "Not Found"; + costs = new BigDecimal("1"); + } + + // update current costs + StringBuffer sql = new StringBuffer ("UPDATE M_Product_Costing "); + sql.append("SET CurrentCostPrice=").append(costs) + .append(" WHERE M_Product_ID=").append(m_M_Product_ID) + .append(" AND C_AcctSchema_ID=").append(as.getC_AcctSchema_ID()); + int no = DB.executeUpdate(sql.toString(), m_trxName); + if (no == 1) + log.fine(costSource + " - " + costs); + return costs; + } // createCosts + + /** + * Get PO Price from PriceList - and convert it to AcctSchema Currency + * @param as accounting schema + * @param onlyPOPriceList use only PO price list + * @return po price + */ + private BigDecimal getPriceList (MAcctSchema as, boolean onlyPOPriceList) + { + StringBuffer sql = new StringBuffer ( + "SELECT pl.C_Currency_ID, pp.PriceList, pp.PriceStd, pp.PriceLimit " + + "FROM M_PriceList pl, M_PriceList_Version plv, M_ProductPrice pp " + + "WHERE pl.M_PriceList_ID = plv.M_PriceList_ID" + + " AND plv.M_PriceList_Version_ID = pp.M_PriceList_Version_ID" + + " AND pp.M_Product_ID=?"); + if (onlyPOPriceList) + sql.append(" AND pl.IsSOPriceList='N'"); + sql.append(" ORDER BY pl.IsSOPriceList ASC, plv.ValidFrom DESC"); + int C_Currency_ID = 0; + BigDecimal PriceList = null; + BigDecimal PriceStd = null; + BigDecimal PriceLimit = null; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql.toString(), null); + pstmt.setInt(1, m_M_Product_ID); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + C_Currency_ID = rs.getInt(1); + PriceList = rs.getBigDecimal(2); + PriceStd = rs.getBigDecimal(3); + PriceLimit = rs.getBigDecimal(4); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql.toString(), e); + } + // nothing found + if (C_Currency_ID == 0) + return null; + + BigDecimal price = PriceLimit; // best bet + if (price == null || price.equals(Env.ZERO)) + price = PriceStd; + if (price == null || price.equals(Env.ZERO)) + price = PriceList; + // Convert + if (price != null && !price.equals(Env.ZERO)) + price = MConversionRate.convert (as.getCtx(), + price, C_Currency_ID, as.getC_Currency_ID(), + as.getAD_Client_ID(), 0); + return price; + } // getPOPrice + + /** + * Get PO Cost from Purchase Info - and convert it to AcctSchema Currency + * @param as accounting schema + * @return po cost + */ + private BigDecimal getPOCost (MAcctSchema as) + { + String sql = "SELECT C_Currency_ID, PriceList,PricePO,PriceLastPO " + + "FROM M_Product_PO WHERE M_Product_ID=? " + + "ORDER BY IsCurrentVendor DESC"; + + int C_Currency_ID = 0; + BigDecimal PriceList = null; + BigDecimal PricePO = null; + BigDecimal PriceLastPO = null; + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, m_M_Product_ID); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + C_Currency_ID = rs.getInt(1); + PriceList = rs.getBigDecimal(2); + PricePO = rs.getBigDecimal(3); + PriceLastPO = rs.getBigDecimal(4); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + // nothing found + if (C_Currency_ID == 0) + return null; + + BigDecimal cost = PriceLastPO; // best bet + if (cost == null || cost.equals(Env.ZERO)) + cost = PricePO; + if (cost == null || cost.equals(Env.ZERO)) + cost = PriceList; + // Convert - standard precision!! - should be costing precision + if (cost != null && !cost.equals(Env.ZERO)) + cost = MConversionRate.convert (as.getCtx(), + cost, C_Currency_ID, as.getC_Currency_ID(), m_AD_Client_ID, m_AD_Org_ID); + return cost; + } // getPOCost + +} // ProductInfo diff --git a/dbPort/src/org/compiere/db/AdempiereDatabase.java b/base/src/org/compiere/db/AdempiereDatabase.java similarity index 100% rename from dbPort/src/org/compiere/db/AdempiereDatabase.java rename to base/src/org/compiere/db/AdempiereDatabase.java diff --git a/dbPort/src/org/compiere/db/CConnection.java b/base/src/org/compiere/db/CConnection.java similarity index 100% rename from dbPort/src/org/compiere/db/CConnection.java rename to base/src/org/compiere/db/CConnection.java diff --git a/dbPort/src/org/compiere/db/CConnectionDialog.java b/base/src/org/compiere/db/CConnectionDialog.java similarity index 100% rename from dbPort/src/org/compiere/db/CConnectionDialog.java rename to base/src/org/compiere/db/CConnectionDialog.java diff --git a/dbPort/src/org/compiere/db/CConnectionEditor.java b/base/src/org/compiere/db/CConnectionEditor.java similarity index 100% rename from dbPort/src/org/compiere/db/CConnectionEditor.java rename to base/src/org/compiere/db/CConnectionEditor.java diff --git a/dbPort/src/org/compiere/db/CreateAdempiere.java b/base/src/org/compiere/db/CreateAdempiere.java similarity index 100% rename from dbPort/src/org/compiere/db/CreateAdempiere.java rename to base/src/org/compiere/db/CreateAdempiere.java diff --git a/dbPort/src/org/compiere/db/DBRes.java b/base/src/org/compiere/db/DBRes.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes.java rename to base/src/org/compiere/db/DBRes.java diff --git a/dbPort/src/org/compiere/db/DBRes_ar.java b/base/src/org/compiere/db/DBRes_ar.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_ar.java rename to base/src/org/compiere/db/DBRes_ar.java diff --git a/dbPort/src/org/compiere/db/DBRes_bg.java b/base/src/org/compiere/db/DBRes_bg.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_bg.java rename to base/src/org/compiere/db/DBRes_bg.java diff --git a/dbPort/src/org/compiere/db/DBRes_ca.java b/base/src/org/compiere/db/DBRes_ca.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_ca.java rename to base/src/org/compiere/db/DBRes_ca.java diff --git a/dbPort/src/org/compiere/db/DBRes_da.java b/base/src/org/compiere/db/DBRes_da.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_da.java rename to base/src/org/compiere/db/DBRes_da.java diff --git a/dbPort/src/org/compiere/db/DBRes_de.java b/base/src/org/compiere/db/DBRes_de.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_de.java rename to base/src/org/compiere/db/DBRes_de.java diff --git a/dbPort/src/org/compiere/db/DBRes_es.java b/base/src/org/compiere/db/DBRes_es.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_es.java rename to base/src/org/compiere/db/DBRes_es.java diff --git a/dbPort/src/org/compiere/db/DBRes_fa.java b/base/src/org/compiere/db/DBRes_fa.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_fa.java rename to base/src/org/compiere/db/DBRes_fa.java diff --git a/dbPort/src/org/compiere/db/DBRes_fr.java b/base/src/org/compiere/db/DBRes_fr.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_fr.java rename to base/src/org/compiere/db/DBRes_fr.java diff --git a/dbPort/src/org/compiere/db/DBRes_hr.java b/base/src/org/compiere/db/DBRes_hr.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_hr.java rename to base/src/org/compiere/db/DBRes_hr.java diff --git a/dbPort/src/org/compiere/db/DBRes_in.java b/base/src/org/compiere/db/DBRes_in.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_in.java rename to base/src/org/compiere/db/DBRes_in.java diff --git a/dbPort/src/org/compiere/db/DBRes_it.java b/base/src/org/compiere/db/DBRes_it.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_it.java rename to base/src/org/compiere/db/DBRes_it.java diff --git a/dbPort/src/org/compiere/db/DBRes_ja.java b/base/src/org/compiere/db/DBRes_ja.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_ja.java rename to base/src/org/compiere/db/DBRes_ja.java diff --git a/dbPort/src/org/compiere/db/DBRes_ml.java b/base/src/org/compiere/db/DBRes_ml.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_ml.java rename to base/src/org/compiere/db/DBRes_ml.java diff --git a/dbPort/src/org/compiere/db/DBRes_nl.java b/base/src/org/compiere/db/DBRes_nl.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_nl.java rename to base/src/org/compiere/db/DBRes_nl.java diff --git a/dbPort/src/org/compiere/db/DBRes_no.java b/base/src/org/compiere/db/DBRes_no.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_no.java rename to base/src/org/compiere/db/DBRes_no.java diff --git a/dbPort/src/org/compiere/db/DBRes_pl.java b/base/src/org/compiere/db/DBRes_pl.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_pl.java rename to base/src/org/compiere/db/DBRes_pl.java diff --git a/dbPort/src/org/compiere/db/DBRes_pt.java b/base/src/org/compiere/db/DBRes_pt.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_pt.java rename to base/src/org/compiere/db/DBRes_pt.java diff --git a/dbPort/src/org/compiere/db/DBRes_ro.java b/base/src/org/compiere/db/DBRes_ro.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_ro.java rename to base/src/org/compiere/db/DBRes_ro.java diff --git a/dbPort/src/org/compiere/db/DBRes_ru.java b/base/src/org/compiere/db/DBRes_ru.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_ru.java rename to base/src/org/compiere/db/DBRes_ru.java diff --git a/dbPort/src/org/compiere/db/DBRes_sl.java b/base/src/org/compiere/db/DBRes_sl.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_sl.java rename to base/src/org/compiere/db/DBRes_sl.java diff --git a/dbPort/src/org/compiere/db/DBRes_sv.java b/base/src/org/compiere/db/DBRes_sv.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_sv.java rename to base/src/org/compiere/db/DBRes_sv.java diff --git a/dbPort/src/org/compiere/db/DBRes_th.java b/base/src/org/compiere/db/DBRes_th.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_th.java rename to base/src/org/compiere/db/DBRes_th.java diff --git a/dbPort/src/org/compiere/db/DBRes_vi.java b/base/src/org/compiere/db/DBRes_vi.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_vi.java rename to base/src/org/compiere/db/DBRes_vi.java diff --git a/dbPort/src/org/compiere/db/DBRes_zh.java b/base/src/org/compiere/db/DBRes_zh.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_zh.java rename to base/src/org/compiere/db/DBRes_zh.java diff --git a/dbPort/src/org/compiere/db/DBRes_zh_CN.java b/base/src/org/compiere/db/DBRes_zh_CN.java similarity index 100% rename from dbPort/src/org/compiere/db/DBRes_zh_CN.java rename to base/src/org/compiere/db/DBRes_zh_CN.java diff --git a/dbPort/src/org/compiere/db/DB_Oracle.java b/base/src/org/compiere/db/DB_Oracle.java similarity index 100% rename from dbPort/src/org/compiere/db/DB_Oracle.java rename to base/src/org/compiere/db/DB_Oracle.java diff --git a/dbPort/src/org/compiere/db/DB_PostgreSQL.java b/base/src/org/compiere/db/DB_PostgreSQL.java similarity index 100% rename from dbPort/src/org/compiere/db/DB_PostgreSQL.java rename to base/src/org/compiere/db/DB_PostgreSQL.java diff --git a/dbPort/src/org/compiere/db/Database.java b/base/src/org/compiere/db/Database.java similarity index 100% rename from dbPort/src/org/compiere/db/Database.java rename to base/src/org/compiere/db/Database.java diff --git a/dbPort/src/org/compiere/db/Database16.gif b/base/src/org/compiere/db/Database16.gif similarity index 100% rename from dbPort/src/org/compiere/db/Database16.gif rename to base/src/org/compiere/db/Database16.gif diff --git a/dbPort/src/org/compiere/db/JDBCInfo.java b/base/src/org/compiere/db/JDBCInfo.java similarity index 100% rename from dbPort/src/org/compiere/db/JDBCInfo.java rename to base/src/org/compiere/db/JDBCInfo.java diff --git a/dbPort/src/org/compiere/db/LDAP.java b/base/src/org/compiere/db/LDAP.java similarity index 100% rename from dbPort/src/org/compiere/db/LDAP.java rename to base/src/org/compiere/db/LDAP.java diff --git a/dbPort/src/org/compiere/db/Server16.gif b/base/src/org/compiere/db/Server16.gif similarity index 100% rename from dbPort/src/org/compiere/db/Server16.gif rename to base/src/org/compiere/db/Server16.gif diff --git a/dbPort/src/org/compiere/db/TestConnection.java b/base/src/org/compiere/db/TestConnection.java similarity index 100% rename from dbPort/src/org/compiere/db/TestConnection.java rename to base/src/org/compiere/db/TestConnection.java diff --git a/dbPort/src/org/compiere/db/TestEJB.java b/base/src/org/compiere/db/TestEJB.java similarity index 100% rename from dbPort/src/org/compiere/db/TestEJB.java rename to base/src/org/compiere/db/TestEJB.java diff --git a/dbPort/src/org/compiere/db/package.html b/base/src/org/compiere/db/package.html similarity index 100% rename from dbPort/src/org/compiere/db/package.html rename to base/src/org/compiere/db/package.html diff --git a/dbPort/src/org/compiere/dbPort/Convert.java b/base/src/org/compiere/dbPort/Convert.java similarity index 100% rename from dbPort/src/org/compiere/dbPort/Convert.java rename to base/src/org/compiere/dbPort/Convert.java diff --git a/dbPort/src/org/compiere/dbPort/ConvertDialog.java b/base/src/org/compiere/dbPort/ConvertDialog.java similarity index 100% rename from dbPort/src/org/compiere/dbPort/ConvertDialog.java rename to base/src/org/compiere/dbPort/ConvertDialog.java diff --git a/dbPort/src/org/compiere/dbPort/ConvertMap_PostgreSQL.java b/base/src/org/compiere/dbPort/ConvertMap_PostgreSQL.java similarity index 100% rename from dbPort/src/org/compiere/dbPort/ConvertMap_PostgreSQL.java rename to base/src/org/compiere/dbPort/ConvertMap_PostgreSQL.java diff --git a/dbPort/src/org/compiere/dbPort/Convert_Oracle.java b/base/src/org/compiere/dbPort/Convert_Oracle.java similarity index 100% rename from dbPort/src/org/compiere/dbPort/Convert_Oracle.java rename to base/src/org/compiere/dbPort/Convert_Oracle.java diff --git a/dbPort/src/org/compiere/dbPort/Convert_PostgreSQL.java b/base/src/org/compiere/dbPort/Convert_PostgreSQL.java similarity index 100% rename from dbPort/src/org/compiere/dbPort/Convert_PostgreSQL.java rename to base/src/org/compiere/dbPort/Convert_PostgreSQL.java diff --git a/dbPort/src/org/compiere/dbPort/Convert_PostgreSQLTest.java b/base/src/org/compiere/dbPort/Convert_PostgreSQLTest.java similarity index 100% rename from dbPort/src/org/compiere/dbPort/Convert_PostgreSQLTest.java rename to base/src/org/compiere/dbPort/Convert_PostgreSQLTest.java diff --git a/dbPort/src/org/compiere/dbPort/Convert_SQL92.java b/base/src/org/compiere/dbPort/Convert_SQL92.java similarity index 100% rename from dbPort/src/org/compiere/dbPort/Convert_SQL92.java rename to base/src/org/compiere/dbPort/Convert_SQL92.java diff --git a/dbPort/src/org/compiere/dbPort/JdbcTest.java b/base/src/org/compiere/dbPort/JdbcTest.java similarity index 100% rename from dbPort/src/org/compiere/dbPort/JdbcTest.java rename to base/src/org/compiere/dbPort/JdbcTest.java diff --git a/dbPort/src/org/compiere/dbPort/JdbcTestPG.java b/base/src/org/compiere/dbPort/JdbcTestPG.java similarity index 100% rename from dbPort/src/org/compiere/dbPort/JdbcTestPG.java rename to base/src/org/compiere/dbPort/JdbcTestPG.java diff --git a/dbPort/src/org/compiere/dbPort/Join.java b/base/src/org/compiere/dbPort/Join.java similarity index 100% rename from dbPort/src/org/compiere/dbPort/Join.java rename to base/src/org/compiere/dbPort/Join.java diff --git a/dbPort/src/org/compiere/dbPort/PostgresConvertTest.java b/base/src/org/compiere/dbPort/PostgresConvertTest.java similarity index 100% rename from dbPort/src/org/compiere/dbPort/PostgresConvertTest.java rename to base/src/org/compiere/dbPort/PostgresConvertTest.java diff --git a/dbPort/src/org/compiere/dbPort/package.html b/base/src/org/compiere/dbPort/package.html similarity index 100% rename from dbPort/src/org/compiere/dbPort/package.html rename to base/src/org/compiere/dbPort/package.html diff --git a/interfaces/src/org/compiere/interfaces/Server.java b/base/src/org/compiere/interfaces/Server.java similarity index 100% rename from interfaces/src/org/compiere/interfaces/Server.java rename to base/src/org/compiere/interfaces/Server.java diff --git a/interfaces/src/org/compiere/interfaces/ServerHome.java b/base/src/org/compiere/interfaces/ServerHome.java similarity index 100% rename from interfaces/src/org/compiere/interfaces/ServerHome.java rename to base/src/org/compiere/interfaces/ServerHome.java diff --git a/interfaces/src/org/compiere/interfaces/ServerLocal.java b/base/src/org/compiere/interfaces/ServerLocal.java similarity index 100% rename from interfaces/src/org/compiere/interfaces/ServerLocal.java rename to base/src/org/compiere/interfaces/ServerLocal.java diff --git a/interfaces/src/org/compiere/interfaces/ServerLocalHome.java b/base/src/org/compiere/interfaces/ServerLocalHome.java similarity index 100% rename from interfaces/src/org/compiere/interfaces/ServerLocalHome.java rename to base/src/org/compiere/interfaces/ServerLocalHome.java diff --git a/interfaces/src/org/compiere/interfaces/Status.java b/base/src/org/compiere/interfaces/Status.java similarity index 100% rename from interfaces/src/org/compiere/interfaces/Status.java rename to base/src/org/compiere/interfaces/Status.java diff --git a/interfaces/src/org/compiere/interfaces/StatusHome.java b/base/src/org/compiere/interfaces/StatusHome.java similarity index 100% rename from interfaces/src/org/compiere/interfaces/StatusHome.java rename to base/src/org/compiere/interfaces/StatusHome.java diff --git a/interfaces/src/org/compiere/interfaces/StatusLocal.java b/base/src/org/compiere/interfaces/StatusLocal.java similarity index 100% rename from interfaces/src/org/compiere/interfaces/StatusLocal.java rename to base/src/org/compiere/interfaces/StatusLocal.java diff --git a/interfaces/src/org/compiere/interfaces/StatusLocalHome.java b/base/src/org/compiere/interfaces/StatusLocalHome.java similarity index 100% rename from interfaces/src/org/compiere/interfaces/StatusLocalHome.java rename to base/src/org/compiere/interfaces/StatusLocalHome.java diff --git a/dbPort/src/org/compiere/license.html b/base/src/org/compiere/license.html similarity index 100% rename from dbPort/src/org/compiere/license.html rename to base/src/org/compiere/license.html diff --git a/dbPort/src/org/compiere/model/AccessSqlParser.java b/base/src/org/compiere/model/AccessSqlParser.java similarity index 100% rename from dbPort/src/org/compiere/model/AccessSqlParser.java rename to base/src/org/compiere/model/AccessSqlParser.java diff --git a/dbPort/src/org/compiere/model/AccessSqlParserTest.java b/base/src/org/compiere/model/AccessSqlParserTest.java similarity index 100% rename from dbPort/src/org/compiere/model/AccessSqlParserTest.java rename to base/src/org/compiere/model/AccessSqlParserTest.java diff --git a/dbPort/src/org/compiere/model/DocWorkflowMgr.java b/base/src/org/compiere/model/DocWorkflowMgr.java similarity index 100% rename from dbPort/src/org/compiere/model/DocWorkflowMgr.java rename to base/src/org/compiere/model/DocWorkflowMgr.java diff --git a/dbPort/src/org/compiere/model/GridFieldVO.java b/base/src/org/compiere/model/GridFieldVO.java similarity index 100% rename from dbPort/src/org/compiere/model/GridFieldVO.java rename to base/src/org/compiere/model/GridFieldVO.java diff --git a/dbPort/src/org/compiere/model/GridTabVO.java b/base/src/org/compiere/model/GridTabVO.java similarity index 100% rename from dbPort/src/org/compiere/model/GridTabVO.java rename to base/src/org/compiere/model/GridTabVO.java diff --git a/dbPort/src/org/compiere/model/GridWindowVO.java b/base/src/org/compiere/model/GridWindowVO.java similarity index 100% rename from dbPort/src/org/compiere/model/GridWindowVO.java rename to base/src/org/compiere/model/GridWindowVO.java diff --git a/dbPort/src/org/compiere/model/Lookup.java b/base/src/org/compiere/model/Lookup.java similarity index 100% rename from dbPort/src/org/compiere/model/Lookup.java rename to base/src/org/compiere/model/Lookup.java diff --git a/dbPort/src/org/compiere/model/LookupDisplayColumn.java b/base/src/org/compiere/model/LookupDisplayColumn.java similarity index 100% rename from dbPort/src/org/compiere/model/LookupDisplayColumn.java rename to base/src/org/compiere/model/LookupDisplayColumn.java diff --git a/dbPort/src/org/compiere/model/MAccessLog.java b/base/src/org/compiere/model/MAccessLog.java similarity index 100% rename from dbPort/src/org/compiere/model/MAccessLog.java rename to base/src/org/compiere/model/MAccessLog.java diff --git a/dbPort/src/org/compiere/model/MAccount.java b/base/src/org/compiere/model/MAccount.java similarity index 100% rename from dbPort/src/org/compiere/model/MAccount.java rename to base/src/org/compiere/model/MAccount.java diff --git a/dbPort/src/org/compiere/model/MAccountLookup.java b/base/src/org/compiere/model/MAccountLookup.java similarity index 100% rename from dbPort/src/org/compiere/model/MAccountLookup.java rename to base/src/org/compiere/model/MAccountLookup.java diff --git a/dbPort/src/org/compiere/model/MAcctSchema.java b/base/src/org/compiere/model/MAcctSchema.java similarity index 100% rename from dbPort/src/org/compiere/model/MAcctSchema.java rename to base/src/org/compiere/model/MAcctSchema.java diff --git a/dbPort/src/org/compiere/model/MAcctSchemaDefault.java b/base/src/org/compiere/model/MAcctSchemaDefault.java similarity index 100% rename from dbPort/src/org/compiere/model/MAcctSchemaDefault.java rename to base/src/org/compiere/model/MAcctSchemaDefault.java diff --git a/dbPort/src/org/compiere/model/MAcctSchemaElement.java b/base/src/org/compiere/model/MAcctSchemaElement.java similarity index 100% rename from dbPort/src/org/compiere/model/MAcctSchemaElement.java rename to base/src/org/compiere/model/MAcctSchemaElement.java diff --git a/dbPort/src/org/compiere/model/MAcctSchemaGL.java b/base/src/org/compiere/model/MAcctSchemaGL.java similarity index 100% rename from dbPort/src/org/compiere/model/MAcctSchemaGL.java rename to base/src/org/compiere/model/MAcctSchemaGL.java diff --git a/dbPort/src/org/compiere/model/MArchive.java b/base/src/org/compiere/model/MArchive.java similarity index 100% rename from dbPort/src/org/compiere/model/MArchive.java rename to base/src/org/compiere/model/MArchive.java diff --git a/dbPort/src/org/compiere/model/MAttachment.java b/base/src/org/compiere/model/MAttachment.java similarity index 100% rename from dbPort/src/org/compiere/model/MAttachment.java rename to base/src/org/compiere/model/MAttachment.java diff --git a/dbPort/src/org/compiere/model/MAttachmentEntry.java b/base/src/org/compiere/model/MAttachmentEntry.java similarity index 100% rename from dbPort/src/org/compiere/model/MAttachmentEntry.java rename to base/src/org/compiere/model/MAttachmentEntry.java diff --git a/dbPort/src/org/compiere/model/MAttachmentNote.java b/base/src/org/compiere/model/MAttachmentNote.java similarity index 100% rename from dbPort/src/org/compiere/model/MAttachmentNote.java rename to base/src/org/compiere/model/MAttachmentNote.java diff --git a/dbPort/src/org/compiere/model/MChangeLog.java b/base/src/org/compiere/model/MChangeLog.java similarity index 100% rename from dbPort/src/org/compiere/model/MChangeLog.java rename to base/src/org/compiere/model/MChangeLog.java diff --git a/dbPort/src/org/compiere/model/MClient.java b/base/src/org/compiere/model/MClient.java similarity index 100% rename from dbPort/src/org/compiere/model/MClient.java rename to base/src/org/compiere/model/MClient.java diff --git a/dbPort/src/org/compiere/model/MClientInfo.java b/base/src/org/compiere/model/MClientInfo.java similarity index 100% rename from dbPort/src/org/compiere/model/MClientInfo.java rename to base/src/org/compiere/model/MClientInfo.java diff --git a/dbPort/src/org/compiere/model/MClientShare.java b/base/src/org/compiere/model/MClientShare.java similarity index 100% rename from dbPort/src/org/compiere/model/MClientShare.java rename to base/src/org/compiere/model/MClientShare.java diff --git a/dbPort/src/org/compiere/model/MColumn.java b/base/src/org/compiere/model/MColumn.java similarity index 100% rename from dbPort/src/org/compiere/model/MColumn.java rename to base/src/org/compiere/model/MColumn.java diff --git a/dbPort/src/org/compiere/model/MColumnAccess.java b/base/src/org/compiere/model/MColumnAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/MColumnAccess.java rename to base/src/org/compiere/model/MColumnAccess.java diff --git a/dbPort/src/org/compiere/model/MConversionRate.java b/base/src/org/compiere/model/MConversionRate.java similarity index 100% rename from dbPort/src/org/compiere/model/MConversionRate.java rename to base/src/org/compiere/model/MConversionRate.java diff --git a/dbPort/src/org/compiere/model/MConversionType.java b/base/src/org/compiere/model/MConversionType.java similarity index 100% rename from dbPort/src/org/compiere/model/MConversionType.java rename to base/src/org/compiere/model/MConversionType.java diff --git a/dbPort/src/org/compiere/model/MCostElement.java b/base/src/org/compiere/model/MCostElement.java similarity index 100% rename from dbPort/src/org/compiere/model/MCostElement.java rename to base/src/org/compiere/model/MCostElement.java diff --git a/dbPort/src/org/compiere/model/MCostType.java b/base/src/org/compiere/model/MCostType.java similarity index 100% rename from dbPort/src/org/compiere/model/MCostType.java rename to base/src/org/compiere/model/MCostType.java diff --git a/dbPort/src/org/compiere/model/MCountry.java b/base/src/org/compiere/model/MCountry.java similarity index 100% rename from dbPort/src/org/compiere/model/MCountry.java rename to base/src/org/compiere/model/MCountry.java diff --git a/dbPort/src/org/compiere/model/MCurrency.java b/base/src/org/compiere/model/MCurrency.java similarity index 100% rename from dbPort/src/org/compiere/model/MCurrency.java rename to base/src/org/compiere/model/MCurrency.java diff --git a/dbPort/src/org/compiere/model/MCurrencyAcct.java b/base/src/org/compiere/model/MCurrencyAcct.java similarity index 100% rename from dbPort/src/org/compiere/model/MCurrencyAcct.java rename to base/src/org/compiere/model/MCurrencyAcct.java diff --git a/dbPort/src/org/compiere/model/MDocType.java b/base/src/org/compiere/model/MDocType.java similarity index 100% rename from dbPort/src/org/compiere/model/MDocType.java rename to base/src/org/compiere/model/MDocType.java diff --git a/dbPort/src/org/compiere/model/MElement.java b/base/src/org/compiere/model/MElement.java similarity index 100% rename from dbPort/src/org/compiere/model/MElement.java rename to base/src/org/compiere/model/MElement.java diff --git a/dbPort/src/org/compiere/model/MElementValue.java b/base/src/org/compiere/model/MElementValue.java similarity index 100% rename from dbPort/src/org/compiere/model/MElementValue.java rename to base/src/org/compiere/model/MElementValue.java diff --git a/dbPort/src/org/compiere/model/MField.java b/base/src/org/compiere/model/MField.java similarity index 100% rename from dbPort/src/org/compiere/model/MField.java rename to base/src/org/compiere/model/MField.java diff --git a/dbPort/src/org/compiere/model/MImage.java b/base/src/org/compiere/model/MImage.java similarity index 100% rename from dbPort/src/org/compiere/model/MImage.java rename to base/src/org/compiere/model/MImage.java diff --git a/dbPort/src/org/compiere/model/MIssue.java b/base/src/org/compiere/model/MIssue.java similarity index 100% rename from dbPort/src/org/compiere/model/MIssue.java rename to base/src/org/compiere/model/MIssue.java diff --git a/dbPort/src/org/compiere/model/MIssueProject.java b/base/src/org/compiere/model/MIssueProject.java similarity index 100% rename from dbPort/src/org/compiere/model/MIssueProject.java rename to base/src/org/compiere/model/MIssueProject.java diff --git a/dbPort/src/org/compiere/model/MIssueSystem.java b/base/src/org/compiere/model/MIssueSystem.java similarity index 100% rename from dbPort/src/org/compiere/model/MIssueSystem.java rename to base/src/org/compiere/model/MIssueSystem.java diff --git a/dbPort/src/org/compiere/model/MIssueUser.java b/base/src/org/compiere/model/MIssueUser.java similarity index 100% rename from dbPort/src/org/compiere/model/MIssueUser.java rename to base/src/org/compiere/model/MIssueUser.java diff --git a/dbPort/src/org/compiere/model/MLanguage.java b/base/src/org/compiere/model/MLanguage.java similarity index 100% rename from dbPort/src/org/compiere/model/MLanguage.java rename to base/src/org/compiere/model/MLanguage.java diff --git a/dbPort/src/org/compiere/model/MLocation.java b/base/src/org/compiere/model/MLocation.java similarity index 100% rename from dbPort/src/org/compiere/model/MLocation.java rename to base/src/org/compiere/model/MLocation.java diff --git a/dbPort/src/org/compiere/model/MLocationLookup.java b/base/src/org/compiere/model/MLocationLookup.java similarity index 100% rename from dbPort/src/org/compiere/model/MLocationLookup.java rename to base/src/org/compiere/model/MLocationLookup.java diff --git a/dbPort/src/org/compiere/model/MLocator.java b/base/src/org/compiere/model/MLocator.java similarity index 100% rename from dbPort/src/org/compiere/model/MLocator.java rename to base/src/org/compiere/model/MLocator.java diff --git a/dbPort/src/org/compiere/model/MLocatorLookup.java b/base/src/org/compiere/model/MLocatorLookup.java similarity index 100% rename from dbPort/src/org/compiere/model/MLocatorLookup.java rename to base/src/org/compiere/model/MLocatorLookup.java diff --git a/dbPort/src/org/compiere/model/MLookup.java b/base/src/org/compiere/model/MLookup.java similarity index 100% rename from dbPort/src/org/compiere/model/MLookup.java rename to base/src/org/compiere/model/MLookup.java diff --git a/dbPort/src/org/compiere/model/MLookupCache.java b/base/src/org/compiere/model/MLookupCache.java similarity index 100% rename from dbPort/src/org/compiere/model/MLookupCache.java rename to base/src/org/compiere/model/MLookupCache.java diff --git a/dbPort/src/org/compiere/model/MLookupFactory.java b/base/src/org/compiere/model/MLookupFactory.java similarity index 100% rename from dbPort/src/org/compiere/model/MLookupFactory.java rename to base/src/org/compiere/model/MLookupFactory.java diff --git a/dbPort/src/org/compiere/model/MLookupInfo.java b/base/src/org/compiere/model/MLookupInfo.java similarity index 100% rename from dbPort/src/org/compiere/model/MLookupInfo.java rename to base/src/org/compiere/model/MLookupInfo.java diff --git a/dbPort/src/org/compiere/model/MMenu.java b/base/src/org/compiere/model/MMenu.java similarity index 100% rename from dbPort/src/org/compiere/model/MMenu.java rename to base/src/org/compiere/model/MMenu.java diff --git a/dbPort/src/org/compiere/model/MMessage.java b/base/src/org/compiere/model/MMessage.java similarity index 100% rename from dbPort/src/org/compiere/model/MMessage.java rename to base/src/org/compiere/model/MMessage.java diff --git a/dbPort/src/org/compiere/model/MNote.java b/base/src/org/compiere/model/MNote.java similarity index 100% rename from dbPort/src/org/compiere/model/MNote.java rename to base/src/org/compiere/model/MNote.java diff --git a/dbPort/src/org/compiere/model/MOrg.java b/base/src/org/compiere/model/MOrg.java similarity index 100% rename from dbPort/src/org/compiere/model/MOrg.java rename to base/src/org/compiere/model/MOrg.java diff --git a/dbPort/src/org/compiere/model/MOrgInfo.java b/base/src/org/compiere/model/MOrgInfo.java similarity index 100% rename from dbPort/src/org/compiere/model/MOrgInfo.java rename to base/src/org/compiere/model/MOrgInfo.java diff --git a/dbPort/src/org/compiere/model/MPAttributeLookup.java b/base/src/org/compiere/model/MPAttributeLookup.java similarity index 100% rename from dbPort/src/org/compiere/model/MPAttributeLookup.java rename to base/src/org/compiere/model/MPAttributeLookup.java diff --git a/dbPort/src/org/compiere/model/MPInstance.java b/base/src/org/compiere/model/MPInstance.java similarity index 100% rename from dbPort/src/org/compiere/model/MPInstance.java rename to base/src/org/compiere/model/MPInstance.java diff --git a/dbPort/src/org/compiere/model/MPInstanceLog.java b/base/src/org/compiere/model/MPInstanceLog.java similarity index 100% rename from dbPort/src/org/compiere/model/MPInstanceLog.java rename to base/src/org/compiere/model/MPInstanceLog.java diff --git a/dbPort/src/org/compiere/model/MPInstancePara.java b/base/src/org/compiere/model/MPInstancePara.java similarity index 100% rename from dbPort/src/org/compiere/model/MPInstancePara.java rename to base/src/org/compiere/model/MPInstancePara.java diff --git a/dbPort/src/org/compiere/model/MPackageExp.java b/base/src/org/compiere/model/MPackageExp.java similarity index 100% rename from dbPort/src/org/compiere/model/MPackageExp.java rename to base/src/org/compiere/model/MPackageExp.java diff --git a/dbPort/src/org/compiere/model/MPackageExpCommon.java b/base/src/org/compiere/model/MPackageExpCommon.java similarity index 100% rename from dbPort/src/org/compiere/model/MPackageExpCommon.java rename to base/src/org/compiere/model/MPackageExpCommon.java diff --git a/dbPort/src/org/compiere/model/MPackageExpDetail.java b/base/src/org/compiere/model/MPackageExpDetail.java similarity index 100% rename from dbPort/src/org/compiere/model/MPackageExpDetail.java rename to base/src/org/compiere/model/MPackageExpDetail.java diff --git a/dbPort/src/org/compiere/model/MPrivateAccess.java b/base/src/org/compiere/model/MPrivateAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/MPrivateAccess.java rename to base/src/org/compiere/model/MPrivateAccess.java diff --git a/dbPort/src/org/compiere/model/MProcess.java b/base/src/org/compiere/model/MProcess.java similarity index 100% rename from dbPort/src/org/compiere/model/MProcess.java rename to base/src/org/compiere/model/MProcess.java diff --git a/dbPort/src/org/compiere/model/MProcessAccess.java b/base/src/org/compiere/model/MProcessAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/MProcessAccess.java rename to base/src/org/compiere/model/MProcessAccess.java diff --git a/dbPort/src/org/compiere/model/MProcessPara.java b/base/src/org/compiere/model/MProcessPara.java similarity index 100% rename from dbPort/src/org/compiere/model/MProcessPara.java rename to base/src/org/compiere/model/MProcessPara.java diff --git a/dbPort/src/org/compiere/model/MQuery.java b/base/src/org/compiere/model/MQuery.java similarity index 100% rename from dbPort/src/org/compiere/model/MQuery.java rename to base/src/org/compiere/model/MQuery.java diff --git a/dbPort/src/org/compiere/model/MRecordAccess.java b/base/src/org/compiere/model/MRecordAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/MRecordAccess.java rename to base/src/org/compiere/model/MRecordAccess.java diff --git a/dbPort/src/org/compiere/model/MRefList.java b/base/src/org/compiere/model/MRefList.java similarity index 100% rename from dbPort/src/org/compiere/model/MRefList.java rename to base/src/org/compiere/model/MRefList.java diff --git a/dbPort/src/org/compiere/model/MRegion.java b/base/src/org/compiere/model/MRegion.java similarity index 100% rename from dbPort/src/org/compiere/model/MRegion.java rename to base/src/org/compiere/model/MRegion.java diff --git a/dbPort/src/org/compiere/model/MRole.java b/base/src/org/compiere/model/MRole.java similarity index 100% rename from dbPort/src/org/compiere/model/MRole.java rename to base/src/org/compiere/model/MRole.java diff --git a/dbPort/src/org/compiere/model/MRoleOrgAccess.java b/base/src/org/compiere/model/MRoleOrgAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/MRoleOrgAccess.java rename to base/src/org/compiere/model/MRoleOrgAccess.java diff --git a/dbPort/src/org/compiere/model/MRoleTest.java b/base/src/org/compiere/model/MRoleTest.java similarity index 100% rename from dbPort/src/org/compiere/model/MRoleTest.java rename to base/src/org/compiere/model/MRoleTest.java diff --git a/dbPort/src/org/compiere/model/MSalesRegion.java b/base/src/org/compiere/model/MSalesRegion.java similarity index 100% rename from dbPort/src/org/compiere/model/MSalesRegion.java rename to base/src/org/compiere/model/MSalesRegion.java diff --git a/dbPort/src/org/compiere/model/MSequence.java b/base/src/org/compiere/model/MSequence.java similarity index 100% rename from dbPort/src/org/compiere/model/MSequence.java rename to base/src/org/compiere/model/MSequence.java diff --git a/dbPort/src/org/compiere/model/MSession.java b/base/src/org/compiere/model/MSession.java similarity index 100% rename from dbPort/src/org/compiere/model/MSession.java rename to base/src/org/compiere/model/MSession.java diff --git a/dbPort/src/org/compiere/model/MSysConfig.java b/base/src/org/compiere/model/MSysConfig.java similarity index 100% rename from dbPort/src/org/compiere/model/MSysConfig.java rename to base/src/org/compiere/model/MSysConfig.java diff --git a/dbPort/src/org/compiere/model/MSystem.java b/base/src/org/compiere/model/MSystem.java similarity index 100% rename from dbPort/src/org/compiere/model/MSystem.java rename to base/src/org/compiere/model/MSystem.java diff --git a/dbPort/src/org/compiere/model/MTab.java b/base/src/org/compiere/model/MTab.java similarity index 100% rename from dbPort/src/org/compiere/model/MTab.java rename to base/src/org/compiere/model/MTab.java diff --git a/dbPort/src/org/compiere/model/MTable.java b/base/src/org/compiere/model/MTable.java similarity index 100% rename from dbPort/src/org/compiere/model/MTable.java rename to base/src/org/compiere/model/MTable.java diff --git a/dbPort/src/org/compiere/model/MTableAccess.java b/base/src/org/compiere/model/MTableAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/MTableAccess.java rename to base/src/org/compiere/model/MTableAccess.java diff --git a/dbPort/src/org/compiere/model/MTest.java b/base/src/org/compiere/model/MTest.java similarity index 100% rename from dbPort/src/org/compiere/model/MTest.java rename to base/src/org/compiere/model/MTest.java diff --git a/dbPort/src/org/compiere/model/MTree_Base.java b/base/src/org/compiere/model/MTree_Base.java similarity index 100% rename from dbPort/src/org/compiere/model/MTree_Base.java rename to base/src/org/compiere/model/MTree_Base.java diff --git a/dbPort/src/org/compiere/model/MTree_Node.java b/base/src/org/compiere/model/MTree_Node.java similarity index 100% rename from dbPort/src/org/compiere/model/MTree_Node.java rename to base/src/org/compiere/model/MTree_Node.java diff --git a/dbPort/src/org/compiere/model/MTree_NodeBP.java b/base/src/org/compiere/model/MTree_NodeBP.java similarity index 100% rename from dbPort/src/org/compiere/model/MTree_NodeBP.java rename to base/src/org/compiere/model/MTree_NodeBP.java diff --git a/dbPort/src/org/compiere/model/MTree_NodeCMC.java b/base/src/org/compiere/model/MTree_NodeCMC.java similarity index 100% rename from dbPort/src/org/compiere/model/MTree_NodeCMC.java rename to base/src/org/compiere/model/MTree_NodeCMC.java diff --git a/dbPort/src/org/compiere/model/MTree_NodeCMS.java b/base/src/org/compiere/model/MTree_NodeCMS.java similarity index 100% rename from dbPort/src/org/compiere/model/MTree_NodeCMS.java rename to base/src/org/compiere/model/MTree_NodeCMS.java diff --git a/dbPort/src/org/compiere/model/MTree_NodeMM.java b/base/src/org/compiere/model/MTree_NodeMM.java similarity index 100% rename from dbPort/src/org/compiere/model/MTree_NodeMM.java rename to base/src/org/compiere/model/MTree_NodeMM.java diff --git a/dbPort/src/org/compiere/model/MTree_NodePR.java b/base/src/org/compiere/model/MTree_NodePR.java similarity index 100% rename from dbPort/src/org/compiere/model/MTree_NodePR.java rename to base/src/org/compiere/model/MTree_NodePR.java diff --git a/dbPort/src/org/compiere/model/MUser.java b/base/src/org/compiere/model/MUser.java similarity index 100% rename from dbPort/src/org/compiere/model/MUser.java rename to base/src/org/compiere/model/MUser.java diff --git a/dbPort/src/org/compiere/model/MUserOrgAccess.java b/base/src/org/compiere/model/MUserOrgAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/MUserOrgAccess.java rename to base/src/org/compiere/model/MUserOrgAccess.java diff --git a/dbPort/src/org/compiere/model/MUserRoles.java b/base/src/org/compiere/model/MUserRoles.java similarity index 100% rename from dbPort/src/org/compiere/model/MUserRoles.java rename to base/src/org/compiere/model/MUserRoles.java diff --git a/dbPort/src/org/compiere/model/MWarehouse.java b/base/src/org/compiere/model/MWarehouse.java similarity index 100% rename from dbPort/src/org/compiere/model/MWarehouse.java rename to base/src/org/compiere/model/MWarehouse.java diff --git a/dbPort/src/org/compiere/model/MWindow.java b/base/src/org/compiere/model/MWindow.java similarity index 100% rename from dbPort/src/org/compiere/model/MWindow.java rename to base/src/org/compiere/model/MWindow.java diff --git a/dbPort/src/org/compiere/model/MWindowAccess.java b/base/src/org/compiere/model/MWindowAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/MWindowAccess.java rename to base/src/org/compiere/model/MWindowAccess.java diff --git a/dbPort/src/org/compiere/model/M_Element.java b/base/src/org/compiere/model/M_Element.java similarity index 100% rename from dbPort/src/org/compiere/model/M_Element.java rename to base/src/org/compiere/model/M_Element.java diff --git a/dbPort/src/org/compiere/model/M_Registration.java b/base/src/org/compiere/model/M_Registration.java similarity index 100% rename from dbPort/src/org/compiere/model/M_Registration.java rename to base/src/org/compiere/model/M_Registration.java diff --git a/dbPort/src/org/compiere/model/ModelValidationEngine.java b/base/src/org/compiere/model/ModelValidationEngine.java similarity index 100% rename from dbPort/src/org/compiere/model/ModelValidationEngine.java rename to base/src/org/compiere/model/ModelValidationEngine.java diff --git a/dbPort/src/org/compiere/model/ModelValidator.java b/base/src/org/compiere/model/ModelValidator.java similarity index 94% rename from dbPort/src/org/compiere/model/ModelValidator.java rename to base/src/org/compiere/model/ModelValidator.java index ac33823e09..79ecfb1fc9 100644 --- a/dbPort/src/org/compiere/model/ModelValidator.java +++ b/base/src/org/compiere/model/ModelValidator.java @@ -73,7 +73,11 @@ public interface ModelValidator public static final int TIMING_AFTER_REVERSECORRECT = 13; /** Called after document is reverseaccrual */ public static final int TIMING_AFTER_REVERSEACCRUAL = 14; - + /** Called before document is posted */ + public static final int TIMING_BEFORE_POST = 15; + /** Called after document is posted */ + public static final int TIMING_AFTER_POST = 16; + /** * Initialize Validation * @param engine validation engine diff --git a/dbPort/src/org/compiere/model/Null.java b/base/src/org/compiere/model/Null.java similarity index 100% rename from dbPort/src/org/compiere/model/Null.java rename to base/src/org/compiere/model/Null.java diff --git a/dbPort/src/org/compiere/model/Obscure.java b/base/src/org/compiere/model/Obscure.java similarity index 100% rename from dbPort/src/org/compiere/model/Obscure.java rename to base/src/org/compiere/model/Obscure.java diff --git a/dbPort/src/org/compiere/model/PO.java b/base/src/org/compiere/model/PO.java similarity index 95% rename from dbPort/src/org/compiere/model/PO.java rename to base/src/org/compiere/model/PO.java index 22fd6d1418..abaf753dad 100644 --- a/dbPort/src/org/compiere/model/PO.java +++ b/base/src/org/compiere/model/PO.java @@ -26,6 +26,7 @@ import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import org.compiere.*; +import org.compiere.acct.Doc; import org.compiere.util.*; import org.w3c.dom.*; @@ -3411,4 +3412,23 @@ public abstract class PO return document; } // getDocument + /* Doc - To be used on ModelValidator to get the corresponding Doc from the PO */ + private Doc m_doc; + + /** + * Set the accounting document associated to the PO - for use in POST ModelValidator + * @param doc Document + */ + public void setDoc(Doc doc) { + m_doc = doc; + } + + /** + * Set the accounting document associated to the PO - for use in POST ModelValidator + * @return Doc Document + */ + public Doc getDoc() { + return m_doc; + } + } // PO diff --git a/dbPort/src/org/compiere/model/POInfo.java b/base/src/org/compiere/model/POInfo.java similarity index 100% rename from dbPort/src/org/compiere/model/POInfo.java rename to base/src/org/compiere/model/POInfo.java diff --git a/dbPort/src/org/compiere/model/POInfoColumn.java b/base/src/org/compiere/model/POInfoColumn.java similarity index 100% rename from dbPort/src/org/compiere/model/POInfoColumn.java rename to base/src/org/compiere/model/POInfoColumn.java diff --git a/dbPort/src/org/compiere/model/PO_LOB.java b/base/src/org/compiere/model/PO_LOB.java similarity index 100% rename from dbPort/src/org/compiere/model/PO_LOB.java rename to base/src/org/compiere/model/PO_LOB.java diff --git a/dbPort/src/org/compiere/model/PO_Record.java b/base/src/org/compiere/model/PO_Record.java similarity index 100% rename from dbPort/src/org/compiere/model/PO_Record.java rename to base/src/org/compiere/model/PO_Record.java diff --git a/dbPort/src/org/compiere/model/PrintInfo.java b/base/src/org/compiere/model/PrintInfo.java similarity index 100% rename from dbPort/src/org/compiere/model/PrintInfo.java rename to base/src/org/compiere/model/PrintInfo.java diff --git a/dbPort/src/org/compiere/model/TranslationTable.java b/base/src/org/compiere/model/TranslationTable.java similarity index 100% rename from dbPort/src/org/compiere/model/TranslationTable.java rename to base/src/org/compiere/model/TranslationTable.java diff --git a/dbPort/src/org/compiere/model/VO.java b/base/src/org/compiere/model/VO.java similarity index 100% rename from dbPort/src/org/compiere/model/VO.java rename to base/src/org/compiere/model/VO.java diff --git a/dbPort/src/org/compiere/model/X_AD_AccessLog.java b/base/src/org/compiere/model/X_AD_AccessLog.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_AccessLog.java rename to base/src/org/compiere/model/X_AD_AccessLog.java diff --git a/dbPort/src/org/compiere/model/X_AD_Alert.java b/base/src/org/compiere/model/X_AD_Alert.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Alert.java rename to base/src/org/compiere/model/X_AD_Alert.java diff --git a/dbPort/src/org/compiere/model/X_AD_AlertProcessor.java b/base/src/org/compiere/model/X_AD_AlertProcessor.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_AlertProcessor.java rename to base/src/org/compiere/model/X_AD_AlertProcessor.java diff --git a/dbPort/src/org/compiere/model/X_AD_AlertProcessorLog.java b/base/src/org/compiere/model/X_AD_AlertProcessorLog.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_AlertProcessorLog.java rename to base/src/org/compiere/model/X_AD_AlertProcessorLog.java diff --git a/dbPort/src/org/compiere/model/X_AD_AlertRecipient.java b/base/src/org/compiere/model/X_AD_AlertRecipient.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_AlertRecipient.java rename to base/src/org/compiere/model/X_AD_AlertRecipient.java diff --git a/dbPort/src/org/compiere/model/X_AD_AlertRule.java b/base/src/org/compiere/model/X_AD_AlertRule.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_AlertRule.java rename to base/src/org/compiere/model/X_AD_AlertRule.java diff --git a/dbPort/src/org/compiere/model/X_AD_Archive.java b/base/src/org/compiere/model/X_AD_Archive.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Archive.java rename to base/src/org/compiere/model/X_AD_Archive.java diff --git a/dbPort/src/org/compiere/model/X_AD_Attachment.java b/base/src/org/compiere/model/X_AD_Attachment.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Attachment.java rename to base/src/org/compiere/model/X_AD_Attachment.java diff --git a/dbPort/src/org/compiere/model/X_AD_AttachmentNote.java b/base/src/org/compiere/model/X_AD_AttachmentNote.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_AttachmentNote.java rename to base/src/org/compiere/model/X_AD_AttachmentNote.java diff --git a/dbPort/src/org/compiere/model/X_AD_Attribute.java b/base/src/org/compiere/model/X_AD_Attribute.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Attribute.java rename to base/src/org/compiere/model/X_AD_Attribute.java diff --git a/dbPort/src/org/compiere/model/X_AD_Attribute_Value.java b/base/src/org/compiere/model/X_AD_Attribute_Value.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Attribute_Value.java rename to base/src/org/compiere/model/X_AD_Attribute_Value.java diff --git a/dbPort/src/org/compiere/model/X_AD_ChangeLog.java b/base/src/org/compiere/model/X_AD_ChangeLog.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_ChangeLog.java rename to base/src/org/compiere/model/X_AD_ChangeLog.java diff --git a/dbPort/src/org/compiere/model/X_AD_Client.java b/base/src/org/compiere/model/X_AD_Client.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Client.java rename to base/src/org/compiere/model/X_AD_Client.java diff --git a/dbPort/src/org/compiere/model/X_AD_ClientInfo.java b/base/src/org/compiere/model/X_AD_ClientInfo.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_ClientInfo.java rename to base/src/org/compiere/model/X_AD_ClientInfo.java diff --git a/dbPort/src/org/compiere/model/X_AD_ClientShare.java b/base/src/org/compiere/model/X_AD_ClientShare.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_ClientShare.java rename to base/src/org/compiere/model/X_AD_ClientShare.java diff --git a/dbPort/src/org/compiere/model/X_AD_Color.java b/base/src/org/compiere/model/X_AD_Color.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Color.java rename to base/src/org/compiere/model/X_AD_Color.java diff --git a/dbPort/src/org/compiere/model/X_AD_Column.java b/base/src/org/compiere/model/X_AD_Column.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Column.java rename to base/src/org/compiere/model/X_AD_Column.java diff --git a/dbPort/src/org/compiere/model/X_AD_Column_Access.java b/base/src/org/compiere/model/X_AD_Column_Access.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Column_Access.java rename to base/src/org/compiere/model/X_AD_Column_Access.java diff --git a/dbPort/src/org/compiere/model/X_AD_Desktop.java b/base/src/org/compiere/model/X_AD_Desktop.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Desktop.java rename to base/src/org/compiere/model/X_AD_Desktop.java diff --git a/dbPort/src/org/compiere/model/X_AD_DesktopWorkbench.java b/base/src/org/compiere/model/X_AD_DesktopWorkbench.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_DesktopWorkbench.java rename to base/src/org/compiere/model/X_AD_DesktopWorkbench.java diff --git a/dbPort/src/org/compiere/model/X_AD_Element.java b/base/src/org/compiere/model/X_AD_Element.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Element.java rename to base/src/org/compiere/model/X_AD_Element.java diff --git a/dbPort/src/org/compiere/model/X_AD_EntityType.java b/base/src/org/compiere/model/X_AD_EntityType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_EntityType.java rename to base/src/org/compiere/model/X_AD_EntityType.java diff --git a/dbPort/src/org/compiere/model/X_AD_Error.java b/base/src/org/compiere/model/X_AD_Error.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Error.java rename to base/src/org/compiere/model/X_AD_Error.java diff --git a/dbPort/src/org/compiere/model/X_AD_Field.java b/base/src/org/compiere/model/X_AD_Field.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Field.java rename to base/src/org/compiere/model/X_AD_Field.java diff --git a/dbPort/src/org/compiere/model/X_AD_FieldGroup.java b/base/src/org/compiere/model/X_AD_FieldGroup.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_FieldGroup.java rename to base/src/org/compiere/model/X_AD_FieldGroup.java diff --git a/dbPort/src/org/compiere/model/X_AD_Find.java b/base/src/org/compiere/model/X_AD_Find.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Find.java rename to base/src/org/compiere/model/X_AD_Find.java diff --git a/dbPort/src/org/compiere/model/X_AD_Form.java b/base/src/org/compiere/model/X_AD_Form.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Form.java rename to base/src/org/compiere/model/X_AD_Form.java diff --git a/dbPort/src/org/compiere/model/X_AD_Form_Access.java b/base/src/org/compiere/model/X_AD_Form_Access.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Form_Access.java rename to base/src/org/compiere/model/X_AD_Form_Access.java diff --git a/dbPort/src/org/compiere/model/X_AD_Image.java b/base/src/org/compiere/model/X_AD_Image.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Image.java rename to base/src/org/compiere/model/X_AD_Image.java diff --git a/dbPort/src/org/compiere/model/X_AD_ImpFormat.java b/base/src/org/compiere/model/X_AD_ImpFormat.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_ImpFormat.java rename to base/src/org/compiere/model/X_AD_ImpFormat.java diff --git a/dbPort/src/org/compiere/model/X_AD_ImpFormat_Row.java b/base/src/org/compiere/model/X_AD_ImpFormat_Row.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_ImpFormat_Row.java rename to base/src/org/compiere/model/X_AD_ImpFormat_Row.java diff --git a/dbPort/src/org/compiere/model/X_AD_InfoColumn.java b/base/src/org/compiere/model/X_AD_InfoColumn.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_InfoColumn.java rename to base/src/org/compiere/model/X_AD_InfoColumn.java diff --git a/dbPort/src/org/compiere/model/X_AD_InfoWindow.java b/base/src/org/compiere/model/X_AD_InfoWindow.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_InfoWindow.java rename to base/src/org/compiere/model/X_AD_InfoWindow.java diff --git a/dbPort/src/org/compiere/model/X_AD_Issue.java b/base/src/org/compiere/model/X_AD_Issue.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Issue.java rename to base/src/org/compiere/model/X_AD_Issue.java diff --git a/dbPort/src/org/compiere/model/X_AD_LabelPrinter.java b/base/src/org/compiere/model/X_AD_LabelPrinter.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_LabelPrinter.java rename to base/src/org/compiere/model/X_AD_LabelPrinter.java diff --git a/dbPort/src/org/compiere/model/X_AD_LabelPrinterFunction.java b/base/src/org/compiere/model/X_AD_LabelPrinterFunction.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_LabelPrinterFunction.java rename to base/src/org/compiere/model/X_AD_LabelPrinterFunction.java diff --git a/dbPort/src/org/compiere/model/X_AD_Language.java b/base/src/org/compiere/model/X_AD_Language.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Language.java rename to base/src/org/compiere/model/X_AD_Language.java diff --git a/dbPort/src/org/compiere/model/X_AD_LdapAccess.java b/base/src/org/compiere/model/X_AD_LdapAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_LdapAccess.java rename to base/src/org/compiere/model/X_AD_LdapAccess.java diff --git a/dbPort/src/org/compiere/model/X_AD_LdapProcessor.java b/base/src/org/compiere/model/X_AD_LdapProcessor.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_LdapProcessor.java rename to base/src/org/compiere/model/X_AD_LdapProcessor.java diff --git a/dbPort/src/org/compiere/model/X_AD_LdapProcessorLog.java b/base/src/org/compiere/model/X_AD_LdapProcessorLog.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_LdapProcessorLog.java rename to base/src/org/compiere/model/X_AD_LdapProcessorLog.java diff --git a/dbPort/src/org/compiere/model/X_AD_Menu.java b/base/src/org/compiere/model/X_AD_Menu.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Menu.java rename to base/src/org/compiere/model/X_AD_Menu.java diff --git a/dbPort/src/org/compiere/model/X_AD_Message.java b/base/src/org/compiere/model/X_AD_Message.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Message.java rename to base/src/org/compiere/model/X_AD_Message.java diff --git a/dbPort/src/org/compiere/model/X_AD_Modification.java b/base/src/org/compiere/model/X_AD_Modification.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Modification.java rename to base/src/org/compiere/model/X_AD_Modification.java diff --git a/dbPort/src/org/compiere/model/X_AD_Note.java b/base/src/org/compiere/model/X_AD_Note.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Note.java rename to base/src/org/compiere/model/X_AD_Note.java diff --git a/dbPort/src/org/compiere/model/X_AD_Org.java b/base/src/org/compiere/model/X_AD_Org.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Org.java rename to base/src/org/compiere/model/X_AD_Org.java diff --git a/dbPort/src/org/compiere/model/X_AD_OrgInfo.java b/base/src/org/compiere/model/X_AD_OrgInfo.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_OrgInfo.java rename to base/src/org/compiere/model/X_AD_OrgInfo.java diff --git a/dbPort/src/org/compiere/model/X_AD_OrgType.java b/base/src/org/compiere/model/X_AD_OrgType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_OrgType.java rename to base/src/org/compiere/model/X_AD_OrgType.java diff --git a/dbPort/src/org/compiere/model/X_AD_PInstance.java b/base/src/org/compiere/model/X_AD_PInstance.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PInstance.java rename to base/src/org/compiere/model/X_AD_PInstance.java diff --git a/dbPort/src/org/compiere/model/X_AD_PInstance_Log.java b/base/src/org/compiere/model/X_AD_PInstance_Log.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PInstance_Log.java rename to base/src/org/compiere/model/X_AD_PInstance_Log.java diff --git a/dbPort/src/org/compiere/model/X_AD_PInstance_Para.java b/base/src/org/compiere/model/X_AD_PInstance_Para.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PInstance_Para.java rename to base/src/org/compiere/model/X_AD_PInstance_Para.java diff --git a/dbPort/src/org/compiere/model/X_AD_Package_Exp.java b/base/src/org/compiere/model/X_AD_Package_Exp.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Package_Exp.java rename to base/src/org/compiere/model/X_AD_Package_Exp.java diff --git a/dbPort/src/org/compiere/model/X_AD_Package_Exp_Common.java b/base/src/org/compiere/model/X_AD_Package_Exp_Common.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Package_Exp_Common.java rename to base/src/org/compiere/model/X_AD_Package_Exp_Common.java diff --git a/dbPort/src/org/compiere/model/X_AD_Package_Exp_Detail.java b/base/src/org/compiere/model/X_AD_Package_Exp_Detail.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Package_Exp_Detail.java rename to base/src/org/compiere/model/X_AD_Package_Exp_Detail.java diff --git a/dbPort/src/org/compiere/model/X_AD_Package_Imp.java b/base/src/org/compiere/model/X_AD_Package_Imp.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Package_Imp.java rename to base/src/org/compiere/model/X_AD_Package_Imp.java diff --git a/dbPort/src/org/compiere/model/X_AD_Package_Imp_Backup.java b/base/src/org/compiere/model/X_AD_Package_Imp_Backup.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Package_Imp_Backup.java rename to base/src/org/compiere/model/X_AD_Package_Imp_Backup.java diff --git a/dbPort/src/org/compiere/model/X_AD_Package_Imp_Detail.java b/base/src/org/compiere/model/X_AD_Package_Imp_Detail.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Package_Imp_Detail.java rename to base/src/org/compiere/model/X_AD_Package_Imp_Detail.java diff --git a/dbPort/src/org/compiere/model/X_AD_Package_Imp_Inst.java b/base/src/org/compiere/model/X_AD_Package_Imp_Inst.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Package_Imp_Inst.java rename to base/src/org/compiere/model/X_AD_Package_Imp_Inst.java diff --git a/dbPort/src/org/compiere/model/X_AD_Package_Imp_Proc.java b/base/src/org/compiere/model/X_AD_Package_Imp_Proc.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Package_Imp_Proc.java rename to base/src/org/compiere/model/X_AD_Package_Imp_Proc.java diff --git a/dbPort/src/org/compiere/model/X_AD_Preference.java b/base/src/org/compiere/model/X_AD_Preference.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Preference.java rename to base/src/org/compiere/model/X_AD_Preference.java diff --git a/dbPort/src/org/compiere/model/X_AD_PrintColor.java b/base/src/org/compiere/model/X_AD_PrintColor.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PrintColor.java rename to base/src/org/compiere/model/X_AD_PrintColor.java diff --git a/dbPort/src/org/compiere/model/X_AD_PrintFont.java b/base/src/org/compiere/model/X_AD_PrintFont.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PrintFont.java rename to base/src/org/compiere/model/X_AD_PrintFont.java diff --git a/dbPort/src/org/compiere/model/X_AD_PrintForm.java b/base/src/org/compiere/model/X_AD_PrintForm.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PrintForm.java rename to base/src/org/compiere/model/X_AD_PrintForm.java diff --git a/dbPort/src/org/compiere/model/X_AD_PrintFormat.java b/base/src/org/compiere/model/X_AD_PrintFormat.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PrintFormat.java rename to base/src/org/compiere/model/X_AD_PrintFormat.java diff --git a/dbPort/src/org/compiere/model/X_AD_PrintFormatItem.java b/base/src/org/compiere/model/X_AD_PrintFormatItem.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PrintFormatItem.java rename to base/src/org/compiere/model/X_AD_PrintFormatItem.java diff --git a/dbPort/src/org/compiere/model/X_AD_PrintGraph.java b/base/src/org/compiere/model/X_AD_PrintGraph.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PrintGraph.java rename to base/src/org/compiere/model/X_AD_PrintGraph.java diff --git a/dbPort/src/org/compiere/model/X_AD_PrintLabel.java b/base/src/org/compiere/model/X_AD_PrintLabel.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PrintLabel.java rename to base/src/org/compiere/model/X_AD_PrintLabel.java diff --git a/dbPort/src/org/compiere/model/X_AD_PrintLabelLine.java b/base/src/org/compiere/model/X_AD_PrintLabelLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PrintLabelLine.java rename to base/src/org/compiere/model/X_AD_PrintLabelLine.java diff --git a/dbPort/src/org/compiere/model/X_AD_PrintPaper.java b/base/src/org/compiere/model/X_AD_PrintPaper.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PrintPaper.java rename to base/src/org/compiere/model/X_AD_PrintPaper.java diff --git a/dbPort/src/org/compiere/model/X_AD_PrintTableFormat.java b/base/src/org/compiere/model/X_AD_PrintTableFormat.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_PrintTableFormat.java rename to base/src/org/compiere/model/X_AD_PrintTableFormat.java diff --git a/dbPort/src/org/compiere/model/X_AD_Private_Access.java b/base/src/org/compiere/model/X_AD_Private_Access.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Private_Access.java rename to base/src/org/compiere/model/X_AD_Private_Access.java diff --git a/dbPort/src/org/compiere/model/X_AD_Process.java b/base/src/org/compiere/model/X_AD_Process.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Process.java rename to base/src/org/compiere/model/X_AD_Process.java diff --git a/dbPort/src/org/compiere/model/X_AD_Process_Access.java b/base/src/org/compiere/model/X_AD_Process_Access.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Process_Access.java rename to base/src/org/compiere/model/X_AD_Process_Access.java diff --git a/dbPort/src/org/compiere/model/X_AD_Process_Para.java b/base/src/org/compiere/model/X_AD_Process_Para.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Process_Para.java rename to base/src/org/compiere/model/X_AD_Process_Para.java diff --git a/dbPort/src/org/compiere/model/X_AD_Record_Access.java b/base/src/org/compiere/model/X_AD_Record_Access.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Record_Access.java rename to base/src/org/compiere/model/X_AD_Record_Access.java diff --git a/dbPort/src/org/compiere/model/X_AD_Ref_List.java b/base/src/org/compiere/model/X_AD_Ref_List.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Ref_List.java rename to base/src/org/compiere/model/X_AD_Ref_List.java diff --git a/dbPort/src/org/compiere/model/X_AD_Ref_Table.java b/base/src/org/compiere/model/X_AD_Ref_Table.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Ref_Table.java rename to base/src/org/compiere/model/X_AD_Ref_Table.java diff --git a/dbPort/src/org/compiere/model/X_AD_Reference.java b/base/src/org/compiere/model/X_AD_Reference.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Reference.java rename to base/src/org/compiere/model/X_AD_Reference.java diff --git a/dbPort/src/org/compiere/model/X_AD_Registration.java b/base/src/org/compiere/model/X_AD_Registration.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Registration.java rename to base/src/org/compiere/model/X_AD_Registration.java diff --git a/dbPort/src/org/compiere/model/X_AD_Replication.java b/base/src/org/compiere/model/X_AD_Replication.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Replication.java rename to base/src/org/compiere/model/X_AD_Replication.java diff --git a/dbPort/src/org/compiere/model/X_AD_ReplicationStrategy.java b/base/src/org/compiere/model/X_AD_ReplicationStrategy.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_ReplicationStrategy.java rename to base/src/org/compiere/model/X_AD_ReplicationStrategy.java diff --git a/dbPort/src/org/compiere/model/X_AD_ReplicationTable.java b/base/src/org/compiere/model/X_AD_ReplicationTable.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_ReplicationTable.java rename to base/src/org/compiere/model/X_AD_ReplicationTable.java diff --git a/dbPort/src/org/compiere/model/X_AD_Replication_Log.java b/base/src/org/compiere/model/X_AD_Replication_Log.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Replication_Log.java rename to base/src/org/compiere/model/X_AD_Replication_Log.java diff --git a/dbPort/src/org/compiere/model/X_AD_Replication_Run.java b/base/src/org/compiere/model/X_AD_Replication_Run.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Replication_Run.java rename to base/src/org/compiere/model/X_AD_Replication_Run.java diff --git a/dbPort/src/org/compiere/model/X_AD_ReportView.java b/base/src/org/compiere/model/X_AD_ReportView.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_ReportView.java rename to base/src/org/compiere/model/X_AD_ReportView.java diff --git a/dbPort/src/org/compiere/model/X_AD_ReportView_Col.java b/base/src/org/compiere/model/X_AD_ReportView_Col.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_ReportView_Col.java rename to base/src/org/compiere/model/X_AD_ReportView_Col.java diff --git a/dbPort/src/org/compiere/model/X_AD_Role.java b/base/src/org/compiere/model/X_AD_Role.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Role.java rename to base/src/org/compiere/model/X_AD_Role.java diff --git a/dbPort/src/org/compiere/model/X_AD_Role_OrgAccess.java b/base/src/org/compiere/model/X_AD_Role_OrgAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Role_OrgAccess.java rename to base/src/org/compiere/model/X_AD_Role_OrgAccess.java diff --git a/dbPort/src/org/compiere/model/X_AD_Scheduler.java b/base/src/org/compiere/model/X_AD_Scheduler.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Scheduler.java rename to base/src/org/compiere/model/X_AD_Scheduler.java diff --git a/dbPort/src/org/compiere/model/X_AD_SchedulerLog.java b/base/src/org/compiere/model/X_AD_SchedulerLog.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_SchedulerLog.java rename to base/src/org/compiere/model/X_AD_SchedulerLog.java diff --git a/dbPort/src/org/compiere/model/X_AD_SchedulerRecipient.java b/base/src/org/compiere/model/X_AD_SchedulerRecipient.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_SchedulerRecipient.java rename to base/src/org/compiere/model/X_AD_SchedulerRecipient.java diff --git a/dbPort/src/org/compiere/model/X_AD_Scheduler_Para.java b/base/src/org/compiere/model/X_AD_Scheduler_Para.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Scheduler_Para.java rename to base/src/org/compiere/model/X_AD_Scheduler_Para.java diff --git a/dbPort/src/org/compiere/model/X_AD_Sequence.java b/base/src/org/compiere/model/X_AD_Sequence.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Sequence.java rename to base/src/org/compiere/model/X_AD_Sequence.java diff --git a/dbPort/src/org/compiere/model/X_AD_Sequence_Audit.java b/base/src/org/compiere/model/X_AD_Sequence_Audit.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Sequence_Audit.java rename to base/src/org/compiere/model/X_AD_Sequence_Audit.java diff --git a/dbPort/src/org/compiere/model/X_AD_Sequence_No.java b/base/src/org/compiere/model/X_AD_Sequence_No.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Sequence_No.java rename to base/src/org/compiere/model/X_AD_Sequence_No.java diff --git a/dbPort/src/org/compiere/model/X_AD_Session.java b/base/src/org/compiere/model/X_AD_Session.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Session.java rename to base/src/org/compiere/model/X_AD_Session.java diff --git a/dbPort/src/org/compiere/model/X_AD_SysConfig.java b/base/src/org/compiere/model/X_AD_SysConfig.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_SysConfig.java rename to base/src/org/compiere/model/X_AD_SysConfig.java diff --git a/dbPort/src/org/compiere/model/X_AD_System.java b/base/src/org/compiere/model/X_AD_System.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_System.java rename to base/src/org/compiere/model/X_AD_System.java diff --git a/dbPort/src/org/compiere/model/X_AD_Tab.java b/base/src/org/compiere/model/X_AD_Tab.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Tab.java rename to base/src/org/compiere/model/X_AD_Tab.java diff --git a/dbPort/src/org/compiere/model/X_AD_Table.java b/base/src/org/compiere/model/X_AD_Table.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Table.java rename to base/src/org/compiere/model/X_AD_Table.java diff --git a/dbPort/src/org/compiere/model/X_AD_Table_Access.java b/base/src/org/compiere/model/X_AD_Table_Access.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Table_Access.java rename to base/src/org/compiere/model/X_AD_Table_Access.java diff --git a/dbPort/src/org/compiere/model/X_AD_Task.java b/base/src/org/compiere/model/X_AD_Task.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Task.java rename to base/src/org/compiere/model/X_AD_Task.java diff --git a/dbPort/src/org/compiere/model/X_AD_TaskInstance.java b/base/src/org/compiere/model/X_AD_TaskInstance.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TaskInstance.java rename to base/src/org/compiere/model/X_AD_TaskInstance.java diff --git a/dbPort/src/org/compiere/model/X_AD_Task_Access.java b/base/src/org/compiere/model/X_AD_Task_Access.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Task_Access.java rename to base/src/org/compiere/model/X_AD_Task_Access.java diff --git a/dbPort/src/org/compiere/model/X_AD_Tree.java b/base/src/org/compiere/model/X_AD_Tree.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Tree.java rename to base/src/org/compiere/model/X_AD_Tree.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeBar.java b/base/src/org/compiere/model/X_AD_TreeBar.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeBar.java rename to base/src/org/compiere/model/X_AD_TreeBar.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNode.java b/base/src/org/compiere/model/X_AD_TreeNode.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNode.java rename to base/src/org/compiere/model/X_AD_TreeNode.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNodeBP.java b/base/src/org/compiere/model/X_AD_TreeNodeBP.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNodeBP.java rename to base/src/org/compiere/model/X_AD_TreeNodeBP.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNodeCMC.java b/base/src/org/compiere/model/X_AD_TreeNodeCMC.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNodeCMC.java rename to base/src/org/compiere/model/X_AD_TreeNodeCMC.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNodeCMM.java b/base/src/org/compiere/model/X_AD_TreeNodeCMM.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNodeCMM.java rename to base/src/org/compiere/model/X_AD_TreeNodeCMM.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNodeCMS.java b/base/src/org/compiere/model/X_AD_TreeNodeCMS.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNodeCMS.java rename to base/src/org/compiere/model/X_AD_TreeNodeCMS.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNodeCMT.java b/base/src/org/compiere/model/X_AD_TreeNodeCMT.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNodeCMT.java rename to base/src/org/compiere/model/X_AD_TreeNodeCMT.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNodeMM.java b/base/src/org/compiere/model/X_AD_TreeNodeMM.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNodeMM.java rename to base/src/org/compiere/model/X_AD_TreeNodeMM.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNodePR.java b/base/src/org/compiere/model/X_AD_TreeNodePR.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNodePR.java rename to base/src/org/compiere/model/X_AD_TreeNodePR.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNodeU1.java b/base/src/org/compiere/model/X_AD_TreeNodeU1.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNodeU1.java rename to base/src/org/compiere/model/X_AD_TreeNodeU1.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNodeU2.java b/base/src/org/compiere/model/X_AD_TreeNodeU2.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNodeU2.java rename to base/src/org/compiere/model/X_AD_TreeNodeU2.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNodeU3.java b/base/src/org/compiere/model/X_AD_TreeNodeU3.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNodeU3.java rename to base/src/org/compiere/model/X_AD_TreeNodeU3.java diff --git a/dbPort/src/org/compiere/model/X_AD_TreeNodeU4.java b/base/src/org/compiere/model/X_AD_TreeNodeU4.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_TreeNodeU4.java rename to base/src/org/compiere/model/X_AD_TreeNodeU4.java diff --git a/dbPort/src/org/compiere/model/X_AD_User.java b/base/src/org/compiere/model/X_AD_User.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_User.java rename to base/src/org/compiere/model/X_AD_User.java diff --git a/dbPort/src/org/compiere/model/X_AD_UserBPAccess.java b/base/src/org/compiere/model/X_AD_UserBPAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_UserBPAccess.java rename to base/src/org/compiere/model/X_AD_UserBPAccess.java diff --git a/dbPort/src/org/compiere/model/X_AD_UserDef_Field.java b/base/src/org/compiere/model/X_AD_UserDef_Field.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_UserDef_Field.java rename to base/src/org/compiere/model/X_AD_UserDef_Field.java diff --git a/dbPort/src/org/compiere/model/X_AD_UserDef_Tab.java b/base/src/org/compiere/model/X_AD_UserDef_Tab.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_UserDef_Tab.java rename to base/src/org/compiere/model/X_AD_UserDef_Tab.java diff --git a/dbPort/src/org/compiere/model/X_AD_UserDef_Win.java b/base/src/org/compiere/model/X_AD_UserDef_Win.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_UserDef_Win.java rename to base/src/org/compiere/model/X_AD_UserDef_Win.java diff --git a/dbPort/src/org/compiere/model/X_AD_UserMail.java b/base/src/org/compiere/model/X_AD_UserMail.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_UserMail.java rename to base/src/org/compiere/model/X_AD_UserMail.java diff --git a/dbPort/src/org/compiere/model/X_AD_UserQuery.java b/base/src/org/compiere/model/X_AD_UserQuery.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_UserQuery.java rename to base/src/org/compiere/model/X_AD_UserQuery.java diff --git a/dbPort/src/org/compiere/model/X_AD_User_OrgAccess.java b/base/src/org/compiere/model/X_AD_User_OrgAccess.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_User_OrgAccess.java rename to base/src/org/compiere/model/X_AD_User_OrgAccess.java diff --git a/dbPort/src/org/compiere/model/X_AD_User_Roles.java b/base/src/org/compiere/model/X_AD_User_Roles.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_User_Roles.java rename to base/src/org/compiere/model/X_AD_User_Roles.java diff --git a/dbPort/src/org/compiere/model/X_AD_User_Substitute.java b/base/src/org/compiere/model/X_AD_User_Substitute.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_User_Substitute.java rename to base/src/org/compiere/model/X_AD_User_Substitute.java diff --git a/dbPort/src/org/compiere/model/X_AD_Val_Rule.java b/base/src/org/compiere/model/X_AD_Val_Rule.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Val_Rule.java rename to base/src/org/compiere/model/X_AD_Val_Rule.java diff --git a/dbPort/src/org/compiere/model/X_AD_WF_Activity.java b/base/src/org/compiere/model/X_AD_WF_Activity.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WF_Activity.java rename to base/src/org/compiere/model/X_AD_WF_Activity.java diff --git a/dbPort/src/org/compiere/model/X_AD_WF_ActivityResult.java b/base/src/org/compiere/model/X_AD_WF_ActivityResult.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WF_ActivityResult.java rename to base/src/org/compiere/model/X_AD_WF_ActivityResult.java diff --git a/dbPort/src/org/compiere/model/X_AD_WF_Block.java b/base/src/org/compiere/model/X_AD_WF_Block.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WF_Block.java rename to base/src/org/compiere/model/X_AD_WF_Block.java diff --git a/dbPort/src/org/compiere/model/X_AD_WF_EventAudit.java b/base/src/org/compiere/model/X_AD_WF_EventAudit.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WF_EventAudit.java rename to base/src/org/compiere/model/X_AD_WF_EventAudit.java diff --git a/dbPort/src/org/compiere/model/X_AD_WF_NextCondition.java b/base/src/org/compiere/model/X_AD_WF_NextCondition.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WF_NextCondition.java rename to base/src/org/compiere/model/X_AD_WF_NextCondition.java diff --git a/dbPort/src/org/compiere/model/X_AD_WF_Node.java b/base/src/org/compiere/model/X_AD_WF_Node.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WF_Node.java rename to base/src/org/compiere/model/X_AD_WF_Node.java diff --git a/dbPort/src/org/compiere/model/X_AD_WF_NodeNext.java b/base/src/org/compiere/model/X_AD_WF_NodeNext.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WF_NodeNext.java rename to base/src/org/compiere/model/X_AD_WF_NodeNext.java diff --git a/dbPort/src/org/compiere/model/X_AD_WF_Node_Para.java b/base/src/org/compiere/model/X_AD_WF_Node_Para.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WF_Node_Para.java rename to base/src/org/compiere/model/X_AD_WF_Node_Para.java diff --git a/dbPort/src/org/compiere/model/X_AD_WF_Process.java b/base/src/org/compiere/model/X_AD_WF_Process.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WF_Process.java rename to base/src/org/compiere/model/X_AD_WF_Process.java diff --git a/dbPort/src/org/compiere/model/X_AD_WF_ProcessData.java b/base/src/org/compiere/model/X_AD_WF_ProcessData.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WF_ProcessData.java rename to base/src/org/compiere/model/X_AD_WF_ProcessData.java diff --git a/dbPort/src/org/compiere/model/X_AD_WF_Responsible.java b/base/src/org/compiere/model/X_AD_WF_Responsible.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WF_Responsible.java rename to base/src/org/compiere/model/X_AD_WF_Responsible.java diff --git a/dbPort/src/org/compiere/model/X_AD_Window.java b/base/src/org/compiere/model/X_AD_Window.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Window.java rename to base/src/org/compiere/model/X_AD_Window.java diff --git a/dbPort/src/org/compiere/model/X_AD_Window_Access.java b/base/src/org/compiere/model/X_AD_Window_Access.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Window_Access.java rename to base/src/org/compiere/model/X_AD_Window_Access.java diff --git a/dbPort/src/org/compiere/model/X_AD_Workbench.java b/base/src/org/compiere/model/X_AD_Workbench.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Workbench.java rename to base/src/org/compiere/model/X_AD_Workbench.java diff --git a/dbPort/src/org/compiere/model/X_AD_WorkbenchWindow.java b/base/src/org/compiere/model/X_AD_WorkbenchWindow.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WorkbenchWindow.java rename to base/src/org/compiere/model/X_AD_WorkbenchWindow.java diff --git a/dbPort/src/org/compiere/model/X_AD_Workflow.java b/base/src/org/compiere/model/X_AD_Workflow.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Workflow.java rename to base/src/org/compiere/model/X_AD_Workflow.java diff --git a/dbPort/src/org/compiere/model/X_AD_WorkflowProcessor.java b/base/src/org/compiere/model/X_AD_WorkflowProcessor.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WorkflowProcessor.java rename to base/src/org/compiere/model/X_AD_WorkflowProcessor.java diff --git a/dbPort/src/org/compiere/model/X_AD_WorkflowProcessorLog.java b/base/src/org/compiere/model/X_AD_WorkflowProcessorLog.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_WorkflowProcessorLog.java rename to base/src/org/compiere/model/X_AD_WorkflowProcessorLog.java diff --git a/dbPort/src/org/compiere/model/X_AD_Workflow_Access.java b/base/src/org/compiere/model/X_AD_Workflow_Access.java similarity index 100% rename from dbPort/src/org/compiere/model/X_AD_Workflow_Access.java rename to base/src/org/compiere/model/X_AD_Workflow_Access.java diff --git a/dbPort/src/org/compiere/model/X_A_Asset.java b/base/src/org/compiere/model/X_A_Asset.java similarity index 100% rename from dbPort/src/org/compiere/model/X_A_Asset.java rename to base/src/org/compiere/model/X_A_Asset.java diff --git a/dbPort/src/org/compiere/model/X_A_Asset_Delivery.java b/base/src/org/compiere/model/X_A_Asset_Delivery.java similarity index 100% rename from dbPort/src/org/compiere/model/X_A_Asset_Delivery.java rename to base/src/org/compiere/model/X_A_Asset_Delivery.java diff --git a/dbPort/src/org/compiere/model/X_A_Asset_Group.java b/base/src/org/compiere/model/X_A_Asset_Group.java similarity index 100% rename from dbPort/src/org/compiere/model/X_A_Asset_Group.java rename to base/src/org/compiere/model/X_A_Asset_Group.java diff --git a/dbPort/src/org/compiere/model/X_A_Asset_Retirement.java b/base/src/org/compiere/model/X_A_Asset_Retirement.java similarity index 100% rename from dbPort/src/org/compiere/model/X_A_Asset_Retirement.java rename to base/src/org/compiere/model/X_A_Asset_Retirement.java diff --git a/dbPort/src/org/compiere/model/X_A_Registration.java b/base/src/org/compiere/model/X_A_Registration.java similarity index 100% rename from dbPort/src/org/compiere/model/X_A_Registration.java rename to base/src/org/compiere/model/X_A_Registration.java diff --git a/dbPort/src/org/compiere/model/X_A_RegistrationAttribute.java b/base/src/org/compiere/model/X_A_RegistrationAttribute.java similarity index 100% rename from dbPort/src/org/compiere/model/X_A_RegistrationAttribute.java rename to base/src/org/compiere/model/X_A_RegistrationAttribute.java diff --git a/dbPort/src/org/compiere/model/X_A_RegistrationProduct.java b/base/src/org/compiere/model/X_A_RegistrationProduct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_A_RegistrationProduct.java rename to base/src/org/compiere/model/X_A_RegistrationProduct.java diff --git a/dbPort/src/org/compiere/model/X_A_RegistrationValue.java b/base/src/org/compiere/model/X_A_RegistrationValue.java similarity index 100% rename from dbPort/src/org/compiere/model/X_A_RegistrationValue.java rename to base/src/org/compiere/model/X_A_RegistrationValue.java diff --git a/dbPort/src/org/compiere/model/X_B_Bid.java b/base/src/org/compiere/model/X_B_Bid.java similarity index 100% rename from dbPort/src/org/compiere/model/X_B_Bid.java rename to base/src/org/compiere/model/X_B_Bid.java diff --git a/dbPort/src/org/compiere/model/X_B_BidComment.java b/base/src/org/compiere/model/X_B_BidComment.java similarity index 100% rename from dbPort/src/org/compiere/model/X_B_BidComment.java rename to base/src/org/compiere/model/X_B_BidComment.java diff --git a/dbPort/src/org/compiere/model/X_B_Buyer.java b/base/src/org/compiere/model/X_B_Buyer.java similarity index 100% rename from dbPort/src/org/compiere/model/X_B_Buyer.java rename to base/src/org/compiere/model/X_B_Buyer.java diff --git a/dbPort/src/org/compiere/model/X_B_BuyerFunds.java b/base/src/org/compiere/model/X_B_BuyerFunds.java similarity index 100% rename from dbPort/src/org/compiere/model/X_B_BuyerFunds.java rename to base/src/org/compiere/model/X_B_BuyerFunds.java diff --git a/dbPort/src/org/compiere/model/X_B_Offer.java b/base/src/org/compiere/model/X_B_Offer.java similarity index 100% rename from dbPort/src/org/compiere/model/X_B_Offer.java rename to base/src/org/compiere/model/X_B_Offer.java diff --git a/dbPort/src/org/compiere/model/X_B_Seller.java b/base/src/org/compiere/model/X_B_Seller.java similarity index 100% rename from dbPort/src/org/compiere/model/X_B_Seller.java rename to base/src/org/compiere/model/X_B_Seller.java diff --git a/dbPort/src/org/compiere/model/X_B_SellerFunds.java b/base/src/org/compiere/model/X_B_SellerFunds.java similarity index 100% rename from dbPort/src/org/compiere/model/X_B_SellerFunds.java rename to base/src/org/compiere/model/X_B_SellerFunds.java diff --git a/dbPort/src/org/compiere/model/X_B_Topic.java b/base/src/org/compiere/model/X_B_Topic.java similarity index 100% rename from dbPort/src/org/compiere/model/X_B_Topic.java rename to base/src/org/compiere/model/X_B_Topic.java diff --git a/dbPort/src/org/compiere/model/X_B_TopicCategory.java b/base/src/org/compiere/model/X_B_TopicCategory.java similarity index 100% rename from dbPort/src/org/compiere/model/X_B_TopicCategory.java rename to base/src/org/compiere/model/X_B_TopicCategory.java diff --git a/dbPort/src/org/compiere/model/X_B_TopicType.java b/base/src/org/compiere/model/X_B_TopicType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_B_TopicType.java rename to base/src/org/compiere/model/X_B_TopicType.java diff --git a/dbPort/src/org/compiere/model/X_CM_AccessContainer.java b/base/src/org/compiere/model/X_CM_AccessContainer.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_AccessContainer.java rename to base/src/org/compiere/model/X_CM_AccessContainer.java diff --git a/dbPort/src/org/compiere/model/X_CM_AccessListBPGroup.java b/base/src/org/compiere/model/X_CM_AccessListBPGroup.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_AccessListBPGroup.java rename to base/src/org/compiere/model/X_CM_AccessListBPGroup.java diff --git a/dbPort/src/org/compiere/model/X_CM_AccessListRole.java b/base/src/org/compiere/model/X_CM_AccessListRole.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_AccessListRole.java rename to base/src/org/compiere/model/X_CM_AccessListRole.java diff --git a/dbPort/src/org/compiere/model/X_CM_AccessMedia.java b/base/src/org/compiere/model/X_CM_AccessMedia.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_AccessMedia.java rename to base/src/org/compiere/model/X_CM_AccessMedia.java diff --git a/dbPort/src/org/compiere/model/X_CM_AccessNewsChannel.java b/base/src/org/compiere/model/X_CM_AccessNewsChannel.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_AccessNewsChannel.java rename to base/src/org/compiere/model/X_CM_AccessNewsChannel.java diff --git a/dbPort/src/org/compiere/model/X_CM_AccessProfile.java b/base/src/org/compiere/model/X_CM_AccessProfile.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_AccessProfile.java rename to base/src/org/compiere/model/X_CM_AccessProfile.java diff --git a/dbPort/src/org/compiere/model/X_CM_AccessStage.java b/base/src/org/compiere/model/X_CM_AccessStage.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_AccessStage.java rename to base/src/org/compiere/model/X_CM_AccessStage.java diff --git a/dbPort/src/org/compiere/model/X_CM_Ad.java b/base/src/org/compiere/model/X_CM_Ad.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Ad.java rename to base/src/org/compiere/model/X_CM_Ad.java diff --git a/dbPort/src/org/compiere/model/X_CM_Ad_Cat.java b/base/src/org/compiere/model/X_CM_Ad_Cat.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Ad_Cat.java rename to base/src/org/compiere/model/X_CM_Ad_Cat.java diff --git a/dbPort/src/org/compiere/model/X_CM_BroadcastServer.java b/base/src/org/compiere/model/X_CM_BroadcastServer.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_BroadcastServer.java rename to base/src/org/compiere/model/X_CM_BroadcastServer.java diff --git a/dbPort/src/org/compiere/model/X_CM_CStage.java b/base/src/org/compiere/model/X_CM_CStage.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_CStage.java rename to base/src/org/compiere/model/X_CM_CStage.java diff --git a/dbPort/src/org/compiere/model/X_CM_CStageTTable.java b/base/src/org/compiere/model/X_CM_CStageTTable.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_CStageTTable.java rename to base/src/org/compiere/model/X_CM_CStageTTable.java diff --git a/dbPort/src/org/compiere/model/X_CM_CStage_Element.java b/base/src/org/compiere/model/X_CM_CStage_Element.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_CStage_Element.java rename to base/src/org/compiere/model/X_CM_CStage_Element.java diff --git a/dbPort/src/org/compiere/model/X_CM_Chat.java b/base/src/org/compiere/model/X_CM_Chat.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Chat.java rename to base/src/org/compiere/model/X_CM_Chat.java diff --git a/dbPort/src/org/compiere/model/X_CM_ChatEntry.java b/base/src/org/compiere/model/X_CM_ChatEntry.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_ChatEntry.java rename to base/src/org/compiere/model/X_CM_ChatEntry.java diff --git a/dbPort/src/org/compiere/model/X_CM_ChatType.java b/base/src/org/compiere/model/X_CM_ChatType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_ChatType.java rename to base/src/org/compiere/model/X_CM_ChatType.java diff --git a/dbPort/src/org/compiere/model/X_CM_ChatTypeUpdate.java b/base/src/org/compiere/model/X_CM_ChatTypeUpdate.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_ChatTypeUpdate.java rename to base/src/org/compiere/model/X_CM_ChatTypeUpdate.java diff --git a/dbPort/src/org/compiere/model/X_CM_ChatUpdate.java b/base/src/org/compiere/model/X_CM_ChatUpdate.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_ChatUpdate.java rename to base/src/org/compiere/model/X_CM_ChatUpdate.java diff --git a/dbPort/src/org/compiere/model/X_CM_Container.java b/base/src/org/compiere/model/X_CM_Container.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Container.java rename to base/src/org/compiere/model/X_CM_Container.java diff --git a/dbPort/src/org/compiere/model/X_CM_ContainerTTable.java b/base/src/org/compiere/model/X_CM_ContainerTTable.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_ContainerTTable.java rename to base/src/org/compiere/model/X_CM_ContainerTTable.java diff --git a/dbPort/src/org/compiere/model/X_CM_Container_Element.java b/base/src/org/compiere/model/X_CM_Container_Element.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Container_Element.java rename to base/src/org/compiere/model/X_CM_Container_Element.java diff --git a/dbPort/src/org/compiere/model/X_CM_Container_Index.java b/base/src/org/compiere/model/X_CM_Container_Index.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Container_Index.java rename to base/src/org/compiere/model/X_CM_Container_Index.java diff --git a/dbPort/src/org/compiere/model/X_CM_Container_ToDo.java b/base/src/org/compiere/model/X_CM_Container_ToDo.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Container_ToDo.java rename to base/src/org/compiere/model/X_CM_Container_ToDo.java diff --git a/dbPort/src/org/compiere/model/X_CM_Container_URL.java b/base/src/org/compiere/model/X_CM_Container_URL.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Container_URL.java rename to base/src/org/compiere/model/X_CM_Container_URL.java diff --git a/dbPort/src/org/compiere/model/X_CM_Media.java b/base/src/org/compiere/model/X_CM_Media.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Media.java rename to base/src/org/compiere/model/X_CM_Media.java diff --git a/dbPort/src/org/compiere/model/X_CM_MediaDeploy.java b/base/src/org/compiere/model/X_CM_MediaDeploy.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_MediaDeploy.java rename to base/src/org/compiere/model/X_CM_MediaDeploy.java diff --git a/dbPort/src/org/compiere/model/X_CM_Media_Server.java b/base/src/org/compiere/model/X_CM_Media_Server.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Media_Server.java rename to base/src/org/compiere/model/X_CM_Media_Server.java diff --git a/dbPort/src/org/compiere/model/X_CM_NewsChannel.java b/base/src/org/compiere/model/X_CM_NewsChannel.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_NewsChannel.java rename to base/src/org/compiere/model/X_CM_NewsChannel.java diff --git a/dbPort/src/org/compiere/model/X_CM_NewsItem.java b/base/src/org/compiere/model/X_CM_NewsItem.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_NewsItem.java rename to base/src/org/compiere/model/X_CM_NewsItem.java diff --git a/dbPort/src/org/compiere/model/X_CM_Template.java b/base/src/org/compiere/model/X_CM_Template.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Template.java rename to base/src/org/compiere/model/X_CM_Template.java diff --git a/dbPort/src/org/compiere/model/X_CM_TemplateTable.java b/base/src/org/compiere/model/X_CM_TemplateTable.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_TemplateTable.java rename to base/src/org/compiere/model/X_CM_TemplateTable.java diff --git a/dbPort/src/org/compiere/model/X_CM_Template_Ad_Cat.java b/base/src/org/compiere/model/X_CM_Template_Ad_Cat.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_Template_Ad_Cat.java rename to base/src/org/compiere/model/X_CM_Template_Ad_Cat.java diff --git a/dbPort/src/org/compiere/model/X_CM_WebAccessLog.java b/base/src/org/compiere/model/X_CM_WebAccessLog.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_WebAccessLog.java rename to base/src/org/compiere/model/X_CM_WebAccessLog.java diff --git a/dbPort/src/org/compiere/model/X_CM_WebProject.java b/base/src/org/compiere/model/X_CM_WebProject.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_WebProject.java rename to base/src/org/compiere/model/X_CM_WebProject.java diff --git a/dbPort/src/org/compiere/model/X_CM_WebProject_Domain.java b/base/src/org/compiere/model/X_CM_WebProject_Domain.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_WebProject_Domain.java rename to base/src/org/compiere/model/X_CM_WebProject_Domain.java diff --git a/dbPort/src/org/compiere/model/X_CM_WikiToken.java b/base/src/org/compiere/model/X_CM_WikiToken.java similarity index 100% rename from dbPort/src/org/compiere/model/X_CM_WikiToken.java rename to base/src/org/compiere/model/X_CM_WikiToken.java diff --git a/dbPort/src/org/compiere/model/X_C_AcctProcessor.java b/base/src/org/compiere/model/X_C_AcctProcessor.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_AcctProcessor.java rename to base/src/org/compiere/model/X_C_AcctProcessor.java diff --git a/dbPort/src/org/compiere/model/X_C_AcctProcessorLog.java b/base/src/org/compiere/model/X_C_AcctProcessorLog.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_AcctProcessorLog.java rename to base/src/org/compiere/model/X_C_AcctProcessorLog.java diff --git a/dbPort/src/org/compiere/model/X_C_AcctSchema.java b/base/src/org/compiere/model/X_C_AcctSchema.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_AcctSchema.java rename to base/src/org/compiere/model/X_C_AcctSchema.java diff --git a/dbPort/src/org/compiere/model/X_C_AcctSchema_Default.java b/base/src/org/compiere/model/X_C_AcctSchema_Default.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_AcctSchema_Default.java rename to base/src/org/compiere/model/X_C_AcctSchema_Default.java diff --git a/dbPort/src/org/compiere/model/X_C_AcctSchema_Element.java b/base/src/org/compiere/model/X_C_AcctSchema_Element.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_AcctSchema_Element.java rename to base/src/org/compiere/model/X_C_AcctSchema_Element.java diff --git a/dbPort/src/org/compiere/model/X_C_AcctSchema_GL.java b/base/src/org/compiere/model/X_C_AcctSchema_GL.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_AcctSchema_GL.java rename to base/src/org/compiere/model/X_C_AcctSchema_GL.java diff --git a/dbPort/src/org/compiere/model/X_C_Activity.java b/base/src/org/compiere/model/X_C_Activity.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Activity.java rename to base/src/org/compiere/model/X_C_Activity.java diff --git a/dbPort/src/org/compiere/model/X_C_AllocationHdr.java b/base/src/org/compiere/model/X_C_AllocationHdr.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_AllocationHdr.java rename to base/src/org/compiere/model/X_C_AllocationHdr.java diff --git a/dbPort/src/org/compiere/model/X_C_AllocationLine.java b/base/src/org/compiere/model/X_C_AllocationLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_AllocationLine.java rename to base/src/org/compiere/model/X_C_AllocationLine.java diff --git a/dbPort/src/org/compiere/model/X_C_BP_BankAccount.java b/base/src/org/compiere/model/X_C_BP_BankAccount.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BP_BankAccount.java rename to base/src/org/compiere/model/X_C_BP_BankAccount.java diff --git a/dbPort/src/org/compiere/model/X_C_BP_Customer_Acct.java b/base/src/org/compiere/model/X_C_BP_Customer_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BP_Customer_Acct.java rename to base/src/org/compiere/model/X_C_BP_Customer_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_BP_EDI.java b/base/src/org/compiere/model/X_C_BP_EDI.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BP_EDI.java rename to base/src/org/compiere/model/X_C_BP_EDI.java diff --git a/dbPort/src/org/compiere/model/X_C_BP_Employee_Acct.java b/base/src/org/compiere/model/X_C_BP_Employee_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BP_Employee_Acct.java rename to base/src/org/compiere/model/X_C_BP_Employee_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_BP_Group.java b/base/src/org/compiere/model/X_C_BP_Group.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BP_Group.java rename to base/src/org/compiere/model/X_C_BP_Group.java diff --git a/dbPort/src/org/compiere/model/X_C_BP_Group_Acct.java b/base/src/org/compiere/model/X_C_BP_Group_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BP_Group_Acct.java rename to base/src/org/compiere/model/X_C_BP_Group_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_BP_Relation.java b/base/src/org/compiere/model/X_C_BP_Relation.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BP_Relation.java rename to base/src/org/compiere/model/X_C_BP_Relation.java diff --git a/dbPort/src/org/compiere/model/X_C_BP_Vendor_Acct.java b/base/src/org/compiere/model/X_C_BP_Vendor_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BP_Vendor_Acct.java rename to base/src/org/compiere/model/X_C_BP_Vendor_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_BP_Withholding.java b/base/src/org/compiere/model/X_C_BP_Withholding.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BP_Withholding.java rename to base/src/org/compiere/model/X_C_BP_Withholding.java diff --git a/dbPort/src/org/compiere/model/X_C_BPartner.java b/base/src/org/compiere/model/X_C_BPartner.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BPartner.java rename to base/src/org/compiere/model/X_C_BPartner.java diff --git a/dbPort/src/org/compiere/model/X_C_BPartner_Location.java b/base/src/org/compiere/model/X_C_BPartner_Location.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BPartner_Location.java rename to base/src/org/compiere/model/X_C_BPartner_Location.java diff --git a/dbPort/src/org/compiere/model/X_C_BPartner_Product.java b/base/src/org/compiere/model/X_C_BPartner_Product.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BPartner_Product.java rename to base/src/org/compiere/model/X_C_BPartner_Product.java diff --git a/dbPort/src/org/compiere/model/X_C_Bank.java b/base/src/org/compiere/model/X_C_Bank.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Bank.java rename to base/src/org/compiere/model/X_C_Bank.java diff --git a/dbPort/src/org/compiere/model/X_C_BankAccount.java b/base/src/org/compiere/model/X_C_BankAccount.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BankAccount.java rename to base/src/org/compiere/model/X_C_BankAccount.java diff --git a/dbPort/src/org/compiere/model/X_C_BankAccountDoc.java b/base/src/org/compiere/model/X_C_BankAccountDoc.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BankAccountDoc.java rename to base/src/org/compiere/model/X_C_BankAccountDoc.java diff --git a/dbPort/src/org/compiere/model/X_C_BankAccount_Acct.java b/base/src/org/compiere/model/X_C_BankAccount_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BankAccount_Acct.java rename to base/src/org/compiere/model/X_C_BankAccount_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_BankStatement.java b/base/src/org/compiere/model/X_C_BankStatement.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BankStatement.java rename to base/src/org/compiere/model/X_C_BankStatement.java diff --git a/dbPort/src/org/compiere/model/X_C_BankStatementLine.java b/base/src/org/compiere/model/X_C_BankStatementLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BankStatementLine.java rename to base/src/org/compiere/model/X_C_BankStatementLine.java diff --git a/dbPort/src/org/compiere/model/X_C_BankStatementLoader.java b/base/src/org/compiere/model/X_C_BankStatementLoader.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BankStatementLoader.java rename to base/src/org/compiere/model/X_C_BankStatementLoader.java diff --git a/dbPort/src/org/compiere/model/X_C_BankStatementMatcher.java b/base/src/org/compiere/model/X_C_BankStatementMatcher.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_BankStatementMatcher.java rename to base/src/org/compiere/model/X_C_BankStatementMatcher.java diff --git a/dbPort/src/org/compiere/model/X_C_Calendar.java b/base/src/org/compiere/model/X_C_Calendar.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Calendar.java rename to base/src/org/compiere/model/X_C_Calendar.java diff --git a/dbPort/src/org/compiere/model/X_C_Campaign.java b/base/src/org/compiere/model/X_C_Campaign.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Campaign.java rename to base/src/org/compiere/model/X_C_Campaign.java diff --git a/dbPort/src/org/compiere/model/X_C_Cash.java b/base/src/org/compiere/model/X_C_Cash.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Cash.java rename to base/src/org/compiere/model/X_C_Cash.java diff --git a/dbPort/src/org/compiere/model/X_C_CashBook.java b/base/src/org/compiere/model/X_C_CashBook.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_CashBook.java rename to base/src/org/compiere/model/X_C_CashBook.java diff --git a/dbPort/src/org/compiere/model/X_C_CashBook_Acct.java b/base/src/org/compiere/model/X_C_CashBook_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_CashBook_Acct.java rename to base/src/org/compiere/model/X_C_CashBook_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_CashLine.java b/base/src/org/compiere/model/X_C_CashLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_CashLine.java rename to base/src/org/compiere/model/X_C_CashLine.java diff --git a/dbPort/src/org/compiere/model/X_C_Channel.java b/base/src/org/compiere/model/X_C_Channel.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Channel.java rename to base/src/org/compiere/model/X_C_Channel.java diff --git a/dbPort/src/org/compiere/model/X_C_Charge.java b/base/src/org/compiere/model/X_C_Charge.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Charge.java rename to base/src/org/compiere/model/X_C_Charge.java diff --git a/dbPort/src/org/compiere/model/X_C_Charge_Acct.java b/base/src/org/compiere/model/X_C_Charge_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Charge_Acct.java rename to base/src/org/compiere/model/X_C_Charge_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_City.java b/base/src/org/compiere/model/X_C_City.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_City.java rename to base/src/org/compiere/model/X_C_City.java diff --git a/dbPort/src/org/compiere/model/X_C_Commission.java b/base/src/org/compiere/model/X_C_Commission.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Commission.java rename to base/src/org/compiere/model/X_C_Commission.java diff --git a/dbPort/src/org/compiere/model/X_C_CommissionAmt.java b/base/src/org/compiere/model/X_C_CommissionAmt.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_CommissionAmt.java rename to base/src/org/compiere/model/X_C_CommissionAmt.java diff --git a/dbPort/src/org/compiere/model/X_C_CommissionDetail.java b/base/src/org/compiere/model/X_C_CommissionDetail.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_CommissionDetail.java rename to base/src/org/compiere/model/X_C_CommissionDetail.java diff --git a/dbPort/src/org/compiere/model/X_C_CommissionLine.java b/base/src/org/compiere/model/X_C_CommissionLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_CommissionLine.java rename to base/src/org/compiere/model/X_C_CommissionLine.java diff --git a/dbPort/src/org/compiere/model/X_C_CommissionRun.java b/base/src/org/compiere/model/X_C_CommissionRun.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_CommissionRun.java rename to base/src/org/compiere/model/X_C_CommissionRun.java diff --git a/dbPort/src/org/compiere/model/X_C_ConversionType.java b/base/src/org/compiere/model/X_C_ConversionType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_ConversionType.java rename to base/src/org/compiere/model/X_C_ConversionType.java diff --git a/dbPort/src/org/compiere/model/X_C_Conversion_Rate.java b/base/src/org/compiere/model/X_C_Conversion_Rate.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Conversion_Rate.java rename to base/src/org/compiere/model/X_C_Conversion_Rate.java diff --git a/dbPort/src/org/compiere/model/X_C_Country.java b/base/src/org/compiere/model/X_C_Country.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Country.java rename to base/src/org/compiere/model/X_C_Country.java diff --git a/dbPort/src/org/compiere/model/X_C_Currency.java b/base/src/org/compiere/model/X_C_Currency.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Currency.java rename to base/src/org/compiere/model/X_C_Currency.java diff --git a/dbPort/src/org/compiere/model/X_C_Currency_Acct.java b/base/src/org/compiere/model/X_C_Currency_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Currency_Acct.java rename to base/src/org/compiere/model/X_C_Currency_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_Cycle.java b/base/src/org/compiere/model/X_C_Cycle.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Cycle.java rename to base/src/org/compiere/model/X_C_Cycle.java diff --git a/dbPort/src/org/compiere/model/X_C_CyclePhase.java b/base/src/org/compiere/model/X_C_CyclePhase.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_CyclePhase.java rename to base/src/org/compiere/model/X_C_CyclePhase.java diff --git a/dbPort/src/org/compiere/model/X_C_CycleStep.java b/base/src/org/compiere/model/X_C_CycleStep.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_CycleStep.java rename to base/src/org/compiere/model/X_C_CycleStep.java diff --git a/dbPort/src/org/compiere/model/X_C_DocType.java b/base/src/org/compiere/model/X_C_DocType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_DocType.java rename to base/src/org/compiere/model/X_C_DocType.java diff --git a/dbPort/src/org/compiere/model/X_C_DocTypeCounter.java b/base/src/org/compiere/model/X_C_DocTypeCounter.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_DocTypeCounter.java rename to base/src/org/compiere/model/X_C_DocTypeCounter.java diff --git a/dbPort/src/org/compiere/model/X_C_Dunning.java b/base/src/org/compiere/model/X_C_Dunning.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Dunning.java rename to base/src/org/compiere/model/X_C_Dunning.java diff --git a/dbPort/src/org/compiere/model/X_C_DunningLevel.java b/base/src/org/compiere/model/X_C_DunningLevel.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_DunningLevel.java rename to base/src/org/compiere/model/X_C_DunningLevel.java diff --git a/dbPort/src/org/compiere/model/X_C_DunningRun.java b/base/src/org/compiere/model/X_C_DunningRun.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_DunningRun.java rename to base/src/org/compiere/model/X_C_DunningRun.java diff --git a/dbPort/src/org/compiere/model/X_C_DunningRunEntry.java b/base/src/org/compiere/model/X_C_DunningRunEntry.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_DunningRunEntry.java rename to base/src/org/compiere/model/X_C_DunningRunEntry.java diff --git a/dbPort/src/org/compiere/model/X_C_DunningRunLine.java b/base/src/org/compiere/model/X_C_DunningRunLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_DunningRunLine.java rename to base/src/org/compiere/model/X_C_DunningRunLine.java diff --git a/dbPort/src/org/compiere/model/X_C_Element.java b/base/src/org/compiere/model/X_C_Element.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Element.java rename to base/src/org/compiere/model/X_C_Element.java diff --git a/dbPort/src/org/compiere/model/X_C_ElementValue.java b/base/src/org/compiere/model/X_C_ElementValue.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_ElementValue.java rename to base/src/org/compiere/model/X_C_ElementValue.java diff --git a/dbPort/src/org/compiere/model/X_C_Greeting.java b/base/src/org/compiere/model/X_C_Greeting.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Greeting.java rename to base/src/org/compiere/model/X_C_Greeting.java diff --git a/dbPort/src/org/compiere/model/X_C_InterOrg_Acct.java b/base/src/org/compiere/model/X_C_InterOrg_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_InterOrg_Acct.java rename to base/src/org/compiere/model/X_C_InterOrg_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_Invoice.java b/base/src/org/compiere/model/X_C_Invoice.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Invoice.java rename to base/src/org/compiere/model/X_C_Invoice.java diff --git a/dbPort/src/org/compiere/model/X_C_InvoiceBatch.java b/base/src/org/compiere/model/X_C_InvoiceBatch.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_InvoiceBatch.java rename to base/src/org/compiere/model/X_C_InvoiceBatch.java diff --git a/dbPort/src/org/compiere/model/X_C_InvoiceBatchLine.java b/base/src/org/compiere/model/X_C_InvoiceBatchLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_InvoiceBatchLine.java rename to base/src/org/compiere/model/X_C_InvoiceBatchLine.java diff --git a/dbPort/src/org/compiere/model/X_C_InvoiceLine.java b/base/src/org/compiere/model/X_C_InvoiceLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_InvoiceLine.java rename to base/src/org/compiere/model/X_C_InvoiceLine.java diff --git a/dbPort/src/org/compiere/model/X_C_InvoicePaySchedule.java b/base/src/org/compiere/model/X_C_InvoicePaySchedule.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_InvoicePaySchedule.java rename to base/src/org/compiere/model/X_C_InvoicePaySchedule.java diff --git a/dbPort/src/org/compiere/model/X_C_InvoiceSchedule.java b/base/src/org/compiere/model/X_C_InvoiceSchedule.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_InvoiceSchedule.java rename to base/src/org/compiere/model/X_C_InvoiceSchedule.java diff --git a/dbPort/src/org/compiere/model/X_C_InvoiceTax.java b/base/src/org/compiere/model/X_C_InvoiceTax.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_InvoiceTax.java rename to base/src/org/compiere/model/X_C_InvoiceTax.java diff --git a/dbPort/src/org/compiere/model/X_C_Job.java b/base/src/org/compiere/model/X_C_Job.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Job.java rename to base/src/org/compiere/model/X_C_Job.java diff --git a/dbPort/src/org/compiere/model/X_C_JobAssignment.java b/base/src/org/compiere/model/X_C_JobAssignment.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_JobAssignment.java rename to base/src/org/compiere/model/X_C_JobAssignment.java diff --git a/dbPort/src/org/compiere/model/X_C_JobCategory.java b/base/src/org/compiere/model/X_C_JobCategory.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_JobCategory.java rename to base/src/org/compiere/model/X_C_JobCategory.java diff --git a/dbPort/src/org/compiere/model/X_C_JobRemuneration.java b/base/src/org/compiere/model/X_C_JobRemuneration.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_JobRemuneration.java rename to base/src/org/compiere/model/X_C_JobRemuneration.java diff --git a/dbPort/src/org/compiere/model/X_C_LandedCost.java b/base/src/org/compiere/model/X_C_LandedCost.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_LandedCost.java rename to base/src/org/compiere/model/X_C_LandedCost.java diff --git a/dbPort/src/org/compiere/model/X_C_LandedCostAllocation.java b/base/src/org/compiere/model/X_C_LandedCostAllocation.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_LandedCostAllocation.java rename to base/src/org/compiere/model/X_C_LandedCostAllocation.java diff --git a/dbPort/src/org/compiere/model/X_C_Location.java b/base/src/org/compiere/model/X_C_Location.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Location.java rename to base/src/org/compiere/model/X_C_Location.java diff --git a/dbPort/src/org/compiere/model/X_C_NonBusinessDay.java b/base/src/org/compiere/model/X_C_NonBusinessDay.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_NonBusinessDay.java rename to base/src/org/compiere/model/X_C_NonBusinessDay.java diff --git a/dbPort/src/org/compiere/model/X_C_Order.java b/base/src/org/compiere/model/X_C_Order.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Order.java rename to base/src/org/compiere/model/X_C_Order.java diff --git a/dbPort/src/org/compiere/model/X_C_OrderLine.java b/base/src/org/compiere/model/X_C_OrderLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_OrderLine.java rename to base/src/org/compiere/model/X_C_OrderLine.java diff --git a/dbPort/src/org/compiere/model/X_C_OrderTax.java b/base/src/org/compiere/model/X_C_OrderTax.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_OrderTax.java rename to base/src/org/compiere/model/X_C_OrderTax.java diff --git a/dbPort/src/org/compiere/model/X_C_OrgAssignment.java b/base/src/org/compiere/model/X_C_OrgAssignment.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_OrgAssignment.java rename to base/src/org/compiere/model/X_C_OrgAssignment.java diff --git a/dbPort/src/org/compiere/model/X_C_POS.java b/base/src/org/compiere/model/X_C_POS.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_POS.java rename to base/src/org/compiere/model/X_C_POS.java diff --git a/dbPort/src/org/compiere/model/X_C_POSKey.java b/base/src/org/compiere/model/X_C_POSKey.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_POSKey.java rename to base/src/org/compiere/model/X_C_POSKey.java diff --git a/dbPort/src/org/compiere/model/X_C_POSKeyLayout.java b/base/src/org/compiere/model/X_C_POSKeyLayout.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_POSKeyLayout.java rename to base/src/org/compiere/model/X_C_POSKeyLayout.java diff --git a/dbPort/src/org/compiere/model/X_C_PaySchedule.java b/base/src/org/compiere/model/X_C_PaySchedule.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_PaySchedule.java rename to base/src/org/compiere/model/X_C_PaySchedule.java diff --git a/dbPort/src/org/compiere/model/X_C_PaySelection.java b/base/src/org/compiere/model/X_C_PaySelection.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_PaySelection.java rename to base/src/org/compiere/model/X_C_PaySelection.java diff --git a/dbPort/src/org/compiere/model/X_C_PaySelectionCheck.java b/base/src/org/compiere/model/X_C_PaySelectionCheck.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_PaySelectionCheck.java rename to base/src/org/compiere/model/X_C_PaySelectionCheck.java diff --git a/dbPort/src/org/compiere/model/X_C_PaySelectionLine.java b/base/src/org/compiere/model/X_C_PaySelectionLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_PaySelectionLine.java rename to base/src/org/compiere/model/X_C_PaySelectionLine.java diff --git a/dbPort/src/org/compiere/model/X_C_Payment.java b/base/src/org/compiere/model/X_C_Payment.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Payment.java rename to base/src/org/compiere/model/X_C_Payment.java diff --git a/dbPort/src/org/compiere/model/X_C_PaymentAllocate.java b/base/src/org/compiere/model/X_C_PaymentAllocate.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_PaymentAllocate.java rename to base/src/org/compiere/model/X_C_PaymentAllocate.java diff --git a/dbPort/src/org/compiere/model/X_C_PaymentBatch.java b/base/src/org/compiere/model/X_C_PaymentBatch.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_PaymentBatch.java rename to base/src/org/compiere/model/X_C_PaymentBatch.java diff --git a/dbPort/src/org/compiere/model/X_C_PaymentProcessor.java b/base/src/org/compiere/model/X_C_PaymentProcessor.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_PaymentProcessor.java rename to base/src/org/compiere/model/X_C_PaymentProcessor.java diff --git a/dbPort/src/org/compiere/model/X_C_PaymentTerm.java b/base/src/org/compiere/model/X_C_PaymentTerm.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_PaymentTerm.java rename to base/src/org/compiere/model/X_C_PaymentTerm.java diff --git a/dbPort/src/org/compiere/model/X_C_Period.java b/base/src/org/compiere/model/X_C_Period.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Period.java rename to base/src/org/compiere/model/X_C_Period.java diff --git a/dbPort/src/org/compiere/model/X_C_PeriodControl.java b/base/src/org/compiere/model/X_C_PeriodControl.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_PeriodControl.java rename to base/src/org/compiere/model/X_C_PeriodControl.java diff --git a/dbPort/src/org/compiere/model/X_C_Phase.java b/base/src/org/compiere/model/X_C_Phase.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Phase.java rename to base/src/org/compiere/model/X_C_Phase.java diff --git a/dbPort/src/org/compiere/model/X_C_Project.java b/base/src/org/compiere/model/X_C_Project.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Project.java rename to base/src/org/compiere/model/X_C_Project.java diff --git a/dbPort/src/org/compiere/model/X_C_ProjectIssue.java b/base/src/org/compiere/model/X_C_ProjectIssue.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_ProjectIssue.java rename to base/src/org/compiere/model/X_C_ProjectIssue.java diff --git a/dbPort/src/org/compiere/model/X_C_ProjectIssueMA.java b/base/src/org/compiere/model/X_C_ProjectIssueMA.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_ProjectIssueMA.java rename to base/src/org/compiere/model/X_C_ProjectIssueMA.java diff --git a/dbPort/src/org/compiere/model/X_C_ProjectLine.java b/base/src/org/compiere/model/X_C_ProjectLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_ProjectLine.java rename to base/src/org/compiere/model/X_C_ProjectLine.java diff --git a/dbPort/src/org/compiere/model/X_C_ProjectPhase.java b/base/src/org/compiere/model/X_C_ProjectPhase.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_ProjectPhase.java rename to base/src/org/compiere/model/X_C_ProjectPhase.java diff --git a/dbPort/src/org/compiere/model/X_C_ProjectTask.java b/base/src/org/compiere/model/X_C_ProjectTask.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_ProjectTask.java rename to base/src/org/compiere/model/X_C_ProjectTask.java diff --git a/dbPort/src/org/compiere/model/X_C_ProjectType.java b/base/src/org/compiere/model/X_C_ProjectType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_ProjectType.java rename to base/src/org/compiere/model/X_C_ProjectType.java diff --git a/dbPort/src/org/compiere/model/X_C_Project_Acct.java b/base/src/org/compiere/model/X_C_Project_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Project_Acct.java rename to base/src/org/compiere/model/X_C_Project_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_Recurring.java b/base/src/org/compiere/model/X_C_Recurring.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Recurring.java rename to base/src/org/compiere/model/X_C_Recurring.java diff --git a/dbPort/src/org/compiere/model/X_C_Recurring_Run.java b/base/src/org/compiere/model/X_C_Recurring_Run.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Recurring_Run.java rename to base/src/org/compiere/model/X_C_Recurring_Run.java diff --git a/dbPort/src/org/compiere/model/X_C_Region.java b/base/src/org/compiere/model/X_C_Region.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Region.java rename to base/src/org/compiere/model/X_C_Region.java diff --git a/dbPort/src/org/compiere/model/X_C_Remuneration.java b/base/src/org/compiere/model/X_C_Remuneration.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Remuneration.java rename to base/src/org/compiere/model/X_C_Remuneration.java diff --git a/dbPort/src/org/compiere/model/X_C_RevenueRecognition.java b/base/src/org/compiere/model/X_C_RevenueRecognition.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RevenueRecognition.java rename to base/src/org/compiere/model/X_C_RevenueRecognition.java diff --git a/dbPort/src/org/compiere/model/X_C_RevenueRecognition_Plan.java b/base/src/org/compiere/model/X_C_RevenueRecognition_Plan.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RevenueRecognition_Plan.java rename to base/src/org/compiere/model/X_C_RevenueRecognition_Plan.java diff --git a/dbPort/src/org/compiere/model/X_C_RevenueRecognition_Run.java b/base/src/org/compiere/model/X_C_RevenueRecognition_Run.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RevenueRecognition_Run.java rename to base/src/org/compiere/model/X_C_RevenueRecognition_Run.java diff --git a/dbPort/src/org/compiere/model/X_C_RfQ.java b/base/src/org/compiere/model/X_C_RfQ.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RfQ.java rename to base/src/org/compiere/model/X_C_RfQ.java diff --git a/dbPort/src/org/compiere/model/X_C_RfQLine.java b/base/src/org/compiere/model/X_C_RfQLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RfQLine.java rename to base/src/org/compiere/model/X_C_RfQLine.java diff --git a/dbPort/src/org/compiere/model/X_C_RfQLineQty.java b/base/src/org/compiere/model/X_C_RfQLineQty.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RfQLineQty.java rename to base/src/org/compiere/model/X_C_RfQLineQty.java diff --git a/dbPort/src/org/compiere/model/X_C_RfQResponse.java b/base/src/org/compiere/model/X_C_RfQResponse.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RfQResponse.java rename to base/src/org/compiere/model/X_C_RfQResponse.java diff --git a/dbPort/src/org/compiere/model/X_C_RfQResponseLine.java b/base/src/org/compiere/model/X_C_RfQResponseLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RfQResponseLine.java rename to base/src/org/compiere/model/X_C_RfQResponseLine.java diff --git a/dbPort/src/org/compiere/model/X_C_RfQResponseLineQty.java b/base/src/org/compiere/model/X_C_RfQResponseLineQty.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RfQResponseLineQty.java rename to base/src/org/compiere/model/X_C_RfQResponseLineQty.java diff --git a/dbPort/src/org/compiere/model/X_C_RfQ_Topic.java b/base/src/org/compiere/model/X_C_RfQ_Topic.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RfQ_Topic.java rename to base/src/org/compiere/model/X_C_RfQ_Topic.java diff --git a/dbPort/src/org/compiere/model/X_C_RfQ_TopicSubscriber.java b/base/src/org/compiere/model/X_C_RfQ_TopicSubscriber.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RfQ_TopicSubscriber.java rename to base/src/org/compiere/model/X_C_RfQ_TopicSubscriber.java diff --git a/dbPort/src/org/compiere/model/X_C_RfQ_TopicSubscriberOnly.java b/base/src/org/compiere/model/X_C_RfQ_TopicSubscriberOnly.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_RfQ_TopicSubscriberOnly.java rename to base/src/org/compiere/model/X_C_RfQ_TopicSubscriberOnly.java diff --git a/dbPort/src/org/compiere/model/X_C_SalesRegion.java b/base/src/org/compiere/model/X_C_SalesRegion.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_SalesRegion.java rename to base/src/org/compiere/model/X_C_SalesRegion.java diff --git a/dbPort/src/org/compiere/model/X_C_ServiceLevel.java b/base/src/org/compiere/model/X_C_ServiceLevel.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_ServiceLevel.java rename to base/src/org/compiere/model/X_C_ServiceLevel.java diff --git a/dbPort/src/org/compiere/model/X_C_ServiceLevelLine.java b/base/src/org/compiere/model/X_C_ServiceLevelLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_ServiceLevelLine.java rename to base/src/org/compiere/model/X_C_ServiceLevelLine.java diff --git a/dbPort/src/org/compiere/model/X_C_SubAcct.java b/base/src/org/compiere/model/X_C_SubAcct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_SubAcct.java rename to base/src/org/compiere/model/X_C_SubAcct.java diff --git a/dbPort/src/org/compiere/model/X_C_Subscription.java b/base/src/org/compiere/model/X_C_Subscription.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Subscription.java rename to base/src/org/compiere/model/X_C_Subscription.java diff --git a/dbPort/src/org/compiere/model/X_C_SubscriptionType.java b/base/src/org/compiere/model/X_C_SubscriptionType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_SubscriptionType.java rename to base/src/org/compiere/model/X_C_SubscriptionType.java diff --git a/dbPort/src/org/compiere/model/X_C_Subscription_Delivery.java b/base/src/org/compiere/model/X_C_Subscription_Delivery.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Subscription_Delivery.java rename to base/src/org/compiere/model/X_C_Subscription_Delivery.java diff --git a/dbPort/src/org/compiere/model/X_C_Task.java b/base/src/org/compiere/model/X_C_Task.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Task.java rename to base/src/org/compiere/model/X_C_Task.java diff --git a/dbPort/src/org/compiere/model/X_C_Tax.java b/base/src/org/compiere/model/X_C_Tax.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Tax.java rename to base/src/org/compiere/model/X_C_Tax.java diff --git a/dbPort/src/org/compiere/model/X_C_TaxCategory.java b/base/src/org/compiere/model/X_C_TaxCategory.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_TaxCategory.java rename to base/src/org/compiere/model/X_C_TaxCategory.java diff --git a/dbPort/src/org/compiere/model/X_C_TaxDeclaration.java b/base/src/org/compiere/model/X_C_TaxDeclaration.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_TaxDeclaration.java rename to base/src/org/compiere/model/X_C_TaxDeclaration.java diff --git a/dbPort/src/org/compiere/model/X_C_TaxDeclarationAcct.java b/base/src/org/compiere/model/X_C_TaxDeclarationAcct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_TaxDeclarationAcct.java rename to base/src/org/compiere/model/X_C_TaxDeclarationAcct.java diff --git a/dbPort/src/org/compiere/model/X_C_TaxDeclarationLine.java b/base/src/org/compiere/model/X_C_TaxDeclarationLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_TaxDeclarationLine.java rename to base/src/org/compiere/model/X_C_TaxDeclarationLine.java diff --git a/dbPort/src/org/compiere/model/X_C_TaxPostal.java b/base/src/org/compiere/model/X_C_TaxPostal.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_TaxPostal.java rename to base/src/org/compiere/model/X_C_TaxPostal.java diff --git a/dbPort/src/org/compiere/model/X_C_Tax_Acct.java b/base/src/org/compiere/model/X_C_Tax_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Tax_Acct.java rename to base/src/org/compiere/model/X_C_Tax_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_UOM.java b/base/src/org/compiere/model/X_C_UOM.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_UOM.java rename to base/src/org/compiere/model/X_C_UOM.java diff --git a/dbPort/src/org/compiere/model/X_C_UOM_Conversion.java b/base/src/org/compiere/model/X_C_UOM_Conversion.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_UOM_Conversion.java rename to base/src/org/compiere/model/X_C_UOM_Conversion.java diff --git a/dbPort/src/org/compiere/model/X_C_UserRemuneration.java b/base/src/org/compiere/model/X_C_UserRemuneration.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_UserRemuneration.java rename to base/src/org/compiere/model/X_C_UserRemuneration.java diff --git a/dbPort/src/org/compiere/model/X_C_ValidCombination.java b/base/src/org/compiere/model/X_C_ValidCombination.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_ValidCombination.java rename to base/src/org/compiere/model/X_C_ValidCombination.java diff --git a/dbPort/src/org/compiere/model/X_C_Withholding.java b/base/src/org/compiere/model/X_C_Withholding.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Withholding.java rename to base/src/org/compiere/model/X_C_Withholding.java diff --git a/dbPort/src/org/compiere/model/X_C_Withholding_Acct.java b/base/src/org/compiere/model/X_C_Withholding_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Withholding_Acct.java rename to base/src/org/compiere/model/X_C_Withholding_Acct.java diff --git a/dbPort/src/org/compiere/model/X_C_Year.java b/base/src/org/compiere/model/X_C_Year.java similarity index 100% rename from dbPort/src/org/compiere/model/X_C_Year.java rename to base/src/org/compiere/model/X_C_Year.java diff --git a/dbPort/src/org/compiere/model/X_Fact_Acct.java b/base/src/org/compiere/model/X_Fact_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_Fact_Acct.java rename to base/src/org/compiere/model/X_Fact_Acct.java diff --git a/dbPort/src/org/compiere/model/X_Fact_Acct_Balance.java b/base/src/org/compiere/model/X_Fact_Acct_Balance.java similarity index 100% rename from dbPort/src/org/compiere/model/X_Fact_Acct_Balance.java rename to base/src/org/compiere/model/X_Fact_Acct_Balance.java diff --git a/dbPort/src/org/compiere/model/X_GL_Budget.java b/base/src/org/compiere/model/X_GL_Budget.java similarity index 100% rename from dbPort/src/org/compiere/model/X_GL_Budget.java rename to base/src/org/compiere/model/X_GL_Budget.java diff --git a/dbPort/src/org/compiere/model/X_GL_BudgetControl.java b/base/src/org/compiere/model/X_GL_BudgetControl.java similarity index 100% rename from dbPort/src/org/compiere/model/X_GL_BudgetControl.java rename to base/src/org/compiere/model/X_GL_BudgetControl.java diff --git a/dbPort/src/org/compiere/model/X_GL_Category.java b/base/src/org/compiere/model/X_GL_Category.java similarity index 100% rename from dbPort/src/org/compiere/model/X_GL_Category.java rename to base/src/org/compiere/model/X_GL_Category.java diff --git a/dbPort/src/org/compiere/model/X_GL_Distribution.java b/base/src/org/compiere/model/X_GL_Distribution.java similarity index 100% rename from dbPort/src/org/compiere/model/X_GL_Distribution.java rename to base/src/org/compiere/model/X_GL_Distribution.java diff --git a/dbPort/src/org/compiere/model/X_GL_DistributionLine.java b/base/src/org/compiere/model/X_GL_DistributionLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_GL_DistributionLine.java rename to base/src/org/compiere/model/X_GL_DistributionLine.java diff --git a/dbPort/src/org/compiere/model/X_GL_Fund.java b/base/src/org/compiere/model/X_GL_Fund.java similarity index 100% rename from dbPort/src/org/compiere/model/X_GL_Fund.java rename to base/src/org/compiere/model/X_GL_Fund.java diff --git a/dbPort/src/org/compiere/model/X_GL_FundRestriction.java b/base/src/org/compiere/model/X_GL_FundRestriction.java similarity index 100% rename from dbPort/src/org/compiere/model/X_GL_FundRestriction.java rename to base/src/org/compiere/model/X_GL_FundRestriction.java diff --git a/dbPort/src/org/compiere/model/X_GL_Journal.java b/base/src/org/compiere/model/X_GL_Journal.java similarity index 100% rename from dbPort/src/org/compiere/model/X_GL_Journal.java rename to base/src/org/compiere/model/X_GL_Journal.java diff --git a/dbPort/src/org/compiere/model/X_GL_JournalBatch.java b/base/src/org/compiere/model/X_GL_JournalBatch.java similarity index 100% rename from dbPort/src/org/compiere/model/X_GL_JournalBatch.java rename to base/src/org/compiere/model/X_GL_JournalBatch.java diff --git a/dbPort/src/org/compiere/model/X_GL_JournalLine.java b/base/src/org/compiere/model/X_GL_JournalLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_GL_JournalLine.java rename to base/src/org/compiere/model/X_GL_JournalLine.java diff --git a/dbPort/src/org/compiere/model/X_I_BPartner.java b/base/src/org/compiere/model/X_I_BPartner.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_BPartner.java rename to base/src/org/compiere/model/X_I_BPartner.java diff --git a/dbPort/src/org/compiere/model/X_I_BankStatement.java b/base/src/org/compiere/model/X_I_BankStatement.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_BankStatement.java rename to base/src/org/compiere/model/X_I_BankStatement.java diff --git a/dbPort/src/org/compiere/model/X_I_Conversion_Rate.java b/base/src/org/compiere/model/X_I_Conversion_Rate.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_Conversion_Rate.java rename to base/src/org/compiere/model/X_I_Conversion_Rate.java diff --git a/dbPort/src/org/compiere/model/X_I_ElementValue.java b/base/src/org/compiere/model/X_I_ElementValue.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_ElementValue.java rename to base/src/org/compiere/model/X_I_ElementValue.java diff --git a/dbPort/src/org/compiere/model/X_I_GLJournal.java b/base/src/org/compiere/model/X_I_GLJournal.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_GLJournal.java rename to base/src/org/compiere/model/X_I_GLJournal.java diff --git a/dbPort/src/org/compiere/model/X_I_InOutLineConfirm.java b/base/src/org/compiere/model/X_I_InOutLineConfirm.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_InOutLineConfirm.java rename to base/src/org/compiere/model/X_I_InOutLineConfirm.java diff --git a/dbPort/src/org/compiere/model/X_I_Inventory.java b/base/src/org/compiere/model/X_I_Inventory.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_Inventory.java rename to base/src/org/compiere/model/X_I_Inventory.java diff --git a/dbPort/src/org/compiere/model/X_I_Invoice.java b/base/src/org/compiere/model/X_I_Invoice.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_Invoice.java rename to base/src/org/compiere/model/X_I_Invoice.java diff --git a/dbPort/src/org/compiere/model/X_I_Order.java b/base/src/org/compiere/model/X_I_Order.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_Order.java rename to base/src/org/compiere/model/X_I_Order.java diff --git a/dbPort/src/org/compiere/model/X_I_Payment.java b/base/src/org/compiere/model/X_I_Payment.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_Payment.java rename to base/src/org/compiere/model/X_I_Payment.java diff --git a/dbPort/src/org/compiere/model/X_I_Product.java b/base/src/org/compiere/model/X_I_Product.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_Product.java rename to base/src/org/compiere/model/X_I_Product.java diff --git a/dbPort/src/org/compiere/model/X_I_ReportLine.java b/base/src/org/compiere/model/X_I_ReportLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_I_ReportLine.java rename to base/src/org/compiere/model/X_I_ReportLine.java diff --git a/dbPort/src/org/compiere/model/X_K_Category.java b/base/src/org/compiere/model/X_K_Category.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_Category.java rename to base/src/org/compiere/model/X_K_Category.java diff --git a/dbPort/src/org/compiere/model/X_K_CategoryValue.java b/base/src/org/compiere/model/X_K_CategoryValue.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_CategoryValue.java rename to base/src/org/compiere/model/X_K_CategoryValue.java diff --git a/dbPort/src/org/compiere/model/X_K_Comment.java b/base/src/org/compiere/model/X_K_Comment.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_Comment.java rename to base/src/org/compiere/model/X_K_Comment.java diff --git a/dbPort/src/org/compiere/model/X_K_Entry.java b/base/src/org/compiere/model/X_K_Entry.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_Entry.java rename to base/src/org/compiere/model/X_K_Entry.java diff --git a/dbPort/src/org/compiere/model/X_K_EntryCategory.java b/base/src/org/compiere/model/X_K_EntryCategory.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_EntryCategory.java rename to base/src/org/compiere/model/X_K_EntryCategory.java diff --git a/dbPort/src/org/compiere/model/X_K_EntryRelated.java b/base/src/org/compiere/model/X_K_EntryRelated.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_EntryRelated.java rename to base/src/org/compiere/model/X_K_EntryRelated.java diff --git a/dbPort/src/org/compiere/model/X_K_Index.java b/base/src/org/compiere/model/X_K_Index.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_Index.java rename to base/src/org/compiere/model/X_K_Index.java diff --git a/dbPort/src/org/compiere/model/X_K_IndexLog.java b/base/src/org/compiere/model/X_K_IndexLog.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_IndexLog.java rename to base/src/org/compiere/model/X_K_IndexLog.java diff --git a/dbPort/src/org/compiere/model/X_K_IndexStop.java b/base/src/org/compiere/model/X_K_IndexStop.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_IndexStop.java rename to base/src/org/compiere/model/X_K_IndexStop.java diff --git a/dbPort/src/org/compiere/model/X_K_Source.java b/base/src/org/compiere/model/X_K_Source.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_Source.java rename to base/src/org/compiere/model/X_K_Source.java diff --git a/dbPort/src/org/compiere/model/X_K_Synonym.java b/base/src/org/compiere/model/X_K_Synonym.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_Synonym.java rename to base/src/org/compiere/model/X_K_Synonym.java diff --git a/dbPort/src/org/compiere/model/X_K_Topic.java b/base/src/org/compiere/model/X_K_Topic.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_Topic.java rename to base/src/org/compiere/model/X_K_Topic.java diff --git a/dbPort/src/org/compiere/model/X_K_Type.java b/base/src/org/compiere/model/X_K_Type.java similarity index 100% rename from dbPort/src/org/compiere/model/X_K_Type.java rename to base/src/org/compiere/model/X_K_Type.java diff --git a/dbPort/src/org/compiere/model/X_M_Attribute.java b/base/src/org/compiere/model/X_M_Attribute.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Attribute.java rename to base/src/org/compiere/model/X_M_Attribute.java diff --git a/dbPort/src/org/compiere/model/X_M_AttributeInstance.java b/base/src/org/compiere/model/X_M_AttributeInstance.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_AttributeInstance.java rename to base/src/org/compiere/model/X_M_AttributeInstance.java diff --git a/dbPort/src/org/compiere/model/X_M_AttributeSearch.java b/base/src/org/compiere/model/X_M_AttributeSearch.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_AttributeSearch.java rename to base/src/org/compiere/model/X_M_AttributeSearch.java diff --git a/dbPort/src/org/compiere/model/X_M_AttributeSet.java b/base/src/org/compiere/model/X_M_AttributeSet.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_AttributeSet.java rename to base/src/org/compiere/model/X_M_AttributeSet.java diff --git a/dbPort/src/org/compiere/model/X_M_AttributeSetExclude.java b/base/src/org/compiere/model/X_M_AttributeSetExclude.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_AttributeSetExclude.java rename to base/src/org/compiere/model/X_M_AttributeSetExclude.java diff --git a/dbPort/src/org/compiere/model/X_M_AttributeSetInstance.java b/base/src/org/compiere/model/X_M_AttributeSetInstance.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_AttributeSetInstance.java rename to base/src/org/compiere/model/X_M_AttributeSetInstance.java diff --git a/dbPort/src/org/compiere/model/X_M_AttributeUse.java b/base/src/org/compiere/model/X_M_AttributeUse.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_AttributeUse.java rename to base/src/org/compiere/model/X_M_AttributeUse.java diff --git a/dbPort/src/org/compiere/model/X_M_AttributeValue.java b/base/src/org/compiere/model/X_M_AttributeValue.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_AttributeValue.java rename to base/src/org/compiere/model/X_M_AttributeValue.java diff --git a/dbPort/src/org/compiere/model/X_M_BOM.java b/base/src/org/compiere/model/X_M_BOM.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_BOM.java rename to base/src/org/compiere/model/X_M_BOM.java diff --git a/dbPort/src/org/compiere/model/X_M_BOMAlternative.java b/base/src/org/compiere/model/X_M_BOMAlternative.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_BOMAlternative.java rename to base/src/org/compiere/model/X_M_BOMAlternative.java diff --git a/dbPort/src/org/compiere/model/X_M_BOMProduct.java b/base/src/org/compiere/model/X_M_BOMProduct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_BOMProduct.java rename to base/src/org/compiere/model/X_M_BOMProduct.java diff --git a/dbPort/src/org/compiere/model/X_M_ChangeNotice.java b/base/src/org/compiere/model/X_M_ChangeNotice.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_ChangeNotice.java rename to base/src/org/compiere/model/X_M_ChangeNotice.java diff --git a/dbPort/src/org/compiere/model/X_M_ChangeRequest.java b/base/src/org/compiere/model/X_M_ChangeRequest.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_ChangeRequest.java rename to base/src/org/compiere/model/X_M_ChangeRequest.java diff --git a/dbPort/src/org/compiere/model/X_M_Cost.java b/base/src/org/compiere/model/X_M_Cost.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Cost.java rename to base/src/org/compiere/model/X_M_Cost.java diff --git a/dbPort/src/org/compiere/model/X_M_CostDetail.java b/base/src/org/compiere/model/X_M_CostDetail.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_CostDetail.java rename to base/src/org/compiere/model/X_M_CostDetail.java diff --git a/dbPort/src/org/compiere/model/X_M_CostElement.java b/base/src/org/compiere/model/X_M_CostElement.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_CostElement.java rename to base/src/org/compiere/model/X_M_CostElement.java diff --git a/dbPort/src/org/compiere/model/X_M_CostQueue.java b/base/src/org/compiere/model/X_M_CostQueue.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_CostQueue.java rename to base/src/org/compiere/model/X_M_CostQueue.java diff --git a/dbPort/src/org/compiere/model/X_M_CostType.java b/base/src/org/compiere/model/X_M_CostType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_CostType.java rename to base/src/org/compiere/model/X_M_CostType.java diff --git a/dbPort/src/org/compiere/model/X_M_Demand.java b/base/src/org/compiere/model/X_M_Demand.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Demand.java rename to base/src/org/compiere/model/X_M_Demand.java diff --git a/dbPort/src/org/compiere/model/X_M_DemandDetail.java b/base/src/org/compiere/model/X_M_DemandDetail.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_DemandDetail.java rename to base/src/org/compiere/model/X_M_DemandDetail.java diff --git a/dbPort/src/org/compiere/model/X_M_DemandLine.java b/base/src/org/compiere/model/X_M_DemandLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_DemandLine.java rename to base/src/org/compiere/model/X_M_DemandLine.java diff --git a/dbPort/src/org/compiere/model/X_M_DiscountSchema.java b/base/src/org/compiere/model/X_M_DiscountSchema.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_DiscountSchema.java rename to base/src/org/compiere/model/X_M_DiscountSchema.java diff --git a/dbPort/src/org/compiere/model/X_M_DiscountSchemaBreak.java b/base/src/org/compiere/model/X_M_DiscountSchemaBreak.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_DiscountSchemaBreak.java rename to base/src/org/compiere/model/X_M_DiscountSchemaBreak.java diff --git a/dbPort/src/org/compiere/model/X_M_DiscountSchemaLine.java b/base/src/org/compiere/model/X_M_DiscountSchemaLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_DiscountSchemaLine.java rename to base/src/org/compiere/model/X_M_DiscountSchemaLine.java diff --git a/dbPort/src/org/compiere/model/X_M_DistributionList.java b/base/src/org/compiere/model/X_M_DistributionList.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_DistributionList.java rename to base/src/org/compiere/model/X_M_DistributionList.java diff --git a/dbPort/src/org/compiere/model/X_M_DistributionListLine.java b/base/src/org/compiere/model/X_M_DistributionListLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_DistributionListLine.java rename to base/src/org/compiere/model/X_M_DistributionListLine.java diff --git a/dbPort/src/org/compiere/model/X_M_DistributionRun.java b/base/src/org/compiere/model/X_M_DistributionRun.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_DistributionRun.java rename to base/src/org/compiere/model/X_M_DistributionRun.java diff --git a/dbPort/src/org/compiere/model/X_M_DistributionRunLine.java b/base/src/org/compiere/model/X_M_DistributionRunLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_DistributionRunLine.java rename to base/src/org/compiere/model/X_M_DistributionRunLine.java diff --git a/dbPort/src/org/compiere/model/X_M_EDI.java b/base/src/org/compiere/model/X_M_EDI.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_EDI.java rename to base/src/org/compiere/model/X_M_EDI.java diff --git a/dbPort/src/org/compiere/model/X_M_EDI_Info.java b/base/src/org/compiere/model/X_M_EDI_Info.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_EDI_Info.java rename to base/src/org/compiere/model/X_M_EDI_Info.java diff --git a/dbPort/src/org/compiere/model/X_M_Forecast.java b/base/src/org/compiere/model/X_M_Forecast.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Forecast.java rename to base/src/org/compiere/model/X_M_Forecast.java diff --git a/dbPort/src/org/compiere/model/X_M_ForecastLine.java b/base/src/org/compiere/model/X_M_ForecastLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_ForecastLine.java rename to base/src/org/compiere/model/X_M_ForecastLine.java diff --git a/dbPort/src/org/compiere/model/X_M_Freight.java b/base/src/org/compiere/model/X_M_Freight.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Freight.java rename to base/src/org/compiere/model/X_M_Freight.java diff --git a/dbPort/src/org/compiere/model/X_M_FreightCategory.java b/base/src/org/compiere/model/X_M_FreightCategory.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_FreightCategory.java rename to base/src/org/compiere/model/X_M_FreightCategory.java diff --git a/dbPort/src/org/compiere/model/X_M_InOut.java b/base/src/org/compiere/model/X_M_InOut.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_InOut.java rename to base/src/org/compiere/model/X_M_InOut.java diff --git a/dbPort/src/org/compiere/model/X_M_InOutConfirm.java b/base/src/org/compiere/model/X_M_InOutConfirm.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_InOutConfirm.java rename to base/src/org/compiere/model/X_M_InOutConfirm.java diff --git a/dbPort/src/org/compiere/model/X_M_InOutLine.java b/base/src/org/compiere/model/X_M_InOutLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_InOutLine.java rename to base/src/org/compiere/model/X_M_InOutLine.java diff --git a/dbPort/src/org/compiere/model/X_M_InOutLineConfirm.java b/base/src/org/compiere/model/X_M_InOutLineConfirm.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_InOutLineConfirm.java rename to base/src/org/compiere/model/X_M_InOutLineConfirm.java diff --git a/dbPort/src/org/compiere/model/X_M_InOutLineMA.java b/base/src/org/compiere/model/X_M_InOutLineMA.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_InOutLineMA.java rename to base/src/org/compiere/model/X_M_InOutLineMA.java diff --git a/dbPort/src/org/compiere/model/X_M_Inventory.java b/base/src/org/compiere/model/X_M_Inventory.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Inventory.java rename to base/src/org/compiere/model/X_M_Inventory.java diff --git a/dbPort/src/org/compiere/model/X_M_InventoryLine.java b/base/src/org/compiere/model/X_M_InventoryLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_InventoryLine.java rename to base/src/org/compiere/model/X_M_InventoryLine.java diff --git a/dbPort/src/org/compiere/model/X_M_InventoryLineMA.java b/base/src/org/compiere/model/X_M_InventoryLineMA.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_InventoryLineMA.java rename to base/src/org/compiere/model/X_M_InventoryLineMA.java diff --git a/dbPort/src/org/compiere/model/X_M_Locator.java b/base/src/org/compiere/model/X_M_Locator.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Locator.java rename to base/src/org/compiere/model/X_M_Locator.java diff --git a/dbPort/src/org/compiere/model/X_M_Lot.java b/base/src/org/compiere/model/X_M_Lot.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Lot.java rename to base/src/org/compiere/model/X_M_Lot.java diff --git a/dbPort/src/org/compiere/model/X_M_LotCtl.java b/base/src/org/compiere/model/X_M_LotCtl.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_LotCtl.java rename to base/src/org/compiere/model/X_M_LotCtl.java diff --git a/dbPort/src/org/compiere/model/X_M_LotCtlExclude.java b/base/src/org/compiere/model/X_M_LotCtlExclude.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_LotCtlExclude.java rename to base/src/org/compiere/model/X_M_LotCtlExclude.java diff --git a/dbPort/src/org/compiere/model/X_M_MatchInv.java b/base/src/org/compiere/model/X_M_MatchInv.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_MatchInv.java rename to base/src/org/compiere/model/X_M_MatchInv.java diff --git a/dbPort/src/org/compiere/model/X_M_MatchPO.java b/base/src/org/compiere/model/X_M_MatchPO.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_MatchPO.java rename to base/src/org/compiere/model/X_M_MatchPO.java diff --git a/dbPort/src/org/compiere/model/X_M_Movement.java b/base/src/org/compiere/model/X_M_Movement.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Movement.java rename to base/src/org/compiere/model/X_M_Movement.java diff --git a/dbPort/src/org/compiere/model/X_M_MovementConfirm.java b/base/src/org/compiere/model/X_M_MovementConfirm.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_MovementConfirm.java rename to base/src/org/compiere/model/X_M_MovementConfirm.java diff --git a/dbPort/src/org/compiere/model/X_M_MovementLine.java b/base/src/org/compiere/model/X_M_MovementLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_MovementLine.java rename to base/src/org/compiere/model/X_M_MovementLine.java diff --git a/dbPort/src/org/compiere/model/X_M_MovementLineConfirm.java b/base/src/org/compiere/model/X_M_MovementLineConfirm.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_MovementLineConfirm.java rename to base/src/org/compiere/model/X_M_MovementLineConfirm.java diff --git a/dbPort/src/org/compiere/model/X_M_MovementLineMA.java b/base/src/org/compiere/model/X_M_MovementLineMA.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_MovementLineMA.java rename to base/src/org/compiere/model/X_M_MovementLineMA.java diff --git a/dbPort/src/org/compiere/model/X_M_OperationResource.java b/base/src/org/compiere/model/X_M_OperationResource.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_OperationResource.java rename to base/src/org/compiere/model/X_M_OperationResource.java diff --git a/dbPort/src/org/compiere/model/X_M_Package.java b/base/src/org/compiere/model/X_M_Package.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Package.java rename to base/src/org/compiere/model/X_M_Package.java diff --git a/dbPort/src/org/compiere/model/X_M_PackageLine.java b/base/src/org/compiere/model/X_M_PackageLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_PackageLine.java rename to base/src/org/compiere/model/X_M_PackageLine.java diff --git a/dbPort/src/org/compiere/model/X_M_PerpetualInv.java b/base/src/org/compiere/model/X_M_PerpetualInv.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_PerpetualInv.java rename to base/src/org/compiere/model/X_M_PerpetualInv.java diff --git a/dbPort/src/org/compiere/model/X_M_PriceList.java b/base/src/org/compiere/model/X_M_PriceList.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_PriceList.java rename to base/src/org/compiere/model/X_M_PriceList.java diff --git a/dbPort/src/org/compiere/model/X_M_PriceList_Version.java b/base/src/org/compiere/model/X_M_PriceList_Version.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_PriceList_Version.java rename to base/src/org/compiere/model/X_M_PriceList_Version.java diff --git a/dbPort/src/org/compiere/model/X_M_Product.java b/base/src/org/compiere/model/X_M_Product.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Product.java rename to base/src/org/compiere/model/X_M_Product.java diff --git a/dbPort/src/org/compiere/model/X_M_ProductDownload.java b/base/src/org/compiere/model/X_M_ProductDownload.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_ProductDownload.java rename to base/src/org/compiere/model/X_M_ProductDownload.java diff --git a/dbPort/src/org/compiere/model/X_M_ProductOperation.java b/base/src/org/compiere/model/X_M_ProductOperation.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_ProductOperation.java rename to base/src/org/compiere/model/X_M_ProductOperation.java diff --git a/dbPort/src/org/compiere/model/X_M_ProductPrice.java b/base/src/org/compiere/model/X_M_ProductPrice.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_ProductPrice.java rename to base/src/org/compiere/model/X_M_ProductPrice.java diff --git a/dbPort/src/org/compiere/model/X_M_Product_Acct.java b/base/src/org/compiere/model/X_M_Product_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Product_Acct.java rename to base/src/org/compiere/model/X_M_Product_Acct.java diff --git a/dbPort/src/org/compiere/model/X_M_Product_BOM.java b/base/src/org/compiere/model/X_M_Product_BOM.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Product_BOM.java rename to base/src/org/compiere/model/X_M_Product_BOM.java diff --git a/dbPort/src/org/compiere/model/X_M_Product_Category.java b/base/src/org/compiere/model/X_M_Product_Category.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Product_Category.java rename to base/src/org/compiere/model/X_M_Product_Category.java diff --git a/dbPort/src/org/compiere/model/X_M_Product_Category_Acct.java b/base/src/org/compiere/model/X_M_Product_Category_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Product_Category_Acct.java rename to base/src/org/compiere/model/X_M_Product_Category_Acct.java diff --git a/dbPort/src/org/compiere/model/X_M_Product_Costing.java b/base/src/org/compiere/model/X_M_Product_Costing.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Product_Costing.java rename to base/src/org/compiere/model/X_M_Product_Costing.java diff --git a/dbPort/src/org/compiere/model/X_M_Product_PO.java b/base/src/org/compiere/model/X_M_Product_PO.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Product_PO.java rename to base/src/org/compiere/model/X_M_Product_PO.java diff --git a/dbPort/src/org/compiere/model/X_M_Production.java b/base/src/org/compiere/model/X_M_Production.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Production.java rename to base/src/org/compiere/model/X_M_Production.java diff --git a/dbPort/src/org/compiere/model/X_M_ProductionLine.java b/base/src/org/compiere/model/X_M_ProductionLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_ProductionLine.java rename to base/src/org/compiere/model/X_M_ProductionLine.java diff --git a/dbPort/src/org/compiere/model/X_M_ProductionLineMA.java b/base/src/org/compiere/model/X_M_ProductionLineMA.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_ProductionLineMA.java rename to base/src/org/compiere/model/X_M_ProductionLineMA.java diff --git a/dbPort/src/org/compiere/model/X_M_ProductionPlan.java b/base/src/org/compiere/model/X_M_ProductionPlan.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_ProductionPlan.java rename to base/src/org/compiere/model/X_M_ProductionPlan.java diff --git a/dbPort/src/org/compiere/model/X_M_RMA.java b/base/src/org/compiere/model/X_M_RMA.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_RMA.java rename to base/src/org/compiere/model/X_M_RMA.java diff --git a/dbPort/src/org/compiere/model/X_M_RMALine.java b/base/src/org/compiere/model/X_M_RMALine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_RMALine.java rename to base/src/org/compiere/model/X_M_RMALine.java diff --git a/dbPort/src/org/compiere/model/X_M_RMAType.java b/base/src/org/compiere/model/X_M_RMAType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_RMAType.java rename to base/src/org/compiere/model/X_M_RMAType.java diff --git a/dbPort/src/org/compiere/model/X_M_RelatedProduct.java b/base/src/org/compiere/model/X_M_RelatedProduct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_RelatedProduct.java rename to base/src/org/compiere/model/X_M_RelatedProduct.java diff --git a/dbPort/src/org/compiere/model/X_M_Replenish.java b/base/src/org/compiere/model/X_M_Replenish.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Replenish.java rename to base/src/org/compiere/model/X_M_Replenish.java diff --git a/dbPort/src/org/compiere/model/X_M_Requisition.java b/base/src/org/compiere/model/X_M_Requisition.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Requisition.java rename to base/src/org/compiere/model/X_M_Requisition.java diff --git a/dbPort/src/org/compiere/model/X_M_RequisitionLine.java b/base/src/org/compiere/model/X_M_RequisitionLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_RequisitionLine.java rename to base/src/org/compiere/model/X_M_RequisitionLine.java diff --git a/dbPort/src/org/compiere/model/X_M_SerNoCtl.java b/base/src/org/compiere/model/X_M_SerNoCtl.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_SerNoCtl.java rename to base/src/org/compiere/model/X_M_SerNoCtl.java diff --git a/dbPort/src/org/compiere/model/X_M_SerNoCtlExclude.java b/base/src/org/compiere/model/X_M_SerNoCtlExclude.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_SerNoCtlExclude.java rename to base/src/org/compiere/model/X_M_SerNoCtlExclude.java diff --git a/dbPort/src/org/compiere/model/X_M_Shipper.java b/base/src/org/compiere/model/X_M_Shipper.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Shipper.java rename to base/src/org/compiere/model/X_M_Shipper.java diff --git a/dbPort/src/org/compiere/model/X_M_Storage.java b/base/src/org/compiere/model/X_M_Storage.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Storage.java rename to base/src/org/compiere/model/X_M_Storage.java diff --git a/dbPort/src/org/compiere/model/X_M_Substitute.java b/base/src/org/compiere/model/X_M_Substitute.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Substitute.java rename to base/src/org/compiere/model/X_M_Substitute.java diff --git a/dbPort/src/org/compiere/model/X_M_Transaction.java b/base/src/org/compiere/model/X_M_Transaction.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Transaction.java rename to base/src/org/compiere/model/X_M_Transaction.java diff --git a/dbPort/src/org/compiere/model/X_M_TransactionAllocation.java b/base/src/org/compiere/model/X_M_TransactionAllocation.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_TransactionAllocation.java rename to base/src/org/compiere/model/X_M_TransactionAllocation.java diff --git a/dbPort/src/org/compiere/model/X_M_Warehouse.java b/base/src/org/compiere/model/X_M_Warehouse.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Warehouse.java rename to base/src/org/compiere/model/X_M_Warehouse.java diff --git a/dbPort/src/org/compiere/model/X_M_Warehouse_Acct.java b/base/src/org/compiere/model/X_M_Warehouse_Acct.java similarity index 100% rename from dbPort/src/org/compiere/model/X_M_Warehouse_Acct.java rename to base/src/org/compiere/model/X_M_Warehouse_Acct.java diff --git a/dbPort/src/org/compiere/model/X_PA_Achievement.java b/base/src/org/compiere/model/X_PA_Achievement.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_Achievement.java rename to base/src/org/compiere/model/X_PA_Achievement.java diff --git a/dbPort/src/org/compiere/model/X_PA_Benchmark.java b/base/src/org/compiere/model/X_PA_Benchmark.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_Benchmark.java rename to base/src/org/compiere/model/X_PA_Benchmark.java diff --git a/dbPort/src/org/compiere/model/X_PA_BenchmarkData.java b/base/src/org/compiere/model/X_PA_BenchmarkData.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_BenchmarkData.java rename to base/src/org/compiere/model/X_PA_BenchmarkData.java diff --git a/dbPort/src/org/compiere/model/X_PA_ColorSchema.java b/base/src/org/compiere/model/X_PA_ColorSchema.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_ColorSchema.java rename to base/src/org/compiere/model/X_PA_ColorSchema.java diff --git a/dbPort/src/org/compiere/model/X_PA_Goal.java b/base/src/org/compiere/model/X_PA_Goal.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_Goal.java rename to base/src/org/compiere/model/X_PA_Goal.java diff --git a/dbPort/src/org/compiere/model/X_PA_GoalRestriction.java b/base/src/org/compiere/model/X_PA_GoalRestriction.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_GoalRestriction.java rename to base/src/org/compiere/model/X_PA_GoalRestriction.java diff --git a/dbPort/src/org/compiere/model/X_PA_Hierarchy.java b/base/src/org/compiere/model/X_PA_Hierarchy.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_Hierarchy.java rename to base/src/org/compiere/model/X_PA_Hierarchy.java diff --git a/dbPort/src/org/compiere/model/X_PA_Measure.java b/base/src/org/compiere/model/X_PA_Measure.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_Measure.java rename to base/src/org/compiere/model/X_PA_Measure.java diff --git a/dbPort/src/org/compiere/model/X_PA_MeasureCalc.java b/base/src/org/compiere/model/X_PA_MeasureCalc.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_MeasureCalc.java rename to base/src/org/compiere/model/X_PA_MeasureCalc.java diff --git a/dbPort/src/org/compiere/model/X_PA_Ratio.java b/base/src/org/compiere/model/X_PA_Ratio.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_Ratio.java rename to base/src/org/compiere/model/X_PA_Ratio.java diff --git a/dbPort/src/org/compiere/model/X_PA_RatioElement.java b/base/src/org/compiere/model/X_PA_RatioElement.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_RatioElement.java rename to base/src/org/compiere/model/X_PA_RatioElement.java diff --git a/dbPort/src/org/compiere/model/X_PA_Report.java b/base/src/org/compiere/model/X_PA_Report.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_Report.java rename to base/src/org/compiere/model/X_PA_Report.java diff --git a/dbPort/src/org/compiere/model/X_PA_ReportColumn.java b/base/src/org/compiere/model/X_PA_ReportColumn.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_ReportColumn.java rename to base/src/org/compiere/model/X_PA_ReportColumn.java diff --git a/dbPort/src/org/compiere/model/X_PA_ReportColumnSet.java b/base/src/org/compiere/model/X_PA_ReportColumnSet.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_ReportColumnSet.java rename to base/src/org/compiere/model/X_PA_ReportColumnSet.java diff --git a/dbPort/src/org/compiere/model/X_PA_ReportLine.java b/base/src/org/compiere/model/X_PA_ReportLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_ReportLine.java rename to base/src/org/compiere/model/X_PA_ReportLine.java diff --git a/dbPort/src/org/compiere/model/X_PA_ReportLineSet.java b/base/src/org/compiere/model/X_PA_ReportLineSet.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_ReportLineSet.java rename to base/src/org/compiere/model/X_PA_ReportLineSet.java diff --git a/dbPort/src/org/compiere/model/X_PA_ReportSource.java b/base/src/org/compiere/model/X_PA_ReportSource.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_ReportSource.java rename to base/src/org/compiere/model/X_PA_ReportSource.java diff --git a/dbPort/src/org/compiere/model/X_PA_SLA_Criteria.java b/base/src/org/compiere/model/X_PA_SLA_Criteria.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_SLA_Criteria.java rename to base/src/org/compiere/model/X_PA_SLA_Criteria.java diff --git a/dbPort/src/org/compiere/model/X_PA_SLA_Goal.java b/base/src/org/compiere/model/X_PA_SLA_Goal.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_SLA_Goal.java rename to base/src/org/compiere/model/X_PA_SLA_Goal.java diff --git a/dbPort/src/org/compiere/model/X_PA_SLA_Measure.java b/base/src/org/compiere/model/X_PA_SLA_Measure.java similarity index 100% rename from dbPort/src/org/compiere/model/X_PA_SLA_Measure.java rename to base/src/org/compiere/model/X_PA_SLA_Measure.java diff --git a/dbPort/src/org/compiere/model/X_RV_BPartner.java b/base/src/org/compiere/model/X_RV_BPartner.java similarity index 100% rename from dbPort/src/org/compiere/model/X_RV_BPartner.java rename to base/src/org/compiere/model/X_RV_BPartner.java diff --git a/dbPort/src/org/compiere/model/X_RV_WarehousePrice.java b/base/src/org/compiere/model/X_RV_WarehousePrice.java similarity index 100% rename from dbPort/src/org/compiere/model/X_RV_WarehousePrice.java rename to base/src/org/compiere/model/X_RV_WarehousePrice.java diff --git a/dbPort/src/org/compiere/model/X_R_Category.java b/base/src/org/compiere/model/X_R_Category.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_Category.java rename to base/src/org/compiere/model/X_R_Category.java diff --git a/dbPort/src/org/compiere/model/X_R_CategoryUpdates.java b/base/src/org/compiere/model/X_R_CategoryUpdates.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_CategoryUpdates.java rename to base/src/org/compiere/model/X_R_CategoryUpdates.java diff --git a/dbPort/src/org/compiere/model/X_R_ContactInterest.java b/base/src/org/compiere/model/X_R_ContactInterest.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_ContactInterest.java rename to base/src/org/compiere/model/X_R_ContactInterest.java diff --git a/dbPort/src/org/compiere/model/X_R_Group.java b/base/src/org/compiere/model/X_R_Group.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_Group.java rename to base/src/org/compiere/model/X_R_Group.java diff --git a/dbPort/src/org/compiere/model/X_R_GroupUpdates.java b/base/src/org/compiere/model/X_R_GroupUpdates.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_GroupUpdates.java rename to base/src/org/compiere/model/X_R_GroupUpdates.java diff --git a/dbPort/src/org/compiere/model/X_R_InterestArea.java b/base/src/org/compiere/model/X_R_InterestArea.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_InterestArea.java rename to base/src/org/compiere/model/X_R_InterestArea.java diff --git a/dbPort/src/org/compiere/model/X_R_IssueKnown.java b/base/src/org/compiere/model/X_R_IssueKnown.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_IssueKnown.java rename to base/src/org/compiere/model/X_R_IssueKnown.java diff --git a/dbPort/src/org/compiere/model/X_R_IssueProject.java b/base/src/org/compiere/model/X_R_IssueProject.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_IssueProject.java rename to base/src/org/compiere/model/X_R_IssueProject.java diff --git a/dbPort/src/org/compiere/model/X_R_IssueRecommendation.java b/base/src/org/compiere/model/X_R_IssueRecommendation.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_IssueRecommendation.java rename to base/src/org/compiere/model/X_R_IssueRecommendation.java diff --git a/dbPort/src/org/compiere/model/X_R_IssueStatus.java b/base/src/org/compiere/model/X_R_IssueStatus.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_IssueStatus.java rename to base/src/org/compiere/model/X_R_IssueStatus.java diff --git a/dbPort/src/org/compiere/model/X_R_IssueSystem.java b/base/src/org/compiere/model/X_R_IssueSystem.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_IssueSystem.java rename to base/src/org/compiere/model/X_R_IssueSystem.java diff --git a/dbPort/src/org/compiere/model/X_R_IssueUser.java b/base/src/org/compiere/model/X_R_IssueUser.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_IssueUser.java rename to base/src/org/compiere/model/X_R_IssueUser.java diff --git a/dbPort/src/org/compiere/model/X_R_MailText.java b/base/src/org/compiere/model/X_R_MailText.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_MailText.java rename to base/src/org/compiere/model/X_R_MailText.java diff --git a/dbPort/src/org/compiere/model/X_R_Request.java b/base/src/org/compiere/model/X_R_Request.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_Request.java rename to base/src/org/compiere/model/X_R_Request.java diff --git a/dbPort/src/org/compiere/model/X_R_RequestAction.java b/base/src/org/compiere/model/X_R_RequestAction.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_RequestAction.java rename to base/src/org/compiere/model/X_R_RequestAction.java diff --git a/dbPort/src/org/compiere/model/X_R_RequestProcessor.java b/base/src/org/compiere/model/X_R_RequestProcessor.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_RequestProcessor.java rename to base/src/org/compiere/model/X_R_RequestProcessor.java diff --git a/dbPort/src/org/compiere/model/X_R_RequestProcessorLog.java b/base/src/org/compiere/model/X_R_RequestProcessorLog.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_RequestProcessorLog.java rename to base/src/org/compiere/model/X_R_RequestProcessorLog.java diff --git a/dbPort/src/org/compiere/model/X_R_RequestProcessor_Route.java b/base/src/org/compiere/model/X_R_RequestProcessor_Route.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_RequestProcessor_Route.java rename to base/src/org/compiere/model/X_R_RequestProcessor_Route.java diff --git a/dbPort/src/org/compiere/model/X_R_RequestType.java b/base/src/org/compiere/model/X_R_RequestType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_RequestType.java rename to base/src/org/compiere/model/X_R_RequestType.java diff --git a/dbPort/src/org/compiere/model/X_R_RequestTypeUpdates.java b/base/src/org/compiere/model/X_R_RequestTypeUpdates.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_RequestTypeUpdates.java rename to base/src/org/compiere/model/X_R_RequestTypeUpdates.java diff --git a/dbPort/src/org/compiere/model/X_R_RequestUpdate.java b/base/src/org/compiere/model/X_R_RequestUpdate.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_RequestUpdate.java rename to base/src/org/compiere/model/X_R_RequestUpdate.java diff --git a/dbPort/src/org/compiere/model/X_R_RequestUpdates.java b/base/src/org/compiere/model/X_R_RequestUpdates.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_RequestUpdates.java rename to base/src/org/compiere/model/X_R_RequestUpdates.java diff --git a/dbPort/src/org/compiere/model/X_R_Resolution.java b/base/src/org/compiere/model/X_R_Resolution.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_Resolution.java rename to base/src/org/compiere/model/X_R_Resolution.java diff --git a/dbPort/src/org/compiere/model/X_R_StandardResponse.java b/base/src/org/compiere/model/X_R_StandardResponse.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_StandardResponse.java rename to base/src/org/compiere/model/X_R_StandardResponse.java diff --git a/dbPort/src/org/compiere/model/X_R_Status.java b/base/src/org/compiere/model/X_R_Status.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_Status.java rename to base/src/org/compiere/model/X_R_Status.java diff --git a/dbPort/src/org/compiere/model/X_R_StatusCategory.java b/base/src/org/compiere/model/X_R_StatusCategory.java similarity index 100% rename from dbPort/src/org/compiere/model/X_R_StatusCategory.java rename to base/src/org/compiere/model/X_R_StatusCategory.java diff --git a/dbPort/src/org/compiere/model/X_S_ExpenseType.java b/base/src/org/compiere/model/X_S_ExpenseType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_S_ExpenseType.java rename to base/src/org/compiere/model/X_S_ExpenseType.java diff --git a/dbPort/src/org/compiere/model/X_S_Resource.java b/base/src/org/compiere/model/X_S_Resource.java similarity index 100% rename from dbPort/src/org/compiere/model/X_S_Resource.java rename to base/src/org/compiere/model/X_S_Resource.java diff --git a/dbPort/src/org/compiere/model/X_S_ResourceAssignment.java b/base/src/org/compiere/model/X_S_ResourceAssignment.java similarity index 100% rename from dbPort/src/org/compiere/model/X_S_ResourceAssignment.java rename to base/src/org/compiere/model/X_S_ResourceAssignment.java diff --git a/dbPort/src/org/compiere/model/X_S_ResourceType.java b/base/src/org/compiere/model/X_S_ResourceType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_S_ResourceType.java rename to base/src/org/compiere/model/X_S_ResourceType.java diff --git a/dbPort/src/org/compiere/model/X_S_ResourceUnAvailable.java b/base/src/org/compiere/model/X_S_ResourceUnAvailable.java similarity index 100% rename from dbPort/src/org/compiere/model/X_S_ResourceUnAvailable.java rename to base/src/org/compiere/model/X_S_ResourceUnAvailable.java diff --git a/dbPort/src/org/compiere/model/X_S_TimeExpense.java b/base/src/org/compiere/model/X_S_TimeExpense.java similarity index 100% rename from dbPort/src/org/compiere/model/X_S_TimeExpense.java rename to base/src/org/compiere/model/X_S_TimeExpense.java diff --git a/dbPort/src/org/compiere/model/X_S_TimeExpenseLine.java b/base/src/org/compiere/model/X_S_TimeExpenseLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_S_TimeExpenseLine.java rename to base/src/org/compiere/model/X_S_TimeExpenseLine.java diff --git a/dbPort/src/org/compiere/model/X_S_TimeType.java b/base/src/org/compiere/model/X_S_TimeType.java similarity index 100% rename from dbPort/src/org/compiere/model/X_S_TimeType.java rename to base/src/org/compiere/model/X_S_TimeType.java diff --git a/dbPort/src/org/compiere/model/X_S_Training.java b/base/src/org/compiere/model/X_S_Training.java similarity index 100% rename from dbPort/src/org/compiere/model/X_S_Training.java rename to base/src/org/compiere/model/X_S_Training.java diff --git a/dbPort/src/org/compiere/model/X_S_Training_Class.java b/base/src/org/compiere/model/X_S_Training_Class.java similarity index 100% rename from dbPort/src/org/compiere/model/X_S_Training_Class.java rename to base/src/org/compiere/model/X_S_Training_Class.java diff --git a/dbPort/src/org/compiere/model/X_T_Aging.java b/base/src/org/compiere/model/X_T_Aging.java similarity index 100% rename from dbPort/src/org/compiere/model/X_T_Aging.java rename to base/src/org/compiere/model/X_T_Aging.java diff --git a/dbPort/src/org/compiere/model/X_T_DistributionRunDetail.java b/base/src/org/compiere/model/X_T_DistributionRunDetail.java similarity index 100% rename from dbPort/src/org/compiere/model/X_T_DistributionRunDetail.java rename to base/src/org/compiere/model/X_T_DistributionRunDetail.java diff --git a/dbPort/src/org/compiere/model/X_T_InventoryValue.java b/base/src/org/compiere/model/X_T_InventoryValue.java similarity index 100% rename from dbPort/src/org/compiere/model/X_T_InventoryValue.java rename to base/src/org/compiere/model/X_T_InventoryValue.java diff --git a/dbPort/src/org/compiere/model/X_T_InvoiceGL.java b/base/src/org/compiere/model/X_T_InvoiceGL.java similarity index 100% rename from dbPort/src/org/compiere/model/X_T_InvoiceGL.java rename to base/src/org/compiere/model/X_T_InvoiceGL.java diff --git a/dbPort/src/org/compiere/model/X_T_Replenish.java b/base/src/org/compiere/model/X_T_Replenish.java similarity index 100% rename from dbPort/src/org/compiere/model/X_T_Replenish.java rename to base/src/org/compiere/model/X_T_Replenish.java diff --git a/dbPort/src/org/compiere/model/X_T_Report.java b/base/src/org/compiere/model/X_T_Report.java similarity index 100% rename from dbPort/src/org/compiere/model/X_T_Report.java rename to base/src/org/compiere/model/X_T_Report.java diff --git a/dbPort/src/org/compiere/model/X_T_ReportStatement.java b/base/src/org/compiere/model/X_T_ReportStatement.java similarity index 100% rename from dbPort/src/org/compiere/model/X_T_ReportStatement.java rename to base/src/org/compiere/model/X_T_ReportStatement.java diff --git a/dbPort/src/org/compiere/model/X_T_Transaction.java b/base/src/org/compiere/model/X_T_Transaction.java similarity index 100% rename from dbPort/src/org/compiere/model/X_T_Transaction.java rename to base/src/org/compiere/model/X_T_Transaction.java diff --git a/dbPort/src/org/compiere/model/X_Test.java b/base/src/org/compiere/model/X_Test.java similarity index 100% rename from dbPort/src/org/compiere/model/X_Test.java rename to base/src/org/compiere/model/X_Test.java diff --git a/dbPort/src/org/compiere/model/X_W_Advertisement.java b/base/src/org/compiere/model/X_W_Advertisement.java similarity index 100% rename from dbPort/src/org/compiere/model/X_W_Advertisement.java rename to base/src/org/compiere/model/X_W_Advertisement.java diff --git a/dbPort/src/org/compiere/model/X_W_Basket.java b/base/src/org/compiere/model/X_W_Basket.java similarity index 100% rename from dbPort/src/org/compiere/model/X_W_Basket.java rename to base/src/org/compiere/model/X_W_Basket.java diff --git a/dbPort/src/org/compiere/model/X_W_BasketLine.java b/base/src/org/compiere/model/X_W_BasketLine.java similarity index 100% rename from dbPort/src/org/compiere/model/X_W_BasketLine.java rename to base/src/org/compiere/model/X_W_BasketLine.java diff --git a/dbPort/src/org/compiere/model/X_W_Click.java b/base/src/org/compiere/model/X_W_Click.java similarity index 100% rename from dbPort/src/org/compiere/model/X_W_Click.java rename to base/src/org/compiere/model/X_W_Click.java diff --git a/dbPort/src/org/compiere/model/X_W_ClickCount.java b/base/src/org/compiere/model/X_W_ClickCount.java similarity index 100% rename from dbPort/src/org/compiere/model/X_W_ClickCount.java rename to base/src/org/compiere/model/X_W_ClickCount.java diff --git a/dbPort/src/org/compiere/model/X_W_Counter.java b/base/src/org/compiere/model/X_W_Counter.java similarity index 100% rename from dbPort/src/org/compiere/model/X_W_Counter.java rename to base/src/org/compiere/model/X_W_Counter.java diff --git a/dbPort/src/org/compiere/model/X_W_CounterCount.java b/base/src/org/compiere/model/X_W_CounterCount.java similarity index 100% rename from dbPort/src/org/compiere/model/X_W_CounterCount.java rename to base/src/org/compiere/model/X_W_CounterCount.java diff --git a/dbPort/src/org/compiere/model/X_W_MailMsg.java b/base/src/org/compiere/model/X_W_MailMsg.java similarity index 100% rename from dbPort/src/org/compiere/model/X_W_MailMsg.java rename to base/src/org/compiere/model/X_W_MailMsg.java diff --git a/dbPort/src/org/compiere/model/X_W_Store.java b/base/src/org/compiere/model/X_W_Store.java similarity index 100% rename from dbPort/src/org/compiere/model/X_W_Store.java rename to base/src/org/compiere/model/X_W_Store.java diff --git a/dbPort/src/org/compiere/package.html b/base/src/org/compiere/package.html similarity index 100% rename from dbPort/src/org/compiere/package.html rename to base/src/org/compiere/package.html diff --git a/print/src/org/compiere/print/ArchiveEngine.java b/base/src/org/compiere/print/ArchiveEngine.java similarity index 100% rename from print/src/org/compiere/print/ArchiveEngine.java rename to base/src/org/compiere/print/ArchiveEngine.java diff --git a/print/src/org/compiere/print/CPaper.java b/base/src/org/compiere/print/CPaper.java similarity index 100% rename from print/src/org/compiere/print/CPaper.java rename to base/src/org/compiere/print/CPaper.java diff --git a/print/src/org/compiere/print/CPrinter.java b/base/src/org/compiere/print/CPrinter.java similarity index 100% rename from print/src/org/compiere/print/CPrinter.java rename to base/src/org/compiere/print/CPrinter.java diff --git a/print/src/org/compiere/print/DataEngine.java b/base/src/org/compiere/print/DataEngine.java similarity index 100% rename from print/src/org/compiere/print/DataEngine.java rename to base/src/org/compiere/print/DataEngine.java diff --git a/print/src/org/compiere/print/MPrintColor.java b/base/src/org/compiere/print/MPrintColor.java similarity index 100% rename from print/src/org/compiere/print/MPrintColor.java rename to base/src/org/compiere/print/MPrintColor.java diff --git a/print/src/org/compiere/print/MPrintFont.java b/base/src/org/compiere/print/MPrintFont.java similarity index 100% rename from print/src/org/compiere/print/MPrintFont.java rename to base/src/org/compiere/print/MPrintFont.java diff --git a/print/src/org/compiere/print/MPrintFormat.java b/base/src/org/compiere/print/MPrintFormat.java similarity index 100% rename from print/src/org/compiere/print/MPrintFormat.java rename to base/src/org/compiere/print/MPrintFormat.java diff --git a/print/src/org/compiere/print/MPrintFormatItem.java b/base/src/org/compiere/print/MPrintFormatItem.java similarity index 100% rename from print/src/org/compiere/print/MPrintFormatItem.java rename to base/src/org/compiere/print/MPrintFormatItem.java diff --git a/print/src/org/compiere/print/MPrintFormatProcess.java b/base/src/org/compiere/print/MPrintFormatProcess.java similarity index 100% rename from print/src/org/compiere/print/MPrintFormatProcess.java rename to base/src/org/compiere/print/MPrintFormatProcess.java diff --git a/print/src/org/compiere/print/MPrintGraph.java b/base/src/org/compiere/print/MPrintGraph.java similarity index 100% rename from print/src/org/compiere/print/MPrintGraph.java rename to base/src/org/compiere/print/MPrintGraph.java diff --git a/print/src/org/compiere/print/MPrintPaper.java b/base/src/org/compiere/print/MPrintPaper.java similarity index 100% rename from print/src/org/compiere/print/MPrintPaper.java rename to base/src/org/compiere/print/MPrintPaper.java diff --git a/print/src/org/compiere/print/MPrintTableFormat.java b/base/src/org/compiere/print/MPrintTableFormat.java similarity index 100% rename from print/src/org/compiere/print/MPrintTableFormat.java rename to base/src/org/compiere/print/MPrintTableFormat.java diff --git a/print/src/org/compiere/print/PrintData.java b/base/src/org/compiere/print/PrintData.java similarity index 100% rename from print/src/org/compiere/print/PrintData.java rename to base/src/org/compiere/print/PrintData.java diff --git a/print/src/org/compiere/print/PrintDataColumn.java b/base/src/org/compiere/print/PrintDataColumn.java similarity index 100% rename from print/src/org/compiere/print/PrintDataColumn.java rename to base/src/org/compiere/print/PrintDataColumn.java diff --git a/print/src/org/compiere/print/PrintDataElement.java b/base/src/org/compiere/print/PrintDataElement.java similarity index 100% rename from print/src/org/compiere/print/PrintDataElement.java rename to base/src/org/compiere/print/PrintDataElement.java diff --git a/print/src/org/compiere/print/PrintDataFunction.java b/base/src/org/compiere/print/PrintDataFunction.java similarity index 100% rename from print/src/org/compiere/print/PrintDataFunction.java rename to base/src/org/compiere/print/PrintDataFunction.java diff --git a/print/src/org/compiere/print/PrintDataGroup.java b/base/src/org/compiere/print/PrintDataGroup.java similarity index 100% rename from print/src/org/compiere/print/PrintDataGroup.java rename to base/src/org/compiere/print/PrintDataGroup.java diff --git a/print/src/org/compiere/print/PrintDataHandler.java b/base/src/org/compiere/print/PrintDataHandler.java similarity index 100% rename from print/src/org/compiere/print/PrintDataHandler.java rename to base/src/org/compiere/print/PrintDataHandler.java diff --git a/print/src/org/compiere/print/PrintFormatUtil.java b/base/src/org/compiere/print/PrintFormatUtil.java similarity index 100% rename from print/src/org/compiere/print/PrintFormatUtil.java rename to base/src/org/compiere/print/PrintFormatUtil.java diff --git a/print/src/org/compiere/print/PrintUtil.java b/base/src/org/compiere/print/PrintUtil.java similarity index 100% rename from print/src/org/compiere/print/PrintUtil.java rename to base/src/org/compiere/print/PrintUtil.java diff --git a/print/src/org/compiere/print/ReportEngine.java b/base/src/org/compiere/print/ReportEngine.java similarity index 100% rename from print/src/org/compiere/print/ReportEngine.java rename to base/src/org/compiere/print/ReportEngine.java diff --git a/print/src/org/compiere/print/View.java b/base/src/org/compiere/print/View.java similarity index 100% rename from print/src/org/compiere/print/View.java rename to base/src/org/compiere/print/View.java diff --git a/print/src/org/compiere/print/layout/BarcodeElement.java b/base/src/org/compiere/print/layout/BarcodeElement.java similarity index 100% rename from print/src/org/compiere/print/layout/BarcodeElement.java rename to base/src/org/compiere/print/layout/BarcodeElement.java diff --git a/print/src/org/compiere/print/layout/BoxElement.java b/base/src/org/compiere/print/layout/BoxElement.java similarity index 100% rename from print/src/org/compiere/print/layout/BoxElement.java rename to base/src/org/compiere/print/layout/BoxElement.java diff --git a/print/src/org/compiere/print/layout/Dimension2DImpl.java b/base/src/org/compiere/print/layout/Dimension2DImpl.java similarity index 100% rename from print/src/org/compiere/print/layout/Dimension2DImpl.java rename to base/src/org/compiere/print/layout/Dimension2DImpl.java diff --git a/print/src/org/compiere/print/layout/GraphElement.java b/base/src/org/compiere/print/layout/GraphElement.java similarity index 100% rename from print/src/org/compiere/print/layout/GraphElement.java rename to base/src/org/compiere/print/layout/GraphElement.java diff --git a/print/src/org/compiere/print/layout/GridElement.java b/base/src/org/compiere/print/layout/GridElement.java similarity index 100% rename from print/src/org/compiere/print/layout/GridElement.java rename to base/src/org/compiere/print/layout/GridElement.java diff --git a/print/src/org/compiere/print/layout/HTMLElement.java b/base/src/org/compiere/print/layout/HTMLElement.java similarity index 100% rename from print/src/org/compiere/print/layout/HTMLElement.java rename to base/src/org/compiere/print/layout/HTMLElement.java diff --git a/print/src/org/compiere/print/layout/HTMLRenderer.java b/base/src/org/compiere/print/layout/HTMLRenderer.java similarity index 100% rename from print/src/org/compiere/print/layout/HTMLRenderer.java rename to base/src/org/compiere/print/layout/HTMLRenderer.java diff --git a/print/src/org/compiere/print/layout/HeaderFooter.java b/base/src/org/compiere/print/layout/HeaderFooter.java similarity index 100% rename from print/src/org/compiere/print/layout/HeaderFooter.java rename to base/src/org/compiere/print/layout/HeaderFooter.java diff --git a/print/src/org/compiere/print/layout/ImageElement.java b/base/src/org/compiere/print/layout/ImageElement.java similarity index 100% rename from print/src/org/compiere/print/layout/ImageElement.java rename to base/src/org/compiere/print/layout/ImageElement.java diff --git a/print/src/org/compiere/print/layout/LayoutEngine.java b/base/src/org/compiere/print/layout/LayoutEngine.java similarity index 100% rename from print/src/org/compiere/print/layout/LayoutEngine.java rename to base/src/org/compiere/print/layout/LayoutEngine.java diff --git a/print/src/org/compiere/print/layout/LocationElement.java b/base/src/org/compiere/print/layout/LocationElement.java similarity index 100% rename from print/src/org/compiere/print/layout/LocationElement.java rename to base/src/org/compiere/print/layout/LocationElement.java diff --git a/print/src/org/compiere/print/layout/Page.java b/base/src/org/compiere/print/layout/Page.java similarity index 100% rename from print/src/org/compiere/print/layout/Page.java rename to base/src/org/compiere/print/layout/Page.java diff --git a/print/src/org/compiere/print/layout/ParameterElement.java b/base/src/org/compiere/print/layout/ParameterElement.java similarity index 100% rename from print/src/org/compiere/print/layout/ParameterElement.java rename to base/src/org/compiere/print/layout/ParameterElement.java diff --git a/print/src/org/compiere/print/layout/PrintElement.java b/base/src/org/compiere/print/layout/PrintElement.java similarity index 100% rename from print/src/org/compiere/print/layout/PrintElement.java rename to base/src/org/compiere/print/layout/PrintElement.java diff --git a/print/src/org/compiere/print/layout/StringElement.java b/base/src/org/compiere/print/layout/StringElement.java similarity index 100% rename from print/src/org/compiere/print/layout/StringElement.java rename to base/src/org/compiere/print/layout/StringElement.java diff --git a/print/src/org/compiere/print/layout/TableElement.java b/base/src/org/compiere/print/layout/TableElement.java similarity index 100% rename from print/src/org/compiere/print/layout/TableElement.java rename to base/src/org/compiere/print/layout/TableElement.java diff --git a/print/src/org/compiere/print/layout/false10.gif b/base/src/org/compiere/print/layout/false10.gif similarity index 100% rename from print/src/org/compiere/print/layout/false10.gif rename to base/src/org/compiere/print/layout/false10.gif diff --git a/print/src/org/compiere/print/layout/true10.gif b/base/src/org/compiere/print/layout/true10.gif similarity index 100% rename from print/src/org/compiere/print/layout/true10.gif rename to base/src/org/compiere/print/layout/true10.gif diff --git a/print/src/org/compiere/print/package.html b/base/src/org/compiere/print/package.html similarity index 100% rename from print/src/org/compiere/print/package.html rename to base/src/org/compiere/print/package.html diff --git a/dbPort/src/org/compiere/process/AdempiereServer.java b/base/src/org/compiere/process/AdempiereServer.java similarity index 100% rename from dbPort/src/org/compiere/process/AdempiereServer.java rename to base/src/org/compiere/process/AdempiereServer.java diff --git a/dbPort/src/org/compiere/process/AdempiereService.java b/base/src/org/compiere/process/AdempiereService.java similarity index 100% rename from dbPort/src/org/compiere/process/AdempiereService.java rename to base/src/org/compiere/process/AdempiereService.java diff --git a/dbPort/src/org/compiere/process/ClientProcess.java b/base/src/org/compiere/process/ClientProcess.java similarity index 100% rename from dbPort/src/org/compiere/process/ClientProcess.java rename to base/src/org/compiere/process/ClientProcess.java diff --git a/dbPort/src/org/compiere/process/DocAction.java b/base/src/org/compiere/process/DocAction.java similarity index 100% rename from dbPort/src/org/compiere/process/DocAction.java rename to base/src/org/compiere/process/DocAction.java diff --git a/dbPort/src/org/compiere/process/DocActionTemplate.java b/base/src/org/compiere/process/DocActionTemplate.java similarity index 100% rename from dbPort/src/org/compiere/process/DocActionTemplate.java rename to base/src/org/compiere/process/DocActionTemplate.java diff --git a/dbPort/src/org/compiere/process/DocumentEngine.java b/base/src/org/compiere/process/DocumentEngine.java similarity index 100% rename from dbPort/src/org/compiere/process/DocumentEngine.java rename to base/src/org/compiere/process/DocumentEngine.java diff --git a/dbPort/src/org/compiere/process/IssueReport.java b/base/src/org/compiere/process/IssueReport.java similarity index 100% rename from dbPort/src/org/compiere/process/IssueReport.java rename to base/src/org/compiere/process/IssueReport.java diff --git a/dbPort/src/org/compiere/process/ProcessCall.java b/base/src/org/compiere/process/ProcessCall.java similarity index 100% rename from dbPort/src/org/compiere/process/ProcessCall.java rename to base/src/org/compiere/process/ProcessCall.java diff --git a/dbPort/src/org/compiere/process/ProcessInfo.java b/base/src/org/compiere/process/ProcessInfo.java similarity index 100% rename from dbPort/src/org/compiere/process/ProcessInfo.java rename to base/src/org/compiere/process/ProcessInfo.java diff --git a/dbPort/src/org/compiere/process/ProcessInfoLog.java b/base/src/org/compiere/process/ProcessInfoLog.java similarity index 100% rename from dbPort/src/org/compiere/process/ProcessInfoLog.java rename to base/src/org/compiere/process/ProcessInfoLog.java diff --git a/dbPort/src/org/compiere/process/ProcessInfoParameter.java b/base/src/org/compiere/process/ProcessInfoParameter.java similarity index 100% rename from dbPort/src/org/compiere/process/ProcessInfoParameter.java rename to base/src/org/compiere/process/ProcessInfoParameter.java diff --git a/dbPort/src/org/compiere/process/ProcessInfoUtil.java b/base/src/org/compiere/process/ProcessInfoUtil.java similarity index 100% rename from dbPort/src/org/compiere/process/ProcessInfoUtil.java rename to base/src/org/compiere/process/ProcessInfoUtil.java diff --git a/dbPort/src/org/compiere/process/SequenceCheck.java b/base/src/org/compiere/process/SequenceCheck.java similarity index 100% rename from dbPort/src/org/compiere/process/SequenceCheck.java rename to base/src/org/compiere/process/SequenceCheck.java diff --git a/dbPort/src/org/compiere/process/StateEngine.java b/base/src/org/compiere/process/StateEngine.java similarity index 100% rename from dbPort/src/org/compiere/process/StateEngine.java rename to base/src/org/compiere/process/StateEngine.java diff --git a/dbPort/src/org/compiere/process/SvrProcess.java b/base/src/org/compiere/process/SvrProcess.java similarity index 100% rename from dbPort/src/org/compiere/process/SvrProcess.java rename to base/src/org/compiere/process/SvrProcess.java diff --git a/dbPort/src/org/compiere/process/SystemValidate.java b/base/src/org/compiere/process/SystemValidate.java similarity index 100% rename from dbPort/src/org/compiere/process/SystemValidate.java rename to base/src/org/compiere/process/SystemValidate.java diff --git a/dbPort/src/org/compiere/process/package.html b/base/src/org/compiere/process/package.html similarity index 100% rename from dbPort/src/org/compiere/process/package.html rename to base/src/org/compiere/process/package.html diff --git a/dbPort/src/org/compiere/util/AdempiereSystemError.java b/base/src/org/compiere/util/AdempiereSystemError.java similarity index 100% rename from dbPort/src/org/compiere/util/AdempiereSystemError.java rename to base/src/org/compiere/util/AdempiereSystemError.java diff --git a/dbPort/src/org/compiere/util/AdempiereUserError.java b/base/src/org/compiere/util/AdempiereUserError.java similarity index 100% rename from dbPort/src/org/compiere/util/AdempiereUserError.java rename to base/src/org/compiere/util/AdempiereUserError.java diff --git a/dbPort/src/org/compiere/util/AmtInWords.java b/base/src/org/compiere/util/AmtInWords.java similarity index 100% rename from dbPort/src/org/compiere/util/AmtInWords.java rename to base/src/org/compiere/util/AmtInWords.java diff --git a/dbPort/src/org/compiere/util/AmtInWords_CA.java b/base/src/org/compiere/util/AmtInWords_CA.java similarity index 100% rename from dbPort/src/org/compiere/util/AmtInWords_CA.java rename to base/src/org/compiere/util/AmtInWords_CA.java diff --git a/dbPort/src/org/compiere/util/AmtInWords_EN.java b/base/src/org/compiere/util/AmtInWords_EN.java similarity index 100% rename from dbPort/src/org/compiere/util/AmtInWords_EN.java rename to base/src/org/compiere/util/AmtInWords_EN.java diff --git a/dbPort/src/org/compiere/util/AmtInWords_ES.java b/base/src/org/compiere/util/AmtInWords_ES.java similarity index 100% rename from dbPort/src/org/compiere/util/AmtInWords_ES.java rename to base/src/org/compiere/util/AmtInWords_ES.java diff --git a/dbPort/src/org/compiere/util/AmtInWords_FA.java b/base/src/org/compiere/util/AmtInWords_FA.java similarity index 100% rename from dbPort/src/org/compiere/util/AmtInWords_FA.java rename to base/src/org/compiere/util/AmtInWords_FA.java diff --git a/dbPort/src/org/compiere/util/AmtInWords_FR.java b/base/src/org/compiere/util/AmtInWords_FR.java similarity index 100% rename from dbPort/src/org/compiere/util/AmtInWords_FR.java rename to base/src/org/compiere/util/AmtInWords_FR.java diff --git a/dbPort/src/org/compiere/util/AmtInWords_IN.java b/base/src/org/compiere/util/AmtInWords_IN.java similarity index 100% rename from dbPort/src/org/compiere/util/AmtInWords_IN.java rename to base/src/org/compiere/util/AmtInWords_IN.java diff --git a/dbPort/src/org/compiere/util/AmtInWords_PL.java b/base/src/org/compiere/util/AmtInWords_PL.java similarity index 100% rename from dbPort/src/org/compiere/util/AmtInWords_PL.java rename to base/src/org/compiere/util/AmtInWords_PL.java diff --git a/dbPort/src/org/compiere/util/AmtInWords_TH.java b/base/src/org/compiere/util/AmtInWords_TH.java similarity index 100% rename from dbPort/src/org/compiere/util/AmtInWords_TH.java rename to base/src/org/compiere/util/AmtInWords_TH.java diff --git a/dbPort/src/org/compiere/util/ByteArrayDataSource.java b/base/src/org/compiere/util/ByteArrayDataSource.java similarity index 100% rename from dbPort/src/org/compiere/util/ByteArrayDataSource.java rename to base/src/org/compiere/util/ByteArrayDataSource.java diff --git a/dbPort/src/org/compiere/util/CCache.java b/base/src/org/compiere/util/CCache.java similarity index 100% rename from dbPort/src/org/compiere/util/CCache.java rename to base/src/org/compiere/util/CCache.java diff --git a/dbPort/src/org/compiere/util/CCachedRowSet.java b/base/src/org/compiere/util/CCachedRowSet.java similarity index 100% rename from dbPort/src/org/compiere/util/CCachedRowSet.java rename to base/src/org/compiere/util/CCachedRowSet.java diff --git a/dbPort/src/org/compiere/util/CLogConsole.java b/base/src/org/compiere/util/CLogConsole.java similarity index 100% rename from dbPort/src/org/compiere/util/CLogConsole.java rename to base/src/org/compiere/util/CLogConsole.java diff --git a/dbPort/src/org/compiere/util/CLogErrorBuffer.java b/base/src/org/compiere/util/CLogErrorBuffer.java similarity index 100% rename from dbPort/src/org/compiere/util/CLogErrorBuffer.java rename to base/src/org/compiere/util/CLogErrorBuffer.java diff --git a/dbPort/src/org/compiere/util/CLogFile.java b/base/src/org/compiere/util/CLogFile.java similarity index 100% rename from dbPort/src/org/compiere/util/CLogFile.java rename to base/src/org/compiere/util/CLogFile.java diff --git a/dbPort/src/org/compiere/util/CLogFilter.java b/base/src/org/compiere/util/CLogFilter.java similarity index 100% rename from dbPort/src/org/compiere/util/CLogFilter.java rename to base/src/org/compiere/util/CLogFilter.java diff --git a/dbPort/src/org/compiere/util/CLogFormatter.java b/base/src/org/compiere/util/CLogFormatter.java similarity index 100% rename from dbPort/src/org/compiere/util/CLogFormatter.java rename to base/src/org/compiere/util/CLogFormatter.java diff --git a/dbPort/src/org/compiere/util/CLogMgt.java b/base/src/org/compiere/util/CLogMgt.java similarity index 100% rename from dbPort/src/org/compiere/util/CLogMgt.java rename to base/src/org/compiere/util/CLogMgt.java diff --git a/dbPort/src/org/compiere/util/CLogMgtLog4J.java b/base/src/org/compiere/util/CLogMgtLog4J.java similarity index 100% rename from dbPort/src/org/compiere/util/CLogMgtLog4J.java rename to base/src/org/compiere/util/CLogMgtLog4J.java diff --git a/dbPort/src/org/compiere/util/CLogger.java b/base/src/org/compiere/util/CLogger.java similarity index 100% rename from dbPort/src/org/compiere/util/CLogger.java rename to base/src/org/compiere/util/CLogger.java diff --git a/dbPort/src/org/compiere/util/CMemoryUsage.java b/base/src/org/compiere/util/CMemoryUsage.java similarity index 100% rename from dbPort/src/org/compiere/util/CMemoryUsage.java rename to base/src/org/compiere/util/CMemoryUsage.java diff --git a/dbPort/src/org/compiere/util/CPreparedStatement.java b/base/src/org/compiere/util/CPreparedStatement.java similarity index 100% rename from dbPort/src/org/compiere/util/CPreparedStatement.java rename to base/src/org/compiere/util/CPreparedStatement.java diff --git a/dbPort/src/org/compiere/util/CStatement.java b/base/src/org/compiere/util/CStatement.java similarity index 100% rename from dbPort/src/org/compiere/util/CStatement.java rename to base/src/org/compiere/util/CStatement.java diff --git a/dbPort/src/org/compiere/util/CStatementVO.java b/base/src/org/compiere/util/CStatementVO.java similarity index 100% rename from dbPort/src/org/compiere/util/CStatementVO.java rename to base/src/org/compiere/util/CStatementVO.java diff --git a/dbPort/src/org/compiere/util/CacheInterface.java b/base/src/org/compiere/util/CacheInterface.java similarity index 100% rename from dbPort/src/org/compiere/util/CacheInterface.java rename to base/src/org/compiere/util/CacheInterface.java diff --git a/dbPort/src/org/compiere/util/CacheMgt.java b/base/src/org/compiere/util/CacheMgt.java similarity index 100% rename from dbPort/src/org/compiere/util/CacheMgt.java rename to base/src/org/compiere/util/CacheMgt.java diff --git a/dbPort/src/org/compiere/util/ConnectTest.java b/base/src/org/compiere/util/ConnectTest.java similarity index 100% rename from dbPort/src/org/compiere/util/ConnectTest.java rename to base/src/org/compiere/util/ConnectTest.java diff --git a/dbPort/src/org/compiere/util/DB.java b/base/src/org/compiere/util/DB.java similarity index 100% rename from dbPort/src/org/compiere/util/DB.java rename to base/src/org/compiere/util/DB.java diff --git a/dbPort/src/org/compiere/util/DBException.java b/base/src/org/compiere/util/DBException.java similarity index 100% rename from dbPort/src/org/compiere/util/DBException.java rename to base/src/org/compiere/util/DBException.java diff --git a/dbPort/src/org/compiere/util/DisplayType.java b/base/src/org/compiere/util/DisplayType.java similarity index 100% rename from dbPort/src/org/compiere/util/DisplayType.java rename to base/src/org/compiere/util/DisplayType.java diff --git a/dbPort/src/org/compiere/util/EMail.java b/base/src/org/compiere/util/EMail.java similarity index 100% rename from dbPort/src/org/compiere/util/EMail.java rename to base/src/org/compiere/util/EMail.java diff --git a/dbPort/src/org/compiere/util/EMailAuthenticator.java b/base/src/org/compiere/util/EMailAuthenticator.java similarity index 100% rename from dbPort/src/org/compiere/util/EMailAuthenticator.java rename to base/src/org/compiere/util/EMailAuthenticator.java diff --git a/dbPort/src/org/compiere/util/EMailTest.java b/base/src/org/compiere/util/EMailTest.java similarity index 100% rename from dbPort/src/org/compiere/util/EMailTest.java rename to base/src/org/compiere/util/EMailTest.java diff --git a/dbPort/src/org/compiere/util/Env.java b/base/src/org/compiere/util/Env.java similarity index 100% rename from dbPort/src/org/compiere/util/Env.java rename to base/src/org/compiere/util/Env.java diff --git a/dbPort/src/org/compiere/util/Evaluatee.java b/base/src/org/compiere/util/Evaluatee.java similarity index 100% rename from dbPort/src/org/compiere/util/Evaluatee.java rename to base/src/org/compiere/util/Evaluatee.java diff --git a/dbPort/src/org/compiere/util/Evaluator.java b/base/src/org/compiere/util/Evaluator.java similarity index 100% rename from dbPort/src/org/compiere/util/Evaluator.java rename to base/src/org/compiere/util/Evaluator.java diff --git a/dbPort/src/org/compiere/util/GenerateModel.java b/base/src/org/compiere/util/GenerateModel.java similarity index 100% rename from dbPort/src/org/compiere/util/GenerateModel.java rename to base/src/org/compiere/util/GenerateModel.java diff --git a/dbPort/src/org/compiere/util/Login.java b/base/src/org/compiere/util/Login.java similarity index 100% rename from dbPort/src/org/compiere/util/Login.java rename to base/src/org/compiere/util/Login.java diff --git a/dbPort/src/org/compiere/util/MimeType.java b/base/src/org/compiere/util/MimeType.java similarity index 100% rename from dbPort/src/org/compiere/util/MimeType.java rename to base/src/org/compiere/util/MimeType.java diff --git a/dbPort/src/org/compiere/util/Msg.java b/base/src/org/compiere/util/Msg.java similarity index 100% rename from dbPort/src/org/compiere/util/Msg.java rename to base/src/org/compiere/util/Msg.java diff --git a/dbPort/src/org/compiere/util/NullParameter.java b/base/src/org/compiere/util/NullParameter.java similarity index 100% rename from dbPort/src/org/compiere/util/NullParameter.java rename to base/src/org/compiere/util/NullParameter.java diff --git a/dbPort/src/org/compiere/util/Splash.java b/base/src/org/compiere/util/Splash.java similarity index 100% rename from dbPort/src/org/compiere/util/Splash.java rename to base/src/org/compiere/util/Splash.java diff --git a/dbPort/src/org/compiere/util/TimeUtil.java b/base/src/org/compiere/util/TimeUtil.java similarity index 100% rename from dbPort/src/org/compiere/util/TimeUtil.java rename to base/src/org/compiere/util/TimeUtil.java diff --git a/dbPort/src/org/compiere/util/Trx.java b/base/src/org/compiere/util/Trx.java similarity index 100% rename from dbPort/src/org/compiere/util/Trx.java rename to base/src/org/compiere/util/Trx.java diff --git a/dbPort/src/org/compiere/util/ZipUtil.java b/base/src/org/compiere/util/ZipUtil.java similarity index 100% rename from dbPort/src/org/compiere/util/ZipUtil.java rename to base/src/org/compiere/util/ZipUtil.java diff --git a/dbPort/src/org/compiere/util/logClient.properties b/base/src/org/compiere/util/logClient.properties similarity index 100% rename from dbPort/src/org/compiere/util/logClient.properties rename to base/src/org/compiere/util/logClient.properties diff --git a/dbPort/src/org/compiere/util/logServer.properties b/base/src/org/compiere/util/logServer.properties similarity index 100% rename from dbPort/src/org/compiere/util/logServer.properties rename to base/src/org/compiere/util/logServer.properties diff --git a/utils_dev/RUN_build.bat b/utils_dev/RUN_build.bat index a4e97b957d..e0e57b1834 100644 --- a/utils_dev/RUN_build.bat +++ b/utils_dev/RUN_build.bat @@ -12,6 +12,8 @@ @SET ANT_CLASSPATH=%CLASSPATH%;..\tools\lib\ant.jar;..\tools\lib\ant-launcher.jar;..\tools\lib\ant-swing.jar;..\tools\lib\ant-commons-net.jar;..\tools\lib\commons-net-1.4.0.jar @SET ANT_CLASSPATH=%ANT_CLASSPATH%;"%JAVA_HOME%\lib\tools.jar" +@SET ANT_OPTS="-Xms512m -Xmx512m" + @echo Cleanup ... @"%JAVA_HOME%\bin\java" -classpath %ANT_CLASSPATH% -Dant.home="." org.apache.tools.ant.Main clean diff --git a/utils_dev/RUN_buildIncremental.bat b/utils_dev/RUN_buildIncremental.bat index 44edbd92f1..a6885b12c0 100644 --- a/utils_dev/RUN_buildIncremental.bat +++ b/utils_dev/RUN_buildIncremental.bat @@ -8,15 +8,12 @@ @Rem Check jdk @IF NOT EXIST "%JAVA_HOME%\lib\tools.jar" ECHO "** Need Full Java SDK **" -@Echo Stop Apps Server (waiting) -@START %ADEMPIERE_HOME%\utils\RUN_Server2Stop.bat -@Rem Wait 5 second -@PING 1.1.1.1 -n 1 -w 5000 > NUL - @Rem Set ant classpath @SET ANT_CLASSPATH=%CLASSPATH%;..\tools\lib\ant.jar;..\tools\lib\ant-launcher.jar;..\tools\lib\ant-swing.jar;..\tools\lib\ant-commons-net.jar;..\tools\lib\commons-net-1.4.0.jar @SET ANT_CLASSPATH=%ANT_CLASSPATH%;"%JAVA_HOME%\lib\tools.jar" +@SET ANT_OPTS="-Xms512m -Xmx512m" + @echo Building ... @"%JAVA_HOME%\bin\java" -classpath %ANT_CLASSPATH% -Dant.home="." %ANT_PROPERTIES% org.apache.tools.ant.Main update @Echo ErrorLevel = %ERRORLEVEL% @@ -30,8 +27,5 @@ @Rem Echo Cleaning up ... @Rem erase /q /s %TMP% -@Echo Starting Apps Server ... -@Start %ADEMPIERE_HOME%\utils\RUN_Server2.bat - @Pause @Exit