Jump to content


Popular Content

Showing content with the highest reputation since 10/18/2019 in all areas

  1. 2 points
    there will be at least two short-term ways to do it... edit the code in the above template. edit scripts.min.js (where there URL is defined). method 2 implies that you should be able to do it via a hook (which would be a better long-term solution), but i've not been able to get it working yet... besides, now that v7.7.1 is released, I suspect there won't be any more updates, apart from hotfixes, until May 2019 and so no harm in editing the template or js files. so if you want to edit the template... {if $service.sslStatus} {if $service.sslStatus->getClass() eq "ssl-state ssl-inactive"}<a href="cart.php?gid=11">{/if}<img src="{$service.sslStatus->getImagePath()}" data-toggle="tooltip" title="{$service.sslStatus->getTooltipContent()}" />{if $service.sslStatus->getClass() eq "ssl-state ssl-inactive"}</a>{/if} {elseif !$service.isActive} <img src="{$BASE_PATH_IMG}/ssl/ssl-inactive-domain.png" data-toggle="tooltip" title="{lang key='sslState.sslInactiveService'}"> {/if} alternatively, in scripts.js (not used by WHMCS), you can change... jQuery(document).on('click', '.ssl-state.ssl-inactive', function(e) { e.preventDefault(); window.location.href = WHMCS.utils.getRouteUrl('/ssl-purchase'); }); to... jQuery(document).on('click', '.ssl-state.ssl-inactive', function(e) { e.preventDefault(); var gidvalue="11"; window.location.href = "cart.php?gid=" + gidvalue; }); minify/compress it and save it as /templates/six/js/scripts.min.js - or if you're familiar with the minified files, you could edit scripts.min.js directly... either method should work, there is no need to do both! it's probably easier to use the template edit, but I posted the js solution because it was the first one that I wrote for this and it seems a shame to let it go to waste if others want to use or improve upon it (e.g the basis of a hook).
  2. 1 point
    Welcome to WHMCS.Community gfergo! We're glad you're here please take some time to familiarise yourself with the Community Rules & Guidelines and take a moment to introduce yourself to other WHMCS.Community members in the Introduce Yourself Board.
  3. 1 point
    Hello Friends, You may submit your wises and features request here for up coming update release . If you want any section please provide us screenshot for reference.
  4. 1 point
    Here is my rant for the day, well make it for the year. I am just starting to come out of a depression due to a WHMCS import assist experience I am having and still fixing. What started out to be .... "Lets amalgamate 2 WHMCS installations into 1" ended up being the biggest HEAD F$%K in history. @WHMCS you really need to look at your Import Assist script and get it right. There are so many issues with it, I cant even begin to discuss and rant on about what it should do and should not do. Eg..... You import products but then by accident I find out there are no product prices on my products on the new installation. WOW! Here is a list of a few things I want to kill my self over. How can you create an import script, but not import everything that is on one installation, eg. You dont import Pre Defined replies, You dont import knowledge base, You dont import email templates....... and the list keeps going on and on. Not to mention when it comes to 3rd party plugins WHMCS does not have a bar of it, make sure you check with your plugin authors if they support some sort of an export / import. Trust me 90% of them wont. This is a note to all Authors / Developers / WHMCS.... get things right, if you create a Project Management Addon, and the user has 300 projects and wants to migrate to a new installation, what happens? Do you offer an easy export option to json file or some other format that will be easy to get up and running without headaches? If the answer is NO then you need to reevaluate your processes and procedures. I have used WHMCS for close to 10 years now, and whilst it has gained SOME SORT OF TRACTION, it is so far behind the 8-ball that I think it needs a complete rewrite from the ground up. There is not much difference between v4 to v7 when it comes to the core functionality. Where is the mobile app? Dead and burried they do not care, yet 3/4 of the community who bought it, are crying for a decent mobile management app, why is this not important? are you living in the stone ages? I am finding issues and cleaning up a lot of mess with the amalgamation of 2 installations into 1 and I will never go thru this again, its just too hard. Let this be a warning to anyone looking into doing this prepare yourself for some sort of chaos and carnage. Cheers.... Mitch
  5. 1 point
    Welcome to WHMCS.Community WebsitesThatFitYou! We're glad you're here please take some time to familiarise yourself with the Community Rules & Guidelines and take a moment to introduce yourself to other WHMCS.Community members in the Introduce Yourself Board.
  6. 1 point
    Hi @leewolz, I see you closed the ticket. Were you able to get the information you needed to resolve the problem? If you could share the solution, I'm sure any other users who may experience the issue in future will be most grateful.
  7. 1 point
    one option would be to go back to two columns - the point being that the sidebar menu is filtering on the value of the fifth column (status) and so with "Active" effectively being changed to "Manage Product", then the Active filter term is never found... <div class="table-container clearfix"> <table id="tableServicesList" class="table table-list hidden"> <thead> <tr> <th></th> <th>{$LANG.orderproduct}</th> <th>{$LANG.clientareaaddonpricing}</th> <th>{$LANG.clientareahostingnextduedate}</th> <th>{$LANG.clientareastatus}</th> <th></th> </tr> </thead> <tbody> {foreach key=num item=service from=$services} <tr onclick="clickableSafeRedirect(event, 'clientarea.php?action=productdetails&amp;id={$service.id}', false)"> <td class="text-center{if $service.sslStatus} ssl-info{/if}" data-element-id="{$service.id}" data-type="service"{if $service.domain} data-domain="{$service.domain}"{/if}> {if $service.sslStatus} <img src="{$service.sslStatus->getImagePath()}" data-toggle="tooltip" title="{$service.sslStatus->getTooltipContent()}" class="{$service.sslStatus->getClass()}"/> {elseif !$service.isActive} <img src="{$BASE_PATH_IMG}/ssl/ssl-inactive-domain.png" data-toggle="tooltip" title="{lang key='sslState.sslInactiveService'}"> {/if} </td> <td><strong>{$service.product}</strong>{if $service.domain}<br /><a href="http://{$service.domain}" target="_blank">{$service.domain}</a>{/if}</td> <td class="text-center" data-order="{$service.amountnum}">{$service.amount}<br />{$service.billingcycle}</td> <td class="text-center"><span class="hidden">{$service.normalisedNextDueDate}</span>{$service.nextduedate}</td> <td class="text-center"><span class="label status status-{$service.status|strtolower}">{$service.statustext}</span></td> <td class="text-center">{if $service.rawstatus eq "active"}<a href="clientarea.php?action=productdetails&amp;id={$service.id}" class="btn btn-block btn-info"><i class="fas fa-wrench"></i></a>{/if}</td> </tr> {/foreach} </tbody> </table> <div class="text-center" id="tableLoading"> <p><i class="fas fa-spinner fa-spin"></i> {$LANG.loading}</p> </div> </div> and to save space, I've used a FA5 icon on the button... you could option give the column a heading if you wanted to. if you wanted to show the button for all products, but have it disabled for non-active services, then you could use the code below for the last <td>... <td class="text-center"><a href="clientarea.php?action=productdetails&amp;id={$service.id}" class="btn btn-block btn-info" {if $service.rawstatus neq "active"}disabled{/if}><i class="fas fa-wrench"></i></a></td> and if you wanted to remove the sort option from this "Manage" column, then... {include file="$template/includes/tablelist.tpl" tableName="ServicesList" filterColumn="4" noSortColumns="0,5"} I daresay you could do this in one column, but I suspect that there would have to be a hidden "status" column, and that would need additional coding in other templates or hooks.
  8. 1 point
    because it might not be related to a specific service? because it might relate to multiple services ?? from the other side, it can be frustrating to the user if they have a query that isn't service specific, but they end up being forced to choose a service at random just so that they can submit the ticket... i've ran across that on other sites, and it is so annoying. there's a commercial hook available that can supposedly do this, but i've never used it, so i've no idea if it works. the developer's username here is @wtricks so he should be able to confirm whether it still works or not - he's still visiting these forums, so I assume that he's still active.
  9. 1 point
    @LosBooom just checking that this has fully resolved the issue for you now?
  10. 1 point
    WordPress, if you keep it up-to-date and use it properly, is quite safe. There're two reasons why I suggest to install it in a different environment than WHMCS: WordPress for malware it's like honey for bees: it's so common, that there're thousands of BOT around which scans any WordPress site, looking for a vulnerability... keeping your WP blog far from your WHMCS, you'll also keep away a number of bot scanner... WHMCS security is of much higher importance: on WHMCS you manage domains and services of your customers (and, of course, money of yours...), while in WordPress you manage just news (and maybe user subscriptions...) On WHMCS you'll set up security management services (i.e. 2FA, VPN for administrative interface etc.) which would be excessive and annoying for WordPress. Besides this, having two different environments you can freely leave a third party (i.e. a freelance) access your WordPress for maintenance, without leaving him access to your WHMCS too... πŸ˜‰
  11. 1 point
    Hello there Almost 3 years using WHMCS I can not find a friendly and better platform out there for automation and managing purposes with possibility to have your website and client area all on same package, so WHMCS came to stay for long long time. The point is that WHMCS is not an Accounting software and also there is no module that could make WHMCS became accounting software, so using a parallel software is needed. Until now I have been using an accounting software on personal laptop because there was no cloud version until now. Now I will have all 2 platform on cloud WHMCS + Accounting software, but to avoid replicating jobs on 2 platform I have search that I could integrate them. Zappier can do that, but after free plan it cost 19.99/month (not cheap) if you consider you are paying WHMCS license+ host+Zapier+Accounting software +Goverment TAX πŸ˜“ For small business this solution could be expensive!!! Perhaps WHMCS could consider partnered with some good international accounting software to make our lives easier, so we would just need to register\certified that accounting software on our region 😢 If anyone have found a better way to make things works cheaper please share your good practices for who are starting and wants things done on the right way. Best regards
  12. 1 point
    I hope you can see the hole in that suggestion. πŸ™„
  13. 1 point
    of course, whilst trying to avoid those developers on there who may have some fake reviews!
  14. 1 point
    Appreciate all advice's , many thanks I have installed it on sub-domain on different cpanel with different IP, on a managed VPS with cloudflare security and firewall. For now installing it on 2 different datacenter will be costly as I am starting on hosting business now, but expect i n future to follow those advice's. There is any blog in terms of security better that wordpress you recommend?
  15. 1 point
    sure, it's just a case of changing the output below to suit your needs... if ($issue->enddate) { $bodyhtml .= '<a href="serverstatus.php" class="list-group-item"><small><b>'.$issue->title.'</b> <label class="label" style="background-color: lightgrey; color: black">'.$issue->status.'</label> <label class="label" style="background-color: '.$prioritycolor.'">'.$issue->priority.'</label><br><span style="color: black">'.$issue->description.'</span><br>'.Lang::trans('networkissuesstatusscheduled').': '.fromMySQLDate($issue->startdate, true, true).' - '.fromMySQLDate($issue->enddate, true, true).'</small></a>'; } elseif ($issue->lastupdate) { $bodyhtml .= '<a href="serverstatus.php" class="list-group-item"><small><b>'.$issue->title.'</b> <label class="label" style="background-color: lightgrey; color: black">'.$issue->status.'</label> <label class="label" style="background-color: '.$prioritycolor.'">'.$issue->priority.'</label><br><span style="color: black">'.$issue->description.'</span><br>'.Lang::trans('networkissueslastupdated').' - '.fromMySQLDate($issue->lastupdate, true, true).'</small></a>'; } so if we remove the description from the output... if ($issue->enddate) { $bodyhtml .= '<a href="serverstatus.php" class="list-group-item"><small><b>'.$issue->title.'</b> <label class="label" style="background-color: lightgrey; color: black">'.$issue->status.'</label> <label class="label" style="background-color: '.$prioritycolor.'">'.$issue->priority.'</label><br>'.Lang::trans('networkissuesstatusscheduled').': '.fromMySQLDate($issue->startdate, true, true).' - '.fromMySQLDate($issue->enddate, true, true).'</small></a>'; } elseif ($issue->lastupdate) { $bodyhtml .= '<a href="serverstatus.php" class="list-group-item"><small><b>'.$issue->title.'</b> <label class="label" style="background-color: lightgrey; color: black">'.$issue->status.'</label> <label class="label" style="background-color: '.$prioritycolor.'">'.$issue->priority.'</label><br>'.Lang::trans('networkissueslastupdated').' - '.fromMySQLDate($issue->lastupdate, true, true).'</small></a>'; }
  16. 1 point
    @Cubeboy in V7.8.x the "Credit Card Information" has been replaced by Pay Methods, are you using a custom admin theme? Your Client area theme will also need updating to support Pay Methods, you'll find a copy of the changes made to the Six and Standard Cart Templates in our release notes https://docs.whmcs.com/Version_7.8.0_Release_Notes#Template_Changes which should help you
  17. 1 point
    Keep in mind that however you store this, it's going to be visible. If you store this in the database, it's easily obtainable through any number of editors (or directly through the CLI interface) Please don't recommend deprecated functionality (especially to someone just starting out). Capsule is the way going forward. mysql_xxx query stuff is dead and shouldn't be used anywhere. Who knows where that's going in the future (likely removed).
  18. 1 point
    @Believe_ and @MikeP, here's an updated version - please note that this currently doesn't work very well if a client has a Group Discount. <?php use WHMCS\Database\Capsule; add_hook('PreModuleTerminate', 1, function($vars) { $invoices = Capsule::table('tblinvoiceitems') ->where('relid', $vars['params']['serviceid']) ->where('type', '!=', 'GroupDiscount') ->get(); logActivity('Auto Cancel Invoice: Starting...'); foreach($invoices as $key){ $invoiceIDs = Capsule::table('tblinvoices') ->where('id', $key->invoiceid) ->where('status', 'Unpaid') ->value('id'); $invoiceLine = Capsule::table('tblinvoiceitems') ->where('invoiceid', $invoiceIDs) ->where('relid', $vars['params']['serviceid']) ->value('id'); $invoiceLines = Capsule::table('tblinvoiceitems') ->where('invoiceid', $invoiceIDs) ->get(); $description = Capsule::table('tblinvoiceitems') ->where('relid', $vars['params']['serviceid']) ->where('invoiceid', $invoiceIDs) ->value('description'); $discountLine = Capsule::table('tblinvoiceitems') ->where('invoiceid', $invoiceIDs) ->where('type', 'GroupDiscount') ->where('description', 'like', '% '.$description.'%') ->value('id'); if($invoiceIDs){ logActivity('Auto Cancel Invoice: Invoice ' . $invoiceIDs . ' has had a line removed. This invoice previously had ' . count($invoiceLines) . ' lines.'); if(count($invoiceLines) > 1){ $command = 'UpdateInvoice'; $postData = array( 'invoiceid' => $invoiceIDs, 'deletelineids' => array($invoiceLine), ); $results = localAPI($command, $postData); }elseif(count($invoiceLines) == 1){ logActivity('Auto Cancel Invoice: Invoice ' . $invoiceIDs . ' has been cancelled because the product was terminated.'); $command = 'UpdateInvoice'; $postData = array( 'invoiceid' => $invoiceIDs, 'status' => 'Cancelled', ); $results = localAPI($command, $postData); } if($discountLine){ logActivity('Auto Cancel Invoice: Invoice ' . $invoiceIDs . ' had a Group Discount. This has been removed.'); $command = 'UpdateInvoice'; $postData = array( 'invoiceid' => $invoiceIDs, 'deletelineids' => array($discountLine), ); $results = localAPI($command, $postData); } } } }); It will remove the product from the invoice (as split is not possible using the API, and WHMCS does just remove lines from invoices any way) if the invoice has more than 1 line. If it only has 1 line, the invoice will be cancelled. But please note that this doesn't work with Client Group Discounts at all. There's no way for me to know for certain if a 'discount' line is associated with another line. If you use this hook with Client Group Discounts enabled, be aware that an invoice can have a negative total. Does anyone have any ideas of a way to "link" a discount line with the relevant product line? The only way I could think of is to copy the line for the product, and match on %PRODUCT-LINE%, but we could potentially target an incorrect discount line. Do you know any smarter way, @brian!? Edit: I added very simple logic to check if the product has a line for GroupDiscount. Please test this thoroughly before using it. I've only tested it on my dev installation, and everything seems fine from there.
  19. 1 point
    Hello, Please contact us for any WHMCS development here Hope to hear from your
  20. 1 point
    This sounds like a great addition to the module
  21. 1 point
    Do you love working with internet technologies and helping people? Do you know WHMCS and Website Hosting? If so, we want you to join team WHMCS! As you can see from the photo, we're a friendly bunch, and we are looking for a new Technical Analyst to join our team --> The type of applicants we are looking for should be passionate about helping customers resolve issues & answering queries they have. Excellent written communication, advanced problem solving and troubleshooting skills, and being able to work independently are a must. Having experience with PHP development, and having the ability to review & understand PHP code is a bonus. We are looking for applicants based worldwide for this remote position. Because of that a stable internet connection required. Experience: Experience with troubleshooting and debugging PHP and MySQL Installation and configuration of PHP Applications within Linux and Windows environments Familiarity of WHMCS software, configuration and implementation Good working knowledge of HTML, CSS and Javascript Eligibility Requirements: High School diploma or equivalent; One year of web hosting industry experience or other related work preferred Previous experience building addons, hooks or modules for WHMCS preferred Familiarity of web hosting control panels or payment gateway APIs preferred If that sounds like you, send us your resume: CLICK HERE TO APPLY! We can't wait to hear from you.
  22. 1 point
    Hi Michael, I thought it might be helpful if I mentioned two further things for clarification... firstly, the WHMCS Exchange Rate updates basically work by pulling the daily ECB (European Central Bank) XML feed - that feed is a list of 30+ currencies and gives the daily equivalent value of 1 Euro in those currencies - so it's not loading 30 different currencies and all the exchange rates between each of them, just the Euro exchange rate with each and then it can easily calculate the others from those values. <Cube><Cube time="2018-12-21"><Cube currency="USD" rate="1.1414"/><Cube currency="JPY" rate="126.98"/><Cube currency="BGN" rate="1.9558"/><Cube currency="CZK" rate="25.855"/><Cube currency="DKK" rate="7.4670"/><Cube currency="GBP" rate="0.90215"/><Cube currency="HUF" rate="321.97"/><Cube currency="PLN" rate="4.2851"/><Cube currency="RON" rate="4.6389"/><Cube currency="SEK" rate="10.2733"/><Cube currency="CHF" rate="1.1312"/><Cube currency="ISK" rate="134.10"/><Cube currency="NOK" rate="9.9428"/><Cube currency="HRK" rate="7.4216"/><Cube currency="RUB" rate="78.2103"/><Cube currency="TRY" rate="6.0546"/><Cube currency="AUD" rate="1.6081"/><Cube currency="BRL" rate="4.4099"/><Cube currency="CAD" rate="1.5459"/><Cube currency="CNY" rate="7.8825"/><Cube currency="HKD" rate="8.9368"/><Cube currency="IDR" rate="16696.34"/><Cube currency="ILS" rate="4.3045"/><Cube currency="INR" rate="80.0400"/><Cube currency="KRW" rate="1282.71"/><Cube currency="MXN" rate="22.7547"/><Cube currency="MYR" rate="4.7608"/><Cube currency="NZD" rate="1.6925"/><Cube currency="PHP" rate="60.546"/><Cube currency="SGD" rate="1.5641"/><Cube currency="THB" rate="37.267"/><Cube currency="ZAR" rate="16.4753"/></Cube></Cube> as an example, today on the ECB list, 1 EUR = 0.90215 GBP - however, on my dev, my default currency is GBP, so WHMCS does the calculation of 1/0.90215 to give me the GBP->EUR exchange rate of 1.10846 so if I wanted to calculate the exchange rate between two non-default currencies, in my case that could be USD->HRK with a default currency of GBP, I know that the GBP->USD rate is 1.2652 today, so USD->GBP would therefore be 0.79039 .... GBP->HRK is still 8.22657, so if we multiply one by the other (0.79039*8.22657), we get a USD->HRK exchange rate of 6.50219 I can double-check this by setting USD as my default currency and updating the exchange rates again... secondly, when it comes to the hook, you basically need to know two things: what is the client's currency what is the secondary currency exchange rate that you want to return for the client's currency. so 1️⃣ can be taken care of by adding the code below to your hook function... $clientcurrency = $vars['clientsdetails']['currency']; that gives you a new variable, $clientcurrency, than you can use in your conditions. i'm assuming for 2️⃣ that it's always going to be HRK - though it wouldn't really matter if it wasn't, it would just make the hook code a little longer... as an early Christmas present from me, here's a replacement hook that should work for you - you'll have to change the IF statements to match your own currency conditions though... 🎁 <?php # Get Croatian Currency Exchange Rate # Written by brian! use Illuminate\Database\Capsule\Manager as Capsule; function hook_currency_exchange_rates($vars) { $clientcurrency = $vars['clientsdetails']['currency']; if ($clientcurrency == "1") { // GBP $exchangerate = Capsule::table('tblcurrencies')->where('code','HRK')->value('rate'); return array("exchangerate" => $exchangerate); } elseif ($clientcurrency == "13") { // USD $usdrate = Capsule::table('tblcurrencies')->where('code','USD')->value('rate'); $hrkrate = Capsule::table('tblcurrencies')->where('code','HRK')->value('rate'); $exchangerate = number_format(((1/$usdrate) * $hrkrate), 5); return array("exchangerate" => $exchangerate); } elseif ($clientcurrency == "14") { // EUR $eurrate = Capsule::table('tblcurrencies')->where('code','EUR')->value('rate'); $hrkrate = Capsule::table('tblcurrencies')->where('code','HRK')->value('rate'); $exchangerate = number_format(((1/$eurrate) * $hrkrate), 5); return array("exchangerate" => $exchangerate); } elseif ($clientcurrency == "15") { // HRK // do nothing - it is the secondary currency! } } add_hook("ClientAreaPageViewInvoice", 1, "hook_currency_exchange_rates"); ?> I should add that if I were writing this for a client, and if the second currency was always going to be HRK, I could cut this hook right down to it's bare bones (e.g remove all but one of these if statements) and it would be half the size... but as you said that you're not a programmer, and because I don't know exactly which currencies you have and which currency would be secondary for each of those currencies, i've tried to keep it simple and documented. so in my dev, 1=GBP; 13=USD; 14=EUR and 15=HRK, and so what this hook will do is for GBP clients, return the HRK exchange rate (because GBP is the default currency, that's just a basic query to the database); for USD & EUR clients, it will calculate and return their HRK exchange rate; for HRK clients, assuming that Croatian invoice rules means that you only need to show HRK prices for non-HRK currencies, it does nothing... you don't really need it in the code, but I left it in in case you need to do something else for HRK clients. in the template, you can also change your Smarty code from... {if $clientsdetails.currency eq "2"} ({math equation="x * y" x=$item.amount->toNumeric() y=$exchangerate format="%.2f"} HRK){/if} to... {if $exchangerate} ({math equation="x * y" x=$item.amount->toNumeric() y=$exchangerate format="%.2f"} HRK){/if} because now the logic of how to react to client currencies is in the hook and it is the hook that decides if and when the $exchangerate variable is returned to the template... so using the above hook as is, if the client used HRK, then $exchange rate would not be returned to the template and that Smarty if statement would be false... if they were USD customers, $exchange rate will be returned with the correct rate and the if statement true. as I said in the other thread, using the above method, you're going to run into a potential issue with paid invoices using today's exchange rate rather than the rate on the date of purchase - that's fixable in the hook, but could get quite involved coding wise, so I may return to that in the New Year when the batteries are fully recharged... even with unpaid invoices, that's still an issue - but a harder one to fix. hopefully the hook will give you the basis of a quieter seasonal break than you otherwise would have had... enjoy Christmas/New Year - I know that I intend to! πŸŽ„
  23. 1 point
    My MacBook recently had to be sent off for repair and I’ve been forced to use my iPad to answer support etc. However, every time I view a client page in the admin area, the client drop down search bar that appears at the top of each client page, forces me to sign in (using the fingerprint touch) on the iPad. It’s really annoying and laborious. however, I’ve been using WHMCS for about 12-13 years, and somewhere in the back of my mind, I remember there used to be an option to turn off the client drop down/search appearing (for performance sake). But for the life of me, I cannot now find that option. am I missing something? Help appreciated. Thanks.
  24. 1 point
    Hello Renish A R welcome & thank you for joining WHMCS.Community! Please take a few minutes to review our
  25. 1 point
    yes, search the forums before posting this is already under discussion in another thread... And here it is http://forum.whmcs.com/showthread.php?73471-Google-shutting-down-Google-Checkout-on-Nov-20-2013

Important Information

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