generated from liutk/owl-admin-base
151 lines
6.5 KiB
PHP
151 lines
6.5 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Controllers\Finance;
|
|
|
|
use App\Admin\Controllers\AdminController;
|
|
use App\Admin\Services\Finance\ReimbursementService;
|
|
use App\Enums\ReimbursementStatus;
|
|
use App\Models\Reimbursement;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Illuminate\Validation\Rule;
|
|
use Slowlyo\OwlAdmin\Admin;
|
|
use Slowlyo\OwlAdmin\Renderers\DialogAction;
|
|
use Slowlyo\OwlAdmin\Renderers\Form;
|
|
use Slowlyo\OwlAdmin\Renderers\Page;
|
|
|
|
/**
|
|
* @property ReimbursementService $service
|
|
*/
|
|
class ReimbursementController extends AdminController
|
|
{
|
|
protected string $serviceName = ReimbursementService::class;
|
|
|
|
/**
|
|
* 审核
|
|
*/
|
|
public function approval($id, Request $request)
|
|
{
|
|
$validator = Validator::make(
|
|
data: $request->all(),
|
|
rules: [
|
|
'approval_result' => ['bail', 'required', Rule::in([1, 2])],
|
|
'failed_reason' => ['bail', 'required_if:approval_result,2'],
|
|
],
|
|
attributes: [
|
|
'approval_result' => __('finance.reimbursement.approval_result'),
|
|
'failed_reason' => __('finance.reimbursement.failed_reason'),
|
|
],
|
|
);
|
|
|
|
if ($validator->fails()) {
|
|
return $this->response()->fail($validator->errors()->first());
|
|
}
|
|
|
|
/** @var \App\Models\Reimbursement */
|
|
$reimbursement = Reimbursement::findOrFail($id);
|
|
|
|
if (! $reimbursement->isPending()) {
|
|
return $this->response()->fail('收支报销不是待审核状态');
|
|
}
|
|
|
|
$reimbursement->update([
|
|
'reimbursement_status' => $request->input('approval_result') == 1
|
|
? ReimbursementStatus::Passed
|
|
: ReimbursementStatus::Rejected,
|
|
]);
|
|
|
|
return $this->response()->success(null, '审核成功');
|
|
}
|
|
|
|
public function list(): Page
|
|
{
|
|
$crud = $this->baseCRUD()
|
|
->headerToolbar([
|
|
...$this->baseHeaderToolBar(),
|
|
])
|
|
->bulkActions([])
|
|
->filter($this->baseFilter()->body([
|
|
amis()->GroupControl()->mode('horizontal')->body([
|
|
amis()->TextControl('employee_name', __('finance.reimbursement.employee'))
|
|
->placeholder(__('finance.reimbursement.employee')),
|
|
amis()->SelectControl('reimbursement_type_id', __('finance.reimbursement.type'))
|
|
->multiple()
|
|
->source(admin_url('api/keywords/tree-list?parent_key=reimbursement_type'))
|
|
->labelField('name')
|
|
->valueField('key'),
|
|
amis()->SelectControl('status', __('finance.reimbursement.status'))
|
|
->multiple()
|
|
->options(ReimbursementStatus::options()),
|
|
]),
|
|
amis()->GroupControl()->mode('horizontal')->body([
|
|
amis()->InputDatetimeRange()
|
|
->name('datetime_range')
|
|
->label(__('finance.reimbursement.created_at'))
|
|
->format('YYYY-MM-DD HH:mm:ss')
|
|
->columnRatio(4),
|
|
]),
|
|
]))
|
|
->columns([
|
|
// amis()->TableColumn()->name('id')->label(__('finance.reimbursement.id')),
|
|
amis()->TableColumn()->name('employee.name')->label(__('finance.reimbursement.employee')),
|
|
amis()->TableColumn()->name('expense')->label(__('finance.reimbursement.expense')),
|
|
amis()->TableColumn()->name('reason')->label(__('finance.reimbursement.reason')),
|
|
amis()->TableColumn()->name('type.name')->label(__('finance.reimbursement.type')),
|
|
amis()->TableColumn()
|
|
->name('reimbursement_status')
|
|
->label(__('finance.reimbursement.status'))
|
|
->type('mapping')
|
|
->map(ReimbursementStatus::labelMap()),
|
|
amis()->TableColumn()->name('created_at')->label(__('finance.reimbursement.created_at')),
|
|
$this->rowActions([
|
|
$this->rowApprovalButton()
|
|
->visibleOn('${reimbursement_status == '.ReimbursementStatus::Pending->value.'}'),
|
|
$this->rowShowButton()->visible(Admin::user()->can('admin.finance.reimbursements.view')),
|
|
]),
|
|
]);
|
|
|
|
return $this->baseList($crud);
|
|
}
|
|
|
|
public function detail(): Form
|
|
{
|
|
return $this->baseDetail()->title()->body([
|
|
amis()->Property()->items([
|
|
['label' => __('finance.reimbursement.employee'), 'content' => '${employee.name}'],
|
|
['label' => __('finance.reimbursement.expense'), 'content' => '${expense}'],
|
|
['label' => __('finance.reimbursement.reason'), 'content' => '${reason}'],
|
|
['label' => __('finance.reimbursement.type'), 'content' => '${type.name}'],
|
|
['label' => __('finance.reimbursement.status'), 'content' => amis()->Mapping()->map(ReimbursementStatus::labelMap())->value('${reimbursement_status}')],
|
|
['label' => __('finance.reimbursement.created_at'), 'content' => '${created_at}'],
|
|
['label' => __('finance.reimbursement.photos'), 'content' => amis()->Images()->enlargeAble()->source('${photos}')->enlargeWithGallary(), 'span' => 3],
|
|
]),
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 审核操作按钮
|
|
*/
|
|
protected function rowApprovalButton(): DialogAction
|
|
{
|
|
return amis()->DialogAction()->icon('fa-regular fa-check-circle')->label(__('finance.reimbursement.approval'))->level('link')->dialog(
|
|
amis()->Dialog()->title(__('finance.reimbursement.approval'))->body([
|
|
amis()->Form()->title('')
|
|
->api('post:'.admin_url('finance/reimbursements/${id}/approval'))
|
|
->body([
|
|
amis()->RadiosControl('approval_result', __('finance.reimbursement.approval_result'))
|
|
->options([
|
|
['label' => '通过', 'value' => 1],
|
|
['label' => '驳回', 'value' => 2],
|
|
])
|
|
->selectFirst()
|
|
->required(),
|
|
amis()->TextareaControl('failed_reason', __('finance.reimbursement.failed_reason'))
|
|
->visibleOn('${approval_result == 2}')
|
|
->required(),
|
|
]),
|
|
])->size('md')
|
|
);
|
|
}
|
|
}
|