update qrcodes

This commit is contained in:
ygbanzato 2024-12-09 08:21:37 +00:00
parent 580809be26
commit bb616e62b5
11 changed files with 530 additions and 208 deletions

View File

@ -1218,6 +1218,7 @@ public function receiveIdEquipment(Equipment $equipment)
public function processStep2(Request $request)
{
// Valide e processe os dados do formulário
$file = $request->file('documento');

View File

@ -18,6 +18,7 @@
use App\Models\Unit;
use App\Models\AmbitsEquipment;
use Illuminate\Support\Facades\Auth;
use App\Services\PdfWrapper;
// use PDF;
@ -174,23 +175,12 @@ public function showAllEquipmentsInProjectForQrCode($projectId)
}
// public function showDetailsEquipmentForQrCode($equipmentId, $projectId)
// {
// $detailsEquipment = Equipment::find($equipmentId);
// // Gera o QR Code
// $qrCode = new QrCode($detailsEquipment->equipment_tag);
// $writer = new PngWriter();
// // Converte o QR Code para base64 para incorporar na página
// $qrCodeImage = 'data:image/png;base64,' . base64_encode($writer->write($qrCode)->getString());
// $detailsCompanyProject = CompanyProject::find($projectId);
// $detailsPlant = Plant::where('plant_id', $detailsCompanyProject->plant_id)->first();
// $detailsCompany= Company::where('company_id', $detailsPlant->company_id)->first();
// $detailsCompany = Company::where('company_id', $detailsPlant->company_id)->first();
// $logoPath = public_path('companies_logo/' . ($detailsCompany->company_logo ?: 'logoISPT4.0.jpg'));
// if (!file_exists($logoPath)) {
@ -198,61 +188,94 @@ public function showAllEquipmentsInProjectForQrCode($projectId)
// }
// $associatedEquipments = QrcodesAssociatedEquipment::where('equipment_id', $detailsEquipment->equipment_id)->get();
// $associatedArray = [];
// $qrCodeImages = [];
// foreach ($associatedEquipments as $associatedEquipment) {
// $associatedArray[$associatedEquipment->id] = $associatedEquipment->component_tag;
// $qrCode = new QrCode($associatedEquipment->component_tag);
// $writer = new PngWriter();
// $qrCodeImages[$associatedEquipment->id] = 'data:image/png;base64,' . base64_encode($writer->write($qrCode)->getString());
// }
// $html = view('projectsClients.showDetailsEquipmentForQrCodePdf', [
// 'detailsEquipment' => $detailsEquipment,
// 'logoPath' => $logoPath,
// 'qrCodeImage' => $qrCodeImage,
// 'qrCodeImages' => $qrCodeImages,
// 'associatedArray' => $associatedArray
// ])->render();
// // Define a orientação da folha como horizontal (Landscape)
// $mpdf = new \Mpdf\Mpdf([
// 'mode' => 'utf-8',
// 'format' => 'A4' // Define o formato como A4 e orientação como Landscape (horizontal)
// ]);
// $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => 'A4']);
// $mpdf->WriteHTML($html);
// $mpdf->Output('nome_do_arquivo.pdf', 'I');
// }
public function showDetailsEquipmentForQrCode($equipmentId, $projectId)
{
// Busca os detalhes do equipamento, projeto e empresa
$detailsEquipment = Equipment::find($equipmentId);
$detailsCompanyProject = CompanyProject::find($projectId);
$detailsPlant = Plant::where('plant_id', $detailsCompanyProject->plant_id)->first();
$detailsCompany = Company::where('company_id', $detailsPlant->company_id)->first();
// Definir o caminho da logo da empresa
$logoPath = public_path('companies_logo/' . ($detailsCompany->company_logo ?: 'logoISPT4.0.jpg'));
// Verificar se o caminho do logo existe, se não, usa um logo padrão
if (!file_exists($logoPath)) {
$logoPath = public_path('companies_logo/logoISPT4.0.jpg');
}
$isptLogoPath = public_path('/img/ispt/ispt.jpg');
// Associar equipamentos ao QR Code
$associatedEquipments = QrcodesAssociatedEquipment::where('equipment_id', $detailsEquipment->equipment_id)->get();
$associatedArray = [];
$qrCodeImages = [];
// Gerar QR Codes para cada equipamento associado
foreach ($associatedEquipments as $associatedEquipment) {
$associatedArray[$associatedEquipment->id] = $associatedEquipment->component_tag;
// Extrair o texto após o '@'
$componentParts = explode('@', $associatedEquipment->component_tag);
$associatedArray[$associatedEquipment->id] = isset($componentParts[1]) ? $componentParts[1] : $associatedEquipment->component_tag;
// Gerar QR Code
$qrCode = new QrCode($associatedEquipment->component_tag);
$writer = new PngWriter();
// Converter o QR Code para imagem base64
$qrCodeImages[$associatedEquipment->id] = 'data:image/png;base64,' . base64_encode($writer->write($qrCode)->getString());
}
$html = view('projectsClients.showDetailsEquipmentForQrCodePdf', [
// dd($detailsEquipment->equipmentType->equipment_type_id);
return view('projectsClients.showDetailsEquipmentForQrCodePdf', [
'detailsEquipment' => $detailsEquipment,
'logoPath' => $logoPath,
'qrCodeImages' => $qrCodeImages,
'associatedArray' => $associatedArray
])->render();
'associatedArray' => $associatedArray,
'isptLogoPath'=> $isptLogoPath
]);
// // Usar PdfWrapper para gerar o PDF
// $pdfWrapper = new PdfWrapper();
// // Gera e retorna o PDF com os detalhes e QR Codes
// return $pdfWrapper
// ->loadView('projectsClients.showDetailsEquipmentForQrCodePdf', [
// 'detailsEquipment' => $detailsEquipment,
// 'logoPath' => $logoPath,
// 'qrCodeImages' => $qrCodeImages,
// 'associatedArray' => $associatedArray,
// 'isptLogoPath'=> $isptLogoPath
// ])
// ->setOrientation('landscape')
// ->stream('nome_do_arquivo.pdf'); // Exibe o PDF diretamente no navegador
$mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => 'A4']);
$mpdf->WriteHTML($html);
$mpdf->Output('nome_do_arquivo.pdf', 'I');
}
@ -306,7 +329,7 @@ public function PreparedProject($ProjectId)
->with('units', $checkUnits)
->with('numberProject', $numberProject)
->with('equipmentsProjects', $equipmentsProjects);
}
public function getAmbits($equipmentType)

