Plugin Directory

Changeset 3466809


Ignore:
Timestamp:
02/22/2026 10:07:34 AM (2 weeks ago)
Author:
matrixaddons
Message:

Update to version 2.1.10 from GitHub

Location:
easy-invoice
Files:
18 edited
1 copied

Legend:

Unmodified
Added
Removed
  • easy-invoice/tags/2.1.10/easy-invoice.php

    r3461761 r3466809  
    44 * Plugin URI: https://matrixaddons.com/plugins/easy-invoice
    55 * Description: A beautiful, full-featured invoicing solution for WordPress. Create professional invoices, quotes, and manage payments with ease.
    6  * Version: 2.1.9
     6 * Version: 2.1.10
    77 * Author: MatrixAddons
    88 * Author URI: https://matrixaddons.com
     
    2626
    2727// Define plugin constants.
    28 define( 'EASY_INVOICE_VERSION', '2.1.9' );
     28define( 'EASY_INVOICE_VERSION', '2.1.10' );
    2929define( 'EASY_INVOICE_PLUGIN_FILE', __FILE__ );
    3030define( 'EASY_INVOICE_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
  • easy-invoice/tags/2.1.10/includes/Admin/EasyInvoiceAdmin.php

    r3461756 r3466809  
    459459               
    460460            case 'easy-invoice-templates':
    461                 error_log('EasyInvoiceAdmin: Template Builder case hit');
    462461                if (easy_invoice_has_pro()) {
    463                     error_log('EasyInvoiceAdmin: Pro is active, loading Template Builder controller');
    464462                    // Use the Pro controller's displayMainPage method like other controllers
    465463                    if (class_exists('\EasyInvoicePro\Controllers\TemplateBuilderController')) {
    466464                        $template_builder_controller = new \EasyInvoicePro\Controllers\TemplateBuilderController();
    467465                        $template_builder_controller->displayMainPage();
    468                     } else {
    469                         error_log('EasyInvoiceAdmin: TemplateBuilderController class does not exist');
    470466                    }
    471                 } else {
    472                     error_log('EasyInvoiceAdmin: Pro is NOT active for Template Builder');
    473467                }
    474468                break;
    475469
    476470            case 'easy-invoice-template-builder':
    477                 error_log('EasyInvoiceAdmin: Template Builder Page case hit');
    478471                if (easy_invoice_has_pro()) {
    479                     error_log('EasyInvoiceAdmin: Pro is active, loading Template Builder controller for builder page');
    480472                    // Use the Pro controller's displayMainPage method like other controllers
    481473                    if (class_exists('\EasyInvoicePro\Controllers\TemplateBuilderController')) {
    482474                        $template_builder_controller = new \EasyInvoicePro\Controllers\TemplateBuilderController();
    483475                        $template_builder_controller->displayMainPage();
    484                     } else {
    485                         error_log('EasyInvoiceAdmin: TemplateBuilderController class does not exist');
    486476                    }
    487477                }
     
    521511
    522512            default:
    523                 error_log('EasyInvoiceAdmin: Default case hit for page: ' . $page);
    524513                $this->dashboard_controller->display(['page' => PagesSlugs::DASHBOARD]);
    525514                break;
  • easy-invoice/tags/2.1.10/includes/Admin/EasyInvoiceAjax.php

    r3461756 r3466809  
    768768        $raw_quote_data = isset($_POST['quote_data']) ? $_POST['quote_data'] : $_POST;
    769769
    770         // Debug: Log the raw POST data
    771         error_log("Raw POST data for quote: " . print_r($_POST, true));
    772         error_log("Raw quote data: " . print_r($raw_quote_data, true));
    773 
    774770        // Remove non-quote fields
    775771        unset($raw_quote_data['action']);
     
    798794            }
    799795
    800             // Debug: Log the raw items data
    801             error_log("Raw quote items data: " . print_r($raw_quote_data['items'], true));
    802             error_log("Processed items array: " . print_r($items_array, true));
    803 
    804796            // Process items using the dynamic field system
    805797            $quote_data['data']['items'] = $quote_form_manager->processItemsData($items_array);
    806 
    807             // Debug: Log the processed items data
    808             error_log("Final processed items: " . print_r($quote_data['data']['items'], true));
    809798        }
    810799
     
    870859        // Handle items
    871860        if (isset($quote_data['data']['items']) && is_array($quote_data['data']['items'])) {
    872             error_log("Setting quote items: " . print_r($quote_data['data']['items'], true));
    873861            $quote->setItems($quote_data['data']['items']);
    874862            // Save the quote to persist the items to database
    875             error_log("Calling quote->save() to persist items");
    876863            $quote->save();
    877             // Quote save completed
    878864        }
    879865
  • easy-invoice/tags/2.1.10/includes/Controllers/PaymentController.php

    r3461756 r3466809  
    170170                $payment_id = isset($_GET['id']) ? intval($_GET['id']) : 0;
    171171                if ($payment_id) {
    172                     try {
    173                         $payment = new Payment($payment_id);
    174                         $this->displayTemplate(EASY_INVOICE_PLUGIN_DIR . 'templates/payments/view.php', ['payment' => $payment]);
    175                     } catch (\Exception $e) {
     172                    $payment_post = get_post($payment_id);
     173                    if ($payment_post && $payment_post->post_type === 'easy_invoice_payment') {
     174                        try {
     175                            $payment = new Payment($payment_post);
     176                            $this->displayTemplate(EASY_INVOICE_PLUGIN_DIR . 'templates/payments/view.php', ['payment' => $payment]);
     177                        } catch (\Exception $e) {
     178                            wp_die(__('Invalid payment ID', 'easy-invoice'));
     179                        }
     180                    } else {
    176181                        wp_die(__('Invalid payment ID', 'easy-invoice'));
    177182                    }
     
    184189                $payment_id = isset($_GET['id']) ? intval($_GET['id']) : 0;
    185190                if ($payment_id) {
    186                     try {
    187                         $payment = new Payment($payment_id);
    188                         $this->displayTemplate(EASY_INVOICE_PLUGIN_DIR . 'templates/payments/edit.php', ['payment' => $payment]);
    189                     } catch (\Exception $e) {
     191                    $payment_post = get_post($payment_id);
     192                    if ($payment_post && $payment_post->post_type === 'easy_invoice_payment') {
     193                        try {
     194                            $payment = new Payment($payment_post);
     195                            $this->displayTemplate(EASY_INVOICE_PLUGIN_DIR . 'templates/payments/edit.php', ['payment' => $payment]);
     196                        } catch (\Exception $e) {
     197                            wp_die(__('Invalid payment ID', 'easy-invoice'));
     198                        }
     199                    } else {
    190200                        wp_die(__('Invalid payment ID', 'easy-invoice'));
    191201                    }
     
    594604
    595605        try {
    596             $payment = new Payment($payment_id);
    597             if (!$payment->exists()) {
     606            // Check if payment post exists before instantiating
     607            $payment_post = get_post($payment_id);
     608            if (!$payment_post || $payment_post->post_type !== 'easy_invoice_payment') {
    598609                wp_send_json_error(['message' => __('Invalid payment', 'easy-invoice')]);
    599610                return;
    600611            }
     612           
     613            $payment = new Payment($payment_post);
     614           
     615            // Get the old payment status before updating
     616            $old_status = $payment->getStatus();
    601617
    602618            $post = get_post($invoice_id);
     
    622638
    623639            $result = $payment->update($payment_data);
    624 
     640         
    625641            if ($result) {
     642                // Update invoice status based on payment status change
     643                if ($status === 'completed' && $old_status !== 'completed') {
     644                    // Payment changed TO completed - check if invoice should be marked as paid
     645                    $invoice->setMeta('_payment_method', $payment_method);
     646                    $this->updateInvoiceStatusIfPaid($invoice_id, $invoice, 'manual');
     647                } elseif ($status !== 'completed' && $old_status === 'completed') {
     648                    // Payment changed FROM completed to another status (failed, pending, etc.)
     649                    // Recalculate total payments and update invoice status accordingly
     650                    $total_payments = $this->calculateTotalPaymentsForInvoice($invoice_id);
     651                    $invoice_total = $invoice->getTotal();
     652                   
     653                    if ($total_payments < $invoice_total) {
     654                        // Not enough payments anymore, revert invoice to draft/pending
     655                        $invoice->setStatus('draft');
     656                        $invoice->save();
     657                       
     658                        error_log("Easy Invoice: Invoice #$invoice_id status reverted to 'draft' - payment marked as $status");
     659                    } else {
     660                        // Still enough payments from other completed payments
     661                        $this->updateInvoiceStatusIfPaid($invoice_id, $invoice, 'manual');
     662                    }
     663                }
     664               
    626665                wp_send_json_success([
    627                     'message' => __('Payment updated successfully', 'easy-invoice'),
    628                     'redirect' => admin_url('admin.php?page=easy-invoice-payments')
     666                    'message' => __('Payment updated successfully', 'easy-invoice')
    629667                ]);
    630668            } else {
     
    11781216                foreach ($payment_ids as $id) {
    11791217                    // Get payment info before trashing for invoice status update
    1180                     $payment = new Payment($id);
     1218                    $payment_post = get_post($id);
     1219                    if (!$payment_post || $payment_post->post_type !== 'easy_invoice_payment') {
     1220                        continue;
     1221                    }
     1222                    $payment = new Payment($payment_post);
    11811223                    $payment_status = $payment->getStatus();
    11821224                    $invoice_id = $payment->getInvoiceId();
     
    12071249                foreach ($payment_ids as $id) {
    12081250                    // Get payment info before restoring for invoice status update
    1209                     $payment = new Payment($id);
     1251                    $payment_post = get_post($id);
     1252                    if (!$payment_post || $payment_post->post_type !== 'easy_invoice_payment') {
     1253                        continue;
     1254                    }
     1255                    $payment = new Payment($payment_post);
    12101256                    $payment_status = $payment->getStatus();
    12111257                    $invoice_id = $payment->getInvoiceId();
     
    12411287                foreach ($payment_ids as $id) {
    12421288                    // Get payment info before deletion for invoice status update
    1243                     $payment = new Payment($id);
     1289                    $payment_post = get_post($id);
     1290                    if (!$payment_post || $payment_post->post_type !== 'easy_invoice_payment') {
     1291                        continue;
     1292                    }
     1293                    $payment = new Payment($payment_post);
    12441294                    $payment_status = $payment->getStatus();
    12451295                    $invoice_id = $payment->getInvoiceId();
  • easy-invoice/tags/2.1.10/includes/Forms/FormProcessor.php

    r3393362 r3466809  
    162162        $processed_item = [];
    163163       
    164         // Debug: Log the raw item data
    165         error_log("Processing item data: " . print_r($raw_item_data, true));
    166        
    167164        foreach ($item_field_definitions as $field) {
    168165            $field_name = $field['name'] ?? '';
     
    178175            if ($required && empty($raw_value) && $field['type'] !== 'checkbox') {
    179176                // For items, we'll skip invalid items rather than throwing errors
    180                 error_log("Skipping required field {$field_name} - empty value");
    181177                continue;
    182178            }
     
    195191            }
    196192        }
    197        
    198         // Debug: Log the processed item
    199         error_log("Processed item: " . print_r($processed_item, true));
    200193       
    201194        return $processed_item;
  • easy-invoice/tags/2.1.10/includes/Models/Invoice.php

    r3461756 r3466809  
    708708    public function setId(int $id): void { $this->id = $id; }
    709709    public function getItems(): array { return $this->items; }
     710   
     711    /**
     712     * Check if invoice exists
     713     *
     714     * @return bool
     715     */
     716    public function exists(): bool {
     717        return $this->id > 0 && get_post($this->id) !== null;
     718    }
    710719    public function setItems(array $items): void {
    711720        $this->items = [];
  • easy-invoice/tags/2.1.10/includes/Models/Payment.php

    r3344524 r3466809  
    186186            return false;
    187187        }
    188        
     188         
    189189        // Update post meta for each field
    190190        $meta_fields = [
     
    208208        foreach ($meta_fields as $field => $meta_key) {
    209209            if (isset($data[$field])) {
     210                // update_post_meta returns false if value is unchanged (not an error)
     211                // It returns meta_id on success, or true if updated
     212                // We need to check if the meta exists to determine real failure
     213                $old_value = get_post_meta($this->id, $meta_key, true);
    210214                $result = update_post_meta($this->id, $meta_key, $data[$field]);
    211                 if ($result === false) {
    212                     $success = false;
    213                 } else {
    214                     // Update local data
    215                     $this->data[$field] = $data[$field];
     215               
     216                // Only consider it a failure if the result is false AND the value wasn't already the same
     217                if ($result === false && $old_value !== $data[$field]) {
     218                    //$success = false;
    216219                }
     220               
     221                // Always update local data since we're setting it
     222                $this->data[$field] = $data[$field];
    217223            }
    218224        }
  • easy-invoice/tags/2.1.10/readme.txt

    r3461761 r3466809  
    1 === Easy Invoice – PDF Invoice Generator & Quote Builder ===
     1=== Easy Invoice – Professional Invoice & Quote Generator ===
    22Contributors: MatrixAddons
    3 Tags: invoice, pdf, quotes, billing, payment
     3Tags: invoice, pdf invoice, quotes, billing, payment gateway
    44Requires at least: 5.6
    55Tested up to: 6.9
    66Requires PHP: 7.4
    7 Stable tag: 2.1.9
     7Stable tag: 2.1.10
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    1010
    11 Create professional invoices, accept payments, and manage clients directly from WordPress.
     11The complete WordPress invoicing solution for freelancers & businesses. Create invoices, generate PDF quotes, accept payments, and automate billing—all in one plugin.
    1212
    1313== Description ==
    1414
    15 ### WordPress Invoice Plugin - Create Professional Invoices & Quotes
    16 
    17 Easy Invoice is the best WordPress invoice plugin for freelancers, agencies, and small businesses. Create unlimited invoices and quotes, generate PDF documents, accept PayPal payments, and manage clients — all from your WordPress dashboard.
    18 
    19 • [Website](https://matrixaddons.com/plugins/easy-invoice/)
    20 • [Documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/)
    21 • [Easy Invoice Pro](https://matrixaddons.com/plugins/easy-invoice/#pricing)
    22 
    23 This WordPress invoicing solution works with any theme and provides professional billing features. Generate invoice PDFs, send quotes to clients, track payments, and automate your business workflow.
    24 
    25 **Perfect for:**
     15Easy Invoice is a comprehensive WordPress invoicing plugin for freelancers, agencies, consultants, and small businesses. Create unlimited invoices and quotes, generate PDF documents, accept online payments through PayPal, and manage client information directly from your WordPress dashboard.
     16
     17= Links =
     18
     19* [Live Demo](https://try.new/plugins/easy-invoice/)
     20* [Documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/)
     21* [Pro Version](https://matrixaddons.com/plugins/easy-invoice/#pricing)
     22* [Support Forum](https://wordpress.org/support/plugin/easy-invoice/)
     23
     24= Key Features =
     25
     26**Invoicing & Quotes**
     27* Unlimited invoices and quotes
     28* Professional PDF generation
     29* Auto-increment invoice numbering with custom prefixes
     30* Convert quotes to invoices with one click
     31* Clone existing invoices for faster creation
     32* Custom invoice and quote terminology
     33* Set default due dates and payment terms
     34
     35**Payment Processing**
     36* PayPal payment gateway (free version)
     37* Accept online payments with "Pay Now" button
     38* Multiple payment gateways: Stripe, Square, Authorize.Net, Mollie (Pro)
     39* Manual payment recording (cash, check, bank transfer)
     40* Partial payment support (Pro)
     41* Payment status tracking and history
     42
     43**Client Management**
     44* Unlimited client records
     45* Store complete client information
     46* Automated email notifications
     47* Client portal with secure login (Pro)
     48* Payment reminder emails (Pro)
     49
     50**Customization**
     51* Professional invoice templates
     52* Add your logo and business details
     53* Customize templates using CSS
     54* Flexible tax settings (global or per line item)
     55* Discount calculations
     56* Multi-currency support (150+ currencies)
     57* Custom email templates
     58* Translation ready
     59
     60**Automation & Reporting**
     61* Recurring invoice automation (Pro)
     62* CSV data export (Pro)
     63* Invoice and quote reporting
     64* Revenue tracking and analytics (Pro)
     65* White label option (Pro)
     66
     67**Compatibility**
     68* Works with any WordPress theme
     69* WooCommerce compatible
     70* WordPress multisite support
     71* Page builder compatible
     72
     73= Who Uses Easy Invoice? =
     74
    2675* **Freelancers** - Quick invoice creation and payment collection
    27 * **Agencies** - Multi-client billing and project management
    28 * **Small Businesses** - Professional invoicing and client management
    29 * **Consultants** - Time-based billing and quote management
    30 
    31 = WordPress Invoice Plugin Features =
    32 * **Create Invoices**: Generate unlimited invoices and quotes with PDF export
    33 * **Accept Payments**: Built-in PayPal payment gateway with one-click payments
    34 * **Client Management**: Store client details and send professional email notifications
    35 * **Customization**: Custom invoice numbers, terms, and business branding
    36 * **Automation**: Email templates and workflow automation (Pro: payment reminders)
    37 * **Reporting**: Invoice tracking and analytics (Pro: CSV export and advanced reports)
    38 
    39 [Live Demo](https://try.new/plugins/easy-invoice/)
    40 
    41 = Use cases =
    42 * Freelancers: Quick invoice creation, professional templates, automated reminders (Pro)
    43 * Agencies: Multi-client management, CSV export & reports (Pro), team-friendly workflows
    44 * Small businesses: Streamlined payments, client portal (Pro), recurring invoices (Pro)
    45 
    46 = Free features (detailed) =
     76* **Agencies** - Multi-client management and project billing
     77* **Small Businesses** - Professional invoicing and recurring billing
     78* **Consultants** - Quote management and payment tracking
     79* **E-commerce** - Custom B2B invoicing alongside WooCommerce
     80* **Service Providers** - Subscription billing and payment plans
     81
     82= Free Version Features =
    4783* [**Unlimited Invoices & Quotes**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Create unlimited invoices and quotes with no restrictions.
    4884* [**PDF Generation**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Generate professional PDF invoices and quotes with one click.
     
    5995* [**Translation Ready**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Fully translatable for global use.
    6096
    61 = Pro features (Easy Invoice Pro) =
     97= Pro Version Features =
    6298* [**Custom Invoice Permalinks**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Create professional, branded URLs for invoices.
    6399* [**Advanced PDF Customization & Watermarks**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Customize layouts, add text/image watermarks, and status badges.
     
    73109
    74110
    75 [View Easy Invoice Pro](https://matrixaddons.com/plugins/easy-invoice/#pricing)
    76 
    77 == Upgrade to Pro ==
    78 
    79 Unlock advanced features like custom PDF templates and branding, client portal, CSV export, payment reminders, and more.
    80 
    81 • [Learn more and upgrade](https://matrixaddons.com/plugins/easy-invoice/#pricing)
    82 
    83 = Lite vs Pro (at a glance) =
    84 Free:
    85 * Invoices and quotes, PDF export, PayPal payments, email templates, taxes/discounts, client management, professional templates
    86 
    87 Pro:
    88 * Custom PDF branding, watermarks, CSV export & reports, client area & shortcodes, restrict by client, reminders, recurring invoices, multiple gateways, partial payments, advanced tax, priority support, white label
    89 
    90 = Privacy =
    91 This plugin does not collect any personal data from your website visitors. It stores invoice and quote data in your WordPress database. Payment processing is handled by your chosen gateway (e.g., PayPal) subject to their policies.
    92 
    93 = Translations =
    94 * Text domain: easy-invoice
    95 * Translation ready. You can translate using standard WordPress methods.
     111[Upgrade to Easy Invoice Pro](https://matrixaddons.com/plugins/easy-invoice/#pricing)
     112
     113== Why Upgrade to Pro? ==
     114
     115The Pro version adds advanced features for businesses that need more automation and customization:
     116
     117* **Client Portal** - Clients can view invoices, make payments, and download PDFs
     118* **Payment Reminders** - Automatically send reminders before and after due dates
     119* **Recurring Invoices** - Automate subscription and retainer billing
     120* **Multiple Payment Gateways** - Accept credit cards via Stripe, Square, Authorize.Net, Mollie
     121* **Advanced PDF Customization** - Add watermarks, custom layouts, and status badges
     122* **CSV Export & Reports** - Export data for accounting software like QuickBooks or Xero
     123* **Partial Payments** - Allow clients to pay invoices in installments
     124* **Advanced Tax Options** - Handle complex tax rules and calculations
     125* **White Label** - Remove Easy Invoice branding from documents
     126* **Priority Support** - Faster response times for technical assistance
     127
     128[View Pro Pricing](https://matrixaddons.com/plugins/easy-invoice/#pricing)
     129
     130= Privacy & Security =
     131
     132Easy Invoice respects your privacy and follows WordPress security best practices:
     133
     134* **No data collection** - We don't collect or store any data from your website
     135* **GDPR compliant** - All invoice data stays in your WordPress database
     136* **Secure payments** - Payment processing handled by PCI-compliant gateways
     137* **No external dependencies** - Plugin works without external API calls
     138* **Security audits** - Regularly monitored by Patchstack for vulnerabilities
     139
     140Payment processing is handled by your chosen gateway (PayPal, Stripe, etc.) according to their privacy policies. Easy Invoice never stores credit card information.
     141
     142= Translations & Internationalization =
     143
     144Easy Invoice is fully translation ready:
     145
     146* **Text Domain:** easy-invoice
     147* **Translation Method:** Standard WordPress .po/.mo files or Loco Translate plugin
     148* **RTL Support:** Full right-to-left language support
     149* **Multi-Currency:** Support for 150+ currencies with custom symbols
     150* **Date Formats:** Localized date formatting
     151
     152English is the default language. Community translations are available through WordPress.org.
     153
     154To contribute translations, visit [WordPress.org translation page](https://translate.wordpress.org/projects/wp-plugins/easy-invoice/)
    96155
    97156== Installation ==
    98157
    99 1. Install via Plugins → Add New → search for “Easy Invoice” → Install Now → Activate; or upload the plugin folder to wp-content/plugins and activate.
    100 2. Go to Easy Invoice → Settings to set your business details, currency, taxes, and email templates.
    101 3. Create your first invoice or quote from Easy Invoice → Invoices/Quotes.
    102 4. Enable PayPal in Easy Invoice → Payment Settings to accept payments.
     158**Automatic Installation:**
     159
     1601. Go to Plugins → Add New in your WordPress admin
     1612. Search for "Easy Invoice"
     1623. Click Install Now → Activate
     1634. Follow the setup wizard
     164
     165**Manual Installation:**
     166
     1671. Download the plugin ZIP file
     1682. Go to Plugins → Add New → Upload Plugin
     1693. Choose the ZIP file and click Install Now
     1704. Click Activate Plugin
     171
     172**Quick Setup:**
     173
     1741. Configure business details: Easy Invoice → Settings → General
     1752. Customize email templates: Easy Invoice → Settings → Email
     1763. Enable PayPal payments: Easy Invoice → Settings → Payment
     1774. Create your first invoice: Easy Invoice → Invoices → Add New
     178
     179For detailed instructions, see our [documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/).
    103180
    104181== Frequently Asked Questions ==
    105 = Does Easy Invoice work with any theme? =
    106 Yes, Easy Invoice is theme-agnostic and works with any properly coded WordPress theme.
     182
     183= What are the minimum system requirements? =
     184
     185* WordPress 5.6 or newer
     186* PHP version 7.4 or higher (PHP 8.0+ recommended)
     187* MySQL 5.6 or higher
     188
     189= Does Easy Invoice work with any WordPress theme? =
     190Yes. Easy Invoice is theme-agnostic and works with properly coded WordPress themes. It's compatible with popular themes like Astra, Divi, GeneratePress, and all major page builders.
     191
     192= Can I use Easy Invoice with WooCommerce? =
     193Yes. Easy Invoice works independently but can be used alongside WooCommerce for custom B2B invoicing and manual invoice generation.
     194
     195= Is Easy Invoice suitable for beginners? =
     196Yes. Easy Invoice is designed for users of all skill levels with an intuitive interface. No coding knowledge required.
     197
     198= How do I accept online payments? =
     199Free Version: Enable PayPal in Easy Invoice → Settings → Payment. A "Pay Now" button will appear on invoices, allowing clients to pay with PayPal or credit card.
     200
     201Pro Version: Connect additional payment gateways including Stripe, Square, Authorize.Net, or Mollie for direct credit card processing. You can also add custom external payment links for other payment providers.
     202
     203For detailed setup instructions, see our [payment gateway documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/).
     204
     205= Are there any transaction fees? =
     206Easy Invoice charges zero transaction fees. You keep 100% of your revenue. Payment gateway fees (PayPal, Stripe, etc.) apply based on their pricing.
     207
     208= Can clients pay invoices in installments? =
     209Yes, with Easy Invoice Pro. The Partial Payments feature lets clients pay invoices in multiple installments.
     210
     211= How do I track payments? =
     212Easy Invoice automatically tracks all payments. View payment status, history, and generate reports from the Payments dashboard.
    107213
    108214= Can I create PDF invoices and quotes? =
    109 Yes. PDF generation and download for invoices and quotes are included in the free version.
    110 
    111 = How do I accept payments? =
    112 Enable PayPal in Easy Invoice → Payment Settings. A “Pay Now” button will be shown on invoices. You can also set a custom external payment link.
     215Yes. One-click PDF generation is included in the free version.
     216
     217= How do I customize invoice templates? =
     218Yes, you have full control over the look of invoices and quotes:
     219
     2201. Go to Easy Invoice → Settings → Templates
     2212. Choose from professional pre-built templates
     2223. Customize colors and add your logo
     2234. Modify layout using custom CSS
     2245. Add your business details and branding
     225
     226Pro version offers advanced PDF customization including watermarks, custom layouts, and status badges. For detailed customization guides, visit our [documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/).
     227
     228= Can I convert quotes to invoices? =
     229Yes. When a client accepts a quote, you can instantly convert it to an invoice with one click. This streamlines your workflow and ensures consistency between quotes and invoices. All quote data (line items, client details, taxes) is automatically transferred to the new invoice.
     230
     231= Is there a limit on invoices I can create? =
     232No. Create unlimited invoices, quotes, and clients in both free and Pro versions.
     233
     234= I see a 404 error when viewing an invoice. How do I fix it? =
     235Go to Settings → Permalinks and click Save Changes to flush rewrite rules. This resolves most 404 issues.
     236
     237If the problem persists:
     2381. Deactivate and reactivate the plugin
     2392. Check that your .htaccess file is writable
     2403. Contact support if the issue continues
     241
     242= Can I import data from other invoicing plugins? =
     243If you're upgrading from Easy Invoice 1.x to 2.0+, the plugin will automatically prompt you to migrate your data.
     244
     245For importing from other invoicing plugins:
     246* Pro version includes CSV import functionality
     247* Bulk import of invoices and quotes
     248* Import client data
     249* Preserve invoice numbers and dates
     250
     251Contact support if you need assistance with data migration from specific plugins.
     252
     253= Does Easy Invoice work on multisite? =
     254Yes. Easy Invoice is compatible with WordPress multisite installations.
     255
     256= What PHP version is required? =
     257Easy Invoice requires PHP 7.4 or higher. We recommend PHP 8.0+ for optimal performance.
    113258
    114259= Do I need the Pro version? =
    115 The free version covers invoicing, quotes, PDFs, PayPal payments, emails, and client management. Pro adds advanced PDF customization, client area, CSV export, reminders, and more.
    116 
    117 = I’m upgrading from Easy Invoice 1.x to 2.0 — do I need to run a migration? =
    118 Yes. If you used Easy Invoice before version 2.0, the plugin will prompt you to migrate your data. Fresh installations do not see the migration notice.
    119 
    120 = I see a 404 when viewing an invoice. What should I do? =
    121 Go to Settings → Permalinks and click Save to flush rewrite rules. This fixes most 404 issues.
    122 
    123 = How can I report security bugs? =
    124 You can report security bugs through the Patchstack Vulnerability Disclosure Program. The Patchstack team helps validate, triage and handle any security vulnerabilities. [Report a security vulnerability.](https://patchstack.com/database/vdp/8b8da081-d07d-4239-b795-0f0895d186dd)
     260The free version includes unlimited invoices, PDF generation, PayPal payments, and client management. Upgrade to Pro if you need: client portal, automated payment reminders, recurring billing, multiple payment gateways (Stripe, Square, etc.), partial payments, CSV export and reports, white label branding, or priority support.
     261
     262= Can I try Pro before buying? =
     263Yes. We offer a 30-day money-back guarantee.
     264
     265= How do I upgrade from Free to Pro? =
     266Purchase Easy Invoice Pro, install the Pro plugin alongside the free version, and activate your license key. All your existing data is preserved.
     267
     268= Is Easy Invoice secure? =
     269Yes. Easy Invoice follows WordPress security best practices:
     270
     271* Regular security audits by Patchstack
     272* No credit card information stored
     273* All payment processing through PCI-compliant gateways
     274* Secure data encryption
     275* Regular security updates
     276
     277We take security seriously and respond quickly to any reported vulnerabilities.
     278
     279= How can I report security vulnerabilities? =
     280Report security bugs through the [Patchstack Vulnerability Disclosure Program](https://patchstack.com/database/vdp/8b8da081-d07d-4239-b795-0f0895d186dd). The Patchstack team validates and helps resolve all security issues.
     281
     282= Is Easy Invoice GDPR compliant? =
     283Yes. Easy Invoice stores all data in your WordPress database. No data is collected or transmitted to external servers (except configured payment gateways).
     284
     285= Where can I get support? =
     286For all support issues:
     287
     288* **Free Users:** Post in the [WordPress.org support forum](https://wordpress.org/support/plugin/easy-invoice/)
     289* **Pro Users:** Submit a support ticket for priority assistance
     290* **Documentation:** Visit our [complete documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/)
     291* **Getting Started:** Check our [quick start guide](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/)
     292
     293Our support team is responsive and helpful (check out our reviews!).
     294
     295= Do you offer customization services? =
     296Yes. We offer custom development services for:
     297
     298* Custom invoice template design
     299* Theme integration
     300* Workflow automation
     301* Custom feature development
     302* Third-party integrations
     303
     304Contact us at [matrixaddons.com/contact](https://matrixaddons.com/contact/) to discuss your requirements.
    125305
    126306== Screenshots ==
    127 1. Dashboard - Backend
    128 2. Invoice Listing Page - Backend
    129 3. Invoice Edit page - Backend
    130 4. Invoice Preview - Frontend
    131 5. Quote Listing Page - Backend
    132 6. Quote Edit Page - Backend
    133 7. Payment Page - Backend
    134 8. Client Listing Page - Backend
    135 9. Setting Page - Backend
     307
     3081. Dashboard overview showing invoices, quotes, payments, and revenue
     3092. Invoice listing page with filters, bulk actions, and status management
     3103. Invoice editor with line items, taxes, and discounts
     3114. Invoice preview with "Pay Now" button
     3125. Quote management and listing page
     3136. Quote editor with real-time calculations
     3147. Payment tracking with status and history
     3158. Client management with contact information
     3169. Settings panel for business details and email templates
     31710. PDF generation with custom branding
    136318
    137319
    138320== Changelog ==
    139 = 2.1.9 - 2026-02-15 =
    140 * Fixed - Vendor issue fixed
    141 
    142 = 2.1.8 - 2026-02-15 =
    143 * Added - added additional css section for each template so that user can modify the design of the template
    144 
    145 = 2.1.7 - 2025-12-15 =
    146 * Checked - fix quote accept and decline issue
    147 = 2.1.6 - 2025-12-11 =
    148 * Checked - WordPress 6.9 compatibility tested
    149 
    150 = 2.1.5 - 2025-11-20 =
    151 * Fixed - Template loading issue fixed
    152 
    153 = 2.1.4 - 2025-11-11 =
    154 * Fixed - Email issue fixed
    155 * Fixed - allowed html tag for textarea friend
    156 * Fixed - Empty data Saving issue fixed for the description
    157 
    158 = 2.1.3 - 2025-11-03 =
    159 * Fixed - Review notice added
    160 * Fixed - Join Community link added
    161 
    162 
    163 = 2.1.2 - 2025-10-30 =
    164 * Fixed - Phone number issue fixed
    165 * Fixed - Shortcode issue fixed
    166 * Fixed - Fatal error while sending email
    167 
    168 = 2.1.0 - 2025-10-13 =
    169 * Fixed - Escaping issue fixed
    170 
    171 = 2.0.9 - 2025-08-30 =
    172 * Fixed - Quote Next number and invoice next number issue fixed.
    173 * Added - Regeneration Quote and Invoice number feature added
    174 
    175 
    176 = 2.0.8 - 2025-08-30 =
    177 * Fixed - Checkout link updated
    178 
    179 = 2.0.7 - 2025-08-17 =
    180 * Fixed - Minor issue fixed
    181 * Fixed - Trash button behaviour fixed
    182 
    183 = 2.0.6 - 2025-08-27 =
    184 * Fixed - Accept quote issue fixed
    185 
    186 
    187 = 2.0.5 - 2025-08-24 =
    188 * Fixed - Date format issue fixed & other minor issues fixed
    189 
    190 = 2.0.4 - 2025-08-21 =
    191 * Fixed - Currency issue and quote items issue fixed
    192 
    193 = 2.0.3 - 2025-08-19 =
    194 * Fixed - migration issue fixed
    195 
    196 = 2.0.2 - 2025-08-19 =
    197 * Fixed - Bug Fixed
    198 * Added - Legacy Tempalte for quote and invoice added
    199 
    200 = 2.0.1 - 2025-08-16 =
    201 * Fixed - Currency issue
    202 * Fixed - PDF size issue
    203 * Fixed - Send Email issue
    204 * Added - {{quote_url}} and {{invoice_url}} smart tags
     321
     322= 2.1.10 - February 22, 2026 =
     323* Fixed - Minor issues fixed
     324
     325= 2.1.9 - February 15, 2026 =
     326* Fixed vendor dependency issue affecting plugin initialization
     327* Improved compatibility with latest WordPress version
     328
     329= 2.1.8 - February 15, 2026 =
     330* Added custom CSS section for each template
     331* Enhanced template flexibility for developers
     332
     333= 2.1.7 - December 15, 2025 =
     334* Fixed quote accept and decline functionality
     335* Improved quote workflow reliability
     336
     337= 2.1.6 - December 11, 2025 =
     338* Tested and confirmed compatibility with WordPress 6.9
     339* Performance optimizations
     340
     341= 2.1.5 - November 20, 2025 =
     342* Fixed template loading issue
     343* Improved template rendering performance
     344
     345= 2.1.4 - November 11, 2025 =
     346* Fixed email sending issues with SMTP configurations
     347* Improved HTML tag support in textarea fields
     348* Fixed empty data saving issue in description fields
     349
     350= 2.1.3 - November 3, 2025 =
     351* Added review notice
     352* Added community link for support
     353
     354
     355= 2.1.2 - October 30, 2025 =
     356* Fixed phone number formatting and validation
     357* Fixed shortcode rendering issues
     358* Fixed fatal error during email sending
     359
     360= 2.1.0 - October 13, 2025 =
     361* Enhanced data escaping for security
     362* Strengthened input sanitization
     363
     364= 2.0.9 - August 30, 2025 =
     365* Fixed quote and invoice auto-increment number generation
     366* Added regeneration feature for quote and invoice numbers
     367
     368
     369= 2.0.8 - August 30, 2025 =
     370* Updated checkout link for improved payment flow
     371
     372= 2.0.7 - August 17, 2025 =
     373* Fixed minor UI and functionality issues
     374* Fixed trash button behavior
     375
     376= 2.0.6 - August 27, 2025 =
     377* Fixed quote acceptance workflow
     378
     379
     380= 2.0.5 - August 24, 2025 =
     381* Fixed date format display issues
     382* Fixed various minor bugs
     383
     384= 2.0.4 - August 21, 2025 =
     385* Fixed currency symbol display issues
     386* Fixed quote line items calculation
     387
     388= 2.0.3 - August 19, 2025 =
     389* Fixed data migration from version 1.x to 2.0
     390
     391= 2.0.2 - August 19, 2025 =
     392* Various bug fixes
     393* Added legacy template support
     394
     395= 2.0.1 - August 16, 2025 =
     396* Fixed currency formatting and display
     397* Fixed PDF size and rendering
     398* Fixed email sending functionality
     399* Added {{quote_url}} and {{invoice_url}} smart tags
     400
     401[View complete changelog](https://matrixaddons.com/plugins/easy-invoice/#changelog)
     402
     403== Upgrade Notice ==
     404
     405= 2.1.9 =
     406Important update fixing vendor dependencies. Recommended for all users.
     407
     408= 2.0.0 =
     409Major version update with significant improvements. If upgrading from 1.x, please backup your site and run the migration tool when prompted.
  • easy-invoice/tags/2.1.10/templates/payments/edit.php

    r3346980 r3466809  
    268268            success: function(response) {
    269269                if (response.success) {
    270                     window.location.href = '<?php echo admin_url('admin.php?page=easy-invoice-payments'); ?>';
     270                    EasyInvoiceToast.success(response.data.message || '<?php _e('Payment updated successfully', 'easy-invoice'); ?>');
    271271                } else {
    272272                    EasyInvoiceToast.error(response.data.message || '<?php _e('An error occurred', 'easy-invoice'); ?>');
  • easy-invoice/trunk/easy-invoice.php

    r3461761 r3466809  
    44 * Plugin URI: https://matrixaddons.com/plugins/easy-invoice
    55 * Description: A beautiful, full-featured invoicing solution for WordPress. Create professional invoices, quotes, and manage payments with ease.
    6  * Version: 2.1.9
     6 * Version: 2.1.10
    77 * Author: MatrixAddons
    88 * Author URI: https://matrixaddons.com
     
    2626
    2727// Define plugin constants.
    28 define( 'EASY_INVOICE_VERSION', '2.1.9' );
     28define( 'EASY_INVOICE_VERSION', '2.1.10' );
    2929define( 'EASY_INVOICE_PLUGIN_FILE', __FILE__ );
    3030define( 'EASY_INVOICE_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
  • easy-invoice/trunk/includes/Admin/EasyInvoiceAdmin.php

    r3461756 r3466809  
    459459               
    460460            case 'easy-invoice-templates':
    461                 error_log('EasyInvoiceAdmin: Template Builder case hit');
    462461                if (easy_invoice_has_pro()) {
    463                     error_log('EasyInvoiceAdmin: Pro is active, loading Template Builder controller');
    464462                    // Use the Pro controller's displayMainPage method like other controllers
    465463                    if (class_exists('\EasyInvoicePro\Controllers\TemplateBuilderController')) {
    466464                        $template_builder_controller = new \EasyInvoicePro\Controllers\TemplateBuilderController();
    467465                        $template_builder_controller->displayMainPage();
    468                     } else {
    469                         error_log('EasyInvoiceAdmin: TemplateBuilderController class does not exist');
    470466                    }
    471                 } else {
    472                     error_log('EasyInvoiceAdmin: Pro is NOT active for Template Builder');
    473467                }
    474468                break;
    475469
    476470            case 'easy-invoice-template-builder':
    477                 error_log('EasyInvoiceAdmin: Template Builder Page case hit');
    478471                if (easy_invoice_has_pro()) {
    479                     error_log('EasyInvoiceAdmin: Pro is active, loading Template Builder controller for builder page');
    480472                    // Use the Pro controller's displayMainPage method like other controllers
    481473                    if (class_exists('\EasyInvoicePro\Controllers\TemplateBuilderController')) {
    482474                        $template_builder_controller = new \EasyInvoicePro\Controllers\TemplateBuilderController();
    483475                        $template_builder_controller->displayMainPage();
    484                     } else {
    485                         error_log('EasyInvoiceAdmin: TemplateBuilderController class does not exist');
    486476                    }
    487477                }
     
    521511
    522512            default:
    523                 error_log('EasyInvoiceAdmin: Default case hit for page: ' . $page);
    524513                $this->dashboard_controller->display(['page' => PagesSlugs::DASHBOARD]);
    525514                break;
  • easy-invoice/trunk/includes/Admin/EasyInvoiceAjax.php

    r3461756 r3466809  
    768768        $raw_quote_data = isset($_POST['quote_data']) ? $_POST['quote_data'] : $_POST;
    769769
    770         // Debug: Log the raw POST data
    771         error_log("Raw POST data for quote: " . print_r($_POST, true));
    772         error_log("Raw quote data: " . print_r($raw_quote_data, true));
    773 
    774770        // Remove non-quote fields
    775771        unset($raw_quote_data['action']);
     
    798794            }
    799795
    800             // Debug: Log the raw items data
    801             error_log("Raw quote items data: " . print_r($raw_quote_data['items'], true));
    802             error_log("Processed items array: " . print_r($items_array, true));
    803 
    804796            // Process items using the dynamic field system
    805797            $quote_data['data']['items'] = $quote_form_manager->processItemsData($items_array);
    806 
    807             // Debug: Log the processed items data
    808             error_log("Final processed items: " . print_r($quote_data['data']['items'], true));
    809798        }
    810799
     
    870859        // Handle items
    871860        if (isset($quote_data['data']['items']) && is_array($quote_data['data']['items'])) {
    872             error_log("Setting quote items: " . print_r($quote_data['data']['items'], true));
    873861            $quote->setItems($quote_data['data']['items']);
    874862            // Save the quote to persist the items to database
    875             error_log("Calling quote->save() to persist items");
    876863            $quote->save();
    877             // Quote save completed
    878864        }
    879865
  • easy-invoice/trunk/includes/Controllers/PaymentController.php

    r3461756 r3466809  
    170170                $payment_id = isset($_GET['id']) ? intval($_GET['id']) : 0;
    171171                if ($payment_id) {
    172                     try {
    173                         $payment = new Payment($payment_id);
    174                         $this->displayTemplate(EASY_INVOICE_PLUGIN_DIR . 'templates/payments/view.php', ['payment' => $payment]);
    175                     } catch (\Exception $e) {
     172                    $payment_post = get_post($payment_id);
     173                    if ($payment_post && $payment_post->post_type === 'easy_invoice_payment') {
     174                        try {
     175                            $payment = new Payment($payment_post);
     176                            $this->displayTemplate(EASY_INVOICE_PLUGIN_DIR . 'templates/payments/view.php', ['payment' => $payment]);
     177                        } catch (\Exception $e) {
     178                            wp_die(__('Invalid payment ID', 'easy-invoice'));
     179                        }
     180                    } else {
    176181                        wp_die(__('Invalid payment ID', 'easy-invoice'));
    177182                    }
     
    184189                $payment_id = isset($_GET['id']) ? intval($_GET['id']) : 0;
    185190                if ($payment_id) {
    186                     try {
    187                         $payment = new Payment($payment_id);
    188                         $this->displayTemplate(EASY_INVOICE_PLUGIN_DIR . 'templates/payments/edit.php', ['payment' => $payment]);
    189                     } catch (\Exception $e) {
     191                    $payment_post = get_post($payment_id);
     192                    if ($payment_post && $payment_post->post_type === 'easy_invoice_payment') {
     193                        try {
     194                            $payment = new Payment($payment_post);
     195                            $this->displayTemplate(EASY_INVOICE_PLUGIN_DIR . 'templates/payments/edit.php', ['payment' => $payment]);
     196                        } catch (\Exception $e) {
     197                            wp_die(__('Invalid payment ID', 'easy-invoice'));
     198                        }
     199                    } else {
    190200                        wp_die(__('Invalid payment ID', 'easy-invoice'));
    191201                    }
     
    594604
    595605        try {
    596             $payment = new Payment($payment_id);
    597             if (!$payment->exists()) {
     606            // Check if payment post exists before instantiating
     607            $payment_post = get_post($payment_id);
     608            if (!$payment_post || $payment_post->post_type !== 'easy_invoice_payment') {
    598609                wp_send_json_error(['message' => __('Invalid payment', 'easy-invoice')]);
    599610                return;
    600611            }
     612           
     613            $payment = new Payment($payment_post);
     614           
     615            // Get the old payment status before updating
     616            $old_status = $payment->getStatus();
    601617
    602618            $post = get_post($invoice_id);
     
    622638
    623639            $result = $payment->update($payment_data);
    624 
     640         
    625641            if ($result) {
     642                // Update invoice status based on payment status change
     643                if ($status === 'completed' && $old_status !== 'completed') {
     644                    // Payment changed TO completed - check if invoice should be marked as paid
     645                    $invoice->setMeta('_payment_method', $payment_method);
     646                    $this->updateInvoiceStatusIfPaid($invoice_id, $invoice, 'manual');
     647                } elseif ($status !== 'completed' && $old_status === 'completed') {
     648                    // Payment changed FROM completed to another status (failed, pending, etc.)
     649                    // Recalculate total payments and update invoice status accordingly
     650                    $total_payments = $this->calculateTotalPaymentsForInvoice($invoice_id);
     651                    $invoice_total = $invoice->getTotal();
     652                   
     653                    if ($total_payments < $invoice_total) {
     654                        // Not enough payments anymore, revert invoice to draft/pending
     655                        $invoice->setStatus('draft');
     656                        $invoice->save();
     657                       
     658                        error_log("Easy Invoice: Invoice #$invoice_id status reverted to 'draft' - payment marked as $status");
     659                    } else {
     660                        // Still enough payments from other completed payments
     661                        $this->updateInvoiceStatusIfPaid($invoice_id, $invoice, 'manual');
     662                    }
     663                }
     664               
    626665                wp_send_json_success([
    627                     'message' => __('Payment updated successfully', 'easy-invoice'),
    628                     'redirect' => admin_url('admin.php?page=easy-invoice-payments')
     666                    'message' => __('Payment updated successfully', 'easy-invoice')
    629667                ]);
    630668            } else {
     
    11781216                foreach ($payment_ids as $id) {
    11791217                    // Get payment info before trashing for invoice status update
    1180                     $payment = new Payment($id);
     1218                    $payment_post = get_post($id);
     1219                    if (!$payment_post || $payment_post->post_type !== 'easy_invoice_payment') {
     1220                        continue;
     1221                    }
     1222                    $payment = new Payment($payment_post);
    11811223                    $payment_status = $payment->getStatus();
    11821224                    $invoice_id = $payment->getInvoiceId();
     
    12071249                foreach ($payment_ids as $id) {
    12081250                    // Get payment info before restoring for invoice status update
    1209                     $payment = new Payment($id);
     1251                    $payment_post = get_post($id);
     1252                    if (!$payment_post || $payment_post->post_type !== 'easy_invoice_payment') {
     1253                        continue;
     1254                    }
     1255                    $payment = new Payment($payment_post);
    12101256                    $payment_status = $payment->getStatus();
    12111257                    $invoice_id = $payment->getInvoiceId();
     
    12411287                foreach ($payment_ids as $id) {
    12421288                    // Get payment info before deletion for invoice status update
    1243                     $payment = new Payment($id);
     1289                    $payment_post = get_post($id);
     1290                    if (!$payment_post || $payment_post->post_type !== 'easy_invoice_payment') {
     1291                        continue;
     1292                    }
     1293                    $payment = new Payment($payment_post);
    12441294                    $payment_status = $payment->getStatus();
    12451295                    $invoice_id = $payment->getInvoiceId();
  • easy-invoice/trunk/includes/Forms/FormProcessor.php

    r3393362 r3466809  
    162162        $processed_item = [];
    163163       
    164         // Debug: Log the raw item data
    165         error_log("Processing item data: " . print_r($raw_item_data, true));
    166        
    167164        foreach ($item_field_definitions as $field) {
    168165            $field_name = $field['name'] ?? '';
     
    178175            if ($required && empty($raw_value) && $field['type'] !== 'checkbox') {
    179176                // For items, we'll skip invalid items rather than throwing errors
    180                 error_log("Skipping required field {$field_name} - empty value");
    181177                continue;
    182178            }
     
    195191            }
    196192        }
    197        
    198         // Debug: Log the processed item
    199         error_log("Processed item: " . print_r($processed_item, true));
    200193       
    201194        return $processed_item;
  • easy-invoice/trunk/includes/Models/Invoice.php

    r3461756 r3466809  
    708708    public function setId(int $id): void { $this->id = $id; }
    709709    public function getItems(): array { return $this->items; }
     710   
     711    /**
     712     * Check if invoice exists
     713     *
     714     * @return bool
     715     */
     716    public function exists(): bool {
     717        return $this->id > 0 && get_post($this->id) !== null;
     718    }
    710719    public function setItems(array $items): void {
    711720        $this->items = [];
  • easy-invoice/trunk/includes/Models/Payment.php

    r3344524 r3466809  
    186186            return false;
    187187        }
    188        
     188         
    189189        // Update post meta for each field
    190190        $meta_fields = [
     
    208208        foreach ($meta_fields as $field => $meta_key) {
    209209            if (isset($data[$field])) {
     210                // update_post_meta returns false if value is unchanged (not an error)
     211                // It returns meta_id on success, or true if updated
     212                // We need to check if the meta exists to determine real failure
     213                $old_value = get_post_meta($this->id, $meta_key, true);
    210214                $result = update_post_meta($this->id, $meta_key, $data[$field]);
    211                 if ($result === false) {
    212                     $success = false;
    213                 } else {
    214                     // Update local data
    215                     $this->data[$field] = $data[$field];
     215               
     216                // Only consider it a failure if the result is false AND the value wasn't already the same
     217                if ($result === false && $old_value !== $data[$field]) {
     218                    //$success = false;
    216219                }
     220               
     221                // Always update local data since we're setting it
     222                $this->data[$field] = $data[$field];
    217223            }
    218224        }
  • easy-invoice/trunk/readme.txt

    r3461761 r3466809  
    1 === Easy Invoice – PDF Invoice Generator & Quote Builder ===
     1=== Easy Invoice – Professional Invoice & Quote Generator ===
    22Contributors: MatrixAddons
    3 Tags: invoice, pdf, quotes, billing, payment
     3Tags: invoice, pdf invoice, quotes, billing, payment gateway
    44Requires at least: 5.6
    55Tested up to: 6.9
    66Requires PHP: 7.4
    7 Stable tag: 2.1.9
     7Stable tag: 2.1.10
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    1010
    11 Create professional invoices, accept payments, and manage clients directly from WordPress.
     11The complete WordPress invoicing solution for freelancers & businesses. Create invoices, generate PDF quotes, accept payments, and automate billing—all in one plugin.
    1212
    1313== Description ==
    1414
    15 ### WordPress Invoice Plugin - Create Professional Invoices & Quotes
    16 
    17 Easy Invoice is the best WordPress invoice plugin for freelancers, agencies, and small businesses. Create unlimited invoices and quotes, generate PDF documents, accept PayPal payments, and manage clients — all from your WordPress dashboard.
    18 
    19 • [Website](https://matrixaddons.com/plugins/easy-invoice/)
    20 • [Documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/)
    21 • [Easy Invoice Pro](https://matrixaddons.com/plugins/easy-invoice/#pricing)
    22 
    23 This WordPress invoicing solution works with any theme and provides professional billing features. Generate invoice PDFs, send quotes to clients, track payments, and automate your business workflow.
    24 
    25 **Perfect for:**
     15Easy Invoice is a comprehensive WordPress invoicing plugin for freelancers, agencies, consultants, and small businesses. Create unlimited invoices and quotes, generate PDF documents, accept online payments through PayPal, and manage client information directly from your WordPress dashboard.
     16
     17= Links =
     18
     19* [Live Demo](https://try.new/plugins/easy-invoice/)
     20* [Documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/)
     21* [Pro Version](https://matrixaddons.com/plugins/easy-invoice/#pricing)
     22* [Support Forum](https://wordpress.org/support/plugin/easy-invoice/)
     23
     24= Key Features =
     25
     26**Invoicing & Quotes**
     27* Unlimited invoices and quotes
     28* Professional PDF generation
     29* Auto-increment invoice numbering with custom prefixes
     30* Convert quotes to invoices with one click
     31* Clone existing invoices for faster creation
     32* Custom invoice and quote terminology
     33* Set default due dates and payment terms
     34
     35**Payment Processing**
     36* PayPal payment gateway (free version)
     37* Accept online payments with "Pay Now" button
     38* Multiple payment gateways: Stripe, Square, Authorize.Net, Mollie (Pro)
     39* Manual payment recording (cash, check, bank transfer)
     40* Partial payment support (Pro)
     41* Payment status tracking and history
     42
     43**Client Management**
     44* Unlimited client records
     45* Store complete client information
     46* Automated email notifications
     47* Client portal with secure login (Pro)
     48* Payment reminder emails (Pro)
     49
     50**Customization**
     51* Professional invoice templates
     52* Add your logo and business details
     53* Customize templates using CSS
     54* Flexible tax settings (global or per line item)
     55* Discount calculations
     56* Multi-currency support (150+ currencies)
     57* Custom email templates
     58* Translation ready
     59
     60**Automation & Reporting**
     61* Recurring invoice automation (Pro)
     62* CSV data export (Pro)
     63* Invoice and quote reporting
     64* Revenue tracking and analytics (Pro)
     65* White label option (Pro)
     66
     67**Compatibility**
     68* Works with any WordPress theme
     69* WooCommerce compatible
     70* WordPress multisite support
     71* Page builder compatible
     72
     73= Who Uses Easy Invoice? =
     74
    2675* **Freelancers** - Quick invoice creation and payment collection
    27 * **Agencies** - Multi-client billing and project management
    28 * **Small Businesses** - Professional invoicing and client management
    29 * **Consultants** - Time-based billing and quote management
    30 
    31 = WordPress Invoice Plugin Features =
    32 * **Create Invoices**: Generate unlimited invoices and quotes with PDF export
    33 * **Accept Payments**: Built-in PayPal payment gateway with one-click payments
    34 * **Client Management**: Store client details and send professional email notifications
    35 * **Customization**: Custom invoice numbers, terms, and business branding
    36 * **Automation**: Email templates and workflow automation (Pro: payment reminders)
    37 * **Reporting**: Invoice tracking and analytics (Pro: CSV export and advanced reports)
    38 
    39 [Live Demo](https://try.new/plugins/easy-invoice/)
    40 
    41 = Use cases =
    42 * Freelancers: Quick invoice creation, professional templates, automated reminders (Pro)
    43 * Agencies: Multi-client management, CSV export & reports (Pro), team-friendly workflows
    44 * Small businesses: Streamlined payments, client portal (Pro), recurring invoices (Pro)
    45 
    46 = Free features (detailed) =
     76* **Agencies** - Multi-client management and project billing
     77* **Small Businesses** - Professional invoicing and recurring billing
     78* **Consultants** - Quote management and payment tracking
     79* **E-commerce** - Custom B2B invoicing alongside WooCommerce
     80* **Service Providers** - Subscription billing and payment plans
     81
     82= Free Version Features =
    4783* [**Unlimited Invoices & Quotes**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Create unlimited invoices and quotes with no restrictions.
    4884* [**PDF Generation**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Generate professional PDF invoices and quotes with one click.
     
    5995* [**Translation Ready**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Fully translatable for global use.
    6096
    61 = Pro features (Easy Invoice Pro) =
     97= Pro Version Features =
    6298* [**Custom Invoice Permalinks**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Create professional, branded URLs for invoices.
    6399* [**Advanced PDF Customization & Watermarks**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Customize layouts, add text/image watermarks, and status badges.
     
    73109
    74110
    75 [View Easy Invoice Pro](https://matrixaddons.com/plugins/easy-invoice/#pricing)
    76 
    77 == Upgrade to Pro ==
    78 
    79 Unlock advanced features like custom PDF templates and branding, client portal, CSV export, payment reminders, and more.
    80 
    81 • [Learn more and upgrade](https://matrixaddons.com/plugins/easy-invoice/#pricing)
    82 
    83 = Lite vs Pro (at a glance) =
    84 Free:
    85 * Invoices and quotes, PDF export, PayPal payments, email templates, taxes/discounts, client management, professional templates
    86 
    87 Pro:
    88 * Custom PDF branding, watermarks, CSV export & reports, client area & shortcodes, restrict by client, reminders, recurring invoices, multiple gateways, partial payments, advanced tax, priority support, white label
    89 
    90 = Privacy =
    91 This plugin does not collect any personal data from your website visitors. It stores invoice and quote data in your WordPress database. Payment processing is handled by your chosen gateway (e.g., PayPal) subject to their policies.
    92 
    93 = Translations =
    94 * Text domain: easy-invoice
    95 * Translation ready. You can translate using standard WordPress methods.
     111[Upgrade to Easy Invoice Pro](https://matrixaddons.com/plugins/easy-invoice/#pricing)
     112
     113== Why Upgrade to Pro? ==
     114
     115The Pro version adds advanced features for businesses that need more automation and customization:
     116
     117* **Client Portal** - Clients can view invoices, make payments, and download PDFs
     118* **Payment Reminders** - Automatically send reminders before and after due dates
     119* **Recurring Invoices** - Automate subscription and retainer billing
     120* **Multiple Payment Gateways** - Accept credit cards via Stripe, Square, Authorize.Net, Mollie
     121* **Advanced PDF Customization** - Add watermarks, custom layouts, and status badges
     122* **CSV Export & Reports** - Export data for accounting software like QuickBooks or Xero
     123* **Partial Payments** - Allow clients to pay invoices in installments
     124* **Advanced Tax Options** - Handle complex tax rules and calculations
     125* **White Label** - Remove Easy Invoice branding from documents
     126* **Priority Support** - Faster response times for technical assistance
     127
     128[View Pro Pricing](https://matrixaddons.com/plugins/easy-invoice/#pricing)
     129
     130= Privacy & Security =
     131
     132Easy Invoice respects your privacy and follows WordPress security best practices:
     133
     134* **No data collection** - We don't collect or store any data from your website
     135* **GDPR compliant** - All invoice data stays in your WordPress database
     136* **Secure payments** - Payment processing handled by PCI-compliant gateways
     137* **No external dependencies** - Plugin works without external API calls
     138* **Security audits** - Regularly monitored by Patchstack for vulnerabilities
     139
     140Payment processing is handled by your chosen gateway (PayPal, Stripe, etc.) according to their privacy policies. Easy Invoice never stores credit card information.
     141
     142= Translations & Internationalization =
     143
     144Easy Invoice is fully translation ready:
     145
     146* **Text Domain:** easy-invoice
     147* **Translation Method:** Standard WordPress .po/.mo files or Loco Translate plugin
     148* **RTL Support:** Full right-to-left language support
     149* **Multi-Currency:** Support for 150+ currencies with custom symbols
     150* **Date Formats:** Localized date formatting
     151
     152English is the default language. Community translations are available through WordPress.org.
     153
     154To contribute translations, visit [WordPress.org translation page](https://translate.wordpress.org/projects/wp-plugins/easy-invoice/)
    96155
    97156== Installation ==
    98157
    99 1. Install via Plugins → Add New → search for “Easy Invoice” → Install Now → Activate; or upload the plugin folder to wp-content/plugins and activate.
    100 2. Go to Easy Invoice → Settings to set your business details, currency, taxes, and email templates.
    101 3. Create your first invoice or quote from Easy Invoice → Invoices/Quotes.
    102 4. Enable PayPal in Easy Invoice → Payment Settings to accept payments.
     158**Automatic Installation:**
     159
     1601. Go to Plugins → Add New in your WordPress admin
     1612. Search for "Easy Invoice"
     1623. Click Install Now → Activate
     1634. Follow the setup wizard
     164
     165**Manual Installation:**
     166
     1671. Download the plugin ZIP file
     1682. Go to Plugins → Add New → Upload Plugin
     1693. Choose the ZIP file and click Install Now
     1704. Click Activate Plugin
     171
     172**Quick Setup:**
     173
     1741. Configure business details: Easy Invoice → Settings → General
     1752. Customize email templates: Easy Invoice → Settings → Email
     1763. Enable PayPal payments: Easy Invoice → Settings → Payment
     1774. Create your first invoice: Easy Invoice → Invoices → Add New
     178
     179For detailed instructions, see our [documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/).
    103180
    104181== Frequently Asked Questions ==
    105 = Does Easy Invoice work with any theme? =
    106 Yes, Easy Invoice is theme-agnostic and works with any properly coded WordPress theme.
     182
     183= What are the minimum system requirements? =
     184
     185* WordPress 5.6 or newer
     186* PHP version 7.4 or higher (PHP 8.0+ recommended)
     187* MySQL 5.6 or higher
     188
     189= Does Easy Invoice work with any WordPress theme? =
     190Yes. Easy Invoice is theme-agnostic and works with properly coded WordPress themes. It's compatible with popular themes like Astra, Divi, GeneratePress, and all major page builders.
     191
     192= Can I use Easy Invoice with WooCommerce? =
     193Yes. Easy Invoice works independently but can be used alongside WooCommerce for custom B2B invoicing and manual invoice generation.
     194
     195= Is Easy Invoice suitable for beginners? =
     196Yes. Easy Invoice is designed for users of all skill levels with an intuitive interface. No coding knowledge required.
     197
     198= How do I accept online payments? =
     199Free Version: Enable PayPal in Easy Invoice → Settings → Payment. A "Pay Now" button will appear on invoices, allowing clients to pay with PayPal or credit card.
     200
     201Pro Version: Connect additional payment gateways including Stripe, Square, Authorize.Net, or Mollie for direct credit card processing. You can also add custom external payment links for other payment providers.
     202
     203For detailed setup instructions, see our [payment gateway documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/).
     204
     205= Are there any transaction fees? =
     206Easy Invoice charges zero transaction fees. You keep 100% of your revenue. Payment gateway fees (PayPal, Stripe, etc.) apply based on their pricing.
     207
     208= Can clients pay invoices in installments? =
     209Yes, with Easy Invoice Pro. The Partial Payments feature lets clients pay invoices in multiple installments.
     210
     211= How do I track payments? =
     212Easy Invoice automatically tracks all payments. View payment status, history, and generate reports from the Payments dashboard.
    107213
    108214= Can I create PDF invoices and quotes? =
    109 Yes. PDF generation and download for invoices and quotes are included in the free version.
    110 
    111 = How do I accept payments? =
    112 Enable PayPal in Easy Invoice → Payment Settings. A “Pay Now” button will be shown on invoices. You can also set a custom external payment link.
     215Yes. One-click PDF generation is included in the free version.
     216
     217= How do I customize invoice templates? =
     218Yes, you have full control over the look of invoices and quotes:
     219
     2201. Go to Easy Invoice → Settings → Templates
     2212. Choose from professional pre-built templates
     2223. Customize colors and add your logo
     2234. Modify layout using custom CSS
     2245. Add your business details and branding
     225
     226Pro version offers advanced PDF customization including watermarks, custom layouts, and status badges. For detailed customization guides, visit our [documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/).
     227
     228= Can I convert quotes to invoices? =
     229Yes. When a client accepts a quote, you can instantly convert it to an invoice with one click. This streamlines your workflow and ensures consistency between quotes and invoices. All quote data (line items, client details, taxes) is automatically transferred to the new invoice.
     230
     231= Is there a limit on invoices I can create? =
     232No. Create unlimited invoices, quotes, and clients in both free and Pro versions.
     233
     234= I see a 404 error when viewing an invoice. How do I fix it? =
     235Go to Settings → Permalinks and click Save Changes to flush rewrite rules. This resolves most 404 issues.
     236
     237If the problem persists:
     2381. Deactivate and reactivate the plugin
     2392. Check that your .htaccess file is writable
     2403. Contact support if the issue continues
     241
     242= Can I import data from other invoicing plugins? =
     243If you're upgrading from Easy Invoice 1.x to 2.0+, the plugin will automatically prompt you to migrate your data.
     244
     245For importing from other invoicing plugins:
     246* Pro version includes CSV import functionality
     247* Bulk import of invoices and quotes
     248* Import client data
     249* Preserve invoice numbers and dates
     250
     251Contact support if you need assistance with data migration from specific plugins.
     252
     253= Does Easy Invoice work on multisite? =
     254Yes. Easy Invoice is compatible with WordPress multisite installations.
     255
     256= What PHP version is required? =
     257Easy Invoice requires PHP 7.4 or higher. We recommend PHP 8.0+ for optimal performance.
    113258
    114259= Do I need the Pro version? =
    115 The free version covers invoicing, quotes, PDFs, PayPal payments, emails, and client management. Pro adds advanced PDF customization, client area, CSV export, reminders, and more.
    116 
    117 = I’m upgrading from Easy Invoice 1.x to 2.0 — do I need to run a migration? =
    118 Yes. If you used Easy Invoice before version 2.0, the plugin will prompt you to migrate your data. Fresh installations do not see the migration notice.
    119 
    120 = I see a 404 when viewing an invoice. What should I do? =
    121 Go to Settings → Permalinks and click Save to flush rewrite rules. This fixes most 404 issues.
    122 
    123 = How can I report security bugs? =
    124 You can report security bugs through the Patchstack Vulnerability Disclosure Program. The Patchstack team helps validate, triage and handle any security vulnerabilities. [Report a security vulnerability.](https://patchstack.com/database/vdp/8b8da081-d07d-4239-b795-0f0895d186dd)
     260The free version includes unlimited invoices, PDF generation, PayPal payments, and client management. Upgrade to Pro if you need: client portal, automated payment reminders, recurring billing, multiple payment gateways (Stripe, Square, etc.), partial payments, CSV export and reports, white label branding, or priority support.
     261
     262= Can I try Pro before buying? =
     263Yes. We offer a 30-day money-back guarantee.
     264
     265= How do I upgrade from Free to Pro? =
     266Purchase Easy Invoice Pro, install the Pro plugin alongside the free version, and activate your license key. All your existing data is preserved.
     267
     268= Is Easy Invoice secure? =
     269Yes. Easy Invoice follows WordPress security best practices:
     270
     271* Regular security audits by Patchstack
     272* No credit card information stored
     273* All payment processing through PCI-compliant gateways
     274* Secure data encryption
     275* Regular security updates
     276
     277We take security seriously and respond quickly to any reported vulnerabilities.
     278
     279= How can I report security vulnerabilities? =
     280Report security bugs through the [Patchstack Vulnerability Disclosure Program](https://patchstack.com/database/vdp/8b8da081-d07d-4239-b795-0f0895d186dd). The Patchstack team validates and helps resolve all security issues.
     281
     282= Is Easy Invoice GDPR compliant? =
     283Yes. Easy Invoice stores all data in your WordPress database. No data is collected or transmitted to external servers (except configured payment gateways).
     284
     285= Where can I get support? =
     286For all support issues:
     287
     288* **Free Users:** Post in the [WordPress.org support forum](https://wordpress.org/support/plugin/easy-invoice/)
     289* **Pro Users:** Submit a support ticket for priority assistance
     290* **Documentation:** Visit our [complete documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/)
     291* **Getting Started:** Check our [quick start guide](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/)
     292
     293Our support team is responsive and helpful (check out our reviews!).
     294
     295= Do you offer customization services? =
     296Yes. We offer custom development services for:
     297
     298* Custom invoice template design
     299* Theme integration
     300* Workflow automation
     301* Custom feature development
     302* Third-party integrations
     303
     304Contact us at [matrixaddons.com/contact](https://matrixaddons.com/contact/) to discuss your requirements.
    125305
    126306== Screenshots ==
    127 1. Dashboard - Backend
    128 2. Invoice Listing Page - Backend
    129 3. Invoice Edit page - Backend
    130 4. Invoice Preview - Frontend
    131 5. Quote Listing Page - Backend
    132 6. Quote Edit Page - Backend
    133 7. Payment Page - Backend
    134 8. Client Listing Page - Backend
    135 9. Setting Page - Backend
     307
     3081. Dashboard overview showing invoices, quotes, payments, and revenue
     3092. Invoice listing page with filters, bulk actions, and status management
     3103. Invoice editor with line items, taxes, and discounts
     3114. Invoice preview with "Pay Now" button
     3125. Quote management and listing page
     3136. Quote editor with real-time calculations
     3147. Payment tracking with status and history
     3158. Client management with contact information
     3169. Settings panel for business details and email templates
     31710. PDF generation with custom branding
    136318
    137319
    138320== Changelog ==
    139 = 2.1.9 - 2026-02-15 =
    140 * Fixed - Vendor issue fixed
    141 
    142 = 2.1.8 - 2026-02-15 =
    143 * Added - added additional css section for each template so that user can modify the design of the template
    144 
    145 = 2.1.7 - 2025-12-15 =
    146 * Checked - fix quote accept and decline issue
    147 = 2.1.6 - 2025-12-11 =
    148 * Checked - WordPress 6.9 compatibility tested
    149 
    150 = 2.1.5 - 2025-11-20 =
    151 * Fixed - Template loading issue fixed
    152 
    153 = 2.1.4 - 2025-11-11 =
    154 * Fixed - Email issue fixed
    155 * Fixed - allowed html tag for textarea friend
    156 * Fixed - Empty data Saving issue fixed for the description
    157 
    158 = 2.1.3 - 2025-11-03 =
    159 * Fixed - Review notice added
    160 * Fixed - Join Community link added
    161 
    162 
    163 = 2.1.2 - 2025-10-30 =
    164 * Fixed - Phone number issue fixed
    165 * Fixed - Shortcode issue fixed
    166 * Fixed - Fatal error while sending email
    167 
    168 = 2.1.0 - 2025-10-13 =
    169 * Fixed - Escaping issue fixed
    170 
    171 = 2.0.9 - 2025-08-30 =
    172 * Fixed - Quote Next number and invoice next number issue fixed.
    173 * Added - Regeneration Quote and Invoice number feature added
    174 
    175 
    176 = 2.0.8 - 2025-08-30 =
    177 * Fixed - Checkout link updated
    178 
    179 = 2.0.7 - 2025-08-17 =
    180 * Fixed - Minor issue fixed
    181 * Fixed - Trash button behaviour fixed
    182 
    183 = 2.0.6 - 2025-08-27 =
    184 * Fixed - Accept quote issue fixed
    185 
    186 
    187 = 2.0.5 - 2025-08-24 =
    188 * Fixed - Date format issue fixed & other minor issues fixed
    189 
    190 = 2.0.4 - 2025-08-21 =
    191 * Fixed - Currency issue and quote items issue fixed
    192 
    193 = 2.0.3 - 2025-08-19 =
    194 * Fixed - migration issue fixed
    195 
    196 = 2.0.2 - 2025-08-19 =
    197 * Fixed - Bug Fixed
    198 * Added - Legacy Tempalte for quote and invoice added
    199 
    200 = 2.0.1 - 2025-08-16 =
    201 * Fixed - Currency issue
    202 * Fixed - PDF size issue
    203 * Fixed - Send Email issue
    204 * Added - {{quote_url}} and {{invoice_url}} smart tags
     321
     322= 2.1.10 - February 22, 2026 =
     323* Fixed - Minor issues fixed
     324
     325= 2.1.9 - February 15, 2026 =
     326* Fixed vendor dependency issue affecting plugin initialization
     327* Improved compatibility with latest WordPress version
     328
     329= 2.1.8 - February 15, 2026 =
     330* Added custom CSS section for each template
     331* Enhanced template flexibility for developers
     332
     333= 2.1.7 - December 15, 2025 =
     334* Fixed quote accept and decline functionality
     335* Improved quote workflow reliability
     336
     337= 2.1.6 - December 11, 2025 =
     338* Tested and confirmed compatibility with WordPress 6.9
     339* Performance optimizations
     340
     341= 2.1.5 - November 20, 2025 =
     342* Fixed template loading issue
     343* Improved template rendering performance
     344
     345= 2.1.4 - November 11, 2025 =
     346* Fixed email sending issues with SMTP configurations
     347* Improved HTML tag support in textarea fields
     348* Fixed empty data saving issue in description fields
     349
     350= 2.1.3 - November 3, 2025 =
     351* Added review notice
     352* Added community link for support
     353
     354
     355= 2.1.2 - October 30, 2025 =
     356* Fixed phone number formatting and validation
     357* Fixed shortcode rendering issues
     358* Fixed fatal error during email sending
     359
     360= 2.1.0 - October 13, 2025 =
     361* Enhanced data escaping for security
     362* Strengthened input sanitization
     363
     364= 2.0.9 - August 30, 2025 =
     365* Fixed quote and invoice auto-increment number generation
     366* Added regeneration feature for quote and invoice numbers
     367
     368
     369= 2.0.8 - August 30, 2025 =
     370* Updated checkout link for improved payment flow
     371
     372= 2.0.7 - August 17, 2025 =
     373* Fixed minor UI and functionality issues
     374* Fixed trash button behavior
     375
     376= 2.0.6 - August 27, 2025 =
     377* Fixed quote acceptance workflow
     378
     379
     380= 2.0.5 - August 24, 2025 =
     381* Fixed date format display issues
     382* Fixed various minor bugs
     383
     384= 2.0.4 - August 21, 2025 =
     385* Fixed currency symbol display issues
     386* Fixed quote line items calculation
     387
     388= 2.0.3 - August 19, 2025 =
     389* Fixed data migration from version 1.x to 2.0
     390
     391= 2.0.2 - August 19, 2025 =
     392* Various bug fixes
     393* Added legacy template support
     394
     395= 2.0.1 - August 16, 2025 =
     396* Fixed currency formatting and display
     397* Fixed PDF size and rendering
     398* Fixed email sending functionality
     399* Added {{quote_url}} and {{invoice_url}} smart tags
     400
     401[View complete changelog](https://matrixaddons.com/plugins/easy-invoice/#changelog)
     402
     403== Upgrade Notice ==
     404
     405= 2.1.9 =
     406Important update fixing vendor dependencies. Recommended for all users.
     407
     408= 2.0.0 =
     409Major version update with significant improvements. If upgrading from 1.x, please backup your site and run the migration tool when prompted.
  • easy-invoice/trunk/templates/payments/edit.php

    r3346980 r3466809  
    268268            success: function(response) {
    269269                if (response.success) {
    270                     window.location.href = '<?php echo admin_url('admin.php?page=easy-invoice-payments'); ?>';
     270                    EasyInvoiceToast.success(response.data.message || '<?php _e('Payment updated successfully', 'easy-invoice'); ?>');
    271271                } else {
    272272                    EasyInvoiceToast.error(response.data.message || '<?php _e('An error occurred', 'easy-invoice'); ?>');
Note: See TracChangeset for help on using the changeset viewer.