ClientPaymentMethodService.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. 'holder_name'
  21. )
  22. ->orderBy('is_active', 'desc')
  23. ->orderBy('created_at', 'desc')
  24. ->get();
  25. }
  26. public function findById(int $id): ?ClientPaymentMethod
  27. {
  28. return ClientPaymentMethod::find($id);
  29. }
  30. public function create(array $data): ClientPaymentMethod
  31. {
  32. return DB::transaction(function () use ($data) {
  33. if ($data['is_active'] ?? true) {
  34. $this->deactivateOtherCards($data['client_id']);
  35. }
  36. $paymentMethod = ClientPaymentMethod::create($data);
  37. $cardId = $this->pagarmeCardService->createCardForPaymentMethod($paymentMethod);
  38. if (empty($cardId)) {
  39. throw new \RuntimeException('Nao foi possivel salvar o cartao no Pagar.me.');
  40. }
  41. return $paymentMethod->fresh();
  42. });
  43. }
  44. public function update(ClientPaymentMethod $paymentMethod, array $data): ClientPaymentMethod
  45. {
  46. if (isset($data['is_active']) && $data['is_active']) {
  47. $this->deactivateOtherCards($paymentMethod->client_id, $paymentMethod->id);
  48. }
  49. $paymentMethod->update($data);
  50. return $paymentMethod->fresh();
  51. }
  52. public function delete(ClientPaymentMethod $paymentMethod): bool
  53. {
  54. return $paymentMethod->delete();
  55. }
  56. private function deactivateOtherCards(int $clientId, ?int $exceptId = null): void
  57. {
  58. $query = ClientPaymentMethod::where('client_id', $clientId);
  59. if ($exceptId) {
  60. $query->where('id', '!=', $exceptId);
  61. }
  62. $query->update(['is_active' => false]);
  63. }
  64. }