<?php
/**
 * @todo 生成核注单重写。要根据每个业务类型填写相应的数据
 */
class Api_Pre_PreDataToInvtProcess{
    protected $bg_pri_entry_data;
    protected $bg_pri_entry_data_detail_body_head;
    protected $bg_pri_entry_data_detail_body_containers;
    protected $bg_pri_entry_data_detail_body_detail;
    protected $bg_pri_entry_data_detail_body_licensedocu;
    protected $id; //业务主键id 根据bg_pri_entry_data_detail_body_head表的主键bpedbh_id
    protected $error;
    protected $baseinfo; //基本信息
    protected $companyInfo; //公司信息

    public function __construct($id){
        $this->id = $id;
    }
    /**
     * @todo 根据不通的业务类型修正正确数据
     */
    public function fixData(){
    }
    public function getError(){
        return $this->error;
    }
    /**
     * @todo 获取基础信息
     */
    public function getBaseInfo()
    {
        $id = $this->id;

        try{
            $bg_pri_entry_data_detail_body_head =  Service_BgPriEntryDataDetailBodyHead::getByField($id,'bpedbh_id');
            if(!empty($bg_pri_entry_data_detail_body_head)){
                $this->bg_pri_entry_data_detail_body_head=$bg_pri_entry_data_detail_body_head;
                $bg_pri_entry_data = Service_BgPriEntryData::getByField($this->bg_pri_entry_data_detail_body_head['bped_id'],'bped_id');
                $this->bg_pri_entry_data = $bg_pri_entry_data;
                $preDataInfo = $bg_pri_entry_data_detail_body_head;
                $condition = array(
                    'bpedbh_id'=>$id,
                );
                $bg_pri_entry_data_detail_body_detail = Service_BgPriEntryDataDetailBodyDetail::getByCondition($condition,'*');
                $this->bg_pri_entry_data_detail_body_detail = $bg_pri_entry_data_detail_body_detail;
                $bg_pri_entry_data_detail_body_containers = Service_BgPriEntryDataDetailBodyContainers::getByCondition($condition,'*');
                $this->bg_pri_entry_data_detail_body_containers = $bg_pri_entry_data_detail_body_containers;
                $bg_pri_entry_data_detail_body_licensedocu = Service_BgPriEntryDataDetailBodyLicensedocu::getByCondition($condition,'*');
                $this->bg_pri_entry_data_detail_body_licensedocu = $bg_pri_entry_data_detail_body_licensedocu;
                if(empty($bg_pri_entry_data)){
                    $this->error[] = "预录入主表信息不存在";
                }else{
                    $companyInfo = Service_BgCompany::getByField($this->bg_pri_entry_data['company_code'],'company_code');
                    if(empty($companyInfo)){
                        $this->error[] = "传输企业无效";
                    }else{
                        $this->companyInfo = $companyInfo;
                    }
                }
                $dclcus_flag = '2'; //1:报关，2:非报关
                $mtpck_endprd_markcd = 'I';
                $gen_dec_flag = '2'; //是否生成报关单1-生成 2-不生成
                $invt_type = '0'; //清单类型

                $dclcus_typecd = ''; //报关类型,1.关联报关2.对应报关；(报关类型代码)
                $dec_type = ''; //  报关单类型（dec_type）

                //监管方式,(一日游的情况报关单核住单的不一样)
                $trade_mode = $preDataInfo['trade_mode'];

                //运输方式核注核报关单有的业务不一样，这样写了
                $traf_mode = $preDataInfo['traf_mode'];

                $corr_entry_dcl_etps_no = $companyInfo['declare_customs_code']; //对应报关单申报单位代码
                $corr_entry_dcl_etps_nm = $companyInfo['declare_company_name']; //对应报关单申报单位名称

                $rlt_entry_rvsngd_etps_sscd = $preDataInfo['rlt_entry_rvsngd_etps_sccd']; //关联报关单生产销售(消费使用)单位名称
                $rlt_entry_rcvgd_etpsno = $preDataInfo['rlt_entry_rcvgd_etpsno']; //关联报关单生产销售(消费使用)单位编码

                $rlt_entry_rcvgd_etps_nm = $preDataInfo['rlt_entry_rcvgd_etps_nm'];//关联报关单生产销售(消费使用)单位名称
                $rlt_entry_bizop_etps_sccd=$preDataInfo['rlt_entry_bizop_etps_sccd'];//关联报关单境内收发货人社会信用代码
                $rlt_entry_bizop_etps_no = $preDataInfo['rlt_entry_bizop_etpsno'];//关联报关单境内收发货人编号
                $rlt_entry_bizop_etps_nm = $preDataInfo['rlt_entry_bizop_etps_nm'];//关联报关单境内收发货人名称


                $formType = Service_FormType::getByField($bg_pri_entry_data_detail_body_head['pt_code'],'form_type');
                if(empty($formType)){
                    $this->error[] = "单证的业务类型不存在:".$bg_pri_entry_data_detail_body_head['pt_code'];
                }else{
                    if($formType['default_value']!=''){
                        $defaultArr = json_decode($formType['default_value'],true);
                        if(empty($defaultArr)){
                            throw new Exception("默认配置参数无法初始化");
                        }
                        if(!empty($defaultArr)){
                            if(isset($defaultArr['dclcus_flag'])){
                                $dclcus_flag = $defaultArr['dclcus_flag'];
                            }
                            if(isset($defaultArr['gen_dec_flag'])){
                                $gen_dec_flag = $defaultArr['gen_dec_flag'];
                            }
                            if(isset($defaultArr['invt_type'])){
                                $invt_type = $defaultArr['invt_type'];
                            }
                            if(isset($defaultArr['dclcus_typecd'])){
                                $dclcus_typecd = $defaultArr['dclcus_typecd'];
                            }
                            if(isset($defaultArr['dec_type'])){
                                $dec_type = $defaultArr['dec_type'];
                            }
                            if(isset($defaultArr['hz_trade_mode'])){
                                $trade_mode = $defaultArr['hz_trade_mode'];
                            }
                            if(isset($defaultArr['hz_trade_mode'])){
                                $traf_mode = $defaultArr['hz_traf_mode'];
                            }
                            if($dclcus_flag=='2'){
                                //非报关的情况下不用录
                                $corr_entry_dcl_etps_no = "";
                                $corr_entry_dcl_etps_nm = "";

                                $rlt_entry_rcvgd_etps_nm = "";
                                $rlt_entry_bizop_etps_sccd = "";
                                $rlt_entry_bizop_etps_no = "";
                                $rlt_entry_bizop_etps_nm = "";
                                $rlt_entry_rvsngd_etps_sscd = "";
                                $rlt_entry_rcvgd_etpsno = "";

                            }


                        }
                    }

                }

                //
                $rlt_entry_dcl_etpsno = '';
                $rlt_entry_dcl_etps_nm = '';

                //dclcus_typecd为1表示关联报关，2表示对应报关，关联报关的时候关联报关单信息才要填写
                if($dclcus_typecd=='1'){
                    $rlt_entry_dcl_etpsno = $preDataInfo['agent_code'];
                    $rlt_entry_dcl_etps_nm = $preDataInfo['agent_name'];
                }else{
                    //对应报关情况下关联报关单信息置空
                    $rlt_entry_rcvgd_etps_nm = "";
                    $rlt_entry_bizop_etps_sccd = "";
                    $rlt_entry_bizop_etps_no = "";
                    $rlt_entry_bizop_etps_nm = "";
                    $rlt_entry_rvsngd_etps_sscd = "";
                    $rlt_entry_rcvgd_etpsno = "";
                }



                /**
                    报关单类型（dec_type）
                    1:进口报关单
                    2:出口报关单
                    3:进境备案清单
                    4:出境备案清单
                    5:进境两单一审备案清单
                    6:出境两单一审备案清单
                    B:转关提前进境备案清单
                    C:转关提前出境备案清单
                    F:出口二次转关单
                    G:进口提前/工厂验放报关单
                    H:出口提前/工厂验放报关单
                    I:进口提前/暂时进口报关单
                    J:出口提前/暂时出口报关单
                    K:进口提前/中欧班列报关单
                    L:出口提前/中欧班列报关单
                    M:出口提前/市场采购报关单
                    N:出口提前/空运联程报关单
                    O:进口提前/工厂验放备案清单
                    P:出口提前/工厂验放备案清单
                    Q:进口提前/暂时进口备案清单
                    R:出口提前/暂时出口备案清单
                    S:进口提前/中欧班列备案清单
                    T:出口提前/中欧班列备案清单
                    U:出口提前/市场采购备案清单
                    V:出口提前/空运联程备案清单
                    X:进口两步申报报关单
                    Y:进口两步申报备案清单
                    e:进口两步申报一次录入报关单
                    f:进口两步申报一次录入备案清单
                 */

                $headInfo = [
                    'bwl_no' => $preDataInfo['ems_no'],
                    'dcl_typecd' => '1',//申报类型，1-备案申请 2-变更申请 3-删除申请
                    'bizop_etps_no' => $companyInfo['bizop_etps_no'],//
                    'bizop_etps_nm' => $companyInfo['bizop_etps_nm'],//经营企业名称
                    'bizop_etps_sccd' => $companyInfo['bizop_etps_sccd'],//经营企业社会信用代码
                    'dcl_etps_sccd' => $companyInfo['declare_social_credit_code'],//申报企业社会信用代码
                    'supv_modecd' => $trade_mode,//监管方式代码
                    'trsp_modecd' => $traf_mode,//运输方式代码
                    'dclcus_flag' => $dclcus_flag,//是否报关标志
                    'stship_trsarv_natcd' => $preDataInfo['trade_country'],//起运抵运国
                    'mtpck_endprd_markcd' => $mtpck_endprd_markcd,//料件成品标记代码
                    'impexp_markcd' => $preDataInfo['ie_flag'],//进出口标记代码
                    'impexp_portcd' => $preDataInfo['ie_port'],//进出境关别
                    'DclPlcCuscd' => $preDataInfo['declare_port'], //申报地海关
                    'gen_dec_flag' => $gen_dec_flag,//是否生成报关单,1是2，否
                    'bwl_type' => '0',//底账类型
                    'invt_type' => $invt_type,//清单类型
                    'dcl_etpsno' => $companyInfo['declare_customs_code'],//申报企业编号
                    'dcl_etps_nm' => $companyInfo['declare_company_name'],//申报企业名称
                    'input_code' => $companyInfo['declare_customs_code'],//录入企业编号
                    'input_credit_code' => $companyInfo['declare_social_credit_code'],//录入企业社会信用代码
                    'input_name' => $companyInfo['declare_company_name'],//录入企业名称
                    'add_time' => date("Y-m-d H:i:s"),
                    'remark' => '',
                    'entry_no' => '',//对应报关单编号
                    'rcvgd_etps_no' => $companyInfo['rcvgd_etps_no'],//收货企业编号
                    'rvsngd_etps_sccd' => $companyInfo['rvsngd_etps_sccd'],//收发货企业社会信用代码
                    'rcvgd_etps_nm' => $companyInfo['rcvgd_etps_nm'],////企业中文名称
                    'rlt_invt_no' => $preDataInfo['cop_gb_code'],////关联清单编号
                    'rlt_putrec_no' => $preDataInfo['ems_cop_no'],////关联账册备案编号
                    'rlt_entry_no' => '',////关联报关单编号
                    'dclcus_typecd' => $dclcus_typecd,//报关类型,1.关联报关2.对应报关；(报关类型代码)
                    'dec_type' => $dec_type,//报关单类型(报关单类型)
                    'corr_entry_dcl_etps_no' => $corr_entry_dcl_etps_no,//对应报关单申报单位代码
                    'corr_entry_dcl_etps_nm' => $corr_entry_dcl_etps_nm,//对应报关单申报单位名称
                    'corr_entry_dcl_etps_sccd' => '',//对应报关单
                    'rlt_entry_rvsngd_etps_sscd'=>$rlt_entry_rvsngd_etps_sscd,//关联报关单生产销售(消费使用)单位名称
                    'rlt_entry_rcvgd_etpsno'=>$rlt_entry_rcvgd_etpsno,//关联报关单生产销售(消费使用)单位编码
                    'rlt_entry_rcvgd_etps_nm'=>$rlt_entry_rcvgd_etps_nm,//关联报关单生产销售(消费使用)单位名称
                    'rlt_entry_bizop_etps_sccd'=>$rlt_entry_bizop_etps_sccd, //关联报关单境内收发货人社会信用代码
                    'rlt_entry_bizop_etps_no'=>$rlt_entry_bizop_etps_no,//关联报关单境内收发货人编号
                    'rlt_entry_bizop_etps_nm'=>$rlt_entry_bizop_etps_nm,//关联报关单境内收发货人名称
                    'rlt_entry_dcl_etps_sccd'=>'',//关联报关单申报单位信息
                    'rlt_entry_dcl_etpsno'=>$rlt_entry_dcl_etpsno, //关联报关单申报单位名称
                    'rlt_entry_dcl_etps_nm'=>$rlt_entry_dcl_etps_nm,
                ];
                $bodyInfos = [];
                foreach ($bg_pri_entry_data_detail_body_detail as $kb=>$body){

                    $productInfo = Service_Product::getByField($body['product_id']);

                    $entry_gds_seqno = "";
                    if($dec_type!=''){
                        $entry_gds_seqno = $body['g_no'];
                    }

                    $bodyInfo = [
                        // 'SeqNo'=>$value['seq_no'],
                        'gds_seqno' => $body['g_no'],//商品序号
                        'putrec_seqno' => $body['contr_item'],//备案序号
                        'gds_mtno' => $body['goods_id'],//商品料号
                        'gdecd' => $body['code_ts'],//商品编码
                        'gds_nm' => $body['gname'],//商品名称
                        'gds_spcf_model_desc' => $body['gmodel'],//商品规格型号
                        'dcl_unitcd' => $body['gunit'],//申报计量单位
                        'lawf_unitcd' => $body['first_unit'],//法定计量单位
                        'secd_lawf_unitcd' => $body['second_unit'],//法二计量单位
                        'natcd' => $body['origin_country'],//原产国
                        'dcl_uprc_amt' => sprintf("%.4f",$body['decl_price']),//企业申报单价
                        'dcl_total_amt' => sprintf("%.2f",$body['decl_total']),//企业申报总价
//                    'usd_stat_total_amt'=>$body[''],//美元统计总金额
                        'dcl_currcd' => $body['trade_curr'],//币制
                        'lawf_qty' => $body['first_qty'],//法定数量
                        'secd_lawf_qty' => $body['second_qty'],//第二法定数量
//                    'wt_sf_val'=>$body[''],//重量比例引线
//                    'fst_sf_val'=>$body[''],//第一比例因子
//                    'secd_sf_val'=>$body[''],//第二比例因子
                        'dcl_qty' => $body['gqty'],//申报数量
                        'gross_wt' => sprintf("%.3f", $productInfo['product_weight'] * $body['gqty']),//毛重
                        'net_wt' => sprintf("%.3f", $productInfo['product_net_weight'] * $body['gqty']),//净重
                        'use_cd' => $body['purpose'],//用途代码
                        'lvyrlf_modecd' => $body['duty_mode'],//征免方式
                        'ucns_verno' => '',//单耗版本号
                        'entry_gds_seqno' => $entry_gds_seqno,//报关单商品序号
//                    'apply_tb_seqno'=>$body[''],//流转申报表序号
                        'destination_natcd' => $body['destination_country'],//最终目的国
                        'rmk' => '',//备注
                        'product_id' => $body['product_id'],//商品ID
                        'product_type'=>$body['product_type'],
                    ];

                    /*$bodyInfo  = array(
                        'g_no'=>$vb['g_no'],
                        'contr_item'=>$vb['contr_item'],
                        'code_ts'=>$vb['code_ts'],
                        'gname'=>$vb['gname'],
                        'gmodel'=>$vb['gmodel'],
                        'gqty'=>$vb['gqty'],
                        'gunit'=>$vb['gunit'],
                        'decl_price'=>$vb['decl_price'],
                        'decl_total'=>$vb['decl_total'],
                        'trade_curr'=>$vb['trade_curr'],
                        'first_qty'=>$vb['first_qty'],
                        'first_unit'=>$vb['first_unit'],
                        'exg_version'=>'',
                        'exg_no'=>'',
                        'destination_country'=>$vb['destination_country'],
                        'second_qty'=>$vb['second_qty'],
                        'second_unit'=>$vb['second_unit'],
                        'rcep_orig_place_code'=>'',
                        'origin_country'=>$vb['origin_country']
                    );*/
                    $bodyInfos[] = $bodyInfo;
                }

                $this->baseinfo['headerInfo'] = $headInfo;
                $this->baseinfo['bodyInfos'] = $bodyInfos;

                return $this->baseinfo;
            }
        }catch (Exception $e){
            $this->error[] = "获取基本信息错误".$e->getMessage();
        }
    }


}