2026-08-11 13:36:57 +00:00

288 lines
15 KiB
PHP
Raw Permalink 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
/**
* Plugin Name: ABC Leads & ESG Evaluation
* Description: Lightweight lead capture and preliminary ESG evaluation forms for Avangarde Bright Concepts.
* Version: 1.0.0
* Author: Flatlogic Site Engineer
*/
if (!defined('ABSPATH')) { exit; }
final class ABC_Leads_Plugin {
const CPT = 'abc_submission';
public static function init() {
add_action('init', [__CLASS__, 'register_cpt']);
add_shortcode('abc_contact_form', [__CLASS__, 'contact_form']);
add_shortcode('abc_esg_assessment', [__CLASS__, 'assessment_form']);
add_action('wp_enqueue_scripts', [__CLASS__, 'assets']);
add_action('admin_post_nopriv_abc_submit_contact', [__CLASS__, 'handle_contact']);
add_action('admin_post_abc_submit_contact', [__CLASS__, 'handle_contact']);
add_action('admin_post_nopriv_abc_submit_assessment', [__CLASS__, 'handle_assessment']);
add_action('admin_post_abc_submit_assessment', [__CLASS__, 'handle_assessment']);
add_filter('manage_' . self::CPT . '_posts_columns', [__CLASS__, 'columns']);
add_action('manage_' . self::CPT . '_posts_custom_column', [__CLASS__, 'column_content'], 10, 2);
add_filter('manage_edit-' . self::CPT . '_sortable_columns', [__CLASS__, 'sortable_columns']);
}
public static function register_cpt() {
register_post_type(self::CPT, [
'labels' => [
'name' => 'ABC Leads',
'singular_name' => 'ABC Lead',
'menu_name' => 'ABC Leads',
'add_new_item' => 'Add Lead',
'edit_item' => 'View Lead',
],
'public' => false,
'show_ui' => true,
'show_in_menu' => true,
'menu_icon' => 'dashicons-chart-line',
'supports' => ['title', 'editor', 'custom-fields'],
'capability_type' => 'post',
]);
}
public static function assets() {
wp_enqueue_style('abc-leads', plugin_dir_url(__FILE__) . 'abc-leads.css', [], '1.0.0');
}
private static function redirect_back($status) {
$url = wp_get_referer() ?: home_url('/contact/');
$url = remove_query_arg(['abc_status'], $url);
wp_safe_redirect(add_query_arg('abc_status', $status, $url));
exit;
}
public static function handle_contact() {
if (!isset($_POST['abc_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['abc_nonce'])), 'abc_contact')) {
self::redirect_back('invalid');
}
$message = sanitize_textarea_field(wp_unslash($_POST['message'] ?? ''));
$fields = [
'name' => self::clean('name'),
'company' => self::clean('company'),
'email' => sanitize_email(wp_unslash($_POST['email'] ?? '')),
'phone' => self::clean('phone'),
'interest' => self::clean('interest'),
'newsletter' => isset($_POST['newsletter']) ? 'Da' : 'Nu',
];
if (!$fields['name'] || !$fields['email']) { self::redirect_back('missing'); }
$saved = self::save_submission('Solicitare consultanță', $fields, $message);
self::redirect_back(is_wp_error($saved) ? 'error' : 'contact_success');
}
public static function handle_assessment() {
if (!isset($_POST['abc_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['abc_nonce'])), 'abc_assessment')) {
self::redirect_back('invalid');
}
$message = sanitize_textarea_field(wp_unslash($_POST['notes'] ?? ''));
$fields = [
'name' => self::clean('name'),
'company' => self::clean('company'),
'email' => sanitize_email(wp_unslash($_POST['email'] ?? '')),
'company_size' => self::clean('company_size'),
'request_source' => self::clean('request_source'),
'topics' => self::clean('topics'),
'timeline' => self::clean('timeline'),
];
if (!$fields['company'] || !$fields['email']) { self::redirect_back('missing'); }
$saved = self::save_submission('Evaluare ESG preliminară', $fields, $message);
self::redirect_back(is_wp_error($saved) ? 'error' : 'assessment_success');
}
private static function status_notice($context) {
$status = isset($_GET['abc_status']) ? sanitize_key(wp_unslash($_GET['abc_status'])) : '';
if (!$status) { return ''; }
$messages = [
'invalid' => ['Nu am putut valida formularul. Vă rugăm să încercați din nou.', 'error'],
'missing' => ['Completați câmpurile obligatorii marcate cu *.', 'error'],
'error' => ['A apărut o eroare la trimitere. Vă rugăm să încercați din nou.', 'error'],
'contact_success' => ['Mulțumim. Solicitarea a fost înregistrată — vă vom contacta pentru discuția inițială.', 'success'],
'assessment_success' => ['Evaluarea preliminară a fost trimisă. Vom reveni cu pașii recomandați pentru organizarea ESG.', 'success'],
];
if (!isset($messages[$status])) { return ''; }
[$msg, $type] = $messages[$status];
return self::notice($msg, $type);
}
private static function clean($key) {
if (!isset($_POST[$key])) { return ''; }
if (is_array($_POST[$key])) {
return array_map('sanitize_text_field', wp_unslash($_POST[$key]));
}
return sanitize_text_field(wp_unslash($_POST[$key]));
}
private static function save_submission($type, $fields, $message = '') {
$name = $fields['name'] ?? '';
$company = $fields['company'] ?? '';
$email = $fields['email'] ?? '';
$title = trim($type . ' — ' . ($company ?: $name ?: $email ?: current_time('mysql')));
$content = $message ? wp_kses_post($message) : '';
$post_id = wp_insert_post([
'post_type' => self::CPT,
'post_status' => 'private',
'post_title' => $title,
'post_content' => $content,
], true);
if (is_wp_error($post_id)) { return $post_id; }
update_post_meta($post_id, '_abc_type', $type);
foreach ($fields as $key => $value) {
update_post_meta($post_id, '_abc_' . sanitize_key($key), is_array($value) ? implode(', ', $value) : $value);
}
update_post_meta($post_id, '_abc_submitted_at', current_time('mysql'));
return $post_id;
}
private static function notice($text, $type = 'success') {
return '<div class="abc-form-notice abc-' . esc_attr($type) . '">' . esc_html($text) . '</div>';
}
public static function contact_form() {
$notice = self::status_notice('contact');
if (false && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['abc_form_type']) && $_POST['abc_form_type'] === 'contact') {
if (!isset($_POST['abc_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['abc_nonce'])), 'abc_contact')) {
$notice = self::notice('Nu am putut valida formularul. Vă rugăm să încercați din nou.', 'error');
} else {
$message = sanitize_textarea_field(wp_unslash($_POST['message'] ?? ''));
$fields = [
'name' => self::clean('name'),
'company' => self::clean('company'),
'email' => sanitize_email(wp_unslash($_POST['email'] ?? '')),
'phone' => self::clean('phone'),
'interest' => self::clean('interest'),
'newsletter' => isset($_POST['newsletter']) ? 'Da' : 'Nu',
];
if (!$fields['name'] || !$fields['email']) {
$notice = self::notice('Completați cel puțin numele și adresa de email.', 'error');
} else {
$saved = self::save_submission('Solicitare consultanță', $fields, $message);
$notice = is_wp_error($saved)
? self::notice('A apărut o eroare la trimitere. Vă rugăm să încercați din nou.', 'error')
: self::notice('Mulțumim. Solicitarea a fost înregistrată — vă vom contacta pentru discuția inițială.');
}
}
}
ob_start(); ?>
<div class="abc-form-wrap">
<?php echo $notice; ?>
<form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" class="abc-form">
<input type="hidden" name="action" value="abc_submit_contact">
<input type="hidden" name="abc_form_type" value="contact">
<?php wp_nonce_field('abc_contact', 'abc_nonce'); ?>
<div class="abc-grid-two">
<label>Nume și prenume*<input required name="name" type="text" autocomplete="name"></label>
<label>Companie<input name="company" type="text" autocomplete="organization"></label>
<label>Email*<input required name="email" type="email" autocomplete="email"></label>
<label>Telefon<input name="phone" type="tel" autocomplete="tel"></label>
</div>
<label>Zona de interes
<select name="interest">
<option>Diagnostic ESG</option>
<option>Solicitare ESG de la bancă / investitor</option>
<option>DNSH / proiect finanțat</option>
<option>Organizarea informațiilor ESG</option>
<option>Monitorizare și suport recurent</option>
</select>
</label>
<label>Mesaj<textarea name="message" rows="5" placeholder="Spuneți-ne ce solicitare ESG ați primit sau ce doriți să organizați."></textarea></label>
<label class="abc-checkbox"><input type="checkbox" name="newsletter" value="1"> Doresc să primesc resurse ESG utile prin newsletter.</label>
<button type="submit">Solicită o discuție</button>
<p class="abc-form-small">Răspunsurile sunt salvate securizat în zona de administrare WordPress pentru follow-up.</p>
</form>
</div>
<?php return ob_get_clean();
}
public static function assessment_form() {
$notice = self::status_notice('assessment');
if (false && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['abc_form_type']) && $_POST['abc_form_type'] === 'assessment') {
if (!isset($_POST['abc_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['abc_nonce'])), 'abc_assessment')) {
$notice = self::notice('Nu am putut valida evaluarea. Vă rugăm să încercați din nou.', 'error');
} else {
$message = sanitize_textarea_field(wp_unslash($_POST['notes'] ?? ''));
$fields = [
'name' => self::clean('name'),
'company' => self::clean('company'),
'email' => sanitize_email(wp_unslash($_POST['email'] ?? '')),
'company_size' => self::clean('company_size'),
'request_source' => self::clean('request_source'),
'topics' => self::clean('topics'),
'timeline' => self::clean('timeline'),
];
if (!$fields['company'] || !$fields['email']) {
$notice = self::notice('Completați cel puțin compania și adresa de email.', 'error');
} else {
$saved = self::save_submission('Evaluare ESG preliminară', $fields, $message);
$notice = is_wp_error($saved)
? self::notice('A apărut o eroare la trimitere. Vă rugăm să încercați din nou.', 'error')
: self::notice('Evaluarea preliminară a fost trimisă. Vom reveni cu pașii recomandați pentru organizarea ESG.');
}
}
}
ob_start(); ?>
<div class="abc-form-wrap abc-assessment">
<?php echo $notice; ?>
<form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" class="abc-form">
<input type="hidden" name="action" value="abc_submit_assessment">
<input type="hidden" name="abc_form_type" value="assessment">
<?php wp_nonce_field('abc_assessment', 'abc_nonce'); ?>
<div class="abc-grid-two">
<label>Companie*<input required name="company" type="text"></label>
<label>Persoană de contact<input name="name" type="text"></label>
<label>Email*<input required name="email" type="email"></label>
<label>Dimensiune companie
<select name="company_size"><option>IMM / antreprenorială</option><option>Companie medie</option><option>Companie mare</option><option>Grup internațional</option></select>
</label>
</div>
<label>De unde vine presiunea ESG?
<select name="request_source"><option>Bancă / finanțator</option><option>Client sau partener comercial</option><option>Program de finanțare</option><option>Autoritate / reglementare</option><option>Pregătire internă voluntară</option></select>
</label>
<fieldset><legend>Ce informații trebuie organizate?</legend>
<label><input type="checkbox" name="topics[]" value="Energie"> Energie</label>
<label><input type="checkbox" name="topics[]" value="Emisii"> Emisii GES</label>
<label><input type="checkbox" name="topics[]" value="Deșeuri"> Deșeuri / reciclare</label>
<label><input type="checkbox" name="topics[]" value="Politici ESG"> Politici și proceduri ESG</label>
<label><input type="checkbox" name="topics[]" value="DNSH"> DNSH / proiect finanțat</label>
</fieldset>
<label>Termen estimat
<select name="timeline"><option>Urgent — sub 2 săptămâni</option><option>1 lună</option><option>13 luni</option><option>Planificare pentru viitor</option></select>
</label>
<label>Context / observații<textarea name="notes" rows="5" placeholder="Ex.: am primit un chestionar ESG de la bancă sau pregătim o finanțare."></textarea></label>
<button type="submit">Trimite evaluarea preliminară</button>
</form>
</div>
<?php return ob_get_clean();
}
public static function columns($columns) {
return [
'cb' => $columns['cb'],
'title' => 'Lead',
'abc_type' => 'Tip',
'abc_company' => 'Companie',
'abc_email' => 'Email',
'date' => 'Data',
];
}
public static function column_content($column, $post_id) {
$map = [
'abc_type' => '_abc_type',
'abc_company' => '_abc_company',
'abc_email' => '_abc_email',
];
if (isset($map[$column])) {
echo esc_html(get_post_meta($post_id, $map[$column], true));
}
}
public static function sortable_columns($columns) {
$columns['abc_type'] = 'abc_type';
return $columns;
}
}
ABC_Leads_Plugin::init();