This commit is contained in:
2026-05-27 11:44:10 -04:00
commit 414f85ad05
31452 changed files with 3580409 additions and 0 deletions

View File

@ -0,0 +1,193 @@
<?php
// application/models/GoogleDocs_model.php
require_once realpath(__DIR__ . '/../../vendor/autoload.php');
use Google\Client as Google_Client;
use Google\Service\Drive as Google_Service_Drive;
use Google\Service\Drive\DriveFile as Google_Service_Drive_DriveFile;
defined('BASEPATH') or exit('No direct script access allowed');
class GoogleDocs_model extends CI_Model
{
private $cfg = [];
private $driveService = null;
public function __construct()
{
parent::__construct();
$this->cfg = $this->config->item('google') ?: [];
$this->load->database();
$this->load->helper('url'); // pour base_url()
}
/* ========= AUTH SERVICE ACCOUNT (JWT) ========= */
private function getClient(array $scopes): Google_Client
{
$credsPath = $this->cfg['credentials_path'] ?? null;
if (!$credsPath || !is_file($credsPath)) {
throw new Exception("google.credentials_path introuvable : ".($credsPath ?? '(null)'));
}
$client = new Google_Client();
$client->setAuthConfig($credsPath);
$client->setScopes($scopes);
$client->setAccessType('offline');
if (!empty($this->cfg['subject'])) {
$client->setSubject($this->cfg['subject']); // DWD si configuré
}
return $client;
}
private function drive(): Google_Service_Drive
{
if ($this->driveService instanceof Google_Service_Drive) {
return $this->driveService;
}
$client = $this->getClient(['https://www.googleapis.com/auth/drive']);
$this->driveService = new Google_Service_Drive($client);
return $this->driveService;
}
/* ========= Utilitaires ========= */
private function sanitizeDriveName(string $s): string
{
// Retire caractères non valides pour un nom Drive
$s = preg_replace('/[\\\\\/:*?"<>|]/u', ' ', $s);
$s = preg_replace('/\s+/u', ' ', trim($s));
return mb_substr($s, 0, 240, 'UTF-8');
}
/* ========= PUBLIC: Créer / Actualiser “InfoCourse {NomProjet}” ========= */
public function creer_document($proj_id)
{
// Données projet
$this->load->model('Projets_model');
$mem_proj = $this->Projets_model->mod_getRecord((int)$proj_id);
if (empty($mem_proj) || empty($mem_proj->proj_google_rep_id)) {
return; // rien à faire sans dossier cible
}
$this->load->model('Clients_model');
$contacts = $this->Clients_model->mod_getRecords_contacts($mem_proj->proj_client_id);
$parentId = $mem_proj->proj_google_rep_id;
$dateHeure = date('Y-m-d H:i');
$mem_link = base_url('index.php/projets/form/'.$mem_proj->proj_id);
$nomProject = $this->sanitizeDriveName((string)$mem_proj->proj_nom);
$nomFichier = 'InfoCourse ' . $nomProject; // ← comme demandé
$drive = $this->drive();
try {
// DriveId du dossier (Shared drive)
$folderInfo = $drive->files->get($parentId, [
'fields' => 'driveId',
'supportsAllDrives' => true
]);
$driveId = $folderInfo->getDriveId();
// ===== Construire le tableau (même rendu que ton exemple)
$rows = [
['Nom du projet', (string)$mem_proj->proj_nom],
['Date', (string)($mem_proj->proj_date_debut ?? '')],
['Client', (string)($mem_proj->compagnie ?? '')],
['Notes', (string)($mem_proj->proj_notes ?? '')],
['Lien', "<a href='{$mem_link}'>".$mem_link."</a>"],
['Représentant', (string)($mem_proj->rep_prenom ?? '')],
['Date de création', $dateHeure],
];
// Contacts + tickets Jira ouverts
if (is_array($contacts)) {
foreach ($contacts as $c) {
$nomComplet = trim(($c['con_prenom'] ?? '').' '.($c['con_nom'] ?? ''));
$email = $c['con_courriel'] ?? '';
$tel = $c['con_telephone2'] ?? '';
$role = $c['rol_nom'] ?? '';
$ligne = $nomComplet;
if ($email) $ligne .= $email;
if ($tel) $ligne .= ' - '.$tel;
if ($role) $ligne .= ' - '.$role;
$rows[] = [$nomComplet, $ligne];
if (function_exists('jira_get_tickets_by_email') && $email) {
$tickets = jira_get_tickets_by_email($email);
if (!empty($tickets['ouverts'])) {
$li = '';
foreach ($tickets['ouverts'] as $t) {
$sum = isset($t['summary']) ? htmlspecialchars($t['summary']) : '';
$key = $t['key'] ?? '';
$url = $t['url'] ?? '#';
$st = $t['status'] ?? '';
$li .= '<li><a href="'.$url.'" target="_blank">'.$key.'</a> — '.$sum.' ('.$st.')</li>';
}
$rows[] = ['Tickets ouvert', '<ul>'.$li.'</ul>'];
}
}
}
}
// ===== Supprimer lexistant (même nom, même dossier)
$nameEsc = addcslashes($nomFichier, "'");
$existing = $drive->files->listFiles([
'q' => "name = '{$nameEsc}' and mimeType='application/vnd.google-apps.document' and '{$parentId}' in parents and trashed = false",
'spaces' => 'drive',
'driveId' => $driveId,
'corpora' => 'drive',
'includeItemsFromAllDrives' => true,
'supportsAllDrives' => true,
'fields' => 'files(id)'
]);
if (count($existing->getFiles()) > 0) {
$drive->files->delete($existing->getFiles()[0]->getId(), ['supportsAllDrives' => true]);
}
// ===== HTML (table)
$html = '<html><body>';
$html .= '<table border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse;">';
foreach ($rows as $row) {
$label = htmlspecialchars($row[0]);
$value = $row[1]; // peut contenir du HTML (lien/ul)
$html .= "<tr>";
$html .= "<td style='width:30%;'><strong>{$label}</strong></td>";
$html .= "<td>{$value}</td>";
$html .= "</tr>";
}
$html .= '</table>';
$html .= '</body></html>';
// ===== Import HTML -> Google Docs
$tmp = tempnam(sys_get_temp_dir(), 'gdoc_').'.html';
file_put_contents($tmp, $html);
$content = file_get_contents($tmp);
$fileMeta = new Google_Service_Drive_DriveFile([
'name' => $nomFichier,
'mimeType' => 'application/vnd.google-apps.document',
'parents' => [$parentId]
]);
$file = $drive->files->create($fileMeta, [
'data' => $content,
'mimeType' => 'text/html',
'uploadType' => 'multipart',
'fields' => 'id',
'supportsAllDrives' => true
]);
@unlink($tmp);
// (optionnel) log_message('info', 'InfoCourse généré: '.$file->id);
} catch (Exception $e) {
log_message('error', 'creer_document: '.$e->getMessage());
echo "Erreur : ".$e->getMessage();
}
}
}