SyncStudentChargeJob.php 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace App\Jobs;
  3. use App\Models\StudentContractInstallment;
  4. use App\Models\UnitPaymentAccount;
  5. use App\Services\Integrations\Asaas\AsaasClient;
  6. use App\Services\Integrations\Asaas\AsaasCustomerService;
  7. use Exception;
  8. use Illuminate\Bus\Queueable;
  9. use Illuminate\Contracts\Queue\ShouldQueue;
  10. use Illuminate\Foundation\Bus\Dispatchable;
  11. use Illuminate\Queue\InteractsWithQueue;
  12. use Illuminate\Queue\SerializesModels;
  13. use Illuminate\Support\Facades\Log;
  14. /**
  15. * Emite a cobrança de uma parcela de aluno na conta Asaas PRÓPRIA da unidade.
  16. *
  17. * Asaas é opcional: se a unidade não tiver chave, o job apenas registra e sai —
  18. * a parcela segue para baixa manual. externalReference = STU_{id}.
  19. */
  20. class SyncStudentChargeJob implements ShouldQueue
  21. {
  22. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  23. public StudentContractInstallment $installment;
  24. public function __construct(StudentContractInstallment $installment)
  25. {
  26. $this->installment = $installment;
  27. }
  28. public function handle(): void
  29. {
  30. $installment = $this->installment->fresh(['student']);
  31. if (!$installment || $installment->status === 'cancelled') {
  32. return;
  33. }
  34. if ($installment->asaas_id) {
  35. Log::info("Parcela #{$installment->id} já possui cobrança Asaas. Ignorando.");
  36. return;
  37. }
  38. $account = UnitPaymentAccount::where('unit_id', $installment->unit_id)->first();
  39. if (!$account || empty($account->asaas_api_key)) {
  40. Log::info("Unidade {$installment->unit_id} sem Asaas. Parcela #{$installment->id} segue para baixa manual.");
  41. return;
  42. }
  43. $client = new AsaasClient($account->asaas_api_key);
  44. $customerService = new AsaasCustomerService($client);
  45. try {
  46. $customerId = $customerService->ensureStudentCustomer($installment->student);
  47. $response = $client->post('/payments', [
  48. 'customer' => $customerId,
  49. 'billingType' => 'UNDEFINED',
  50. 'value' => (float) $installment->value,
  51. 'dueDate' => $installment->due_date->format('Y-m-d'),
  52. 'description' => trim(($installment->history ?? 'Mensalidade') . ' ' . $installment->order),
  53. 'externalReference' => "STU_{$installment->id}",
  54. ]);
  55. $installment->update([
  56. 'asaas_customer_id' => $customerId,
  57. 'asaas_id' => $response['id'],
  58. 'invoice_url' => $response['invoiceUrl'] ?? null,
  59. 'billing_type' => $response['billingType'] ?? 'UNDEFINED',
  60. 'asaas_status' => $response['status'] ?? null,
  61. ]);
  62. Log::info("Cobrança Asaas gerada para parcela #{$installment->id}.");
  63. } catch (Exception $e) {
  64. Log::error("Erro ao gerar cobrança Asaas da parcela #{$installment->id}: " . $e->getMessage());
  65. throw $e;
  66. }
  67. }
  68. }