150 lines
5.7 KiB
PHP
150 lines
5.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
final class DocumentsController
|
|
{
|
|
public static function blankAdoption(): void
|
|
{
|
|
$format = ($_GET['format'] ?? 'odt') === 'pdf' ? 'pdf' : 'odt';
|
|
$path = DocumentsService::adoptionTemplate();
|
|
$generated = null;
|
|
if ($format === 'pdf') {
|
|
$dir = sys_get_temp_dir() . '/globinours-doc-' . bin2hex(random_bytes(8));
|
|
mkdir($dir, 0775, true);
|
|
$odt = $dir . '/contrat-adoption-vierge.odt';
|
|
copy($path, $odt);
|
|
$path = DocumentsService::toPdf($odt);
|
|
$generated = $path;
|
|
}
|
|
self::send($path, 'contrat-adoption-vierge.' . $format, $format, $generated);
|
|
}
|
|
|
|
public static function blank(): void
|
|
{
|
|
$type = (string) ($_GET['type'] ?? '');
|
|
$names = [
|
|
'adoption' => 'contrat-adoption',
|
|
'abandon' => 'abandon-trouvaille',
|
|
'benevole' => 'contrat-benevole',
|
|
'fa' => 'proposition-fa',
|
|
'pre_adoption' => 'certificat-visite-pre-adoption',
|
|
];
|
|
if (!isset($names[$type])) {
|
|
http_response_code(404);
|
|
return;
|
|
}
|
|
$format = ($_GET['format'] ?? 'odt') === 'pdf' ? 'pdf' : 'odt';
|
|
$source = DocumentsService::template($type);
|
|
$dir = sys_get_temp_dir() . '/globinours-doc-' . bin2hex(random_bytes(8));
|
|
mkdir($dir, 0775, true);
|
|
$odt = $dir . '/' . $names[$type] . '-vierge.odt';
|
|
copy($source, $odt);
|
|
$path = $format === 'pdf' ? DocumentsService::toPdf($odt) : $odt;
|
|
self::send($path, $names[$type] . '-vierge.' . $format, $format, $path);
|
|
}
|
|
|
|
public static function adoption(): void
|
|
{
|
|
$id = (int) ($_GET['animal_id'] ?? 0);
|
|
if ($id <= 0) {
|
|
http_response_code(400);
|
|
return;
|
|
}
|
|
$db = DB::pdo();
|
|
$stmt = $db->prepare('SELECT * FROM animals WHERE id=:id AND deleted_at IS NULL');
|
|
$stmt->execute([':id' => $id]);
|
|
$animal = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
if (!$animal) {
|
|
http_response_code(404);
|
|
return;
|
|
}
|
|
$stmt = $db->prepare('SELECT * FROM adoptions WHERE animal_id=:id ORDER BY id DESC LIMIT 1');
|
|
$stmt->execute([':id' => $id]);
|
|
$adoption = $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
|
|
$stmt = $db->prepare(
|
|
'SELECT done_date,due_date FROM vaccinations WHERE animal_id=:id ORDER BY done_date DESC,id DESC LIMIT 1',
|
|
);
|
|
$stmt->execute([':id' => $id]);
|
|
$vaccine = $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
|
|
$format = ($_GET['format'] ?? 'pdf') === 'odt' ? 'odt' : 'pdf';
|
|
$odt = DocumentsService::generateAdoption($animal, $adoption, $vaccine);
|
|
$path = $format === 'pdf' ? DocumentsService::toPdf($odt) : $odt;
|
|
self::send(
|
|
$path,
|
|
'contrat-adoption-' . self::safeName((string) $animal['name']) . '.' . $format,
|
|
$format,
|
|
$path,
|
|
);
|
|
}
|
|
|
|
public static function abandon(): void
|
|
{
|
|
$id = (int) ($_GET['animal_id'] ?? 0);
|
|
$db = DB::pdo();
|
|
$stmt = $db->prepare('SELECT * FROM animals WHERE id=:id AND deleted_at IS NULL');
|
|
$stmt->execute([':id' => $id]);
|
|
$animal = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
if (!$animal) {
|
|
http_response_code(404);
|
|
return;
|
|
}
|
|
$format = ($_GET['format'] ?? 'pdf') === 'odt' ? 'odt' : 'pdf';
|
|
$odt = DocumentsService::generateAbandon($animal);
|
|
$path = $format === 'pdf' ? DocumentsService::toPdf($odt) : $odt;
|
|
self::send(
|
|
$path,
|
|
'abandon-trouvaille-' . self::safeName((string) $animal['name']) . '.' . $format,
|
|
$format,
|
|
$path,
|
|
);
|
|
}
|
|
|
|
public static function contact(): void
|
|
{
|
|
$id = (int) ($_GET['contact_id'] ?? 0);
|
|
$type = (string) ($_GET['type'] ?? '');
|
|
$role = $type === 'benevole' ? 'benevole' : ($type === 'fa' ? 'fa' : null);
|
|
if (!$role) {
|
|
http_response_code(400);
|
|
return;
|
|
}
|
|
$db = DB::pdo();
|
|
$stmt = $db->prepare(
|
|
'SELECT dc.* FROM directory_contacts dc JOIN directory_contact_roles r ON r.contact_id=dc.id AND r.role=:role WHERE dc.id=:id AND dc.deleted_at IS NULL',
|
|
);
|
|
$stmt->execute([':role' => $role, ':id' => $id]);
|
|
$contact = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
if (!$contact) {
|
|
http_response_code(404);
|
|
return;
|
|
}
|
|
$format = ($_GET['format'] ?? 'pdf') === 'odt' ? 'odt' : 'pdf';
|
|
$odt = DocumentsService::generateContact($type, $contact);
|
|
$path = $format === 'pdf' ? DocumentsService::toPdf($odt) : $odt;
|
|
self::send($path, $type . '-' . self::safeName((string) $contact['name']) . '.' . $format, $format, $path);
|
|
}
|
|
|
|
private static function send(string $path, string $filename, string $format, ?string $cleanup): void
|
|
{
|
|
if (!is_file($path)) {
|
|
http_response_code(500);
|
|
return;
|
|
}
|
|
header('Content-Type: ' . ($format === 'pdf' ? 'application/pdf' : 'application/vnd.oasis.opendocument.text'));
|
|
header('Content-Length: ' . filesize($path));
|
|
header(
|
|
'Content-Disposition: ' . ($format === 'pdf' ? 'inline' : 'attachment') . '; filename="' . $filename . '"',
|
|
);
|
|
readfile($path);
|
|
if ($cleanup) {
|
|
DocumentsService::cleanup($cleanup);
|
|
}
|
|
exit();
|
|
}
|
|
private static function safeName(string $name): string
|
|
{
|
|
$name = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $name) ?: 'chat';
|
|
return strtolower(trim(preg_replace('/[^a-zA-Z0-9]+/', '-', $name), '-')) ?: 'chat';
|
|
}
|
|
}
|