MusicianAgreementService.php 6.25 KB
<?php

namespace App\Services;

use App\Helper\Response;
use App\Models\Legal\Contract;
use App\Models\Legal\StakeholderContract;
use App\Models\Legal\Treaty;

/**
 * Class MusicianAgreementService
 * @package App\Services
 */
class MusicianAgreementService extends Service
{

    public function treatyList()
    {
        $res = Treaty::query()->whereIn('party_b', $this->stakeholder_ids)->where('deadline_date', '>', $this->now)->with(['file:id,treaty_id,file_id', 'file.fileInfo:id,location'])
                    ->select(['id', 'treaty_name', 'treaty_type', 'service_type', 'deadline_date', 'music_no'])->paginate($this->pageSize);

        foreach ($res as &$item) {
            $item_res = $item->toArray();
            $files = [];
            if (!empty($item_res['file'])) {
                foreach ($item_res['file'] as $file_item) {
                    !empty($file_item['file_info']['location']) && $files[] = env('resource_url') . $file_item['file_info']['location'];
                }
            }
            $item->setAttribute('files', $files);
            unset($item->file);
        }

        return Response::success($res);
    }


    /**
     * 我的合约列表
     * @return \Illuminate\Http\JsonResponse
     */
    public function agreementList()
    {
        //经纪合约
        $treaty = Treaty::query()->whereIn('party_b', $this->stakeholder_ids)->with(['file:id,treaty_id,file_id', 'file.fileInfo:id,location'])
                           ->select(['id', 'treaty_no as no', 'treaty_type', 'treaty_name as name', 'effective_date', 'deadline_date as date_ending', 'cost_model', 'music_no', 's_rate', 'l_rate', 'c_rate', 'p_rate', 'cost', 'prepaid'])->get();

        foreach ($treaty as &$item) {
            $item->setAttribute('model',  $item->charge_model);
            $treaty_item = $item->toArray();
            $files = [];
            if (!empty($treaty_item['file'])) {
                if ($file_info = array_column($treaty_item['file'], 'file_info')){
                    $files = array_column($file_info, 'location');
                    array_walk($files, function (&$location) { $location = env('resource_url'). $location; });
                }
            }

            if ((time() >= strtotime($item->effective_date)) && (time() <= strtotime($item->date_ending))) {
                //进行中
                $item->setAttribute('status', 1);
            } else {
                //未生效 || 已经结束
                $item->setAttribute('status', 0);
            }

            $item->setAttribute('type', 1);   //经纪合约
            $item->setAttribute('files', $files);
            unset($item->file);
        }

        //歌曲版权
        $contract_table = Contract::table();
        $contract = Contract::query()->with(['files', 'files.fileInfo:id,location', 'moreSongs'])->where(['flag'=>1])->whereIn('sc.stakeholder_id', $this->stakeholder_ids)
                    ->join(StakeholderContract::table()." as sc", Contract::table().".id", '=', 'sc.contract_id')
                    ->select(["{$contract_table}.id", 'contract_no', 'name', 'right_type', 'proportion', 'date_signing', 'date_starting', 'date_ending', 'cooperation_type', 'prepaid_money', 'reward_money'])->get()->toArray();

        $rights = [];
        foreach ($contract as $contract_item) {
            $files = [];
            if (!empty($contract_item['files'])) {
                if ($file_info = array_column($contract_item['files'], 'file_info')){
                    $files = array_column($file_info, 'location');
                    array_walk($files, function (&$location) { $location = env('resource_url'). $location; });
                }
            }

            if (!isset($rights[$contract_item['id']])) {
                $rights[$contract_item['id']] = [
                    'id'=>$contract_item['id'],
                    'no'=>$contract_item['contract_no'],
                    'name'=>$contract_item['name'],
                    'date_signing'=>$contract_item['date_signing'],
                    'date_starting'=>$contract_item['date_starting'],
                    'date_ending'=>$contract_item['date_ending'],  //截止日期
                    'files'=>$files,
                    'songs'=>$contract_item['more_songs'],
                    'type'=>2, //歌曲版权合同
                    'cooperation_type'=>$contract_item['cooperation_type'],
                ];
            }
            $rights[$contract_item['id']]['right'][] = [
                'right_type'=>$contract_item['right_type'],
                'proportion'=>$contract_item['proportion'],
                'prepaid_money'=>$contract_item['prepaid_money'],
                'reward_money'=>$contract_item['reward_money'],
            ];

            if ((strtotime($contract_item['date_starting']) >= time()) && (strtotime($contract_item['date_ending']) <= time())) {
                //进行中
                $rights[$contract_item['id']]['status'] = 1;
            } else {
                //未生效 || 已经结束
                $rights[$contract_item['id']]['status'] = 0;
            }

        }
        $rights = array_values($rights);
        foreach ($rights as &$right_item) {
            //关联歌曲
            $right_item['relation_song'] = Contract::relationSong($right_item['songs']);
            //权利类型
            $right_item['role'] = Contract::getRole($right_item['right']);
            //费用模式
            $right_item['model'] = Contract::getModel($right_item['cooperation_type'], $right_item['right']);
            unset($right_item['songs'], $right_item['right']);
        }

        $agreement = array_merge($treaty->toArray(), $rights);

        //排序
        usort($agreement, function ($a, $b) {
            if ($a['status'] == $b['status']) {
                if (!empty($a['date_signing']) && !empty($b['date_signing'])) {
                    return strtotime($a['date_signing']) > strtotime($b['date_signing']) ? -1 : 1;
                } else if (!empty($a['date_signing'])) {
                    return -1;
                } else if (!empty($b['date_signing'])) {
                    return 1;
                } else {
                    return -1;
                }
            }

            return $a['status'] > $b['status'] ? -1 : 1;
        });

        return Response::success($agreement);
    }

}