/** * Plugin Name: Prima Nota Endpoint * Description: Endpoint per aggiornamento prima nota con autenticazione * Version: 1.0 */ /* // Previeni accesso diretto if (!defined('ABSPATH')) { exit; } class PrimaNota_Endpoint { private $secret_key = 'bvND4EPOuscv4mckY6JIWoSHN17QoN1K8sgHPGLGMxma07hOMbHwoWXeXpzycfk'; // CAMBIA QUESTA CHIAVE! public function __construct() { add_action('init', array($this, 'add_endpoint')); add_action('template_redirect', array($this, 'handle_endpoint')); } private function process_test_mode($anno_param = null) { global $wpdb; $records_to_create = []; $summary = []; if ($anno_param) { // Test modalità raggruppamento annuale $real_anno = ($anno_param === intval(date('Y'))) ? "corrente ({$anno_param})" : $anno_param; $summary['mode'] = "Raggruppamento annuale per anno {$real_anno}"; $summary['delete_operations'] = [ "DELETE FROM pn_prima_nota WHERE anno = {$anno_param} AND conto = 'A' AND ufficio = 'A1' AND tipologia LIKE 'A1.%'" ]; // Test A1.1 - ORDINARI per giorno $daily_a = $wpdb->get_results($wpdb->prepare(" SELECT DATE(data_pagamento) as giorno, COUNT(*)*70 as importo FROM ats_pagamenti WHERE YEAR(data_pagamento) = %d AND tipo_associato_pagamento = 'A' GROUP BY DATE(data_pagamento) HAVING COUNT(*)*70 > 0 ORDER BY giorno ", $anno_param)); foreach ($daily_a as $row) { $records_to_create[] = [ 'anno' => $anno_param, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.1', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote ORDINARI', 'data_documento' => $row->giorno, 'importo' => $row->importo ]; } // Test A1.2 - STUDENTI per giorno $daily_b = $wpdb->get_results($wpdb->prepare(" SELECT DATE(data_pagamento) as giorno, COUNT(*)*10 as importo FROM ats_pagamenti WHERE YEAR(data_pagamento) = %d AND tipo_associato_pagamento = 'B' GROUP BY DATE(data_pagamento) HAVING COUNT(*)*10 > 0 ORDER BY giorno ", $anno_param)); foreach ($daily_b as $row) { $records_to_create[] = [ 'anno' => $anno_param, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.2', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote STUDENTI', 'data_documento' => $row->giorno, 'importo' => $row->importo ]; } // Test A1.3 - SOSTENITORE e ALBO SPE. per giorno $daily_cd = $wpdb->get_results($wpdb->prepare(" SELECT DATE(data_pagamento) as giorno, COUNT(*)*100 as importo FROM ats_pagamenti WHERE YEAR(data_pagamento) = %d AND tipo_associato_pagamento IN ('C','D') GROUP BY DATE(data_pagamento) HAVING COUNT(*)*100 > 0 ORDER BY giorno ", $anno_param)); foreach ($daily_cd as $row) { $records_to_create[] = [ 'anno' => $anno_param, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.3', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote SOSTENITORE e ALBO SPE.', 'data_documento' => $row->giorno, 'importo' => $row->importo ]; } // Test GIS/NIS raggruppati per giorno $gis_daily = $wpdb->get_results($wpdb->prepare(" SELECT ug.id_gis, DATE(p.data_pagamento) as giorno, SUM(ug.importo) as totale, gc.descrizione FROM ats_utenti_gis ug JOIN ats_pagamenti p ON ug.id_tesserato = p.id_tesserato JOIN ats_tab_gis_codifica gc ON ug.id_gis = gc.id WHERE ug.anno = %d AND YEAR(p.data) = %d GROUP BY ug.id_gis, DATE(p.data_pagamento), gc.descrizione HAVING SUM(ug.importo) > 0 ORDER BY ug.id_gis, giorno ", $anno_param, $anno_param)); foreach ($gis_daily as $row) { $records_to_create[] = [ 'anno' => $anno_param, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.4', 'cdc' => $row->descrizione, 'intestazione' => 'Quote GIS/NIS', 'data_documento' => $row->giorno, 'importo' => $row->totale ]; } } else { // Test modalità standard (giorno corrente) $data = date("Y-m-d"); $anno = date("Y"); $summary['mode'] = "Modalità standard - solo giorno corrente ({$data})"; $summary['delete_operations'] = ["Nessuna cancellazione"]; // Test A1.1 - ORDINARI del giorno corrente $count_a = $wpdb->get_var(" SELECT COUNT(*)*70 FROM ats_pagamenti WHERE DATE(data_pagamento) = CURDATE() AND tipo_associato_pagamento = 'A' "); if ($count_a > 0) { $records_to_create[] = [ 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.1', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote ORDINARI', 'data_documento' => $data, 'importo' => $count_a ]; } // Test A1.2 - STUDENTI del giorno corrente $count_b = $wpdb->get_var(" SELECT COUNT(*)*10 FROM ats_pagamenti WHERE DATE(data_pagamento) = CURDATE() AND tipo_associato_pagamento = 'B' "); if ($count_b > 0) { $records_to_create[] = [ 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.2', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote STUDENTI', 'data_documento' => $data, 'importo' => $count_b ]; } // Test A1.3 - SOSTENITORE e ALBO SPE. del giorno corrente $count_cd = $wpdb->get_var(" SELECT COUNT(*)*100 FROM ats_pagamenti WHERE DATE(data_pagamento) = CURDATE() AND tipo_associato_pagamento IN ('C','D') "); if ($count_cd > 0) { $records_to_create[] = [ 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.3', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote SOSTENITORE e ALBO SPE.', 'data_documento' => $data, 'importo' => $count_cd ]; } // Test GIS/NIS del giorno corrente $gis_results = $wpdb->get_results(" SELECT ug.id_gis, SUM(ug.importo) as totale, gc.descrizione FROM ats_utenti_gis ug JOIN ats_pagamenti p ON ug.id_tesserato = p.id_tesserato JOIN ats_tab_gis_codifica gc ON ug.id_gis = gc.id WHERE ug.anno = YEAR(NOW()) AND DATE(p.data_pagamento) = CURDATE() GROUP BY ug.id_gis, gc.descrizione HAVING SUM(ug.importo) > 0 ORDER BY ug.id_gis ASC "); foreach ($gis_results as $row) { $records_to_create[] = [ 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.4', 'cdc' => $row->descrizione, 'intestazione' => 'Quote GIS/NIS', 'data_documento' => $data, 'importo' => $row->totale ]; } } $summary['total_records'] = count($records_to_create); $summary['records_by_type'] = []; foreach ($records_to_create as $record) { $type = $record['tipologia']; if (!isset($summary['records_by_type'][$type])) { $summary['records_by_type'][$type] = 0; } $summary['records_by_type'][$type]++; } return [ 'summary' => $summary, 'records_to_create' => $records_to_create ]; } public function add_endpoint() { add_rewrite_rule( '^api/prima-nota/?$', 'index.php?prima_nota_api=1', 'top' ); add_rewrite_tag('%prima_nota_api%', '([^&]+)'); } public function handle_endpoint() { global $wp_query, $wpdb; if (!isset($wp_query->query_vars['prima_nota_api'])) { return; } // Verifica metodo HTTP if ($_SERVER['REQUEST_METHOD'] !== 'GET') { $this->send_response(['error' => 'Metodo non consentito'], 405); } // Verifica chiave di autenticazione $provided_key = isset($_GET['key']) ? sanitize_text_field($_GET['key']) : ''; if ($provided_key !== $this->secret_key) { $this->send_response(['error' => 'Chiave non valida'], 401); } // Parametri opzionali $anno_param = isset($_GET['anno']) ? intval($_GET['anno']) : null; // Se anno = 0000, usa l'anno corrente if ($anno_param === 0) { $anno_param = intval(date('Y')); } $test_mode = isset($_GET['test']) && $_GET['test'] === '1'; try { if ($test_mode) { $result = $this->process_test_mode($anno_param); $this->send_response(['success' => true, 'test_mode' => true, 'data' => $result]); } elseif ($anno_param) { $result = $this->process_with_daily_grouping($anno_param); $this->send_response(['success' => true, 'message' => $result]); } else { $result = $this->process_standard(); $this->send_response(['success' => true, 'message' => $result]); } } catch (Exception $e) { $this->send_response(['error' => 'Errore durante l\'elaborazione: ' . $e->getMessage()], 500); } } private function process_standard() { global $wpdb; $anno = date("Y"); $data = date("Y-m-d"); $messages = []; // A1.1 - ORDINARI del giorno corrente $count_a = $wpdb->get_var(" SELECT COUNT(*)*70 FROM ats_pagamenti WHERE DATE(data_pagamento) = CURDATE() AND tipo_associato_pagamento = 'A' "); if ($count_a > 0) { $wpdb->insert('pn_prima_nota', array( 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.1', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote ORDINARI', 'documento' => '', 'numero' => '', 'data_documento' => $data, 'importo' => $count_a, 'note' => '', 'operatore' => 1 )); $messages[] = "Inserito A1.1 - ORDINARI: {$count_a}"; } // A1.2 - STUDENTI del giorno corrente $count_b = $wpdb->get_var(" SELECT COUNT(*)*10 FROM ats_pagamenti WHERE DATE(data_pagamento) = CURDATE() AND tipo_associato_pagamento = 'B' "); if ($count_b > 0) { $wpdb->insert('pn_prima_nota', array( 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.2', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote STUDENTI', 'documento' => '', 'numero' => '', 'data_documento' => $data, 'importo' => $count_b, 'note' => '', 'operatore' => 1 )); $messages[] = "Inserito A1.2 - STUDENTI: {$count_b}"; } // A1.3 - SOSTENITORE e ALBO SPE. del giorno corrente $count_cd = $wpdb->get_var(" SELECT COUNT(*)*100 FROM ats_pagamenti WHERE DATE(data_pagamento) = CURDATE() AND tipo_associato_pagamento IN ('C','D') "); if ($count_cd > 0) { $wpdb->insert('pn_prima_nota', array( 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.3', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote SOSTENITORE e ALBO SPE.', 'documento' => '', 'numero' => '', 'data_documento' => $data, 'importo' => $count_cd, 'note' => '', 'operatore' => 1 )); $messages[] = "Inserito A1.3 - SOSTENITORE/ALBO: {$count_cd}"; } // GIS/NIS del giorno corrente $gis_results = $wpdb->get_results(" SELECT ug.id_gis, SUM(ug.importo) as totale, gc.descrizione FROM ats_utenti_gis ug JOIN ats_pagamenti p ON ug.id_tesserato = p.id_tesserato JOIN ats_tab_gis_codifica gc ON ug.id_gis = gc.id WHERE ug.anno = YEAR(NOW()) AND DATE(p.data_pagamento) = CURDATE() GROUP BY ug.id_gis, gc.descrizione HAVING SUM(ug.importo) > 0 ORDER BY ug.id_gis ASC "); foreach ($gis_results as $row) { $wpdb->insert('pn_prima_nota', array( 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.4', 'cdc' => $row->descrizione, 'intestazione' => 'Quote GIS/NIS', 'documento' => '', 'numero' => '', 'data_documento' => $data, 'importo' => $row->totale, 'note' => '', 'operatore' => 1 )); $messages[] = "GIS/NIS: {$row->id_gis}-{$row->descrizione} {$row->totale}"; } if (empty($messages)) { $messages[] = "Nessun record da inserire per oggi (somme = 0)"; } return implode('; ', $messages); } private function process_with_daily_grouping($anno) { global $wpdb; $messages = []; // Cancella tutti i record dell'anno specificato $wpdb->query($wpdb->prepare("DELETE FROM pn_prima_nota WHERE anno = %d AND conto = 'A' AND ufficio = 'A1' AND tipologia LIKE 'A1.%'", $anno)); // A1.1 - ORDINARI per giorno $daily_a = $wpdb->get_results($wpdb->prepare(" SELECT DATE(data_pagamento) as giorno, COUNT(*)*70 as importo FROM ats_pagamenti WHERE YEAR(data_pagamento) = %d AND tipo_associato_pagamento = 'A' GROUP BY DATE(data_pagamento) HAVING COUNT(*)*70 > 0 ORDER BY giorno ", $anno)); foreach ($daily_a as $row) { $wpdb->insert('pn_prima_nota', array( 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.1', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote ORDINARI', 'documento' => '', 'numero' => '', 'data_documento' => $row->giorno, 'importo' => $row->importo, 'note' => '', 'operatore' => 1 )); } $messages[] = "Inseriti " . count($daily_a) . " record giornalieri A1.1"; // A1.2 - STUDENTI per giorno $daily_b = $wpdb->get_results($wpdb->prepare(" SELECT DATE(data_pagamento) as giorno, COUNT(*)*10 as importo FROM ats_pagamenti WHERE YEAR(data_pagamento) = %d AND tipo_associato_pagamento = 'B' GROUP BY DATE(data_pagamento) HAVING COUNT(*)*10 > 0 ORDER BY giorno ", $anno)); foreach ($daily_b as $row) { $wpdb->insert('pn_prima_nota', array( 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.2', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote STUDENTI', 'documento' => '', 'numero' => '', 'data_documento' => $row->giorno, 'importo' => $row->importo, 'note' => '', 'operatore' => 1 )); } $messages[] = "Inseriti " . count($daily_b) . " record giornalieri A1.2"; // A1.3 - SOSTENITORE e ALBO SPE. per giorno $daily_cd = $wpdb->get_results($wpdb->prepare(" SELECT DATE(data_pagamento) as giorno, COUNT(*)*100 as importo FROM ats_pagamenti WHERE YEAR(data_pagamento) = %d AND tipo_associato_pagamento IN ('C','D') GROUP BY DATE(data_pagamento) HAVING COUNT(*)*100 > 0 ORDER BY giorno ", $anno)); foreach ($daily_cd as $row) { $wpdb->insert('pn_prima_nota', array( 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.3', 'cdc' => 'NAZ', 'intestazione' => 'MaV. quote SOSTENITORE e ALBO SPE.', 'documento' => '', 'numero' => '', 'data_documento' => $row->giorno, 'importo' => $row->importo, 'note' => '', 'operatore' => 1 )); } $messages[] = "Inseriti " . count($daily_cd) . " record giornalieri A1.3"; // GIS/NIS raggruppati per giorno e tipo $gis_daily = $wpdb->get_results($wpdb->prepare(" SELECT ug.id_gis, DATE(p.data_pagamento) as giorno, SUM(ug.importo) as totale, gc.descrizione FROM ats_utenti_gis ug JOIN ats_pagamenti p ON ug.id_tesserato = p.id_tesserato JOIN ats_tab_gis_codifica gc ON ug.id_gis = gc.id WHERE ug.anno = %d AND YEAR(p.data) = %d GROUP BY ug.id_gis, DATE(p.data_pagamento), gc.descrizione HAVING SUM(ug.importo) > 0 ORDER BY ug.id_gis, giorno ", $anno, $anno)); foreach ($gis_daily as $row) { $wpdb->insert('pn_prima_nota', array( 'anno' => $anno, 'conto' => 'A', 'ufficio' => 'A1', 'tipologia' => 'A1.4', 'cdc' => $row->descrizione, 'intestazione' => 'Quote GIS/NIS', 'documento' => '', 'numero' => '', 'data_documento' => $row->giorno, 'importo' => $row->totale, 'note' => '', 'operatore' => 1 )); } $messages[] = "Inseriti " . count($gis_daily) . " record giornalieri GIS/NIS"; return implode('; ', $messages); } private function send_response($data, $status_code = 200) { status_header($status_code); header('Content-Type: application/json'); echo json_encode($data); exit; } } // Inizializza il plugin new PrimaNota_Endpoint(); // Hook per flush rewrite rules quando il plugin viene attivato register_activation_hook(__FILE__, function() { flush_rewrite_rules(); }); register_deactivation_hook(__FILE__, function() { flush_rewrite_rules(); }); ?> */