/**
* 保存发票信息
* @param controller
* @return
* @throws ParseException
* @throws ActiveRecordException
*/
@Before(Tx.class)
public boolean addInvoice(QhyfController controller) throws Exception{
BizInvoiceInfo bizInvoiceInfo = new BizInvoiceInfo();
//参数获取
String uuid = controller.getPara("uuid");
boolean isTrue = false;
String payId = controller.getPara("pay");
StringTools.isNotBlank(payId);
if (this.maxHisId(payId)==0) {
//履历表没有数据时,更新前,保存一次履历
saveHistoryInfo(payId, controller);
}
String invoiceNo = controller.getPara("invoiceNo");
String checkResult = controller.getPara("checkResult");
String invoiceMemo = controller.getPara("invoiceMemo");
String originalInvoiceNo = controller.getPara("originalInvoiceNo");
String invoiceName = controller.getPara("invoiceName");
BigDecimal invoiceNoTaxAmount =null;
String checkCode = controller.getPara("checkCode");
String invoiceType = controller.getPara("invoiceType");
String invoiceCode = controller.getPara("invoiceCode");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//需求变更,菜单修改发票信息,可不选开票日期 2016/09/24 黎旭 START
Date invoiceDate =null;
if(StringUtils.notBlank(controller.getPara("invoiceDate"))){
invoiceDate = format.parse(controller.getPara("invoiceDate"));
}
// Date invoiceDate = format.parse(controller.getPara("invoiceDate"));
//需求变更,菜单修改发票信息,可不选开票日期 2016/09/24 黎旭 END
//需求变更,新增,修改发票信息发票金额和应收账款金额可以为空, 2016/09/26 刘果 START
BigDecimal invoiceAmount = null;
BigDecimal accountReceivable = null;
String invoiceAmountTmp = controller.getPara("invoiceAmount");
String accountReceivableTmp = controller.getPara("accountReceivable");
String invoiceNoTaxAmountTmp = controller.getPara("invoiceNoTaxAmount");
if (StringUtils.notBlank(invoiceAmountTmp)) {
// 发票金额不为空
invoiceAmount = new BigDecimal(invoiceAmountTmp.replace(",", ""));
} else {
//
}
if (StringUtils.notBlank(accountReceivableTmp)) {
// 应收账款金额不为空
accountReceivable = new BigDecimal(accountReceivableTmp.replace(",", ""));
} else {
//
}
if (StringUtils.notBlank(invoiceNoTaxAmountTmp)) {
// 应收账款金额不为空
invoiceNoTaxAmount = new BigDecimal(invoiceNoTaxAmountTmp.replace(",", ""));
} else {
//
}
// 发票金额、应收账款金额 不为空时
if (invoiceAmount != null && accountReceivable != null ) {
// 发票应收账款金额 accountReceivable 四舍五入
double resultInvoiceAccountReceivableB = accountReceivable.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
// 获取发票金额 invoiceAmount 四舍五入
double resultInvoiceAmountB = invoiceAmount.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
List<String> para = new ArrayList<String>();
//根据发票号和付款确认书编号查询当前发票已抵扣金额合计
para.add(invoiceNo);
para.add(payId);
String sql="CALL invoice_deduction_amount(?,?) ";
// 执行SQL
Record record = Db.findFirst(sql, para.toArray());
// 当前发票已抵扣金额
BigDecimal invoiceAmountCall = null;
// 获取发票已抵扣金额
if(record!=null){
invoiceAmountCall = record.getBigDecimal("accountReceivable");
}
// 发票剩余可用抵扣金额
double deductibleAmountAvailable = resultInvoiceAmountB ;
// 发票已抵扣金额不为空
if (invoiceAmountCall != null ) {
// 发票剩余可用抵扣金额 = 发票金额 - 当前发票已抵扣金额
deductibleAmountAvailable = resultInvoiceAmountB - invoiceAmountCall.doubleValue();
}
// 该发票的应收账款金额不能大于发票剩余可用抵扣金额(已抵扣金额【%s】)
AssertUtils.isTrue(resultInvoiceAccountReceivableB <= deductibleAmountAvailable, AlertUtils.getErrMsgWithCode("ME414E015",invoiceAmountCall == null ? 0 : invoiceAmountCall.doubleValue()));
}
if (!StringUtils.isBlank(uuid)) {
//更新
StringTools.isNotBlank(uuid);
if(!originalInvoiceNo.equals(invoiceNo)){
//查询是否存在相同发票
Record sameInvoiceRecord = null;
String sameInvoiceSql = String.format(
" SELECT"
+ " a.uuid,a.invoice_no"
+ " FROM %s a"
+ " WHERE a.sys_status = %s AND"
+ " a.invoice_no = ? AND"
+ " a.pay_id = ? ",
BizInvoiceInfo.dao.getTable().getName(),
BlConstant.SYS_STATUS_VALUE);
sameInvoiceRecord = Db.findFirst(sameInvoiceSql, invoiceNo,payId);
if(sameInvoiceRecord != null){
AssertUtils.isNull(sameInvoiceRecord.getStr("uuid"), sameInvoiceRecord.getStr("invoiceNo")+"发票已存在");
}
}
bizInvoiceInfo.set("uuid", uuid);
//设置发票编号
bizInvoiceInfo.set("invoiceNo", invoiceNo);
//设置发票名称
bizInvoiceInfo.set("invoiceName", invoiceName);
//设置开票日期
bizInvoiceInfo.set("invoiceDate", invoiceDate);
bizInvoiceInfo.set("checkResult", checkResult);
bizInvoiceInfo.set("invoiceMemo", invoiceMemo);
//设置发票金额
bizInvoiceInfo.set("invoiceAmount", invoiceAmount);
bizInvoiceInfo.set("invoiceNoTaxAmount", invoiceNoTaxAmount);
if(StringUtils.notBlank(checkCode))
bizInvoiceInfo.set("checkCode", checkCode);
bizInvoiceInfo.set("invoiceType", invoiceType);
bizInvoiceInfo.set("invoiceCode", invoiceCode);
//设置应收账款金额
bizInvoiceInfo.set("accountReceivable", accountReceivable);
isTrue = controller.merge(bizInvoiceInfo.getTable().getName(), bizInvoiceInfo);
controller.setSessionAttr("historyFlag", true);
} else {
//查询是否存在相同发票
Record sameInvoiceRecord = null;
String sameInvoiceSql = String.format(
" SELECT"
+ " a.uuid,a.invoice_no"
+ " FROM %s a"
+ " WHERE a.sys_status = %s AND"
+ " a.invoice_no = ? AND"
+ " a.pay_id = ? ",
BizInvoiceInfo.dao.getTable().getName(),
BlConstant.SYS_STATUS_VALUE);
sameInvoiceRecord = Db.findFirst(sameInvoiceSql, invoiceNo,payId);
if(sameInvoiceRecord != null){
AssertUtils.isNull(sameInvoiceRecord.getStr("uuid"), sameInvoiceRecord.getStr("invoiceNo")+"发票已存在");
}
//新增
//参数设置
bizInvoiceInfo.set("payId", payId);
//设置发票编号
bizInvoiceInfo.set("invoiceNo", invoiceNo);
//设置发票名称
bizInvoiceInfo.set("invoiceName", invoiceName);
//设置开票日期
bizInvoiceInfo.set("invoiceDate", invoiceDate);
//设置发票金额
bizInvoiceInfo.set("invoiceAmount", invoiceAmount);
bizInvoiceInfo.set("checkResult", checkResult);
bizInvoiceInfo.set("invoiceMemo", invoiceMemo);
//设置应收账款金额
bizInvoiceInfo.set("accountReceivable", accountReceivable);
bizInvoiceInfo.set("invoiceNoTaxAmount", invoiceNoTaxAmount);
if(StringUtils.notBlank(checkCode))
bizInvoiceInfo.set("checkCode", checkCode);
bizInvoiceInfo.set("invoiceType", invoiceType);
bizInvoiceInfo.set("invoiceCode", invoiceCode);
isTrue = controller.merge(BizInvoiceInfo.dao.getTable().getName(),bizInvoiceInfo);
controller.setSessionAttr("historyFlag", true);
}
return isTrue;
}