<?php namespace App\Console\Commands; use Illuminate\Console\Command; use App\Classes\External\Payments\Ezypay; use App\Models\Account; class PaymentsEzypayNext extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'payments:ezypay:next'; /** * The console command description. * * @var string */ protected $description = 'Load next payments, and ensure they cover the next invoice'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { $poo = new Ezypay(); foreach ($poo->getCustomers() as $c) { if ($c->BillingStatus == 'Inactive') { $this->info(sprintf('Ignoring INACTIVE: [%s] %s %s',$c->EzypayReferenceNumber,$c->Firstname,$c->Surname)); continue; } // Load Account Details from ReferenceId $ao = Account::where('site_id',(int)substr($c->ReferenceId,0,2)) ->where('id',(int)substr($c->ReferenceId,2,4)) ->first(); if (! $ao) { $this->warn(sprintf('Missing: [%s] %s %s (%s)',$c->EzypayReferenceNumber,$c->Firstname,$c->Surname,$c->ReferenceId)); continue; } // Get Due Invoices $account_due = $ao->dueInvoices()->sum('due'); $next_pay = $poo->getDebits([ 'customerId'=>$c->Id, 'dateFrom'=>now()->format('Y-m-d'), 'dateTo'=>now()->addQuarter()->format('Y-m-d'), ])->reverse()->first(); if ($next_pay->Amount < $account_due) $this->warn(sprintf('Next payment for (%s) [%s] not sufficient for outstanding balance [%s]',$ao->name,number_format($next_pay->Amount,2),number_format($account_due,2))); elseif ($next_pay->Amount > $account_due) $this->warn(sprintf('Next payment for (%s) [%s] is too much for outstanding balance [%s]',$ao->name,number_format($next_pay->Amount,2),number_format($account_due,2))); else $this->info(sprintf('Next payment for (%s) [%s] will cover outstanding balance [%s]',$ao->name,number_format($next_pay->Amount,2),number_format($account_due,2))); } } }