<?php
// +----------------------------------------------------------------------
// | likeadmin快速开发前后端分离管理后台(PHP版)
// +----------------------------------------------------------------------
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
// | 开源版本可自由商用,可去除界面版权logo
// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
// | github下载:https://github.com/likeshop-github/likeadmin
// | 访问官网:https://www.likeadmin.cn
// | likeadmin团队 版权所有 拥有最终解释权
// +----------------------------------------------------------------------
// | author: likeadminTeam
// +----------------------------------------------------------------------

namespace app\adminapi\lists\project;


use app\adminapi\lists\BaseAdminDataLists;
use app\common\model\build\BuildPlan;
use app\common\model\build\BuildReport;
use app\common\model\build\BuildReportDetail;
use app\common\model\project\Project;
use app\common\model\project\ProjectAttendanceDetail;
use app\common\model\project\ProjectPersonnel;
use app\common\model\project\ProjectSalaryDetail;
use app\common\lists\ListsSearchInterface;
use app\common\model\project\ProjectSalaryPayment;


/**
 * 工资明细列表
 * Class ProjectSalaryDetailLists
 * @package app\adminapi\listsproject
 */
class ProjectSalaryDetailLists extends BaseAdminDataLists implements ListsSearchInterface
{


    /**
     * @notes 设置搜索条件
     * @return \string[][]
     * @author likeadmin
     * @date 2023/12/27 16:12
     */
    public function setSearch(): array
    {
        return [
			'=' => ['salary_payment_id'],
        ];
    }


    /**
     * @notes 获取工资明细列表
     * @return array
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     * @author likeadmin
     * @date 2023/12/27 16:12
     */
    public function lists(): array
    {
		$prarms = $this->request->get(['payment_code','project_name','project_code']);
		$where = [];
		if(isset($prarms['payment_code']) && $prarms['payment_code'] != ''){
			$salary_payment_ids = ProjectSalaryPayment::where('payment_code','like','%'.$prarms['payment_code'].'%')->column('id');
			$where[] = ['salary_payment_id','in',$salary_payment_ids];
		}
	    if(isset($prarms['project_name']) && $prarms['project_name'] != ''){
		    $project_ids = Project::where('name','like','%'.$prarms['project_name'].'%')->column('id');
		    $salary_payment_ids = ProjectSalaryPayment::where('project_id','in',$project_ids)->column('id');
		    $where[] = ['salary_payment_id','in',$salary_payment_ids];
	    }
	    if(isset($prarms['project_code']) && $prarms['project_code'] != ''){
		    $project_ids = Project::where('name','like','%'.$prarms['project_code'].'%')->column('id');
		    $salary_payment_ids = ProjectSalaryPayment::where('project_id','in',$project_ids)->column('id');
		    $where[] = ['salary_payment_id','in',$salary_payment_ids];
	    }
        return ProjectSalaryDetail::where($this->searchWhere)->where($where)
            ->field(['id', 'salary_payment_id', 'person_id', 'apply_date', 'apply_amount', 'remark'])
            ->limit($this->limitOffset, $this->limitLength)
            ->order(['id' => 'desc'])
            ->select()->each(function($item){
				$payment = ProjectSalaryPayment::field('payment_code,project_id')->where('id',$item['salary_payment_id'])->findOrEmpty();
				$project = Project::field('name,project_code')->where('id',$payment['project_id'])->findOrEmpty();
				$person = ProjectPersonnel::field('name,idcard,work_type')->where('id',$item['person_id'])->findOrEmpty();
				$item['payment_code'] = $payment['payment_code'];
				$item['project_name'] = $project['name'];
		        $item['project_code'] = $project['project_code'];
				$item['person_name'] = $person['name'];
		        $item['person_idcard'] = $person['idcard'];
		        $item['person_work_type_text'] = $person->work_type_text;
		        //总考勤收入
		        $daily_income = ProjectAttendanceDetail::where('person_id',$item['person_id'])->sum('daily_income');
		        //总施工收入
		        $build_report_details = BuildReportDetail::field('report_id,work_num')->where('person_id',$item['person_id'])->select()->each(function($item2){
			        $report = BuildReport::field('plan_id')->where('id',$item2['report_id'])->findOrEmpty();
			        $plan = BuildPlan::field('price')->where('id',$report['plan_id'])->findOrEmpty();
			        $item2['amount'] = $item2['work_num'] * $plan['price'];
		        })->toArray();
		        $work_income = 0;
		        foreach($build_report_details as $v){
			        $work_income += $v['amount'];
		        }
		        $item['total_income'] = $daily_income + $work_income;
		        //总支出
		        $item['total_pay_out'] = ProjectSalaryDetail::where('person_id',$item['person_id'])->sum('apply_amount');
		        $item['balance'] = $item['total_income'] - $item['total_pay_out'];
	        })
            ->toArray();
    }


    /**
     * @notes 获取工资明细数量
     * @return int
     * @author likeadmin
     * @date 2023/12/27 16:12
     */
    public function count(): int
    {
	    $prarms = $this->request->get(['payment_code','project_name','project_code']);
	    $where = [];
	    if(isset($prarms['payment_code']) && $prarms['payment_code'] != ''){
		    $salary_payment_ids = ProjectSalaryPayment::where('payment_code','like','%'.$prarms['payment_code'].'%')->column('id');
		    $where[] = ['salary_payment_id','in',$salary_payment_ids];
	    }
	    if(isset($prarms['project_name']) && $prarms['project_name'] != ''){
		    $project_ids = Project::where('name','like','%'.$prarms['project_name'].'%')->column('id');
		    $salary_payment_ids = ProjectSalaryPayment::where('project_id','in',$project_ids)->column('id');
		    $where[] = ['salary_payment_id','in',$salary_payment_ids];
	    }
	    if(isset($prarms['project_code']) && $prarms['project_code'] != ''){
		    $project_ids = Project::where('name','like','%'.$prarms['project_code'].'%')->column('id');
		    $salary_payment_ids = ProjectSalaryPayment::where('project_id','in',$project_ids)->column('id');
		    $where[] = ['salary_payment_id','in',$salary_payment_ids];
	    }
        return ProjectSalaryDetail::where($this->searchWhere)->where($where)->count();
    }

}