116 lines
4.2 KiB
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()]);
|
|
}
|
|
}
|
|
} |