LMS dapat upload dokumen TC corporate
This commit is contained in:
ivan-sim
2023-09-19 13:42:05 +07:00
parent ed2d5ee90a
commit 21e146da7e
7 changed files with 346 additions and 2 deletions

View File

@@ -25,6 +25,7 @@ use Illuminate\Support\Facades\File as FacadesFile;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\CorporateService;
use App\Models\FilesDoc;
class CorporateController extends Controller
{
@@ -718,4 +719,68 @@ class CorporateController extends Controller
return $corporates;
}
public function addFilesDoc(Request $request)
{
$request->validate([
'corporate_id' => 'required'
]);
if ($request->hasFile('result_files')) {
$pathFile = File::storeFile('docs', $request->corporate_id, $request->result_files);
$data = [
'corporate_id' => $request->corporate_id,
'original_name' => $request->result_files->getClientOriginalName(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id
];
FilesDoc::create($data);
return Helper::responseJson(data: $request->toArray(), message: 'Berhasil tambah file '.$data['original_name']);
}
else
{
return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file yang ditambahkan');
}
}
public function getFilesDoc(Request $request)
{
$request->validate([
'corporate_id' => 'required'
]);
$datas = FilesDoc::where('corporate_id', $request->corporate_id)
->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'status_download')
->orderBy('id', 'desc')
//->limit(1)
->get();
if ($datas->isEmpty()) {
return Helper::responseJson(data: [], message: 'Tidak ada data');
}
return Helper::responseJson(data: $datas, message: 'Berhasil mendapatkan data');
}
public function updateStatusFilesDoc(Request $request)
{
$request->validate([
'status_download' => 'required',
'corporate_id' => 'required'
]);
$data_requests = [
'status_download' => $request->status_download
];
FilesDoc::where('corporate_id', $request->corporate_id)
->update($data_requests);
$datas = FilesDoc::where('corporate_id', $request->corporate_id)
->select('status_download')
->orderBy('id', 'desc')
->limit(1)
->get();
return Helper::responseJson(data: $datas, message: 'Berhasil update status download menjadi '.($request->status_download == 0 ? 'Inactive' : 'Active'));
}
}

View File

