added document vault and bug fixes on profile and staff members controllers

This commit is contained in:
Kwesi Banson Jnr
2026-08-20 19:08:31 +00:00
parent 81d26dc138
commit cc129bccac
7 changed files with 456 additions and 261 deletions

View File

@@ -6,51 +6,79 @@ 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)
{
// 1. Validate the incoming request
$request->validate([
'file' => 'required|file|max:10240', // 10MB
'type' => 'required|string',
'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
]);
// 2. Store locally on your ERP server
$file = $request->file('file');
$originalName = $file->getClientOriginalName();
$localPath = $file->storeAs('documents/' . date('Y/m'), $originalName, 'local');
$filename = time() . '_' . preg_replace('/\s+/', '_', $file->getClientOriginalName());
// Store files in a 'documents' folder inside storage/app/public
$filePath = $file->storeAs('documents', $filename, 'public');
// 3. Check if it needs to be pushed to Paperless-Ngx
// You can base this on the checkbox OR force it based on type (e.g., $request->type === 'contract')
if ($request->boolean('push_to_paperless')) {
$this->pushToPaperless($localPath, $originalName, $request->all());
}
// Get current staff ID if applicable
$staff = StaffMember::where('email', auth()->user()->email)->first();
return response()->json(['message' => 'Document saved successfully.']);
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 storeTwo(Request $request)
public function destroy($id)
{
// ... validation and local storage logic ...
$localPath = $file->storeAs('documents/' . date('Y/m'), $originalName, 'local');
$document = GeneralDocument::findOrFail($id);
// Retrieve the actual Eloquent models based on the form input
$entity = MnoPartner::find($request->input('entity_id'));
$docType = DocumentType::where('slug', $request->input('type'))->first();
if ($request->boolean('push_to_paperless')) {
// Dispatch the job to the queue
PushDocumentToPaperless::dispatch(
$localPath,
$originalName,
$entity,
$docType,
$request->input('notes')
);
// Delete actual physical file from storage
if ($document->filename && Storage::disk('public')->exists($document->filename)) {
Storage::disk('public')->delete($document->filename);
}
return response()->json(['message' => 'Document saved and queued for archival.']);
$document->delete();
return response()->json(['success' => true, 'message' => 'Document deleted successfully!']);
}
private function pushToPaperless(string $localPath, string $fileName, array $metadata)
@@ -72,7 +100,7 @@ class DocumentsController extends Controller
->post("{$paperlessUrl}/api/documents/post_document/", [
// Optional Paperless metadata fields
'title' => $metadata['notes'] ?? $fileName,
// You can map ERP tags to Paperless Tag IDs here
// mapping ERP tags to Paperless Tag IDs
// 'tags' => [1, 4],
// 'correspondent' => 2
]);

View File

@@ -148,4 +148,14 @@ class StaffMembersController extends Controller
return $upcomingStaff;
}
public function showDetails($id)
{
$staff = StaffMember::with('dependents')->findOrFail($id);
return response()->json([
'success' => true,
'staff' => $staff,
'dependents' => $staff->dependents
]);
}
}