package nc.ba.cmp.listener;

import java.util.Map;

import nc.bs.businessevent.BdUpdateEvent;
import nc.bs.businessevent.BusinessEvent;
import nc.bs.businessevent.IBusinessEvent;
import nc.bs.businessevent.IBusinessListener;
import nc.bs.dao.BaseDAO;
import nc.jdbc.framework.processor.MapProcessor;
import nc.vo.cmp.settlement.SettlementAggVO;
import nc.vo.pub.AggregatedValueObject;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFDateTime;
/**
 *  结算单，结算后，付款后，校验签字审批日期
 * @author xug
 *
 */
public class GXPubCheckListener implements IBusinessListener {
	public void doAction(IBusinessEvent event) throws BusinessException {
		
		String souid = event.getSourceID();
		String type = event.getEventType();
		AggregatedValueObject[] bills = getBills(event);

		if("11bc9226-f881-46bd-b3bf-38a70424ac8b".equals(souid)){ //结算
//			应收管理下应收单：收款单（内转）F2-Cxx-01	
//			天问付款单（物业） F3-Cxx-D41
//			物业付款单（明源）F3-Cxx-W01
//          账扣付款单（物业） F3-Cxx-W04
			
//			天问收款单（物业）F2-Cxx-D51
//			采购付款单 F3-Cxx-D42
//			应付管理下应付单：付款单（内转）F3-Cxx-D01 
			
//			收款单（内转），收款单（内转）没有审批日期<签字日期
//			天问付款单（物业），物业付款单（明源），采购付款单 没有 审批日期<签字日期
			
//			天问收款单 没有 结算日期<签字日期		
//			剩余的都是有结算日期<签字日期的校验   
			if("CMPsettleAfter".equals(type)){//结算后
				for (AggregatedValueObject aggregatedValueObject : bills) {
					SettlementAggVO aggvo = (SettlementAggVO) aggregatedValueObject;
					String jsid = aggvo.getParentVO().getPrimaryKey();
//					String billcode = (String) aggvo.getParentVO().getAttributeValue("billcode");
					
					String sql = "SELECT * from v_gx_jscherk where PK_SETTLEMENT = '"+jsid+"' ";
							
					BaseDAO dao = new BaseDAO();
					
					Map<String,String> mapdata = (Map<String,String>) dao.executeQuery(sql, new MapProcessor());
					
					if(mapdata != null && mapdata.size() > 0) {
						
						String pk_tradetype = mapdata.get("pk_tradetype");
						String sprq = mapdata.get("sprq");
						String qzrq = mapdata.get("signdate");
						String jsrq = mapdata.get("settledate");
						String str1=sprq.substring(5,7);
						String str2=qzrq.substring(5,7);
						//收款单（内转），收款单（内转）审批日期>签字日期  报错
						if("F2-Cxx-01".equals(pk_tradetype)) {
							if(new UFDateTime(sprq).compareTo(new UFDateTime(qzrq))>0) {
								throw new BusinessException("收款单（内转）【审批日期】不能大于【签字日期】!");
							}
						}
//						天问付款单（物业），物业付款单（明源），采购付款单 审批日期>签字日期   报错
						else if("F3-Cxx-D41".equals(pk_tradetype) || "F3-Cxx-W01".equals(pk_tradetype)) {
							if(new UFDateTime(sprq).compareTo(new UFDateTime(qzrq))>0) {
								if("F3-Cxx-D41".equals(pk_tradetype)) {
									throw new BusinessException("天问付款单（物业）,【审批日期】不能大于【签字日期】!");
								}else if ("F3-Cxx-W01".equals(pk_tradetype)) {
									throw new BusinessException("物业付款单（明源）,【审批日期】不能大于【签字日期】!");
								}
							}
						}
//                      账扣付款单（物业） 审批日期>单据日期  报错 update by hef
						else if("F3-Cxx-W04".equals(pk_tradetype)) {
							if(!str1.equals(str2)) {
								throw new BusinessException("审批日期与单据日期不同月，异常，请切换右上角登陆日期回正确的月份再操作审批！");
							}
						}
//						天问收款单 结算日期>签字日期	报错
						else if("F2-Cxx-D51".equals(pk_tradetype)) {
							if(new UFDateTime(jsrq).compareTo(new UFDateTime(qzrq))>0) {
								throw new BusinessException("天问收款单 ,【结算日期】不能大于【签字日期】!");
							}
						}
//						剩余的都是有  结算日期>签字日期	报错 的校验	 采购付款单 F3-Cxx-D42  结算日期>签字日期	报错
						else if("F3-Cxx-D42".equals(pk_tradetype)) {
							if(new UFDateTime(jsrq).compareTo(new UFDateTime(qzrq))>0) {
								throw new BusinessException("采购付款单 ,【结算日期】不能大于【签字日期】!");
							}
						}
//						应付管理下应付单：付款单（内转）F3-Cxx-D01  结算日期>签字日期	报错
						else if("F3-Cxx-D01".equals(pk_tradetype)) {
							if(new UFDateTime(jsrq).compareTo(new UFDateTime(qzrq))>0) {
								throw new BusinessException("付款单（内转） ,【结算日期】不能大于【签字日期】!");
							}
						}
					}
				}
				
			}
			
			if("CMPsignAfter".equals(type)) {//签字后
				for (AggregatedValueObject aggregatedValueObject : bills) {
					SettlementAggVO aggvo = (SettlementAggVO) aggregatedValueObject;
					String jsid = aggvo.getParentVO().getPrimaryKey();
//					String billcode = (String) aggvo.getParentVO().getAttributeValue("billcode");
					
					String sql = "SELECT * from v_gx_jscherk where PK_SETTLEMENT = '"+jsid+"' ";
							
					BaseDAO dao = new BaseDAO();
					
					Map<String,String> mapdata = (Map<String,String>) dao.executeQuery(sql, new MapProcessor());
					
					if(mapdata != null && mapdata.size() > 0) {
						
						String pk_tradetype = mapdata.get("pk_tradetype");
						String sprq = mapdata.get("sprq");
						String qzrq = mapdata.get("signdate");
						String jsrq = mapdata.get("settledate");
						
						//收款单（内转），收款单（内转）审批日期>签字日期  报错
						if("F2-Cxx-01".equals(pk_tradetype)) {
							if(new UFDateTime(sprq).compareTo(new UFDateTime(qzrq))>0) {
								throw new BusinessException("收款单（内转）【审批日期】不能大于【签字日期】!");
							}
						}
//						天问付款单（物业），物业付款单（明源），采购付款单 审批日期>签字日期   报错
						else if("F3-Cxx-D41".equals(pk_tradetype) || "F3-Cxx-W01".equals(pk_tradetype)) {
							if(new UFDateTime(sprq).compareTo(new UFDateTime(qzrq))>0) {
								if("F3-Cxx-D41".equals(pk_tradetype)) {
									throw new BusinessException("天问付款单（物业）,【审批日期】不能大于【签字日期】!");
								}else if ("F3-Cxx-W01".equals(pk_tradetype)) {
									throw new BusinessException("物业付款单（明源）,【审批日期】不能大于【签字日期】!");
								}
							}
						}
//						天问收款单 结算日期>签字日期	报错
						else if("F2-Cxx-D51".equals(pk_tradetype)) {
							if(new UFDateTime(jsrq).compareTo(new UFDateTime(qzrq))>0) {
								throw new BusinessException("天问收款单 ,【结算日期】不能大于【签字日期】!");
							}
						}
//						剩余的都是有  结算日期>签字日期	报错 的校验	 采购付款单 F3-Cxx-D42  结算日期>签字日期	报错
						else if("F3-Cxx-D42".equals(pk_tradetype)) {
							if(new UFDateTime(jsrq).compareTo(new UFDateTime(qzrq))>0) {
								throw new BusinessException("采购付款单 ,【结算日期】不能大于【签字日期】!");
							}
						}
//						应付管理下应付单：付款单（内转）F3-Cxx-D01  结算日期>签字日期	报错
						else if("F3-Cxx-D01".equals(pk_tradetype)) {
							if(new UFDateTime(jsrq).compareTo(new UFDateTime(qzrq))>0) {
								throw new BusinessException("付款单（内转） ,【结算日期】不能大于【签字日期】!");
							}
						}
					}
				}
			
			}
		}
	}
	
	
	
	private AggregatedValueObject[] getBills(IBusinessEvent event)
	{
	  Object object = null;
	  if ((event instanceof BusinessEvent)) {
	    BusinessEvent e = (BusinessEvent)event;
	    object = e.getObject();
	  } else if ((event instanceof BdUpdateEvent)) {
	    BdUpdateEvent e = (BdUpdateEvent)event;
	    object = e.getNewObject();
	  }
	  
	  AggregatedValueObject[] bills = null;
	  if (null != object) {
	    if (object.getClass().isArray()) {
	      bills = (AggregatedValueObject[])object;
	    } else {
	      bills = new AggregatedValueObject[1];
	      bills[0] = ((AggregatedValueObject)object);
	    }
	  }
	  return bills;
	}
}
