hg merge release-6.2 (merge release6.2 into default)

This commit is contained in:
Carlos Ruiz 2019-01-26 17:48:35 +01:00
commit 6db1526cdd
32 changed files with 274 additions and 507 deletions

View File

@ -0,0 +1,9 @@
SET SQLBLANKLINES ON
SET DEFINE OFF
-- Oct 13, 2018 4:35:41 PM IST
INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200146,0,0,TO_DATE('2018-10-13 16:35:40','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2018-10-13 16:35:40','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','ALogin_ShowDate','Y','Defaulted to Y. If value changed to N, date field is not displayed on role window.','D','S','54085add-8245-4bfe-a978-3583bbe2cc2a')
;
SELECT register_migration_script('201810131655_IDEMPIERE-1311.sql') FROM dual
;

View File

@ -0,0 +1,11 @@
SET SQLBLANKLINES ON
SET DEFINE OFF
-- IDEMPIERE-1311 Ability to hide fields on Connection panel
-- Jan 25, 2019, 2:53:25 PM CET
INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Defaults',0,0,'Y',TO_DATE('2019-01-25 14:53:25','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-01-25 14:53:25','YYYY-MM-DD HH24:MI:SS'),100,200486,'Defaults','D','4b2b5e32-b978-47d9-a843-7e6c9eb647f2')
;
SELECT register_migration_script('201901251453_IDEMPIERE-1311.sql') FROM dual
;

View File

@ -0,0 +1,11 @@
SET SQLBLANKLINES ON
SET DEFINE OFF
-- IDEMPIERE-3509:Message about can't find out direct table reference
-- Sep 30, 2017 11:59:56 PM ICT
INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','Can''''t resolve reference table for column "{0}"',0,0,'Y',TO_DATE('2017-09-30 23:59:55','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2017-09-30 23:59:55','YYYY-MM-DD HH24:MI:SS'),100,200432,'NotReferenceTable','D','4f338d58-5c2d-4dda-8817-93f1954ab4eb')
;
SELECT register_migration_script('201901261333_IDEMPIERE-3509.sql') FROM dual
;

View File

@ -0,0 +1,6 @@
-- Oct 13, 2018 4:35:41 PM IST
INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200146,0,0,TO_TIMESTAMP('2018-10-13 16:35:40','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2018-10-13 16:35:40','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','ALogin_ShowDate','Y','Defaulted to Y. If value changed to N, date field is not displayed on role window.','D','S','54085add-8245-4bfe-a978-3583bbe2cc2a')
;
SELECT register_migration_script('201810131655_IDEMPIERE-1311.sql') FROM dual
;

View File

@ -0,0 +1,8 @@
-- IDEMPIERE-1311 Ability to hide fields on Connection panel
-- Jan 25, 2019, 2:53:25 PM CET
INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Defaults',0,0,'Y',TO_TIMESTAMP('2019-01-25 14:53:25','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-01-25 14:53:25','YYYY-MM-DD HH24:MI:SS'),100,200486,'Defaults','D','4b2b5e32-b978-47d9-a843-7e6c9eb647f2')
;
SELECT register_migration_script('201901251453_IDEMPIERE-1311.sql') FROM dual
;

View File

@ -0,0 +1,8 @@
-- IDEMPIERE-3509:Message about can't find out direct table reference
-- Sep 30, 2017 11:59:56 PM ICT
INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','Can''''t resolve reference table for column "{0}"',0,0,'Y',TO_TIMESTAMP('2017-09-30 23:59:55','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2017-09-30 23:59:55','YYYY-MM-DD HH24:MI:SS'),100,200432,'NotReferenceTable','D','4f338d58-5c2d-4dda-8817-93f1954ab4eb')
;
SELECT register_migration_script('201901261333_IDEMPIERE-3509.sql') FROM dual
;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -65,7 +65,7 @@ public class CopyFromInvoice extends SvrProcess
MInvoice from = new MInvoice (getCtx(), m_C_Invoice_ID, get_TrxName());
MInvoice to = new MInvoice (getCtx(), To_C_Invoice_ID, get_TrxName());
//
int no = to.copyLinesFrom (from, false, false);
int no = to.copyLinesFrom (from, false, false, false);
//
return "@Copied@=" + no;
} // doIt

View File

