<?php

class flow_oafkClassModel extends flowModel

{
    public function flowrsreplace($rs)
    {
        if($rs['contractNumber']) $rs['contractNumber'] = $this->getContractByTag($rs['contractNumber']);
        return $rs;
    }

     

protected function flowcheckafter($zt, $sm){
    $flowid=$this->getflow();
   
    if($flowid['nowcheckid']=='1085'){

        $payee = $this->rs['payee'];//收款方
        $supplier = m('supplier')->getone("name = '$payee' ",'number');
        $details_fk=$this->db->getrows('oa_c_fund_details_fk',"mid='".$this->rs['id']."'");

        $arr=[];
        foreach ($details_fk as $k=>  $value) {
            foreach ($value as $key => $val) {
                switch ($key) {

                    case 'charge_type':

                      $arr['FPAYBILLENTRY'][$k]['F_KXType']['FNUMBER']=self::getkxlx($val);

                        break;

                    case 'cbzx_code':

                        $arr['FPAYBILLENTRY'][$k]['F_PAEZ_Cbzx']['FNUMBER']=substr($val,0,strpos($val, "（"));;


                        break;
                    case 'charge_amount':

                        $arr['FPAYBILLENTRY'][$k]['FPAYTOTALAMOUNTFOR']=$val;
                        $arr['FPAYBILLENTRY'][$k]['FPAYAMOUNTFOR_E']=$val;
                        $arr['FPAYBILLENTRY'][$k]['FSETTLEPAYAMOUNTFOR']=$val;
                        $arr['FPAYBILLENTRY'][$k]['FREALPAYAMOUNTFOR_D']=$val;
                       
                        break;

                    default:
                        $arr['FPAYBILLENTRY'][$k]['FSETTLETYPEID']['FNumber']='JSFS04_SYS';
                        $arr['FPAYBILLENTRY'][$k]['FPURPOSEID']['FNumber']='SFKYT12_SYS';
                        $arr['FPAYBILLENTRY'][$k]['FACCOUNTID']['FNumber']='10285000001001779';

                        $arr['FPAYBILLENTRY'][$k]['FPOSTDATE']=$this->rs['applydt'].' 00:00:00';
                        // $arr['FPAYBILLENTRY'][$k]['FOPPOSITEBANKACCOUNT']=$data['bank_code'];
                        // $arr['FPAYBILLENTRY'][$k]['FOPPOSITECCOUNTNAME']=$data['bank_holder'];
                        // $arr['FPAYBILLENTRY'][$k]['FOPPOSITEBANKNAME']=$data['open_bank_name'];
                        // $arr['FPAYBILLENTRY'][$k]['FOpenAddressRec']=$data['open_address'];

                        break;
                }
            }
        }


         $cloudUrl = "http://36.110.39.211/k3cloud/";
        //登陆参数
        $data = array(
           '5e64f6ff0bd47f',//帐套Id
            // '5ef2c166ad1afa',//帐套Id
            'Administrator',//用户名
            '666666',//密码
            '2052'//语言标识359010087
        );
        //定义记录Cloud服务端返回的Session
        $cookie_jar = tempnam('/tmp','CloudSession');
        $post_content = self::create_postdata($data);
        $result = self::invoke_login($cloudUrl,$post_content,$cookie_jar);
        header("Content-type: text/html; charset=utf8");
        $applicant=$this->rs['applicant'];//申请人
        $applicationdpt=$this->rs['applicationdpt'];//申请部门
        $applydt=$this->rs['applydt'];//申请日期


        $data_model ='{
                    "Creator": "",
                    "NeedUpDateFields": [],
                    "NeedReturnFields": [],
                    "IsDeleteEntry": "true",
                    "SubSystemId": "",
                    "IsVerifyBaseDataField": "false",
                    "IsEntryBatchFill": "true",
                    "ValidateFlag": "true",
                    "NumberSearch": "true",
                    "InterationFlags": "",
                    "IsAutoSubmitAndAudit": "false",
                    "Model": {
                        "FID": 0,
                        "FBillTypeID": {
                            "FNUMBER": "FKDLX10_SYS"
                        },
                        "FDATE": "2020-08-02 00:00:00",
                        "FCONTACTUNITTYPE": "BD_Supplier",
                        "FCONTACTUNIT": {
                            "FNumber": "GDGYS-0002"
                        },
                        "FRECTUNITTYPE": "BD_Supplier",
                        "FRECTUNIT": {
                            "FNumber": "GDGYS-0002"
                        },
                        "FDepartment": {
                            "FNumber": ""
                        },
                        "FISINIT": false,
                        "FCURRENCYID": {
                            "FNumber": "PRE001"
                        },
                        "FEXCHANGERATE": 1.0,
                        "FSETTLERATE": 1.0,
                        "FSETTLEORGID": {
                            "FNumber": "1000"
                        },
                        "FDOCUMENTSTATUS": "Z",
                        "FCancelStatus": "A",
                        "FPAYORGID": {
                            "FNumber": "1000"
                        },
                        "FISSAMEORG": true,
                        "FIsCredit": false,
                        "FSETTLECUR": {
                            "FNUMBER": "PRE001"
                        },
                        "FIsWriteOff": false,
                        "FREALPAY": false,
                        "FISCARRYRATE": false,
                        "FSETTLEMAINBOOKID": {
                            "FNUMBER": "PRE001"
                        },
                        "F_PAEZ_OADJBH": "123213"
                       
                    }
                }';
        $model=json_decode($data_model,true);


        $model['Model']['FDATE']=$applydt;
        $model['Model']['F_PAEZ_OADJBH']=$this->rs['docnum'];
        $model['Model']['FCONTACTUNIT']['FNumber']=$supplier['number'];
        $model['Model']['FRECTUNIT']['FNumber']=$supplier['number'];
        $model['Model']['FDepartment']['FNumber']=self::dept($this->rs['applicationdpt']);
        $model['Model']['FSETTLEORGID']['FNumber']=self::getorg($this->rs['fkorg']);
        $model['Model']['FPAYORGID']['FNumber']=self::getorg($this->rs['fkorg']);
        $model['Model']['FPAYBILLENTRY']=$arr['FPAYBILLENTRY'];
      
        $data_model=json_encode($model);
        $data = array(
            'AP_PAYBILL',//业务对象标识FormId
            $data_model//具体Json字串
        );

        $post_content = self::create_postdata($data);
        $result = self::invoke_add($cloudUrl,$post_content,$cookie_jar);
        $array = json_decode($result,true);
        $num=$array['Result']['Number'];

        if($array['Result']['ResponseStatus']['IsSuccess']){
            $this->update("`fbillno`='$num'", $this->rs['id']);

            $this->erplog($this->rs['docnum'],'c_fininfom_oafk','保存成功',json_encode($array),date("Y-m-d H:i:s"),2,$num,$array['Result']['Id'],1);

        }else{

            $this->erplog($this->rs['docnum'],'c_fininfom_oafk','保存失败',json_encode($array),date("Y-m-d H:i:s"),1,$num,$array['Result']['Id'],1);
        }

    }




}

 static function getkxlx($name)
    {

        $data = m('option')->getone("num='kxtype'", 'id,name');
        $kxlxlist = m('option')->getone("pid='".$data['id']."' and  name='".$name."'", 'name,num');
        return $kxlxlist['num'];
    }
     static function getorg($name)
    {

        $data = m('option')->getone("num='organization'", 'id,name');
        $orglist = m('option')->getone("pid='".$data['id']."' and  name='".$name."'", 'name,num');
        return $orglist['num'];
    }

  public static function dept($data)
    {
        $sql="  name= '$data'";
        $data = m('tmp_department')->getone($sql, 'id,number');//查询账户表成本中心id
        return $data['number'];
    }

    private function erplog($sericnum,$table,$name,$remark,$optdt,$level,$fbillno,$fbillnoid,$fbillno_type){
        $erp_log=array(
            'sericnum'=> $sericnum,
            'table'=>$table,
            'name' => $name,
            'remark' => $remark,
            'optdt'  =>$optdt,
            'level'=>$level,
            'fbillno'=>$fbillno,
            'fbillnoid'=>$fbillnoid,
            'fbillno_type'=>$fbillno_type,

        );

        m('erplog')->insert($erp_log);

    }


    //二级 或一级审批同意之后进行预扣款
    protected function flowcheckbefore($zt, $sm){
        $id=$this->rs['id'];
        $sql = " mid ='$id' and `table`='c_fininfom_oafk' ";
        $flow_bill = m('flow_bill')->getone($sql,'allcheckid');
        $allcheckid=explode(',',$flow_bill['allcheckid']);
        
         $optionid = m('option')->getone("num = 'oafk_manager' ",'id');
        $optionid=$optionid['id'];

        $option = m('option')->getall("pid = '$optionid' and num =1 order by sort desc",'num,name,value,sort');
        foreach ($option as $key => $value) {
            if(in_array($value['value'], $allcheckid)){
                $checkid= $value['value'];
                break;
            }
        }

        if(empty($checkid)){
            $option = m('option')->getall("pid = '$optionid'  and num =2 order by sort desc",'num,name,value,sort,`explain`');
            foreach ($option as $key => $value) {
            if(in_array($value['value'], $allcheckid)){
                $checkid= $value['value'];
                $explain= $value['explain'];
                break;
            }
          }
        }


        //zt 1代表同意
        if($zt==1){
        $flowid=$this->getflow();
        if($explain){
        if($flowid['nowcheckid']==$checkid &&  $flowid['nowcourseid']==$explain){
              $data = m('c_fund_details_fk')->getall('mid='.$this->rs['id'], 'id,cbzx_code,charge_amount');


              foreach($data as $v){
                    if(!isset($ret[$v['cbzx_code']])){
                        $ret[$v['cbzx_code']] = $v;
                    }else{
                        $ret[$v['cbzx_code']]['charge_amount'] += $v['charge_amount'];
                    }
                }
               $ret = array_values($ret);
              foreach ($ret as $key => $vo) {
                 $cbzx_code=$vo['cbzx_code'];
                 $sql = " cost_id='$cbzx_code' and status = 1 and  is_default=1";
                 $cost = m('c_fund_account')->getone($sql, 'id,type,name,freeze_amount,account_balance');//查询账户表成本中心
                                 
                 if(($cost['account_balance']-$cost['freeze_amount'])<$vo['charge_amount']){
                     return $cost['name']."余额不足";die;
                 }
                
              }


              foreach ($data as $ke => $ve) {
                 $cbzx_code=$ve['cbzx_code'];
                 $sql = " cost_id='$cbzx_code' and status = 1 and  is_default=1";
                 $cost = m('c_fund_account')->getone($sql, 'id,type,name,freeze_amount,account_balance');//查询账户表成本中心
                 $id=$cost['id'];

                 $c_withhold = array(
                    'fund_account_id' => $id,
                    'docnum' => $this->rs['docnum'],
                    'cost_id' => $ve['cbzx_code'],
                    'amount' =>  $ve['charge_amount'],
                    'status' => 1,
                    'create_time' => date("Y-m-d H:i:s"),
                    'uid' => $this->rs['uid'],
                  );
                 m('c_withhold')->insert($c_withhold);

                //修改冻结余额
                 $freeze = array(
                  'freeze_amount' => $cost['freeze_amount'] + $ve['charge_amount'],
                );
            
                m('c_fund_account')->update($freeze, "`id`='$id'");
              }
            }
        }else{
                if($flowid['nowcheckid']==$checkid){
              $data = m('c_fund_details_fk')->getall('mid='.$this->rs['id'], 'id,cbzx_code,charge_amount');
               foreach($data as $v){
                    if(!isset($ret[$v['cbzx_code']])){
                        $ret[$v['cbzx_code']] = $v;
                    }else{
                        $ret[$v['cbzx_code']]['charge_amount'] += $v['charge_amount'];
                    }
                }
               $ret = array_values($ret);
              foreach ($ret as $key => $vo) {
                 $cbzx_code=$vo['cbzx_code'];
                 $sql = " cost_id='$cbzx_code' and status = 1 and  is_default=1";
                 $cost = m('c_fund_account')->getone($sql, 'id,name,type,freeze_amount,account_balance');//查询账户表成本中心id
                 if(($cost['account_balance']-$cost['freeze_amount'])<$vo['charge_amount']){
                      return $cost['name']."余额不足";die;
                 }
               
              }

                foreach ($data as $ke => $ve) {
                 $cbzx_code=$ve['cbzx_code'];
                 $sql = " cost_id='$cbzx_code' and status = 1 and  is_default=1";
                 $cost = m('c_fund_account')->getone($sql, 'id,name,type,freeze_amount,account_balance');//查询账户表成本中心id 
                 $id=$cost['id'];

                 $c_withhold = array(
                    'fund_account_id' => $id,
                    'docnum' => $this->rs['docnum'],
                    'cost_id' => $ve['cbzx_code'],
                    'amount' =>  $ve['charge_amount'],
                    'status' => 1,
                    'create_time' => date("Y-m-d H:i:s"),
                    'uid' => $this->rs['uid'],
                  );
                 m('c_withhold')->insert($c_withhold);

                //修改冻结余额
                 $freeze = array(
                  'freeze_amount' => $cost['freeze_amount'] + $ve['charge_amount'],
                );
            
                m('c_fund_account')->update($freeze, "`id`='$id'");
                }
            }
          }
         }else{
                 $docnum=$this->rs['docnum'];
                 //将单据状态作废余额
                
                 $withhold_cost = m('c_withhold')->getall("docnum='$docnum' and status =1", 'id,cost_id,amount');
       
                 foreach ($withhold_cost as $key => $vo) {
                 //减去冻结金额
                 $cost_id=$vo['cost_id'];
                 $sql = " cost_id='$cost_id' and status = 1 and  is_default=1";
                 $fund_account_cost = m('c_fund_account')->getone($sql, 'id,freeze_amount');
              
                 $id=$fund_account_cost['id'];
                 $freeze = array(
                  'freeze_amount' => $fund_account_cost['freeze_amount'] - $vo['amount'],
                );
               
                m('c_fund_account')->update($freeze, "`id`='$id'");
              
                }


                 $status = array(
                  'status' => 0,
                 );
                 m('c_withhold')->update($status, "docnum='$docnum'");
         }
     }
    


    public function oafk_submit($cloudUrl,$cookie_jar,$id,$number){
        $start_time = microtime(true);

        $data_model ="{
             'CreateOrgId': 0,
             'Numbers': [],
             'Ids': $id,
             'SelectedPostId': 0
         }";
        $data = array(
            'AP_PAYBILL',//业务对象标识FormId
            $data_model//具体Json字串
        );

        $post_content = self::create_postdata($data);

        $result = self::invoke_submit($cloudUrl,$post_content,$cookie_jar);


        $array = json_decode($result,true);


        return $array;

    }



    //登陆
    static     function invoke_login($cloudUrl,$post_content,$cookie_jar)
    {
        $loginurl = $cloudUrl.'Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc';
        return self::invoke_post($loginurl,$post_content,$cookie_jar,TRUE);
    }
    //查询
    static    function invoke_save($cloudUrl,$post_content,$cookie_jar)
    {
        $invokeurl = $cloudUrl.'Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.View.common.kdsvc';
        return self::invoke_post($invokeurl,$post_content,$cookie_jar,FALSE);
    }
    //添加
    static    function invoke_add($cloudUrl,$post_content,$cookie_jar)
    {
        $invokeurl = $cloudUrl.'Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc';
        return self::invoke_post($invokeurl,$post_content,$cookie_jar,FALSE);
    }
    //提交
    static    function invoke_submit($cloudUrl,$post_content,$cookie_jar)
    {
        $invokeurl = $cloudUrl.'Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Submit.common.kdsvc';
        return self::invoke_post($invokeurl,$post_content,$cookie_jar,FALSE);
    }

    //审核
    static     function invoke_audit($cloudUrl,$post_content,$cookie_jar)
    {
        $invokeurl = $cloudUrl.'Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit.common.kdsvc';
        return self::invoke_post($invokeurl,$post_content,$cookie_jar,FALSE);
    }

    static   function invoke_post($url,$post_content,$cookie_jar,$isLogin)
    {
        $ch = curl_init($url);

        $this_header = array(
            'Content-Type: application/json',
            'Content-Length: '.strlen($post_content)
        );

        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($ch, CURLOPT_HTTPHEADER, $this_header);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_content);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        if($isLogin){
            curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
        }
        else{
            curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);
        }
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);

        $result = curl_exec($ch);
        curl_close($ch);

        return $result;
    }
    static function getbxlx($name)
    {

        $data = m('c_bxlx')->getone("name='".$name."'", 'name,number');
        return $data['number'];
    }

    //构造Web API请求格式
    static     function create_postdata($args) {
        $postdata = array(
            'format'=>1,
            'useragent'=>'ApiClient',
            'rid'=>self::create_guid(),
            'parameters'=>$args,
            'timestamp'=>date('Y-m-d'),
            'v'=>'1.0'
        );
        return json_encode($postdata);
    }

    //生成guid
    static    function create_guid() {
        $charid = strtoupper(md5(uniqid(mt_rand(), true)));
        $hyphen = chr(45);// "-"
        $uuid = chr(123)// "{"
            .substr($charid, 0, 8).$hyphen
            .substr($charid, 8, 4).$hyphen
            .substr($charid,12, 4).$hyphen
            .substr($charid,16, 4).$hyphen
            .substr($charid,20,12)
            .chr(125);// "}"
        return $uuid;
    }


}