LMSN-188
LMS dapat upload dokumen TC corporate
This commit is contained in:
@@ -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
|
||||
{
|
||||
@@ -717,5 +718,69 @@ 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'));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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']);
|
||||
|
||||
@@ -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
14
app/Models/FilesDoc.php
Normal 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'];
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
};
|
||||
@@ -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');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user