From b9fcec1b160f19422b2658ebea5781aa21e1a534 Mon Sep 17 00:00:00 2001 From: ajikamaludin Date: Thu, 26 Jan 2023 14:47:56 +0700 Subject: [PATCH] Create Doc --- app/Http/Controllers/DocumentController.php | 261 ++++-------------- app/Models/Document.php | 16 ++ resources/js/Pages/Document/Form.jsx | 281 ++++++++------------ resources/js/Pages/Document/Index.jsx | 85 +++--- resources/views/app.blade.php | 2 +- 5 files changed, 222 insertions(+), 423 deletions(-) diff --git a/app/Http/Controllers/DocumentController.php b/app/Http/Controllers/DocumentController.php index c138a35..1a3037e 100644 --- a/app/Http/Controllers/DocumentController.php +++ b/app/Http/Controllers/DocumentController.php @@ -3,8 +3,10 @@ namespace App\Http\Controllers; use App\Mail\DocumentShare; +use App\Models\Category; use App\Models\Department; use App\Models\Document; +use App\Models\Type; use App\Models\TypeDoc; use App\Models\User; use Illuminate\Http\Request; @@ -17,268 +19,113 @@ class DocumentController extends Controller { public function index(Request $request) { - $query = Document::with(['department', 'type', 'shares']); + $query = Document::with(['type', 'category']); if ($request->has('sortBy') && $request->has('sortRule')) { $query->orderBy($request->sortBy, $request->sortRule); } else { - $query->orderBy('created_at'); + $query->orderBy('created_at', 'desc'); } if ($request->q != null || $request->q != '') { $query->where(function ($query) use ($request) { $query->where('no_doc', 'like', '%'.$request->q.'%') - ->orWhere('company_name', 'like', '%'.$request->q.'%') - ->orWhere('pic_name', 'like', '%'.$request->q.'%') ->orWhere('name', 'like', '%'.$request->q.'%') - ->orWhere('email', 'like', '%'.$request->q.'%'); + ->orWhere('company_name', 'like', '%'.$request->q.'%') + ->orWhere('no', 'like', '%'.$request->q.'%'); }); } - if ($request->department_id != '') { - $query->where('department_id', $request->department_id); - } - - if ($request->status != '') { - $query->where('status', $request->status); - } - - if ($request->type_doc_id != '') { - $query->where('type_doc_id', $request->type_doc_id); - } - return inertia('Document/Index', [ 'docs' => $query->paginate(10), - 'types' => TypeDoc::all(), - 'departments' => Department::all(), ]); } public function create() { return inertia('Document/Form', [ - 'types' => TypeDoc::all(), - 'departments' => Department::all(), + 'types' => Type::all(), + 'categories' => Category::all(), ]); } public function store(Request $request) { $request->validate([ - 'no_doc' => 'required|string', - 'company_name' => 'required|string', - 'first_person_name' => 'required|string', - 'second_person_name' => 'required|string', - 'start_date' => 'required|date', - 'end_date' => 'required|date|after_or_equal:'.$request->start_date, - 'type_doc_id' => 'required|exists:type_docs,id', - 'department_id' => 'required|exists:departments,id', - 'pic_name' => 'required|string', - 'email' => 'required|email', - 'document' => 'required|file', - 'note' => 'nullable', - 'status' => 'required|numeric', - 'reminders' => 'nullable|array', - 'name' => 'required|string' + "no_doc" => "required|string", + "name" => "required|string", + "company_name" => "required|string", + "type_id" => "required|exists:types,id", + "category_id" => "required|exists:categories,id", + "publisher" => "required|string", + "description" => "nullable", + "publish_date" => "required|date", + "due_date" => "required_if:type,1", + "status" => "required|in:0,1", + "type" => "required|in:0,1", + "group" => "required|string", + "region" => "required|string", + "document" => "required|file", ]); - $lastDocs = Document::orderBy('created_at', 'desc')->first(); - $lastDocs = $lastDocs ? $lastDocs : Document::make(['no' => 0]); - $docs = Document::make([ - 'no' => $lastDocs->no + 1, - 'name' => $request->name, - 'no_doc' => $request->no_doc, - 'company_name' => $request->company_name, - 'first_person_name' => $request->first_person_name, - 'second_person_name' => $request->second_person_name, - 'start_date' => $request->start_date, - 'end_date' => $request->end_date, - 'pic_name' => $request->pic_name, - 'email' => $request->email, - 'note' => $request->note, - 'type_doc_id' => $request->type_doc_id, - 'department_id' => $request->department_id, - 'status' => Document::ACTIVE, //DOCUMENT CREATED ALWAYS ACTIVE - 'user_id' => auth()->user()->id, + if($request->publish_date == Document::TYPE_TETAP) { + $request->validate([ + "due_date" => "date|after_or_equal:".$request->publish_date + ]); + } + + $doc = Document::make([ + "no" => Document::count() + 1, + "no_doc" => $request->no_doc, + "name" => $request->name, + "company_name" => $request->company_name, + "type_id" => $request->type_id, + "category_id" => $request->category_id, + "publisher" => $request->publisher, + "description" => $request->description, + "publish_date" => $request->publish_date, + "due_date" => $request->due_date, + "status" => $request->status, + "type" => $request->type, + "group" => $request->group, + "region" => $request->region, + "user_id" => auth()->user()->id, ]); $file = $request->file('document'); $file->store('documents', 'public'); - $docs->document = $file->hashName(); - - DB::beginTransaction(); - $docs->save(); + $doc->document = $file->hashName(); - if ($request->has('reminders')) { - foreach ($request->reminders as $reminder) { - $docs->reminders()->updateOrCreate(['date' => $reminder]); - } - } - DB::commit(); - - return redirect()->route('docs.index') - ->with('message', ['type' => 'success', 'message' => 'The data has beed saved']); + $doc->save(); + + return redirect("docs.index") + ->with('message', ['type' => 'success', 'message' => 'The data has beed saved']); } public function edit(Document $doc) { return inertia('Document/Form', [ - 'types' => TypeDoc::all(), - 'departments' => Department::all(), - 'doc' => $doc->load(['reminders']) + 'types' => Type::all(), + 'categories' => Category::all(), + 'doc' => $doc->load(['type', 'category']) ]); } public function update(Request $request, Document $doc) { - $request->validate([ - 'no_doc' => 'required|string', - 'company_name' => 'required|string', - 'first_person_name' => 'required|string', - 'second_person_name' => 'required|string', - 'start_date' => 'required|date', - 'end_date' => 'required|date|after_or_equal:'.$request->start_date, - 'type_doc_id' => 'required|exists:type_docs,id', - 'department_id' => 'required|exists:departments,id', - 'pic_name' => 'required|string', - 'email' => 'required|email', - 'document' => 'nullable|file', - 'note' => 'nullable', - 'name' => 'required|string', - 'status' => 'required|numeric', - ]); - - - $doc->fill([ - 'no_doc' => $request->no_doc, - 'name' => $request->name, - 'company_name' => $request->company_name, - 'first_person_name' => $request->first_person_name, - 'second_person_name' => $request->second_person_name, - 'start_date' => $request->start_date, - 'end_date' => $request->end_date, - 'pic_name' => $request->pic_name, - 'email' => $request->email, - 'note' => $request->note, - 'type_doc_id' => $request->type_doc_id, - 'department_id' => $request->department_id, - 'status' => Document::UPDATE // DOCUEMENT UPDATED IS ALWAYS UPDATE - ]); - - $file = $request->file('document'); - if ($file != null) { - $file->store('documents', 'public'); - $doc->document = $file->hashName(); - } - - DB::beginTransaction(); - $doc->save(); - - $doc->reminders()->delete(); - if ($request->has('reminders')) { - foreach ($request->reminders as $reminder) { - $doc->reminders()->updateOrCreate(['date' => $reminder]); - } - } - DB::commit(); - - return redirect()->route('docs.index') - ->with('message', ['type' => 'success', 'message' => 'The data has beed saved']); + // } public function show(Document $doc) { return inertia('Document/Detail', [ - 'doc' => $doc->load(['department', 'type', 'creator', 'reminders', 'shares']), + 'doc' => $doc->load(['type', 'category']), 'doc_url' => asset('documents/'.$doc->document), ]); } - public function export(Request $request) - { - $query = Document::with(['department', 'type', 'creator'])->orderBy('created_at'); - - if ($request->q != null || $request->q != '') { - $query->where(function ($query) use ($request) { - $query->where('no_doc', 'like', '%'.$request->q.'%') - ->orWhere('company_name', 'like', '%'.$request->q.'%') - ->orWhere('pic_name', 'like', '%'.$request->q.'%') - ->orWhere('email', 'like', '%'.$request->q.'%'); - }); - } - - if ($request->department_id != '') { - $query->where('department_id', $request->department_id); - } - - if ($request->status != '') { - $query->where('status', $request->status); - } - - if ($request->type_doc_id != '') { - $query->where('type_doc_id', $request->type_doc_id); - } - - $collections = collect([]); - foreach ($query->get() as $document) { - $collections->add([ - 'no dokumen' => $document->no_doc, - 'nama' => $document->name, - 'jenis dokumen' => $document->type->name, - 'nama perusahaan' => $document->company_name, - 'nama pihak pertama' => $document->first_person_name, - 'nama pihak kedua' => $document->second_person_name, - 'tanggal mulai' => $document->start_date, - 'tanggal selesai' => $document->end_date, - 'department' => $document->department->name, - 'nama pic' => $document->pic_name, - 'email' => $document->email, - 'catata' => $document->note, - 'status' => $document->status, - 'user_creator' => $document->creator->name, - ]); - } - - $date = now()->format('d-m-y'); - $header_style = (new StyleBuilder())->setFontBold()->build(); - - return (new FastExcel($collections)) - ->headerStyle($header_style) - ->download("documents-$date.xlsx"); - } - - public function share(Request $request, Document $doc) - { - $request->validate([ - 'shares' => 'array', - 'shares.*.share_to' => 'required|email' - ]); - - DB::beginTransaction(); - - $doc->shares()->delete(); - - foreach ($request->shares as $share) { - $user = User::where('email', $share['share_to'])->first(); - if ($user != null) { - $doc->shares()->updateOrCreate(['user_id' => $user->id, 'share_to' => $share['share_to']]); - } else { - $doc->shares()->updateOrCreate(['share_to' => $share['share_to']]); - } - Mail::to($share['share_to'])->queue(new DocumentShare($doc)); - } - - DB::commit(); - - return redirect()->route('docs.index') - ->with('message', ['type' => 'success', 'message' => 'Document success shared']); - } - public function destroy(Document $doc) { - $doc->shares()->delete(); - $doc->reminders()->delete(); $doc->delete(); - return redirect()->back(); } } diff --git a/app/Models/Document.php b/app/Models/Document.php index 19ee8b6..16df39f 100644 --- a/app/Models/Document.php +++ b/app/Models/Document.php @@ -9,6 +9,12 @@ class Document extends Model { use HasFactory; + const STATUS_YES = 1; + const STATUS_NO = 0; + + const TYPE_TETAP = 1; + const TYPE_TIDAK_TETAP = 0; + protected $fillable = [ "no", "no_doc", @@ -37,4 +43,14 @@ class Document extends Model { return $this->belongsTo(User::class, 'user_id'); } + + public function type() + { + return $this->belongsTo(Type::class, 'type_id'); + } + + public function category() + { + return $this->belongsTo(Category::class, 'category_id'); + } } diff --git a/resources/js/Pages/Document/Form.jsx b/resources/js/Pages/Document/Form.jsx index 0d5918b..1beb4d4 100644 --- a/resources/js/Pages/Document/Form.jsx +++ b/resources/js/Pages/Document/Form.jsx @@ -1,40 +1,35 @@ -import React, { useEffect, useRef, useState } from 'react' -import { Link, Head, useForm } from '@inertiajs/react' +import React, { useEffect, useRef } from 'react' +import { Link, Head, useForm, usePage } from '@inertiajs/react' import { toast } from 'react-toastify' -import { statuses } from '@/utils' -import { useModalState } from '@/Hooks' import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout' import PrimaryButton from '@/Components/PrimaryButton' import InputLabel from '@/Components/InputLabel' import TextInput from '@/Components/TextInput' import InputError from '@/Components/InputError' import InputFile from '@/Components/InputFile' -import ModalReminder from './ModalReminder' -import { IconCross } from '@/Icons' export default function FormDocument(props) { const inputDocument = useRef() - const { types, departments, doc }= props + const { types, categories, doc }= props + const { props: {auth: { user }} } = usePage() - const [reminders, setReminders] = useState([]) - const { data, setData, post, processing, errors, reset } = useForm({ + const { data, setData, post, processing, errors } = useForm({ no_doc: '', name: '', - email: '', - type_doc_id: '1', - department_id: '1', company_name: '', - first_person_name: '', - second_person_name: '', - start_date: '', - end_date: '', - pic_name: '', - note: '', + type_id: '', + category_id: '', + publisher: '', + description: '', + publish_date: '', + due_date: '', + status: 0, + type: 0, + group: user.group, + region: user.region, document: null, document_name: '', - status: 0, - reminders: [] }); useEffect(() => { @@ -42,37 +37,23 @@ export default function FormDocument(props) { setData({ no_doc: doc.no_doc, name: doc.name, - email: doc.email, - type_doc_id: doc.type_doc_id, - department_id: doc.department_id, company_name: doc.company_name, - first_person_name: doc.first_person_name, - second_person_name: doc.second_person_name, - start_date: doc.start_date, - end_date: doc.end_date, - pic_name: doc.pic_name, - note: doc.note, + type_id: doc.type_id, + category_id: doc.category_id, + publisher: doc.publisher, + description: doc.description, + publish_date: doc.publish_date, + due_date: doc.due_date, + status: doc.status, + type: doc.type, + group: doc.group, + region: doc.region, document: null, document_name: doc.document, - status: doc.status, - reminders: doc.reminders.map(r => r.date) }) - setReminders(doc.reminders.map(r => r.date)) } }, [doc]); - const reminderModal = useModalState(false) - const handleAddReminder = (date) => { - setReminders(reminders.concat(date)) - setData('reminders', reminders.concat(date)) - } - - const handleRemoveReminder = (index) => { - const r = reminders.filter((_, i) => i !== index) - setReminders(r) - setData('reminders', r) - } - const onHandleChange = (event) => { setData(event.target.name, event.target.type === 'checkbox' ? event.target.checked : event.target.value); }; @@ -119,21 +100,37 @@ export default function FormDocument(props) { /> -
+
- +
-
+
+ + + +
+
- + - +
- + - +
- - - +
+ + + +
- + - +
- + - -
- -
- - - -
-
- - - -
-
- - - +
- + - +
@@ -277,40 +233,45 @@ export default function FormDocument(props) {

file saved is found, reupload to replace

)}
- {/*
- - - -
*/}
-
- -
+ Tambah
-
-
- {reminders.map((reminder, index) => ( -
-
-
- {reminder} -
-
handleRemoveReminder(index)}> - -
-
-
- ))} +
+ + +
+
+ + + +
+
+ + + +
Simpan @@ -325,12 +286,6 @@ export default function FormDocument(props) {
- - ) } \ No newline at end of file diff --git a/resources/js/Pages/Document/Index.jsx b/resources/js/Pages/Document/Index.jsx index 501b362..737aa24 100644 --- a/resources/js/Pages/Document/Index.jsx +++ b/resources/js/Pages/Document/Index.jsx @@ -8,11 +8,8 @@ import { useModalState } from '@/Hooks' import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout' import Pagination from '@/Components/Pagination' import ModalConfirm from '@/Components/ModalConfirm' -import ModalFilter from './ModalFilter' -import ModalShare from './ModalShare' -import DocStatusItem from './DocStatusItem' -import { IconFilter, IconMenu } from '@/Icons' -import { formatDate } from '@/utils' +import { IconMenu } from '@/Icons' +import { formatDate, hasPermission } from '@/utils' export default function Document(props) { const { types, departments } = props @@ -36,7 +33,6 @@ export default function Document(props) { } } - const filterModal = useModalState(false) const handleFilter = (filter) => { setSearch({ ...search, @@ -44,12 +40,6 @@ export default function Document(props) { }) } - const shareModal = useModalState(false) - const handleShare = (doc) => { - shareModal.setData(doc) - shareModal.toggle() - } - const sort = (key) => { setSearch({ ...search, @@ -71,6 +61,10 @@ export default function Document(props) { } }, [search]) + const canCreate = hasPermission('create-document', props.auth.user) + const canUpdate = hasPermission('update-document', props.auth.user) + const canDelete = hasPermission('delete-document', props.auth.user) + return (
- - Tambah - + {canCreate && ( + + Tambah + + )}
-
-
filterModal.toggle()}> - -
-
- + + + - - - + + @@ -124,10 +116,11 @@ export default function Document(props) { {docs?.map((doc) => ( + + - - - + + @@ -163,19 +157,6 @@ export default function Document(props) { toggle={confirmModal.toggle} onConfirm={onDelete} /> - - ) } \ No newline at end of file diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php index ea41696..39d08af 100644 --- a/resources/views/app.blade.php +++ b/resources/views/app.blade.php @@ -1,5 +1,5 @@ - +
sort('type_doc_id')}>Jenis sort('type_id')}>Jenis sort('category_id')}>KetegoriNo Dokumen Nama DokumenNama PIC sort('end_date')}>Tanggal Berakhir sort('status')}>Status sort('due_date')}>Tanggal BerakhirStatus
{doc.type.name}{doc.category.name}{doc.no_doc} {doc.name}{doc.pic_name}{formatDate(doc.end_date)}{formatDate(doc.due_date)}Status
@@ -135,15 +128,16 @@ export default function Document(props) {
  • Detail
  • -
  • handleShare(doc)}> -
    Share
    -
  • -
  • - Edit -
  • -
  • handleDelete(doc)} className="bg-error "> -
    Delete
    -
  • + {canUpdate && ( +
  • + Edit +
  • + )} + {canDelete && ( +
  • handleDelete(doc)} className="bg-error "> +
    Delete
    +
  • + )}