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!"),
]);
}
}
}