<?php
/**
 * Created by PhpStorm.
 * User: tandunzhao
 * Date: 2017/11/17
 * Time: 下午4:38
 */

namespace App\Modules\Finance\Models;

use Illuminate\Database\Eloquent\Model;

/**
 * Class Payment 打款表
 * @package App\Modules\Finance\Models
 */
class Payment extends Model
{
    protected $table = 'payments';
    protected $fillable = ['withdraw_cash_id', 'amount', 'amount_person', 'remark','pay_time', 'pay_merchant_source', 'trade_no', 'status', 'is_company', 'pay_merchant_source_msg', 'pay_merchant_source_result'];


    /**
     * 保存打款信息
     * @param $withdraw_cash_id
     * @param $amount
     * @param $remark
     * @param $pay_merchant_source 支付渠道
     * @param $trade_no 交易流水号
     * @param $status 打款状态
     * @param $pay_merchant_source_msg 支付通道返回信息
     * @param int $is_company 0:私人; 1:公司
     * @param int $amount_person 人工打款金额
     * @return mixed
     */
    public static function addPayment($withdraw_cash_id, $amount, $remark, $pay_merchant_source, $trade_no, $status, $pay_merchant_source_msg, $is_company = 0, $amount_person = 0) {
        $dataPayment['withdraw_cash_id'] = $withdraw_cash_id;
        $dataPayment['amount'] = $amount;
        $dataPayment['remark'] = $remark;
        $dataPayment['pay_time'] = date('Y-m-d H:i:s');
        $dataPayment['pay_merchant_source'] = $pay_merchant_source;
        $dataPayment['trade_no'] = $trade_no;
        $dataPayment['status'] = $status;
        $dataPayment['pay_merchant_source_msg'] = $pay_merchant_source_msg;
        $dataPayment['is_company'] = $is_company;
        $dataPayment['amount_person'] = $amount_person;
        $payment = Payment::create($dataPayment);

        return $payment;
    }

    /**
     * 更新打款状态
     * @param $id
     * @param $status
     * @param $pay_merchant_source_msg
     * @param $pay_merchant_source_result
     * @return mixed
     */
    public static function updatePaymentStatus($id, $status = '', $pay_merchant_source_msg, $pay_merchant_source_result) {
        $dataPayment = self::find($id);
        if(!empty($dataPayment)) {
            if($status) {
                $dataPayment['status'] = $status;
            }
            $dataPayment['pay_merchant_source_msg'] = $pay_merchant_source_msg;
            $dataPayment['pay_merchant_source_result'] = $pay_merchant_source_result;
            $dataPayment = $dataPayment->save();
        }

        return $dataPayment;
    }

    /**
     * 获取打款列表
     * @param $withdraw_cash_id
     * @param string $start_date
     * @param string $end_date
     * @param string $status
     * @param bool $is_all
     * @return mixed
     */
    static function getList($withdraw_cash_id, $start_date='',$end_date='', $status = '', $is_all=false) {
        $search_object = self::orderBy('pay_time','desc');

        if($withdraw_cash_id) {
            $search_object->where('withdraw_cash_id', $withdraw_cash_id);
        }
        if($start_date) $search_object->where('pay_time','>=',$start_date);
        if($end_date) $search_object->where('pay_time','<=',$end_date);

        if($status) {
            $search_object->where('status',$status);
        }

        if($is_all)
        {
            return $search_object->get();
        }else{
            return $search_object->paginate();
        }
    }

    /**
     * 更新打款状态
     * @param $id
     * @param $status
     * @return mixed
     */
    public static function updateSimplePaymentStatus($id, $status)
    {
        return self::where('id', $id)->update(['status' => $status]);
    }

    /**
     * 打款详情列表
     * @param array $params[]
     *                  withdraw_cash_id : 提现ID
     *                  channel_id:渠道ID 可选
     *                  channel_name:渠道名称 可选
     *                  account_name: 打款人姓名
     *                  start_date:开始时间 可选
     *                  end_date:结束时间 可选
     *                  end_date:结束时间 可选
     *                  search_name: 搜索名称
     *                  status: 状态 查看接口 WithdrawCashService::getWithdrawCashStatusList
     * @return mixed
     */
    static function getListDetail($params=[]) {
        $search_object = self::select([
            'payments.id',
            'payments.withdraw_cash_id as cash_id',
            'payments.amount',
            'payments.amount_person',
            'payments.pay_time',
            'payments.pay_merchant_source',
            'payments.trade_no',
            'payments.status as payments_status',
            'payments.is_company',
            'payments.pay_merchant_source_result',
            'payments.pay_merchant_source_msg',
            'withdraw_cashes.distribution_channel_id as channel_id',
            'withdraw_cashes.distribution_channel_name as channel_name',
            'withdraw_cashes.status as wc_status',
            'withdraw_cashes.remark',
            'withdraw_cashes.check_user_id',
            'withdraw_cashes.check_user_name',
            'withdraw_cashes.amount as withdraw_cashes_amount',
            'withdraw_cashes.tallage as withdraw_cashes_tallage',
            'cash_accounts.account_name',
            'cash_accounts.identity_card',
            'cash_accounts.card_number',
            'cash_accounts.account_bank',
            'cash_accounts.bank',
            'cash_accounts.province',
            'cash_accounts.status as ca_status '
        ])
            ->leftjoin('withdraw_cashes','withdraw_cashes.id','=','payments.withdraw_cash_id')
            ->leftjoin('cash_accounts','cash_accounts.distribution_channel_id','=','withdraw_cashes.distribution_channel_id')
            ->orderBy('payments.id','desc');


        if(isset($params['withdraw_cash_id']) && $params['withdraw_cash_id']) $search_object->where('payments.withdraw_cash_id', $params['withdraw_cash_id']);

        if(isset($params['channel_id']) && $params['channel_id']) $search_object->where('withdraw_cashes.distribution_channel_id', $params['channel_id']);

        if(isset($params['search_name']) && $params['search_name']) {
            $search_object->where(function ($query) use($params) {
                $query->where('withdraw_cashes.distribution_channel_name','like', "%".$params['search_name']."%")
                    ->orWhere('cash_accounts.account_name', 'like', "%".$params['search_name']."%");
            });
        }

        if(isset($params['channel_name']) && $params['channel_name']) $search_object->where('withdraw_cashes.distribution_channel_name','like', "%".$params['channel_name']."%");
        if(isset($params['account_name']) && $params['account_name']) $search_object->where('cash_accounts.account_name', 'like', "%".$params['account_name']."%");

        if(isset($params['start_date']) && $params['start_date']) $search_object->where('payments.pay_time','>=', $params['start_date']);
        if(isset($params['end_date']) && $params['end_date']) $search_object->where('payments.pay_time','<=', $params['end_date']);

        if(isset($params['is_company']) && is_numeric($params['is_company'])) $search_object->where('payments.is_company', $params['is_company']);

        if(isset($params['status']) && $params['status']) {
            $search_object->whereIn('withdraw_cashes.status', $params['status']);
        }
        return $search_object->paginate();
    }
}