Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 06/10/26 in all areas

  1. @WHMCS John If you want this to be the new default Stripe module, a migration path from the current default Stripe module will be necessary.
    3 points
  2. Hello @sahostking Thank you for your message. We are aware of this issue in WHMCS 8.13.4, which is currently being tracked under case WHMCS-26568 with our development team. A hotfix has been attached to this message to address this issue for you and anyone else. Please upload and extract the contents of the attached file into your WHMCS installation directory, allowing it to overwrite the existing files. I hope this helps! WHMCS-26568-hotfix.zip
    2 points
  3. Hi everyone, I would like to share a free community addon I created for WHMCS 9.x: CW Invoice Mutability for WHMCS 9.x Repository: https://github.com/RicRey1988/cw-invoice-mutability-whmcs-9.x WHMCS 9 introduced invoice immutability for non-Draft invoices. I understand the reason behind this change from an accounting and audit-trail perspective, but I also noticed that some administrators still need a controlled way to manage invoice editing in specific internal cases, especially before an invoice is paid or before it is synchronized with an external tax/e-invoicing system. This addon provides an admin interface to manage the current WHMCS invoice mutability compatibility option without manually editing configuration.php. Main features: Enable or disable invoice mutability from the WHMCS Admin Area. Automatically add or remove the current WHMCS compatibility flag: $allow_adminarea_invoice_mutation = true; Create a backup of configuration.php before modifying it. Optionally hide the WHMCS Admin Area warning banner about invoice immutability being disabled. Advanced/emergency mode to convert eligible Unpaid invoices back to Draft. Audit log table with invoice snapshot, invoice items, transactions, admin ID, IP address, reason, and timestamp. Safety checks to block Draft conversion when the invoice has transactions, payment date, or possible external/tax authorization references. PayPal donation link included for anyone who wants to support the project. The advanced Draft mode is intentionally restricted. It is not intended for already-paid, fiscalized, externally authorized, or tax-reported invoices. In those cases, the correct workflow should normally be credit notes, cancellation, voiding, or re-issuance according to local accounting rules. Installation: The folder must be named exactly: cw_invoice_mutability Final WHMCS path: /modules/addons/cw_invoice_mutability/ Required structure: modules/ └── addons/ └── cw_invoice_mutability/ ├── cw_invoice_mutability.php ├── hooks.php ├── README.md └── lib/ └── CwInvoiceMutabilityTools.php You can clone it directly with: cd /path/to/whmcs/modules/addons git clone https://github.com/RicRey1988/cw-invoice-mutability-whmcs-9.x.git cw_invoice_mutability Then activate it from: Configuration > System Settings > Addon Modules After activation, go to: Addons > CW Invoice Mutability This addon is free and community-oriented. It is not affiliated with WHMCS. If it helps you, donations are welcome: https://paypal.me/hostingsupremo Feedback, improvements, and pull requests are welcome.
    2 points
  4. Unbelievable that all of our questions lately are being ignored. What's the point of this community?
    2 points
  5. @NiceNIC Team Welcome to the WHMCS community. We look forward to some interesting conversations and valuable insights from your registrar-side perspective. Wishing you a great time in the community!
    1 point
  6. @bluesteam Don't remove those records now, I'll have a look to see what will happen if we remove these records. But do you have a table tblcredit, does it have some credit data as well?
    1 point
  7. What choice do we have though - I can't see that they will reverse this. It's very frustrating because we use Xero for our organisation. We should not be forced into this massive change. @WHMCS John why can't you give us the option to opt in or not? Our invoicing system is handled by Xero so these changes are just added complexity we don't need.
    1 point
  8. WHMCS support have told me recently that they're focusing on support tickets, and this community is not a good way to obtain support. Send a support/bug report and include the URL to your post and they will reply. Would be great if you post the reply here too. Will most likely be a case/bug number for a future release.
    1 point
  9. There are still issues. The nexus cart is API driven and WHMCS has not considered existing functionality for additional fields for domains (something that is in their documentation). Hold off for now. Unless you want to answer customer questions, and/or miss out on sales.
    1 point
  10. So after we have been told to rather use the Add Payment method instead for every single individual invoice, up to now for 15 years I have ALWAYS used the "Mark Paid" option for bank transfers as this is genuinely helpful when you have 5 invoices that need to be marked as paid. Now I have to edit every single invoice and mark them paid manually. What a MESS!! But now how do we fix the invoices that have credit notes added to them that are not being included in the reporting that were all marked with "Mark Paid" button? We can't edit the invoice after it has already been marked as paid and emails and invoices receipts have already gone out to clients! Did you manage to rectify the ones that have credit notes and were marked paid using the "Mark Paid" button so it shows in the financial reports? Do we just mark them as UNPAID and then add a payment? or what?
    1 point
  11. The demand is there. This needs to be developed in your latest version.
    1 point
  12. @WHMCS John I agree. There has to be an upgrade process. Making it harder for customers and business owners is not the right answer.
    1 point
  13. We've migrated from CentralNic to OpenProvider, and it's been mostly without issues. We've had to contact OP support a few times but have almost always gotten a quick reply. Their WHMCS module is fine. It needs work here and there but they're open to suggestions - and their entire module is open source so anyone can make PRs. I've submitted a few and got them approved. Their API can be slow from time to time, but this was also an issue with CentralNic. Unfortunately, OpenProvider's API has a few more stability issues than CentralNic's. Switching to OpenProvider won't necessarily release you entirely from the hands of CentralNic, though. OpenProvider use CentralNic for a lot of TLDs - but OpenProvider's pricing generally better, even for those TLDs.
    1 point
  14. Marked the task as done, and on the domainsync that followed it updated correctly. One would have thought paying the invoice would be the trigger for updating the next invoice due date. Strange.
    1 point
  15. Hi @Evolve Web Hosting, Stripe's Payment Methods are not interoperable between Stripe and Stripe Dynamic systems. Clients will need to enter payment details afresh when selecting Stripe Dynamic. A migration path is something we could potentially look into in future and demand and priorities permit.
    1 point
  16. Hi everyone, I am happy to share a complete, community-maintained Bengali language translation pack for WHMCS. This project aims to provide a native language experience for WHMCS users in Bangladesh and Bengali-speaking users around the world. This language pack covers the full WHMCS Client Area, as well as the Admin Area strings, making it fully localized for local business needs. Features: Full localization of Client Area. Admin Area support. Community-maintained and regularly updated. Easy installation and integration. You can access the project on GitHub: https://github.com/Mojib-Rsm/whmcs-bengali-language How to Install: Download the bengali.php file from the repository. Upload it to your WHMCS installation directory under /lang/. Activate it from Setup > General Settings > Localisation in your Admin Area. I welcome your feedback, suggestions, or contributions. If you find any typos or missing strings, please feel free to open a Pull Request on GitHub. Happy localizing! Best regards, Mojib Rsm Portfolio: mojib.me
    1 point
  17. We have discovered an issue with 9.0.3 and were able to replicate it, if a customer has >100 billable items, once over 100 it will generate an invoice for each item Reproduced on an isolated test client with all custom hooks fully disabled; still fragmented at >100. ◦ Exact boundary confirmed: clean at 100, breaks at 101 (50→1, 99→1, 100→1, 101→2, 250→101 invoices). Once we rolled back to 8.13.3 it worked as normal and only produced 1 invoice >100
    1 point
  18. As with most discussion boards, it's a member to member conversation for the most part. Staff do participate, but there doesn't seem to be a dedicated effort in that regard. I also imagine there are some strict guidelines they have to follow so none say "the wrong thing" and cause issues. Very low participation as a result, and I'd guess a low priority to do so.
    1 point
  19. @WHMCS John Can you please clarify?
    1 point
  20. Good question, but still unanswered. The documentation is also not clear about this.
    1 point
  21. Can you please elaborate on Terminal Status? And the routine to transition invoices in v9.1? There has not been a WHMCS announcement or clear documentation about the immutable invoice changes, yet there are many posts and concerns a detailed document showing what has changed and is expected behaviour would be a good way forward.
    1 point
  22. For businesses that heavily utilise WHMCS's API, you may be sending API requests from many different IP addresses or IP ranges, all of which need to be whitelisted at System Settings > General Settings > Security (tab) > API IP Access Restriction in the Admin Area. Each individual IP address must be added to the allow list (it is not possible to list IP ranges in CIDR notation at this time). The process of adding a range of IP addresses can be sped up by using a PHP script to add them in bulk. Before we begin, WHMCS support does not recommended directly interacting with the database where it can be avoided. We would therefore only recommend following this guide if you have an existing understanding of both PHP and database administration, and have taken a full database backup. WHMCS will not be held responsible for any data loss that might occur if you do not heed this advice. How are API Allowed IPs stored? The list of IPs allowed to interact with the API are stored as a serialized array in tblconfiguration.value where tblconfiguration.setting = "APIAllowedIPs". A serialized array, in this particular context, is a way for us to store an array as a string in the database. Handling existing data in WHMCS's database To make things easy, let's create a function that takes in the current serialized array, which you can retrieve from the database, a new IP and a note, and then returns the new serialized array. Here it is, with everything explained in inline comments: function addNewIP($currentValue, $ip, $note) { // Take the $currentValue, and unserialize it so we can interact with it directly. $data = unserialize($currentValue); // Define our new entry, based on the $ip and $note provided in the function call. $newEntry = array( 'ip' => $ip, 'note' => $note ); // Add the new entry to the existing array. $data[] = $newEntry; // Re-serialize the array. $newValue = serialize($data); // Return to the serialized version of the new array. return $newValue; } Iterating through IP ranges We now need to iterate through all IP address in a given range and add them to our array. Let's create another function to do this: function addNewIPRange($currentValue, $startIP, $endIP, $note) { // Convert the start and end IP addresses to long integers so we can iterate through them $startIP = ip2long($startIP); $endIP = ip2long($endIP); // Initialize $newValue $newValue = $currentValue; // Iterate through the IP range for ($ip = $startIP; $ip <= $endIP; $ip++) { // Convert the current IP back to string format $newIP = long2ip($ip); // Call the addNewIP function for each IP in the range $newValue = addNewIP($newValue, $newIP, $note); } // Return the modified value return $newValue; } Note that we'll still need to provide the current value from the database, and this will be updated each time an IP in the range is added. Testing it out First of all, we need to retrieve the current serialized array from the database. This can be done programmatically using Capsule, but in this case we'll just retrieve it manually: SELECT value FROM tblconfiguration WHERE setting = 'APIAllowedIPs' Then we can call addNewIPRange to add an IP range, or just addNewIP if we only want to add a single address. Of course, when you're using this you wouldn't need to add all of the extra echo lines or comments - these are just included to help demonstrate how this is working. // Store current APIAllowedIPs value in variable $currentValue = 'a:5:{i:0;a:2:{s:2:"ip";s:0:"";s:4:"note";s:0:"";}i:1;a:2:{s:2:"ip";s:12:"10.3.137.243";s:4:"note";s:0:"";}i:2;a:2:{s:2:"ip";s:7:"8.8.8.8";s:4:"note";s:7:"Testing";}i:3;a:2:{s:2:"ip";s:7:"1.1.1.1";s:4:"note";s:7:"Testing";}i:4;a:2:{s:2:"ip";s:11:"12.13.14.15";s:4:"note";s:7:"Testing";}}'; // Let's see our $currentValue in a more readable format so that we can compare it to our new version echo "<h1>Starting value</h1>"; echo "<pre>"; print_r(unserialize($currentValue)); "</pre>"; echo "<br/><hr/>"; // To add a new IP range, call addNewIPRange, and pass in the $currentValue, IP range and a note: $testRange = addNewIPRange($currentValue, '10.20.30.40', '10.20.30.60', 'Test IP Range'); echo "<h1>With our added IP range</h1>"; echo "<h2>Serialised version:</h2>"; echo $testRange; echo "<h2>Unserialised version:</h2>"; echo '<pre>'; print_r(unserialize($testRange)); '</pre>'; echo "<br/><hr/>"; // To add a single IP, call addNewIP, and pass in our new value, address and a note: $testSingle = addNewIP($testRange, '192.168.1.1', 'Single IP'); echo "<h1>And with one more address</h1>"; echo "<h2>Serialised version:</h2>"; echo $testSingle; echo "<h2>Unserialised version:</h2>"; echo '<pre>'; print_r(unserialize($testSingle)); '</pre>'; echo "<br/><hr/>"; You can then add the new data to the database manually, or using Capsule. Doing the latter is beyond the scope of this article. The final script Let's finish by tidying up the scirpt a bit, and showing an example. Let's say we wanted to whitelist the following: 192.168.45.23 - management VPN 192.168.45.24 - development VPN Range from 10.20.0.126 to 10.20.10.159 - backend servers Here's what your script would look like: <?php function addNewIP($currentValue, $ip, $note) { $data = unserialize($currentValue); $newEntry = array( 'ip' => $ip, 'note' => $note ); $data[] = $newEntry; $newValue = serialize($data); return $newValue; } function addNewIPRange($currentValue, $startIP, $endIP, $note) { $startIP = ip2long($startIP); $endIP = ip2long($endIP); $newValue = $currentValue; for ($ip = $startIP; $ip <= $endIP; $ip++) { $newIP = long2ip($ip); $newValue = addNewIP($newValue, $newIP, $note); } return $newValue; } $currentValue = 'a:5:{i:0;a:2:{s:2:"ip";s:0:"";s:4:"note";s:0:"";}i:1;a:2:{s:2:"ip";s:12:"10.3.137.243";s:4:"note";s:0:"";}i:2;a:2:{s:2:"ip";s:7:"8.8.8.8";s:4:"note";s:7:"Testing";}i:3;a:2:{s:2:"ip";s:7:"1.1.1.1";s:4:"note";s:7:"Testing";}i:4;a:2:{s:2:"ip";s:11:"12.13.14.15";s:4:"note";s:7:"Testing";}}'; $manVpnIP = addNewIP($currentValue, "192.168.45.23", "Management VPN"); $devVpnIP = addNewIP($manVpnIP, "192.168.45.24", "Development VPN"); $backendServers = addNewIPRange($devVpnIP, "10.20.0.126", "10.20.0.159", "Backend Server"); echo $backendServers; The output of this script would be the new serialized array, and you can set this directly in the database! Again - please make sure to take a backup before manually interacting with WHMCS's database. UPDATE tblconfiguration SET value = '<add your serialized array here>' WHERE setting = 'APIAllowedIPs'; Important: You must use single quotes and not double quotes, else the command's format will not be valid (since double quotes are used in the serialized array itself). Once you have run this, login to the WHMCS admin area and navigate to System Settings > General Settings > Security (tab). You should now see a list of all your IPs listed in the API IP Access Restriction setting. Further considerations After adding so many IP addresses, you may find that you are no longer able to add any more addresses via the Admin Area. This will be because your PHP max_input_vars is being exhausted. It is not a bug with WHMCS, nor is it something that we can mitigate - this is how PHP is configured by default. https://www.php.net/manual/en/info.configuration.php#ini.max-input-vars To rectify this, please increase the max_input_vars value in your PHP configuration. Should you need assistance with doing this, please contact your hosting provider or system administrator. It is also possible that you might reach the maximum size for the value column in tblconfiguration. In the event of this occurring, you can change the type of the column to MEDIUMTEXT. Please keep in mind that this is not officially supported, and you should definitely take a database backup before proceeding. Customising/extending this script Feel free to customise this script to you heart's content, whether you want to change how it behaves or extend its functionality. However, please keep in mind that our Technical Support team won't be able to help you troubleshoot any problems that you may encounter should you make any changes. Use at your own risk. Suggestions for other "Tips & Tricks' articles If you'd like to see an example of how we can customise WHMCS in other ways, please do give us your suggestions!
    1 point
  23. still issues? I am considering switching to test but dont even want to bother if there are still issues.
    0 points
  24. Clearly a need for a feature request. 😇
    0 points
  25. 100% do not roll it , the changes they introduced with like locking an invoice once published etc are bad enough, let alone the bugs on top of this.
    -1 points
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use & Guidelines and understand your posts will initially be pre-moderated