File: /www/wwwroot/erp.nhatnamsst.com/domains/Customer/DataTables/CustomerDataTable.php
<?php
namespace Domains\Customer\DataTables;
use Domains\Customer\Repositories\Customer\CustomerRepositoryInterface;
use Domains\Core\DataTables\DataTables;
use Domains\Core\Enums\AdminRole;
class CustomerDataTable extends DataTables
{
public function __construct(
public CustomerRepositoryInterface $repo
) {}
protected function setColumnHasSearch(): void
{
$this->columnHasSearch = ['code', 'short_name', 'name', 'phone', 'email', 'address', 'contact_person', 'tax_code'];
}
protected function setRemoveColumns(): void
{
$currentAdmin = get_auth_admin();
$hasEdit = $currentAdmin && $currentAdmin->checkRouteNameAccessOrSuperAdmin('cms.customer.edit');
$hasDelete = $currentAdmin && $currentAdmin->checkRouteNameAccessOrSuperAdmin('cms.customer.delete');
$hasAnyAction = $hasEdit || $hasDelete;
if (!$hasAnyAction) {
$this->removeColumns[] = 'action';
}
}
public function query()
{
$query = $this->repo->getQueryBuilder()->with(['sale', 'contacts']);
$currentAdmin = get_auth_admin();
if ($currentAdmin && !$currentAdmin->checkIsSuperAdmin()) {
if ($currentAdmin->role && in_array($currentAdmin->role, [AdminRole::SALE, AdminRole::LEADER_SALE])) {
$query->where('sale_id', $currentAdmin->id);
}
if ($currentAdmin->role && in_array($currentAdmin->role, [AdminRole::INTER, AdminRole::LEADER_INTER])) {
$query->whereRaw('1 = 0');
}
}
// Apply filters from request
if ($this->request) {
// Filter by code
if ($this->request->has('filter_code') && $this->request->get('filter_code')) {
$code = $this->request->get('filter_code');
$query->where('code', 'like', '%' . $code . '%');
}
// Filter by name
if ($this->request->has('filter_name') && $this->request->get('filter_name')) {
$name = $this->request->get('filter_name');
$query->where('name', 'like', '%' . $name . '%');
}
}
return $query;
}
protected function setEditColumns(): void
{
$this->editColumns = [
'code' => 'cms.customers.datatable.code',
'type' => fn($row) => $row->type ? $row->type->description() : '-',
'sale_id' => fn($row) => $row->sale ? ($row->sale->code ?? '') . ' - ' . $row->sale->fullname . ' (' . $row->sale->role->description() . ')' : '-',
];
}
protected function setAddColumns(): void
{
$this->addColumns = [
'action' => 'cms.customers.datatable.action',
];
}
protected function setRawColumns(): void
{
$this->rawColumns = ['code', 'type', 'sale_id', 'action'];
}
protected function setConfigColumns(): void
{
$this->configColumns = [
'code' => [
'title' => 'Mã khách hàng',
'orderable' => true,
],
'type' => [
'title' => 'Loại khách hàng',
'orderable' => true,
],
'name' => [
'title' => 'Tên khách hàng',
'orderable' => true,
],
'short_name' => [
'title' => 'Tên viết tắt',
'orderable' => true,
],
'address' => [
'title' => 'Địa chỉ',
'orderable' => true,
],
'contact_person' => [
'title' => 'Người liên hệ',
'orderable' => true,
],
'position' => [
'title' => 'Chức vụ',
'orderable' => true,
],
'tax_code' => [
'title' => 'Mã số thuế',
'orderable' => true,
],
'phone' => [
'title' => 'Số điện thoại',
'orderable' => true,
],
'email' => [
'title' => 'Email',
'orderable' => true,
],
'payment_method' => [
'title' => 'Phương thức thanh toán',
'orderable' => true,
],
'sale_id' => [
'title' => 'Thuộc Sale',
'orderable' => false,
],
'action' => [
'title' => 'Hành động',
'orderable' => false,
'exportable' => false,
'printable' => false,
'addClass' => 'text-center',
'width' => '120px'
]
];
}
}