742 lines
33 KiB
PHP
742 lines
33 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Contact;
|
|
use App\Events\TransactionPaymentAdded;
|
|
use App\Events\TransactionPaymentUpdated;
|
|
use App\Exceptions\AdvanceBalanceNotAvailable;
|
|
use App\Transaction;
|
|
use App\TransactionPayment;
|
|
use App\Utils\ModuleUtil;
|
|
use App\Utils\TransactionUtil;
|
|
use Datatables;
|
|
use DB;
|
|
use Illuminate\Http\Request;
|
|
|
|
class TransactionPaymentController extends Controller
|
|
{
|
|
protected $transactionUtil;
|
|
|
|
protected $moduleUtil;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param TransactionUtil $transactionUtil
|
|
* @return void
|
|
*/
|
|
public function __construct(TransactionUtil $transactionUtil, ModuleUtil $moduleUtil)
|
|
{
|
|
$this->transactionUtil = $transactionUtil;
|
|
$this->moduleUtil = $moduleUtil;
|
|
}
|
|
|
|
/**
|
|
* Display a listing of the resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function index()
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Show the form for creating a new resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function create()
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
try {
|
|
$business_id = $request->session()->get('user.business_id');
|
|
$transaction_id = $request->input('transaction_id');
|
|
$transaction = Transaction::where('business_id', $business_id)->with(['contact'])->findOrFail($transaction_id);
|
|
|
|
$transaction_before = $transaction->replicate();
|
|
|
|
if (! (auth()->user()->can('purchase.payments') || auth()->user()->can('hms.add_booking_payment') || auth()->user()->can('sell.payments') || auth()->user()->can('all_expense.access') || auth()->user()->can('view_own_expense'))) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if ($transaction->payment_status != 'paid') {
|
|
$inputs = $request->only(['amount', 'method', 'note', 'card_number', 'card_holder_name',
|
|
'card_transaction_number', 'card_type', 'card_month', 'card_year', 'card_security',
|
|
'cheque_number', 'bank_account_number', ]);
|
|
$inputs['paid_on'] = $this->transactionUtil->uf_date($request->input('paid_on'), true);
|
|
$inputs['transaction_id'] = $transaction->id;
|
|
$inputs['amount'] = $this->transactionUtil->num_uf($inputs['amount']);
|
|
$inputs['created_by'] = auth()->user()->id;
|
|
$inputs['payment_for'] = $transaction->contact_id;
|
|
|
|
if ($inputs['method'] == 'custom_pay_1') {
|
|
$inputs['transaction_no'] = $request->input('transaction_no_1');
|
|
} elseif ($inputs['method'] == 'custom_pay_2') {
|
|
$inputs['transaction_no'] = $request->input('transaction_no_2');
|
|
} elseif ($inputs['method'] == 'custom_pay_3') {
|
|
$inputs['transaction_no'] = $request->input('transaction_no_3');
|
|
}
|
|
|
|
if (! empty($request->input('account_id')) && $inputs['method'] != 'advance') {
|
|
$inputs['account_id'] = $request->input('account_id');
|
|
}
|
|
|
|
$prefix_type = 'purchase_payment';
|
|
if (in_array($transaction->type, ['sell', 'sell_return'])) {
|
|
$prefix_type = 'sell_payment';
|
|
} elseif (in_array($transaction->type, ['expense', 'expense_refund'])) {
|
|
$prefix_type = 'expense_payment';
|
|
}
|
|
|
|
DB::beginTransaction();
|
|
|
|
$ref_count = $this->transactionUtil->setAndGetReferenceCount($prefix_type);
|
|
//Generate reference number
|
|
$inputs['payment_ref_no'] = $this->transactionUtil->generateReferenceNumber($prefix_type, $ref_count);
|
|
|
|
$inputs['business_id'] = $request->session()->get('business.id');
|
|
$inputs['document'] = $this->transactionUtil->uploadFile($request, 'document', 'documents');
|
|
|
|
//Pay from advance balance
|
|
$payment_amount = $inputs['amount'];
|
|
$contact_balance = ! empty($transaction->contact) ? $transaction->contact->balance : 0;
|
|
if ($inputs['method'] == 'advance' && $inputs['amount'] > $contact_balance) {
|
|
throw new AdvanceBalanceNotAvailable(__('lang_v1.required_advance_balance_not_available'));
|
|
}
|
|
|
|
if (! empty($inputs['amount'])) {
|
|
$tp = TransactionPayment::create($inputs);
|
|
|
|
if (! empty($request->input('denominations'))) {
|
|
$this->transactionUtil->addCashDenominations($tp, $request->input('denominations'));
|
|
}
|
|
|
|
$inputs['transaction_type'] = $transaction->type;
|
|
event(new TransactionPaymentAdded($tp, $inputs));
|
|
}
|
|
|
|
//update payment status
|
|
$payment_status = $this->transactionUtil->updatePaymentStatus($transaction_id, $transaction->final_total);
|
|
$transaction->payment_status = $payment_status;
|
|
|
|
$this->transactionUtil->activityLog($transaction, 'payment_edited', $transaction_before);
|
|
|
|
DB::commit();
|
|
}
|
|
|
|
$output = ['success' => true,
|
|
'msg' => __('purchase.payment_added_success'),
|
|
];
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
$msg = __('messages.something_went_wrong');
|
|
|
|
if (get_class($e) == \App\Exceptions\AdvanceBalanceNotAvailable::class) {
|
|
$msg = $e->getMessage();
|
|
} else {
|
|
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
|
|
}
|
|
|
|
$output = ['success' => false,
|
|
'msg' => $msg,
|
|
];
|
|
}
|
|
|
|
return redirect()->back()->with(['status' => $output]);
|
|
}
|
|
|
|
/**
|
|
* Display the specified resource.
|
|
*
|
|
* @param int $id
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function show($id)
|
|
{
|
|
if (! (auth()->user()->can('sell.payments') || auth()->user()->can('purchase.payments') || auth()->user()->can('hms.add_booking_payment'))) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
$transaction = Transaction::where('id', $id)
|
|
->with(['contact', 'business', 'transaction_for'])
|
|
->first();
|
|
$payments_query = TransactionPayment::where('transaction_id', $id);
|
|
|
|
$accounts_enabled = false;
|
|
if ($this->moduleUtil->isModuleEnabled('account')) {
|
|
$accounts_enabled = true;
|
|
$payments_query->with(['payment_account']);
|
|
}
|
|
|
|
$payments = $payments_query->get();
|
|
$location_id = ! empty($transaction->location_id) ? $transaction->location_id : null;
|
|
$payment_types = $this->transactionUtil->payment_types($location_id, true);
|
|
|
|
return view('transaction_payment.show_payments')
|
|
->with(compact('transaction', 'payments', 'payment_types', 'accounts_enabled'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Show the form for editing the specified resource.
|
|
*
|
|
* @param int $id
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function edit($id)
|
|
{
|
|
if (! auth()->user()->can('edit_purchase_payment') && ! auth()->user()->can('edit_sell_payment') && !auth()->user()->can('hms.edit_booking_payment')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
$business_id = request()->session()->get('user.business_id');
|
|
|
|
$payment_line = TransactionPayment::with(['denominations'])->where('method', '!=', 'advance')->findOrFail($id);
|
|
|
|
$transaction = Transaction::where('id', $payment_line->transaction_id)
|
|
->where('business_id', $business_id)
|
|
->with(['contact', 'location'])
|
|
->first();
|
|
|
|
$payment_types = $this->transactionUtil->payment_types($transaction->location);
|
|
|
|
//Accounts
|
|
$accounts = $this->moduleUtil->accountsDropdown($business_id, true, false, true);
|
|
|
|
return view('transaction_payment.edit_payment_row')
|
|
->with(compact('transaction', 'payment_types', 'payment_line', 'accounts'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @param int $id
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function update(Request $request, $id)
|
|
{
|
|
if (! auth()->user()->can('edit_purchase_payment') && ! auth()->user()->can('edit_sell_payment') && ! auth()->user()->can('all_expense.access') && ! auth()->user()->can('view_own_expense') && !auth()->user()->can('hms.edit_booking_payment')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
try {
|
|
$business_id = request()->session()->get('user.business_id');
|
|
|
|
$inputs = $request->only(['amount', 'method', 'note', 'card_number', 'card_holder_name',
|
|
'card_transaction_number', 'card_type', 'card_month', 'card_year', 'card_security',
|
|
'cheque_number', 'bank_account_number', ]);
|
|
$inputs['paid_on'] = $this->transactionUtil->uf_date($request->input('paid_on'), true);
|
|
$inputs['amount'] = $this->transactionUtil->num_uf($inputs['amount']);
|
|
|
|
if ($inputs['method'] == 'custom_pay_1') {
|
|
$inputs['transaction_no'] = $request->input('transaction_no_1');
|
|
} elseif ($inputs['method'] == 'custom_pay_2') {
|
|
$inputs['transaction_no'] = $request->input('transaction_no_2');
|
|
} elseif ($inputs['method'] == 'custom_pay_3') {
|
|
$inputs['transaction_no'] = $request->input('transaction_no_3');
|
|
}
|
|
|
|
if (! empty($request->input('account_id'))) {
|
|
$inputs['account_id'] = $request->input('account_id');
|
|
}
|
|
|
|
$payment = TransactionPayment::where('method', '!=', 'advance')->findOrFail($id);
|
|
|
|
if (! empty($request->input('denominations'))) {
|
|
$this->transactionUtil->updateCashDenominations($payment, $request->input('denominations'));
|
|
}
|
|
|
|
//Update parent payment if exists
|
|
if (! empty($payment->parent_id)) {
|
|
$parent_payment = TransactionPayment::find($payment->parent_id);
|
|
$parent_payment->amount = $parent_payment->amount - ($payment->amount - $inputs['amount']);
|
|
|
|
$parent_payment->save();
|
|
}
|
|
|
|
$business_id = $request->session()->get('user.business_id');
|
|
|
|
$transaction = Transaction::where('business_id', $business_id)
|
|
->find($payment->transaction_id);
|
|
|
|
$transaction_before = $transaction->replicate();
|
|
$document_name = $this->transactionUtil->uploadFile($request, 'document', 'documents');
|
|
if (! empty($document_name)) {
|
|
$inputs['document'] = $document_name;
|
|
}
|
|
|
|
DB::beginTransaction();
|
|
|
|
$payment->update($inputs);
|
|
|
|
//update payment status
|
|
$payment_status = $this->transactionUtil->updatePaymentStatus($payment->transaction_id);
|
|
$transaction->payment_status = $payment_status;
|
|
|
|
$this->transactionUtil->activityLog($transaction, 'payment_edited', $transaction_before);
|
|
|
|
DB::commit();
|
|
|
|
//event
|
|
event(new TransactionPaymentUpdated($payment, $transaction->type));
|
|
|
|
$output = ['success' => true,
|
|
'msg' => __('purchase.payment_updated_success'),
|
|
];
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
|
|
|
|
$output = ['success' => false,
|
|
'msg' => __('messages.something_went_wrong'),
|
|
];
|
|
}
|
|
|
|
return redirect()->back()->with(['status' => $output]);
|
|
}
|
|
|
|
/**
|
|
* Remove the specified resource from storage.
|
|
*
|
|
* @param int $id
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function destroy($id)
|
|
{
|
|
if (! auth()->user()->can('delete_purchase_payment') && ! auth()->user()->can('delete_sell_payment') && ! auth()->user()->can('all_expense.access') && ! auth()->user()->can('view_own_expense') && !auth()->user()->can('hms.delete_booking_payment')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
try {
|
|
$payment = TransactionPayment::findOrFail($id);
|
|
|
|
DB::beginTransaction();
|
|
|
|
if (! empty($payment->transaction_id)) {
|
|
TransactionPayment::deletePayment($payment);
|
|
} else { //advance payment
|
|
$adjusted_payments = TransactionPayment::where('parent_id',
|
|
$payment->id)
|
|
->get();
|
|
|
|
$total_adjusted_amount = $adjusted_payments->sum('amount');
|
|
|
|
//Get customer advance share from payment and deduct from advance balance
|
|
$total_customer_advance = $payment->amount - $total_adjusted_amount;
|
|
if ($total_customer_advance > 0) {
|
|
$this->transactionUtil->updateContactBalance($payment->payment_for, $total_customer_advance, 'deduct');
|
|
}
|
|
|
|
//Delete all child payments
|
|
foreach ($adjusted_payments as $adjusted_payment) {
|
|
//Make parent payment null as it will get deleted
|
|
$adjusted_payment->parent_id = null;
|
|
TransactionPayment::deletePayment($adjusted_payment);
|
|
}
|
|
|
|
//Delete advance payment
|
|
TransactionPayment::deletePayment($payment);
|
|
}
|
|
|
|
DB::commit();
|
|
|
|
$output = ['success' => true,
|
|
'msg' => __('purchase.payment_deleted_success'),
|
|
];
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
|
|
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
|
|
|
|
$output = ['success' => false,
|
|
'msg' => __('messages.something_went_wrong'),
|
|
];
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds new payment to the given transaction.
|
|
*
|
|
* @param int $transaction_id
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function addPayment($transaction_id)
|
|
{
|
|
if (! auth()->user()->can('purchase.payments') && ! auth()->user()->can('sell.payments') && ! auth()->user()->can('all_expense.access') && ! auth()->user()->can('view_own_expense') && !auth()->user()->can('hms.add_booking_payment')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
$business_id = request()->session()->get('user.business_id');
|
|
|
|
$transaction = Transaction::where('business_id', $business_id)
|
|
->with(['contact', 'location'])
|
|
->findOrFail($transaction_id);
|
|
if ($transaction->payment_status != 'paid') {
|
|
$show_advance = in_array($transaction->type, ['sell', 'purchase']) ? true : false;
|
|
$payment_types = $this->transactionUtil->payment_types($transaction->location, $show_advance);
|
|
|
|
$paid_amount = $this->transactionUtil->getTotalPaid($transaction_id);
|
|
$amount = $transaction->final_total - $paid_amount;
|
|
if ($amount < 0) {
|
|
$amount = 0;
|
|
}
|
|
|
|
$amount_formated = $this->transactionUtil->num_f($amount);
|
|
|
|
$payment_line = new TransactionPayment();
|
|
$payment_line->amount = $amount;
|
|
$payment_line->method = 'cash';
|
|
$payment_line->paid_on = \Carbon::now()->toDateTimeString();
|
|
|
|
//Accounts
|
|
$accounts = $this->moduleUtil->accountsDropdown($business_id, true, false, true);
|
|
|
|
$view = view('transaction_payment.payment_row')
|
|
->with(compact('transaction', 'payment_types', 'payment_line', 'amount_formated', 'accounts'))->render();
|
|
|
|
$output = ['status' => 'due',
|
|
'view' => $view, ];
|
|
} else {
|
|
$output = ['status' => 'paid',
|
|
'view' => '',
|
|
'msg' => __('purchase.amount_already_paid'), ];
|
|
}
|
|
|
|
return json_encode($output);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Shows contact's payment due modal
|
|
*
|
|
* @param int $contact_id
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function getPayContactDue($contact_id)
|
|
{
|
|
if (! (auth()->user()->can('sell.payments') || auth()->user()->can('purchase.payments'))) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
$business_id = request()->session()->get('user.business_id');
|
|
|
|
$due_payment_type = request()->input('type');
|
|
$query = Contact::where('contacts.id', $contact_id)
|
|
->leftjoin('transactions AS t', 'contacts.id', '=', 't.contact_id');
|
|
if ($due_payment_type == 'purchase') {
|
|
$query->select(
|
|
DB::raw("SUM(IF(t.type = 'purchase', final_total, 0)) as total_purchase"),
|
|
DB::raw("SUM(IF(t.type = 'purchase', (SELECT SUM(amount) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as total_paid"),
|
|
'contacts.name',
|
|
'contacts.supplier_business_name',
|
|
'contacts.id as contact_id'
|
|
);
|
|
} elseif ($due_payment_type == 'purchase_return') {
|
|
$query->select(
|
|
DB::raw("SUM(IF(t.type = 'purchase_return', final_total, 0)) as total_purchase_return"),
|
|
DB::raw("SUM(IF(t.type = 'purchase_return', (SELECT SUM(amount) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as total_return_paid"),
|
|
'contacts.name',
|
|
'contacts.supplier_business_name',
|
|
'contacts.id as contact_id'
|
|
);
|
|
} elseif ($due_payment_type == 'sell') {
|
|
$query->select(
|
|
DB::raw("SUM(IF(t.type = 'sell' AND t.status = 'final', final_total, 0)) as total_invoice"),
|
|
DB::raw("SUM(IF(t.type = 'sell' AND t.status = 'final', (SELECT SUM(IF(is_return = 1,-1*amount,amount)) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as total_paid"),
|
|
'contacts.name',
|
|
'contacts.supplier_business_name',
|
|
'contacts.id as contact_id'
|
|
);
|
|
} elseif ($due_payment_type == 'sell_return') {
|
|
$query->select(
|
|
DB::raw("SUM(IF(t.type = 'sell_return', final_total, 0)) as total_sell_return"),
|
|
DB::raw("SUM(IF(t.type = 'sell_return', (SELECT SUM(amount) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as total_return_paid"),
|
|
'contacts.name',
|
|
'contacts.supplier_business_name',
|
|
'contacts.id as contact_id'
|
|
);
|
|
}
|
|
|
|
//Query for opening balance details
|
|
$query->addSelect(
|
|
DB::raw("SUM(IF(t.type = 'opening_balance', final_total, 0)) as opening_balance"),
|
|
DB::raw("SUM(IF(t.type = 'opening_balance', (SELECT SUM(amount) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as opening_balance_paid")
|
|
);
|
|
$contact_details = $query->first();
|
|
|
|
$payment_line = new TransactionPayment();
|
|
if ($due_payment_type == 'purchase') {
|
|
$contact_details->total_purchase = empty($contact_details->total_purchase) ? 0 : $contact_details->total_purchase;
|
|
$payment_line->amount = $contact_details->total_purchase -
|
|
$contact_details->total_paid;
|
|
} elseif ($due_payment_type == 'purchase_return') {
|
|
$payment_line->amount = $contact_details->total_purchase_return -
|
|
$contact_details->total_return_paid;
|
|
} elseif ($due_payment_type == 'sell') {
|
|
$contact_details->total_invoice = empty($contact_details->total_invoice) ? 0 : $contact_details->total_invoice;
|
|
|
|
$payment_line->amount = $contact_details->total_invoice -
|
|
$contact_details->total_paid;
|
|
} elseif ($due_payment_type == 'sell_return') {
|
|
$payment_line->amount = $contact_details->total_sell_return -
|
|
$contact_details->total_return_paid;
|
|
}
|
|
|
|
//If opening balance due exists add to payment amount
|
|
$contact_details->opening_balance = ! empty($contact_details->opening_balance) ? $contact_details->opening_balance : 0;
|
|
$contact_details->opening_balance_paid = ! empty($contact_details->opening_balance_paid) ? $contact_details->opening_balance_paid : 0;
|
|
$ob_due = $contact_details->opening_balance - $contact_details->opening_balance_paid;
|
|
if ($ob_due > 0) {
|
|
$payment_line->amount += $ob_due;
|
|
}
|
|
|
|
$amount_formated = $this->transactionUtil->num_f($payment_line->amount);
|
|
|
|
$contact_details->total_paid = empty($contact_details->total_paid) ? 0 : $contact_details->total_paid;
|
|
|
|
$payment_line->method = 'cash';
|
|
$payment_line->paid_on = \Carbon::now()->toDateTimeString();
|
|
|
|
$payment_types = $this->transactionUtil->payment_types(null, false, $business_id);
|
|
|
|
//Accounts
|
|
$accounts = $this->moduleUtil->accountsDropdown($business_id, true);
|
|
|
|
return view('transaction_payment.pay_supplier_due_modal')
|
|
->with(compact('contact_details', 'payment_types', 'payment_line', 'due_payment_type', 'ob_due', 'amount_formated', 'accounts'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds Payments for Contact due
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function postPayContactDue(Request $request)
|
|
{
|
|
if (! (auth()->user()->can('sell.payments') || auth()->user()->can('purchase.payments'))) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
try {
|
|
DB::beginTransaction();
|
|
|
|
$business_id = request()->session()->get('business.id');
|
|
$tp = $this->transactionUtil->payContact($request);
|
|
|
|
$pos_settings = ! empty(session()->get('business.pos_settings')) ? json_decode(session()->get('business.pos_settings'), true) : [];
|
|
$enable_cash_denomination_for_payment_methods = ! empty($pos_settings['enable_cash_denomination_for_payment_methods']) ? $pos_settings['enable_cash_denomination_for_payment_methods'] : [];
|
|
//add cash denomination
|
|
if (in_array($tp->method, $enable_cash_denomination_for_payment_methods) && ! empty($request->input('denominations')) && ! empty($pos_settings['enable_cash_denomination_on']) && $pos_settings['enable_cash_denomination_on'] == 'all_screens') {
|
|
$denominations = [];
|
|
|
|
foreach ($request->input('denominations') as $key => $value) {
|
|
if (! empty($value)) {
|
|
$denominations[] = [
|
|
'business_id' => $business_id,
|
|
'amount' => $key,
|
|
'total_count' => $value,
|
|
];
|
|
}
|
|
}
|
|
|
|
if (! empty($denominations)) {
|
|
$tp->denominations()->createMany($denominations);
|
|
}
|
|
}
|
|
|
|
DB::commit();
|
|
$output = ['success' => true,
|
|
'msg' => __('purchase.payment_added_success'),
|
|
];
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
|
|
|
|
$output = ['success' => false,
|
|
'msg' => 'File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage(),
|
|
];
|
|
}
|
|
|
|
return redirect()->back()->with(['status' => $output]);
|
|
}
|
|
|
|
/**
|
|
* view details of single..,
|
|
* payment.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function viewPayment($payment_id)
|
|
{
|
|
if (! (auth()->user()->can('sell.payments') ||
|
|
auth()->user()->can('purchase.payments') ||
|
|
auth()->user()->can('edit_sell_payment') ||
|
|
auth()->user()->can('delete_sell_payment') ||
|
|
auth()->user()->can('edit_purchase_payment') ||
|
|
auth()->user()->can('delete_purchase_payment') ||
|
|
auth()->user()->can('hms.add_booking_payment')
|
|
)) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
$business_id = request()->session()->get('business.id');
|
|
$single_payment_line = TransactionPayment::findOrFail($payment_id);
|
|
|
|
$transaction = null;
|
|
if (! empty($single_payment_line->transaction_id)) {
|
|
$transaction = Transaction::where('id', $single_payment_line->transaction_id)
|
|
->with(['contact', 'location', 'transaction_for'])
|
|
->first();
|
|
} else {
|
|
$child_payment = TransactionPayment::where('business_id', $business_id)
|
|
->where('parent_id', $payment_id)
|
|
->with(['transaction', 'transaction.contact', 'transaction.location', 'transaction.transaction_for'])
|
|
->first();
|
|
$transaction = ! empty($child_payment) ? $child_payment->transaction : null;
|
|
}
|
|
|
|
$payment_types = $this->transactionUtil->payment_types(null, false, $business_id);
|
|
|
|
return view('transaction_payment.single_payment_view')
|
|
->with(compact('single_payment_line', 'transaction', 'payment_types'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retrieves all the child payments of a parent payments
|
|
* payment.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function showChildPayments($payment_id)
|
|
{
|
|
if (! (auth()->user()->can('sell.payments') ||
|
|
auth()->user()->can('purchase.payments') ||
|
|
auth()->user()->can('edit_sell_payment') ||
|
|
auth()->user()->can('delete_sell_payment') ||
|
|
auth()->user()->can('edit_purchase_payment') ||
|
|
auth()->user()->can('delete_purchase_payment')
|
|
)) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
$business_id = request()->session()->get('business.id');
|
|
|
|
$child_payments = TransactionPayment::where('business_id', $business_id)
|
|
->where('parent_id', $payment_id)
|
|
->with(['transaction', 'transaction.contact'])
|
|
->get();
|
|
|
|
$payment_types = $this->transactionUtil->payment_types(null, false, $business_id);
|
|
|
|
return view('transaction_payment.show_child_payments')
|
|
->with(compact('child_payments', 'payment_types'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retrieves list of all opening balance payments.
|
|
*
|
|
* @param int $contact_id
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function getOpeningBalancePayments($contact_id)
|
|
{
|
|
if (! (auth()->user()->can('sell.payments') ||
|
|
auth()->user()->can('purchase.payments') ||
|
|
auth()->user()->can('edit_sell_payment') ||
|
|
auth()->user()->can('delete_sell_payment') ||
|
|
auth()->user()->can('edit_purchase_payment') ||
|
|
auth()->user()->can('delete_purchase_payment')
|
|
)) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
$business_id = request()->session()->get('business.id');
|
|
if (request()->ajax()) {
|
|
$query = TransactionPayment::leftjoin('transactions as t', 'transaction_payments.transaction_id', '=', 't.id')
|
|
->where('t.business_id', $business_id)
|
|
->where('t.type', 'opening_balance')
|
|
->where('t.contact_id', $contact_id)
|
|
->where('transaction_payments.business_id', $business_id)
|
|
->select(
|
|
'transaction_payments.amount',
|
|
'method',
|
|
'paid_on',
|
|
'transaction_payments.payment_ref_no',
|
|
'transaction_payments.document',
|
|
'transaction_payments.id',
|
|
'cheque_number',
|
|
'card_transaction_number',
|
|
'bank_account_number'
|
|
)
|
|
->groupBy('transaction_payments.id');
|
|
|
|
$permitted_locations = auth()->user()->permitted_locations();
|
|
if ($permitted_locations != 'all') {
|
|
$query->whereIn('t.location_id', $permitted_locations);
|
|
}
|
|
|
|
return Datatables::of($query)
|
|
->editColumn('paid_on', '@format_datetime($paid_on)')
|
|
->editColumn('method', function ($row) {
|
|
$method = __('lang_v1.'.$row->method);
|
|
if ($row->method == 'cheque') {
|
|
$method .= '<br>('.__('lang_v1.cheque_no').': '.$row->cheque_number.')';
|
|
} elseif ($row->method == 'card') {
|
|
$method .= '<br>('.__('lang_v1.card_transaction_no').': '.$row->card_transaction_number.')';
|
|
} elseif ($row->method == 'bank_transfer') {
|
|
$method .= '<br>('.__('lang_v1.bank_account_no').': '.$row->bank_account_number.')';
|
|
} elseif ($row->method == 'custom_pay_1') {
|
|
$method = __('lang_v1.custom_payment_1').'<br>('.__('lang_v1.transaction_no').': '.$row->transaction_no.')';
|
|
} elseif ($row->method == 'custom_pay_2') {
|
|
$method = __('lang_v1.custom_payment_2').'<br>('.__('lang_v1.transaction_no').': '.$row->transaction_no.')';
|
|
} elseif ($row->method == 'custom_pay_3') {
|
|
$method = __('lang_v1.custom_payment_3').'<br>('.__('lang_v1.transaction_no').': '.$row->transaction_no.')';
|
|
}
|
|
|
|
return $method;
|
|
})
|
|
->editColumn('amount', function ($row) {
|
|
return '<span class="display_currency paid-amount" data-orig-value="'.$row->amount.'" data-currency_symbol = true>'.$row->amount.'</span>';
|
|
})
|
|
->addColumn('action', '<button type="button" class="tw-dw-btn tw-dw-btn-xs tw-dw-btn-outline tw-dw-btn-primary view_payment" data-href="{{ action([\App\Http\Controllers\TransactionPaymentController::class, \'viewPayment\'], [$id]) }}"><i class="fas fa-eye"></i> @lang("messages.view")
|
|
</button> <button type="button" class="tw-dw-btn tw-dw-btn-xs tw-dw-btn-outline tw-dw-btn-info edit_payment"
|
|
data-href="{{action([\App\Http\Controllers\TransactionPaymentController::class, \'edit\'], [$id]) }}"><i class="glyphicon glyphicon-edit"></i> @lang("messages.edit")</button>
|
|
<button type="button" class="tw-dw-btn tw-dw-btn-xs tw-dw-btn-outline tw-dw-btn-error delete_payment"
|
|
data-href="{{ action([\App\Http\Controllers\TransactionPaymentController::class, \'destroy\'], [$id]) }}"
|
|
><i class="fa fa-trash" aria-hidden="true"></i> @lang("messages.delete")</button> @if(!empty($document))<a href="{{asset("/uploads/documents/" . $document)}}" class="tw-dw-btn tw-dw-btn-xs tw-dw-btn-outline tw-dw-btn-accent" download=""><i class="fa fa-download"></i> @lang("purchase.download_document")</a>@endif')
|
|
->rawColumns(['amount', 'method', 'action'])
|
|
->make(true);
|
|
}
|
|
}
|
|
}
|