filled('category')) { $query->where('category', $request->category); } // Search by name or description if ($request->filled('search')) { $search = $request->search; $query->where(function($q) use ($search) { $q->where('name', 'like', "%{$search}%") ->orWhere('description', 'like', "%{$search}%"); }); } $documents = $query->orderBy('created_at', 'desc')->paginate(12); //todo remove this after we migrate from old GUI $categories = GeneralDocument::select('category')->distinct()->whereNotNull('category')->pluck('category'); $document_types = Models\DocumentType::orderBy('name', 'asc')->pluck('name'); return view('documents.index', compact('documents', 'categories', 'document_types')); } public function store(Request $request) { $request->validate([ 'name' => 'required|string|max:191', 'category' => 'nullable|string|max:45', 'description' => 'nullable|string', 'file' => 'required|file|mimes:pdf,jpg,jpeg,png,doc,docx,xls,xlsx|max:10240', // 10MB limit ]); $file = $request->file('file'); $filename = time() . '_' . preg_replace('/\s+/', '_', $file->getClientOriginalName()); // Store files in a 'documents' folder inside storage/app/public $filePath = $file->storeAs('documents', $filename, 'public'); // Get current staff ID if applicable $staff = StaffMember::where('email', auth()->user()->email)->first(); GeneralDocument::create([ 'name' => $request->name, 'description' => $request->description, 'category' => $request->category, 'filename' => $filePath, 'file_extension' => $file->getClientOriginalExtension(), 'uploaded_by' => $staff ? $staff->id : null, ]); return response()->json(['success' => true, 'message' => 'Document uploaded successfully!']); } public function destroy($id) { $document = GeneralDocument::findOrFail($id); // Delete actual physical file from storage if ($document->filename && Storage::disk('public')->exists($document->filename)) { Storage::disk('public')->delete($document->filename); } $document->delete(); return response()->json(['success' => true, 'message' => 'Document deleted successfully!']); } private function pushToPaperless(string $localPath, string $fileName, array $metadata) { $paperlessUrl = env('PAPERLESS_URL'); $apiToken = env('PAPERLESS_API_TOKEN'); try { // Get the raw file contents from local storage $fileContents = Storage::disk('local')->get($localPath); // Send to Paperless-Ngx /api/documents/post_document/ endpoint $response = Http::withToken($apiToken) ->attach( 'document', $fileContents, $fileName ) ->post("{$paperlessUrl}/api/documents/post_document/", [ // Optional Paperless metadata fields 'title' => $metadata['notes'] ?? $fileName, // mapping ERP tags to Paperless Tag IDs // 'tags' => [1, 4], // 'correspondent' => 2 ]); if (!$response->successful()) { Log::error('Paperless-Ngx Upload Failed', ['error' => $response->body()]); } } catch (\Exception $e) { Log::error('Paperless-Ngx Connection Error', ['message' => $e->getMessage()]); } } }