public function save($input, $payment = null)
{
$publicId = isset($input['public_id']) ? $input['public_id'] : false;
if ($payment) {
// do nothing
} elseif ($publicId) {
$payment = Payment::scope($publicId)->firstOrFail();
if (Utils::isNinjaDev()) {
\Log::warning('Entity not set in payment repo save');
}
} else {
$payment = Payment::createNew();
}
if ($payment->is_deleted) {
return $payment;
}
$paymentTypeId = false;
if (isset($input['payment_type_id'])) {
$paymentTypeId = $input['payment_type_id'] ? $input['payment_type_id'] : null;
$payment->payment_type_id = $paymentTypeId;
}
if (isset($input['payment_date_sql'])) {
$payment->payment_date = $input['payment_date_sql'];
} elseif (isset($input['payment_date'])) {
$payment->payment_date = Utils::toSqlDate($input['payment_date']);
} else {
$payment->payment_date = date('Y-m-d');
}
if (isset($input['transaction_reference'])) {
$payment->transaction_reference = trim($input['transaction_reference']);
}
if (!$publicId) {
$clientId = $input['client_id'];
$amount = Utils::parseFloat($input['amount']);
if ($paymentTypeId == PAYMENT_TYPE_CREDIT) {
$credits = Credit::scope()->where('client_id', '=', $clientId)->where('balance', '>', 0)->orderBy('created_at')->get();
$remaining = $amount;
foreach ($credits as $credit) {
$remaining -= $credit->apply($remaining);
if (!$remaining) {
break;
}
}
}
$payment->invoice_id = $input['invoice_id'];
$payment->client_id = $clientId;
$payment->amount = $amount;
}
$payment->save();
return $payment;
}