Jump to content

ricrey

Member
  • Posts

    22
  • Joined

  • Last visited

  • Days Won

    2

ricrey last won the day on June 11

ricrey had the most liked content!

About ricrey

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

ricrey's Achievements

Junior Member

Junior Member (1/3)

  • Great Support Rare

Recent Badges

6

Reputation

  1. 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. I'm also completely against this; it's a very sad situation... At least they should leave it as an option that each user can choose.
  3. Hello WHMCS Community! 🎉 Today, I'm thrilled to share with you a little guide on how to turn the **WHMCS 8** admin area into a **Progressive Web App (PWA)**, allowing it to be displayed in full screen and with a custom icon on mobile devices. ### 📁 File Structure - 📂 admin - 📄 sw.js - 📂 PWA - 📄 manifest.json - 🖼️ whmcs.png ### 🚀 Codes #### 1. **manifest.json** { "name": "WHMCS Admin PWA", "short_name": "WHMCS Admin", "description": "PWA for WHMCS Admin Area", "start_url": "/admin/", "display": "standalone", "background_color": "#ffffff", "theme_color": "#000000", "icons": [ { "src": "/admin/PWA/whmcs.png", "sizes": "192x192", "type": "image/png" } ] } 2. sw.js self.addEventListener('install', function(event) { // PWA Installation }); self.addEventListener('fetch', function(event) { // Handle network requests }); 3. login.tpl Add the following lines inside the <head> tag of your login.tpl file. <link rel="manifest" href="/admin/PWA/manifest.json"> <script> if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/admin/sw.js') .then(function(registration) { console.log('Service Worker successfully registered:', registration); }) .catch(function(error) { console.log('Service Worker registration failed:', error); }); } </script> 🎁 Contribution I hope this little guide proves useful and enhances your experience using WHMCS on mobile devices. I'm eager to see how the community uses and possibly enhances this implementation!
  4. Does this work for WHMCS 8.5.x? It also helps the client to manually "Manage" the server, and I get a request for what the client needs and I proceed to carry out the task?
  5. Hola, tal vez podrías compartirlas? o las vendes?
  6. Hola a todos!, alguien tiene una plantilla en español para los correos que sea compatible con whmcs 8.5.x? 😞
  7. Thank you, if what you told me helped me, I'll tell you that now it works well for me and I was able to make the search engine react well, it's that I have an "Integrated wordpress in whmcs" design and I wanted the search engine to go to the knowledge base.. . I put the code I used in case it helps others. I changed my domain name to: mydomain.com for the example. <div id="bbhd-search-box-60180c49ccee8" class="bbhd-search-box"> <div class="container"> <form method="post" action="https://www.mydomain.com/shop/index.php?rp=/knowledgebase/search/"> <button class="bbhd-search-submit" type="submit"><span></span></button> <input class="bbhd-search-txt" type="search" name="search" placeholder="What are you looking for?"> <div class="bbhd-search-close"><span></span></div> </form> </div> </div>
  8. Hello, I would like you to help me with something... I want to implement a search for the whmcs knowledgebase in my theme, I know that when I put in the search it redirects to the link: /index.php?rp=/knowledgebase/search This only applies to the default whmcs browser, but I need to know how I can put "Cpanel" in the link, for example /index.php?rp=/knowledgebase/search=cpanel I want to know how I can link directly to the general search for a word...
  9. I want to add 3 more domains that come out with the image, just as I get in the home of whmcs with the topic "twenty-one". look at the image attached.
  10. I added all the code to .panel will it be ok? ... apparently it works .. .panel { margin-bottom: 20px; background-color: #fff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); font-size: .9em; } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-right: 15px; padding-left: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { margin-bottom: 0; border: 0; } .panel-group { margin-bottom: 20px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #ddd; } .panel-default { border-color: #ddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; border-color: #ddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { color: #fff; background-color: #337ab7; border-color: #337ab7; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #337ab7; } .panel-primary > .panel-heading .badge { color: #337ab7; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading .badge { color: #dff0d8; background-color: #3c763d; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading .badge { color: #d9edf7; background-color: #31708f; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bce8f1; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading .badge { color: #fcf8e3; background-color: #8a6d3b; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading .badge { color: #f2dede; background-color: #a94442; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ebccd1; }
  11. where can i find that css? and where should I place it in the child theme or the main theme "twenty-one"? I am a bit of a programming novice, I was able to place the "buy now" and "print" button but I don't know how to do so that when the domain is not available the button does not appear and when it is, it does come out .. there my knowledge is limited .
  12. the plugin's layout file shows this: layout.tpl {*{include file='./pageHeader.tpl'}*} {include file="./$templateName.tpl"} {*{include file='./pageFooter.tpl'}*}
  13. Hello, I am using the free whois plugin that they give in the marketplace, https://marketplace.whmcs.com/product/4795-whois-for-clients The problem is that the whois design in version 8.1 with the "twenty-one" theme has been slightly distorted, and with the "six" theme it works ... Maybe some good soul of this community can help me adapt it for "twenty-one" I would appreciate it immensely, I can even pass on the modification that I had made to that free plugin so that it has a better functionality ... I will put here the code of the tpl that I think is the one that gives problems with "twenty-one" because of the "class" of the "div" This is how I modified it some years ago so that it has a "buy" button and a "print" button. <div class="row"> <div class="col-lg-10 col-lg-offset-2"> <form method="POST" action="{$moduleLink}" class="form-inline" > <div class="col-lg-12 align-content-center"> <div class="input-group col-lg-8"> <input type="text" class="form-control input-lg" placeholder="example.com" name="domainName" value="{$domainName}" /> <span class="input-group-btn"> <button class="btn btn-danger btn" type="submit" > GET WHOIS LOOKUP </button> </span> </div> </div> </form> </div> </div> <br> <br> <div class="panel panel-primary"> {if !empty($whoisData) } <div class="panel panel-primary"> <div class="panel-heading">WHOIS Data for <strong>{$domainName}</strong><button onclick="myFunction()" style="float:right;background:white;color: blue;border: none;border-radius: 4px;cursor: pointer; padding:2px 8px;">Print</button></div> <br> <div class="row"> <div class="col-lg-10 col-md-offset-1"> <div class="alert alert-warning" role="alert"> <h5> <form action="https://www.hostingsupremo.com/shop/cart.php?a=add&domain=register" method="post"> <input type="text" value="{$domainName}" name="query" readonly class="whoresult" >is <span style="color:red;">{$whoisData['status']}</span> for registration <input type="submit" value="Buy Now" class="whobuy"/> </form></h5> </div> </div> </div> <div class="panel-body"> <div class="nstyle"> <b>{$whoisData['whois']}</b> </div> </div> </div> {/if} </div> <style> .nstyle{ margin:auto; width:83.33333333%; } .whoresult{ border: 0px solid; background:#fcf8e3; float: left; text-align:right; padding-right:5px; } .whobuy{ float: right;background-color: #4CAF50;color: white;border: none;border-radius: 4px;cursor: pointer; padding:4px 8px; } </style> <script> function myFunction() { window.print(); } </script> This is the original code of the free plugin of the marketplace, it is practically not modified at all xD <div class="row"> <div class="col-lg-12 col-lg-offset-3"> <form method="POST" action="{$moduleLink}" class="form-inline" > <div class="col-lg-12 align-content-center"> <div class="input-group col-lg-8"> <input type="text" class="form-control input-lg" placeholder="example.com" name="domainName" value="{$domainName}" /> <span class="input-group-btn"> <button class="btn btn-primary btn-lg" type="submit" > GET WHOIS </button> </span> </div> </div> </form> </div> </div> <br> <br> <div class="row"> {if !empty($whoisData) } <div class="panel panel-primary"> <div class="panel-heading">WHOIS Data for <strong>{$domainName}</strong></div> <br> <div class="row"> <div class="col-lg-10 col-md-offset-1"> <div class="alert alert-warning" role="alert"> <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> <span style="font-size:14px">This domain name is {$whoisData['status']}</span> </div> </div> </div> <div class="panel-body"> {$whoisData['whois']} </div> </div> {/if} </div> Note: I always considered that WHMCS as a "Hosting" platform should have included this as part of the development ...
×
×
  • 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