<?php
class Service_ApijibaoProcess{
    private $headerkey = array(
        'ADDTIME',
        'AGENT_CODE',
        'AGENT_NAME',
        'AUDIT_DATE',
        'BILL_NO',
        'CAN_BINDING_DATE',
        'CAN_CHANNEL_DATE',
        'CHK_DATE',
        'CHK_STATUS',
        'CONTA_ID',
        'CONTA_MODEL',
        'CONTA_WT',
        'COP_GB_CODE',
        'CUS_CODE',
        'CUS_NAME',
        'CheckMessage',
        'CreateTime',
        'CreateUserID',
        'CreateUserName',
        'DECLARE_REMARK',
        'DECL_PORT',
        'DEDUC_DATE',
        'DESTINATION_PORT',
        'D_DATE',
        'EDITTIME',
        'EMC_EPORTCARD_ID',
        'EMS_COP_NO',
        'EMS_NO',
        'FORM_ID',
        'FORM_ID_XML',
        'FORM_STATUS',
        'FORM_TYPE',
        'FunctionCode',
        'GROSS_WT',
        'INPUT_DATE',
        'INPUT_NO',
        'I_E_DATE',
        'I_E_MODE',
        'I_E_PORT',
        'IsSend',
        'LastEditTime',
        'LastEditUserID',
        'LastEditUserName',
        'Memo',
        'MessageID',
        'MessageType',
        'NET_WT',
        'NOTE_S',
        'OWNER_CODE',
        'OWNER_NAME',
        'PACK_NO',
        'PS_TYPE',
        'PlateNumber',
        'QP_ID',
        'RELATIVE_FORM_ID',
        'RELATIVE_FORM_STATUS',
        'RELATIVE_FORM_TYPE',
        'RELATIVE_TRANS_NO',
        'ReceiverID',
        'Result',
        'SERIAL_NO',
        'SIGN',
        'STATUS',
        'SendTime',
        'SenderID',
        'SynMergeGoods',
        'SynTime',
        'SyncCount',
        'TRADE_CO',
        'TRADE_COUNTRY',
        'TRADE_MODE',
        'TRADE_NAME',
        'TRAF_MODE',
        'TRAF_NAME',
        'TRANS_MODE',
        'TURN_NO',
        'VOYAGE_NO',
        'WRAP_TYPE',
        'CompanyID',
    );
    private $converheaderkey = array(
        '_x003C_ADDTIME_x003E_k__BackingField'=>'ADDTIME',
        '_x003C_AGENT_CODE_x003E_k__BackingField'=>'AGENT_CODE',
        '_x003C_AGENT_NAME_x003E_k__BackingField'=>'AGENT_NAME',
        '_x003C_AUDIT_DATE_x003E_k__BackingField'=>'AUDIT_DATE',
        '_x003C_BILL_NO_x003E_k__BackingField'=>'BILL_NO',
        '_x003C_CAN_BINDING_DATE_x003E_k__BackingField'=>'CAN_BINDING_DATE',
        '_x003C_CAN_CHANNEL_DATE_x003E_k__BackingField'=>'CAN_CHANNEL_DATE',
        '_x003C_CHK_DATE_x003E_k__BackingField'=>'CHK_DATE',
        '_x003C_CHK_STATUS_x003E_k__BackingField'=>'CHK_STATUS',
        '_x003C_CONTA_ID_x003E_k__BackingField'=>'CONTA_ID',
        '_x003C_CONTA_MODEL_x003E_k__BackingField'=>'CONTA_MODEL',
        '_x003C_CONTA_WT_x003E_k__BackingField'=>'CONTA_WT',
        '_x003C_COP_GB_CODE_x003E_k__BackingField'=>'COP_GB_CODE',
        '_x003C_CUS_CODE_x003E_k__BackingField'=>'CUS_CODE',
        '_x003C_CUS_NAME_x003E_k__BackingField'=>'CUS_NAME',
        '_x003C_CheckMessage_x003E_k__BackingField'=>'CheckMessage',
        '_x003C_CreateTime_x003E_k__BackingField'=>'CreateTime',
        '_x003C_CreateUserID_x003E_k__BackingField'=>'CreateUserID',
        '_x003C_CreateUserName_x003E_k__BackingField'=>'CreateUserName',
        '_x003C_DECLARE_REMARK_x003E_k__BackingField'=>'DECLARE_REMARK',
        '_x003C_DECL_PORT_x003E_k__BackingField'=>'DECL_PORT',
        '_x003C_DEDUC_DATE_x003E_k__BackingField'=>'DEDUC_DATE',
        '_x003C_DESTINATION_PORT_x003E_k__BackingField'=>'DESTINATION_PORT',
        '_x003C_D_DATE_x003E_k__BackingField'=>'D_DATE',
        '_x003C_EDITTIME_x003E_k__BackingField'=>'EDITTIME',
        '_x003C_EMC_EPORTCARD_ID_x003E_k__BackingField'=>'EMC_EPORTCARD_ID',
        '_x003C_EMS_COP_NO_x003E_k__BackingField' =>'EMS_COP_NO',
        '_x003C_EMS_NO_x003E_k__BackingField' =>'EMS_NO',
        '_x003C_FORM_ID_x003E_k__BackingField' =>'FORM_ID',
        '_x003C_FORM_ID_XML_x003E_k__BackingField' =>'FORM_ID_XML',
        '_x003C_FORM_STATUS_x003E_k__BackingField' =>'FORM_STATUS',
        '_x003C_FORM_TYPE_x003E_k__BackingField' =>'FORM_TYPE',
        '_x003C_FunctionCode_x003E_k__BackingField' =>'FunctionCode',
        '_x003C_GROSS_WT_x003E_k__BackingField' =>'GROSS_WT',
        '_x003C_INPUT_DATE_x003E_k__BackingField' =>'INPUT_DATE',
        '_x003C_INPUT_NO_x003E_k__BackingField' =>'INPUT_NO',
        '_x003C_I_E_DATE_x003E_k__BackingField' =>'I_E_DATE',
        '_x003C_I_E_MODE_x003E_k__BackingField' =>'I_E_MODE',
        '_x003C_I_E_PORT_x003E_k__BackingField' =>'I_E_PORT',
        '_x003C_IsSend_x003E_k__BackingField' =>'IsSend',
        '_x003C_LastEditTime_x003E_k__BackingField' =>'LastEditTime',
        '_x003C_LastEditUserID_x003E_k__BackingField' =>'LastEditUserID',
        '_x003C_LastEditUserName_x003E_k__BackingField' =>'LastEditUserName',
        '_x003C_Memo_x003E_k__BackingField' =>'Memo',
        '_x003C_MessageID_x003E_k__BackingField' =>'MessageID',
        '_x003C_MessageType_x003E_k__BackingField' =>'MessageType',
        '_x003C_NET_WT_x003E_k__BackingField' =>'NET_WT',
        '_x003C_NOTE_S_x003E_k__BackingField' =>'NOTE_S',
        '_x003C_OWNER_CODE_x003E_k__BackingField' =>'OWNER_CODE',
        '_x003C_OWNER_NAME_x003E_k__BackingField' =>'OWNER_NAME',
        '_x003C_PACK_NO_x003E_k__BackingField' => 'PACK_NO',
        '_x003C_PS_TYPE_x003E_k__BackingField' => 'PS_TYPE',
        '_x003C_PlateNumber_x003E_k__BackingField' =>'PlateNumber',
        '_x003C_QP_ID_x003E_k__BackingField' => 'QP_ID',
        '_x003C_RELATIVE_FORM_ID_x003E_k__BackingField' => 'RELATIVE_FORM_ID',
        '_x003C_RELATIVE_FORM_STATUS_x003E_k__BackingField' =>'RELATIVE_FORM_STATUS',
        '_x003C_RELATIVE_FORM_TYPE_x003E_k__BackingField' => 'RELATIVE_FORM_TYPE',
        '_x003C_RELATIVE_TRANS_NO_x003E_k__BackingField' =>'RELATIVE_TRANS_NO',
        '_x003C_ReceiverID_x003E_k__BackingField' =>'ReceiverID',
        '_x003C_Result_x003E_k__BackingField' =>'Result',
        '_x003C_SERIAL_NO_x003E_k__BackingField' => 'SERIAL_NO',
        '_x003C_SIGN_x003E_k__BackingField' => 'SIGN',
        '_x003C_STATUS_x003E_k__BackingField' =>'STATUS',
        '_x003C_SendTime_x003E_k__BackingField' =>'SendTime',
        '_x003C_SenderID_x003E_k__BackingField' => 'SenderID',
        '_x003C_SynMergeGoods_x003E_k__BackingField' =>'SynMergeGoods',
        '_x003C_SynTime_x003E_k__BackingField' =>'SynTime',
        '_x003C_SyncCount_x003E_k__BackingField' =>'SyncCount',
        '_x003C_TRADE_CO_x003E_k__BackingField' =>'TRADE_CO',
        '_x003C_TRADE_COUNTRY_x003E_k__BackingField' =>'TRADE_COUNTRY',
        '_x003C_TRADE_MODE_x003E_k__BackingField' =>'TRADE_MODE',
        '_x003C_TRADE_NAME_x003E_k__BackingField' =>'TRADE_NAME',
        '_x003C_TRAF_MODE_x003E_k__BackingField' =>'TRAF_MODE',
        '_x003C_TRAF_NAME_x003E_k__BackingField' => 'TRAF_NAME',
        '_x003C_TRANS_MODE_x003E_k__BackingField' => 'TRANS_MODE',
        '_x003C_TURN_NO_x003E_k__BackingField' =>'TURN_NO',
        '_x003C_VOYAGE_NO_x003E_k__BackingField' => 'VOYAGE_NO',
        '_x003C_WRAP_TYPE_x003E_k__BackingField' => 'WRAP_TYPE',
        '_x003C_CompanyID_x003E_k__BackingField'=>'CompanyID',
    );
    private $detailsKey = array(
        'jibao_id',
        'CODE_TS',
        'CURR',
        'CreateTime',
        'DECL_PRICE',
        'DECL_TOTAL',
        'DUTY_MODE',
        'FORM_ID',
        'FORM_ID_XML',
        'G_MODEL',
        'G_NAME_CN',
        'G_NAME_EN',
        'G_NO',
        'G_QTY',
        'G_UNIT',
        'ORIGIN_COUNTRY',
        'QTY_1',
        'QTY_2',
        'UNIT_1',
        'UNIT_2'
    );
    private $gatherDetailsAfterKey = array(
        'jibao_id',
        'ADDTIME',
        'ADDWHO',
        'BIND_DATE',
        'CAR_NO',
        'CHANNEL_DATE',
        'CODE_TS',
        'CURR',
        'CreateTime',
        'CreateUserID',
        'DECL_PRICE',
        'DECL_TOTAL',
        'DUTY_MODE',
        'EDITTIME',
        'EDITWHO',
        'FORM_ID',
        'FORM_ID_XML',
        'GATHER_FORM_ID_XML',
        'GOODS_ID',
        'G_MODEL',
        'G_NAME_CN',
        'G_NAME_EN',
        'G_NO',
        'G_QTY',
        'G_UNIT',
        'LastEditTime',
        'LastEditUserID',
        'MERGER_G_NO',
        'MERGER_MODE',
        'MessageID',
        'NOTE_S',
        'ORIGIN_COUNTRY',
        'QTY_1',
        'QTY_2',
        'STATUS',
        'UNIT_1',
        'UNIT_2',
        'URM_NO',
        'USE_TO',
        'wlNubber'
    );
    private $gatherDetailsBeforeKey = array(
        'jibao_id',
        'CODE_TS',
        'CURR',
        'DECL_PRICE',
        'DECL_TOTAL',
        'FORM_ID',
        'FORM_ID_XML',
        'GOODS_ID',
        'G_MODEL',
        'G_NAME_CN',
        'G_NO',
        'G_QTY',
        'G_UNIT',
        'ORIGIN_COUNTRY',
        'QTY_1',
        'QTY_2',
        'UNIT_1',
        'UNIT_2'
    );
	/**
	 * @author william-fan
	 * @todo 处理集报
	 * @param $jibaoinfo(招宝返回的集报数据)
	 */
	public function jibaoprocess($jibaoinfos,$jibaoformid){
		$db = Common_Common::getAdapter();
		$db->beginTransaction();
		try{
			
			Service_ApiJibaoHeader::delete($jibaoformid,'FORM_ID');
			Service_ApiJibaoGatherDetails::delete($jibaoformid,'jibao_id');
			Service_ApiJibaoGatherDetailsAfter::delete($jibaoformid,'jibao_id');
			Service_ApiJibaoGatherDetailsBefore::delete($jibaoformid,'jibao_id');
			
			
			//集报header
			$header = $jibaoinfos['GetGatherOrderResult']['Header'];
            $apiJH = array();
			/* print_r($header);
			return; */
			if(!empty($header)){
                foreach($header as $key=>$h){
                    /*if(!in_array($key,$this->headerkey)){
                        unset($header[$key]);
                    }*/
                    if(isset($this->converheaderkey[$key])){
                        $apiJH[$this->converheaderkey[$key]] = $h;
                    }
                }
				$ajh_id=Service_ApiJibaoHeader::add($apiJH);
				if(!$ajh_id){
					throw new Exception("集报表头数据插入错误");
				}
			}else{
				throw new Exception("集报头数据为空");
			}
			
			if(isset($ajh_id) && $ajh_id>0){
				//api_jibao_gather_details
				$details = $jibaoinfos['GetGatherOrderResult']['Details']['Tbl_IDX_CUSTOM_IE_GATHER_DETAILS'];
                if(!isset($details[0])){
                    $details = array($details);
                }
				if(!empty($details)){
					foreach($details as $key=>$gatherDetail){
                        //echo 'gather:';var_dump($gatherDetail);
                        /*unset($gatherDetail['CodeTx']);
                        unset($gatherDetail['CompanyID']);
                        unset($gatherDetail['Tax']);*/
                        foreach($gatherDetail as $k=>$v){
                            if(!in_array($k,$this->detailsKey)){
                                unset($gatherDetail[$k]);
                            }
                        }
                        $gatherDetail['ajh_id'] = $ajh_id;
                        $gatherDetail['jibao_id'] = $jibaoformid;
						$ajgd_id=Service_ApiJibaoGatherDetails::add($gatherDetail);
						if(!$ajgd_id){
							throw new Exception("插入api_jibao_gather_details错误");
						}
					}
				}else{
					throw new Exception("集报单gather_details数据异常");
				}
				//api_jibao_gather_details_after
				$detailsAfter = $jibaoinfos['GetGatherOrderResult']['GatherDetailsAfter']['Tbl_IDX_CUSTOM_IE_DETAILS'];
                if(!isset($detailsAfter[0])){
                    $detailsAfter = array($detailsAfter);
                }
				if(!empty($detailsAfter)){
					$wlNumber = 1;
					foreach($detailsAfter as $key=>$gatherDetailafter){
                        /*unset($gatherDetailafter['CodeTx']);
                        unset($gatherDetailafter['RegisterID']); //validate
                        unset($gatherDetailafter['CompanyID']);
                        unset($gatherDetailafter['Tax']);*/
                        foreach($gatherDetailafter as $k=>$v){
                            if(!in_array($k,$this->gatherDetailsAfterKey)){
                                unset($gatherDetailafter[$k]);
                            }
                        }
                        $gatherDetailafter['ajh_id'] = $ajh_id;
                        $gatherDetailafter['jibao_id'] = $jibaoformid;
                        $gatherDetailafter['wlNubber'] = $wlNumber;
						$ajgda_id=Service_ApiJibaoGatherDetailsAfter::add($gatherDetailafter);
						if(!$ajgda_id){
							throw new Exception("插入api_gather_details_after错误");
						}
						$wlNumber++;
					}
				}else{
					throw new Exception("集报单gather_details_after数据异常");
				}
				//api_jibao_gather_details_before
				$detailsBefore = $jibaoinfos['GetGatherOrderResult']['GatherDetailsBefore']['V_IDX_CUSTOM_IE_GATHERDETAILS'];
                if(!isset($detailsBefore[0])){
                    $detailsBefore = array($detailsBefore);
                }
				if(!empty($detailsBefore)){
					foreach($detailsBefore as $key=>$gatherDetailBefore){
                        /*unset($gatherDetailBefore['CodeTx']);
                        unset($gatherDetailBefore['RegisterID']);
                        unset($gatherDetailBefore['CompanyID']);
                        unset($gatherDetailBefore['Tax']);*/
                        foreach($gatherDetailBefore as $k=>$v){
                            if(!in_array($k,$this->gatherDetailsBeforeKey)){
                                unset($gatherDetailBefore[$k]);
                            }
                        }
                        $gatherDetailBefore['ajh_id'] = $ajh_id;
                        $gatherDetailBefore['jibao_id'] = $jibaoformid;
						$ajgdb_id=Service_ApiJibaoGatherDetailsBefore::add($gatherDetailBefore);
						if(!$ajgdb_id){
							throw new Exception("插入api_jibao_gather_details_before错误");
						}
					}
				}else{
					throw new Exception("集报单gather_details_before数据异常");
				}
				
				//更新api_jibao_formid
				
				$apiFormidRow = array(
					'status'=>'1'		
				);
				Service_ApiJibaoFormid::update($apiFormidRow, $jibaoformid,'FORM_ID');
				
				
				
			}else{
				throw new Exception("集报表头数据错误");
			}
			
			//$db->rollback();
			$db->commit();
			echo '集报单['.$jibaoformid."]插入数据成功"."\r\n";
			return true;
		}catch(Exception $e){
    		//$db->rollback();
			echo '集报单['.$jibaoformid."]数据异常:".$e->getMessage()."\r\n";
    	}
    	//echo '';
    	return false;
	}

