OrderPaymentStatusService.php 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. namespace App\Services;
  3. use App\Models\Order;
  4. use App\Models\ProductSKU;
  5. use App\Models\Scopes\YearScope;
  6. use Illuminate\Database\Eloquent\Builder;
  7. class OrderPaymentStatusService
  8. {
  9. public function paidBackfillCandidatesQuery(?int $year = null): Builder
  10. {
  11. return Order::query()
  12. ->withoutGlobalScope(YearScope::class)
  13. ->when($year !== null, fn (Builder $query): Builder => $query->where('year', $year))
  14. ->where('order_status_id', '<>', Order::STATUS_PAID)
  15. ->whereHas('products_sku', function (Builder $query): void {
  16. $query->withoutGlobalScope(YearScope::class);
  17. })
  18. ->whereDoesntHave('products_sku', function (Builder $query): void {
  19. $query
  20. ->withoutGlobalScope(YearScope::class)
  21. ->where(function (Builder $query): void {
  22. $query
  23. ->whereNull('statement_number')
  24. ->orWhereRaw("TRIM(statement_number) = ''")
  25. ->orWhereNull('upd_number')
  26. ->orWhereRaw("TRIM(upd_number) = ''");
  27. });
  28. });
  29. }
  30. public function markPaidIfAllMafsHavePaymentData(Order|int|null $order): bool
  31. {
  32. if ($order === null) {
  33. return false;
  34. }
  35. $order = $order instanceof Order
  36. ? $order
  37. : Order::query()->withoutGlobalScope(YearScope::class)->find($order);
  38. if (!$order) {
  39. return false;
  40. }
  41. $mafsQuery = ProductSKU::query()
  42. ->withoutGlobalScope(YearScope::class)
  43. ->where('order_id', $order->id);
  44. if (!(clone $mafsQuery)->exists()) {
  45. return false;
  46. }
  47. $hasIncompleteMafs = (clone $mafsQuery)
  48. ->where(function ($query): void {
  49. $query
  50. ->whereNull('statement_number')
  51. ->orWhereRaw("TRIM(statement_number) = ''")
  52. ->orWhereNull('upd_number')
  53. ->orWhereRaw("TRIM(upd_number) = ''");
  54. })
  55. ->exists();
  56. if ($hasIncompleteMafs) {
  57. return false;
  58. }
  59. if ((int) $order->order_status_id !== Order::STATUS_PAID) {
  60. $order->update(['order_status_id' => Order::STATUS_PAID]);
  61. }
  62. return true;
  63. }
  64. }