<?php


namespace app\cxinv\controller;


use app\cxinv\model\InvoiceInfo;
use app\user\model\Business;
use app\user\model\Headquarters;
use think\App;
use think\facade\Validate;
class Invoice extends Base{
    public function __construct(App $app) {
        parent::__construct($app);
        $this->model = new \app\cxinv\model\Invoice();
    }
    public function List(){
        $param= $this->request->param(["start"=>"","end"=>"","supplierNo"=>"","companyNo"=>"","status"=>"",'relaComNo'=>'',
        "invoice_number"=>"","invoice_type"=>"","page"=>1,"size"=>15,"apply_id"=>""],"post","trim");
        $where=[];
        $whereOr=[];
        if($param['start']!=='') $where[]=['createTime','>=',startTime($param['start'])];
        if($param['end']!=='') $where[]=['createTime','<=',endTime($param['end'])];
        if($param['supplierNo']!=='') $where[]=['supplierNo','like','%'.$param['supplierNo'].'%'];
        if($param['companyNo']!=='') $where[]=['companyNo','like','%'.$param['companyNo'].'%'];
        if($param['status']!=='') $where[]=['status','=',$param['status']];
        if($param['invoice_number']!=='') $where[]=['invoice_number','like','%'.$param['invoice_number'].'%'];
        if($param['invoice_type']!=='') $where[]=['invoice_type','=',$param['invoice_type']];
        if($param['apply_id']!=='') $where[]=['apply_id','=',$param['apply_id']];
        if($param['relaComNo']!=='') $where[]=['companyNo|supplierNo','=',$param['relaComNo']];
        if($this->level!=1) {
            $whereOr[]=['apply_id','=', $this->uid];
             $whereOr[]=['companyNo|supplierNo','=', ''];
            if($param['status']!=='')  $whereOr[]=['status','=', $param['status']];
            if($param['start']!=='') $whereOr[]=['createTime','>=',startTime($param['start'])];
            if($param['end']!=='') $whereOr[]=['createTime','<=',endTime($param['end'])];
            if($param['invoice_number']!=='') $whereOr[]=['invoice_number','like','%'.$param['invoice_number'].'%'];
            if($param['invoice_type']!=='') $whereOr[]=['invoice_type','=',$param['invoice_type']];
            if ($param['supplierNo']!=='') $whereOr[]=['supplierNo','like','%'.$param['supplierNo'].'%'];
            if ($param['companyNo']!=='') $whereOr[]=['companyNo','like','%'.$param['companyNo'].'%'];
        }
        $list=$this->model
        ->where($where)
        ->whereOr(function($query)use($whereOr){
            $query->where($whereOr);
        })
        ->order('id desc')
        ->paginate(['page'=>$param['page'],'list_rows'=>$param['size']]);
        return success('获取成功',['list'=>$list->items(),'count'=>$list->total()]);
    }

