214 lines
11 KiB
PHP
214 lines
11 KiB
PHP
<?php
|
|
|
|
namespace Modules\Crm\Http\Controllers;
|
|
|
|
use App\Contact;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Transaction;
|
|
use App\Utils\ModuleUtil;
|
|
use App\Utils\TransactionUtil;
|
|
use Illuminate\Http\Request;
|
|
use Yajra\DataTables\Facades\DataTables;
|
|
|
|
class SellController extends Controller
|
|
{
|
|
/**
|
|
* All Utils instance.
|
|
*/
|
|
protected $transactionUtil;
|
|
|
|
protected $moduleUtil;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param ProductUtils $product
|
|
* @return void
|
|
*/
|
|
public function __construct(TransactionUtil $transactionUtil, ModuleUtil $moduleUtil)
|
|
{
|
|
$this->transactionUtil = $transactionUtil;
|
|
$this->moduleUtil = $moduleUtil;
|
|
}
|
|
|
|
public function getSellList(Request $request)
|
|
{
|
|
$business_id = request()->session()->get('user.business_id');
|
|
|
|
$contact_type = Contact::where('business_id', $business_id)
|
|
->find(auth()->user()->crm_contact_id)
|
|
->type;
|
|
|
|
if (! (auth()->user()->can('superadmin') || $this->moduleUtil->hasThePermissionInSubscription($business_id, 'crm_module') && in_array($contact_type, ['customer', 'both']))) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
$shipping_statuses = $this->transactionUtil->shipping_statuses();
|
|
$payment_types = $this->transactionUtil->payment_types(null, true);
|
|
$with = [];
|
|
if ($request->ajax()) {
|
|
$sells = $this->transactionUtil->getListSells($business_id);
|
|
|
|
$sells->where('contacts.id', auth()->user()->crm_contact_id);
|
|
|
|
if (! empty($request->start_date) && ! empty($request->end_date)) {
|
|
$start = $request->start_date;
|
|
$end = $request->end_date;
|
|
$sells->whereDate('transactions.transaction_date', '>=', $start)
|
|
->whereDate('transactions.transaction_date', '<=', $end);
|
|
}
|
|
|
|
if (! empty($request->input('payment_status')) && $request->input('payment_status') != 'overdue') {
|
|
$sells->where('transactions.payment_status', $request->input('payment_status'));
|
|
} elseif ($request->input('payment_status') == 'overdue') {
|
|
$sells->whereIn('transactions.payment_status', ['due', 'partial'])
|
|
->whereNotNull('transactions.pay_term_number')
|
|
->whereNotNull('transactions.pay_term_type')
|
|
->whereRaw("IF(transactions.pay_term_type='days', DATE_ADD(transactions.transaction_date, INTERVAL transactions.pay_term_number DAY) < CURDATE(), DATE_ADD(transactions.transaction_date, INTERVAL transactions.pay_term_number MONTH) < CURDATE())");
|
|
}
|
|
|
|
$sells->groupBy('transactions.id');
|
|
|
|
return Datatables::of($sells)
|
|
->addColumn(
|
|
'action',
|
|
function ($row) {
|
|
$html = '<div class="btn-group">
|
|
<button type="button" class="btn btn-info dropdown-toggle btn-xs"
|
|
data-toggle="dropdown" aria-expanded="false">'.
|
|
__('messages.actions').
|
|
'<span class="caret"></span><span class="sr-only">Toggle Dropdown
|
|
</span>
|
|
</button>
|
|
<ul class="dropdown-menu dropdown-menu-left" role="menu">
|
|
|
|
<li><a href="#" data-href="'.action([\App\Http\Controllers\SellController::class, 'show'], [$row->id]).'" class="btn-modal" data-container=".view_modal"><i class="fas fa-eye" aria-hidden="true"></i> '.__('messages.view').'</a></li>
|
|
<li><a href="#" class="print-invoice" data-href="'.route('sell.printInvoice', [$row->id]).'"><i class="fas fa-print" aria-hidden="true"></i> '.__('messages.print').'</a></li>
|
|
|
|
<li><a href="'.action([\App\Http\Controllers\SellPosController::class, 'showInvoiceUrl'], [$row->id]).'" class="view_invoice_url"><i class="fas fa-eye"></i> '.__('lang_v1.view_invoice_url').'</a></li>';
|
|
|
|
$html .= '</ul></div>';
|
|
|
|
return $html;
|
|
}
|
|
)
|
|
->removeColumn('id')
|
|
->editColumn(
|
|
'final_total',
|
|
'<span class="display_currency final-total" data-currency_symbol="true" data-orig-value="{{$final_total}}">{{$final_total}}</span>'
|
|
)
|
|
->editColumn(
|
|
'tax_amount',
|
|
'<span class="display_currency total-tax" data-currency_symbol="true" data-orig-value="{{$tax_amount}}">{{$tax_amount}}</span>'
|
|
)
|
|
->editColumn(
|
|
'total_paid',
|
|
'<span class="display_currency total-paid" data-currency_symbol="true" data-orig-value="{{$total_paid}}">{{$total_paid}}</span>'
|
|
)
|
|
->editColumn(
|
|
'total_before_tax',
|
|
'<span class="display_currency total_before_tax" data-currency_symbol="true" data-orig-value="{{$total_before_tax}}">{{$total_before_tax}}</span>'
|
|
)
|
|
->editColumn(
|
|
'discount_amount',
|
|
function ($row) {
|
|
$discount = ! empty($row->discount_amount) ? $row->discount_amount : 0;
|
|
|
|
if (! empty($discount) && $row->discount_type == 'percentage') {
|
|
$discount = $row->total_before_tax * ($discount / 100);
|
|
}
|
|
|
|
return '<span class="display_currency total-discount" data-currency_symbol="true" data-orig-value="'.$discount.'">'.$discount.'</span>';
|
|
}
|
|
)
|
|
->editColumn('transaction_date', '@format_datetime($transaction_date)')
|
|
->editColumn(
|
|
'payment_status',
|
|
function ($row) {
|
|
$payment_status = Transaction::getPaymentStatus($row);
|
|
|
|
if ($payment_status == 'partial') {
|
|
$bg = 'bg-aqua';
|
|
} elseif ($payment_status == 'due') {
|
|
$bg = 'bg-yellow';
|
|
} elseif ($payment_status == 'paid') {
|
|
$bg = 'bg-light-green';
|
|
} elseif ($payment_status == 'overdue' || $payment_status == 'partial-overdue') {
|
|
$bg = 'bg-red';
|
|
}
|
|
|
|
$html = '<a href="#" class="view_payment_modal payment-status-label" data-orig-value="'.$payment_status.'" data-status-name="'.__('lang_v1.'.$payment_status).'"><span class="label '.$bg.'">'.__('lang_v1.'.$payment_status).'
|
|
</span></a>';
|
|
|
|
return $html;
|
|
}
|
|
)
|
|
->editColumn(
|
|
'types_of_service_name',
|
|
'<span class="service-type-label" data-orig-value="{{$types_of_service_name}}" data-status-name="{{$types_of_service_name}}">{{$types_of_service_name}}</span>'
|
|
)
|
|
->addColumn('total_remaining', function ($row) {
|
|
$total_remaining = $row->final_total - $row->total_paid;
|
|
$total_remaining_html = '<span class="display_currency payment_due" data-currency_symbol="true" data-orig-value="'.$total_remaining.'">'.$total_remaining.'</span>';
|
|
|
|
return $total_remaining_html;
|
|
})
|
|
->addColumn('return_due', function ($row) {
|
|
$return_due_html = '';
|
|
if (! empty($row->return_exists)) {
|
|
$return_due = $row->amount_return - $row->return_paid;
|
|
$return_due_html .= '<a href="'.action([\App\Http\Controllers\TransactionPaymentController::class, 'show'], [$row->return_transaction_id]).'" class="view_purchase_return_payment_modal"><span class="display_currency sell_return_due" data-currency_symbol="true" data-orig-value="'.$return_due.'">'.$return_due.'</span></a>';
|
|
}
|
|
|
|
return $return_due_html;
|
|
})
|
|
->editColumn('invoice_no', function ($row) {
|
|
$invoice_no = $row->invoice_no;
|
|
if (! empty($row->woocommerce_order_id)) {
|
|
$invoice_no .= ' <i class="fab fa-wordpress text-primary no-print" title="'.__('lang_v1.synced_from_woocommerce').'"></i>';
|
|
}
|
|
if (! empty($row->return_exists)) {
|
|
$invoice_no .= ' <small class="label bg-red label-round no-print" title="'.__('lang_v1.some_qty_returned_from_sell').'"><i class="fas fa-undo"></i></small>';
|
|
}
|
|
if (! empty($row->is_recurring)) {
|
|
$invoice_no .= ' <small class="label bg-red label-round no-print" title="'.__('lang_v1.subscribed_invoice').'"><i class="fas fa-recycle"></i></small>';
|
|
}
|
|
|
|
if (! empty($row->recur_parent_id)) {
|
|
$invoice_no .= ' <small class="label bg-info label-round no-print" title="'.__('lang_v1.subscription_invoice').'"><i class="fas fa-recycle"></i></small>';
|
|
}
|
|
|
|
return $invoice_no;
|
|
})
|
|
->editColumn('shipping_status', function ($row) use ($shipping_statuses) {
|
|
$status_color = ! empty($this->shipping_status_colors[$row->shipping_status]) ? $this->shipping_status_colors[$row->shipping_status] : 'bg-gray';
|
|
$status = ! empty($row->shipping_status) ? '<a href="#" class="btn-modal" data-href="'.action([\App\Http\Controllers\SellController::class, 'editShipping'], [$row->id]).'" data-container=".view_modal"><span class="label '.$status_color.'">'.$shipping_statuses[$row->shipping_status].'</span></a>' : '';
|
|
|
|
return $status;
|
|
})
|
|
->addColumn('payment_methods', function ($row) use ($payment_types) {
|
|
$methods = array_unique($row->payment_lines->pluck('method')->toArray());
|
|
$count = count($methods);
|
|
$payment_method = '';
|
|
if ($count == 1) {
|
|
$payment_method = $payment_types[$methods[0]];
|
|
} elseif ($count > 1) {
|
|
$payment_method = __('lang_v1.checkout_multi_pay');
|
|
}
|
|
|
|
$html = ! empty($payment_method) ? '<span class="payment-method" data-orig-value="'.$payment_method.'" data-status-name="'.$payment_method.'">'.$payment_method.'</span>' : '';
|
|
|
|
return $html;
|
|
})
|
|
->setRowAttr([
|
|
'data-href' => function ($row) {
|
|
return action([\App\Http\Controllers\SellController::class, 'show'], [$row->id]);
|
|
}, ])
|
|
->rawColumns(['final_total', 'action', 'total_paid', 'total_remaining', 'payment_status', 'invoice_no', 'discount_amount', 'tax_amount', 'total_before_tax', 'shipping_status', 'types_of_service_name', 'payment_methods', 'return_due'])
|
|
->make(true);
|
|
}
|
|
|
|
return view('crm::sell.index');
|
|
}
|
|
}
|