Files
crm-ms1/application/models/GoogleDocs_model.php
2026-05-27 11:44:10 -04:00

194 lines
7.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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();
}
}
}