{"id":290028,"date":"2026-03-29T23:35:31","date_gmt":"2026-03-29T23:35:31","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/employee-verification-document-authentication\/"},"modified":"2026-09-18T17:03:53","modified_gmt":"2026-09-18T17:03:53","slug":"employee-verification-document-authentication","status":"publish","type":"plugin","link":"https:\/\/sv.wordpress.org\/plugins\/employee-verification-document-authentication\/","author":20005930,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.0","stable_tag":"1.4.0","tested":"7.1.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Employee Verification & Document Authentication","header_author":"SKFreelancers","header_description":"Manage employees, issue verifiable internship and experience letters with QR codes, and let visitors verify staff and documents on your website using simple shortcodes.","assets_banners_color":"8ec0be","last_updated":"2026-09-18 17:03:53","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/skfreelancers.com\/","header_author_uri":"https:\/\/skfreelancers.com","rating":5,"author_block_rating":0,"active_installs":10,"downloads":483,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.2":{"tag":"1.3.2","author":"saqibabbasi","date":"2026-03-29 23:35:21","revision":3494130},"1.3.4":{"tag":"1.3.4","author":"saqibabbasi","date":"2026-05-28 22:59:09","revision":3552845},"1.4.0":{"tag":"1.4.0","author":"saqibabbasi","date":"2026-09-18 17:03:53","revision":3702375}},"upgrade_notice":{"1.4.0":"<p>New dynamic &quot;Other Letters&quot; system with 9 professional HR letter types. Visit Settings \u2192 Other Letters after upgrading to review templates and click &quot;Reset Templates to Default&quot; to apply professional HR content to all letter types.<\/p>","1.1.4":"<p>Letters now render live. Use the &quot;Convert to Live Rendering&quot; button in Settings \u2192 Styling to migrate any existing static letters generated before this version.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3494130,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3494130,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3494130,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3494130,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.3.2","1.3.4","1.4.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3702323,"resolution":"1","location":"assets","locale":"","width":1468,"height":912},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3702323,"resolution":"10","location":"assets","locale":"","width":1460,"height":928},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3494130,"resolution":"2","location":"assets","locale":"","width":1653,"height":2339},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3494130,"resolution":"3","location":"assets","locale":"","width":1330,"height":683},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3494130,"resolution":"4","location":"assets","locale":"","width":1337,"height":675},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3702323,"resolution":"5","location":"assets","locale":"","width":1398,"height":896},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3702323,"resolution":"6","location":"assets","locale":"","width":1408,"height":911},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3702323,"resolution":"7","location":"assets","locale":"","width":1493,"height":924},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3702323,"resolution":"8","location":"assets","locale":"","width":1484,"height":911},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3702323,"resolution":"9","location":"assets","locale":"","width":1220,"height":553}},"screenshots":{"1":"Employee list with filter toolbar, Other Letters dropdown, and Export CSV button","2":"Other Letters generate modal with dynamic extra fields","3":"Settings \u2192 Other Letters tab \u2014 manage dynamic letter types","4":"Letter Type Editor \u2014 name, template, email settings, and extra fields","5":"Generated letter (A4, print-ready) with QR code and verification ID","6":"Public document verification page \u2014 verified badge and employee details","7":"Add\/Edit employee form","8":"Settings \u2014 Styling tab with typography, colours, and live preview"}},"plugin_section":[],"plugin_tags":[258949,258948,258951,281506,258950],"plugin_category":[],"plugin_contributors":[258952],"plugin_business_model":[],"class_list":["post-290028","plugin","type-plugin","status-publish","hentry","plugin_tags-document-authentication","plugin_tags-employee-verification","plugin_tags-experience-letter","plugin_tags-hr-letters","plugin_tags-internship-letter","plugin_contributors-saqibabbasi","plugin_committers-saqibabbasi"],"banners":{"banner":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/banner-772x250.png?rev=3494130","banner_2x":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/banner-1544x500.png?rev=3494130","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/icon-128x128.png?rev=3494130","icon_2x":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/icon-256x256.png?rev=3494130","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/screenshot-1.png?rev=3702323","caption":"Employee list with filter toolbar, Other Letters dropdown, and Export CSV button"},{"src":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/screenshot-2.png?rev=3494130","caption":"Other Letters generate modal with dynamic extra fields"},{"src":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/screenshot-3.png?rev=3494130","caption":"Settings \u2192 Other Letters tab \u2014 manage dynamic letter types"},{"src":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/screenshot-4.png?rev=3494130","caption":"Letter Type Editor \u2014 name, template, email settings, and extra fields"},{"src":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/screenshot-5.png?rev=3702323","caption":"Generated letter (A4, print-ready) with QR code and verification ID"},{"src":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/screenshot-6.png?rev=3702323","caption":"Public document verification page \u2014 verified badge and employee details"},{"src":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/screenshot-7.png?rev=3702323","caption":"Add\/Edit employee form"},{"src":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/screenshot-8.png?rev=3702323","caption":"Settings \u2014 Styling tab with typography, colours, and live preview"},{"src":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/screenshot-9.png?rev=3702323","caption":""},{"src":"https:\/\/ps.w.org\/employee-verification-document-authentication\/assets\/screenshot-10.png?rev=3702323","caption":""}],"raw_content":"<!--section=description-->\n<p><strong>Employee Verification &amp; Document Authentication<\/strong> is a complete HR document management system for WordPress. Issue tamper-proof employee letters with unique verification IDs and QR codes, then let anyone verify their authenticity through a simple public-facing page \u2014 no login required.<\/p>\n\n<p>Built for HR teams, staffing agencies, and businesses of any size. Every letter renders live on demand, so updates to your branding, colours, or templates are instantly reflected on all existing documents \u2014 no regeneration needed.<\/p>\n\n<h4>Employee Management<\/h4>\n\n<ul>\n<li>Add, edit, and delete employee profiles with photos<\/li>\n<li>Track Active, Intern, and Former Employee statuses<\/li>\n<li>Store joining date, leaving date, internship period, CNIC, father name, and tasks completed<\/li>\n<li><strong>Filter employees<\/strong> by department, status, or search term with a modern filter toolbar<\/li>\n<li><strong>Export employees to CSV<\/strong> \u2014 applies active filters; UTF-8 BOM included for Excel compatibility<\/li>\n<li><strong>Bulk import employees via CSV<\/strong> \u2014 template provided<\/li>\n<li>Custom fields system \u2014 define global fields and fill values per employee<\/li>\n<\/ul>\n\n<h4>Letter Generation<\/h4>\n\n<p><strong>Built-in letter types (always available):<\/strong><\/p>\n\n<ul>\n<li>Internship Completion Letter<\/li>\n<li>Experience Letter<\/li>\n<\/ul>\n\n<p><strong>Dynamic \"Other Letters\" system (new in v1.4.0):<\/strong><\/p>\n\n<ul>\n<li>Bank Account Opening Letter<\/li>\n<li>Salary Certificate<\/li>\n<li>Joining Letter \/ Letter of Appointment<\/li>\n<li>Promotion Letter<\/li>\n<li>Warning Letter<\/li>\n<li>Transfer Letter<\/li>\n<li>Relieving Letter<\/li>\n<li>No Objection Certificate (NOC)<\/li>\n<li>Custom Employee Letter (fully ad-hoc \u2014 enter title and content on the fly)<\/li>\n<li>Add your own unlimited custom letter types from Settings \u2014 no code required<\/li>\n<\/ul>\n\n<p>All letters include:<\/p>\n\n<ul>\n<li>Unique 16-character cryptographically random Verification ID<\/li>\n<li>QR code linking to the public verification page<\/li>\n<li>Full company branding (logo, colours, typography, signature, footer)<\/li>\n<li>Live rendering \u2014 settings changes apply instantly to all existing letters<\/li>\n<li>Print \/ Save as PDF from the browser (A4 size, printer-ready)<\/li>\n<\/ul>\n\n<h4>Dynamic Letter Types (Other Letters)<\/h4>\n\n<p>Create and manage unlimited letter types from <strong>Employee Verify \u2192 Settings \u2192 Other Letters<\/strong> without touching any code:<\/p>\n\n<ul>\n<li><strong>Letter Name &amp; Slug<\/strong> \u2014 displayed in the employee dropdown menu<\/li>\n<li><strong>Letter Template<\/strong> \u2014 full HTML editor with placeholder support<\/li>\n<li><strong>Extra Fields<\/strong> \u2014 define letter-specific fields (e.g. \"Monthly Salary\", \"Bank Name\") that appear in a modal when generating; each field becomes a <code>{placeholder}<\/code> in the template<\/li>\n<li><strong>Email Subject &amp; Body<\/strong> \u2014 per-letter-type email content<\/li>\n<li><strong>Status<\/strong> \u2014 Active or Inactive (inactive types are hidden from the dropdown)<\/li>\n<li><strong>Allow Multiple<\/strong> \u2014 control whether multiple letters of the same type can be issued to one employee<\/li>\n<li><strong>Reset Templates to Default<\/strong> \u2014 one-click button to restore all professional HR templates<\/li>\n<\/ul>\n\n<h4>Verification System<\/h4>\n\n<ul>\n<li>Every letter gets a unique Verification ID (cryptographically secure)<\/li>\n<li>QR code on each letter links directly to the document verification page<\/li>\n<li><code>[evda_employee_verification]<\/code> \u2014 public employee lookup shortcode<\/li>\n<li><code>[evda_document_verification]<\/code> \u2014 public letter verification shortcode (also works via URL: <code>?id=VERIFICATION_ID<\/code>)<\/li>\n<li>Verified badge, employee details, and download link shown on successful verification<\/li>\n<\/ul>\n\n<h4>Letter Customization (Settings)<\/h4>\n\n<ul>\n<li>Company logo displayed on all letters<\/li>\n<li>Full typography control: font family, size, line height, colours<\/li>\n<li>Editable letter body templates with <code>{placeholder}<\/code> support<\/li>\n<li>Optional signature block: signatory name, title, and uploaded signature image<\/li>\n<li>Custom footer message (office address, phone, website)<\/li>\n<li>Toggle: QR code, border\/shadow, title underline<\/li>\n<li>All styling changes apply instantly to all existing letters \u2014 no regeneration needed<\/li>\n<li>Live letter preview in Settings \u2192 Styling<\/li>\n<\/ul>\n\n<h4>Email Notifications<\/h4>\n\n<ul>\n<li>Auto-email employees when any letter is issued<\/li>\n<li>Per-letter-type configurable subject and body templates<\/li>\n<li>Placeholder support: <code>{employee_name}<\/code>, <code>{company}<\/code>, <code>{letter_type}<\/code>, <code>{verify_url}<\/code>, and more<\/li>\n<li>Email logs (last 100 send attempts)<\/li>\n<li>Test email button<\/li>\n<\/ul>\n\n<h4>Security<\/h4>\n\n<ul>\n<li>All AJAX endpoints protected by <code>check_ajax_referer()<\/code> + <code>current_user_can()<\/code><\/li>\n<li>All forms use <code>wp_nonce_field()<\/code> + <code>check_admin_referer()<\/code><\/li>\n<li>All database queries use <code>$wpdb-&gt;prepare()<\/code><\/li>\n<li>All inputs sanitized with appropriate functions (<code>sanitize_text_field<\/code>, <code>absint<\/code>, <code>sanitize_email<\/code>, etc.)<\/li>\n<li>All output escaped with <code>esc_html()<\/code>, <code>esc_attr()<\/code>, <code>esc_url()<\/code>, <code>wp_kses()<\/code>, or <code>wp_kses_post()<\/code><\/li>\n<li>Public endpoints secured via HMAC token (<code>wp_hash<\/code>) \u2014 no user session required<\/li>\n<\/ul>\n\n<h4>Shortcodes<\/h4>\n\n<pre><code>[evda_employee_verification] \u2014 Public employee lookup form.\n[evda_document_verification] \u2014 Public document verification form. Also works via URL: `?id=VERIFICATION_ID`\n<\/code><\/pre>\n\n<h4>Placeholder Reference<\/h4>\n\n<p>The following placeholders are supported in all letter templates and email bodies:<\/p>\n\n<pre><code>{employee_name} `{employee_id}` `{father_name}` `{cnic}` `{position}` `{department}` `{company}` `{joining_date}` `{leaving_date}` `{intern_start}` `{intern_end}` `{issue_date}` `{verification_id}` `{verify_url}` `{letter_type}` `{tasks_section}` `{custom_fields}`\n<\/code><\/pre>\n\n<p>For Other Letters, each extra field you define also becomes a placeholder automatically \u2014 e.g. defining a field with key <code>salary<\/code> adds the <code>{salary}<\/code> placeholder.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>This plugin stores employee data entered by the site administrator. No data is sent to external services except for QR code generation (uses a public QR API or falls back to a local GD-based generator). No tracking or analytics are included.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin optionally connects to two external QR code generation APIs when generating QR codes for employee letters. These APIs are only called <strong>server-side<\/strong> (never from the visitor's browser).<\/p>\n\n<h4>1. goQR.me API<\/h4>\n\n<ul>\n<li><strong>What it does:<\/strong> Generates a QR code PNG image for a verification URL.<\/li>\n<li><strong>When it is called:<\/strong> When a letter is being served and the PHP GD extension is unavailable.<\/li>\n<li><strong>Data sent:<\/strong> The public verification URL only (e.g. <code>https:\/\/yoursite.com\/?evda_verify_doc=XXXX<\/code>). No personal data is transmitted.<\/li>\n<li><strong>Service provider:<\/strong> goQR.me \u2014 https:\/\/goqr.me<\/li>\n<li><strong>Terms of use:<\/strong> https:\/\/goqr.me\/terms-of-use\/<\/li>\n<li><strong>Privacy policy:<\/strong> https:\/\/goqr.me\/privacy-policy\/<\/li>\n<\/ul>\n\n<h4>2. Google Charts API<\/h4>\n\n<ul>\n<li><strong>What it does:<\/strong> Fallback QR code PNG generation if the goQR.me API is unavailable.<\/li>\n<li><strong>When it is called:<\/strong> Only if the goQR.me API call fails and PHP GD is unavailable.<\/li>\n<li><strong>Data sent:<\/strong> The public verification URL only. No personal data is transmitted.<\/li>\n<li><strong>Service provider:<\/strong> Google LLC \u2014 https:\/\/developers.google.com\/chart<\/li>\n<li><strong>Terms of use:<\/strong> https:\/\/developers.google.com\/terms<\/li>\n<li><strong>Privacy policy:<\/strong> https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p>If both external APIs are unavailable, the plugin automatically falls back to a locally-generated placeholder using the PHP GD library \u2014 no external request is made.<\/p>\n\n<h3>License<\/h3>\n\n<p>This plugin is free software: you can redistribute it and\/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or any later version.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>employee-verification-document-authentication<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Activate the plugin. Database tables are created automatically.<\/li>\n<li>Create two WordPress pages and add shortcodes:\n\n<ul>\n<li>A page with <code>[evda_employee_verification]<\/code><\/li>\n<li>A page with <code>[evda_document_verification]<\/code><\/li>\n<\/ul><\/li>\n<li>Go to <strong>Employee Verify \u2192 Settings \u2192 General<\/strong> and assign those pages.<\/li>\n<li>Upload your company logo and configure styling as desired.<\/li>\n<li>Go to <strong>Employee Verify \u2192 Settings \u2192 Other Letters<\/strong> to review or customise the built-in letter types and their templates.<\/li>\n<li>Add employees under <strong>Employee Verify \u2192 Employees<\/strong> and start generating letters.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20any%20extra%20libraries%20or%20composer%3F\"><h3>Do I need any extra libraries or Composer?<\/h3><\/dt>\n<dd><p>No. The plugin works out of the box with no dependencies. Letters are rendered as printer-friendly HTML pages which users can save as PDF using Ctrl+P \u2192 Save as PDF.<\/p><\/dd>\n<dt id=\"are%20generated%20letters%20affected%20by%20settings%20changes%3F\"><h3>Are generated letters affected by settings changes?<\/h3><\/dt>\n<dd><p>Yes. Letters are rendered live on every view, so any change to typography, colours, signature, footer message, or other settings is immediately reflected on all existing letters without needing to regenerate them.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20a%20new%20letter%20type%3F\"><h3>How do I add a new letter type?<\/h3><\/dt>\n<dd><p>Go to <strong>Employee Verify \u2192 Settings \u2192 Other Letters<\/strong> and click <strong>\"+ Add New Letter Type\"<\/strong>. Enter the letter name, template, and any extra fields you need. The new type will appear immediately in the \"Other Letters\" dropdown on the Employees page.<\/p><\/dd>\n<dt id=\"what%20are%20extra%20fields%20in%20a%20letter%20type%3F\"><h3>What are extra fields in a letter type?<\/h3><\/dt>\n<dd><p>Extra fields are letter-specific inputs that the admin fills in when generating a letter. For example, a Salary Certificate might have a \"Monthly Salary\" extra field. The value entered is automatically injected into the letter template via its <code>{placeholder}<\/code>. You define both the label and the placeholder key when creating the letter type.<\/p><\/dd>\n<dt id=\"can%20i%20issue%20multiple%20letters%20of%20the%20same%20type%20to%20one%20employee%3F\"><h3>Can I issue multiple letters of the same type to one employee?<\/h3><\/dt>\n<dd><p>It depends on the letter type. Internship and Experience letters enforce one per employee. For Other Letters, you can toggle \"Allow Multiple\" when creating or editing the letter type \u2014 useful for types like Salary Certificate or Warning Letter.<\/p><\/dd>\n<dt id=\"is%20the%20verification%20system%20secure%3F\"><h3>Is the verification system secure?<\/h3><\/dt>\n<dd><p>Verification IDs are 16-character uppercase hex strings generated using PHP's <code>random_bytes()<\/code> (cryptographically secure). All inputs are sanitized and validated. All admin actions are protected by WordPress nonces and capability checks. Database queries use <code>$wpdb-&gt;prepare()<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20reset%20the%20letter%20templates%20to%20the%20professional%20defaults%3F\"><h3>Can I reset the letter templates to the professional defaults?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>Employee Verify \u2192 Settings \u2192 Other Letters<\/strong> and click <strong>\"\ud83d\udd04 Reset Templates to Default\"<\/strong>. This restores all letter templates and email content to the built-in professional HR content without affecting your letter type definitions or settings.<\/p><\/dd>\n<dt id=\"can%20i%20search%20and%20filter%20employees%3F\"><h3>Can I search and filter employees?<\/h3><\/dt>\n<dd><p>Yes. The Employees page has a filter toolbar with a search box, department dropdown, and status dropdown. All filters can be combined. Active filters are shown as badges with a count of matching employees.<\/p><\/dd>\n<dt id=\"can%20i%20export%20employee%20data%3F\"><h3>Can I export employee data?<\/h3><\/dt>\n<dd><p>Yes. Use the <strong>Export CSV<\/strong> button on the Employees page. The export respects any active search and filter settings, so you can export only the employees matching your current view.<\/p><\/dd>\n<dt id=\"can%20i%20bulk-import%20employees%3F\"><h3>Can I bulk-import employees?<\/h3><\/dt>\n<dd><p>Yes. Use the <strong>Import CSV<\/strong> button on the Employees page. The CSV should include headers: <code>employee_id, full_name, position, department, joining_date, intern_start, intern_end, status<\/code>.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20data%20when%20i%20deactivate%20the%20plugin%3F\"><h3>What happens to data when I deactivate the plugin?<\/h3><\/dt>\n<dd><p>Deactivating the plugin preserves all employee, document, and settings data. Data is only removed if you fully uninstall (delete) the plugin.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>New: Dynamic \"Other Letters\" system \u2014 create unlimited custom letter types from Settings \u2192 Other Letters without writing any code.<\/li>\n<li>New: 9 professional HR letter types included out of the box: Bank Account Opening Letter, Salary Certificate, Joining Letter, Promotion Letter, Warning Letter, Transfer Letter, Relieving Letter, No Objection Certificate, and Custom Employee Letter.<\/li>\n<li>New: Each letter type supports custom extra fields \u2014 define fields like \"Monthly Salary\" or \"Bank Name\" that appear in a modal when generating; values become {placeholders} in the template automatically.<\/li>\n<li>New: \"Other Letters \u25be\" dropdown on the Employees page \u2014 dynamically shows all active letter types; adding a new type in Settings makes it appear immediately with no code changes.<\/li>\n<li>New: Letter Type Editor modal in Settings \u2192 Other Letters \u2014 configure name, slug, status, allow-multiple, letter template, email subject\/body, and extra fields.<\/li>\n<li>New: \"Reset Templates to Default\" button \u2014 one click restores all 9 professional HR letter templates and email content.<\/li>\n<li>New: Custom Employee Letter type \u2014 enter a custom title and full letter content when generating; all standard placeholders work.<\/li>\n<li>New: All Other Letters are saved to the Documents system with full verification IDs, QR codes, and public verification support.<\/li>\n<li>New: Auto-email support for all Other Letter types using per-type email subject and body.<\/li>\n<li>Improvement: Employee filter toolbar \u2014 filter by Department and Status with active filter badges showing result count.<\/li>\n<li>Improvement: Export Employees CSV \u2014 respects active search\/filter settings; UTF-8 BOM for Excel compatibility.<\/li>\n<li>Improvement: document_type column increased to VARCHAR(100); notes column changed to TEXT for larger JSON payloads.<\/li>\n<li>Security: All new AJAX endpoints (generate, save, delete letter type; export employees) protected by check_ajax_referer() + current_user_can('manage_options').<\/li>\n<li>Security: All new POST inputs unslashed and sanitized via dedicated helper methods.<\/li>\n<li>Backward compatible: All existing Internship Letter and Experience Letter functionality is unchanged.<\/li>\n<\/ul>\n\n<h4>1.3.4<\/h4>\n\n<ul>\n<li>Fixed: All Plugin Check SQL warnings resolved \u2014 rewrote EVDA_Employee::get_all() and count() using explicit hardcoded query-per-filter-combination approach.<\/li>\n<li>Fixed: WordPress.DB.PreparedSQL warnings (NotPrepared, InterpolatedNotPrepared, ReplacementsWrongNumber, UnfinishedPrepare, UnescapedDBParameter) all cleared.<\/li>\n<li>Fixed: Translators comment added to employee count string in filter bar.<\/li>\n<li>Improvement: Employee filter and export fully compliant with WordPress Plugin Check (PCP).<\/li>\n<\/ul>\n\n<h4>1.3.3<\/h4>\n\n<ul>\n<li>New: Employee filter bar \u2014 filter by Department and Status with active filter badges.<\/li>\n<li>New: Export Employees CSV \u2014 exports all employees matching current filters with one click.<\/li>\n<li>Improvement: Filters persist across pagination pages.<\/li>\n<li>Improvement: Modern toolbar UI with inputs, dropdowns, and action buttons.<\/li>\n<li>Security: Export AJAX handler uses check_ajax_referer() + current_user_can() + whitelisted status values.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Security: Complete nonce and permissions audit \u2014 all AJAX handlers verified; nonce never used alone for authorization.<\/li>\n<li>Security: Full output escaping audit \u2014 all echo statements use appropriate escaping functions.<\/li>\n<li>Security: DB error messages no longer exposed to browser.<\/li>\n<li>Fixed: QR code not displaying on document verification page.<\/li>\n<li>Fixed: Added guaranteed base64 fallback so QR code area never renders as broken image.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Fixed: wp_enqueue compliance \u2014 removed all inline script\/style tags.<\/li>\n<li>Fixed: Nonces and permissions \u2014 added current_user_can() + wp_verify_nonce() to page_employees().<\/li>\n<li>Fixed: Escaping \u2014 all echo statements now use proper escaping functions.<\/li>\n<li>Fixed: Unsafe SQL \u2014 all table name variables wrapped with esc_sql(validate_table()); dbDelta() used for schema management.<\/li>\n<li>Fixed: QR code domain validation corrected.<\/li>\n<li>Fixed: Removed empty unused folders.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>wp_enqueue compliance: Removed all inline script and style tags.<\/li>\n<li>Nonces and permissions: Added current_user_can() + wp_verify_nonce() throughout.<\/li>\n<li>Escaping: Replaced echo build_letter() with dedicated EVDA_PDF::output_letter() method.<\/li>\n<li>Unsafe SQL: Replaced raw wpdb-&gt;query() with dbDelta() for schema management.<\/li>\n<li>Prefixing: All ev_\/EV_ identifiers renamed to evda_\/EVDA_.<\/li>\n<\/ul>\n\n<h4>1.2.7<\/h4>\n\n<ul>\n<li>Added saqibabbasi to Contributors list.<\/li>\n<li>Replaced inline style block in letter renderer with a PHP variable.<\/li>\n<li>Added server-side hash token validation to the QR image AJAX endpoint.<\/li>\n<li>Renamed all classes, functions, defines, AJAX actions, and option names from ev_\/EV_ to evda_\/EVDA_ prefix.<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li>Fixed last Plugin Check warning: added phpcs:ignore on is_uploaded_file() line.<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Fixed all remaining Plugin Check warnings: wp_unslash() on email color fields, phpcs blocks on multi-line DB queries, input sanitization for array_map patterns.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Fixed admin Settings page tabs not working after JS refactor.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Added proper evda_ prefix to shortcodes.<\/li>\n<li>Moved all inline script and style blocks to enqueued files.<\/li>\n<li>Removed external CDN dependency (qrcodejs); QR codes generated server-side only.<\/li>\n<li>Added External Services documentation for QR API usage disclosure.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Fixed all Plugin Check warnings: wp_unslash(), esc_html\/attr\/url output escaping, isset() validation for POST\/FILES.<\/li>\n<\/ul>\n\n<h4>1.1.7<\/h4>\n\n<ul>\n<li>Centered footer text on letters.<\/li>\n<li>Updated plugin header to WordPress repository standards.<\/li>\n<\/ul>\n\n<h4>1.1.6<\/h4>\n\n<ul>\n<li>Tasks\/responsibilities now display in a 3-column grid layout on letters.<\/li>\n<\/ul>\n\n<h4>1.1.5<\/h4>\n\n<ul>\n<li>Fixed live letter URL containing dynamic: prefix causing Document not found error.<\/li>\n<\/ul>\n\n<h4>1.1.4<\/h4>\n\n<ul>\n<li>Major: Letters now render live on every view \u2014 settings changes apply instantly to all existing letters.<\/li>\n<li>No more static HTML files stored on disk.<\/li>\n<li>Added one-click migration tool for existing static letters.<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Fixed document delete not removing the file from disk.<\/li>\n<li>Fixed patch counter reporting wrong number.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Footer now always pinned to the bottom of the A4 page using flexbox.<\/li>\n<li>Added custom footer message field.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed fatal error on plugin deactivation.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Fixed WordPress admin footer appearing inside settings panel.<\/li>\n<li>Letters now fixed at A4 size (794px x 1123px screen, 210mm x 297mm print).<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Added signature block setting: enable\/disable, name, title, and uploaded image.<\/li>\n<li>Added one-click tool to remove old Authorized Signatory block from existing letters.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Added configurable employee search fields (Employee ID, Full Name, CNIC).<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Added Father Name, CNIC, Tasks Completed, and Leaving Date fields.<\/li>\n<li>Added custom fields system with per-employee values.<\/li>\n<li>Editable letter templates with full placeholder support.<\/li>\n<li>Settings page redesigned with tabbed layout.<\/li>\n<\/ul>","raw_excerpt":"Complete HR document management \u2014 manage employees, issue QR-verified letters, and let anyone verify authenticity using simple shortcodes.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/290028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=290028"}],"author":[{"embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/saqibabbasi"}],"wp:attachment":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=290028"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=290028"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=290028"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=290028"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=290028"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=290028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}