getCustomers() as $c) { if ($c->BillingStatus == 'Inactive') { $this->comment(sprintf('Ignoring INACTIVE: [%s] %s %s',$c->EzypayReferenceNumber,$c->Firstname,$c->Surname)); continue; } // Load Account Details from ReferenceId $ao = Account::find((int)substr($c->ReferenceId,2,4)); if (! $ao) { $this->warn(sprintf('Missing: [%s] %s %s (%s)',$c->EzypayReferenceNumber,$c->Firstname,$c->Surname,$c->ReferenceId)); continue; } // Get Due Invoices $invoice_due = $ao->invoiceSummaryDue()->get(); $this->info(sprintf('Account [%s] (%s) has [%d] invoices due, totalling [%3.2f]', $ao->lid, $ao->name, $invoice_due->count(), ($due=$invoice_due->sum('_balance')), )); $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->Status !== 'Pending') { $this->warn(sprintf('- Next payment is not pending for (%s)',$ao->name)); continue; } $next_paydate = Carbon::createFromTimeString($next_pay->Date); if ($next_pay->Amount < $due) $this->error(sprintf('- Next payment on [%s] for (%s) [%s] not sufficient for outstanding balance [%s]', $next_paydate->format('Y-m-d'), $ao->name, number_format($next_pay->Amount,2), number_format($due,2))); elseif ($next_pay->Amount > $due) $this->warn(sprintf('- Next payment on [%s] for (%s) [%s] is too much for outstanding balance [%s]', $next_paydate->format('Y-m-d'), $ao->name, number_format($next_pay->Amount,2), number_format($due,2))); else $this->info(sprintf('- Next payment on [%s] for (%s) [%s] will cover outstanding balance [%s]', $next_paydate->format('Y-m-d'), $ao->name, number_format($next_pay->Amount,2), number_format($due,2))); } } }