@ -247,7 +247,7 @@ public class InOutGenerate extends SvrProcess
.append(" INNER JOIN M_InOut io ON (iol.M_InOut_ID=io.M_InOut_ID) ")
.append("WHERE iol.C_OrderLine_ID=C_OrderLine.C_OrderLine_ID AND io.DocStatus IN ('DR','IN','IP','WC'))");
// Deadlock Prevention - Order by M_Product_ID
MOrderLine[] lines = order.getLines (where.toString(), "C_BPartner_Location_ID, M_Product_ID");
MOrderLine[] lines = order.getLines (where.toString(), "C_BPartner_Location_ID, M_Product_ID, Line");
for (int i = 0; i < lines.length; i++)
{
MOrderLine line = lines[i];

View File

@ -20,6 +20,8 @@ import java.util.logging.Level;
import org.compiere.model.MMatchInv;
import org.compiere.util.AdempiereUserError;
import org.compiere.util.CLogger;
import org.compiere.util.ValueNamePair;
/**
@ -54,8 +56,14 @@ public class MatchInvDelete extends SvrProcess
throw new AdempiereUserError("@NotFound@ @M_MatchInv_ID@ " + p_M_MatchInv_ID);
if (inv.delete(true))
return "@OK@";
inv.saveEx();
return "@Error@";
String msg = null;
ValueNamePair err = CLogger.retrieveError();
if (err != null)
msg = err.getName();
if (msg == null || msg.length() == 0)
msg = " - Check log";
return "@Error@: " + msg;
} // doIt
} // MatchInvDelete

View File

@ -26,8 +26,9 @@ import java.util.List;
import java.util.logging.Level;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import org.adempiere.base.osgi.OSGiScriptEngineManager;
import org.adempiere.model.IAddressValidation;
import org.adempiere.model.IShipmentProcessor;
import org.adempiere.model.ITaxProvider;
@ -47,7 +48,6 @@ import org.compiere.process.ProcessCall;
import org.compiere.util.CLogger;
import org.compiere.util.PaymentExport;
import org.compiere.util.ReplenishInterface;
import org.osgi.framework.FrameworkUtil;
/**
* This is a facade class for the Service Locator.
@ -55,8 +55,6 @@ import org.osgi.framework.FrameworkUtil;
*
* @author viola
* @author hengsin
* @author Silvano Trinchero, www.freepath.it
* <li>IDEMPIERE-3243 added getScriptEngine to manage both registered engines and engines provided by osgi bundles
*/
public class Core {
@ -437,17 +435,31 @@ public class Core {
}
/** Get script engine, checking classpath first, and then osgi plugins
/** Get script engine
*
* @param engineName
* @return ScriptEngine found, or null
*/
public static ScriptEngine getScriptEngine(String engineName)
{
OSGiScriptEngineManager osgiFactory = new OSGiScriptEngineManager( FrameworkUtil.getBundle(Core.class).getBundleContext());
ScriptEngine engine = osgiFactory.getEngineByName(engineName);
return engine;
ScriptEngineManager manager = new ScriptEngineManager(Core.class.getClassLoader());
ScriptEngine engine = manager.getEngineByName(engineName);
if (engine != null)
return engine;
List<ScriptEngineFactory> factoryList =
Service.locator().list(ScriptEngineFactory.class).getServices();
if (factoryList != null) {
for(ScriptEngineFactory factory : factoryList) {
for (String name : factory.getNames()) {
if (engineName.equals(name)) {
return factory.getScriptEngine();
}
}
}
}
return null;
}
/**

View File

@ -1,85 +0,0 @@
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.adempiere.base.osgi;
import java.io.Reader;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptException;
/**
* Imported from Apache Felix project.
* Original file:
* http://svn.apache.org/repos/asf/felix/trunk/mishell/src/main/java/org/apache/felix/mishell/OSGiScriptEngine.java
*
*/
public class OSGiScriptEngine implements ScriptEngine{
private ScriptEngine engine;
private OSGiScriptEngineFactory factory;
public OSGiScriptEngine(ScriptEngine engine, OSGiScriptEngineFactory factory){
this.engine=engine;
this.factory=factory;
}
public Bindings createBindings() {
return engine.createBindings();
}
public Object eval(Reader reader, Bindings n) throws ScriptException {
return engine.eval(reader, n);
}
public Object eval(Reader reader, ScriptContext context) throws ScriptException {
return engine.eval(reader, context);
}
public Object eval(Reader reader) throws ScriptException {
return engine.eval(reader);
}
public Object eval(String script, Bindings n) throws ScriptException {
return engine.eval(script, n);
}
public Object eval(String script, ScriptContext context) throws ScriptException {
return engine.eval(script, context);
}
public Object eval(String script) throws ScriptException {
return engine.eval(script);
}
public Object get(String key) {
return engine.get(key);
}
public Bindings getBindings(int scope) {
return engine.getBindings(scope);
}
public ScriptContext getContext() {
return engine.getContext();
}
public ScriptEngineFactory getFactory() {
return factory;
}
public void put(String key, Object value) {
engine.put(key, value);
}
public void setBindings(Bindings bindings, int scope) {
engine.setBindings(bindings, scope);
}
public void setContext(ScriptContext context) {
engine.setContext(context);
}
}

View File

@ -1,89 +0,0 @@
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.adempiere.base.osgi;
import java.util.List;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
/**
* This is a wrapper class for the ScriptEngineFactory class that deals with context class loader issues
* It is necessary because engines (at least ruby) use the context classloader to find their resources (i.e., their "native" classes)
*
*/
/**
* Imported from Apache Felix project.
* Original file:
* http://svn.apache.org/repos/asf/felix/trunk/mishell/src/main/java/org/apache/felix/mishell/OSGiScriptEngineFactory.java
*
*/
public class OSGiScriptEngineFactory implements ScriptEngineFactory{
private ScriptEngineFactory factory;
private ClassLoader contextClassLoader;
public OSGiScriptEngineFactory (ScriptEngineFactory factory, ClassLoader contextClassLoader){
this.factory=factory;
this.contextClassLoader=contextClassLoader;
}
public String getEngineName() {
return factory.getEngineName();
}
public String getEngineVersion() {
return factory.getEngineVersion();
}
public List<String> getExtensions() {
return factory.getExtensions();
}
public String getLanguageName() {
return factory.getLanguageName();
}
public String getLanguageVersion() {
return factory.getLanguageVersion();
}
public String getMethodCallSyntax(String obj, String m, String... args) {
return factory.getMethodCallSyntax(obj, m, args);
}
public List<String> getMimeTypes() {
return factory.getMimeTypes();
}
public List<String> getNames() {
return factory.getNames();
}
public String getOutputStatement(String toDisplay) {
return factory.getOutputStatement(toDisplay);
}
public Object getParameter(String key) {
return factory.getParameter(key);
}
public String getProgram(String... statements) {
return factory.getProgram(statements);
}
public ScriptEngine getScriptEngine() {
ScriptEngine engine=null;
if(contextClassLoader!=null){
ClassLoader old=Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(contextClassLoader);
engine=factory.getScriptEngine();
Thread.currentThread().setContextClassLoader(old);
}
else engine=factory.getScriptEngine();
return engine;
}
}

View File

@ -1,216 +0,0 @@
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.adempiere.base.osgi;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;
import org.adempiere.base.Service;
import org.osgi.framework.BundleContext;
/**
* This class acts as a delegate for all the available ScriptEngineManagers. Unluckily, the standard did not
* define it as an interface, so we need to extend it to allow polymorphism. However, no calls to super are used.
* It wraps all available ScriptEngineManagers in the OSGi ServicePlatform into a merged ScriptEngineManager.
*
* Internally, what this class does is creating ScriptEngineManagers for each bundle
* that contains a ScriptEngineFactory and includes a META-INF/services/javax.script.ScriptEngineFactory file.
* It assumes that the file contains a list of @link ScriptEngineFactory classes. For each bundle, it creates a
* ScriptEngineManager, then merges them. @link ScriptEngineFactory objects are wrapped
* into @link OSGiScriptEngineFactory objects to deal with problems of context class loader:
* Those scripting engines that rely on the ContextClassloader for finding resources need to use this wrapper
* and the @link OSGiScriptFactory. Mainly, jruby does.
*
* Note that even if no context classloader issues arose, it would still be needed to search manually for the
* factories and either use them directly (losing the mimeType/extension/shortName mechanisms for finding engines
* or manually registering them) or still use this class, which would be smarter. In the latter case,
* it would only be needed to remove the hack that temporarily sets the context classloader to the appropriate,
* bundle-related, class loader.
*
* Caveats:
* <ul><li>
* All factories are wrapped with an {@link OSGiScriptEngineFactory}. As Engines are not wrapped,
* calls like
* <code>
* ScriptEngineManager osgiManager=new OSGiScriptEngineManager(context);<br>
* ScriptEngine engine=osgiManager.getEngineByName("ruby");
* ScriptEngineFactory factory=engine.getFactory() //this does not return the OSGiFactory wrapper
* factory.getScriptEngine(); //this might fail, as it does not use OSGiScriptEngineFactory wrapper
* </code>
* might result in unexpected errors. Future versions may wrap the ScriptEngine with a OSGiScriptEngine to solve this
* issue, but for the moment it is not needed.
* </li>
*
*/
/**
* Imported from Apache Felix project.
* Original file:
* http://svn.apache.org/repos/asf/felix/trunk/mishell/src/main/java/org/apache/felix/mishell/OSGiScriptEngineManager.java
*
* @author Silvano Trinchero, www.freepath.it
* <li>IDEMPIERE-3243 fixed class discovery to avoid comment lines
*
*/
public class OSGiScriptEngineManager extends ScriptEngineManager{
private Bindings bindings;
private Map <ScriptEngineManager, ClassLoader> classLoaders;
private BundleContext context;
public OSGiScriptEngineManager(BundleContext context){
this.context=context;
bindings=new SimpleBindings();
this.classLoaders=findManagers(context);
}
/**
* This method is the only one that is visible and not part of the ScriptEngineManager class.
* Its purpose is to find new managers that weren't available before, but keeping the globalScope bindings
* set.
* If you want to clean the bindings you can either get a fresh instance of OSGiScriptManager or
* setting up a new bindings object.
* This can be done with:
* <code>
* ScriptEngineManager manager=new OSGiScriptEngineManager(context);
* (...)//do stuff
* osgiManager=(OSGiScriptEngineManager)manager;//cast to ease reading
* osgiManager.reloadManagers();
*
* manager.setBindings(new OSGiBindings());//or you can use your own bindings implementation
*
* </code>
*
*/
public void reloadManagers(){
this.classLoaders=findManagers(context);
}
public Object get(String key) {
return bindings.get(key);
}
public Bindings getBindings() {
return bindings;
}
public ScriptEngine getEngineByExtension(String extension) {
//TODO this is a hack to deal with context class loader issues
ScriptEngine engine=null;
for(ScriptEngineManager manager: classLoaders.keySet()){
ClassLoader old=Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(classLoaders.get(manager));
engine=manager.getEngineByExtension(extension);
Thread.currentThread().setContextClassLoader(old);
if (engine!=null) break;
}
return engine;
}
public ScriptEngine getEngineByMimeType(String mimeType) {
//TODO this is a hack to deal with context class loader issues
ScriptEngine engine=null;
for(ScriptEngineManager manager: classLoaders.keySet()){
ClassLoader old=Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(classLoaders.get(manager));
engine=manager.getEngineByMimeType(mimeType);
Thread.currentThread().setContextClassLoader(old);
if (engine!=null) break;
}
return engine;
}
public ScriptEngine getEngineByName(String shortName) {
//TODO this is a hack to deal with context class loader issues
for(ScriptEngineManager manager: classLoaders.keySet()){
ClassLoader old=Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(classLoaders.get(manager));
ScriptEngine engine=manager.getEngineByName(shortName);
Thread.currentThread().setContextClassLoader(old);
if (engine!=null){
return new OSGiScriptEngine(engine, new OSGiScriptEngineFactory(engine.getFactory(), classLoaders.get(manager)));
}
}
return null;
}
public List<ScriptEngineFactory> getEngineFactories() {
List<ScriptEngineFactory> osgiFactories=new ArrayList<ScriptEngineFactory>();
for(ScriptEngineManager engineManager: classLoaders.keySet()){
for (ScriptEngineFactory factory : engineManager.getEngineFactories()){
osgiFactories.add(new OSGiScriptEngineFactory(factory, classLoaders.get(engineManager)));
}
}
return osgiFactories;
}
public void put(String key, Object value) {
bindings.put(key, value);
}
public void registerEngineExtension(String extension, ScriptEngineFactory factory) {
for(ScriptEngineManager engineManager: classLoaders.keySet())
engineManager.registerEngineExtension(extension, factory);
}
public void registerEngineMimeType(String type, ScriptEngineFactory factory) {
for(ScriptEngineManager engineManager: classLoaders.keySet())
engineManager.registerEngineMimeType(type, factory);
}
public void registerEngineName(String name, ScriptEngineFactory factory) {
for(ScriptEngineManager engineManager: classLoaders.keySet())
engineManager.registerEngineName(name, factory);
}
/**
* Follows the same behavior of @link javax.script.ScriptEngineManager#setBindings(Bindings)
* This means that the same bindings are applied to all the underlying managers.
* @param bindings
*/
public void setBindings(Bindings bindings) {
this.bindings=bindings;
for(ScriptEngineManager manager: classLoaders.keySet()){
manager.setBindings(bindings);
}
}
private Map<ScriptEngineManager, ClassLoader> findManagers(BundleContext context) {
Map<ScriptEngineManager, ClassLoader> managers=new HashMap<ScriptEngineManager, ClassLoader>();
List<ScriptEngineFactory> seFactoryList =
Service.locator().list(ScriptEngineFactory.class).getServices();
if (seFactoryList != null) {
for(ScriptEngineFactory seFactory : seFactoryList) {
ClassLoader factoryLoader = seFactory.getClass().getClassLoader();
ScriptEngineManager manager=new ScriptEngineManager(factoryLoader);
manager.setBindings(bindings);
managers.put(manager, factoryLoader);
}
}
return managers;
}
}

View File

@ -29,6 +29,7 @@ import java.util.logging.Level;
import javax.script.ScriptEngine;
import org.adempiere.base.Core;
import org.adempiere.exceptions.AdempiereException;
import org.compiere.model.MProcess;
import org.compiere.model.MRule;
import org.compiere.process.ProcessCall;
@ -217,6 +218,9 @@ public final class ProcessUtil {
}
ScriptEngine engine = rule.getScriptEngine();
if (engine == null) {
throw new AdempiereException("Engine not found: " + rule.getEngineName());
}
// Window context are W_
// Login context are G_

View File

@ -415,16 +415,6 @@ public class Doc_Invoice extends Doc
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);
@ -446,6 +436,17 @@ public class Doc_Invoice extends Doc
if (serviceAmt.signum() != 0)
fact.createLine(null, MAccount.get(getCtx(), receivablesServices_ID),
getC_Currency_ID(), serviceAmt, null);
// 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
}
}
}
// ARC
else if (getDocumentType().equals(DOCTYPE_ARCredit))
@ -496,16 +497,7 @@ public class Doc_Invoice extends Doc
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);
@ -526,6 +518,17 @@ public class Doc_Invoice extends Doc
if (serviceAmt.signum() != 0)
fact.createLine(null, MAccount.get(getCtx(), receivablesServices_ID),
getC_Currency_ID(), null, serviceAmt);
// 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
}
}
}
// ** API
@ -600,16 +603,6 @@ public class Doc_Invoice extends Doc
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);
@ -631,6 +624,18 @@ public class Doc_Invoice extends Doc
if (serviceAmt.signum() != 0)
fact.createLine(null, MAccount.get(getCtx(), payablesServices_ID),
getC_Currency_ID(), null, serviceAmt);
// 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
}
}
//
updateProductPO(as); // Only API
}
@ -705,16 +710,7 @@ public class Doc_Invoice extends Doc
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);
@ -735,6 +731,17 @@ public class Doc_Invoice extends Doc
if (serviceAmt.signum() != 0)
fact.createLine(null, MAccount.get(getCtx(), payablesServices_ID),
getC_Currency_ID(), serviceAmt, null);
// 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
}
}
}
else
{

View File

@ -156,7 +156,7 @@ public class Doc_MatchInv extends Doc
setC_Currency_ID (as.getC_Currency_ID());
boolean isInterOrg = isInterOrg(as);
/** Needs to be handeled in PO Matching as no Receipt info
/** Needs to be handled in PO Matching as no Receipt info
if (m_pc.isService())
{
log.fine("Service - skipped");
@ -168,8 +168,7 @@ public class Doc_MatchInv extends Doc
// NotInvoicedReceipt DR
// From Receipt
BigDecimal multiplier = getQty()
.divide(m_receiptLine.getMovementQty(), 12, RoundingMode.HALF_UP)
.abs();
.divide(m_receiptLine.getMovementQty(), 12, RoundingMode.HALF_UP);
FactLine dr = fact.createLine (null,
getAccount(Doc.ACCTTYPE_NotInvoicedReceipts, as),
as.getC_Currency_ID(), Env.ONE, null); // updated below
@ -192,12 +191,9 @@ public class Doc_MatchInv extends Doc
}
else
{
BigDecimal effMultiplier = multiplier;
if (getQty().signum() < 0)
effMultiplier = effMultiplier.negate();
if (!dr.updateReverseLine (MInOut.Table_ID, // Amt updated
m_receiptLine.getM_InOut_ID(), m_receiptLine.getM_InOutLine_ID(),
effMultiplier))
multiplier))
{
p_Error = "Mat.Receipt not posted yet";
return null;
@ -213,8 +209,7 @@ public class Doc_MatchInv extends Doc
expense = m_pc.getAccount(ProductCost.ACCTTYPE_P_Expense, as);
BigDecimal LineNetAmt = m_invoiceLine.getLineNetAmt();
multiplier = getQty()
.divide(m_invoiceLine.getQtyInvoiced(), 12, RoundingMode.HALF_UP)
.abs();
.divide(m_invoiceLine.getQtyInvoiced(), 12, RoundingMode.HALF_UP);
if (multiplier.compareTo(Env.ONE) != 0)
LineNetAmt = LineNetAmt.multiply(multiplier);
if (m_pc.isService())
@ -246,13 +241,10 @@ public class Doc_MatchInv extends Doc
else
{
cr.setQty(getQty().negate());
BigDecimal effMultiplier = multiplier;
if (getQty().signum() < 0)
effMultiplier = effMultiplier.negate();
// Set AmtAcctCr/Dr from Invoice (sets also Project)
if (!cr.updateReverseLine (MInvoice.Table_ID, // Amt updated
m_invoiceLine.getC_Invoice_ID(), m_invoiceLine.getC_InvoiceLine_ID(), effMultiplier))
m_invoiceLine.getC_Invoice_ID(), m_invoiceLine.getC_InvoiceLine_ID(), multiplier))
{
p_Error = "Invoice not posted yet";
return null;
@ -454,8 +446,7 @@ public class Doc_MatchInv extends Doc
BigDecimal LineNetAmt = m_invoiceLine.getLineNetAmt();
BigDecimal multiplier = getQty()
.divide(m_invoiceLine.getQtyInvoiced(), 12, RoundingMode.HALF_UP)
.abs();
.divide(m_invoiceLine.getQtyInvoiced(), 12, RoundingMode.HALF_UP);
if (multiplier.compareTo(Env.ONE) != 0)
LineNetAmt = LineNetAmt.multiply(multiplier);
@ -470,7 +461,7 @@ public class Doc_MatchInv extends Doc
{
tQty = tQty.add(mInv[i].getQty());
multiplier = mInv[i].getQty()
.divide(m_invoiceLine.getQtyInvoiced(), 12, RoundingMode.HALF_UP).abs();
.divide(m_invoiceLine.getQtyInvoiced(), 12, RoundingMode.HALF_UP);
tAmt = tAmt.add(m_invoiceLine.getLineNetAmt().multiply(multiplier));
}
}

View File

@ -2880,6 +2880,11 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable
}
ScriptEngine engine = rule.getScriptEngine();
if (engine == null) {
retValue = "Callout Invalid, engine not found: " + rule.getEngineName();
log.log(Level.SEVERE, retValue);
return retValue;
}
// Window context are W_
// Login context are G_

View File

@ -274,7 +274,25 @@ public class MColumn extends X_AD_Column
return false;
}
}
if ( displayType == DisplayType.TableDir ||
(displayType == DisplayType.Search && getAD_Reference_Value_ID() <= 0))
{
// verify the foreign table exists
String foreignTableName = getReferenceTableName();
MTable foreignTable = MTable.get(getCtx(), foreignTableName);
if (foreignTable == null || foreignTable.getAD_Table_ID() <= 0) {
log.saveError("Error", Msg.getMsg(getCtx(), "NotReferenceTable", new Object[] {getColumnName()}));
return false;
}
}
if (displayType == DisplayType.Table && getAD_Reference_Value_ID() <= 0)
{
log.saveError("FillMandatory", Msg.getElement(getCtx(), "AD_Reference_Value_ID"));
return false;
}
if (displayType != DisplayType.Button)
{
if (! ISTOOLBARBUTTON_Window.equals(getIsToolbarButton()))

View File

@ -68,7 +68,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
/**
*
*/
private static final long serialVersionUID = -9210893813732918522L;
private static final long serialVersionUID = -3191227310812025813L;
/**
* Get Payments Of BPartner
@ -725,7 +725,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
}
m_lines = null;
} // renumberLines
/**
* Copy Lines From other Invoice.
* @param otherInvoice invoice
@ -733,7 +733,19 @@ public class MInvoice extends X_C_Invoice implements DocAction
* @param setOrder set order links
* @return number of lines copied
*/
public int copyLinesFrom (MInvoice otherInvoice, boolean counter, boolean setOrder)
public int copyLinesFrom (MInvoice otherInvoice, boolean counter, boolean setOrder){
return copyLinesFrom (otherInvoice, counter, setOrder, true);
}
/**
* Copy Lines From other Invoice.
* @param otherInvoice invoice
* @param counter create counter links
* @param setOrder set order links
* @param copyClientOrg copy also Client and Org
* @return number of lines copied
*/
public int copyLinesFrom (MInvoice otherInvoice, boolean counter, boolean setOrder, boolean copyClientOrg)
{
if (isProcessed() || isPosted() || otherInvoice == null)
return 0;
@ -743,7 +755,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
{
MInvoiceLine line = new MInvoiceLine (getCtx(), 0, get_TrxName());
MInvoiceLine fromLine = fromLines[i];
if (counter) // header
if (counter || !copyClientOrg) // header
PO.copyValues (fromLine, line, getAD_Client_ID(), getAD_Org_ID());
else
PO.copyValues (fromLine, line, fromLine.getAD_Client_ID(), fromLine.getAD_Org_ID());

View File

@ -230,9 +230,15 @@ public class MMatchInv extends X_M_MatchInv
{
MInOutLine line = new MInOutLine(getCtx(), getM_InOutLine_ID(), get_TrxName());
BigDecimal matchedQty = DB.getSQLValueBD(get_TrxName(), "SELECT Coalesce(SUM(Qty),0) FROM M_MatchInv WHERE M_InOutLine_ID=?" , getM_InOutLine_ID());
if (matchedQty != null && matchedQty.compareTo(line.getMovementQty()) > 0)
BigDecimal matchedQtyDB = matchedQty;
BigDecimal movementQty = line.getMovementQty();
if (movementQty.signum() < 0) {
movementQty = movementQty.negate();
matchedQty = matchedQty.negate();
}
if (matchedQty != null && matchedQty.compareTo(movementQty) > 0)
{
throw new IllegalStateException("Total matched qty > movement qty. MatchedQty="+matchedQty+", MovementQty="+line.getMovementQty()+", Line="+line);
throw new IllegalStateException("Total matched qty > movement qty. MatchedQty="+matchedQtyDB+", MovementQty="+line.getMovementQty()+", Line="+line);
}
}
@ -240,9 +246,15 @@ public class MMatchInv extends X_M_MatchInv
{
MInvoiceLine line = new MInvoiceLine(getCtx(), getC_InvoiceLine_ID(), get_TrxName());
BigDecimal matchedQty = DB.getSQLValueBD(get_TrxName(), "SELECT Coalesce(SUM(Qty),0) FROM M_MatchInv WHERE C_InvoiceLine_ID=?" , getC_InvoiceLine_ID());
if (matchedQty != null && matchedQty.compareTo(line.getQtyInvoiced()) > 0)
BigDecimal matchedQtyDB = matchedQty;
BigDecimal qtyInvoiced = line.getQtyInvoiced();
if (qtyInvoiced.signum() < 0) {
qtyInvoiced = qtyInvoiced.negate();
matchedQty = matchedQty.negate();
}
if (matchedQty != null && matchedQty.compareTo(qtyInvoiced) > 0)
{
throw new IllegalStateException("Total matched qty > invoiced qty. MatchedQty="+matchedQty+", InvoicedQty="+line.getQtyInvoiced()+", Line="+line);
throw new IllegalStateException("Total matched qty > invoiced qty. MatchedQty="+matchedQtyDB+", InvoicedQty="+line.getQtyInvoiced()+", Line="+line);
}
}
return true;

View File

@ -28,6 +28,7 @@ import java.util.logging.Level;
import javax.script.ScriptEngine;
import org.adempiere.apps.graph.GraphColumn;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.MeasureInterface;
import org.compiere.util.CCache;
import org.compiere.util.DB;
@ -613,6 +614,9 @@ public class MMeasure extends X_PA_Measure
break;
}
ScriptEngine engine = rule.getScriptEngine();
if (engine == null) {
throw new AdempiereException("Engine not found: " + rule.getEngineName());
}
MRule.setContext(engine, po.getCtx(), 0);
engine.put(MRule.ARGUMENTS_PREFIX + "Ctx", po.getCtx());
engine.put(MRule.ARGUMENTS_PREFIX + "PO", po);

View File

@ -34,8 +34,6 @@ import org.compiere.util.Util;
/**
* Persistent Rule Model
* @author Carlos Ruiz
* @author Silvano Trinchero, www.freepath.it
* <li>IDEMPIERE-3243 refactored getScriptEngine to use Core.getScriptEngine
* @version $Id: MRule.java
*
*/
@ -196,12 +194,9 @@ public class MRule extends X_AD_Rule
* @return ScriptEngine
*/
public ScriptEngine getScriptEngine() {
String engineName = getEngineName();
if(engineName != null)
if (engineName != null)
engine = Core.getScriptEngine(engineName);
return engine;
}

View File

@ -42,14 +42,15 @@ public class MSysConfig extends X_AD_SysConfig
/**
*
*/
private static final long serialVersionUID = 2856526441538434702L;
private static final long serialVersionUID = -1401329788730986024L;
public static final String ADDRESS_VALIDATION = "ADDRESS_VALIDATION";
public static final String ALERT_SEND_ATTACHMENT_AS_XLS = "ALERT_SEND_ATTACHMENT_AS_XLS";
public static final String ALLOCATION_DESCRIPTION = "ALLOCATION_DESCRIPTION";
public static final String ALLOW_APPLY_PAYMENT_TO_CREDITMEMO = "ALLOW_APPLY_PAYMENT_TO_CREDITMEMO";
public static final String ALLOW_OVER_APPLIED_PAYMENT = "ALLOW_OVER_APPLIED_PAYMENT";
public static final String ALogin_ShowOneRole = "ALogin_ShowOneRole";
public static final String ALogin_ShowDate = "ALogin_ShowDate";
public static final String ALogin_ShowOneRole = "ALogin_ShowOneRole"; // deprecated
public static final String APPLICATION_DATABASE_VERSION = "APPLICATION_DATABASE_VERSION";
public static final String APPLICATION_DATABASE_VERSION_SHOWN = "APPLICATION_DATABASE_VERSION_SHOWN";
public static final String APPLICATION_HOST_SHOWN = "APPLICATION_HOST_SHOWN";

View File

@ -35,6 +35,7 @@ import org.adempiere.base.event.IEventManager;
import org.adempiere.base.event.IEventTopics;
import org.adempiere.base.event.ImportEventData;
import org.adempiere.base.event.LoginEventData;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.model.ImportValidator;
import org.adempiere.process.ImportProcess;
import org.compiere.acct.Fact;
@ -241,6 +242,9 @@ public class ModelValidationEngine
String error;
try {
ScriptEngine engine = loginRule.getScriptEngine();
if (engine == null) {
throw new AdempiereException("Engine not found: " + loginRule.getEngineName());
}
MRule.setContext(engine, Env.getCtx(), 0); // no window
// now add the method arguments to the engine
@ -378,6 +382,9 @@ public class ModelValidationEngine
String error;
try {
ScriptEngine engine = rule.getScriptEngine();
if (engine == null) {
throw new AdempiereException("Engine not found: " + rule.getEngineName());
}
MRule.setContext(engine, po.getCtx(), 0); // no window
// now add the method arguments to the engine
@ -542,6 +549,9 @@ public class ModelValidationEngine
String error;
try {
ScriptEngine engine = rule.getScriptEngine();
if (engine == null) {
throw new AdempiereException("Engine not found: " + rule.getEngineName());
}
MRule.setContext(engine, po.getCtx(), 0); // no window
// now add the method arguments to the engine

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -85,13 +85,13 @@ public class RolePanel extends Window implements EventListener<Event>, Deferrabl
/**
*
*/
private static final long serialVersionUID = 372661654078492488L;
private static final long serialVersionUID = 4486118071892173802L;
protected LoginWindow wndLogin;
protected Login login;
protected Combobox lstRole, lstClient, lstOrganisation, lstWarehouse;
protected Label lblRole, lblClient, lblOrganisation, lblWarehouse, lblDate;
protected Label lblRole, lblClient, lblDef, lblOrganisation, lblWarehouse, lblDate;
protected WDateEditor lstDate;
protected Button btnOk, btnCancel;
@ -156,12 +156,10 @@ public class RolePanel extends Window implements EventListener<Event>, Deferrabl
AuFocus auf = null;
if (lstClient.getItemCount() > 1) {
auf = new AuFocus(lstClient);
} else if (lstRole.getItemCount() > 1) {
auf = new AuFocus(lstRole);
} else {
if (MSysConfig.getBooleanValue(MSysConfig.ALogin_ShowOneRole, true) || lstRole.getItemCount() > 1) {
auf = new AuFocus(lstRole);
} else {
auf = new AuFocus(lstOrganisation);
}
auf = new AuFocus(lstOrganisation);
}
Clients.response(auf);
} else {
@ -225,6 +223,19 @@ public class RolePanel extends Window implements EventListener<Event>, Deferrabl
tr.appendChild(td);
td.appendChild(lstRole);
tr = new Tr();
tr.setId("rowLabelDefault");
table.appendChild(tr);
//td = new Td();
//tr.appendChild(td);
td = new Td();
tr.appendChild(td);
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
div = new Div();
div.setStyle("text-align: right; text-decoration: underline");
div.appendChild(lblDef);
td.appendChild(div);
tr = new Tr();
tr.setId("rowOrganisation");
table.appendChild(tr);
@ -288,6 +299,10 @@ public class RolePanel extends Window implements EventListener<Event>, Deferrabl
lblRole.setId("lblRole");
lblRole.setValue(Msg.getMsg(language,"Role"));
lblDef = new Label();
lblDef.setId("lblDef");
lblDef.setValue(Msg.getMsg(language,"Defaults"));
lblOrganisation = new Label();
lblOrganisation.setId("lblOrganisation");
lblOrganisation.setValue(Msg.getMsg(language,"Organization"));
@ -373,14 +388,19 @@ public class RolePanel extends Window implements EventListener<Event>, Deferrabl
//
if (m_clientKNPairs!=null && m_clientKNPairs.length == 1) {
// don't show client if is just one
// disable client if is just one
lstClient.setSelectedIndex(0);
lblClient.setVisible(false);
lstClient.setVisible(false);
lstClient.setEnabled(false);
} else {
lblClient.setVisible(true);
lstClient.setVisible(true);
lstClient.setEnabled(true);
}
// Disable date combo-box at login screen
if (!MSysConfig.getBooleanValue(MSysConfig.ALogin_ShowDate, true))
{
lstDate.setReadWrite(false);
}
setUserID();
updateRoleList();
@ -425,18 +445,14 @@ public class RolePanel extends Window implements EventListener<Event>, Deferrabl
//force reload of default role
MRole.getDefault(m_ctx, true);
// If we have only one role, we can hide the combobox - metas-2009_0021_AP1_G94
if (m_clientKNPairs.length == 1 && lstRole.getItemCount() == 1 && ! MSysConfig.getBooleanValue(MSysConfig.ALogin_ShowOneRole, true))
// If we have only one role, we can make readonly the combobox
if (lstRole.getItemCount() == 1)
{
lstRole.setSelectedIndex(0);
lblRole.setVisible(false);
lstRole.setVisible(false);
}
else
{
lblRole.setVisible(true);
lstRole.setVisible(true);
lstRole.setEnabled(false);
} else {
lstRole.setEnabled(true);
}
}
setUserID();
@ -477,6 +493,15 @@ public class RolePanel extends Window implements EventListener<Event>, Deferrabl
lstOrganisation.setSelectedIndex(0);
}
}
// If we have only one org, we can make readonly the combobox
if (lstOrganisation.getItemCount() == 1)
{
lstOrganisation.setSelectedIndex(0);
lstOrganisation.setEnabled(false);
} else {
lstOrganisation.setEnabled(true);
}
//
}
updateWarehouseList();