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\Response;
|
||||||
use Illuminate\Support\Facades\Storage;
|
use Illuminate\Support\Facades\Storage;
|
||||||
use Modules\Internal\Services\CorporateService;
|
use Modules\Internal\Services\CorporateService;
|
||||||
|
use App\Models\FilesDoc;
|
||||||
|
|
||||||
class CorporateController extends Controller
|
class CorporateController extends Controller
|
||||||
{
|
{
|
||||||
@@ -717,5 +718,69 @@ class CorporateController extends Controller
|
|||||||
|
|
||||||
return $corporates;
|
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::get('corporates/{corporate_id}/formulariums', [CorporateFormulariumController::class, 'index']);
|
||||||
Route::put('corporates/{corporate_id}/formulariums/{formularium_id}/{action}', [CorporateFormulariumController::class, 'updateStatus']);
|
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', [DiagnosisExclusionController::class, 'index']);
|
||||||
// Route::get('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']);
|
// Route::get('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']);
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class File extends Model
|
|||||||
'claim-result' => 'claim/',
|
'claim-result' => 'claim/',
|
||||||
'claim-diagnosis' => 'claim/',
|
'claim-diagnosis' => 'claim/',
|
||||||
'claim-kondisi' => 'claim/',
|
'claim-kondisi' => 'claim/',
|
||||||
|
'docs' => 'docs/',
|
||||||
];
|
];
|
||||||
|
|
||||||
public function fileable()
|
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 CorporateTabNavigations from './CorporateTabNavigations';
|
||||||
import { fCurrency } from '../../utils/formatNumber';
|
import { fCurrency } from '../../utils/formatNumber';
|
||||||
import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext';
|
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() {
|
export default function Corporates() {
|
||||||
const { themeStretch } = useSettings();
|
const { themeStretch } = useSettings();
|
||||||
@@ -29,11 +33,90 @@ export default function Corporates() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setCorporate(configuredCorporateContext.currentCorporate);
|
setCorporate(configuredCorporateContext.currentCorporate);
|
||||||
}, [configuredCorporateContext])
|
getFilesDoc(corporate_id);
|
||||||
|
}, [configuredCorporateContext, corporate_id])
|
||||||
|
|
||||||
const headStyle = {
|
const headStyle = {
|
||||||
fontWeight: 'bold',
|
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 (
|
return (
|
||||||
<Page title="Dashboard">
|
<Page title="Dashboard">
|
||||||
|
|
||||||
@@ -107,6 +190,114 @@ export default function Corporates() {
|
|||||||
</TableBody>
|
</TableBody>
|
||||||
</Table>
|
</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>
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
Reference in New Issue
Block a user