dbfdg
can('manage invoice')) {
$customer = Customer::where('created_by', '=', \Auth::user()->creatorId())->get()->pluck('name', 'id');
$customer->prepend('Select Customer', '');
$status = Invoice::$statues;
$query = Invoice::where('created_by', '=', \Auth::user()->creatorId());
if (!empty($request->customer)) {
$query->where('customer_id', '=', $request->customer);
}
if (count(explode('to', $request->issue_date)) > 1) {
$date_range = explode(' to ', $request->issue_date);
$query->whereBetween('issue_date', $date_range);
} elseif (!empty($request->issue_date)) {
$date_range = [$request->issue_date, $request->issue_date];
$query->whereBetween('issue_date', $date_range);
}
if ($request->status != null) {
$query->where('status', '=', $request->status);
}
$invoices = $query->get();
return view('invoice.index', compact('invoices', 'customer', 'status'));
} else {
return redirect()->back()->with('error', __('Permission Denied.'));
}
}
public function create($customerId)
{
if (\Auth::user()->can('create invoice')) {
$customFields = CustomField::where('created_by', '=', \Auth::user()->creatorId())->where('module', '=', 'invoice')->get();
$invoice_number = \Auth::user()->invoiceNumberFormat($this->invoiceNumber());
$customers = Customer::where('created_by', \Auth::user()->creatorId())->get()->pluck('name', 'id');
$customers->prepend('Select Customer', '');
$category = ProductServiceCategory::where('created_by', \Auth::user()->creatorId())->where('type', 'income')->get()->pluck('name', 'id');
$category->prepend('Select Category', '');
$product_services = ProductService::where('created_by', \Auth::user()->creatorId())->get()->pluck('name', 'id');
$product_services->prepend('--', '');
return view('invoice.create', compact('customers', 'invoice_number', 'product_services', 'category', 'customFields', 'customerId'));
} else {
return response()->json(['error' => __('Permission denied.')], 401);
}
}
public function customer(Request $request)
{
$customer = Customer::where('id', '=', $request->id)->first();
return view('invoice.customer_detail', compact('customer'));
}
public function product(Request $request)
{
$data['product'] = $product = ProductService::find($request->product_id);
$data['unit'] = (!empty($product->unit)) ? $product->unit->name : '';
$data['taxRate'] = $taxRate = !empty($product->tax_id) ? $product->taxRate($product->tax_id) : 0;
$data['taxes'] = !empty($product->tax_id) ? $product->tax($product->tax_id) : 0;
$salePrice = $product->sale_price;
$quantity = 1;
$taxPrice = ($taxRate / 100) * ($salePrice * $quantity);
$data['totalAmount'] = ($salePrice * $quantity);
return json_encode($data);
}
public function store(Request $request)
{
if (\Auth::user()->can('create invoice')) {
$validator = \Validator::make(
$request->all(), [
'customer_id' => 'required',
'issue_date' => 'required',
'due_date' => 'required',
'category_id' => 'required',
'items' => 'required',
]
);
if ($validator->fails()) {
$messages = $validator->getMessageBag();
return redirect()->back()->with('error', $messages->first());
}
$status = Invoice::$statues;
$invoice = new Invoice();
$invoice->invoice_id = $this->invoiceNumber();
$invoice->customer_id = $request->customer_id;
$invoice->status = 0;
$invoice->issue_date = $request->issue_date;
$invoice->due_date = $request->due_date;
$invoice->category_id = $request->category_id;
$invoice->ref_number = $request->ref_number;
// $invoice->discount_apply = isset($request->discount_apply) ? 1 : 0;
$invoice->created_by = \Auth::user()->creatorId();
$invoice->save();
CustomField::saveData($invoice, $request->customField);
$products = $request->items;
for ($i = 0; $i < count($products); $i++) {
$invoiceProduct = new InvoiceProduct();
$invoiceProduct->invoice_id = $invoice->id;
$invoiceProduct->product_id = $products[$i]['item'];
$invoiceProduct->quantity = $products[$i]['quantity'];
$invoiceProduct->tax = $products[$i]['tax'];
// $invoiceProduct->discount = isset($products[$i]['discount']) ? $products[$i]['discount'] : 0;
$invoiceProduct->discount = $products[$i]['discount'];
$invoiceProduct->price = $products[$i]['price'];
$invoiceProduct->description = $products[$i]['description'];
$invoiceProduct->save();
//inventory management (Quantity)
Utility::total_quantity('minus', $invoiceProduct->quantity, $invoiceProduct->product_id);
//For Notification
$setting = Utility::settings(\Auth::user()->creatorId());
$customer = Customer::find($request->customer_id);
$invoiceNotificationArr = [
'invoice_number' => \Auth::user()->invoiceNumberFormat($invoice->invoice_id),
'user_name' => \Auth::user()->name,
'invoice_issue_date' => $invoice->issue_date,
'invoice_due_date' => $invoice->due_date,
'customer_name' => $customer->name,
];
//Slack Notification
if (isset($setting['invoice_notification']) && $setting['invoice_notification'] == 1) {
Utility::send_slack_msg('new_invoice', $invoiceNotificationArr);
}
//Telegram Notification
if (isset($setting['telegram_invoice_notification']) && $setting['telegram_invoice_notification'] == 1) {
Utility::send_telegram_msg('new_invoice', $invoiceNotificationArr);
}
//Twilio Notification
if (isset($setting['twilio_invoice_notification']) && $setting['twilio_invoice_notification'] == 1) {
Utility::send_twilio_msg($customer->contact, 'new_invoice', $invoiceNotificationArr);
}
}
//Product Stock Report
$type = 'invoice';
$type_id = $invoice->id;
StockReport::where('type', '=', 'invoice')->where('type_id', '=', $invoice->id)->delete();
$description = $invoiceProduct->quantity . ' ' . __(' quantity sold in invoice') . ' ' . \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
Utility::addProductStock($invoiceProduct->product_id, $invoiceProduct->quantity, $type, $description, $type_id);
//webhook
$module = 'New Invoice';
$webhook = Utility::webhookSetting($module);
if ($webhook) {
$parameter = json_encode($invoice);
$status = Utility::WebhookCall($webhook['url'], $parameter, $webhook['method']);
if ($status == true) {
return redirect()->route('invoice.index', $invoice->id)->with('success', __('Invoice successfully created.'));
} else {
return redirect()->back()->with('error', __('Webhook call failed.'));
}
}
return redirect()->route('invoice.index', $invoice->id)->with('success', __('Invoice successfully created.'));
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function edit($ids)
{
if (\Auth::user()->can('edit invoice')) {
$id = Crypt::decrypt($ids);
$invoice = Invoice::find($id);
$invoice_number = \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
$customers = Customer::where('created_by', \Auth::user()->creatorId())->get()->pluck('name', 'id');
$category = ProductServiceCategory::where('created_by', \Auth::user()->creatorId())->where('type', 'income')->get()->pluck('name', 'id');
$category->prepend('Select Category', '');
$product_services = ProductService::where('created_by', \Auth::user()->creatorId())->get()->pluck('name', 'id');
$invoice->customField = CustomField::getData($invoice, 'invoice');
$customFields = CustomField::where('created_by', '=', \Auth::user()->creatorId())->where('module', '=', 'invoice')->get();
return view('invoice.edit', compact('customers', 'product_services', 'invoice', 'invoice_number', 'category', 'customFields'));
} else {
return response()->json(['error' => __('Permission denied.')], 401);
}
}
public function update(Request $request, Invoice $invoice)
{
if (\Auth::user()->can('edit invoice')) {
if ($invoice->created_by == \Auth::user()->creatorId()) {
$validator = \Validator::make(
$request->all(),
[
'customer_id' => 'required',
'issue_date' => 'required',
'due_date' => 'required',
'category_id' => 'required',
'items' => 'required',
]
);
if ($validator->fails()) {
$messages = $validator->getMessageBag();
return redirect()->route('invoice.index')->with('error', $messages->first());
}
$invoice->customer_id = $request->customer_id;
$invoice->issue_date = $request->issue_date;
$invoice->due_date = $request->due_date;
$invoice->ref_number = $request->ref_number;
// $invoice->discount_apply = isset($request->discount_apply) ? 1 : 0;
$invoice->category_id = $request->category_id;
$invoice->save();
Utility::starting_number($invoice->invoice_id + 1, 'invoice');
CustomField::saveData($invoice, $request->customField);
$products = $request->items;
for ($i = 0; $i < count($products); $i++) {
$invoiceProduct = InvoiceProduct::find($products[$i]['id']);
if ($invoiceProduct == null) {
$invoiceProduct = new InvoiceProduct();
$invoiceProduct->invoice_id = $invoice->id;
Utility::total_quantity('minus', $products[$i]['quantity'], $products[$i]['item']);
$updatePrice = ($products[$i]['price'] * $products[$i]['quantity']) + ($products[$i]['itemTaxPrice']) - ($products[$i]['discount']);
Utility::updateUserBalance('customer', $request->customer_id, $updatePrice, 'credit');
} else {
Utility::total_quantity('plus', $invoiceProduct->quantity, $invoiceProduct->product_id);
}
if (isset($products[$i]['item'])) {
$invoiceProduct->product_id = $products[$i]['item'];
}
$invoiceProduct->quantity = $products[$i]['quantity'];
$invoiceProduct->tax = $products[$i]['tax'];
$invoiceProduct->discount = $products[$i]['discount'];
$invoiceProduct->price = $products[$i]['price'];
$invoiceProduct->description = $products[$i]['description'];
$invoiceProduct->save();
if ($products[$i]['id'] > 0) {
Utility::total_quantity('minus', $products[$i]['quantity'], $invoiceProduct->product_id);
}
//Product Stock Report
$type = 'invoice';
$type_id = $invoice->id;
StockReport::where('type', '=', 'invoice')->where('type_id', '=', $invoice->id)->delete();
$description = $products[$i]['quantity'] . ' ' . __(' quantity sold in invoice') . ' ' . \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
if (empty($products[$i]['id'])) {
Utility::addProductStock($products[$i]['item'], $products[$i]['quantity'], $type, $description, $type_id);
}
}
TransactionLines::where('reference_id',$invoice->id)->where('reference','Invoice')->delete();
$invoice_products = InvoiceProduct::where('invoice_id', $invoice->id)->get();
foreach ($invoice_products as $invoice_product) {
$product = ProductService::find($invoice_product->product_id);
$totalTaxPrice = 0;
if($invoice_product->tax != null){
$taxes = \App\Models\Utility::tax($invoice_product->tax);
foreach ($taxes as $tax) {
$taxPrice = \App\Models\Utility::taxRate($tax->rate, $invoice_product->price, $invoice_product->quantity, $invoice_product->discount);
$totalTaxPrice += $taxPrice;
}
}
$itemAmount = ($invoice_product->price * $invoice_product->quantity) - ($invoice_product->discount) + $totalTaxPrice;
$data = [
'account_id' => $product->sale_chartaccount_id,
'transaction_type' => 'Credit',
'transaction_amount' => $itemAmount,
'reference' => 'Invoice',
'reference_id' => $invoice->id,
'reference_sub_id' => $product->id,
'date' => $invoice->issue_date,
];
Utility::addTransactionLines($data , 'edit');
}
return redirect()->route('invoice.index')->with('success', __('Invoice successfully updated.'));
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function invoiceNumber()
{
$latest = Invoice::where('created_by', '=', \Auth::user()->creatorId())->latest()->first();
if (!$latest) {
return 1;
}
return $latest->invoice_id + 1;
}
public function show($ids)
{
if (\Auth::user()->can('show invoice')) {
try {
$id = Crypt::decrypt($ids);
} catch (\Throwable $th) {
return redirect()->back()->with('error', __('Invoice Not Found.'));
}
$id = Crypt::decrypt($ids);
$invoice = Invoice::with(['creditNote','payments.bankAccount','items.product.unit'])->find($id);
if (!empty($invoice->created_by) == \Auth::user()->creatorId()) {
$invoicePayment = InvoicePayment::where('invoice_id', $invoice->id)->first();
$customer = $invoice->customer;
$iteams = $invoice->items;
$user = \Auth::user();
// start for storage limit note
$invoice_user = User::find($invoice->created_by);
$user_plan = Plan::getPlan($invoice_user->plan);
// end for storage limit note
$invoice->customField = CustomField::getData($invoice, 'invoice');
$customFields = CustomField::where('created_by', '=', \Auth::user()->creatorId())->where('module', '=', 'invoice')->get();
$creditnote = CreditNote::where('invoice',$invoice->id)->first();
return view('invoice.view', compact('invoice', 'customer', 'iteams', 'invoicePayment', 'customFields', 'user', 'invoice_user', 'user_plan' , 'creditnote'));
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function destroy(Invoice $invoice, Request $request)
{
if (\Auth::user()->can('delete invoice')) {
if ($invoice->created_by == \Auth::user()->creatorId()) {
foreach ($invoice->payments as $invoices) {
Utility::bankAccountBalance($invoices->account_id, $invoices->amount, 'debit');
$invoicepayment = InvoicePayment::find($invoices->id);
$invoices->delete();
$invoicepayment->delete();
}
if ($invoice->customer_id != 0 && $invoice->status != 0) {
Utility::updateUserBalance('customer', $invoice->customer_id, $invoice->getDue(), 'debit');
}
TransactionLines::where('reference_id',$invoice->id)->where('reference','Invoice')->delete();
TransactionLines::where('reference_id',$invoice->id)->Where('reference','Invoice Payment')->delete();
CreditNote::where('invoice', '=', $invoice->id)->delete();
InvoiceProduct::where('invoice_id', '=', $invoice->id)->delete();
$invoice->delete();
return redirect()->route('invoice.index')->with('success', __('Invoice successfully deleted.'));
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function productDestroy(Request $request)
{
if (\Auth::user()->can('delete invoice product')) {
$invoiceProduct = InvoiceProduct::find($request->id);
if($invoiceProduct)
{
$invoice = Invoice::find($invoiceProduct->invoice_id);
$productService = ProductService::find($invoiceProduct->product_id);
Utility::updateUserBalance('customer', $invoice->customer_id, $request->amount, 'debit');
TransactionLines::where('reference_sub_id',$productService->id)->where('reference','Invoice')->delete();
InvoiceProduct::where('id', '=', $request->id)->delete();
}
return redirect()->back()->with('success', __('Invoice product successfully deleted.'));
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function customerInvoice(Request $request)
{
if (\Auth::user()->can('manage customer invoice')) {
$status = Invoice::$statues;
$query = Invoice::where('customer_id', '=', \Auth::user()->id)->where('status', '!=', '0')->where('created_by', \Auth::user()->creatorId());
if (!empty($request->issue_date)) {
$date_range = explode(' - ', $request->issue_date);
$query->whereBetween('issue_date', $date_range);
}
if (!empty($request->status)) {
$query->where('status', '=', $request->status);
}
$invoices = $query->get();
return view('invoice.index', compact('invoices', 'status'));
} else {
return redirect()->back()->with('error', __('Permission Denied.'));
}
}
public function customerInvoiceShow($id)
{
$invoice = Invoice::with('payments.bankAccount')->find($id);
$user = User::where('id', $invoice->created_by)->first();
if ($invoice->created_by == $user->creatorId()) {
$customer = $invoice->customer;
$iteams = $invoice->items;
if ($user->type == 'super admin') {
return view('invoice.view', compact('invoice', 'customer', 'iteams', 'user'));
} elseif ($user->type == 'company') {
return view('invoice.customer_invoice', compact('invoice', 'customer', 'iteams', 'user'));
}
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function sent($id)
{
if (\Auth::user()->can('send invoice')) {
// Send Email
$setings = Utility::settings();
if ($setings['customer_invoice_sent'] == 1) {
$invoice = Invoice::where('id', $id)->first();
$invoice->send_date = date('Y-m-d');
$invoice->status = 1;
$invoice->save();
$customer = Customer::where('id', $invoice->customer_id)->first();
$invoice->name = !empty($customer) ? $customer->name : '';
$invoice->invoice = \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
$invoiceId = Crypt::encrypt($invoice->id);
$invoice->url = route('invoice.pdf', $invoiceId);
Utility::updateUserBalance('customer', $customer->id, $invoice->getTotal(), 'credit');
$invoice_products = InvoiceProduct::where('invoice_id', $invoice->id)->get();
foreach ($invoice_products as $invoice_product) {
$product = ProductService::find($invoice_product->product_id);
$totalTaxPrice = 0;
if($invoice_product->tax != null)
{
$taxes = \App\Models\Utility::tax($invoice_product->tax);
foreach ($taxes as $tax) {
$taxPrice = \App\Models\Utility::taxRate($tax->rate, $invoice_product->price, $invoice_product->quantity, $invoice_product->discount);
$totalTaxPrice += $taxPrice;
}
}
$itemAmount = ($invoice_product->price * $invoice_product->quantity) - ($invoice_product->discount) + $totalTaxPrice;
$data = [
'account_id' => $product->sale_chartaccount_id,
'transaction_type' => 'Credit',
'transaction_amount' => $itemAmount,
'reference' => 'Invoice',
'reference_id' => $invoice->id,
'reference_sub_id' => $product->id,
'date' => $invoice->issue_date,
];
Utility::addTransactionLines($data , 'create');
}
$customerArr = [
'customer_name' => $customer->name,
'customer_email' => $customer->email,
'invoice_name' => $customer->name,
'invoice_number' => $invoice->invoice,
'invoice_url' => $invoice->url,
];
$resp = Utility::sendEmailTemplate('customer_invoice_sent', [$customer->id => $customer->email], $customerArr);
return redirect()->back()->with('success', __('Invoice successfully sent.') . (($resp['is_success'] == false && !empty($resp['error'])) ? '
' . $resp['error'] . '' : ''));
}
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function resent($id)
{
if (\Auth::user()->can('send invoice')) {
$invoice = Invoice::where('id', $id)->first();
$customer = Customer::where('id', $invoice->customer_id)->first();
$invoice->name = !empty($customer) ? $customer->name : '';
$invoice->invoice = \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
$invoiceId = Crypt::encrypt($invoice->id);
$invoice->url = route('invoice.pdf', $invoiceId);
$customerArr = [
'customer_name' => $customer->name,
'customer_email' => $customer->email,
'invoice_name' => $customer->name,
'invoice_number' => $invoice->invoice,
'invoice_url' => $invoice->url,
];
$resp = Utility::sendEmailTemplate('customer_invoice_sent', [$customer->id => $customer->email], $customerArr);
return redirect()->back()->with('success', __('Invoice successfully sent.') . (($resp['is_success'] == false && !empty($resp['error'])) ? '
' . $resp['error'] . '' : ''));
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function payment($invoice_id)
{
if (\Auth::user()->can('create payment invoice')) {
$invoice = Invoice::where('id', $invoice_id)->first();
$customers = Customer::where('created_by', '=', \Auth::user()->creatorId())->get()->pluck('name', 'id');
$categories = ProductServiceCategory::where('created_by', '=', \Auth::user()->creatorId())->get()->pluck('name', 'id');
$accounts = BankAccount::select('*', \DB::raw("CONCAT(bank_name,' ',holder_name) AS name"))->where('created_by', \Auth::user()->creatorId())->get()->pluck('name', 'id');
return view('invoice.payment', compact('customers', 'categories', 'accounts', 'invoice'));
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function createPayment(Request $request, $invoice_id)
{
$invoice = Invoice::find($invoice_id);
if ($invoice->getDue() < $request->amount) {
return redirect()->back()->with('error', __('Invoice payment amount should not greater than subtotal.'));
}
if (\Auth::user()->can('create payment invoice')) {
$validator = \Validator::make(
$request->all(), [
'date' => 'required',
'amount' => 'required',
'account_id' => 'required',
]
);
if ($validator->fails()) {
$messages = $validator->getMessageBag();
return redirect()->back()->with('error', $messages->first());
}
$invoicePayment = new InvoicePayment();
$invoicePayment->invoice_id = $invoice_id;
$invoicePayment->date = $request->date;
$invoicePayment->amount = $request->amount;
$invoicePayment->account_id = $request->account_id;
$invoicePayment->payment_method = 0;
$invoicePayment->reference = $request->reference;
$invoicePayment->description = $request->description;
if (!empty($request->add_receipt)) {
//storage limit
$image_size = $request->file('add_receipt')->getSize();
$result = Utility::updateStorageLimit(\Auth::user()->creatorId(), $image_size);
if ($result == 1) {
$fileName = time() . "_" . $request->add_receipt->getClientOriginalName();
$request->add_receipt->storeAs('uploads/payment', $fileName);
$invoicePayment->add_receipt = $fileName;
}
}
$invoicePayment->save();
$invoice = Invoice::where('id', $invoice_id)->first();
$due = $invoice->getDue();
$total = $invoice->getTotal();
if ($invoice->status == 0) {
$invoice->send_date = date('Y-m-d');
$invoice->save();
}
if ($due <= 0) {
$invoice->status = 4;
$invoice->save();
} else {
$invoice->status = 3;
$invoice->save();
}
$invoicePayment->user_id = $invoice->customer_id;
$invoicePayment->user_type = 'Customer';
$invoicePayment->type = 'Partial';
$invoicePayment->created_by = \Auth::user()->id;
$invoicePayment->payment_id = $invoicePayment->id;
$invoicePayment->category = 'Invoice';
$invoicePayment->account = $request->account_id;
Transaction::addTransaction($invoicePayment);
$customer = Customer::where('id', $invoice->customer_id)->first();
$payment = new InvoicePayment();
$payment->name = $customer['name'];
$payment->date = \Auth::user()->dateFormat($request->date);
$payment->amount = \Auth::user()->priceFormat($request->amount);
$payment->invoice = 'invoice ' . \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
$payment->dueAmount = \Auth::user()->priceFormat($invoice->getDue());
Utility::updateUserBalance('customer', $invoice->customer_id, $request->amount, 'debit');
Utility::bankAccountBalance($request->account_id, $request->amount, 'credit');
$invoicePayments = InvoicePayment::where('invoice_id', $invoice->id)->get();
foreach ($invoicePayments as $invoicePayment) {
$accountId = BankAccount::find($invoicePayment->account_id);
$data = [
'account_id' => $accountId->chart_account_id,
'transaction_type' => 'Debit',
'transaction_amount' => $invoicePayment->amount,
'reference' => 'Invoice Payment',
'reference_id' => $invoice->id,
'reference_sub_id' => $invoicePayment->id,
'date' => $invoicePayment->date,
];
Utility::addTransactionLines($data , 'create');
}
// Send Email
$setings = Utility::settings();
if ($setings['new_invoice_payment'] == 1) {
$customer = Customer::where('id', $invoice->customer_id)->first();
$invoicePaymentArr = [
'invoice_payment_name' => $customer->name,
'invoice_payment_amount' => $payment->amount,
'invoice_payment_date' => $payment->date,
'payment_dueAmount' => $payment->dueAmount,
];
$resp = Utility::sendEmailTemplate('new_invoice_payment', [$customer->id => $customer->email], $invoicePaymentArr);
}
//webhook
$module = 'New Invoice Payment';
$webhook = Utility::webhookSetting($module);
if ($webhook) {
$parameter = json_encode($invoice);
$status = Utility::WebhookCall($webhook['url'], $parameter, $webhook['method']);
if ($status == true) {
return redirect()->back()->with('success', __('Payment successfully added.') . ((isset($result) && $result != 1) ? '
' . $result . '' : '') . (($resp['is_success'] == false && !empty($resp['error'])) ? '
' . $resp['error'] . '' : ''));
} else {
return redirect()->back()->with('error', __('Webhook call failed.'));
}
}
return redirect()->back()->with('success', __('Payment successfully added.') . ((isset($result) && $result != 1) ? '
' . $result . '' : '') . (($resp['is_success'] == false && !empty($resp['error'])) ? '
' . $resp['error'] . '' : ''));
}
}
public function paymentDestroy(Request $request, $invoice_id, $payment_id)
{
// dd($invoice_id,$payment_id);
if (\Auth::user()->can('delete payment invoice')) {
$payment = InvoicePayment::find($payment_id);
InvoicePayment::where('id', '=', $payment_id)->delete();
InvoiceBankTransfer::where('id', '=', $payment_id)->delete();
TransactionLines::where('reference_sub_id',$payment_id)->where('reference','Invoice Payment')->delete();
$invoice = Invoice::where('id', $invoice_id)->first();
$due = $invoice->getDue();
$total = $invoice->getTotal();
if ($due > 0 && $total != $due) {
$invoice->status = 3;
} else {
$invoice->status = 2;
}
if (!empty($payment->add_receipt)) {
//storage limit
$file_path = '/uploads/payment/' . $payment->add_receipt;
$result = Utility::changeStorageLimit(\Auth::user()->creatorId(), $file_path);
}
$invoice->save();
$type = 'Partial';
$user = 'Customer';
Transaction::destroyTransaction($payment_id, $type, $user);
Utility::updateUserBalance('customer', $invoice->customer_id, $payment->amount, 'credit');
Utility::bankAccountBalance($payment->account_id, $payment->amount, 'debit');
return redirect()->back()->with('success', __('Payment successfully deleted.'));
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function paymentReminder($invoice_id)
{
// dd($invoice_id);
$invoice = Invoice::find($invoice_id);
$customer = Customer::where('id', $invoice->customer_id)->first();
$invoice->dueAmount = \Auth::user()->priceFormat($invoice->getDue());
$invoice->name = $customer['name'];
$invoice->date = \Auth::user()->dateFormat($invoice->send_date);
$invoice->invoice = \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
//For Notification
$setting = Utility::settings(\Auth::user()->creatorId());
$customer = Customer::find($invoice->customer_id);
$reminderNotificationArr = [
'invoice_number' => \Auth::user()->invoiceNumberFormat($invoice->invoice_id),
'customer_name' => $customer->name,
'user_name' => \Auth::user()->name,
];
//Twilio Notification
if (isset($setting['twilio_reminder_notification']) && $setting['twilio_reminder_notification'] == 1) {
Utility::send_twilio_msg($customer->contact, 'invoice_payment_reminder', $reminderNotificationArr);
}
// Send Email
$setings = Utility::settings();
if ($setings['new_payment_reminder'] == 1) {
$invoice = Invoice::find($invoice_id);
$customer = Customer::where('id', $invoice->customer_id)->first();
$invoice->dueAmount = \Auth::user()->priceFormat($invoice->getDue());
$invoice->name = $customer['name'];
$invoice->date = \Auth::user()->dateFormat($invoice->send_date);
$invoice->invoice = \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
$reminderArr = [
'payment_reminder_name' => $invoice->name,
'invoice_payment_number' => $invoice->invoice,
'invoice_payment_dueAmount' => $invoice->dueAmount,
'payment_reminder_date' => $invoice->date,
];
$resp = Utility::sendEmailTemplate('new_payment_reminder', [$customer->id => $customer->email], $reminderArr);
}
return redirect()->back()->with('success', __('Payment reminder successfully send.') . (($resp['is_success'] == false && !empty($resp['error'])) ? '
' . $resp['error'] . '' : ''));
}
public function customerInvoiceSend($invoice_id)
{
return view('customer.invoice_send', compact('invoice_id'));
}
public function customerInvoiceSendMail(Request $request, $invoice_id)
{
$validator = \Validator::make(
$request->all(), [
'email' => 'required|email',
]
);
if ($validator->fails()) {
$messages = $validator->getMessageBag();
return redirect()->back()->with('error', $messages->first());
}
$email = $request->email;
$invoice = Invoice::where('id', $invoice_id)->first();
$customer = Customer::where('id', $invoice->customer_id)->first();
$invoice->name = !empty($customer) ? $customer->name : '';
$invoice->invoice = \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
$invoiceId = Crypt::encrypt($invoice->id);
$invoice->url = route('invoice.pdf', $invoiceId);
try
{
Mail::to($email)->send(new CustomerInvoiceSend($invoice));
} catch (\Exception $e) {
$smtp_error = __('E-Mail has been not sent due to SMTP configuration');
}
return redirect()->back()->with('success', __('Invoice successfully sent.') . ((isset($smtp_error)) ? '
' . $smtp_error . '' : ''));
}
public function shippingDisplay(Request $request, $id)
{
$invoice = Invoice::find($id);
if ($request->is_display == 'true') {
$invoice->shipping_display = 1;
} else {
$invoice->shipping_display = 0;
}
$invoice->save();
return redirect()->back()->with('success', __('Shipping address status successfully changed.'));
}
public function duplicate($invoice_id)
{
if (\Auth::user()->can('duplicate invoice')) {
$invoice = Invoice::where('id', $invoice_id)->first();
$duplicateInvoice = new Invoice();
$duplicateInvoice->invoice_id = $this->invoiceNumber();
$duplicateInvoice->customer_id = $invoice['customer_id'];
$duplicateInvoice->issue_date = date('Y-m-d');
$duplicateInvoice->due_date = $invoice['due_date'];
$duplicateInvoice->send_date = null;
$duplicateInvoice->category_id = $invoice['category_id'];
$duplicateInvoice->ref_number = $invoice['ref_number'];
$duplicateInvoice->status = 0;
$duplicateInvoice->shipping_display = $invoice['shipping_display'];
$duplicateInvoice->created_by = $invoice['created_by'];
$duplicateInvoice->save();
if ($duplicateInvoice) {
$invoiceProduct = InvoiceProduct::where('invoice_id', $invoice_id)->get();
foreach ($invoiceProduct as $product) {
$duplicateProduct = new InvoiceProduct();
$duplicateProduct->invoice_id = $duplicateInvoice->id;
$duplicateProduct->product_id = $product->product_id;
$duplicateProduct->quantity = $product->quantity;
$duplicateProduct->tax = $product->tax;
$duplicateProduct->discount = $product->discount;
$duplicateProduct->price = $product->price;
$duplicateProduct->save();
}
}
return redirect()->back()->with('success', __('Invoice duplicate successfully.'));
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function previewInvoice($template, $color)
{
$objUser = \Auth::user();
$settings = Utility::settings();
$invoice = new Invoice();
$customer = new \stdClass();
$customer->email = '';
$customer->shipping_name = '';
$customer->shipping_country = '';
$customer->shipping_state = '';
$customer->shipping_city = '';
$customer->shipping_phone = '';
$customer->shipping_zip = '';
$customer->shipping_address = '';
$customer->billing_name = '';
$customer->billing_country = '';
$customer->billing_state = '';
$customer->billing_city = '';
$customer->billing_phone = '';
$customer->billing_zip = '';
$customer->billing_address = '';
$totalTaxPrice = 0;
$taxesData = [];
$items = [];
for ($i = 1; $i <= 3; $i++) {
$item = new \stdClass();
$item->name = 'Item ' . $i;
$item->quantity = 1;
$item->tax = 5;
$item->discount = 50;
$item->price = 100;
$item->unit = 1;
$item->description = 'XYZ';
$taxes = [
'Tax 1',
'Tax 2',
];
$itemTaxes = [];
foreach ($taxes as $k => $tax) {
$taxPrice = 10;
$totalTaxPrice += $taxPrice;
$itemTax['name'] = 'Tax ' . $k;
$itemTax['rate'] = '10 %';
$itemTax['price'] = '$10';
$itemTax['tax_price'] = 10;
$itemTaxes[] = $itemTax;
if (array_key_exists('Tax ' . $k, $taxesData)) {
$taxesData['Tax ' . $k] = $taxesData['Tax 1'] + $taxPrice;
} else {
$taxesData['Tax ' . $k] = $taxPrice;
}
}
$item->itemTax = $itemTaxes;
$items[] = $item;
}
$invoice->invoice_id = 1;
$invoice->issue_date = date('Y-m-d H:i:s');
$invoice->due_date = date('Y-m-d H:i:s');
$invoice->itemData = $items;
$invoice->status = 0;
$invoice->totalTaxPrice = 60;
$invoice->totalQuantity = 3;
$invoice->totalRate = 300;
$invoice->totalDiscount = 10;
$invoice->taxesData = $taxesData;
$invoice->created_by = $objUser->creatorId();
$invoice->customField = [];
$customFields = [];
$preview = 1;
$color = '#' . $color;
$font_color = Utility::getFontColor($color);
$logo = asset(Storage::url('uploads/logo/'));
$company_logo = Utility::getValByName('company_logo_dark');
$invoice_logo = Utility::getValByName('invoice_logo');
if (isset($invoice_logo) && !empty($invoice_logo)) {
$img = Utility::get_file('invoice_logo/') . $invoice_logo;
} else {
$img = asset($logo . '/' . (isset($company_logo) && !empty($company_logo) ? $company_logo : 'logo-dark.png'));
}
return view('invoice.templates.' . $template, compact('invoice', 'preview', 'color', 'img', 'settings', 'customer', 'font_color', 'customFields'));
}
public function invoice($invoice_id)
{
$settings = Utility::settings();
$invoiceId = Crypt::decrypt($invoice_id);
$invoice = Invoice::where('id', $invoiceId)->first();
$data = DB::table('settings');
$data = $data->where('created_by', '=', $invoice->created_by);
$data1 = $data->get();
foreach ($data1 as $row) {
$settings[$row->name] = $row->value;
}
$customer = $invoice->customer;
$items = [];
$totalTaxPrice = 0;
$totalQuantity = 0;
$totalRate = 0;
$totalDiscount = 0;
$taxesData = [];
foreach ($invoice->items as $product) {
$item = new \stdClass();
$item->name = !empty($product->product) ? $product->product->name : '';
$item->quantity = $product->quantity;
$item->tax = $product->tax;
$item->unit = !empty($product->product) ? $product->product->unit_id : '';
$item->discount = $product->discount;
$item->price = $product->price;
$item->description = $product->description;
$totalQuantity += $item->quantity;
$totalRate += $item->price;
$totalDiscount += $item->discount;
$taxes = Utility::tax($product->tax);
$itemTaxes = [];
if (!empty($item->tax)) {
foreach ($taxes as $tax) {
$taxPrice = Utility::taxRate($tax->rate, $item->price, $item->quantity, $item->discount);
$totalTaxPrice += $taxPrice;
$itemTax['name'] = $tax->name;
$itemTax['rate'] = $tax->rate . '%';
$itemTax['price'] = Utility::priceFormat($settings, $taxPrice);
$itemTax['tax_price'] = $taxPrice;
$itemTaxes[] = $itemTax;
if (array_key_exists($tax->name, $taxesData)) {
$taxesData[$tax->name] = $taxesData[$tax->name] + $taxPrice;
} else {
$taxesData[$tax->name] = $taxPrice;
}
}
$item->itemTax = $itemTaxes;
} else {
$item->itemTax = [];
}
$items[] = $item;
}
$invoice->itemData = $items;
$invoice->totalTaxPrice = $totalTaxPrice;
$invoice->totalQuantity = $totalQuantity;
$invoice->totalRate = $totalRate;
$invoice->totalDiscount = $totalDiscount;
$invoice->taxesData = $taxesData;
$invoice->customField = CustomField::getData($invoice, 'invoice');
$customFields = [];
if (!empty(\Auth::user())) {
$customFields = CustomField::where('created_by', '=', \Auth::user()->creatorId())->where('module', '=', 'invoice')->get();
}
$logo = asset(Storage::url('uploads/logo/'));
$company_logo = Utility::getValByName('company_logo_dark');
$settings_data = \App\Models\Utility::settingsById($invoice->created_by);
$invoice_logo = $settings_data['invoice_logo'];
if (isset($invoice_logo) && !empty($invoice_logo)) {
$img = Utility::get_file('invoice_logo/') . $invoice_logo;
} else {
$img = asset($logo . '/' . (isset($company_logo) && !empty($company_logo) ? $company_logo : 'logo-dark.png'));
}
if ($invoice) {
$color = '#' . $settings['invoice_color'];
$font_color = Utility::getFontColor($color);
return view('invoice.templates.' . $settings['invoice_template'], compact('invoice', 'color', 'settings', 'customer', 'img', 'font_color', 'customFields'));
} else {
return redirect()->back()->with('error', __('Permission denied.'));
}
}
public function saveTemplateSettings(Request $request)
{
$post = $request->all();
unset($post['_token']);
if (isset($post['invoice_template']) && (!isset($post['invoice_color']) || empty($post['invoice_color']))) {
$post['invoice_color'] = "ffffff";
}
if ($request->invoice_logo) {
$dir = 'invoice_logo/';
$invoice_logo = \Auth::user()->id . '_invoice_logo.png';
$validation = [
'mimes:' . 'png',
'max:' . '20480',
];
$path = Utility::upload_file($request, 'invoice_logo', $invoice_logo, $dir, $validation);
if ($path['flag'] == 0) {
return redirect()->back()->with('error', __($path['msg']));
}
$post['invoice_logo'] = $invoice_logo;
}
foreach ($post as $key => $data) {
\DB::insert(
'insert into settings (`value`, `name`,`created_by`) values (?, ?, ?) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`) ', [
$data,
$key,
\Auth::user()->creatorId(),
]
);
}
return redirect()->back()->with('success', __('Invoice Setting updated successfully'));
}
public function items(Request $request)
{
$items = InvoiceProduct::where('invoice_id', $request->invoice_id)->where('product_id', $request->product_id)->first();
return json_encode($items);
}
public function invoiceLink($invoiceId)
{
try {
$id = Crypt::decrypt($invoiceId);
} catch (\Throwable $th) {
return redirect()->back()->with('error', __('Invoice Not Found.'));
}
$id = Crypt::decrypt($invoiceId);
$invoice = Invoice::with(['creditNote','payments.bankAccount','items.product.unit'])->find($id);
$settings = Utility::settingsById($invoice->created_by);
if (!empty($invoice)) {
$user_id = $invoice->created_by;
$user = User::find($user_id);
$invoicePayment = InvoicePayment::where('invoice_id', $invoice->id)->get();
$customer = $invoice->customer;
$iteams = $invoice->items;
$invoice->customField = CustomField::getData($invoice, 'invoice');
$customFields = CustomField::where('module', '=', 'invoice')->where('created_by', $invoice->created_by)->get();
$company_payment_setting = Utility::getCompanyPaymentSetting($user_id);
// start for storage limit note
$user_plan = Plan::find($user->plan);
// end for storage limit note
return view('invoice.customer_invoice', compact('settings', 'invoice', 'customer', 'iteams', 'invoicePayment', 'customFields', 'user', 'company_payment_setting', 'user_plan'));
} else {
return redirect()->back()->with('error', __('Permission Denied.'));
}
}
public function export()
{
$name = 'invoice_' . date('Y-m-d i:h:s');
$data = Excel::download(new InvoiceExport(), $name . '.xlsx');
ob_end_clean();
return $data;
}
}