@@ -116,6 +116,11 @@ Route::prefix('internal')->group(function () {
Route::get('corporates/{corporate_id}/formulariums', [CorporateFormulariumController::class, 'index']);
Route::put('corporates/{corporate_id}/formulariums/{formularium_id}/{action}', [CorporateFormulariumController::class, 'updateStatus']);
Route::controller(CorporateController::class)->group(function () {
Route::post('add-files-doc', 'addFilesDoc');
Route::post('get-files-doc', 'getFilesDoc');
Route::post('update-status-files-doc', 'updateStatusFilesDoc');
});
// Route::get('corporates/{corporate_id}/diagnosis-exclusions', [DiagnosisExclusionController::class, 'index']);
// Route::get('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']);

View File

@@ -43,6 +43,7 @@ class File extends Model
'claim-result' => 'claim/',
'claim-diagnosis' => 'claim/',
'claim-kondisi' => 'claim/',
'docs' => 'docs/',
];
public function fileable()

14
app/Models/FilesDoc.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class FilesDoc extends Model
{
use HasFactory;
protected $table = 'files_doc';
protected $primaryKey = 'id';
protected $fillable = ['corporate_id', 'original_name', 'path', 'created_by','updated_by', 'created_at', 'updated_at'];
}

View File

@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('files_doc', function (Blueprint $table) {
$table->increments('id');
$table->bigInteger('corporate_id');
$table->string('original_name', 255);
$table->string('path', 255);
$table->bigInteger('created_by');
$table->bigInteger('updated_by');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('files_doc');
}
};

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('files_doc', function (Blueprint $table) {
$table->tinyInteger('status_download')->default(0)->after('path');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('files_doc', function (Blueprint $table) {
$table->dropColumn('status_download');
});
}
};

View File

@@ -19,6 +19,10 @@ import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs';
import CorporateTabNavigations from './CorporateTabNavigations';
import { fCurrency } from '../../utils/formatNumber';
import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext';
import Iconify from '@/components/Iconify';
import { LoadingButton } from '@mui/lab';
import { makeFormData } from '@/utils/jsonToFormData';
import { enqueueSnackbar } from 'notistack';
export default function Corporates() {
const { themeStretch } = useSettings();
@@ -29,11 +33,90 @@ export default function Corporates() {
useEffect(() => {
setCorporate(configuredCorporateContext.currentCorporate);
}, [configuredCorporateContext])
getFilesDoc(corporate_id);
}, [configuredCorporateContext, corporate_id])
const headStyle = {
fontWeight: 'bold',
};
// Upload Docs
const fileDocsInput = useRef<HTMLInputElement>(null);
const [fileDocs, setFileDocs] = useState([]);
const [showAll, setShowAll] = useState(false);
const [isActive, setIsActive] = useState(false);
const handleDocsInputChange = (corporate_id) => (event) => {
if(event.target.files[0] && corporate_id)
{
const updatedFiles = Array.from(event.target.files).map((file) => ({
file
}));
submitUploadDocs(corporate_id, updatedFiles);
}
};
function submitUploadDocs(corporate_id, files)
{
if(files.length > 0)
{
files.map((file, index) => {
const formData = makeFormData(
{
corporate_id : corporate_id,
result_files : file['file']
}
);
axios
.post('/add-files-doc', formData)
.then((response) => {
getFilesDoc(corporate_id);
enqueueSnackbar(response.data.message, { variant: 'success' });
})
.catch((error) => {
enqueueSnackbar(error.response.data.errors[0], { variant: 'error' });
});
});
}
}
function getFilesDoc(corporate_id)
{
axios
.post('/get-files-doc',{corporate_id:corporate_id})
.then((response) => {
setFileDocs(response.data.data);
if(response.data.data[0]['status_download'] == 1)
{
setIsActive(!isActive);
}
else
{
setIsActive(isActive);
}
})
.catch((error) => {
enqueueSnackbar(error.response.data.errors[0], { variant: 'error' });
});
}
const toggleButton = () => {
setIsActive(!isActive);
let statusDownload = 0;
if(!isActive)
{
statusDownload = 1;
}
else
{
statusDownload = 0;
}
axios
.post('/update-status-files-doc', {status_download : statusDownload, corporate_id : corporate_id})
.then((response) => {
enqueueSnackbar(response.data.message, { variant: 'success' });
})
.catch((error) => {
enqueueSnackbar(error.response.data.errors[0], { variant: 'error' });
});
};
// End Upload Docs
return (
<Page title="Dashboard">
@@ -107,6 +190,114 @@ export default function Corporates() {
</TableBody>
</Table>
<Typography sx={{...headStyle, px:3, fontSize:'24px'}}>Docs (T&C)</Typography>
<Table>
<TableBody>
{fileDocs.length > 0 && (
<TableRow>
<TableCell sx={headStyle}>ASO members can download or not?</TableCell>
<TableCell sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center'}}>
<Button
variant="outlined"
color={isActive ? "success" : "error"}
size="small"
onClick={toggleButton}
>
{isActive ? 'Active' : 'Inactive'}
</Button>
</TableCell>
</TableRow>
)}
{fileDocs.slice(0, showAll ? fileDocs.length : 1).map((file, index) => (
<TableRow key={index}>
<TableCell sx={headStyle}>
<a
href={file.path} // Ganti URL sesuai kebutuhan Anda
style={{ cursor: 'pointer', textDecoration: 'underline' }}
target="_blank" // Untuk membuka tautan dalam tab baru
>
{file.original_name}
</a>
</TableCell>
{!showAll && (
<TableCell sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
<Stack>
<input
type="file"
id={`fileDocsID`}
ref={fileDocsInput}
style={{ display: 'none' }}
onChange={(event) => {
handleDocsInputChange(corporate_id)(event);
}}
accept="application/pdf"
multiple
/>
<Button
variant="outlined"
onClick={() => {
fileDocsInput.current.click();
}}
sx={{ width: 'fit-content' }}
>
<Iconify icon="eva:plus-fill" />
<span>Update Docs</span>
</Button>
</Stack>
</TableCell>
)}
</TableRow>
))}
{!showAll && fileDocs.length > 1 && (
<TableRow>
<TableCell>
<span onClick={() => setShowAll(true)} style={{ color: 'blue', cursor: 'pointer' }}>Lihat Semua Data</span>
</TableCell>
</TableRow>
)}
{showAll && (
<TableRow>
<TableCell>
<span onClick={() => setShowAll(false)} style={{ color: 'blue', cursor: 'pointer' }}>Sembunyikan Data</span>
</TableCell>
</TableRow>
)}
{fileDocs.length <= 0 && (
<TableRow>
<TableCell sx={headStyle}>Please add a Terms & Conditions document</TableCell>
<TableCell>
<Stack>
<input
type="file"
id={`fileDocsID`}
ref={fileDocsInput}
style={{ display: 'none' }}
onChange={(event) => {
handleDocsInputChange(corporate_id)(event);
}}
accept="application/pdf"
// multiple
/>
<LoadingButton
variant="outlined"
onClick={() => {
fileDocsInput.current.click();
}}
>
<Iconify icon="eva:plus-fill" />
<span>Add Docs</span>
</LoadingButton>
</Stack>
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
</Grid>
</Grid>