<?php
namespace app\cxinv\model;


use think\facade\Log;use think\Model;
class PayInvoice extends Base
{
//设置字段信息
    protected $schema = [
        'id'  =>'int',//
        'payNo'  =>'varchar',//对账编码
        'hpNo'  =>'varchar',//回票编号
        'apply_id'  =>'int',//申请人id
        'apply_name'  =>'varchar',//申请人名称
        'invType'  =>'tinyint',//发票申请类型 1 手工添加 2 ocr识别 3 金税扫描
        'invoiceType'  =>'varchar',//发票类型 special: 增值税专用发票normal: 增值税普通发票electronic: 增值税电子普通发票special_electronic: 增值税电子专用发票toll: 增值税电子普通发票(通行费)roll: 增值税普通发票(卷票),fully_digitalized_special_electronic:全电专用发票, fully_digitalized_normal_electronic:全电专用发票
        'invName'  =>'varchar',//
        'inv_img'  =>'varchar',//发票图片
        'inv_fee'  =>'decimal',//回票金额
        'inv_subtotal_amount'  =>'decimal',//票面税前金额
        'inv_amount'  =>'decimal',//票面合计金额
        'invStatus'  =>'tinyint',//[0=>"待验证","1"=>'正常',"2"=>'已作废',"3"=>'已红冲']
        'status'  =>'tinyint',// 1待系统验证 2 买方公司审核 3带买方公司认证 4 认证成功 5验证失败 6买方审核驳回 7 认证失败 8 回票流程终止 9 验证超次数 10 回票已退11 待关联订单 12 订单关联完毕待财务审核 13 订单关联完毕财务驳回  14 待确认订单
        'remark'  =>'varchar',//
        'exam_remark'  =>'varchar',//审核备注
        'check_remark'  =>'varchar',//发票验证备注
        'tag_id'  =>'int',//标签id
        'check_time'  =>'varchar',//回票时间
        'open_time'  =>'varchar',//开票时间
        'invoiceNumber'  =>'varchar',//发票号码
        'seller_check'  =>'tinyint',//发票卖方数据验证 0 待验证 1数据一致2数据不一致
        'buyer_check'  =>'tinyint',//发票买方数据验证0 待验证 1数据一致2数据不一致
        'invoiceCode'  =>'varchar',//发票代码
        'checkNumber'  =>'varchar',//效验码
        'checkApi'  =>'tinyint',//0 未确认 1 金税接口 2 华为云
        'is_del'  =>'tinyint',//是否删除 0 否1是
        'addtime'  =>'datetime',//
        'updatetime'  =>'datetime',//
       ];
    protected $createTime='addtime';
    protected $updateTime='updatetime';
    public function Items(){
        return $this->hasMany(InvoiceItem::class,'invoiceCode','hpNo');
    }
    public static function  onAfterInsert(Model $model) : void{
        if ($model->invType==4){
            $ticket= InvoiceInfo::where("payNo",$model->payNo)->findOrEmpty();
            if (!$ticket->isEmpty() && !empty($ticket->item_list)){
                $bool = true;
                 (new  InvoiceItem)->saveAll(array_map(function ($item)use($model,&$bool) {
                     if($item['amount']<0) $bool=false;
                              return [
                                  'invoiceCode'=>$model->hpNo,
                                  'order_type'=>2,
                                  'good_name'=>$item['name'],
                                  'unit'=>$item['unit'],
                                  'num'=>$item['quantity'],
                                  'unit_price'=>$item['unit_price'],
                                  'amount'=>$item['amount'],
                                  'tax_amount'=>$item['tax'],
                                  'tax'=>$item['tax_rate'],
                                  'cat_code'=>$item['license_plate_number'],
                                  'total_amount'=>bcadd($item['amount'],$item['tax'],2),
                                  'balance_amount'=>bcadd($item['amount'],$item['tax'],2),
                              ];
                          },$ticket->item_list));

                 $ticket->hpNo= $model->hpNo;
                 $ticket->save();
                 if($bool==false){
                     $model->status=14;
                     $model->save();
                 }
            }
        }
    }

    public static function onAfterUpdate(Model $model) : void{
        Log::info('PayInv回票状态变更onAfterUpdate:model'.json_encode($model->toArray()));
        if ($model->invType==4){
            $change = $model->getChangedData();
            if (isset($change['status'])){
             Log::info("PayInv回票状态变更onAfterUpdate:change".json_encode($change));
             $invocie = Invoice::where("InvCode",$model->payNo)->findOrEmpty();
             if($change['status']==4){
                 if (!$invocie->isEmpty()){
                        $invocie->status=4;
                        $invocie->save();
                 }
                $itemid= InvoiceItem::where(['invoiceCode'=>$model->hpNo,'status'=>[1,2]])->column('id');
                 if(!empty($itemid)){
                    $invo= InvoiceOrder::whereIn('itemId',$itemid)->where(['status'=>[1,2]])->column('code,balance_amount,total_amount');
                    if(!empty($invo)){
                        foreach ($invo as $key=>$val){
                            InvoiceOrder::orderFinish($val['code'],bcsub($val['total_amount'],$val['balance_amount'],2));
                        }
                    }
                 }
             }

             if($change['status']==10){
                 Log::info("回票终止,退款开始".$model->hpNo);
                  InvoiceItem::refund($model->hpNo);
                   if (!$invocie->isEmpty()){
                        $invocie->status=2;
                        $invocie->save();
                 }
             }
             if (in_array($change['status'],[5,6,7,8,13])){
                  InvoiceItem::rmInvoice($model->hpNo);
                   if (!$invocie->isEmpty()){
                        $invocie->status=2;
                        $invocie->save();
                 }
             }
         }
        }
    }
}