    public function create(){
        $param= $this->request->param(["list"=>[]],"post","trim");
        if (!is_array($param['list'])) return error("请传入正确参数");
        $valid = Validate::rule([
            "invoice_code|发票代码"=>"max:255",
            "invoice_number|发票号码"=>"require|max:255|unique:app\cxinv\model\Invoice,invoice_number",
            "invoice_type|发票类型"=>"require|in:".implode(",",array_keys(\app\cxinv\model\Invoice::$invoiceType)),
            "invoice_total|发票税前金额"=>"float",
            "open_date|开票日期"=>"require|date|dateFormat:Y-m-d",
            "invoice_subtotal|发票税后金额"=>"float",
            "check_code|校验码"=>"max:255"
            ]);
        $number= array_column($param['list'],'invoice_number');
        if (count($number)!=count(array_unique($number))) return error("发票号码重复");
        foreach ($param['list'] as $k=>$v){
            if(!$valid->check($v)) return error($valid->getError());
            validate_invoice_info($v,$return);
            if($return['code']!=0) return error($v['invoice_number'].":".$return['message']);
            $param['list'][$k]['InvCode']=makeNo("FP",count($param['list'])>1 ?str_pad($k+1,4,"0",STR_PAD_RIGHT):"");
            $param['list'][$k]['apply_id']=$this->uid;
            $param['list'][$k]['apply_name']=$this->uname;
        }
        $this->model->saveAll($param['list']);
        return success("添加成功");
    }
    //0待验证 1待确认公司信息 2 待关联数据 3 关联中 4 关联完成
    public function save(){
        $param= $this->request->param([
            "id"=>"",
            "invoice_code"=>"",
            "invoice_number"=>"",
            "invoice_type"=>"",
            "invoice_total"=>"",
            "open_date"=>"",
            "invoice_subtotal"=>"",
            "check_code"=>"",
            "companyNo"=>"",
            "status"=>0,
            "supplierNo"=>""],"post","trim");
        $valide=Validate::rule([
            "id|发票编号id"=>"require|max:255",
            "invoice_code|发票代码"=>"requireIf:status,0|max:255",
            "invoice_number|发票号码"=>"requireIf:status,0|max:255|unique:app\cxinv\model\Invoice,invoice_number",
            "invoice_type|发票类型"=>"requireIf:status,0|in:".implode(",",array_keys(\app\cxinv\model\Invoice::$invoiceType)),
            "invoice_total|发票税前金额"=>"float",
            "open_date|开票日期"=>"requireIf:status,0|date|dateFormat:Y-m-d",
            "invoice_subtotal|发票税后金额"=>"float",
            "check_code|校验码"=>"max:255",
            "companyNo|业务公司"=>"requireIf:status,1|max:255",
            "supplierNo|供应商公司"=>"requireIf:status,1|max:255"
        ]);
        $invoice=$this->model->where("id",$param['id'])->findOrEmpty();
        if($invoice->isEmpty()) return error("发票编号不存在");
        $param['status'] = $invoice->status;
        if(!$valide->check($param)) return error($valide->getError());
        if ($invoice->status>1) return error("发票当前状态无法修改");
        if ($param['status']==0){
            $invoice->invoice_code=$param['invoice_code'];
            $invoice->invoice_number=$param['invoice_number'];
            $invoice->invoice_type=$param['invoice_type'];
            $invoice->invoice_total=$param['invoice_total'];
            $invoice->open_date=$param['open_date'];
            $invoice->invoice_subtotal=$param['invoice_subtotal'];
            $invoice->check_code=$param['check_code'];
        }
        if($param['status']==1){
            $invoice->companyNo=$param['companyNo'];
            $invoice->companyName=Business::where("companyNo",$param['companyNo'])->value("company","");
            $invoice->supplierNo=$param['supplierNo'];
            $invoice->supplierName=Headquarters::where("code",$param['supplierNo'])->value("name","");
            $invoice->status=2;
        }
        $invoice->save();
        return success("保存成功");
    }

    public function delete(){
        $param= $this->request->param(["InvCode"=>""],"post","trim");
        $valide=Validate::rule([
            "InvCode|发票编号"=>"require|max:255"
        ]);
        if(!$valide->check($param)) return error($valide->getError());
        $info=$this->model->where("InvCode",$param['InvCode'])->findOrEmpty();
        if($info->isEmpty()) return error("发票编号不存在");
        if(in_array($info->status,[3,4])) return error("发票状态不允许删除");
        $info->delete();
       return success("删除成功");
    }

    public function info(){
        $param= $this->request->param(["InvCode"=>""],"post","trim");
        $valide=Validate::rule([
            "InvCode|发票编号"=>"require|max:255"
        ]);
        if(!$valide->check($param)) return error($valide->getError());
        $info=$this->model->where("InvCode",$param['InvCode'])->findOrEmpty();
        if($info->isEmpty()) return error("发票编号不存在");
        $info['ticket'] = InvoiceInfo::where("hpNo",$param['InvCode'])->findOrEmpty();
        return success("获取成功",$info);
    }

    public function Ticket(){
        $param= $this->request->param(["number"=>"","hpNo"=>""],"post","trim");
        $valide=Validate::rule([
            "number|发票编号"=>"require|max:255"
        ]);
        if(!$valide->check($param)) return error($valide->getError());
        $condition=[];
		$condition[]=['number','=',$param['number']];
		if($param['hpNo']!=="") $condition[]=['hpNo','=',$param['hpNo']];
		$info = InvoiceInfo::where($condition)->findOrEmpty();
		if($info->isEmpty()) return error("发票编号不存在");
		$info["invoice_item"]= \app\cxinv\model\InvoiceItem::where("invoiceCode",$info->hpNo)->select();
		return success("获取成功",$info);
    }
}