viewEstimatePermission = user()->permission('view_estimates'); $this->addEstimatePermission = user()->permission('add_estimates'); $this->editEstimatePermission = user()->permission('edit_estimates'); $this->deleteEstimatePermission = user()->permission('delete_estimates'); $this->addInvoicePermission = user()->permission('add_invoices'); $this->showRequest = in_array(user()->permission('view_estimate_request'), ['all', 'added', 'owned', 'both']); } /** * Build DataTable class. * * @param mixed $query Results from query() method. * @return \Yajra\DataTables\DataTableAbstract */ public function dataTable($query) { $firstEstimate = $this->firstEstimate; $userId = UserService::getUserId(); $datatables = datatables()->eloquent($query); $datatables->addIndexColumn(); $datatables->addColumn('action', function ($row) use ($firstEstimate, $userId) { $action = '
'; return $action; }); $datatables->addColumn('estimate_number', function ($row) { return '' . $row->estimate_number . ''; }); $datatables->editColumn('project_name', function ($row) { if ($row->project_id != null) { return '' . $row->project?->project_name . ''; } return '--'; }); $datatables->addColumn('client_name', fn($row) => $row->name); $datatables->editColumn('name', fn($row) => view('components.client', ['user' => $row->client])); $datatables->editColumn('status', function ($row) { $status = ''; if ($row->status == 'waiting') { $status .= '' . __('modules.estimates.' . $row->status) . ''; } elseif ($row->status == 'draft') { $status .= '' . __('app.' . $row->status) . ''; } elseif ($row->status == 'canceled') { $status .= '' . __('app.' . $row->status) . ''; } elseif ($row->status == 'declined') { $status .= '' . __('modules.estimates.' . $row->status) . ''; } else { $status .= '' . __('modules.estimates.' . $row->status) . ''; } if (!$row->send_status && $row->status != 'draft' && $row->status != 'canceled') { $status .= ' ' . __('modules.invoices.notSent') . ''; } return $status; }); $datatables->addColumn('estimate_request_number', function ($row) { if ($row->estimate_request_id) { return '' . $row->estimateRequest->estimate_request_number . ''; } else { return '--'; } }); $datatables->editColumn('total', fn($row) => currency_format($row->total, $row->currencyId)); $datatables->editColumn('valid_till', fn($row) => Carbon::parse($row->valid_till)->translatedFormat($this->company->date_format)); $datatables->editColumn('created_at', fn($row) => Carbon::parse($row->created_at)->translatedFormat($this->company->date_format)); $datatables->removeColumn('currency_symbol'); $datatables->removeColumn('client_id'); // Custom Fields For export $customFieldColumns = CustomField::customFieldData($datatables, Estimate::CUSTOM_FIELD_MODEL); $datatables->rawColumns(array_merge(['project_name', 'name', 'action', 'status', 'estimate_number', 'estimate_request_number'], $customFieldColumns)); return $datatables; } /** * @return \Illuminate\Database\Eloquent\Builder */ public function query() { $request = $this->request(); $userId = UserService::getUserId(); $this->firstEstimate = Estimate::orderBy('id', 'desc')->first(); $model = Estimate::with(['client', 'client.session', 'company:id', 'project' => function ($q) { $q->withTrashed(); $q->select('id', 'project_name', 'project_short_code', 'client_id', 'deleted_at'); } ]) ->join('client_details', 'estimates.client_id', '=', 'client_details.user_id') ->join('currencies', 'currencies.id', '=', 'estimates.currency_id') ->join('users', 'users.id', '=', 'estimates.client_id') ->leftJoin('invoices', 'invoices.estimate_id', '=', 'estimates.id') ->leftJoin('estimate_requests', 'estimate_requests.id', '=', 'estimates.estimate_request_id') ->select([ 'estimates.id', 'estimates.company_id', 'estimates.client_id', 'users.name', 'users.email', 'estimates.total', 'currencies.currency_symbol', 'currencies.id as currencyId', 'estimates.status', 'estimates.project_id', 'estimates.valid_till', 'estimates.estimate_number', 'estimates.send_status', 'estimates.added_by', 'estimates.hash', 'invoices.estimate_id', 'estimates.created_at', 'estimates.estimate_request_id', 'estimate_requests.estimate_request_number', ]); if ($request->startDate !== null && $request->startDate != 'null' && $request->startDate != '') { $startDate = companyToDateString($request->startDate); $model = $model->where(DB::raw('DATE(estimates.`valid_till`)'), '>=', $startDate); } if ($request->endDate !== null && $request->endDate != 'null' && $request->endDate != '') { $endDate = companyToDateString($request->endDate); $model = $model->where(DB::raw('DATE(estimates.`valid_till`)'), '<=', $endDate); } if ($request->status != 'all' && !is_null($request->status)) { $model = $model->where('estimates.status', '=', $request->status); } if ($request->clientID != 'all' && !is_null($request->clientID)) { $model = $model->where('estimates.client_id', '=', $request->clientID); } if (in_array('client', user_roles())) { $model = $model->where('estimates.send_status', 1); $model = $model->where('estimates.client_id', $userId); } if ($request->searchText != '') { $model->where(function ($query) { $query->where('estimates.estimate_number', 'like', '%' . request('searchText') . '%') ->orWhere('estimates.id', 'like', '%' . request('searchText') . '%') ->orWhere('estimates.total', 'like', '%' . request('searchText') . '%') ->orWhere(function ($query) { $query->whereHas('client', function ($q) { $q->where('name', 'like', '%' . request('searchText') . '%'); }); }) ->orWhere(function ($query) { $query->whereHas('project', function ($q) { $q->where('project_name', 'like', '%' . request('searchText') . '%') ->orWhere('project_short_code', 'like', '%' . request('searchText') . '%'); // project short code }); }) ->orWhere(function ($query) { $query->where('estimates.status', 'like', '%' . request('searchText') . '%'); }); }); } if ($this->viewEstimatePermission == 'added') { $model->where('estimates.added_by', $userId); } if ($this->viewEstimatePermission == 'both') { $model->where(function ($query) use ($userId) { $query->where('estimates.added_by', $userId) ->orWhere('estimates.client_id', $userId); }); } if ($this->viewEstimatePermission == 'owned') { $model->where('estimates.client_id', $userId); } return $model; } /** * Optional method if you want to use html builder. * * @return \Yajra\DataTables\Html\Builder */ public function html() { $dataTable = $this->setBuilder('invoices-table') ->parameters([ 'initComplete' => 'function () { window.LaravelDataTables["invoices-table"].buttons().container() .appendTo( "#table-actions") }', 'fnDrawCallback' => 'function( oSettings ) { $("body").tooltip({ selector: \'[data-toggle="tooltip"]\' }) }', ]); if (canDataTableExport()) { $dataTable->buttons(Button::make(['extend' => 'excel', 'text' => ' ' . trans('app.exportExcel')])); } return $dataTable; } /** * Get columns. * * @return array */ protected function getColumns() { $data = [ '#' => ['data' => 'DT_RowIndex', 'orderable' => false, 'searchable' => false, 'visible' => false, 'title' => '#'], __('app.id') => ['data' => 'id', 'name' => 'id', 'title' => __('app.id'), 'visible' => false], __('app.estimate') . '#' => ['data' => 'estimate_number', 'name' => 'estimate_number', 'title' => __('app.estimate')], __('app.project') => ['data' => 'project_name', 'name' => 'project.project_name', 'title' => __('app.project'), 'visible' => in_array('projects', user_modules()), 'exportable' => in_array('projects', user_modules())], __('app.client') => ['data' => 'name', 'name' => 'users.name', 'exportable' => false, 'title' => __('app.client'), 'visible' => (in_array('clients', user_modules()) && !in_array('client', user_roles()))], __('app.customers') => ['data' => 'client_name', 'name' => 'users.name', 'visible' => false, 'title' => __('app.customers')], __('app.email') => ['data' => 'email', 'name' => 'users.email', 'visible' => false, 'title' => __('app.email')], __('modules.invoices.total') => ['data' => 'total', 'name' => 'total', 'title' => __('modules.invoices.total')], __('modules.estimates.validTill') => ['data' => 'valid_till', 'name' => 'valid_till', 'title' => __('modules.estimates.validTill')], __('app.createdOn') => ['data' => 'created_at', 'name' => 'created_at', 'title' => __('app.createdOn')], __('modules.estimateRequest.estimateRequest') . ' ' . __('app.number') => ['data' => 'estimate_request_number', 'name' => 'estimate_request_number', 'visible' => $this->showRequest , 'title' => __('modules.estimateRequest.estimateRequest') . ' ' . __('app.number')], __('app.status') => ['data' => 'status', 'name' => 'status', 'title' => __('app.status')] ]; $action = [ Column::computed('action', __('app.action')) ->exportable(false) ->printable(false) ->orderable(false) ->searchable(false) ->addClass('text-right pr-20') ]; return array_merge($data, CustomFieldGroup::customFieldsDataMerge(new Estimate()), $action); } }