package com.hangum.tadpole.engine.query.sql;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.hangum.tadpole.commons.exception.TadpoleSQLManagerException;
import com.hangum.tadpole.commons.util.DateUtil;
import com.hangum.tadpole.engine.Messages;
import com.hangum.tadpole.engine.initialize.TadpoleSystemInitializer;
import com.hangum.tadpole.engine.manager.TadpoleSQLManager;
import com.hangum.tadpole.engine.query.dao.system.UserDAO;
import com.hangum.tadpole.engine.query.dao.system.bill.AssignedServiceDAO;
import com.hangum.tadpole.engine.query.dao.system.bill.UserBillDAO;
import com.hangum.tadpole.session.manager.SessionManager;
import com.ibatis.sqlmap.client.SqlMapClient;
/**
*
* @author hangum
*
*/
public class TadpoleSystem_Bill {
/**
* user bill list
*
* @return
*/
public static List<UserBillDAO> getBillList() throws TadpoleSQLManagerException, SQLException {
Map<String, Object> queryMap = new HashMap<String, Object>();
queryMap.put("user_seq", SessionManager.getUserSeq());
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(TadpoleSystemInitializer.getUserDB());
return sqlClient.queryForList("userBillList", queryMap);
}
/**
* insert bill
* @param dao
* @throws TadpoleSQLManagerException
* @throws SQLException
*/
public static UserBillDAO insertBill(UserBillDAO dao) throws TadpoleSQLManagerException, SQLException {
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(TadpoleSystemInitializer.getUserDB());
return (UserBillDAO)sqlClient.insert("insertBill", dao); //$NON-NLS-1$
}
/**
* start service
*
* @param dao
* @throws TadpoleSQLManagerException
* @throws SQLException
*/
public static void startService(UserBillDAO dao) throws TadpoleSQLManagerException, SQLException {
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(TadpoleSystemInitializer.getUserDB());
sqlClient.update("updateStartService", dao); //$NON-NLS-1$
}
/**
* 이미 서비스에 사용자가 추가되었는지 검사한다.
*
* @param bill
* @param assignedService
* @return
* @throws TadpoleSQLManagerException
* @throws SQLException
*/
public static void insertStartUserService(UserBillDAO bill, UserDAO user, AssignedServiceDAO assignedService) throws Exception {
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(TadpoleSystemInitializer.getUserDB());
List<AssignedServiceDAO> list = sqlClient.queryForList("getAlreadyService", assignedService);
if(bill.getEa() > list.size()) {
for (AssignedServiceDAO asObj : list) {
if(asObj.getUser_seq() == user.getSeq()) {
throw new Exception(Messages.get().AlreadyUseService);
}
}
sqlClient.insert("insertStartUserService", assignedService);
// 마지막 결제 정보를 변경한
updateUserInfo(user, assignedService);
} else {
throw new Exception(Messages.get().overflowUseService);
}
}
/**
* 마지막 사용자 정보를 업데이트한다.
*
* @param user
* @param assignedService
* @throws Exception
*/
private static void updateUserInfo(UserDAO user, AssignedServiceDAO assignedService) throws Exception {
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(TadpoleSystemInitializer.getUserDB());
// user의 마지막 정보를 가져온다.
UserDAO userDaoLastInfo = TadpoleSystem_UserQuery.findUser(user.getEmail());
// 사용자 서비스를 늘려준다.
if(userDaoLastInfo.getService_end().getTime() < assignedService.getService_end_data().getTime()) {
sqlClient.update("updateUserServiceDate", assignedService);
}
// 사용자 디비 추가 제한이 5보다 적으면..
if(userDaoLastInfo.getLimit_add_db_cnt() < 5) {
sqlClient.update("updateUserLimitDBCnt", assignedService);
}
}
/**
* 각 사용자의 서비스 리스트
* @param dao
* @return
* @throws TadpoleSQLManagerException
* @throws SQLException
*/
public static List<AssignedServiceDAO> getUserList(UserBillDAO dao) throws TadpoleSQLManagerException, SQLException {
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(TadpoleSystemInitializer.getUserDB());
return sqlClient.queryForList("getEachServiceUser", dao);
}
/**
* delete user service
*
* @param dao
* @throws TadpoleSQLManagerException
* @throws SQLException
*/
public static void deleteUserService(AssignedServiceDAO dao) throws TadpoleSQLManagerException, SQLException {
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(TadpoleSystemInitializer.getUserDB());
sqlClient.update("deleteUserService", dao);
// 사용자 플랜중에 가장 큰 플랜으로 업데이트 한다.
Timestamp endDate = calcMaxServiceDate(dao.getUser_seq());
AssignedServiceDAO assignDao = new AssignedServiceDAO();
assignDao.setUser_seq(dao.getUser_seq());
assignDao.setService_end_data(endDate);
sqlClient.update("updateUserServiceDate", assignDao);
}
/**
* calculate max service date
*
* @param userSeq
* @return
* @throws TadpoleSQLManagerException
* @throws SQLException
*/
public static Timestamp calcMaxServiceDate(int userSeq) throws TadpoleSQLManagerException, SQLException {
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(TadpoleSystemInitializer.getUserDB());
Object objDao = sqlClient.queryForObject("calcMaxServiceDate", userSeq);
if(objDao != null) {
AssignedServiceDAO dao = (AssignedServiceDAO)objDao;
return dao.getService_end_data();
} else {
return new Timestamp(DateUtil.afterMonthToMillis(1));
}
}
}