FranchiseeTbrService.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. namespace App\Services;
  3. use App\Models\FnmBaseBracket;
  4. use App\Models\FranchiseeFnmBracket;
  5. use App\Models\FranchiseeMaintenanceBracket;
  6. use App\Models\FranchiseeRoyaltiesBracket;
  7. use App\Models\FranchiseeTbr;
  8. use App\Models\MaintenanceBaseBracket;
  9. use App\Models\RoyaltiesBaseBracket;
  10. use Illuminate\Support\Facades\DB;
  11. use Illuminate\Pagination\LengthAwarePaginator;
  12. class FranchiseeTbrService
  13. {
  14. public function paginate(int $perPage = 15): LengthAwarePaginator
  15. {
  16. return FranchiseeTbr::with(['franchisee', 'contract.unit', 'inhabitantClassification', 'maintenanceBracket'])
  17. ->orderBy('created_at', 'desc')
  18. ->paginate($perPage);
  19. }
  20. public function findById(int $id): ?FranchiseeTbr
  21. {
  22. return FranchiseeTbr::with([
  23. 'franchisee',
  24. 'contract',
  25. 'inhabitantClassification',
  26. 'royaltiesBracket',
  27. 'fnmBracket',
  28. 'maintenanceBracket',
  29. ])->find($id);
  30. }
  31. public function createWithBrackets(array $data): FranchiseeTbr
  32. {
  33. return DB::transaction(function () use ($data) {
  34. $franchiseeId = $data['franchisee_id'];
  35. $royaltyBrackets = $this->copyBaseBrackets(RoyaltiesBaseBracket::class, FranchiseeRoyaltiesBracket::class, $franchiseeId);
  36. $fnmBrackets = $this->copyBaseBrackets(FnmBaseBracket::class, FranchiseeFnmBracket::class, $franchiseeId);
  37. $maintenanceBrackets = $this->copyBaseBrackets(MaintenanceBaseBracket::class, FranchiseeMaintenanceBracket::class, $franchiseeId);
  38. return FranchiseeTbr::create(array_merge($data, [
  39. 'franchisee_royalties_bracket_id' => $royaltyBrackets->first()?->id,
  40. 'franchisee_fnm_bracket_id' => $fnmBrackets->first()?->id,
  41. 'franchisee_maintenance_bracket_id' => $maintenanceBrackets->first()?->id,
  42. ]));
  43. });
  44. }
  45. public function update(int $id, array $data): ?FranchiseeTbr
  46. {
  47. $model = $this->findById($id);
  48. if (!$model) {
  49. return null;
  50. }
  51. $model->update($data);
  52. return $model->fresh();
  53. }
  54. public function delete(int $id): bool
  55. {
  56. $model = $this->findById($id);
  57. if (!$model) {
  58. return false;
  59. }
  60. return $model->delete();
  61. }
  62. private function copyBaseBrackets(string $baseClass, string $franchiseeClass, int $franchiseeId): \Illuminate\Database\Eloquent\Collection
  63. {
  64. $baseBrackets = $baseClass::orderBy('start_month')->get();
  65. $copied = $baseBrackets->map(fn ($base) => $franchiseeClass::create([
  66. 'franchisee_id' => $franchiseeId,
  67. 'description' => $base->description,
  68. 'start_month' => $base->start_month,
  69. 'end_month' => $base->end_month,
  70. 'percentage' => $base->percentage,
  71. ]));
  72. return $copied;
  73. }
  74. }