90 lines
2.4 KiB
PHP
90 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use Carbon\Carbon;
|
|
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';
|
|
|
|
/**
|
|
* 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))
|
|
->single();
|
|
|
|
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->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 < $account_due)
|
|
$this->warn(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($account_due,2)));
|
|
|
|
elseif ($next_pay->Amount > $account_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($account_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($account_due,2)));
|
|
}
|
|
}
|
|
} |