ClientPaymentMethodService.php 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. namespace App\Services;
  3. use App\Models\ClientPaymentMethod;
  4. use App\Services\Pagarme\PagarmeCardService;
  5. use Illuminate\Support\Collection;
  6. use Illuminate\Support\Facades\DB;
  7. class ClientPaymentMethodService
  8. {
  9. public function __construct(
  10. private readonly PagarmeCardService $pagarmeCardService,
  11. ) {}
  12. public function getByClientId(int $clientId): Collection
  13. {
  14. return ClientPaymentMethod::where('client_id', $clientId)
  15. ->select(
  16. 'id',
  17. 'brand',
  18. 'last_four_digits',
  19. 'card_name'
  20. )
  21. ->orderBy('is_active', 'desc')
  22. ->orderBy('created_at', 'desc')
  23. ->get();
  24. }
  25. public function findById(int $id): ?ClientPaymentMethod
  26. {
  27. return ClientPaymentMethod::find($id);
  28. }
  29. public function create(array $data): ClientPaymentMethod
  30. {
  31. return DB::transaction(function () use ($data) {
  32. if ($data['is_active'] ?? true) {
  33. $this->deactivateOtherCards($data['client_id']);
  34. }
  35. $paymentMethod = ClientPaymentMethod::create($data);
  36. $cardId = $this->pagarmeCardService->createCardForPaymentMethod($paymentMethod);
  37. if (empty($cardId)) {
  38. throw new \RuntimeException('Nao foi possivel salvar o cartao no Pagar.me.');
  39. }
  40. return $paymentMethod->fresh();
  41. });
  42. }
  43. public function update(ClientPaymentMethod $paymentMethod, array $data): ClientPaymentMethod
  44. {
  45. if (isset($data['is_active']) && $data['is_active']) {
  46. $this->deactivateOtherCards($paymentMethod->client_id, $paymentMethod->id);
  47. }
  48. $paymentMethod->update($data);
  49. return $paymentMethod->fresh();
  50. }
  51. public function delete(ClientPaymentMethod $paymentMethod): bool
  52. {
  53. return $paymentMethod->delete();
  54. }
  55. private function deactivateOtherCards(int $clientId, ?int $exceptId = null): void
  56. {
  57. $query = ClientPaymentMethod::where('client_id', $clientId);
  58. if ($exceptId) {
  59. $query->where('id', '!=', $exceptId);
  60. }
  61. $query->update(['is_active' => false]);
  62. }
  63. }