middleware('auth'); } public function index() { return view('theme::cms.bookkeepings.index'); } public function getCompanies() { $nameColumn = strtolower(app()->getLocale()) == 'zh_hk' ? 'name_chinese' : 'name_english'; $companies = Company::where($nameColumn, '!=', null) ->orderBy($nameColumn) ->get() ->map(function ($company) use ($nameColumn) { $company->name = $company->{$nameColumn}; return $company; }); return response()->json([ 'success' => true, 'companies' => $companies, ]); } public function getCategories() { $categories = BookkeepingDocumentCategory::where('status', 'active') ->orderBy('name') ->get(); return response()->json([ 'success' => true, 'categories' => $categories, ]); } public function table($isCompleted = false) { $documents = BookkeepingDocument::query() ->select( 'bookkeeping_documents.id', 'companies.name_english', 'companies.name_chinese', 'bookkeeping_documents.file_name', 'bookkeeping_document_categories.name as category_name', 'users.first_name', 'users.last_name', 'bookkeeping_documents.batch_name', 'bookkeeping_documents.remark', 'bookkeeping_documents.created_at', 'bookkeeping_documents.status', 'bookkeeping_documents.xero_status', 'bookkeeping_documents.xero_amount', ) ->leftJoin('companies', 'bookkeeping_documents.company_id', '=', 'companies.id') ->leftJoin('users', 'bookkeeping_documents.user_id', '=', 'users.id') ->leftJoin('bookkeeping_document_categories', 'bookkeeping_documents.bookkeeping_document_category_id', '=', 'bookkeeping_document_categories.id'); if ($isCompleted) { $documents = $documents->where('bookkeeping_documents.status', 'completed'); } else { $documents = $documents->where('bookkeeping_documents.status', '!=', 'completed'); } $processCount = $documents->clone()->where('bookkeeping_documents.status', 'in_progress')->count(); $queueCount = $documents->clone()->where('bookkeeping_documents.status', 'uploaded')->count(); return Datatables::of($documents) ->escapeColumns(['id']) ->addColumn('file_name', function ($document) { $ext = pathinfo($document->file_name, PATHINFO_EXTENSION); return '
' . $document->file_name . '
'; }) ->addColumn('user_name', function ($document) { if ($document->status == 'uploaded') { return 'processing...'; } else if ($document->status == 'failed') { return 'Failed'; } return $document->first_name . ($document->last_name ? ' ' : '') . $document->last_name; }) ->addColumn('created_at', function ($document) { return date('Ymd-H:i', strtotime($document->created_at)); }) ->addColumn('status_select', function ($document) { $html = ' '; if ($document->status == 'failed') { $html .= '
'; } else if ($document->status == 'ocr_complete') { $html .= ''; } return $html; }) ->addColumn('xero_status', function ($document) { if ($document->status != 'ocr_complete') { if ($document->xero_status) { return ''; } else { return ''; } } return ''; }) ->addColumn('xero_amount', function ($document) { if ($document->xero_amount > 0 && $document->status != 'ocr_complete') { return '$' . $document->xero_amount; } return ''; }) ->addColumn('actions', function ($document) { $actions = ' '; return $actions; }) ->with([ 'processCount' => $processCount, 'queueCount' => $queueCount, ]) ->make(true); } public function updateStatus(Request $request) { $validator = Validator::make($request->all(), [ 'id' => 'required', 'status' => 'required', 'xero_status' => [ 'nullable', Rule::requiredIf($request->status == 'completed'), ], 'xero_amount' => [ 'nullable', Rule::requiredIf($request->status == 'completed'), 'numeric', ], ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'errors' => $validator->errors() ], 422); } else { $bookkeepingDocument = BookkeepingDocument::find($request->id); if (! $bookkeepingDocument) { return response()->json([ 'success' => false, 'message' => __("Document not exists!"), ]); } $bookkeepingDocument->status = $request->status; if ($request->status == 'completed') { $bookkeepingDocument->xero_status = $request->xero_status == '1' ? true : false; $bookkeepingDocument->xero_amount = $request->xero_amount; } $bookkeepingDocument->save(); DocumentActionLogs::create([ 'user_id' => $request->user()->id, 'event' => 'Change status', 'description' => 'Change [' . $bookkeepingDocument->file_name . '] status to ' . $request->status . '.', 'status' => 'success', ]); if ($request->status == 'completed') { storeUserNotification(null, 'Bookkeeping Queue', $bookkeepingDocument->file_name, 'Bookkeeping Queue', true, $bookkeepingDocument->id, 'bookkeeping_queue', 'completed'); } else if ($request->status == 'failed') { storeUserNotification(null, 'Bookkeeping Queue', $bookkeepingDocument->file_name, 'Bookkeeping Queue', true, $bookkeepingDocument->id, 'bookkeeping_queue', 'failed'); } return response()->json([ 'success' => true, 'message' => __("Document has successfully updated!"), ]); } } public function actionLogsTable() { $logs = DocumentActionLogs::query() ->select( 'users.email', 'users.name', 'document_action_logs.created_at', 'document_action_logs.event', 'document_action_logs.description', 'document_action_logs.status', ) ->leftJoin('users', 'document_action_logs.user_id', '=', 'users.id'); return Datatables::of($logs) ->escapeColumns(['id']) ->addColumn('date', function ($log) { return date('Ymd', strtotime($log->created_at)); }) ->addColumn('time', function ($log) { return date('H:i', strtotime($log->created_at)); }) ->addColumn('status', function ($log) { return '' . ucwords($log->status) . ''; }) ->make(true); } public function reUploadFile(Request $request) { $validator = Validator::make($request->all(), [ 'id' => 'required', 'uploaded_file' => 'required', ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'errors' => $validator->errors() ], 422); } else { $bookkeepingDocument = BookkeepingDocument::find($request->id); if (! $bookkeepingDocument) { return response()->json([ 'success' => true, 'message' => __("Document not exists!"), ]); } $fileName = ''; if ($request->hasFile('uploaded_file')) { if (\Storage::exists($bookkeepingDocument->file_path)) { \Storage::delete($bookkeepingDocument->file_path); } $file = $request->file('uploaded_file'); $fileName = $request->file('uploaded_file')->getClientOriginalName(); $file->storePubliclyAs($bookkeepingDocument->folder_path, $fileName); $bookkeepingDocument->file_name = $fileName; $bookkeepingDocument->status = 'uploaded'; $bookkeepingDocument->save(); } DocumentActionLogs::create([ 'user_id' => $request->user()->id, 'event' => 'Upload', 'description' => 'Upload [' . $fileName . '] from local file.', 'status' => 'success', ]); return response()->json([ 'success' => true, 'message' => __("Document has successfully uploaded!"), ]); } } }