//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package nc.bs.arap.actions;

import nc.bs.arap.bill.ArapBillPubUtil;
import nc.bs.arap.util.ArapBillVOUtils;
import nc.bs.arap.util.BillAccountCalendarUtils;
import nc.bs.arap.util.BillDateUtils;
import nc.bs.arap.validator.CrossRuleCheckValidator;
import nc.bs.dao.BaseDAO;
import nc.jdbc.framework.processor.MapProcessor;
import nc.vo.arap.basebill.BaseBillVO;
import nc.vo.arap.gathering.GatheringBillItemVO;
import nc.vo.arap.utils.StringUtil;
import nc.vo.pub.AggregatedValueObject;
import nc.vo.pub.BusinessException;
import nc.vo.pub.CircularlyAccessibleValueObject;
import nc.vo.pub.lang.UFDouble;

import java.util.Map;

public class GatheringbillEditSaveBatchBSAction extends BillUpdateBatchBSAction {
	public GatheringbillEditSaveBatchBSAction() {
		this.validatorCode.add(5);
		this.validatorCode.add(34);
		this.validatorCode.add(57);
		this.validatorCode.add(59);
		this.validatorCode.add(62);
		this.validatorCode.add(93);
		this.validatorCode.add(94);
		this.validatorCode.add(100);
		this.validatorCode.remove(44);
	}

	protected void doBeforeUpdate(AggregatedValueObject[] bills, AggregatedValueObject[] orginBills)
			throws BusinessException {
		ArapBillPubUtil.fillTradeTypeInfo(bills);

		for (AggregatedValueObject bill : bills) {
			ArapBillPubUtil.processMoneyOnlySum(bill);
		}

		/**
		 * 收款单保存校验关联的销售订单实际收款金额是否超过价税合计
		 */
		int i = 0;

		for (AggregatedValueObject bill : bills) {
			AggregatedValueObject oriBill = orginBills[i++];
			BaseBillVO billVO = (BaseBillVO) bill.getParentVO(); // 修改的收款单
			BaseBillVO billOriVO = (BaseBillVO) oriBill.getParentVO(); // 之前的收款单
			UFDouble money = billVO.getMoney(); // 修改后的金额
			UFDouble oriMoney = billOriVO.getMoney(); // 修改前的金额
			String pk_tradetype = billVO.getPk_tradetype();
//			if (!"F2-Cxx-02".equals(pk_tradetype)) {
//				continue;
//			}
			String srcBilltype = ((GatheringBillItemVO)bill.getChildrenVO()[0]).getSrc_billtype();
			if(!"30".equals(srcBilltype)){
				continue;
			}
			String def3 = ((GatheringBillItemVO)bill.getChildrenVO()[0]).getSrc_billid(); // 收款单对应的销售订单id
			if (StringUtil.isEmpty(def3) || "N".equals(def3) || "~".equals(def3)) {
				// 无绑定的销售订单则下一次循环
				continue;
			}
			// 计算收款单金额差值
			UFDouble changeMoney = money.sub(oriMoney);
			// 根据销售订单id去查询销售订单
			BaseDAO dao = new BaseDAO();
			String sql = "select vbillcode,nreceivedmny,ntotalorigmny from so_saleorder where dr = 0 and csaleorderid = '" + def3
					+ "'";

			Map saleMap = (Map) dao.executeQuery(sql, new MapProcessor());
			// 销售订单价税合计
			UFDouble ntotalorigmny = UFDouble.ZERO_DBL;
			// 销售订单实际收款金额
			UFDouble nreceivedmny = UFDouble.ZERO_DBL;
			String vbillcode = "";
			if(saleMap != null) {
				nreceivedmny = new UFDouble(
						saleMap.get("nreceivedmny") == null ? "0" : saleMap.get("nreceivedmny").toString());
				ntotalorigmny = new UFDouble(
						saleMap.get("ntotalorigmny") == null ? "0" : saleMap.get("ntotalorigmny").toString());
				vbillcode = saleMap.get("vbillcode") == null ? "" : saleMap.get("vbillcode").toString();
			}
			if (money.compareTo(ntotalorigmny) > 0) {
				UFDouble moreMoney = money.sub(ntotalorigmny);
				throw new BusinessException("【该笔收款税收合计" + money + "已超销售订单 [" + vbillcode + "] " + moreMoney + "元，无法传输！请检查订单累计收款金额！】");
			}
		}

		ArapBillVOUtils.prepareDefaultInfo(bills, true);
		BillDateUtils.setBillDateByNow(bills);
		int updateType = this.getUpdateType(bills, orginBills);

		for (AggregatedValueObject bill : bills) {
			bill.getParentVO().setStatus(1);
		}

		if (updateType == TEMP_2_SAVE || updateType == SAVE_2_SAVE) {
			for (AggregatedValueObject bill : bills) {
				for (CircularlyAccessibleValueObject item : bill.getChildrenVO()) {
					if (item.getStatus() != 2 && item.getStatus() != 3) {
						item.setStatus(1);
					}
				}
			}
		}

		if (updateType == TEMP_2_SAVE || updateType == SAVE_2_SAVE) {
			BillAccountCalendarUtils.setAccperiodYearMonth(bills);
		}

		this.checkIsCorrdBillMoneyControl(bills, orginBills);
		this.checkOtherSystemBill(bills, orginBills);
		(new CrossRuleCheckValidator()).validate(bills);
	}
}
