111 lines
4.3 KiB
PHP
111 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Business;
|
|
|
|
use App\Utilities\FinanceLedgerAccountStatus;
|
|
use App\Utilities\FinanceLedgerAccess;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\Controller;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Validation\Rule;
|
|
use Modules\EcommerceFinance\Services\FinanceLedgerCalculator;
|
|
|
|
class FinanceLedger extends Controller
|
|
{
|
|
public function updateMapping(Request $request, int $id, FinanceLedgerCalculator $calculator): JsonResponse
|
|
{
|
|
abort_unless(FinanceLedgerAccess::canEditMapping(user()), 403, '只有财务台账管理员可以修改账户映射。');
|
|
|
|
$data = $request->validate([
|
|
'account_short' => ['nullable', 'string', 'max:100'],
|
|
]);
|
|
|
|
$account = trim((string) ($data['account_short'] ?? ''));
|
|
$connection = DB::connection((string) config('upstream_mirrors.connection', 'business_mirror'));
|
|
$row = $connection->table('fin_account_map')->where('id', $id)->first();
|
|
abort_if($row === null, 404);
|
|
|
|
if ($account !== '') {
|
|
$exists = $connection->table('fin_accounts')->where('account_short', $account)->exists();
|
|
abort_unless($exists, 422, '账户简称不存在,请从账户总表中选择。');
|
|
}
|
|
|
|
$old = (string) ($row->account_short ?? '');
|
|
$connection->table('fin_account_map')->where('id', $id)->update([
|
|
'account_short' => $account !== '' ? $account : null,
|
|
'updated_by' => (string) user()->name,
|
|
'updated_at' => now(),
|
|
]);
|
|
$connection->table('fin_account_map_events')->insert([
|
|
'source' => (string) $row->source,
|
|
'source_value' => (string) $row->source_value,
|
|
'old_account_short' => $old !== '' ? $old : null,
|
|
'new_account_short' => $account !== '' ? $account : null,
|
|
'user_id' => (int) user()->id,
|
|
'user_name' => (string) user()->name,
|
|
'created_at' => now(),
|
|
]);
|
|
|
|
if ($request->boolean('recalculate', true)) {
|
|
$calculator->recalculate();
|
|
}
|
|
|
|
$mapped = $connection->table('fin_account_map')
|
|
->whereNotNull('account_short')->where('account_short', '<>', '')->count();
|
|
|
|
return response()->json([
|
|
'ok' => true,
|
|
'account_short' => $account,
|
|
'mapped' => $mapped,
|
|
'total' => $connection->table('fin_account_map')->count(),
|
|
], 200, ['Cache-Control' => 'private, no-store']);
|
|
}
|
|
|
|
public function updateAccountStatus(Request $request): JsonResponse
|
|
{
|
|
abort_unless(FinanceLedgerAccess::canEditAccountStatus(user()), 403, '只有财务台账管理员可以修改账户状态。');
|
|
|
|
$data = $request->validate([
|
|
'account_short' => ['required', 'string', 'max:100'],
|
|
'status' => ['required', 'string', Rule::in(array_keys(FinanceLedgerAccountStatus::OPTIONS))],
|
|
]);
|
|
|
|
$accountShort = trim((string) $data['account_short']);
|
|
abort_if($accountShort === '', 422, '账户简称不能为空。');
|
|
|
|
$connection = DB::connection((string) config('upstream_mirrors.connection', 'business_mirror'));
|
|
abort_unless(
|
|
$connection->table('fin_accounts')->where('account_short', $accountShort)->exists(),
|
|
422,
|
|
'账户简称不存在,请刷新账户总表后重试。',
|
|
);
|
|
|
|
$status = FinanceLedgerAccountStatus::normalize((string) $data['status']);
|
|
$statuses = $connection->table('fin_account_statuses');
|
|
$existing = $statuses->where('account_short', $accountShort)->first();
|
|
$now = now();
|
|
$values = [
|
|
'status' => $status,
|
|
'updated_by' => (string) user()->name,
|
|
'updated_at' => $now,
|
|
];
|
|
|
|
if ($existing === null) {
|
|
$statuses->insert($values + [
|
|
'account_short' => $accountShort,
|
|
'created_at' => $now,
|
|
]);
|
|
} else {
|
|
$statuses->where('account_short', $accountShort)->update($values);
|
|
}
|
|
|
|
return response()->json([
|
|
'ok' => true,
|
|
'account_short' => $accountShort,
|
|
'status' => $status,
|
|
'label' => FinanceLedgerAccountStatus::label($status),
|
|
], 200, ['Cache-Control' => 'private, no-store']);
|
|
}
|
|
}
|