Changeset 3466809
- Timestamp:
- 02/22/2026 10:07:34 AM (2 weeks ago)
- Location:
- easy-invoice
- Files:
-
- 18 edited
- 1 copied
-
tags/2.1.10 (copied) (copied from easy-invoice/trunk)
-
tags/2.1.10/easy-invoice.php (modified) (2 diffs)
-
tags/2.1.10/includes/Admin/EasyInvoiceAdmin.php (modified) (2 diffs)
-
tags/2.1.10/includes/Admin/EasyInvoiceAjax.php (modified) (3 diffs)
-
tags/2.1.10/includes/Controllers/PaymentController.php (modified) (7 diffs)
-
tags/2.1.10/includes/Forms/FormProcessor.php (modified) (3 diffs)
-
tags/2.1.10/includes/Models/Invoice.php (modified) (1 diff)
-
tags/2.1.10/includes/Models/Payment.php (modified) (2 diffs)
-
tags/2.1.10/readme.txt (modified) (3 diffs)
-
tags/2.1.10/templates/payments/edit.php (modified) (1 diff)
-
trunk/easy-invoice.php (modified) (2 diffs)
-
trunk/includes/Admin/EasyInvoiceAdmin.php (modified) (2 diffs)
-
trunk/includes/Admin/EasyInvoiceAjax.php (modified) (3 diffs)
-
trunk/includes/Controllers/PaymentController.php (modified) (7 diffs)
-
trunk/includes/Forms/FormProcessor.php (modified) (3 diffs)
-
trunk/includes/Models/Invoice.php (modified) (1 diff)
-
trunk/includes/Models/Payment.php (modified) (2 diffs)
-
trunk/readme.txt (modified) (3 diffs)
-
trunk/templates/payments/edit.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
easy-invoice/tags/2.1.10/easy-invoice.php
r3461761 r3466809 4 4 * Plugin URI: https://matrixaddons.com/plugins/easy-invoice 5 5 * Description: A beautiful, full-featured invoicing solution for WordPress. Create professional invoices, quotes, and manage payments with ease. 6 * Version: 2.1. 96 * Version: 2.1.10 7 7 * Author: MatrixAddons 8 8 * Author URI: https://matrixaddons.com … … 26 26 27 27 // Define plugin constants. 28 define( 'EASY_INVOICE_VERSION', '2.1. 9' );28 define( 'EASY_INVOICE_VERSION', '2.1.10' ); 29 29 define( 'EASY_INVOICE_PLUGIN_FILE', __FILE__ ); 30 30 define( 'EASY_INVOICE_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); -
easy-invoice/tags/2.1.10/includes/Admin/EasyInvoiceAdmin.php
r3461756 r3466809 459 459 460 460 case 'easy-invoice-templates': 461 error_log('EasyInvoiceAdmin: Template Builder case hit');462 461 if (easy_invoice_has_pro()) { 463 error_log('EasyInvoiceAdmin: Pro is active, loading Template Builder controller');464 462 // Use the Pro controller's displayMainPage method like other controllers 465 463 if (class_exists('\EasyInvoicePro\Controllers\TemplateBuilderController')) { 466 464 $template_builder_controller = new \EasyInvoicePro\Controllers\TemplateBuilderController(); 467 465 $template_builder_controller->displayMainPage(); 468 } else {469 error_log('EasyInvoiceAdmin: TemplateBuilderController class does not exist');470 466 } 471 } else {472 error_log('EasyInvoiceAdmin: Pro is NOT active for Template Builder');473 467 } 474 468 break; 475 469 476 470 case 'easy-invoice-template-builder': 477 error_log('EasyInvoiceAdmin: Template Builder Page case hit');478 471 if (easy_invoice_has_pro()) { 479 error_log('EasyInvoiceAdmin: Pro is active, loading Template Builder controller for builder page');480 472 // Use the Pro controller's displayMainPage method like other controllers 481 473 if (class_exists('\EasyInvoicePro\Controllers\TemplateBuilderController')) { 482 474 $template_builder_controller = new \EasyInvoicePro\Controllers\TemplateBuilderController(); 483 475 $template_builder_controller->displayMainPage(); 484 } else {485 error_log('EasyInvoiceAdmin: TemplateBuilderController class does not exist');486 476 } 487 477 } … … 521 511 522 512 default: 523 error_log('EasyInvoiceAdmin: Default case hit for page: ' . $page);524 513 $this->dashboard_controller->display(['page' => PagesSlugs::DASHBOARD]); 525 514 break; -
easy-invoice/tags/2.1.10/includes/Admin/EasyInvoiceAjax.php
r3461756 r3466809 768 768 $raw_quote_data = isset($_POST['quote_data']) ? $_POST['quote_data'] : $_POST; 769 769 770 // Debug: Log the raw POST data771 error_log("Raw POST data for quote: " . print_r($_POST, true));772 error_log("Raw quote data: " . print_r($raw_quote_data, true));773 774 770 // Remove non-quote fields 775 771 unset($raw_quote_data['action']); … … 798 794 } 799 795 800 // Debug: Log the raw items data801 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 804 796 // Process items using the dynamic field system 805 797 $quote_data['data']['items'] = $quote_form_manager->processItemsData($items_array); 806 807 // Debug: Log the processed items data808 error_log("Final processed items: " . print_r($quote_data['data']['items'], true));809 798 } 810 799 … … 870 859 // Handle items 871 860 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));873 861 $quote->setItems($quote_data['data']['items']); 874 862 // Save the quote to persist the items to database 875 error_log("Calling quote->save() to persist items");876 863 $quote->save(); 877 // Quote save completed878 864 } 879 865 -
easy-invoice/tags/2.1.10/includes/Controllers/PaymentController.php
r3461756 r3466809 170 170 $payment_id = isset($_GET['id']) ? intval($_GET['id']) : 0; 171 171 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 { 176 181 wp_die(__('Invalid payment ID', 'easy-invoice')); 177 182 } … … 184 189 $payment_id = isset($_GET['id']) ? intval($_GET['id']) : 0; 185 190 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 { 190 200 wp_die(__('Invalid payment ID', 'easy-invoice')); 191 201 } … … 594 604 595 605 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') { 598 609 wp_send_json_error(['message' => __('Invalid payment', 'easy-invoice')]); 599 610 return; 600 611 } 612 613 $payment = new Payment($payment_post); 614 615 // Get the old payment status before updating 616 $old_status = $payment->getStatus(); 601 617 602 618 $post = get_post($invoice_id); … … 622 638 623 639 $result = $payment->update($payment_data); 624 640 625 641 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 626 665 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') 629 667 ]); 630 668 } else { … … 1178 1216 foreach ($payment_ids as $id) { 1179 1217 // 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); 1181 1223 $payment_status = $payment->getStatus(); 1182 1224 $invoice_id = $payment->getInvoiceId(); … … 1207 1249 foreach ($payment_ids as $id) { 1208 1250 // 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); 1210 1256 $payment_status = $payment->getStatus(); 1211 1257 $invoice_id = $payment->getInvoiceId(); … … 1241 1287 foreach ($payment_ids as $id) { 1242 1288 // 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); 1244 1294 $payment_status = $payment->getStatus(); 1245 1295 $invoice_id = $payment->getInvoiceId(); -
easy-invoice/tags/2.1.10/includes/Forms/FormProcessor.php
r3393362 r3466809 162 162 $processed_item = []; 163 163 164 // Debug: Log the raw item data165 error_log("Processing item data: " . print_r($raw_item_data, true));166 167 164 foreach ($item_field_definitions as $field) { 168 165 $field_name = $field['name'] ?? ''; … … 178 175 if ($required && empty($raw_value) && $field['type'] !== 'checkbox') { 179 176 // For items, we'll skip invalid items rather than throwing errors 180 error_log("Skipping required field {$field_name} - empty value");181 177 continue; 182 178 } … … 195 191 } 196 192 } 197 198 // Debug: Log the processed item199 error_log("Processed item: " . print_r($processed_item, true));200 193 201 194 return $processed_item; -
easy-invoice/tags/2.1.10/includes/Models/Invoice.php
r3461756 r3466809 708 708 public function setId(int $id): void { $this->id = $id; } 709 709 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 } 710 719 public function setItems(array $items): void { 711 720 $this->items = []; -
easy-invoice/tags/2.1.10/includes/Models/Payment.php
r3344524 r3466809 186 186 return false; 187 187 } 188 188 189 189 // Update post meta for each field 190 190 $meta_fields = [ … … 208 208 foreach ($meta_fields as $field => $meta_key) { 209 209 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); 210 214 $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; 216 219 } 220 221 // Always update local data since we're setting it 222 $this->data[$field] = $data[$field]; 217 223 } 218 224 } -
easy-invoice/tags/2.1.10/readme.txt
r3461761 r3466809 1 === Easy Invoice – P DF Invoice Generator & Quote Builder ===1 === Easy Invoice – Professional Invoice & Quote Generator === 2 2 Contributors: MatrixAddons 3 Tags: invoice, pdf , quotes, billing, payment3 Tags: invoice, pdf invoice, quotes, billing, payment gateway 4 4 Requires at least: 5.6 5 5 Tested up to: 6.9 6 6 Requires PHP: 7.4 7 Stable tag: 2.1. 97 Stable tag: 2.1.10 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html 10 10 11 Create professional invoices, accept payments, and manage clients directly from WordPress.11 The complete WordPress invoicing solution for freelancers & businesses. Create invoices, generate PDF quotes, accept payments, and automate billing—all in one plugin. 12 12 13 13 == Description == 14 14 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:** 15 Easy 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 26 75 * **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 = 47 83 * [**Unlimited Invoices & Quotes**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Create unlimited invoices and quotes with no restrictions. 48 84 * [**PDF Generation**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Generate professional PDF invoices and quotes with one click. … … 59 95 * [**Translation Ready**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Fully translatable for global use. 60 96 61 = Pro features (Easy Invoice Pro)=97 = Pro Version Features = 62 98 * [**Custom Invoice Permalinks**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Create professional, branded URLs for invoices. 63 99 * [**Advanced PDF Customization & Watermarks**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Customize layouts, add text/image watermarks, and status badges. … … 73 109 74 110 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 115 The 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 132 Easy 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 140 Payment 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 144 Easy 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 152 English is the default language. Community translations are available through WordPress.org. 153 154 To contribute translations, visit [WordPress.org translation page](https://translate.wordpress.org/projects/wp-plugins/easy-invoice/) 96 155 97 156 == Installation == 98 157 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 160 1. Go to Plugins → Add New in your WordPress admin 161 2. Search for "Easy Invoice" 162 3. Click Install Now → Activate 163 4. Follow the setup wizard 164 165 **Manual Installation:** 166 167 1. Download the plugin ZIP file 168 2. Go to Plugins → Add New → Upload Plugin 169 3. Choose the ZIP file and click Install Now 170 4. Click Activate Plugin 171 172 **Quick Setup:** 173 174 1. Configure business details: Easy Invoice → Settings → General 175 2. Customize email templates: Easy Invoice → Settings → Email 176 3. Enable PayPal payments: Easy Invoice → Settings → Payment 177 4. Create your first invoice: Easy Invoice → Invoices → Add New 178 179 For detailed instructions, see our [documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/). 103 180 104 181 == 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? = 190 Yes. 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? = 193 Yes. 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? = 196 Yes. 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? = 199 Free 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 201 Pro 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 203 For 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? = 206 Easy 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? = 209 Yes, with Easy Invoice Pro. The Partial Payments feature lets clients pay invoices in multiple installments. 210 211 = How do I track payments? = 212 Easy Invoice automatically tracks all payments. View payment status, history, and generate reports from the Payments dashboard. 107 213 108 214 = 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. 215 Yes. One-click PDF generation is included in the free version. 216 217 = How do I customize invoice templates? = 218 Yes, you have full control over the look of invoices and quotes: 219 220 1. Go to Easy Invoice → Settings → Templates 221 2. Choose from professional pre-built templates 222 3. Customize colors and add your logo 223 4. Modify layout using custom CSS 224 5. Add your business details and branding 225 226 Pro 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? = 229 Yes. 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? = 232 No. 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? = 235 Go to Settings → Permalinks and click Save Changes to flush rewrite rules. This resolves most 404 issues. 236 237 If the problem persists: 238 1. Deactivate and reactivate the plugin 239 2. Check that your .htaccess file is writable 240 3. Contact support if the issue continues 241 242 = Can I import data from other invoicing plugins? = 243 If you're upgrading from Easy Invoice 1.x to 2.0+, the plugin will automatically prompt you to migrate your data. 244 245 For 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 251 Contact support if you need assistance with data migration from specific plugins. 252 253 = Does Easy Invoice work on multisite? = 254 Yes. Easy Invoice is compatible with WordPress multisite installations. 255 256 = What PHP version is required? = 257 Easy Invoice requires PHP 7.4 or higher. We recommend PHP 8.0+ for optimal performance. 113 258 114 259 = 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) 260 The 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? = 263 Yes. We offer a 30-day money-back guarantee. 264 265 = How do I upgrade from Free to Pro? = 266 Purchase 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? = 269 Yes. 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 277 We take security seriously and respond quickly to any reported vulnerabilities. 278 279 = How can I report security vulnerabilities? = 280 Report 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? = 283 Yes. 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? = 286 For 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 293 Our support team is responsive and helpful (check out our reviews!). 294 295 = Do you offer customization services? = 296 Yes. 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 304 Contact us at [matrixaddons.com/contact](https://matrixaddons.com/contact/) to discuss your requirements. 125 305 126 306 == 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 308 1. Dashboard overview showing invoices, quotes, payments, and revenue 309 2. Invoice listing page with filters, bulk actions, and status management 310 3. Invoice editor with line items, taxes, and discounts 311 4. Invoice preview with "Pay Now" button 312 5. Quote management and listing page 313 6. Quote editor with real-time calculations 314 7. Payment tracking with status and history 315 8. Client management with contact information 316 9. Settings panel for business details and email templates 317 10. PDF generation with custom branding 136 318 137 319 138 320 == 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 = 406 Important update fixing vendor dependencies. Recommended for all users. 407 408 = 2.0.0 = 409 Major 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 268 268 success: function(response) { 269 269 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'); ?>'); 271 271 } else { 272 272 EasyInvoiceToast.error(response.data.message || '<?php _e('An error occurred', 'easy-invoice'); ?>'); -
easy-invoice/trunk/easy-invoice.php
r3461761 r3466809 4 4 * Plugin URI: https://matrixaddons.com/plugins/easy-invoice 5 5 * Description: A beautiful, full-featured invoicing solution for WordPress. Create professional invoices, quotes, and manage payments with ease. 6 * Version: 2.1. 96 * Version: 2.1.10 7 7 * Author: MatrixAddons 8 8 * Author URI: https://matrixaddons.com … … 26 26 27 27 // Define plugin constants. 28 define( 'EASY_INVOICE_VERSION', '2.1. 9' );28 define( 'EASY_INVOICE_VERSION', '2.1.10' ); 29 29 define( 'EASY_INVOICE_PLUGIN_FILE', __FILE__ ); 30 30 define( 'EASY_INVOICE_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); -
easy-invoice/trunk/includes/Admin/EasyInvoiceAdmin.php
r3461756 r3466809 459 459 460 460 case 'easy-invoice-templates': 461 error_log('EasyInvoiceAdmin: Template Builder case hit');462 461 if (easy_invoice_has_pro()) { 463 error_log('EasyInvoiceAdmin: Pro is active, loading Template Builder controller');464 462 // Use the Pro controller's displayMainPage method like other controllers 465 463 if (class_exists('\EasyInvoicePro\Controllers\TemplateBuilderController')) { 466 464 $template_builder_controller = new \EasyInvoicePro\Controllers\TemplateBuilderController(); 467 465 $template_builder_controller->displayMainPage(); 468 } else {469 error_log('EasyInvoiceAdmin: TemplateBuilderController class does not exist');470 466 } 471 } else {472 error_log('EasyInvoiceAdmin: Pro is NOT active for Template Builder');473 467 } 474 468 break; 475 469 476 470 case 'easy-invoice-template-builder': 477 error_log('EasyInvoiceAdmin: Template Builder Page case hit');478 471 if (easy_invoice_has_pro()) { 479 error_log('EasyInvoiceAdmin: Pro is active, loading Template Builder controller for builder page');480 472 // Use the Pro controller's displayMainPage method like other controllers 481 473 if (class_exists('\EasyInvoicePro\Controllers\TemplateBuilderController')) { 482 474 $template_builder_controller = new \EasyInvoicePro\Controllers\TemplateBuilderController(); 483 475 $template_builder_controller->displayMainPage(); 484 } else {485 error_log('EasyInvoiceAdmin: TemplateBuilderController class does not exist');486 476 } 487 477 } … … 521 511 522 512 default: 523 error_log('EasyInvoiceAdmin: Default case hit for page: ' . $page);524 513 $this->dashboard_controller->display(['page' => PagesSlugs::DASHBOARD]); 525 514 break; -
easy-invoice/trunk/includes/Admin/EasyInvoiceAjax.php
r3461756 r3466809 768 768 $raw_quote_data = isset($_POST['quote_data']) ? $_POST['quote_data'] : $_POST; 769 769 770 // Debug: Log the raw POST data771 error_log("Raw POST data for quote: " . print_r($_POST, true));772 error_log("Raw quote data: " . print_r($raw_quote_data, true));773 774 770 // Remove non-quote fields 775 771 unset($raw_quote_data['action']); … … 798 794 } 799 795 800 // Debug: Log the raw items data801 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 804 796 // Process items using the dynamic field system 805 797 $quote_data['data']['items'] = $quote_form_manager->processItemsData($items_array); 806 807 // Debug: Log the processed items data808 error_log("Final processed items: " . print_r($quote_data['data']['items'], true));809 798 } 810 799 … … 870 859 // Handle items 871 860 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));873 861 $quote->setItems($quote_data['data']['items']); 874 862 // Save the quote to persist the items to database 875 error_log("Calling quote->save() to persist items");876 863 $quote->save(); 877 // Quote save completed878 864 } 879 865 -
easy-invoice/trunk/includes/Controllers/PaymentController.php
r3461756 r3466809 170 170 $payment_id = isset($_GET['id']) ? intval($_GET['id']) : 0; 171 171 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 { 176 181 wp_die(__('Invalid payment ID', 'easy-invoice')); 177 182 } … … 184 189 $payment_id = isset($_GET['id']) ? intval($_GET['id']) : 0; 185 190 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 { 190 200 wp_die(__('Invalid payment ID', 'easy-invoice')); 191 201 } … … 594 604 595 605 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') { 598 609 wp_send_json_error(['message' => __('Invalid payment', 'easy-invoice')]); 599 610 return; 600 611 } 612 613 $payment = new Payment($payment_post); 614 615 // Get the old payment status before updating 616 $old_status = $payment->getStatus(); 601 617 602 618 $post = get_post($invoice_id); … … 622 638 623 639 $result = $payment->update($payment_data); 624 640 625 641 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 626 665 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') 629 667 ]); 630 668 } else { … … 1178 1216 foreach ($payment_ids as $id) { 1179 1217 // 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); 1181 1223 $payment_status = $payment->getStatus(); 1182 1224 $invoice_id = $payment->getInvoiceId(); … … 1207 1249 foreach ($payment_ids as $id) { 1208 1250 // 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); 1210 1256 $payment_status = $payment->getStatus(); 1211 1257 $invoice_id = $payment->getInvoiceId(); … … 1241 1287 foreach ($payment_ids as $id) { 1242 1288 // 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); 1244 1294 $payment_status = $payment->getStatus(); 1245 1295 $invoice_id = $payment->getInvoiceId(); -
easy-invoice/trunk/includes/Forms/FormProcessor.php
r3393362 r3466809 162 162 $processed_item = []; 163 163 164 // Debug: Log the raw item data165 error_log("Processing item data: " . print_r($raw_item_data, true));166 167 164 foreach ($item_field_definitions as $field) { 168 165 $field_name = $field['name'] ?? ''; … … 178 175 if ($required && empty($raw_value) && $field['type'] !== 'checkbox') { 179 176 // For items, we'll skip invalid items rather than throwing errors 180 error_log("Skipping required field {$field_name} - empty value");181 177 continue; 182 178 } … … 195 191 } 196 192 } 197 198 // Debug: Log the processed item199 error_log("Processed item: " . print_r($processed_item, true));200 193 201 194 return $processed_item; -
easy-invoice/trunk/includes/Models/Invoice.php
r3461756 r3466809 708 708 public function setId(int $id): void { $this->id = $id; } 709 709 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 } 710 719 public function setItems(array $items): void { 711 720 $this->items = []; -
easy-invoice/trunk/includes/Models/Payment.php
r3344524 r3466809 186 186 return false; 187 187 } 188 188 189 189 // Update post meta for each field 190 190 $meta_fields = [ … … 208 208 foreach ($meta_fields as $field => $meta_key) { 209 209 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); 210 214 $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; 216 219 } 220 221 // Always update local data since we're setting it 222 $this->data[$field] = $data[$field]; 217 223 } 218 224 } -
easy-invoice/trunk/readme.txt
r3461761 r3466809 1 === Easy Invoice – P DF Invoice Generator & Quote Builder ===1 === Easy Invoice – Professional Invoice & Quote Generator === 2 2 Contributors: MatrixAddons 3 Tags: invoice, pdf , quotes, billing, payment3 Tags: invoice, pdf invoice, quotes, billing, payment gateway 4 4 Requires at least: 5.6 5 5 Tested up to: 6.9 6 6 Requires PHP: 7.4 7 Stable tag: 2.1. 97 Stable tag: 2.1.10 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html 10 10 11 Create professional invoices, accept payments, and manage clients directly from WordPress.11 The complete WordPress invoicing solution for freelancers & businesses. Create invoices, generate PDF quotes, accept payments, and automate billing—all in one plugin. 12 12 13 13 == Description == 14 14 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:** 15 Easy 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 26 75 * **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 = 47 83 * [**Unlimited Invoices & Quotes**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Create unlimited invoices and quotes with no restrictions. 48 84 * [**PDF Generation**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Generate professional PDF invoices and quotes with one click. … … 59 95 * [**Translation Ready**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Fully translatable for global use. 60 96 61 = Pro features (Easy Invoice Pro)=97 = Pro Version Features = 62 98 * [**Custom Invoice Permalinks**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Create professional, branded URLs for invoices. 63 99 * [**Advanced PDF Customization & Watermarks**](https://matrixaddons.com/plugins/easy-invoice/#free-vs-pro): Customize layouts, add text/image watermarks, and status badges. … … 73 109 74 110 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 115 The 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 132 Easy 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 140 Payment 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 144 Easy 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 152 English is the default language. Community translations are available through WordPress.org. 153 154 To contribute translations, visit [WordPress.org translation page](https://translate.wordpress.org/projects/wp-plugins/easy-invoice/) 96 155 97 156 == Installation == 98 157 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 160 1. Go to Plugins → Add New in your WordPress admin 161 2. Search for "Easy Invoice" 162 3. Click Install Now → Activate 163 4. Follow the setup wizard 164 165 **Manual Installation:** 166 167 1. Download the plugin ZIP file 168 2. Go to Plugins → Add New → Upload Plugin 169 3. Choose the ZIP file and click Install Now 170 4. Click Activate Plugin 171 172 **Quick Setup:** 173 174 1. Configure business details: Easy Invoice → Settings → General 175 2. Customize email templates: Easy Invoice → Settings → Email 176 3. Enable PayPal payments: Easy Invoice → Settings → Payment 177 4. Create your first invoice: Easy Invoice → Invoices → Add New 178 179 For detailed instructions, see our [documentation](https://matrixaddons.com/docs/easy-invoice-best-wordpress-invoice-plugin/). 103 180 104 181 == 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? = 190 Yes. 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? = 193 Yes. 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? = 196 Yes. 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? = 199 Free 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 201 Pro 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 203 For 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? = 206 Easy 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? = 209 Yes, with Easy Invoice Pro. The Partial Payments feature lets clients pay invoices in multiple installments. 210 211 = How do I track payments? = 212 Easy Invoice automatically tracks all payments. View payment status, history, and generate reports from the Payments dashboard. 107 213 108 214 = 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. 215 Yes. One-click PDF generation is included in the free version. 216 217 = How do I customize invoice templates? = 218 Yes, you have full control over the look of invoices and quotes: 219 220 1. Go to Easy Invoice → Settings → Templates 221 2. Choose from professional pre-built templates 222 3. Customize colors and add your logo 223 4. Modify layout using custom CSS 224 5. Add your business details and branding 225 226 Pro 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? = 229 Yes. 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? = 232 No. 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? = 235 Go to Settings → Permalinks and click Save Changes to flush rewrite rules. This resolves most 404 issues. 236 237 If the problem persists: 238 1. Deactivate and reactivate the plugin 239 2. Check that your .htaccess file is writable 240 3. Contact support if the issue continues 241 242 = Can I import data from other invoicing plugins? = 243 If you're upgrading from Easy Invoice 1.x to 2.0+, the plugin will automatically prompt you to migrate your data. 244 245 For 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 251 Contact support if you need assistance with data migration from specific plugins. 252 253 = Does Easy Invoice work on multisite? = 254 Yes. Easy Invoice is compatible with WordPress multisite installations. 255 256 = What PHP version is required? = 257 Easy Invoice requires PHP 7.4 or higher. We recommend PHP 8.0+ for optimal performance. 113 258 114 259 = 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) 260 The 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? = 263 Yes. We offer a 30-day money-back guarantee. 264 265 = How do I upgrade from Free to Pro? = 266 Purchase 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? = 269 Yes. 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 277 We take security seriously and respond quickly to any reported vulnerabilities. 278 279 = How can I report security vulnerabilities? = 280 Report 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? = 283 Yes. 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? = 286 For 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 293 Our support team is responsive and helpful (check out our reviews!). 294 295 = Do you offer customization services? = 296 Yes. 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 304 Contact us at [matrixaddons.com/contact](https://matrixaddons.com/contact/) to discuss your requirements. 125 305 126 306 == 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 308 1. Dashboard overview showing invoices, quotes, payments, and revenue 309 2. Invoice listing page with filters, bulk actions, and status management 310 3. Invoice editor with line items, taxes, and discounts 311 4. Invoice preview with "Pay Now" button 312 5. Quote management and listing page 313 6. Quote editor with real-time calculations 314 7. Payment tracking with status and history 315 8. Client management with contact information 316 9. Settings panel for business details and email templates 317 10. PDF generation with custom branding 136 318 137 319 138 320 == 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 = 406 Important update fixing vendor dependencies. Recommended for all users. 407 408 = 2.0.0 = 409 Major 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 268 268 success: function(response) { 269 269 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'); ?>'); 271 271 } else { 272 272 EasyInvoiceToast.error(response.data.message || '<?php _e('An error occurred', 'easy-invoice'); ?>');
Note: See TracChangeset
for help on using the changeset viewer.