@@ -30,13 +30,32 @@ public function __construct(
3030 }
3131
3232 public function handle (): void {
33- $ this ->remindUpComingRates ();
34- $ this ->findOverDueRates ();
33+ $ smsApplianceRemindRates = $ this ->getApplianceRemindRates ();
34+
35+ if ($ smsApplianceRemindRates ->isEmpty ()) {
36+ $ this ->info ('No enabled appliance reminder configurations found. ' );
37+
38+ return ;
39+ }
40+
41+ $ this ->info ('Found ' .$ smsApplianceRemindRates ->count ().' enabled reminder configuration(s). ' );
42+ $ this ->newLine ();
43+
44+ $ upcomingRates = $ this ->remindUpComingRates ($ smsApplianceRemindRates );
45+ $ overdueRates = $ this ->findOverDueRates ($ smsApplianceRemindRates );
46+
47+ $ this ->newLine ();
48+ $ this ->displaySummary ($ upcomingRates , $ overdueRates );
3549 }
3650
37- private function remindUpComingRates (): void {
38- $ smsApplianceRemindRates = $ this ->getApplianceRemindRates ();
39- $ smsApplianceRemindRates ->each (function (SmsApplianceRemindRate $ smsApplianceRemindRate ) {
51+ /**
52+ * @param Collection<int, SmsApplianceRemindRate> $smsApplianceRemindRates
53+ *
54+ * @return Collection<int, ApplianceRate>
55+ */
56+ private function remindUpComingRates (Collection $ smsApplianceRemindRates ): Collection {
57+ $ allUpcoming = new Collection ();
58+ $ smsApplianceRemindRates ->each (function (SmsApplianceRemindRate $ smsApplianceRemindRate ) use ($ allUpcoming ) {
4059 $ dueApplianceRates = $ this ->applianceRate ::with ([
4160 'appliancePerson.appliance.smsReminderRate ' ,
4261 'appliancePerson.appliance.applianceType ' ,
@@ -54,14 +73,21 @@ function ($q) {
5473 }
5574 )
5675 ->get ();
57- echo "\n" . count ( $ dueApplianceRates ). ' upcoming rates found ' . "\n" ;
76+ $ allUpcoming -> push (... $ dueApplianceRates );
5877 $ this ->sendReminders ($ dueApplianceRates , SmsTypes::APPLIANCE_RATE );
5978 });
79+
80+ return $ allUpcoming ;
6081 }
6182
62- private function findOverDueRates (): void {
63- $ smsApplianceRemindRates = $ this ->getApplianceRemindRates ();
64- $ smsApplianceRemindRates ->each (function (SmsApplianceRemindRate $ smsApplianceRemindRate ) {
83+ /**
84+ * @param Collection<int, SmsApplianceRemindRate> $smsApplianceRemindRates
85+ *
86+ * @return Collection<int, ApplianceRate>
87+ */
88+ private function findOverDueRates (Collection $ smsApplianceRemindRates ): Collection {
89+ $ allOverdue = new Collection ();
90+ $ smsApplianceRemindRates ->each (function (SmsApplianceRemindRate $ smsApplianceRemindRate ) use ($ allOverdue ) {
6591 $ overDueRates = $ this ->applianceRate ::with (['appliancePerson.appliance.applianceType ' , 'appliancePerson.person.addresses ' ])
6692 ->whereBetween ('due_date ' , [
6793 now ()->toDateString (),
@@ -70,10 +96,49 @@ private function findOverDueRates(): void {
7096 ->where ('remaining ' , '> ' , 0 )
7197 ->where ('remind ' , 0 )
7298 ->get ();
73-
74- echo "\n" .count ($ overDueRates ).' overdue rates found ' ."\n" ;
99+ $ allOverdue ->push (...$ overDueRates );
75100 $ this ->sendReminders ($ overDueRates , SmsTypes::OVER_DUE_APPLIANCE_RATE );
76101 });
102+
103+ return $ allOverdue ;
104+ }
105+
106+ /**
107+ * @param Collection<int, ApplianceRate> $upcomingRates
108+ * @param Collection<int, ApplianceRate> $overdueRates
109+ */
110+ private function displaySummary (Collection $ upcomingRates , Collection $ overdueRates ): void {
111+ if ($ upcomingRates ->isEmpty () && $ overdueRates ->isEmpty ()) {
112+ $ this ->info ('No upcoming or overdue appliance rates found. ' );
113+
114+ return ;
115+ }
116+
117+ if ($ upcomingRates ->isNotEmpty ()) {
118+ $ this ->info ('Upcoming Rates ( ' .$ upcomingRates ->count ().'): ' );
119+ $ this ->table (
120+ ['Appliance ' , 'Customer ' , 'Due Date ' , 'Remaining ' ],
121+ $ upcomingRates ->map (fn (ApplianceRate $ rate ): array => [
122+ $ rate ->appliancePerson ->appliance ->applianceType ->name ?? 'N/A ' ,
123+ $ rate ->appliancePerson ->person ->name ?? 'N/A ' ,
124+ (string ) $ rate ->due_date ,
125+ $ rate ->remaining ,
126+ ])->all (),
127+ );
128+ }
129+
130+ if ($ overdueRates ->isNotEmpty ()) {
131+ $ this ->info ('Overdue Rates ( ' .$ overdueRates ->count ().'): ' );
132+ $ this ->table (
133+ ['Appliance ' , 'Customer ' , 'Due Date ' , 'Remaining ' ],
134+ $ overdueRates ->map (fn (ApplianceRate $ rate ): array => [
135+ $ rate ->appliancePerson ->appliance ->applianceType ->name ?? 'N/A ' ,
136+ $ rate ->appliancePerson ->person ->name ?? 'N/A ' ,
137+ (string ) $ rate ->due_date ,
138+ $ rate ->remaining ,
139+ ])->all (),
140+ );
141+ }
77142 }
78143
79144 private function sendReminderSms (ApplianceRate $ applianceRate , int $ smsType ): void {
0 commit comments