View File

@ -21,9 +21,6 @@
use ZipArchive;
use Yajra\DataTables\Facades\DataTables;
use Carbon\Carbon;

View File

@ -43,13 +43,6 @@ public function specificAttributes()
->orderBy('general_attributes_equipaments.general_attributes_equipment_description', 'asc');
}
//Trocar para EquipmentWorkHistory
public function equipmentAssociationAmbit()
{
//Antiga hasMany , apenas colocado hasOne para funcionar o datatables
return $this->hasOne(EquipmentAssociationAmbit::class, 'equipment_id', 'equipment_id');
}
public function orderEquipmentTasks()
{
return $this->hasMany(OrderEquipmentTasks::class, 'equipment_id', 'equipment_id');

View File

@ -25,4 +25,8 @@ public function Equipment(){
return $this->belongsTo(Equipment::class,'equipment_id', 'equipment_id');
}
public function equipmentWorkHistory()
{
return $this->belongsTo(EquipmentWorkHistory::class, 'equipmentWorkHistorys_id', 'equipmentWorkHistorys_id');
}
}

View File

@ -10,12 +10,20 @@ class PdfWrapper
{
protected Browsershot $pdfGenerator;
protected string $html;
protected $orientation = 'portrait';
public function __construct()
{
$this->pdfGenerator = new Browsershot();
}
// Método para configurar a orientação (paisagem ou retrato)
public function setOrientation($orientation): self
{
$this->orientation = $orientation;
return $this;
}
// Load view and render HTML
public function loadView(string $bladeFile, array $data = []): self
{
@ -50,6 +58,7 @@ public function generate(): Browsershot
return $this->pdfGenerator
->html($this->html)
->format('A4')
->landscape($this->orientation === 'landscape') // Verifica se deve ser paisagem
->scale(0.7)
->fullPage()
->setOption('printBackground', true)

View File

@ -0,0 +1,176 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.page-break {
page-break-before: always;
}
.box-pai {
width: 50%;
margin: 2mm;
float: left;
width: 65mm;
height: 95mm;
border: 3px solid #09255C;
}
.row {
background-color: #09255C;
height: 11mm;
}
.col {
width: 32.50%;
float: left;
}
.col2 {
width: 35%;
float: left;
}
.col2-img {
width: 40%;
float: left;
}
.col-1 {
margin-top: 2mm;
color: #09255C;
padding-left: 2mm;
}
.col-2 {
color: #09255C;
margin-left: 10mm;
padding-left: 6mm;
}
.col-1-img {
margin-top: 2mm;
margin-right: 20mm;
}
.col-2-img {
margin-left: 11mm;
padding-left: 10mm;
}
.col-center {
padding-top: 4mm;
color: #fff;
}
.circle {
margin-top: 1mm;
width: 8mm;
height: 8mm;
/* border: 1px solid blue; */
background-color: #fff;
border-radius: 50%;
}
.img-logo {
margin-top: 0.5mm;
padding-left: 11mm;
width: 10mm;
height: 10mm;
}
.qr-code {
margin-top: 1mm;
margin-left: 13mm;
width: 40mm;
height: 40mm;
}
.title-tag {
margin-left: 20mm;
font-size: 5mm;
}
.type-tag {
margin-left: 25mm;
}
.img-company {
margin-top: 4mm;
padding-left: 3mm;
width: 15mm;
height: 15mm;
}
.img-istp {
margin-top: 4mm;
width: 15mm;
height: 15mm;
}
</style>
</head>
<body>
@php $contador = 0; @endphp
@foreach ($associatedArray as $id => $componentTag)
<!-- Como cada pagina A4 so tem espaco para 4 cartoes, quando chega no 4 a pagina quebra para a proxima-->
@if ($contador % 4 == 0 && $contador != 0)
<div class="page-break"></div>
@endif
@php
$parts = explode('@', $componentTag);
$tagName = $parts[0]; // a parte antes do '@'
$tagType = $parts[1]; // a parte depois do '@'
@endphp
<div class="box-pai">
<div class="row">
<div class="col">
<div class="circle"></div>
</div>
<div class="col col-center">
ISPT 4.0
</div>
<div class="col">
<img class="img-logo"
src="{{ public_path('/img/ispt/4.0/Ispt4.0_Símbolo_Fundo_Azul-Marinho@2x-100.jpg') }}"
alt="Logo Esquerdo">
</div>
</div>
<div class="box-principal">
<img class="qr-code" src="{{ $qrCodeImages[$id] }}" alt="QR Code">
<div class="title-tag"><b>Tag :</b> {{ $tagName }}</div>
<div class="type-tag">{{$tagType}}</div>
<div class="col2 col-1">{{ $detailsEquipment->equipmentType->equipment_type_name }}</div>
<div class="col2 col-2">{{ $detailsEquipment->unit->unit_name }}</div>
<div class="col2-img col-1-img">
<img class="img-company" src="{{ public_path('/img/ispt/ispt.jpg') }}"
alt="Logo Esquerdo">
</div>
<div class="col2-img col-2-img">
<img class="img-istp" src="{{ $logoPath }}" alt="Logo da Empresa">
</div>
</div>
</div>
@php $contador++; @endphp
@endforeach
</body>
</html>

View File

@ -4,113 +4,27 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<title>Card Example</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
.page-break {
page-break-before: always;
@page {
margin-top: 15mm;
margin-bottom: 15mm;
margin-left: 15mm;
margin-right: 15mm;
}
.box-pai {
width: 50%;
margin: 2mm;
float: left;
width: 65mm;
height: 95mm;
border: 3px solid #09255C;
}
.row {
background-color: #09255C;
height: 11mm;
}
.col {
width: 32.50%;
float: left;
}
.col2 {
width: 35%;
float: left;
}
.col2-img {
width: 40%;
float: left;
}
.col-1 {
margin-top: 2mm;
color: #09255C;
padding-left: 2mm;
}
.col-2 {
color: #09255C;
margin-left: 10mm;
padding-left: 6mm;
}
.col-1-img {
margin-top: 2mm;
margin-right: 20mm;
}
.col-2-img {
margin-left: 11mm;
padding-left: 10mm;
}
.col-center {
padding-top: 4mm;
color: #fff;
}
.circle {
margin-top: 1mm;
width: 8mm;
height: 8mm;
/* border: 1px solid blue; */
background-color: #fff;
border-radius: 50%;
}
.img-logo {
margin-top: 0.5mm;
padding-left: 11mm;
width: 10mm;
height: 10mm;
}
.qr-code {
margin-top: 1mm;
margin-left: 13mm;
width: 40mm;
height: 40mm;
}
.title-tag {
margin-left: 20mm;
font-size: 5mm;
}
.type-tag {
margin-left: 25mm;
}
.img-company {
margin-top: 4mm;
padding-left: 3mm;
width: 15mm;
height: 15mm;
.card-layout {
font-size: 10px;
/* width: 80mm;
height: 45mm; */
width: 115mm;
height: 65mm;
display: flex;
flex-direction: column;
/* Organiza os filhos verticalmente */
border: 1px solid black;
}
.img-istp {
@ -118,59 +32,290 @@
width: 15mm;
height: 15mm;
}
</style>
.card-header {
flex-basis: 40%;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
padding: 0;
/* Remove qualquer padding adicional */
}
.title-card {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100%;
}
.card-footer {
flex-basis: 60%;
display: flex;
flex-direction: column;
/* Stack rows vertically */
justify-content: space-between;
/* Distribute space evenly */
text-align: center;
}
.card-footer .row {
width: 100%;
height: 100%;
margin-left: 0.4px;
/* flex-grow: 1; */
/* Make each row grow equally to fill the space */
display: flex;
justify-content: center;
align-items: center;
border: 1px solid gray;
/* Optional: add some separation between rows */
}
.qr-code {
/* margin-top: 5px; */
width: 15mm;
height: 15mm;
}
.tag-name-qrcode {
font-size: 10px;
margin: 0;
padding: 0;
}
.img-company {
margin-top: 7px;
width: 12mm;
height: 12mm;
}
.blue {
background-color: #09255C;
color: white;
/* border-radius: 5px; */
display: flex;
justify-content: center;
align-items: center;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
font-weight: bold;
}
.gray {
background-color: #EAF3F6;
color: black;
/* border-radius: 5px; */
display: flex;
justify-content: center;
align-items: center;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
font-weight: bold;
}
.dark-blue {
background-color: #00B0EA;
color: white;
/* border-radius: 5px; */
display: flex;
justify-content: center;
align-items: center;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
font-weight: bold;
}
</style>
</head>
<body>
@php $contador = 0; @endphp
@foreach ($associatedArray as $id => $componentTag)
<!-- Como cada pagina A4 so tem espaco para 4 cartoes, quando chega no 4 a pagina quebra para a proxima-->
@if ($contador % 4 == 0 && $contador != 0)
<div class="page-break"></div>
@endif
@php
$parts = explode('@', $componentTag);
$tagName = $parts[0]; // a parte antes do '@'
$tagType = $parts[1]; // a parte depois do '@'
@endphp
<div class="box-pai">
<div class="row">
<div class="col">
<div class="circle"></div>
@foreach ($associatedArray as $key => $value)
<!-- psv -->
@if ($detailsEquipment->equipmentType->equipment_type_id == 3)
<div class="card-layout" style="border:1px solid black">
<div class="card-header">
<div class="row" style="width: 100%; height:100%;">
<div class="col-sm p-0 " style="border: 1px solid gray;">
<div class="col-sm">
<img class="img-company" src="{{ $isptLogoPath }}" alt="Logo da Empresa">
</div>
<div class="col-sm">
<img class="img-company" src="{{ $logoPath }}" alt="Logo da Empresa">
</div>
</div>
<div class="col-sm-6 p-0 title-card blue" style="border: 1px solid gray;">
<div class="col-sm " style="padding-top: 15px;">Paragem ###</div>
<div class="col-sm">N.Ispt ###</div>
<div class="col-sm">Tag ###</div>
</div>
<div class="col-sm p-0" style="border: 1px solid gray;">
<div class="col-sm">
<img class="qr-code" src="{{ $qrCodeImages[$key] }}" alt="QR Code">
</div>
<div class="col-sm">
<p class="tag-name-qrcode">{{ $associatedArray[$key] }}</p>
</div>
</div>
</div>
</div>
<div class="col col-center">
ISPT 4.0
</div>
<div class="col">
<img class="img-logo"
src="{{ public_path('/img/ispt/4.0/Ispt4.0_Símbolo_Fundo_Azul-Marinho@2x-100.jpg') }}"
alt="Logo Esquerdo">
<!-- .Card-header -->
<div class="card-footer">
<div class="row">
<div class="col-sm-4 blue">Dim.Ent:</div>
<div class="col-sm">###</div>
</div>
<div class="row">
<div class="col-sm-4 blue">Dim.Sai:</div>
<div class="col-sm">###</div>
</div>
<div class="row">
<div class="col-sm-4 blue">Equip:</div>
<div class="col-sm">###</div>
</div>
<div class="row">
<div class="col-sm-2 blue" style="padding-right: 1px;">T.Fluido:</div>
<div class="col-sm-2">N/A</div>
<div class="col-sm-2 blue">Pressao:</div>
<div class="col-sm-2">N/A</div>
<div class="col-sm-2 blue">C.Pressao</div>
<div class="col-sm-2">##</div>
</div>
<div class="row">
<div class="col-sm-2 blue" style="padding-right: 0.5px;">T.Val:</div>
<div class="col-sm-2">PSV</div>
<div class="col-sm-2 blue">Ambito:</div>
<div class="col-sm-2">##</div>
<div class="col-sm-2 blue">Area:</div>
<div class="col-sm-2">N/A</div>
</div>
</div>
<!-- .Card-footer -->
</div>
<div class="box-principal">
<img class="qr-code" src="{{ $qrCodeImages[$id] }}" alt="QR Code">
<div class="title-tag"><b>Tag :</b> {{ $tagName }}</div>
<div class="type-tag">{{$tagType}}</div>
<!-- .Card-layout -->
<div class="col2 col-1">{{ $detailsEquipment->equipmentType->equipment_type_name }}</div>
<div class="col2 col-2">{{ $detailsEquipment->unit->unit_name }}</div>
<div class="col2-img col-1-img">
<img class="img-company" src="{{ public_path('/img/ispt/ispt.jpg') }}"
alt="Logo Esquerdo">
<!-- CV -->
@elseif($detailsEquipment->equipmentType->equipment_type_id == 1)
<div class="card-layout" style="border:1px solid black">
<div class="card-header">
<div class="row" style="width: 100%; height:100%;">
<div class="col-sm p-0 " style="border: 1px solid gray;">
<div class="col-sm">
<img class="img-company" src="{{ $isptLogoPath }}" alt="Logo da Empresa">
</div>
<div class="col-sm">
<img class="img-company" src="{{ $logoPath }}" alt="Logo da Empresa">
</div>
</div>
<div class="col-sm-6 p-0 title-card gray" style="border: 1px solid gray;">
<div class="col-sm " style="padding-top: 15px;">Paragem ###</div>
<div class="col-sm">N.Ispt ###</div>
<div class="col-sm">Tag ###</div>
</div>
<div class="col-sm p-0" style="border: 1px solid gray;">
<div class="col-sm">
<img class="qr-code" src="{{ $qrCodeImages[$key] }}" alt="QR Code">
</div>
<div class="col-sm">
<p class="tag-name-qrcode">{{ $associatedArray[$key] }}</p>
</div>
</div>
</div>
</div>
<div class="col2-img col-2-img">
<img class="img-istp" src="{{ $logoPath }}" alt="Logo da Empresa">
<!-- .Card-header -->
<div class="card-footer">
<div class="row">
<div class="col-sm-6 gray" style="width: 50%;">Dim.Ent:</div>
<div class="col-sm">###</div>
</div>
<div class="row">
<div class="col-sm-6 gray">Equip:</div>
<div class="col-sm">###</div>
</div>
<div class="row">
<div class="col-sm-2 gray" style="padding-right: 1px;">T.Fluido:</div>
<div class="col-sm-2">N/A</div>
<div class="col-sm-2 gray">Pressao:</div>
<div class="col-sm-2">N/A</div>
<div class="col-sm-2 gray">C.Pressao</div>
<div class="col-sm-2">##</div>
</div>
<div class="row">
<div class="col-sm-2 gray" style="padding-right: 0.5px;">T.Val:</div>
<div class="col-sm-2">CV</div>
<div class="col-sm-2 gray">Ambito:</div>
<div class="col-sm-2">##</div>
<div class="col-sm-2 gray">Area:</div>
<div class="col-sm-2">N/A</div>
</div>
</div>
<!-- .Card-footer -->
</div>
</div>
@php $contador++; @endphp
@endforeach
<!-- ISV -->
@elseif($detailsEquipment->equipmentType->equipment_type_id == 2)
<div class="card-layout" style="border:1px solid black">
<div class="card-header">
<div class="row" style="width: 100%; height:100%;">
<div class="col-sm p-0 " style="border: 1px solid gray;">
<div class="col-sm">
<img class="img-company" src="{{ $isptLogoPath }}" alt="Logo da Empresa">
</div>
<div class="col-sm">
<img class="img-company" src="{{ $logoPath }}" alt="Logo da Empresa">
</div>
</div>
<div class="col-sm-6 p-0 title-card dark-blue" style="border: 1px solid gray;">
<div class="col-sm " style="padding-top: 15px;">Paragem ###</div>
<div class="col-sm">N.Ispt ###</div>
<div class="col-sm">Tag ###</div>
</div>
<div class="col-sm p-0" style="border: 1px solid gray;">
<div class="col-sm">
<img class="qr-code" src="{{ $qrCodeImages[$key] }}" alt="QR Code">
</div>
<div class="col-sm">
<p class="tag-name-qrcode">{{ $associatedArray[$key] }}</p>
</div>
</div>
</div>
</div>
<!-- .Card-header -->
<div class="card-footer">
<div class="row" ">
<div class="col-sm-6 dark-blue" style="margin: 0;padding:0;background-color:blue;">Dim.Ent:</div>
<div class="col-sm">###</div>
</div>
<div class="row">
<div class="col-sm-6 dark-blue">Equip:</div>
<div class="col-sm">###</div>
</div>
<div class="row">
<div class="col-sm-2 dark-blue" style="padding-right: 1px;">T.Fluido:</div>
<div class="col-sm-2">N/A</div>
<div class="col-sm-2 dark-blue">Pressao:</div>
<div class="col-sm-2">N/A</div>
<div class="col-sm-2 dark-blue">C.Pressao</div>
<div class="col-sm-2">##</div>
</div>
<div class="row">
<div class="col-sm-2 dark-blue" style="padding-right: 0.5px;">T.Val:</div>
<div class="col-sm-2">ISV</div>
<div class="col-sm-2 dark-blue">Ambito:</div>
<div class="col-sm-2">##</div>
<div class="col-sm-2 dark-blue">Area:</div>
<div class="col-sm-2">N/A</div>
</div>
</div>
<!-- .Card-footer -->
</div>
@endif
@endforeach
</body>
</html>

View File

@ -1,6 +0,0 @@
#!/usr/bin/env bash
mysql --user=root --password="$MYSQL_ROOT_PASSWORD" <<-EOSQL
CREATE DATABASE IF NOT EXISTS testing;
GRANT ALL PRIVILEGES ON \`testing%\`.* TO '$MYSQL_USER'@'%';
EOSQL

View File

@ -1,20 +0,0 @@
mysql:
image: 'mysql/mysql-server:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 1
volumes:
- 'sail-mysql:/var/lib/mysql'
- './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
retries: 3
timeout: 5s