Files
expense/app/Helpers/DocxHelper.php
T

145 lines
5.4 KiB
PHP
Raw Normal View History

2024-12-02 01:18:34 +07:00
<?php
namespace App\Helpers;
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\TemplateProcessor;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Dompdf\Dompdf;
use Dompdf\Options;
class DocxHelper
{
/**
* Edit prefix dalam file DOCX dan konversi menjadi PDF.
*
* @param string $filePath Path file DOCX asli.
* @param array $prefixes Array pasangan placeholder dan value untuk mengganti teks dalam DOCX.
* @param string $outputPdfPath Path output untuk menyimpan PDF.
* Contoh: ['PREFIX_PLACEHOLDER_1' => 'NewPrefix1', ...]
* @return string Path dari file PDF yang dihasilkan.
*
*/
public static function parsePrefix($filePath, array $prefixes)
{
$templateProcessor = new TemplateProcessor($filePath);
foreach ($prefixes as $placeholder => $value) {
if($value[1] == 'TEXT'){
$templateProcessor->setValue($placeholder, $value[0]);
}
if($value[1] == 'IMAGE'){
if (file_exists(storage_path('app/signature/'.$value[0]))) {
$templateProcessor->setImageValue(str_replace(['${', '}'], '', $placeholder), array('path' => storage_path('app/signature/'.$value[0]), 'width' => 50, 'height' => 50, 'ratio' => true));
}
}
}
$docx_temp_name = pathinfo($filePath, PATHINFO_FILENAME) . '.docx'; // Nama unik untuk file sementara
if (!file_exists(storage_path('app/public/uploads/temp_docx'))) {
mkdir(storage_path('app/public/uploads/temp_docx'), 0777, true);
}
$editedDocxPath = storage_path('app/public/uploads/temp_docx/' . $docx_temp_name);
$templateProcessor->saveAs($editedDocxPath);
return $editedDocxPath;
}
/**
* Konversi file DOCX yang telah diedit prefix menjadi PDF.
*
* @param array $prefixes Array pasangan placeholder dan value untuk mengganti teks dalam DOCX.
* @param string $docx_path Path file DOCX yang akan diconvert.
* @param string $pdf_path Path output untuk menyimpan PDF.
* @return string Path file PDF yang dihasilkan.
*/
public static function ConvertPDFWithPrefix($prefixes,$docx_path,$pdf_path)
{
$inputFilePath = DocxHelper::parsePrefix($docx_path, $prefixes);
$libreOfficePath = env('LIBREOFFICE_PATH');
$command = '"'.$libreOfficePath.'" --headless --convert-to pdf "'.$inputFilePath.'" --outdir "'.dirname($pdf_path).'"';
$output = [];
$returnVar = 0;
exec($command, $output, $returnVar);
if ($returnVar !== 0) {
dd('failed to convert PDF File. Return Code: '.$returnVar);
} else {
$pathInfo = pathinfo($inputFilePath);
$newExtension = 'pdf';
$outputFilePath = dirname($pdf_path) . DIRECTORY_SEPARATOR . $pathInfo['filename'] . '.' . $newExtension;
}
return $outputFilePath;
}
/**
* Inserts a new record into the MS_PREFIX_DOCUMENT table with the provided details.
*
* @param int $documentId The ID of the document.
* @param string $prefixKey The prefix key associated with the document.
* @param string $tableName The name of the table where the prefix is applied.
* @param string $columnName The name of the column where the prefix is applied.
* @param string $createdBy The identifier of the user who created the record.
* @param string $updatedBy The identifier of the user who last updated the record.
* @return bool Returns true if the record was successfully inserted, false otherwise.
*/
public static function createPrefixDocument($documentId, $prefixKey, $tableName, $columnName, $createdBy, $updatedBy) {
$result = DB::table('MS_PREFIX_DOCUMENT')->insert([
'DOCUMENT_ID' => $documentId,
'PREFIX_KEY' => $prefixKey,
'TABLE_NAME' => $tableName,
'COLUMN_NAME' => $columnName,
'CREATED_BY' => $createdBy,
'UPDATED_BY' => $updatedBy,
'CREATED_AT' => now(),
'UPDATED_AT' => now()
]);
return (bool) $result;
}
/**
* Retrieves the prefix mappings for a given document ID from the MS_PREFIX_DOCUMENT table.
*
* This function queries the database to obtain prefix mappings associated with the provided
* document ID. It then retrieves the corresponding values from the specified tables and columns
* for each mapping. If a value is not found, 'N/A' is used as a default.
* buatkan sebuah view yang telah di join table untuk menjalankan fungsi ini.
* @param string $documentId The ID of the document for which to retrieve prefix mappings.
* @return array An associative array of prefix keys and their corresponding values.
*/
public static function getDocumentPrefixWithData($documentId,$dataId) {
$prefixes = [];
$mappings = DB::table('MS_PREFIX_DOCUMENT')
->where('DOCUMENT_ID', $documentId)
->get();
foreach ($mappings as $mapping) {
$value = DB::table($mapping->table_name)
->where('ID', $dataId)
->value($mapping->column_name);
$prefixes[$mapping->prefix_key] = array($value !== null ? $value : '', $mapping->type) ;
}
return $prefixes;
}
}