Andrew Wallo 10 月之前
父節點
當前提交
3d13f8a28d

+ 3
- 2
app/Console/Commands/UpdateOverdueInvoices.php 查看文件

2
 
2
 
3
 namespace App\Console\Commands;
3
 namespace App\Console\Commands;
4
 
4
 
5
+use App\Jobs\ProcessOverdueInvoices;
5
 use Illuminate\Console\Command;
6
 use Illuminate\Console\Command;
6
 
7
 
7
 class UpdateOverdueInvoices extends Command
8
 class UpdateOverdueInvoices extends Command
23
     /**
24
     /**
24
      * Execute the console command.
25
      * Execute the console command.
25
      */
26
      */
26
-    public function handle()
27
+    public function handle(): void
27
     {
28
     {
28
-        $this->info('Processing overdue invoices...');
29
+        ProcessOverdueInvoices::dispatch();
29
     }
30
     }
30
 }
31
 }

+ 9
- 0
app/Enums/Accounting/InvoiceStatus.php 查看文件

36
             self::Overdue => 'danger',
36
             self::Overdue => 'danger',
37
         };
37
         };
38
     }
38
     }
39
+
40
+    public static function canBeOverdue(): array
41
+    {
42
+        return [
43
+            self::Partial,
44
+            self::Sent,
45
+            self::Unsent,
46
+        ];
47
+    }
39
 }
48
 }

+ 12
- 9
app/Jobs/ProcessOverdueInvoices.php 查看文件

2
 
2
 
3
 namespace App\Jobs;
3
 namespace App\Jobs;
4
 
4
 
5
+use App\Enums\Accounting\InvoiceStatus;
6
+use App\Models\Accounting\Invoice;
5
 use Illuminate\Contracts\Queue\ShouldQueue;
7
 use Illuminate\Contracts\Queue\ShouldQueue;
8
+use Illuminate\Foundation\Bus\Dispatchable;
6
 use Illuminate\Foundation\Queue\Queueable;
9
 use Illuminate\Foundation\Queue\Queueable;
10
+use Illuminate\Queue\InteractsWithQueue;
11
+use Illuminate\Queue\SerializesModels;
7
 
12
 
8
 class ProcessOverdueInvoices implements ShouldQueue
13
 class ProcessOverdueInvoices implements ShouldQueue
9
 {
14
 {
15
+    use Dispatchable;
16
+    use InteractsWithQueue;
10
     use Queueable;
17
     use Queueable;
11
-
12
-    /**
13
-     * Create a new job instance.
14
-     */
15
-    public function __construct()
16
-    {
17
-        //
18
-    }
18
+    use SerializesModels;
19
 
19
 
20
     /**
20
     /**
21
      * Execute the job.
21
      * Execute the job.
22
      */
22
      */
23
     public function handle(): void
23
     public function handle(): void
24
     {
24
     {
25
-        //
25
+        Invoice::query()
26
+            ->whereIn('status', InvoiceStatus::canBeOverdue())
27
+            ->where('due_date', '<', today())
28
+            ->update(['status' => InvoiceStatus::Overdue]);
26
     }
29
     }
27
 }
30
 }

+ 5
- 0
app/Models/Accounting/Invoice.php 查看文件

124
         ]);
124
         ]);
125
     }
125
     }
126
 
126
 
127
+    public function canBeOverdue(): bool
128
+    {
129
+        return in_array($this->status, InvoiceStatus::canBeOverdue());
130
+    }
131
+
127
     public static function getNextDocumentNumber(): string
132
     public static function getNextDocumentNumber(): string
128
     {
133
     {
129
         $company = auth()->user()->currentCompany;
134
         $company = auth()->user()->currentCompany;

+ 1
- 1
config/queue.php 查看文件

38
             'driver' => 'database',
38
             'driver' => 'database',
39
             'connection' => env('DB_QUEUE_CONNECTION', null),
39
             'connection' => env('DB_QUEUE_CONNECTION', null),
40
             'table' => env('DB_QUEUE_TABLE', 'jobs'),
40
             'table' => env('DB_QUEUE_TABLE', 'jobs'),
41
-            'queue' => env('DB_QUEUE', 'translations'),
41
+            'queue' => env('DB_QUEUE', 'default'),
42
             'retry_after' => env('DB_QUEUE_RETRY_AFTER', 90),
42
             'retry_after' => env('DB_QUEUE_RETRY_AFTER', 90),
43
             'after_commit' => false,
43
             'after_commit' => false,
44
         ],
44
         ],

+ 2
- 2
database/factories/Accounting/InvoiceFactory.php 查看文件

36
             'invoice_number' => $this->faker->unique()->numerify('INV-#####'),
36
             'invoice_number' => $this->faker->unique()->numerify('INV-#####'),
37
             'order_number' => $this->faker->unique()->numerify('ORD-#####'),
37
             'order_number' => $this->faker->unique()->numerify('ORD-#####'),
38
             'date' => $this->faker->dateTimeBetween('-1 year'),
38
             'date' => $this->faker->dateTimeBetween('-1 year'),
39
-            'due_date' => $this->faker->dateTimeBetween('now', '+2 months'),
39
+            'due_date' => $this->faker->dateTimeBetween('-2 months', '+2 months'),
40
             'status' => InvoiceStatus::Draft,
40
             'status' => InvoiceStatus::Draft,
41
             'currency_code' => 'USD',
41
             'currency_code' => 'USD',
42
             'terms' => $this->faker->sentence,
42
             'terms' => $this->faker->sentence,
125
 
125
 
126
             $this->recalculateTotals($invoice);
126
             $this->recalculateTotals($invoice);
127
 
127
 
128
-            if ($invoice->due_date->isPast() && ! in_array($invoice->status, [InvoiceStatus::Draft, InvoiceStatus::Paid, InvoiceStatus::Void, InvoiceStatus::Overpaid])) {
128
+            if ($invoice->due_date->isPast() && $invoice->canBeOverdue()) {
129
                 $invoice->updateQuietly([
129
                 $invoice->updateQuietly([
130
                     'status' => InvoiceStatus::Overdue,
130
                     'status' => InvoiceStatus::Overdue,
131
                 ]);
131
                 ]);

+ 3
- 5
routes/console.php 查看文件

1
 <?php
1
 <?php
2
 
2
 
3
-use Illuminate\Foundation\Inspiring;
4
-use Illuminate\Support\Facades\Artisan;
3
+use App\Console\Commands\UpdateOverdueInvoices;
4
+use Illuminate\Support\Facades\Schedule;
5
 
5
 
6
-Artisan::command('inspire', function () {
7
-    $this->comment(Inspiring::quote());
8
-})->purpose('Display an inspiring quote')->hourly();
6
+Schedule::command(UpdateOverdueInvoices::class)->everyFiveMinutes();

Loading…
取消
儲存