Files
ERP-upgrade/app/Http/Controllers/DocumentsController.php

116 lines
4.2 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;
use App\Models\GeneralDocument;
use App\Models\StaffMember;
use App\Models;
class DocumentsController extends Controller
{
public function index(Request $request)
{
$query = GeneralDocument::query();
// Optional filtering by category
if ($request->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()]);
}
}
}