/******************************************************************************
* 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 *
* Contributor(s): Teo Sarca *
*****************************************************************************/
package org.compiere.model;
import java.io.File;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.logging.Level;
import javax.mail.internet.InternetAddress;
import org.adempiere.exceptions.AdempiereException;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.EMail;
import org.compiere.util.Env;
import org.compiere.util.Language;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/**
* Client Model
*
* @author Jorg Janke
* @version $Id: MClient.java,v 1.2 2006/07/30 00:58:37 jjanke Exp $
*
* @author Carlos Ruiz - globalqss
* integrate bug fix reported by Teo Sarca
* [ 1619085 ] Client setup creates duplicate trees
* @author Teo Sarca, SC ARHIPAC SERVICE SRL
*
BF [ 1886480 ] Print Format Item Trl not updated even if not multilingual
*/
public class MClient extends X_AD_Client implements ImmutablePOSupport
{
/**
* generated serial id
*/
private static final long serialVersionUID = 2479547777642328967L;
/**
* Get client from cache (immutable)
* @param AD_Client_ID id
* @return client
*/
public static MClient get (int AD_Client_ID)
{
return get(Env.getCtx(), AD_Client_ID);
}
/**
* Get client from cache (immutable)
* @param ctx context
* @param AD_Client_ID id
* @return client
*/
public static MClient get (Properties ctx, int AD_Client_ID)
{
Integer key = Integer.valueOf(AD_Client_ID);
MClient client = (MClient)s_cache.get(ctx, key, e -> new MClient(ctx, e));
if (client != null)
return client;
client = new MClient (ctx, AD_Client_ID, (String)null);
s_cache.put (key, client, e -> new MClient(Env.getCtx(), e));
return client;
} // get
/**
* Get all clients
* @param ctx context
* @return clients
*/
public static MClient[] getAll (Properties ctx)
{
return getAll(ctx, "");
} // getAll
/**
* Get all clients
* @param ctx context
* @param orderBy by clause
* @return clients
*/
public static MClient[] getAll (Properties ctx, String orderBy)
{
List list = null;
try {
PO.setCrossTenantSafe();
list = new Query(ctx,I_AD_Client.Table_Name,(String)null,(String)null)
.setOrderBy(orderBy)
.list();
} finally {
PO.clearCrossTenantSafe();
}
for(MClient client:list ){
s_cache.put (Integer.valueOf(client.getAD_Client_ID()), client, e -> new MClient(Env.getCtx(), e));
}
MClient[] retValue = new MClient[list.size ()];
list.toArray (retValue);
return retValue;
} // getAll
/**
* Get a MClient object based on LoginPrefix
* @param loginPrefix
* @return MClient
*/
public static MClient getByLoginPrefix(String loginPrefix) {
MClient client = null;
try {
PO.setCrossTenantSafe();
client = new Query(Env.getCtx(), Table_Name, "LoginPrefix=?", (String)null)
.setOnlyActiveRecords(true)
.setParameters(loginPrefix)
.first();
} finally {
PO.clearCrossTenantSafe();
}
if (client != null ) {
Integer key = Integer.valueOf(client.getAD_Client_ID());
if (! s_cache.containsKey(key))
s_cache.put (Integer.valueOf(client.getAD_Client_ID()), client, e -> new MClient(Env.getCtx(), e));
}
return client;
}
/**
* Get optionally cached client
* @param ctx context
* @return client
*/
public static MClient get (Properties ctx)
{
return get (ctx, Env.getAD_Client_ID(ctx));
} // get
/** Static Logger */
@SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger (MClient.class);
/** Cache */
private static ImmutableIntPOCache s_cache = new ImmutableIntPOCache(Table_Name, 3, 0, false, 0);
/**
* Standard Constructor
* @param ctx context
* @param AD_Client_ID id
* @param createNew create new
* @param trxName transaction
*/
public MClient (Properties ctx, int AD_Client_ID, boolean createNew, String trxName)
{
super (ctx, AD_Client_ID, trxName);
m_createNew = createNew;
if (AD_Client_ID == 0)
{
if (m_createNew)
{
setAD_Org_ID(0);
setIsMultiLingualDocument (false);
setIsSmtpAuthorization (false);
setIsUseBetaFunctions (true);
setAD_Language(Language.getBaseAD_Language());
setAutoArchive(AUTOARCHIVE_None);
setMMPolicy (MMPOLICY_FiFo); // F
setIsPostImmediate(false);
}
else
load(get_TrxName());
}
} // MClient
/**
* UUID based Constructor
* @param ctx Context
* @param AD_Client_UU UUID key
* @param trxName Transaction
*/
public MClient(Properties ctx, String AD_Client_UU, String trxName) {
super(ctx, AD_Client_UU, trxName);
}
/**
* Standard Constructor
* @param ctx context
* @param AD_Client_ID id
* @param trxName transaction
*/
public MClient (Properties ctx, int AD_Client_ID, String trxName)
{
this (ctx, AD_Client_ID, false, trxName);
} // MClient
/**
* Load Constructor
* @param ctx context
* @param rs result set
* @param trxName transaction
*/
public MClient (Properties ctx, ResultSet rs, String trxName)
{
super (ctx, rs, trxName);
} // MClient
/**
* Constructor using AD_Client_ID from context (ctx)
* @param ctx context
* @param trxName transaction
*/
public MClient (Properties ctx, String trxName)
{
this (ctx, Env.getAD_Client_ID(ctx), trxName);
} // MClient
/**
* Copy constructor
* @param copy
*/
public MClient(MClient copy)
{
this(Env.getCtx(), copy);
}
/**
* Copy constructor
* @param ctx
* @param copy
*/
public MClient(Properties ctx, MClient copy)
{
this(ctx, copy, (String) null);
}
/**
* Copy constructor
* @param ctx
* @param copy
* @param trxName
*/
public MClient(Properties ctx, MClient copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_info = copy.m_info != null ? new MClientInfo(ctx, copy.m_info, trxName) : null;
this.m_AD_Tree_Account_ID = copy.m_AD_Tree_Account_ID;
this.m_fieldAccess = copy.m_fieldAccess != null ? new ArrayList(copy.m_fieldAccess) : null;
}
/** Client Info */
private MClientInfo m_info = null;
/** Language */
private Language m_language = null;
/** New Record */
private boolean m_createNew = false;
/** Client Info Setup Tree for Account */
private int m_AD_Tree_Account_ID;
/**
* Get Client Info
* @return Client Info
*/
public MClientInfo getInfo()
{
if (m_info == null)
{
if (is_Immutable())
m_info = MClientInfo.get (getCtx(), getAD_Client_ID(), get_TrxName());
else
m_info = MClientInfo.getCopy(getCtx(), getAD_Client_ID(), get_TrxName());
}
return m_info;
} // getMClientInfo
/**
* String Representation
* @return info
*/
@Override
public String toString()
{
StringBuilder sb = new StringBuilder ("MClient[")
.append(get_ID()).append("-").append(getValue())
.append("]");
return sb.toString();
} // toString
/**
* Get Default Accounting Currency (from AD_ClientInfo)
* @return currency or 0
*/
public int getC_Currency_ID()
{
if (m_info == null)
getInfo();
if (m_info != null)
return m_info.getC_Currency_ID();
return 0;
} // getC_Currency_ID
/**
* Get Language
* @return client language
*/
public Language getLanguage()
{
if (m_language == null)
{
m_language = Language.getLanguage(getAD_Language());
Env.verifyLanguage (getCtx(), m_language);
}
return m_language;
} // getLanguage
/**
* Set AD_Language
* @param AD_Language new language
*/
@Override
public void setAD_Language (String AD_Language)
{
m_language = null;
super.setAD_Language (AD_Language);
} // setAD_Language
/**
* Get AD_Language
* @return Language
*/
@Override
public String getAD_Language ()
{
String s = super.getAD_Language ();
if (s == null)
return Language.getBaseAD_Language();
return s;
} // getAD_Language
/**
* Get Locale
* @return client locale
*/
public Locale getLocale()
{
Language lang = getLanguage();
if (lang != null)
return lang.getLocale();
return Locale.getDefault();
} // getLocale
/**
* Create Trees and Setup Client Info
* @param language language
* @return true if created
*/
public boolean setupClientInfo (String language)
{
// Create Trees
StringBuilder sql = null;
if (Env.isBaseLanguage (language, "AD_Ref_List")) // Get TreeTypes & Name
sql = new StringBuilder("SELECT Value, Name FROM AD_Ref_List WHERE AD_Reference_ID=120 AND IsActive='Y'");
else
sql = new StringBuilder("SELECT l.Value, t.Name FROM AD_Ref_List l, AD_Ref_List_Trl t ")
.append("WHERE l.AD_Reference_ID=120 AND l.AD_Ref_List_ID=t.AD_Ref_List_ID AND l.IsActive='Y'")
.append(" AND t.AD_Language=").append(DB.TO_STRING(language));
// Tree IDs
int AD_Tree_Org_ID=0, AD_Tree_BPartner_ID=0, AD_Tree_Project_ID=0,
AD_Tree_SalesRegion_ID=0, AD_Tree_Product_ID=0,
AD_Tree_Campaign_ID=0, AD_Tree_Activity_ID=0;
boolean success = false;
PreparedStatement stmt = null;
ResultSet rs = null;
try
{
stmt = DB.prepareStatement(sql.toString(), get_TrxName());
rs = stmt.executeQuery();
MTree_Base tree = null;
while (rs.next())
{
String value = rs.getString(1);
StringBuilder name = new StringBuilder().append(getName()).append(" ").append(rs.getString(2));
//
if (value.equals(X_AD_Tree.TREETYPE_Organization))
{
tree = new MTree_Base (this, name.toString(), value);
success = tree.save();
AD_Tree_Org_ID = tree.getAD_Tree_ID();
}
else if (value.equals(X_AD_Tree.TREETYPE_BPartner))
{
tree = new MTree_Base (this, name.toString(), value);
success = tree.save();
AD_Tree_BPartner_ID = tree.getAD_Tree_ID();
}
else if (value.equals(X_AD_Tree.TREETYPE_Project))
{
tree = new MTree_Base (this, name.toString(), value);
success = tree.save();
AD_Tree_Project_ID = tree.getAD_Tree_ID();
}
else if (value.equals(X_AD_Tree.TREETYPE_SalesRegion))
{
tree = new MTree_Base (this, name.toString(), value);
success = tree.save();
AD_Tree_SalesRegion_ID = tree.getAD_Tree_ID();
}
else if (value.equals(X_AD_Tree.TREETYPE_Product))
{
tree = new MTree_Base (this, name.toString(), value);
success = tree.save();
AD_Tree_Product_ID = tree.getAD_Tree_ID();
}
else if (value.equals(X_AD_Tree.TREETYPE_ElementValue))
{
tree = new MTree_Base (this, name.toString(), value);
success = tree.save();
m_AD_Tree_Account_ID = tree.getAD_Tree_ID();
}
else if (value.equals(X_AD_Tree.TREETYPE_Campaign))
{
tree = new MTree_Base (this, name.toString(), value);
success = tree.save();
AD_Tree_Campaign_ID = tree.getAD_Tree_ID();
}
else if (value.equals(X_AD_Tree.TREETYPE_Activity))
{
tree = new MTree_Base (this, name.toString(), value);
success = tree.save();
AD_Tree_Activity_ID = tree.getAD_Tree_ID();
}
else if ( value.equals(X_AD_Tree.TREETYPE_Menu) // No Menu
|| value.equals(X_AD_Tree.TREETYPE_CustomTable) // No Custom Table
|| value.equals(X_AD_Tree.TREETYPE_User1) // No custom user trees
|| value.equals(X_AD_Tree.TREETYPE_User2)
|| value.equals(X_AD_Tree.TREETYPE_User3)
|| value.equals(X_AD_Tree.TREETYPE_User4)
)
success = true;
else // PC (Product Category), BB (BOM)
{
tree = new MTree_Base (this, name.toString(), value);
success = tree.save();
}
if (!success)
{
log.log(Level.SEVERE, "Tree NOT created: " + name);
break;
}
}
}
catch (SQLException e1)
{
log.log(Level.SEVERE, "Trees", e1);
success = false;
}
finally
{
DB.close(rs, stmt);
rs = null;
stmt = null;
}
if (!success)
return false;
// Create ClientInfo
MClientInfo clientInfo = new MClientInfo (this,
AD_Tree_Org_ID, AD_Tree_BPartner_ID, AD_Tree_Project_ID,
AD_Tree_SalesRegion_ID, AD_Tree_Product_ID,
AD_Tree_Campaign_ID, AD_Tree_Activity_ID, get_TrxName());
int defaultStorageProvider = MStorageProvider.getDefaultStorageProviderID();
if (defaultStorageProvider > 0)
{
clientInfo.setAD_StorageProvider_ID(defaultStorageProvider);
clientInfo.setStorageImage_ID(defaultStorageProvider);
clientInfo.setStorageArchive_ID(defaultStorageProvider);
}
success = clientInfo.save();
return success;
} // createTrees
/**
* Get AD_Tree_Account_ID created in setup client info
* @return Account Tree ID
*/
public int getSetup_AD_Tree_Account_ID()
{
return m_AD_Tree_Account_ID;
} // getSetup_AD_Tree_Account_ID
/**
* Is Auto Archive on
* @return true if auto archive
*/
public boolean isAutoArchive()
{
String aa = getAutoArchive();
return aa != null && !aa.equals(AUTOARCHIVE_None);
} // isAutoArchive
/**
* Get Primary Accounting Schema (from AD_ClientInfo)
* @return Acct Schema or null
*/
public MAcctSchema getAcctSchema()
{
if (m_info == null)
m_info = MClientInfo.get (getCtx(), getAD_Client_ID(), get_TrxName());
if (m_info != null)
{
int C_AcctSchema_ID = m_info.getC_AcctSchema1_ID();
if (C_AcctSchema_ID != 0)
return MAcctSchema.getCopy(getCtx(), C_AcctSchema_ID, get_TrxName());
}
return null;
} // getMClientInfo
/**
* Save
* @return true if saved
*/
@Override
public boolean save ()
{
if (get_ID() == 0 && !m_createNew)
return saveUpdate();
return super.save ();
} // save
/**
* Test EMail
* @return OK or error
*/
public String testEMail()
{
if (getRequestEMail() == null || getRequestEMail().length() == 0){
StringBuilder msgreturn = new StringBuilder("No Request EMail for ").append(getName());
return msgreturn.toString();
}
//
String systemName = MSystem.get(getCtx()).getName();
StringBuilder subject = new StringBuilder(systemName).append(" EMail Test");
StringBuilder msgce = new StringBuilder(systemName).append(" EMail Test: ").append(toString());
int mailtextID = MSysConfig.getIntValue(MSysConfig.EMAIL_TEST_MAILTEXT_ID, 0, getAD_Client_ID());
if (mailtextID > 0) {
MMailText mt = new MMailText(getCtx(), mailtextID, get_TrxName());
mt.setPO(this);
subject = new StringBuilder(mt.getMailHeader());
msgce = new StringBuilder(mt.getMailText(true));
}
EMail email = createEMail (getRequestEMail(), subject.toString(), msgce.toString());
if (email == null){
StringBuilder msgreturn = new StringBuilder("Could not create EMail: ").append(getName());
return msgreturn.toString();
}
try
{
String msg = email.send();
if (EMail.SENT_OK.equals (msg))
{
if (log.isLoggable(Level.INFO)) log.info("Sent Test EMail to " + getRequestEMail());
return "";
}
else
{
log.warning("Could NOT send Test EMail from "
+ getSMTPHost() + ": " + getRequestEMail()
+ " (" + getRequestUser()
+ ") to " + getRequestEMail() + ": " + msg);
return msg;
}
}
catch (Exception ex)
{
throw new AdempiereException(ex);
}
} // testEMail
/**
* Send EMail from Request User - with trace
* @param AD_User_ID recipient
* @param subject subject
* @param message message
* @param attachment optional attachment
* @return true if sent
*/
public boolean sendEMail (int AD_User_ID,
String subject, String message, File attachment)
{
Collection attachments = new ArrayList();
if (attachment != null)
attachments.add(attachment);
return sendEMailAttachments(AD_User_ID, subject, message, attachments);
}
/**
* Send EMail from Request User - with trace
* @param AD_User_ID recipient
* @param subject subject
* @param message message
* @param attachments optional collection of attachments
* @return true if sent
*/
public boolean sendEMailAttachments (int AD_User_ID,
String subject, String message, Collection attachments)
{
return sendEMailAttachments(AD_User_ID, subject, message, attachments, false);
}
/**
* Send EMail from Request User - with trace
* @param AD_User_ID recipient
* @param subject subject
* @param message message
* @param attachments optional collection of attachments
* @param html
* @return true if sent
*/
public boolean sendEMailAttachments (int AD_User_ID,
String subject, String message, Collection attachments, boolean html)
{
MUser to = MUser.get(getCtx(), AD_User_ID);
String toEMail = to.getEMail();
if (toEMail == null || toEMail.length() == 0)
{
log.warning("No EMail for recipient: " + to);
return false;
}
EMail email = createEMail(null, to, subject, message, html);
if (email == null)
return false;
email.addAttachments(attachments);
try
{
return sendEmailNow(null, to, email);
}
catch (Exception ex)
{
log.severe(getName() + " - " + ex.getLocalizedMessage());
return false;
}
} // sendEMail
/**
* Send EMail from User
* @param from sender
* @param to recipient
* @param subject subject
* @param message message
* @param attachments optional attachment
* @return true if sent
*/
public boolean sendEMailAttachments (MUser from, MUser to,
String subject, String message, List attachments)
{
return sendEMailAttachments(from, to, subject, message, attachments, false);
}
/**
* Send EMail from User
* @param from sender
* @param to recipient
* @param subject subject
* @param message message
* @param attachments optional attachment
* @param isHtml
* @return true if sent
*/
public boolean sendEMailAttachments (MUser from, MUser to,
String subject, String message, List attachments, boolean isHtml)
{
EMail email = createEMail(from, to, subject, message, isHtml);
if (email == null)
return false;
if (attachments != null && !attachments.isEmpty())
{
for (File attachment : attachments)
email.addAttachment(attachment);
}
InternetAddress emailFrom = email.getFrom();
try
{
return sendEmailNow(from, to, email);
}
catch (Exception ex)
{
log.severe(getName() + " - from " + emailFrom
+ " to " + to + ": " + ex.getLocalizedMessage());
return false;
}
} // sendEMail
/**
* Send EMail from Request User - no trace
* @param to recipient email address
* @param subject subject
* @param message message
* @param attachment optional attachment
* @return true if sent
*/
public boolean sendEMail (String to,
String subject, String message, File attachment)
{
return sendEMail(to, subject, message, attachment, false);
}
/**
* Send EMail from Request User - no trace
* @param to recipient email address
* @param subject subject
* @param message message
* @param attachment optional attachment
* @param html
* @return true if sent
*/
public boolean sendEMail (String to,
String subject, String message, File attachment, boolean html)
{
EMail email = createEMail(to, subject, message, html);
if (email == null)
return false;
if (attachment != null)
email.addAttachment(attachment);
try
{
String msg = email.send();
if (EMail.SENT_OK.equals (msg))
{
if (log.isLoggable(Level.INFO)) log.info("Sent EMail " + subject + " to " + to);
return true;
}
else
{
log.warning("Could NOT Send Email: " + subject
+ " to " + to + ": " + msg
+ " (" + getName() + ")");
return false;
}
}
catch (Exception ex)
{
ex.printStackTrace();
log.log(Level.SEVERE, getName() + " - " + ex.getLocalizedMessage(), ex);
return false;
}
} // sendEMail
/**
* Send EMail from User
* @param from sender
* @param to recipient
* @param subject subject
* @param message message
* @param attachment optional attachment
* @return true if sent
*/
public boolean sendEMail (MUser from, MUser to,
String subject, String message, File attachment)
{
return sendEMail(from, to, subject, message, attachment, false);
}
/**
* Send EMail from User
* @param from sender
* @param to recipient
* @param subject subject
* @param message message
* @param attachment optional attachment
* @param isHtml
* @return true if sent
*/
public boolean sendEMail (MUser from, MUser to,
String subject, String message, File attachment, boolean isHtml)
{
EMail email = createEMail(from, to, subject, message, isHtml);
if (email == null)
return false;
if (attachment != null)
email.addAttachment(attachment);
InternetAddress emailFrom = email.getFrom();
try
{
return sendEmailNow(from, to, email);
}
catch (Exception ex)
{
log.severe(getName() + " - from " + emailFrom
+ " to " + to + ": " + ex.getLocalizedMessage());
return false;
}
} // sendEMail
/**
* Send Email Now
* @param from optional from user
* @param to to user
* @param email email
* @return true if sent
*/
public boolean sendEmailNow(MUser from, MUser to, EMail email)
{
String msg = email.send();
//
X_AD_UserMail um = new X_AD_UserMail(getCtx(), 0, to.get_TrxName());
um.setClientOrg(this);
um.setAD_User_ID(to.getAD_User_ID());
um.setSubject(email.getSubject());
um.setMailText(email.getMessageCRLF());
um.setMailText(email.getMessageCRLF());
um.setEMailFrom(email.getFrom().toString());
um.setRecipientTo(MUserMail.getRecipientWithCommaSeparator(email.getTos()));
um.setRecipientCc(MUserMail.getRecipientWithCommaSeparator(email.getCcs()));
um.setRecipientBcc(MUserMail.getRecipientWithCommaSeparator(email.getBccs()));
if (email.isSentOK())
um.setMessageID(email.getMessageID());
else
{
um.setMessageID(email.getSentMsg());
um.setIsDelivered(X_AD_UserMail.ISDELIVERED_No);
}
um.saveEx();
//
if (email.isSentOK())
{
if (from != null) {
if (log.isLoggable(Level.INFO)) log.info("Sent Email: " + email.getSubject()
+ " from " + from.getEMail()
+ " to " + to.getEMail());
} else {
if (log.isLoggable(Level.INFO)) log.info("Sent Email: " + email.getSubject()
+ " to " + to.getEMail());
}
return true;
}
else
{
if (from != null)
log.warning("Could NOT Send Email: " + email.getSubject()
+ " from " + from.getEMail()
+ " to " + to.getEMail() + ": " + msg
+ " (" + getName() + ")");
else
log.warning("Could NOT Send Email: " + email.getSubject()
+ " to " + to.getEMail() + ": " + msg
+ " (" + getName() + ")");
return false;
}
} // sendEmailNow
/**
* Create EMail from Request User
* @param to recipient
* @param subject subject
* @param message message
* @return EMail
*/
public EMail createEMail (String to,
String subject, String message)
{
return createEMail(to, subject, message, false);
}
/**
* Create EMail from Request User
* @param to recipient
* @param subject subject
* @param message message
* @param html
* @return EMail
*/
public EMail createEMail (String to,
String subject, String message, boolean html)
{
if (to == null || to.length() == 0)
{
log.warning("No To");
return null;
}
//
EMail email = new EMail (this,
getRequestEMail(), to,
subject, message, html);
if (isSmtpAuthorization())
email.createAuthenticator (getRequestUser(), getRequestUserPW());
return email;
} // createEMail
/**
* Create EMail with a specific from address
* @param from recipient
* @param to recipient
* @param subject subject
* @param message message
* @param html
* @return EMail
*/
public EMail createEMailFrom (String from, String to,
String subject, String message, boolean html)
{
if (from == null || from.length() == 0)
{
log.warning("No From");
return null;
}
if (to == null || to.length() == 0)
{
log.warning("No To");
return null;
}
//
EMail email = new EMail (this,
from, to,
subject, message, html);
MSMTP smtp = MSMTP.get(getCtx(), getAD_Client_ID(), from, get_TrxName());
if (smtp != null && smtp.isSmtpAuthorization())
email.createAuthenticator (smtp.getRequestUser(), smtp.getRequestUserPW());
else if (isSmtpAuthorization())
email.createAuthenticator (getRequestUser(), getRequestUserPW());
return email;
} // createEMailFrom
/**
* Create EMail from User
* @param from optional sender
* @param to recipient
* @param subject subject
* @param message message
* @return EMail
*/
public EMail createEMail (MUser from, MUser to,
String subject, String message)
{
return createEMail(from, to, subject, message, false);
}
/**
* Create EMail from User
* @param from optional sender
* @param to recipient
* @param subject subject
* @param message message
* @param html
* @return EMail
*/
public EMail createEMail (MUser from, MUser to,
String subject, String message, boolean html)
{
if (to == null)
{
log.warning("No To user");
return null;
}
if (to.getEMail() == null || to.getEMail().length() == 0)
{
log.warning("No To address: " + to);
return null;
}
return createEMail (from, to.getEMail(), subject, message, html);
} // createEMail
/**
* Create EMail from User
* @param from optional sender
* @param to recipient
* @param subject subject
* @param message message
* @return EMail
*/
public EMail createEMail (MUser from, String to,
String subject, String message)
{
return createEMail(from, to, subject, message, false);
}
/**
* Create EMail from User
* @param from optional sender
* @param to recipient
* @param subject subject
* @param message message
* @param html
* @return EMail
*/
public EMail createEMail (MUser from, String to,
String subject, String message, boolean html)
{
if (to == null || to.length() == 0)
{
log.warning("No To address");
return null;
}
// No From - send from Request
if (from == null)
return createEMail (to, subject, message, html);
// No From details - Error
if (from.getEMail() == null
|| from.getEMailUser() == null
|| (isSmtpAuthorization() && from.getEMailUserPW() == null) ) // is SMTP authorization and password is null - teo_sarca [ 1723309 ]
{
log.warning("From EMail incomplete: " + from + " (" + getName() + ")");
return null;
}
//
EMail email = new EMail (this,
from.getEMail(),
to,
subject,
message, html);
if (isSmtpAuthorization())
email.createAuthenticator (from.getEMailUser(), from.getEMailUserPW());
if (from.getEMail() != null && ! from.getEMail().equalsIgnoreCase(from.getEMailUser())) {
email.setReplyTo(from.getEMail());
}
return email;
} // createEMail
/*
* Is Client Accounting enabled?
* CLIENT_ACCOUNTING parameter allow the next values
* D - Disabled (default)
* Q - Queue (enabled to post by hand - queue documents for posterior processing)
* I - Immediate (immediate post - allow complete on errors)
*
* @return boolean representing if client accounting is enabled and it's on a client
*/
private static final String CLIENT_ACCOUNTING_QUEUE = "Q";
private static final String CLIENT_ACCOUNTING_IMMEDIATE = "I";
/**
* @return true if posting is using {@link #CLIENT_ACCOUNTING_IMMEDIATE} or {@link #CLIENT_ACCOUNTING_QUEUE}
*/
public static boolean isClientAccounting() {
String ca = MSysConfig.getValue(MSysConfig.CLIENT_ACCOUNTING,
CLIENT_ACCOUNTING_QUEUE, // default
Env.getAD_Client_ID(Env.getCtx()));
return (ca.equalsIgnoreCase(CLIENT_ACCOUNTING_IMMEDIATE) || ca.equalsIgnoreCase(CLIENT_ACCOUNTING_QUEUE));
}
/**
* @return true if posting is using {@link #CLIENT_ACCOUNTING_QUEUE}
*/
public static boolean isClientAccountingQueue() {
String ca = MSysConfig.getValue(MSysConfig.CLIENT_ACCOUNTING,
CLIENT_ACCOUNTING_QUEUE, // default
Env.getAD_Client_ID(Env.getCtx()));
return ca.equalsIgnoreCase(CLIENT_ACCOUNTING_QUEUE);
}
/**
* @return true if posting is using {@link #CLIENT_ACCOUNTING_IMMEDIATE}
*/
public static boolean isClientAccountingImmediate() {
String ca = MSysConfig.getValue(MSysConfig.CLIENT_ACCOUNTING,
CLIENT_ACCOUNTING_QUEUE, // default
Env.getAD_Client_ID(Env.getCtx()));
return ca.equalsIgnoreCase(CLIENT_ACCOUNTING_IMMEDIATE);
}
/* 2870483 - SaaS too slow opening windows */
/** Field Access */
private ArrayList m_fieldAccess = null;
/**
* Define is a field is displayed based on ASP rules
* @param aDFieldID
* @return boolean indicating if it's displayed or not
*/
public boolean isDisplayField(int aDFieldID) {
if (! isUseASP())
return true;
if (m_fieldAccess == null)
{
m_fieldAccess = new ArrayList(11000);
StringBuilder sqlvalidate = new StringBuilder(
"SELECT AD_Field_ID ")
.append(" FROM AD_Field ")
.append(" WHERE ( AD_Field_ID NOT IN ( ")
// ASP subscribed fields for client)
.append(" SELECT f.AD_Field_ID ")
.append(" FROM ASP_Field f, ASP_Tab t, ASP_Window w, ASP_Level l, ASP_ClientLevel cl ")
.append(" WHERE w.ASP_Level_ID = l.ASP_Level_ID ")
.append(" AND cl.AD_Client_ID = ").append(getAD_Client_ID())
.append(" AND cl.ASP_Level_ID = l.ASP_Level_ID ")
.append(" AND f.ASP_Tab_ID = t.ASP_Tab_ID ")
.append(" AND t.ASP_Window_ID = w.ASP_Window_ID ")
.append(" AND f.IsActive = 'Y' ")
.append(" AND t.IsActive = 'Y' ")
.append(" AND w.IsActive = 'Y' ")
.append(" AND l.IsActive = 'Y' ")
.append(" AND cl.IsActive = 'Y' ")
.append(" AND f.ASP_Status = 'H' ")
.append(" AND f.AD_Field_ID NOT IN (")
.append(" SELECT AD_Field_ID")
.append(" FROM ASP_ClientException ce")
.append(" WHERE ce.AD_Client_ID =").append(getAD_Client_ID())
.append(" AND ce.IsActive = 'Y'")
.append(" AND ce.AD_Field_ID IS NOT NULL")
.append(" AND ce.ASP_Status <> 'H')")
.append(" UNION ALL ")
// minus ASP hide exceptions for client
.append(" SELECT AD_Field_ID ")
.append(" FROM ASP_ClientException ce ")
.append(" WHERE ce.AD_Client_ID = ").append(getAD_Client_ID())
.append(" AND ce.IsActive = 'Y' ")
.append(" AND ce.AD_Field_ID IS NOT NULL ")
.append(" AND ce.ASP_Status = 'H'))")
.append(" ORDER BY AD_Field_ID");
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sqlvalidate.toString(), get_TrxName());
rs = pstmt.executeQuery();
while (rs.next())
m_fieldAccess.add(rs.getInt(1));
}
catch (Exception e)
{
log.log(Level.SEVERE, sqlvalidate.toString(), e);
}
finally
{
DB.close(rs, pstmt);
}
}
return (Collections.binarySearch(m_fieldAccess, aDFieldID) > 0);
}
@Override
public String getRequestUser() {
// IDEMPIERE-722
if (getAD_Client_ID() != 0 && isSendCredentialsSystem()) {
MClient sysclient = MClient.get(getCtx(), 0);
return sysclient.getRequestUser();
}
return super.getRequestUser();
}
@Override
public String getRequestUserPW() {
// IDEMPIERE-722
if (getAD_Client_ID() != 0 && isSendCredentialsSystem()) {
MClient sysclient = MClient.get(getCtx(), 0);
return sysclient.getRequestUserPW();
}
return super.getRequestUserPW();
}
@Override
public boolean isSmtpAuthorization() {
// IDEMPIERE-722
if (getAD_Client_ID() != 0 && isSendCredentialsSystem()) {
MClient sysclient = MClient.get(getCtx(), 0);
return sysclient.isSmtpAuthorization();
}
return super.isSmtpAuthorization();
}
@Override
public int getSMTPPort() {
// IDEMPIERE-722
if (getAD_Client_ID() != 0 && isSendCredentialsSystem()) {
MClient sysclient = MClient.get(getCtx(), 0);
return sysclient.getSMTPPort();
}
return super.getSMTPPort();
}
@Override
public boolean isSecureSMTP() {
// IDEMPIERE-722
if (getAD_Client_ID() != 0 && isSendCredentialsSystem()) {
MClient sysclient = MClient.get(getCtx(), 0);
return sysclient.isSecureSMTP();
}
return super.isSecureSMTP();
}
/**
* Get SMTP Host
* @return SMTP or localhost
*/
@Override
public String getSMTPHost() {
String s = null;
if (getAD_Client_ID() != 0 && isSendCredentialsSystem()) {
MClient sysclient = MClient.get(getCtx(), 0);
s = sysclient.getSMTPHost();
} else {
s = super.getSMTPHost();
}
if (s == null)
s = "localhost";
return s;
} // getSMTPHost
@Override
public MClient markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
if (m_info != null)
m_info.markImmutable();
return this;
}
// IDEMPIERE-722
private static final String MAIL_SEND_CREDENTIALS_USER = "U";
private static final String MAIL_SEND_CREDENTIALS_CLIENT = "C";
private static final String MAIL_SEND_CREDENTIALS_SYSTEM = "S";
/**
* @return true if mail send credential is using {@link #MAIL_SEND_CREDENTIALS_CLIENT}
*/
public static boolean isSendCredentialsClient() {
String msc = MSysConfig.getValue(MSysConfig.MAIL_SEND_CREDENTIALS,
MAIL_SEND_CREDENTIALS_USER, // default
Env.getAD_Client_ID(Env.getCtx()));
return (MAIL_SEND_CREDENTIALS_CLIENT.equalsIgnoreCase(msc));
}
/**
* @return true if mail send credential is using {@link #MAIL_SEND_CREDENTIALS_SYSTEM}
*/
public static boolean isSendCredentialsSystem() {
String msc = MSysConfig.getValue(MSysConfig.MAIL_SEND_CREDENTIALS,
MAIL_SEND_CREDENTIALS_USER, // default
Env.getAD_Client_ID(Env.getCtx()));
return (MAIL_SEND_CREDENTIALS_SYSTEM.equalsIgnoreCase(msc));
}
} // MClient