resolveCustomer($uuid); return DB::transaction(function () use ($customer, $admin, $amount, $isAdd) { $this->customerRepository->update($customer->id, [ 'credit' => (int) $customer->credit + ($isAdd ? $amount : -$amount), 'total' => (int) $customer->total + ($isAdd ? $amount : -$amount), ]); $this->recordTransaction( $customer, $admin, $amount, $isAdd ? 'admin_add_credit' : 'admin_deduct_credit', sprintf( '%s %s tiền trực tiếp cho khách hàng: %s VNĐ', $admin->username ?? $admin->email ?? 'Admin', $isAdd ? 'cộng' : 'trừ', number_format($amount), ), ); return $customer->fresh(); }); } public function addTotal(string $uuid, User $admin, int $amount, string $note, string $clientIp): Transaction { $customer = $this->resolveCustomer($uuid); return DB::transaction(function () use ($customer, $admin, $amount, $note, $clientIp) { $transaction = $this->recordTransaction( $customer, $admin, $amount, 'admin_add_total', $note, ); $customer->update(['total' => (int) $customer->total + $amount]); Log::create([ 'agent' => 'admin', 'client_ip' => $clientIp, 'description' => sprintf( '%s cộng tiền trực tiếp cho customer %s: %s VNĐ - %s', $admin->username ?? $admin->email, $customer->email, number_format($amount), $note, ), 'customer_id' => $customer->id, ]); return $transaction; }); } private function recordTransaction(Customer $customer, User $admin, int $amount, string $type, string $note): Transaction { return Transaction::create([ 'uuid' => (string) Str::uuid(), 'public_code' => Transaction::newPublicCode('ADM'), 'trans' => 'ADMIN' . now()->format('YmdHis'), 'amount' => $amount, 'customer_id' => $customer->id, 'user_id' => $admin->id, 'status' => TransactionStatus::COMPLETED->value, 'type' => $type, 'note' => $note, ]); } }