package com.idega.block.trade.stockroom.business;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.ejb.FinderException;
import javax.transaction.SystemException;
import javax.transaction.TransactionManager;
import com.idega.block.trade.stockroom.data.Reseller;
import com.idega.block.trade.stockroom.data.ResellerStaffGroup;
import com.idega.block.trade.stockroom.data.ResellerStaffGroupHome;
import com.idega.block.trade.stockroom.data.Supplier;
import com.idega.business.IBOLookup;
import com.idega.business.IBOLookupException;
import com.idega.business.IBORuntimeException;
import com.idega.business.IBOServiceBean;
import com.idega.core.accesscontrol.business.LoginDBHandler;
import com.idega.core.contact.data.Email;
import com.idega.core.contact.data.Phone;
import com.idega.core.data.GenericGroup;
import com.idega.core.location.data.Address;
import com.idega.core.user.business.UserGroupBusiness;
import com.idega.data.EntityControl;
import com.idega.data.EntityFinder;
import com.idega.data.GenericEntity;
import com.idega.data.IDOLookup;
import com.idega.data.SimpleQuerier;
import com.idega.transaction.IdegaTransactionManager;
import com.idega.user.business.GroupBusiness;
import com.idega.user.business.UserBusiness;
import com.idega.user.data.Group;
import com.idega.user.data.GroupHome;
import com.idega.user.data.User;
import com.idega.util.CypherText;
import com.idega.util.IWTimestamp;
//import is.idega.idegaweb.travel.data.Contract;
/**
* Title: idegaWeb TravelBooking
* Description:
* Copyright: Copyright (c) 2001
* Company: idega
* @author <a href="mailto:gimmi@idega.is">Grimur Jonsson</a>
* @version 1.0
*/
public class ResellerManagerBean extends IBOServiceBean implements ResellerManager{
public static String permissionGroupNameExtention = " - admins";
private static String permissionGroupDescription = "Reseller administator group";
/**
* @deprecated
*/
public boolean deleteReseller(int id) {
try {
return deleteReseller(((com.idega.block.trade.stockroom.data.ResellerHome)com.idega.data.IDOLookup.getHomeLegacy(Reseller.class)).findByPrimaryKeyLegacy(id));
}catch (SQLException sql) {
sql.printStackTrace(System.err);
return false;
}
}
public boolean deleteReseller(Reseller reseller) {
TransactionManager tm = IdegaTransactionManager.getInstance();
try {
tm.begin();
reseller.setIsValid(false);
reseller.update();
List users = getUsers(reseller);
if (users != null) {
for (int i = 0; i < users.size(); i++) {
LoginDBHandler.deleteUserLogin( ((User) users.get(i)).getID() );
}
}
Group pGroup = getPermissionGroup(reseller);
pGroup.setName(pGroup.getName()+"_deleted");
pGroup.store();
ResellerStaffGroup sGroup = getResellerStaffGroup(reseller);
sGroup.setName(sGroup.getName()+"_deleted");
sGroup.store();
tm.commit();
return true;
}catch (Exception e) {
e.printStackTrace(System.err);
try {
tm.rollback();
}catch (SystemException se) {
se.printStackTrace(System.err);
}
return false;
}
}
public Reseller updateReseller(int resellerId, String name, String description, int[] addressIds, int[] phoneIds, int[] emailIds, String organizationID) throws Exception {
return createReseller(resellerId, null, name, null,null, description, addressIds, phoneIds, emailIds, organizationID);
}
public Reseller createReseller(Reseller parentReseller, String name, String userName, String password, String description, int[] addressIds, int[] phoneIds, int[] emailIds, String organizationID) throws Exception {
return createReseller(-1, parentReseller, name, userName, password, description, addressIds, phoneIds, emailIds, organizationID);
}
private Reseller createReseller(int resellerId, Reseller parentReseller, String name, String userName, String password, String description, int[] addressIds, int[] phoneIds, int[] emailIds, String organizationID) throws Exception {
boolean isUpdate = false;
if (resellerId != -1) {
isUpdate = true;
}
if (description == null) {
description = "";
}
if (isUpdate) {
Reseller res = ((com.idega.block.trade.stockroom.data.ResellerHome)com.idega.data.IDOLookup.getHomeLegacy(Reseller.class)).findByPrimaryKeyLegacy(resellerId);
res.setName(name);
res.setDescription(description);
if (organizationID != null) {
res.setOrganizationID(organizationID);
}
res.update();
res.removeFrom(GenericEntity.getStaticInstance(Address.class));
for (int i = 0; i < addressIds.length; i++) {
res.addTo(Address.class, addressIds[i]);
}
res.removeFrom(GenericEntity.getStaticInstance(Phone.class));
for (int i = 0; i < phoneIds.length; i++) {
res.addTo(Phone.class, phoneIds[i]);
}
res.removeFrom(GenericEntity.getStaticInstance(Email.class));
for (int i = 0; i < emailIds.length; i++) {
res.addTo(Email.class, emailIds[i]);
}
return res;
}
else {
Reseller reseller = ((com.idega.block.trade.stockroom.data.ResellerHome)com.idega.data.IDOLookup.getHome(Reseller.class)).create();
CypherText cyph = new CypherText();
String key = cyph.getKey(10);
String[] check = SimpleQuerier.executeStringQuery("SELECT "+reseller.getIDColumnName()+" from "+com.idega.block.trade.stockroom.data.ResellerBMPBean.getResellerTableName()+" where "+com.idega.block.trade.stockroom.data.ResellerBMPBean.getColumnNameReferenceNumber()+" = '"+key+"'");
while (check.length > 0) {
cyph.getKey(10);
check = SimpleQuerier.executeStringQuery("SELECT "+reseller.getIDColumnName()+" from "+com.idega.block.trade.stockroom.data.ResellerBMPBean.getResellerTableName()+" where "+com.idega.block.trade.stockroom.data.ResellerBMPBean.getColumnNameReferenceNumber()+" = '"+key+"'");
}
reseller.setName(name);
reseller.setDescription(description);
reseller.setIsValid(true);
reseller.setReferenceNumber(key);
reseller.insert();
ResellerStaffGroup sGroup = ((ResellerStaffGroupHome)com.idega.data.IDOLookup.getHome(ResellerStaffGroup.class)).create();
sGroup.setName(name+"_"+reseller.getID());
sGroup.store();
if (parentReseller != null) {
parentReseller.addChild(reseller);
}
User user = getUserBusiness().insertUser(name,"","- admin",name+" - admin","Reseller administrator",null,IWTimestamp.RightNow(),null);
LoginDBHandler.createLogin(user.getID(), userName, password);
Group pGroup = ((GroupHome) IDOLookup.getHome(Group.class)).create();
pGroup.setName(name+"_"+reseller.getID()+permissionGroupNameExtention);
pGroup.setDescription(permissionGroupDescription);
pGroup.store();
pGroup.addGroup(user);
sGroup.addGroup(user);
// int[] userIDs = {user.getID()};
// AccessControl ac = new AccessControl();
// ac.createPermissionGroup(name+"_"+reseller.getID()+permissionGroupNameExtention, permissionGroupDescription, "", userIDs ,null);
if(addressIds != null){
for (int i = 0; i < addressIds.length; i++) {
reseller.addTo(Address.class, addressIds[i]);
}
}
if(phoneIds != null){
for (int i = 0; i < phoneIds.length; i++) {
reseller.addTo(Phone.class, phoneIds[i]);
}
}
if(emailIds != null){
for (int i = 0; i < emailIds.length; i++) {
reseller.addTo(Email.class, emailIds[i]);
}
}
reseller.setGroupId(((Integer)sGroup.getPrimaryKey()).intValue());
if (organizationID != null) {
reseller.setOrganizationID(organizationID);
}
reseller.update();
return reseller;
}
}
public void invalidateReseller(Reseller reseller) throws SQLException {
if (!deleteReseller(reseller)) {
throw new SQLException("InvalidateReseller");
}
}
public void validateReseller(Reseller reseller) throws SQLException {
reseller.setIsValid(true);
reseller.update();
}
/**
* @deprecated
*/
public void updateSupplier(Supplier supplier, String name, String description, int[] addressIds, int[] phoneIds, int[] emailIds) throws Exception {
supplier.setName(name);
supplier.setDescription(description);
supplier.update();
/**
* implementa
*/
/*
supplier.reverseRemoveFrom(com.idega.core.data.AddressBMPBean.getStaticInstance(Address.class));
if(addressIds != null){
for (int i = 0; i < addressIds.length; i++) {
supplier.addTo(Address.class, addressIds[i]);
}
}
if(phoneIds != null){
if (phoneIds.length == 0) {
supplier.reverseRemoveFrom(com.idega.core.data.PhoneBMPBean.getStaticInstance(Phone.class));
}
}
if(emailIds != null){
if (emailIds.length == 0) {
supplier.reverseRemoveFrom(com.idega.core.data.PhoneBMPBean.getStaticInstance(Email.class));
}
}
*/
}
public Supplier[] getSuppliers(int resellerId) {
return getSuppliers(resellerId,"");
}
public Supplier[] getSuppliers(int resellerId, String orderBy) {
Supplier[] suppliers = {};
try {
Reseller reseller = (Reseller) GenericEntity.getStaticInstance(Reseller.class);
Supplier supplier = (Supplier) GenericEntity.getStaticInstance(Supplier.class);
StringBuffer sql = new StringBuffer();
sql.append("Select s.* from "+com.idega.block.trade.stockroom.data.ResellerBMPBean.getResellerTableName()+" r, "+com.idega.block.trade.stockroom.data.SupplierBMPBean.getSupplierTableName()+" s, ");
sql.append(EntityControl.getManyToManyRelationShipTableName(Reseller.class, Supplier.class)+" rs");
sql.append(" WHERE ");
sql.append(" r."+reseller.getIDColumnName()+" = "+resellerId);
sql.append(" AND ");
sql.append(" s."+supplier.getIDColumnName()+" = rs."+supplier.getIDColumnName());
sql.append(" AND ");
sql.append(" r."+reseller.getIDColumnName()+" = rs."+reseller.getIDColumnName());
sql.append(" AND ");
sql.append("s."+com.idega.block.trade.stockroom.data.SupplierBMPBean.getColumnNameIsValid()+" = 'Y'");
if (!orderBy.equals("")) {
sql.append(" ORDER BY s."+orderBy);
}
suppliers = (Supplier[]) (com.idega.block.trade.stockroom.data.SupplierBMPBean.getStaticInstance(Supplier.class)).findAll(sql.toString());
}catch (SQLException sql) {
sql.printStackTrace(System.err);
}
return suppliers;
}
public Iterator getResellerChilds(Reseller reseller) {
return getResellerChilds(reseller, "");
}
public Iterator getResellerChilds(Reseller reseller, String orderBy) {
Iterator iter = reseller.getChildrenIterator(orderBy);
if (iter != null) {
/* List listi = new Vector();
Reseller tempReseller;
while (iter.hasNext()) {
tempReseller = (Reseller) iter.next();
if ((tempReseller.getID() != reseller.getID()) && (tempReseller.getID() != reseller.getParent().getID())) {
listi.add(tempReseller);
}
}
iter = listi.iterator();*/
}else if (iter == null) {
iter = com.idega.util.ListUtil.getEmptyList().iterator();
}
return iter;
}
public List getResellersAvailable(Reseller reseller) throws SQLException {
return getResellersAvailable(reseller, null);
}
public List getResellersAvailable(Reseller reseller, String orderBy) throws SQLException {
List list = null;
if (reseller != null) {
list = new Vector();
int[] exclude = new int[0];
if (reseller.getParent() != null) {
exclude = new int[] {reseller.getID(), reseller.getParent().getID()};
}else {
exclude = new int[] {reseller.getID()};
}
StringBuffer buff = new StringBuffer();
buff.append("SELECT * FROM "+com.idega.block.trade.stockroom.data.ResellerBMPBean.getResellerTableName());
buff.append(" WHERE ");
buff.append(com.idega.block.trade.stockroom.data.ResellerBMPBean.getColumnNameIsValid()+" = 'Y'");
if (exclude.length > 0) {
buff.append(" AND ");
buff.append(reseller.getIDColumnName()+" not in (");
for (int i = 0; i < exclude.length; i++) {
if (i != 0) {
buff.append(", ");
}
buff.append(exclude[i]);
}
buff.append(") ");
}
if (orderBy != null && !orderBy.equals("")) {
buff.append(" ORDER BY "+orderBy);
}
list = EntityFinder.findAll(reseller, buff.toString());
}
return list;
}
public Iterator getResellers(Supplier supplier) {
return getResellers(supplier,"");
}
public Iterator getResellers(Supplier supplier, String orderBy) {
Iterator iter = null;
try {
Reseller reseller = (Reseller) GenericEntity.getStaticInstance(Reseller.class);
// Supplier supplier = (Supplier) com.idega.block.trade.stockroom.data.SupplierBMPBean.getStaticInstance(Supplier.class);
int supplierId = supplier.getID();
StringBuffer sql = new StringBuffer();
sql.append("Select r.* from "+com.idega.block.trade.stockroom.data.ResellerBMPBean.getResellerTableName()+" r, "+com.idega.block.trade.stockroom.data.SupplierBMPBean.getSupplierTableName()+" s, ");
sql.append(EntityControl.getManyToManyRelationShipTableName(Reseller.class, Supplier.class)+" rs");
sql.append(" WHERE ");
sql.append(" s."+supplier.getIDColumnName()+" = "+supplierId);
sql.append(" AND ");
sql.append(" s."+supplier.getIDColumnName()+" = rs."+supplier.getIDColumnName());
sql.append(" AND ");
sql.append(" r."+reseller.getIDColumnName()+" = rs."+reseller.getIDColumnName());
sql.append(" AND ");
sql.append("r."+com.idega.block.trade.stockroom.data.ResellerBMPBean.getColumnNameIsValid()+" = 'Y'");
if (!orderBy.equals("")) {
sql.append(" ORDER BY r."+orderBy);
}
List list = EntityFinder.findAll(GenericEntity.getStaticInstance(Reseller.class), sql.toString());
// resellers = (Reseller[]) (com.idega.block.trade.stockroom.data.ResellerBMPBean.getStaticInstance(Reseller.class)).findAll(sql.toString());
if (list != null) {
iter = list.iterator();
}else {
iter = com.idega.util.ListUtil.getEmptyList().iterator();
}
}catch (SQLException sql) {
sql.printStackTrace(System.err);
}
return iter;
}
/*
public static Product[] getProductsWithContracts(Reseller ownerReseller, int contractedResellerId) {
return getProductsWithContracts(ownerReseller, contractedResellerId, null);
}
public static Product[] getProductsWithContracts(Reseller ownerReseller, int contractedResellerId, String orderBy) {
return getProductsWithContracts(ownerReseller.getID(), contractedResellerId, -1, orderBy);
}
*/
public Group getPermissionGroup(Reseller reseller) throws RemoteException, FinderException {
String name = reseller.getName()+"_"+reseller.getID() + permissionGroupNameExtention;
String description = permissionGroupDescription;
Group pGroup = null;
Collection coll = getGroupBusiness().getGroupHome().findGroupsByNameAndDescription(name, description);
if (coll != null) {
if (!coll.isEmpty()) {
Iterator iter = coll.iterator();
pGroup = (Group) iter.next();
// sGroup = (ResellerStaffGroup) listi.get(listi.size()-1);
}
}
coll = getGroupBusiness().getGroupHome().findGroupsByNameAndDescription(reseller.getName()+ permissionGroupNameExtention, description);
if (coll != null) {
if (!coll.isEmpty()) {
Iterator iter = coll.iterator();
pGroup = (Group) iter.next();
// sGroup = (ResellerStaffGroup) listi.get(listi.size()-1);
}
}
// List listi = EntityFinder.findAllByColumn((PermissionGroup) com.idega.user.data.GroupBMPBean.getStaticInstance(Group.class), com.idega.user.data.GroupBMPBean.getNameColumnName(), name, com.idega.user.data.GroupBMPBean.getGroupDescriptionColumnName(), description );
// if (listi != null) {
// if (listi.size() > 0) {
// pGroup = (Group) listi.get(listi.size()-1);
// }
// }
// if (listi == null) {
// listi = EntityFinder.findAllByColumn((PermissionGroup) com.idega.user.data.GroupBMPBean.getStaticInstance(Group.class), com.idega.user.data.GroupBMPBean.getNameColumnName(), reseller.getName()+ permissionGroupNameExtention, com.idega.user.data.GroupBMPBean.getGroupDescriptionColumnName(), description );
// if (listi != null) {
// if (listi.size() > 0) {
// pGroup = (Group) listi.get(listi.size()-1);
// }
// }
// }
return pGroup;
}
public ResellerStaffGroup getResellerStaffGroup(Reseller reseller) throws RemoteException, FinderException {
String name = reseller.getName()+"_"+reseller.getID();
ResellerStaffGroup sGroup = null;
ResellerStaffGroupHome rsgh = (ResellerStaffGroupHome) IDOLookup.getHome(ResellerStaffGroup.class);
Collection coll = rsgh.findGroupsByName(name);
// List listi = EntityFinder.findAllByColumn((ResellerStaffGroup) com.idega.block.trade.stockroom.data.ResellerStaffGroupBMPBean.getStaticInstance(ResellerStaffGroup.class), com.idega.block.trade.stockroom.data.ResellerStaffGroupBMPBean.getNameColumnName(), name);
if (coll != null) {
if (!coll.isEmpty()) {
Iterator iter = coll.iterator();
sGroup = (ResellerStaffGroup) iter.next();
// sGroup = (ResellerStaffGroup) listi.get(listi.size()-1);
}
}
coll = rsgh.findGroupsByName(reseller.getName());
if (coll != null) {
if (!coll.isEmpty()) {
Iterator iter = coll.iterator();
sGroup = (ResellerStaffGroup) iter.next();
// sGroup = (ResellerStaffGroup) listi.get(listi.size()-1);
}
}
// if (listi == null) {
// listi = EntityFinder.findAllByColumn((ResellerStaffGroup) com.idega.block.trade.stockroom.data.ResellerStaffGroupBMPBean.getStaticInstance(ResellerStaffGroup.class), com.idega.block.trade.stockroom.data.ResellerStaffGroupBMPBean.getNameColumnName(), reseller.getName());
// if (listi != null) {
// if (listi.size() > 0) {
// sGroup = (ResellerStaffGroup) listi.get(listi.size()-1);
// }
// }
// }
return sGroup;
}
public void addUser(Reseller reseller, User user, boolean addToPermissionGroup) throws RemoteException, FinderException {
Group pGroup = getPermissionGroup(reseller);
ResellerStaffGroup sGroup = getResellerStaffGroup(reseller);
if (addToPermissionGroup) {
pGroup.addGroup(user);
}
sGroup.addGroup(user);
}
public List getUsersInPermissionGroup(Reseller reseller) throws RemoteException, FinderException {
Group pGroup = getPermissionGroup(reseller);
Collection coll = getUserBusiness().getUsersInGroup(pGroup);
List users = new Vector(coll);
//List users = UserBusiness.getUsersInGroup(pGroup);
if (users != null) {
java.util.Collections.sort(users, new com.idega.util.GenericUserComparator(com.idega.util.GenericUserComparator.NAME));
}
return users;
}
public List getUsersNotInPermissionGroup(Reseller reseller) throws RemoteException, FinderException {
List allUsers = getUsers(reseller);
List permUsers = getUsersInPermissionGroup(reseller);
if (permUsers != null) {
allUsers.removeAll(permUsers);
}
return allUsers;
}
public List getUsers(Reseller reseller) throws RemoteException, FinderException {
ResellerStaffGroup sGroup = getResellerStaffGroup(reseller);
Collection coll = getUserBusiness().getUsersInGroup(sGroup);
List users = new Vector(coll);
//List users = UserBusiness.getUsersInGroup(sGroup);
if (users != null) {
java.util.Collections.sort(users, new com.idega.util.GenericUserComparator(com.idega.util.GenericUserComparator.NAME));
}
return users;
}
public List getUsersIncludingSubResellers(Reseller reseller) throws RemoteException, FinderException{
Iterator childs = getResellerChilds(reseller, com.idega.block.trade.stockroom.data.ResellerBMPBean.getColumnNameName());
List users = getUsers(reseller);
List temp;
while (childs.hasNext()) {
temp = getUsers((Reseller) childs.next());
if (temp != null) {
users.addAll(temp);
}
}
return users;
}
public List getUsersIncludingSubResellers(Reseller reseller, Object objectBetweenResellers) throws RemoteException, FinderException{
Iterator childs = getResellerChilds(reseller, com.idega.block.trade.stockroom.data.ResellerBMPBean.getColumnNameName());
List users = getUsers(reseller);
List temp;
while (childs.hasNext()) {
if (objectBetweenResellers != null) {
users.add(objectBetweenResellers);
}
temp = getUsers((Reseller) childs.next());
if (temp != null) {
users.addAll(temp);
}
}
// System.err.println("Ur iter");
return users;
}
public Reseller getReseller(User user) throws RemoteException, FinderException {
Collection coll = getUserBusiness().getUserGroups(user);
List groups = new Vector(coll);
//List groups = UserBusiness.getUserGroups(user);
boolean isReseller = false;
int number = 0;
GenericGroup group;
String type;
if (groups != null) {
for (int i = 0; i < groups.size(); i++) {
group = (GenericGroup) groups.get(i);
type = group.getGroupType();
if (type != null && type.equals(com.idega.block.trade.stockroom.data.ResellerStaffGroupBMPBean.GROUP_TYPE_VALUE)) {
isReseller = true;
number= i;
break;
}
}
}
if (isReseller) {
try {
// Legacy
Reseller[] resellers = com.idega.block.trade.stockroom.data.ResellerBMPBean.getValidResellers();
GenericGroup rGroup = (GenericGroup) groups.get(number);
for (int i = 0; i < resellers.length; i++) {
if ((resellers[i].getName()+"_"+resellers[i].getID()).indexOf(rGroup.getName()) != -1) {
return resellers[i];
}
}
} catch (SQLException e) {
throw new FinderException(e.getMessage());
}
}
return null;
}
public User getMainUser(Reseller reseller) throws SQLException {
List users = UserGroupBusiness.getUsersContained(((com.idega.core.data.GenericGroupHome)com.idega.data.IDOLookup.getHomeLegacy(GenericGroup.class)).findByPrimaryKeyLegacy(reseller.getGroupId()));
if (users != null && users.size() > 0) {
return (User) users.get(0);
}else {
return null;
}
}
protected GroupBusiness getGroupBusiness() {
try {
return (GroupBusiness) IBOLookup.getServiceInstance(getIWApplicationContext(), GroupBusiness.class);
}
catch (IBOLookupException e) {
throw new IBORuntimeException(e);
}
}
protected UserBusiness getUserBusiness() {
try {
return (UserBusiness) IBOLookup.getServiceInstance(getIWApplicationContext(), UserBusiness.class);
}
catch (IBOLookupException e) {
throw new IBORuntimeException(e);
}
}
}