EsiPeppol-Woocommerce/app/models/Main_model.php

286 lines
9.1 KiB
PHP

<?php
namespace ESI_PEPPOL\models;
class PEPPOL_Main_model {
public $id;
public $id_order;
public $data_sent;
public $response_data;
public $document_id;
public $peppol_document_id;
public $status;
public $success;
public $message;
public $http_code;
public $date_add;
public $date_update;
/**
* Retourne le nom complet de la table (avec préfixe WP)
*
* @return string
*/
public static function get_table_name(): string {
global $wpdb;
return $wpdb->prefix . 'esi_peppol_invoices';
}
/**
* Récupère les derniers enregistrements pour l'affichage dans l'admin.
*
* @param int $limit Nombre maximum de lignes à retourner.
*
* @return array Liste d'objets (stdClass).
*/
public static function get_recent(int $limit = 50): array {
global $wpdb;
$table_name = self::get_table_name();
$limit = max(1, $limit);
$sql = $wpdb->prepare(
"SELECT * FROM {$table_name} ORDER BY date_add DESC LIMIT %d",
$limit
);
return (array) $wpdb->get_results($sql);
}
/**
* Crée la table esi_peppol_invoices si elle n'existe pas
*
* À appeler lors de l'activation du plugin.
*
* @return void
*/
public static function create_table(): void {
global $wpdb;
$table_name = self::get_table_name();
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE {$table_name} (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
id_order BIGINT(20) UNSIGNED NOT NULL,
data_sent LONGTEXT NULL,
response_data LONGTEXT NULL,
document_id VARCHAR(100) NOT NULL,
peppol_document_id VARCHAR(191) NOT NULL,
status VARCHAR(50) NOT NULL,
success TINYINT(1) NOT NULL DEFAULT 0,
message TEXT NULL,
http_code INT(11) NULL,
date_add DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
date_update DATETIME NULL DEFAULT NULL,
PRIMARY KEY (id),
KEY id_order (id_order),
KEY document_id (document_id),
KEY peppol_document_id (peppol_document_id)
) {$charset_collate};";
require_once \ABSPATH . 'wp-admin/includes/upgrade.php';
\dbDelta($sql);
}
/**
* Crée un enregistrement PEPPOL pour une commande WooCommerce.
*
* @param int $order_id ID de la commande WooCommerce.
* @param mixed $response_data Données retournées par l'API (array / objet / string).
* @param mixed $data_sent Payload envoyé à l'API (array / objet / string).
* @param string $document_id Identifiant / numéro du document (côté boutique).
* @param string $peppol_document_id Identifiant du document dans Peppol.
* @param string $status Statut métier (ex: 'created', 'sent', 'error').
* @param bool $success Indique si l'appel API est un succès.
* @param string $message Message d'information / d'erreur.
* @param int|null $http_code Code HTTP retourné par l'API, si disponible.
*
* @return int|null ID inséré ou null en cas d'erreur.
*/
public static function create(
int $order_id,
$response_data,
$data_sent,
string $document_id,
string $peppol_document_id,
string $status,
bool $success,
string $message = '',
?int $http_code = null
): ?int {
global $wpdb;
$table_name = self::get_table_name();
$serialized_response = \maybe_serialize($response_data);
$serialized_data_sent = \maybe_serialize($data_sent);
$now = \current_time('mysql');
$success_int = $success ? 1 : 0;
$inserted = $wpdb->insert(
$table_name,
[
'id_order' => $order_id,
'data_sent' => $serialized_data_sent,
'response_data' => $serialized_response,
'document_id' => $document_id,
'peppol_document_id' => $peppol_document_id,
'status' => $status,
'success' => $success_int,
'message' => $message,
'http_code' => $http_code,
'date_add' => $now,
'date_update' => $now,
],
['%d', '%s', '%s', '%s', '%s', '%s', '%d', '%s', '%d', '%s', '%s']
);
if ($inserted === false) {
return null;
}
return (int) $wpdb->insert_id;
}
/**
* Enregistre ou met à jour les données PEPPOL pour une commande WooCommerce.
*
* - 1 ligne par commande (id_order) : si une ligne existe déjà, elle est mise à jour.
* - La réponse d'API est stockée en sérialisé dans response_data.
* - Le payload envoyé est stocké dans data_sent.
*/
public static function save_for_order(
int $order_id,
$response_data,
$data_sent,
string $document_id,
string $peppol_document_id,
string $status,
bool $success,
string $message = '',
?int $http_code = null
): bool {
global $wpdb;
$table_name = self::get_table_name();
$serialized_response = \maybe_serialize($response_data);
$serialized_data_sent = \maybe_serialize($data_sent);
$now = \current_time('mysql');
$success_int = $success ? 1 : 0;
// Vérifier si une ligne existe déjà pour cette commande
$existing_id = $wpdb->get_var(
$wpdb->prepare(
"SELECT id FROM {$table_name} WHERE id_order = %d LIMIT 1",
$order_id
)
);
if ($existing_id) {
// Mise à jour
$updated = $wpdb->update(
$table_name,
[
'data_sent' => $serialized_data_sent,
'response_data' => $serialized_response,
'document_id' => $document_id,
'peppol_document_id' => $peppol_document_id,
'status' => $status,
'success' => $success_int,
'message' => $message,
'http_code' => $http_code,
'date_update' => $now,
],
['id' => (int) $existing_id],
['%s', '%s', '%s', '%s', '%s', '%d', '%s', '%d', '%s'],
['%d']
);
return $updated !== false;
}
// Pas d'enregistrement existant : on crée
return self::create(
$order_id,
$response_data,
$data_sent,
$document_id,
$peppol_document_id,
$status,
$success,
$message,
$http_code
) !== null;
}
/**
* Récupère un enregistrement PEPPOL par ID de commande (id_order).
*
* La propriété response_data est désérialisée automatiquement.
* La propriété data_sent est désérialisée automatiquement.
*/
public static function get_by_order_id(int $order_id): ?object {
global $wpdb;
$table_name = self::get_table_name();
$row = $wpdb->get_row(
$wpdb->prepare(
"SELECT * FROM {$table_name} WHERE id_order = %d LIMIT 1",
$order_id
)
);
if (!$row) {
return null;
}
// Désérialiser la réponse API et le payload si nécessaire
if (isset($row->response_data)) {
$row->response_data = \maybe_unserialize($row->response_data);
}
if (isset($row->data_sent)) {
$row->data_sent = \maybe_unserialize($row->data_sent);
}
return $row;
}
/**
* Récupère un enregistrement PEPPOL par ID (id).
*
* La propriété response_data est désérialisée automatiquement.
* La propriété data_sent est désérialisée automatiquement.
*
* @param int $id ID de l'enregistrement.
* @return object|null
*/
public static function get_by_id(int $id): ?object {
global $wpdb;
$table_name = self::get_table_name();
$row = $wpdb->get_row(
$wpdb->prepare(
"SELECT * FROM {$table_name} WHERE id = %d LIMIT 1",
$id
)
);
if (!$row) {
return null;
}
// Désérialiser la réponse API et le payload si nécessaire
if (isset($row->response_data)) {
$row->response_data = \maybe_unserialize($row->response_data);
}
if (isset($row->data_sent)) {
$row->data_sent = \maybe_unserialize($row->data_sent);
}
return $row;
}
}