package com.opentravelsoft.action.manage.order;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.opentravelsoft.action.ManageAction;
import com.opentravelsoft.common.KeyParams;
import com.opentravelsoft.entity.Booking;
import com.opentravelsoft.entity.Employee;
import com.opentravelsoft.entity.Line;
import com.opentravelsoft.entity.LineDescription;
import com.opentravelsoft.entity.LineSchedule;
import com.opentravelsoft.entity.Plan;
import com.opentravelsoft.entity.finance.Reckoning;
import com.opentravelsoft.entity.finance.ReckoningAcct;
import com.opentravelsoft.service.finance.ReckoningService;
import com.opentravelsoft.service.order.BookingService;
import com.opentravelsoft.service.product.LineScheduleService;
import com.opentravelsoft.service.product.LineTraitService;
import com.opentravelsoft.util.Arith;
import com.opentravelsoft.util.RowDataUtil;
/**
* 帐单制作
*
* @author <a herf="mailto:zhangsitao@gmail.com">Steven Zhang</a>
* @version $Revision: 1.1 $ $Date: 2009/03/01 16:23:53 $
*/
public class ReckoningMakeAction extends ManageAction {
private static final long serialVersionUID = -7852853734687360320L;
@Autowired
private BookingService bookingService;
@Autowired
private ReckoningService reckoningService;
@Autowired
private LineScheduleService lineScheduleService;
@Autowired
private LineTraitService lineTraitService;
private List<ReckoningAcct> reckoningAcctList = new ArrayList<ReckoningAcct>();
private List<Reckoning> reckoningList = new ArrayList<Reckoning>();
/** 线路行程 */
private List<LineSchedule> scheduleList = new ArrayList<LineSchedule>();
/** 线路费用包含 */
private List<LineDescription> expenseList = new ArrayList<LineDescription>();
/** 出行警示 */
private List<LineDescription> alertList = new ArrayList<LineDescription>();
/** 重要条款 */
private List<LineDescription> ruleList = new ArrayList<LineDescription>();
/** 是否为散客或团体 */
private String nameKey;
/** 是否为国内短线 */
private String isShort = "N";
/** 判断是否已打印 */
private String isPrint = "N";
/** 订单号 */
private String reserveNo;
private int reckoningId;
private int version;
private Booking book = new Booking();
private Reckoning reckoning = new Reckoning();
private int itemId = 0;
private int userId;
// ------------------------------------------------------------------------------
/**
* 帐单制作初始化
*
* @return
*/
public String makeInput() {
book = bookingService.roGetReserve(reserveNo);
nameKey = book.getNameKey();
// 判断是否为国内短线
Line route = new Line();
route = reckoningService.getLineInfo(book.getPlan().getLine().getLineNo());
if (null == route)
isShort = "Y";
if ("N".equals(isShort)) {
reckoning.setClient(book.getCustomer().getName());
reckoning.setOutDate(book.getPlan().getOutDate());
reckoning.setRouteName(book.getPlan().getLine().getLineName());
reckoning.setTourNo(book.getPlan().getTourNo());
reckoning.setContact(book.getContact());
reckoning.setPhone(book.getPhone());
reckoning.setPax(book.getPax());
if (null != reckoning.getPrintDate())
reckoning.setPDate(SDF.format(reckoning.getPrintDate()));
else
reckoning.setPDate("尚未打印");
if (null != reckoning.getCreateDate())
reckoning.setCDate(SDF.format(reckoning.getCreateDate()));
else
reckoning.setCDate("尚未生成");
if ("A".equals(nameKey)) {
reckoningAcctList = reckoningService.roGetCustomerList(reserveNo);
if (!(reckoningAcctList.isEmpty())) {
BigDecimal amount = new BigDecimal(0);
for (ReckoningAcct obj : reckoningAcctList) {
amount = amount.add(obj.getAmount());
}
reckoning.setAmount(Arith.round(amount, 2));
}
} else {
Plan tour = reckoningService.roGetTourInfo(book.getPlan().getTourNo());
if (null != tour)
reckoning.setLeaderPax(RowDataUtil.getInt(tour.getLeaderPax()));
if (reckoningAcctList.isEmpty()) {
ReckoningAcct eckoningAcct = new ReckoningAcct();
eckoningAcct.setItemId(1);
reckoningAcctList.add(eckoningAcct);
}
}
} else if ("Y".equals(isShort)) {
scheduleList = lineScheduleService.getLineSchedule(book.getPlan()
.getLine().getLineNo());
expenseList = lineTraitService.roGetExpense(book.getPlan().getLine()
.getLineNo());
alertList = lineTraitService.getLineTrait(book.getPlan().getLine()
.getLineNo(), KeyParams.EBIZ_TYPE_LINE_ALERT);
ruleList = lineTraitService.getLineTrait(book.getPlan().getLine()
.getLineNo(), KeyParams.EBIZ_TYPE_LINE_RULE);
reckoning.setClient(book.getCustomer().getName());
reckoning.setOutDate(book.getPlan().getOutDate());
reckoning.setRouteName(book.getPlan().getLine().getLineName());
reckoning.setPax(book.getPax());
}
if (!reckoningAcctList.isEmpty()) {
for (ReckoningAcct obj : reckoningAcctList) {
obj.setDescription("团费");
obj.setUnit("元");
obj.setUnitPrice(book.getCustomerList().get(0).getResidual());
obj.setCount(book.getPax());
obj.setAmount(obj.getUnitPrice().multiply(
new BigDecimal(reckoning.getPax())));
reckoning.setAmount(obj.getAmount());
}
}
return SUCCESS;
}
// ------------------------------------------------------------------------------
/**
* 显示带历史记录的帐单
*
* @return
*/
public String detailInput() {
Employee user = getUser();
reckoningList = reckoningService.roGetReckoning(reserveNo);
if (null != reckoningList && !(reckoningList.isEmpty())) {
for (Reckoning obj : reckoningList) {
if (version < obj.getVersion()) {
reckoningId = obj.getReckoningId();
version = obj.getVersion();
}
}
book = bookingService.roGetReserve(reserveNo);
nameKey = book.getNameKey();
// 判断是否为国内短线
Line route = new Line();
route = reckoningService
.getLineInfo(book.getPlan().getLine().getLineNo());
if (null == route)
isShort = "Y";
//
if ("N".equals(isShort)) {
for (Reckoning obj : reckoningList) {
if (version == obj.getVersion()) {
reckoning = obj;
}
}
reckoningList.remove(reckoning);
reckoning = reckoningService.roGetReckoningInfo(reckoningId);
userId = user.getUserId();
reckoning.setClient(book.getCustomer().getName());
reckoning.setOutDate(book.getPlan().getOutDate());
reckoning.setRouteName(book.getPlan().getLine().getLineName());
reckoning.setTourNo(book.getPlan().getTourNo());
reckoning.setPax(book.getPax());
if (null != reckoning.getPrintDate())
reckoning.setPDate(SDF.format(reckoning.getPrintDate()));
else
reckoning.setPDate("尚未打印");
if ("A".equals(nameKey)) {
reckoningAcctList = reckoningService.roGetCustomerList(reserveNo);
if (!(reckoningAcctList.isEmpty())) {
BigDecimal amount = new BigDecimal(0);
for (ReckoningAcct obj : reckoningAcctList) {
amount = amount.add(obj.getAmount());
}
reckoning.setAmount(Arith.round(amount, 2));
}
} else {
Plan tour = reckoningService
.roGetTourInfo(book.getPlan().getTourNo());
if (null != tour)
reckoning.setLeaderPax(tour.getLeaderPax());
BigDecimal amount1 = new BigDecimal(0);
for (int i = 0; i < reckoning.getReckoningAcctList().size(); i++) {
amount1 = amount1.add(reckoning.getReckoningAcctList().get(i)
.getAmount());
}
reckoning.setAmount(Arith.round(amount1, 2));
}
} else if ("Y".equals(isShort)) {
}
}
return SUCCESS;
}
// ------------------------------------------------------------------------------
/**
* 显示单个帐单
*
* @return
*/
public String detail() {
Employee user = getUser();
book = bookingService.roGetReserve(reserveNo);
nameKey = book.getNameKey();
// 判断是否为国内短线
Line route = new Line();
route = reckoningService.getLineInfo(book.getPlan().getLine().getLineNo());
if (null == route)
isShort = "Y";
//
if ("N".equals(isShort)) {
reckoning = reckoningService.roGetReckoningInfo(reckoningId);
isPrint = "Y";
userId = user.getUserId();
reckoning.setClient(book.getCustomer().getName());
reckoning.setOutDate(book.getPlan().getOutDate());
reckoning.setRouteName(book.getPlan().getLine().getLineName());
reckoning.setTourNo(book.getPlan().getTourNo());
reckoning.setPax(book.getPax());
if (null != reckoning.getPrintDate())
reckoning.setPDate(SDF.format(reckoning.getPrintDate()));
else
reckoning.setPDate("尚未打印");
if ("A".equals(nameKey)) {
reckoningAcctList = reckoningService.roGetCustomerList(reserveNo);
if (!(reckoningAcctList.isEmpty())) {
BigDecimal amount = new BigDecimal(0);
for (ReckoningAcct obj : reckoningAcctList) {
amount = amount.add(obj.getAmount());
}
reckoning.setAmount(Arith.round(amount, 2));
}
} else {
Plan tour = reckoningService.roGetTourInfo(book.getPlan().getTourNo());
if (null != tour)
reckoning.setLeaderPax(tour.getLeaderPax());
BigDecimal amount1 = new BigDecimal(0);
for (int i = 0; i < reckoning.getReckoningAcctList().size(); i++) {
amount1 = amount1.add(reckoning.getReckoningAcctList().get(i)
.getAmount());
}
reckoning.setAmount(Arith.round(amount1, 2));
}
} else if ("Y".equals(isShort)) {
}
return SUCCESS;
}
// ------------------------------------------------------------------------------
/**
* 制作帐单
*
* @return
*/
public String make() {
Employee user = getUser();
if ("N".equals(isShort.trim())) {
if ("A".equals(nameKey.trim()))
reckoning.setTourType("2");
else
reckoning.setTourType("1");
reckoning.setBookingNo(reserveNo.trim());
reckoning.setCreatedBy(user.getUserId());
reckoning.setUserDept("");
reckoning.setReckoningAcctList(reckoningAcctList);
reckoning = reckoningService.txWholeReckoningMake(reckoning);
} else {
reckoning.setTourType("3");
reckoning.setBookingNo(reserveNo.trim());
reckoning.setCreatedBy(user.getUserId());
reckoning.setUserDept("");
reckoning = reckoningService.txWholeReckoningMake(reckoning);
}
if (!("".equals(reckoning.getReckoningId())))
addActionMessage("帐单制作成功!");
reckoningId = reckoning.getReckoningId();
return SUCCESS;
}
// -----------------------------------------------------------------------------
/**
* 修改帐单初始化
*
* @return
*/
public String modifyInput() {
reckoning = reckoningService.roGetReckoningInfo(reckoningId);
// 判断是否已打印
if (reckoning.getPrintedCount() == 0)
isPrint = "N";
else
isPrint = "Y";
book = bookingService.roGetReserve(reserveNo);
nameKey = book.getNameKey();
// 判断是否为国内短线
Line route = new Line();
route = reckoningService.getLineInfo(book.getPlan().getLine().getLineNo());
if (null == route)
isShort = "Y";
// ------------------------------------------------------------------
if ("N".equals(isShort)) {
reckoning.setClient(book.getCustomer().getName());
reckoning.setOutDate(book.getPlan().getOutDate());
reckoning.setRouteName(book.getPlan().getLine().getLineName());
reckoning.setTourNo(book.getPlan().getTourNo());
reckoning.setPax(book.getPax());
if (null != reckoning.getPrintDate())
reckoning.setPDate(SDF.format(reckoning.getPrintDate()));
else
reckoning.setPDate("尚未打印");
if ("A".equals(nameKey)) {
reckoningAcctList = reckoningService.roGetCustomerList(reserveNo);
if (!(reckoningAcctList.isEmpty())) {
BigDecimal amount = new BigDecimal(0);
for (ReckoningAcct obj : reckoningAcctList) {
amount = amount.add(obj.getAmount());
}
reckoning.setAmount(Arith.round(amount, 2));
}
} else {
Plan tour = reckoningService.roGetTourInfo(book.getPlan().getTourNo());
if (null != tour)
reckoning.setLeaderPax(tour.getLeaderPax());
BigDecimal amount1 = new BigDecimal(0);
for (int i = 0; i < reckoning.getReckoningAcctList().size(); i++) {
amount1 = amount1.add(reckoning.getReckoningAcctList().get(i)
.getAmount());
}
reckoning.setAmount(Arith.round(amount1, 2));
reckoningAcctList = reckoning.getReckoningAcctList();
}// -------------------------------------------------------------
} else if ("Y".equals(isShort)) {
}
return SUCCESS;
}
// ------------------------------------------------------------------------------
/**
* 修改帐单
*
* @return
*/
public String modify() {
Employee user = getUser();
if ("Y".equals(isShort.trim()))
reckoning.setTourType("3");
else if ("A".equals(isShort.trim()))
reckoning.setTourType("2");
else
reckoning.setTourType("1");
int ret = 0;
reckoning.setReckoningId(reckoningId);
reckoning.setBookingNo(reserveNo);
reckoning.setUpdatedBy(user.getUserId());
reckoning.setReckoningAcctList(reckoningAcctList);
ret = reckoningService.txWholeReckoningModify(reckoning);
if (ret == 0)
addActionMessage("帐单修改成功!");
else
addActionMessage("帐单修改失败!");
return SUCCESS;
}
// ------------------------------------------------------------------------------
/**
* 增加行
*
* @return
*/
public String add() {
int id = 0;
for (int i = 0; i < reckoningAcctList.size(); i++) {
if (reckoningAcctList.get(i).getItemId() > id)
id = reckoningAcctList.get(i).getItemId();
}
ReckoningAcct reckoningAcct = new ReckoningAcct();
reckoningAcct.setItemId(id + 1);
reckoningAcctList.add(reckoningAcct);
return SUCCESS;
}
// ------------------------------------------------------------------------------
/**
* 删除行
*
* @return
*/
public String delete() {
ReckoningAcct reckoningAcct = new ReckoningAcct();
for (ReckoningAcct obj : reckoningAcctList) {
if (obj.getItemId() == itemId) {
// 删除行
for (int i = itemId; i < reckoningAcctList.size(); i++) {
reckoningAcct = reckoningAcctList.get(i);
reckoningAcct.setItemId(i);
reckoningAcctList.set(i, reckoningAcct);
}
BigDecimal amount = new BigDecimal(0);
amount = reckoning.getAmount().subtract(obj.getAmount());
reckoning.setAmount(amount);
reckoningAcctList.remove(obj);
break;
}
}
if (reckoningAcctList.isEmpty()) {
ReckoningAcct eckoningAcct = new ReckoningAcct();
eckoningAcct.setItemId(1);
reckoningAcctList.add(eckoningAcct);
}
return SUCCESS;
}
public String getNameKey() {
return nameKey;
}
public void setNameKey(String nameKey) {
this.nameKey = nameKey;
}
public String getReserveNo() {
return reserveNo;
}
public void setReserveNo(String reserveNo) {
this.reserveNo = reserveNo;
}
public Booking getBook() {
return book;
}
public void setBook(Booking book) {
this.book = book;
}
public String getIsShort() {
return isShort;
}
public void setIsShort(String isShort) {
this.isShort = isShort;
}
public Reckoning getReckoning() {
return reckoning;
}
public void setReckoning(Reckoning reckoning) {
this.reckoning = reckoning;
}
public List<ReckoningAcct> getReckoningAcctList() {
return reckoningAcctList;
}
public void setReckoningAcctList(List<ReckoningAcct> reckoningAcctList) {
this.reckoningAcctList = reckoningAcctList;
}
public List<Reckoning> getReckoningList() {
return reckoningList;
}
public void setReckoningList(List<Reckoning> reckoningList) {
this.reckoningList = reckoningList;
}
public int getItemId() {
return itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
public int getReckoningId() {
return reckoningId;
}
public void setReckoningId(int reckoningId) {
this.reckoningId = reckoningId;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public List<LineSchedule> getScheduleList() {
return scheduleList;
}
public void setScheduleList(List<LineSchedule> scheduleList) {
this.scheduleList = scheduleList;
}
public List<LineDescription> getExpenseList() {
return expenseList;
}
public void setExpenseList(List<LineDescription> expenseList) {
this.expenseList = expenseList;
}
public List<LineDescription> getAlertList() {
return alertList;
}
public void setAlertList(List<LineDescription> alertList) {
this.alertList = alertList;
}
public List<LineDescription> getRuleList() {
return ruleList;
}
public void setRuleList(List<LineDescription> ruleList) {
this.ruleList = ruleList;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public String getIsPrint() {
return isPrint;
}
public void setIsPrint(String isPrint) {
this.isPrint = isPrint;
}
}