public function pay_invoice_due($customer_id, $amount, $payment_medium)
{
$medium_config = Configure::read('payment_mediums');
if (array_key_exists($payment_medium, $medium_config)) {
$medium = $payment_medium;
} else {
$res = "Medium not valid";
echo $res;
die;
}
$invoice_table = TableRegistry::get('invoices');
$invoices = TableRegistry::get('invoices')->
find('all', [
'fields' => ['id', 'customer_id', 'net_total', 'due', 'invoice_date', 'customer_type', 'customer_unit_global_id'],
'contain' => ['Customers'],
'conditions' => ['customer_id' => $customer_id, 'Invoices.status' => 1]])
->order(['invoice_date' => 'ASC'])->hydrate(false)->toArray();
if (empty($invoices)) {
echo "Invoice not found for this customer";
die;
}
$time = time();
$user = $this->Auth->user();
$credit_note_amount = $amount;
$connection = ConnectionManager::get('default');
$payment_table = TableRegistry::get('payments');
$payment_entity = $payment_table->newEntity();
$payment_data['customer_id'] = $customer_id;
$payment_data['customer_type'] = $invoices[0]['customer_type'];
$payment_data['parent_global_id'] = $invoices[0]['customer_unit_global_id'];
$payment_data['medium'] = $medium;
$payment_data['amount'] = $amount;
$payment_data['collection_date'] = $time;
$payment_data['created_date'] = $time;
$payment_data['created_by'] = $user['id'];
$payment_data['is_adjustment'] = 1;
$payment_entity = $payment_table->patchEntity($payment_entity, $payment_data);
$connection->transactional(function ($connection)
use ($time, $user, $credit_note_amount, $invoice_table, $customer_id, $medium, $amount, $invoices, $payment_data, $payment_entity, $payment_table) {
foreach ($invoices as $invoice):
if ($credit_note_amount != 0) {
if ($invoice['due'] <= $credit_note_amount) {
$paid_due = $credit_note_amount - $invoice['due'];
$credit_note_amount = $paid_due;
$query = $invoice_table->query();
$query->update()
->set(['due' => 0, 'updated_date' => $time, 'updated_by' => $user['id']])
->where(['customer_id' => $customer_id, 'id' => $invoice['id']])
->execute();
//$connection->execute('UPDATE invoices SET due = ?, updated_date =? ,updated_by = ? WHERE customer_id = ? AND id=?', [0, $time, $user['id'], $customer_id, $invoice['id']]);
} else {
$paid_due = $invoice['due'] - $credit_note_amount;
$credit_note_amount = 0;
$query = $invoice_table->query();
$query->update()
->set(['due' => $paid_due, 'updated_date' => $time, 'updated_by' => $user['id']])
->where(['customer_id' => $customer_id, 'id' => $invoice['id']])
->execute();
// $connection->execute('UPDATE invoices SET due = ?, updated_date =?, updated_by = ? WHERE customer_id = ? AND id=?', [$paid_due, $time, $user['id'], $customer_id, $invoice['id']]);
}
}
endforeach;
if ($payment_table->save($payment_entity, $payment_data)) {
$res = "Payment Created Successfully Created";
echo $res;
} else {
pr($payment_entity->errors());
echo "Payment Was Unsuccessful";
die;
}
});
}
If any update query failed to execute then I don’t want to execute the save at the end of this method.
But Here transaction is not maintained and it’s not rolling back if any of update queries failed !