    public function updateJibaoProcess($jibaoinfos,$jibaoformid){
        $db = Common_Common::getAdapter();
        $db->beginTransaction();
        try{
            $header = $jibaoinfos['GetGatherOrderResult']['Header'];
            $apiJH = array();
            if(!empty($header)){
                foreach($header as $key=>$h){
                    /*if(!in_array($key,$this->headerkey)){
                        unset($header[$key]);
                    }*/
                    if(isset($this->converheaderkey[$key])){
                        $apiJH[$this->converheaderkey[$key]] = $h;
                    }
                }
                $updateJibao = array(
                    'RELATIVE_FORM_ID'=>$header['_x003C_RELATIVE_FORM_ID_x003E_k__BackingField'],
                );
                if($updateJibao['RELATIVE_FORM_ID']!=""){
                    Service_ApiJibaoHeader::update($updateJibao,$jibaoformid,'FORM_ID');
                    $apiFormidRow = array(
                        'status'=>'2'
                    );
                    Service_ApiJibaoFormid::update($apiFormidRow, $jibaoformid,'FORM_ID');
                }
            }else{
                throw new Exception("集报头数据为空");
            }
            $db->commit();
            return true;
        }catch (Exception $e){
            $db->rollback();
            echo '集报单['.$jibaoformid."]数据异常:".$e->getMessage()."\r\n";
            return false;
        }
    }
	
}