Jump to content

Leaderboard


Popular Content

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

  1. 1 point
    There are some basic features that are still missing since I started using WHMCS over 10 years ago. So I don;t hold out much hope 🙂
  2. 1 point
    i'd go along with @mwndesign in that it's probably not a good idea security-wise, but if you really want to you could probably use ModulesGarden's Reseller Center addon module - that allows resellers (aka affiliates) to login as their users (to WHMCS I assume)... and once logged in, there should be cpanel links for appropriate products...
  3. 1 point
    @yggdrasil, Yes, S3-compaitble services should work - please check the documentation for information on this. Please let us know which services you tested it with and what the results were.
  4. 1 point
    obvious thought would be whether you know if any invoices are actually due to be generated for this period? there's an old v6 admin widget that tells you about forthcoming invoices to be generated - once v7.7 comes out of beta, i'll rewrite it but it should still work in any of the latest versions... you could even run the domains and/or services reports, give it a filter of a specific month to check and see if that tells you whether any are due for renewal this month - you may need it change the month depending on the value of your invoice generation value from automation settings. another possible cause might be that "Continuous Invoice Generation" is disabled and previous invoices haven't been paid... https://docs.whmcs.com/Invoicing_Setup#Continuous_Invoice_Generation there are other possibilities, but usually the activity log is the best clue - though if you say that's not giving you any indication of where to look, then a ticket to Support might be a quicker solution as seeing those logs, and/or your setup in general, might resolves this faster than a series of suggestions from the outside.
  5. 1 point
    Funny how you keep calling me bad and crap but kept coming back for more 'quotes'. Hope someone else enjoys putting up with you. That is all i am going to say. Bye.
  6. 1 point
    We developed this a few months ago. I’ve passed all of my code to WHMCS so hopefully they’ll include it in 7.7 or a future release
  7. 1 point
    you missed out one vital piece of information - do you want to do this for everyone or just for logged in clients ? if logged in clients, then it's simple as "state" will be one of the values in the $clientsdetails array and all clientarea pages will have access to that. if everyone, then you're in the realms of utilising a third-party Geo-IP location service (e.g one of the ones that you've listed that includes city/states)... although bear in mind that no such service is 100% accurate, and certainly not if the visitor is using a VPN to view the site.
  8. 1 point
    just add the code below to the top of the template (or at least before you try to use capsule in the code) - it's the same as the one from the hook... use Illuminate\Database\Capsule\Manager as Capsule;
  9. 1 point
    Hi @cyberhostpro, If there's a way we can make improvements to the module, that is something we'd be interested in. I'll message you directly for more info.
  10. 1 point
    so Christmas is over and I must now sadly enable the PM system again... I was enjoying the peace & quiet too. 🙉 the invoice was sent back in June 2018... not the quickest of payers, despite numerous reminders and duplicate invoices being sent.
  11. 1 point
    Hi Michael, you did come close - the line that is wrong is... $clientcurrency = $vars['clientsdetails']['currency']; $vars is used in the Smarty templates, not in the invoice file - so it should be referenced using... $clientcurrency = $clientsdetails['currency']; with that change made, the IF statements should work (assuming capsule is enabled in your template and you'd get an error if it wasn't)...
  12. 1 point
    Welcome to WHMCS.Community papo2414! 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.
  13. 1 point
    John can this be added?? We’ve coded it already so happy to donate to you all of my code for you to take anything out of it to add to yours.
  14. 1 point
    WHMCS 7.7 Release Candidate Now Available We are pleased to announce the release of the WHMCS 7.7 Release Candidate. This marks the end of feature development and is the final stage before releasing the final and stable version of WHMCS 7.7. We encourage you to download, install and try out the latest version. Some feature highlights are itemised in the image above. To learn more about what's new, we invite you to visit the WHMCS 7.7 Preview Site. Take part in the beta Be among the first to try out the new features and functionality by getting involved in the pre-production testing today. Our public beta program gives you direct access to try our early pre-production releases and help test and contribute to the development process. To get started, you can download WHMCS 7.7 or upgrade to it using the Automatic Updater today. As always, Beta releases are intended for testing only and are not recommended for production use. Download | Release Notes | Upgrade Instructions | Changelog
  15. 1 point
    ... and that's it from me for 2018 - i'm taking a break from here for Christmas & New Year! 🎄 i'm thus avoiding both the 7.7 beta releases and the possibility of Chris enabling the Christmas lights and animated snow effect again. ❄️ with the v7.7 betas, there should be more than the usual minimal WHMCS staff floating around this place to answer the threads - so take advantage of them being around, because once the beta testing is over, they'll disappear back into the ether as usual! 🙄 if you want to ensure that I look at a particular thread on my return, just mention me with @brian! and i'll get a notification. I expect to be back here around the second week of January 2019... enjoy yourselves everyone! P.S - for anyone yet to have paid what they owe me, the PayPal account and bank don't close over the festive period, so I will look forward to receiving payments - I won't forget if you don't pay!
  16. 1 point
    the idea for this widget was started in the feedback thread below, but rather than hijack that thread with this project, it was easier to start a new thread in Third Party Addons. this "Enhanced ToDo List" admin widget, expands on the default widget by showing client names (or Company Name), service details (name/domain) and domain names as mouseover tooltips (I could put them in the body, but then space might become an issue)... for those that want to use this widget, i've attached it to this post - simply upload to /modules/widgets and the next time you go to the admin homepage, it should be there (assuming your admin role allows viewing of the ToDo List). i've called the file "EnhancedToDo.php", so you'll end up with two ToDo widgets on your homepage, just disable the default one using the Show/Hide widgets option top right... I could have called it ToDo.php, but then the WHMCS auto-updater would have overwritten it during the next update - so it's easier to keep it separate until WHMCS improve how they handle ToDo's. it's written for WHMCS v7.6, but will work on v7.5.x too... it might work on earlier v7 versions, but I haven't tested it on them - there is a WHMCS version check inside the widget that chooses FontAwesome 5 icons if using v7.6 or later, or FA4 if using an earlier WHMCS version. if you spot any ToDo's that don't behave correctly (e.g a third-party addon might add a ToDo that doesn't follow the WHMCS convention), then feel free to reply about it (or PM me) - it shouldn't break the output, it will likely just not show the icon(s) for that ToDo. EnhancedToDo.php
  17. 1 point
    to be honest, I haven't had the time... but it's on my "Things to do" list (an actual physical bit of paper in front of me!!) i'll make a further note to take a look on Sunday - if i'm not out enjoying myself (and looks like rain so I doubt it!), it's usually a good day for programming, as I won't get any calls from our hosting clients!
  18. 1 point
    I would like to offer Office 365 to my customers, but don't know where to start, other than selling them a 'retail' subscription, but it's hard for me to make any money off of that, when they already know the price and they are like... why don't I just go to Microsoft and get it cheaper. How can I sign up for the Microsoft Office 365 partner program and is there a cost involved with that?
  19. 1 point
    Hi everyone, Very nice widget! I'd like to contribute to this post with my customized one... <?php if (!defined("WHMCS")) die("This file cannot be accessed directly"); function widget_upcoming_renewals($vars) { global $_ADMINLANG,$CONFIG,$currency; $numberofdays = '30'; $title = "Upcoming Renewals <span style='font-size:0.8em;'>(Next ".$numberofdays." Days)</span>"; $dateformat = str_replace("y","Y",strtolower(preg_replace("/(.)\\1+/", "$1", $CONFIG["DateFormat"]))); $hostinginvdays = $CONFIG["CreateInvoiceDaysBefore"]; if ($CONFIG["CreateDomainInvoiceDaysBefore"]) { $domaininvdays = $CONFIG["CreateDomainInvoiceDaysBefore"]; } else { $domaininvdays = $CONFIG["CreateInvoiceDaysBefore"]; } $content .= ' <div id="upcoming-renewals"> <ul id="tabs" class="nav nav-tabs" data-tabs="tabs"> <li class="active"><a href="#services" data-toggle="tab">'.$_ADMINLANG['services']['title'].'</a></li> <li><a href="#domains" data-toggle="tab">'.$_ADMINLANG['domains']['title'].'</a></li> <li><a href="#addons" data-toggle="tab">'.$_ADMINLANG['addons']['productaddons'].'</a></li> </ul> <div class="tab-content" style="padding-top:5px;"> <div class="tab-pane active" id="services"> <table class="table table-condensed" style="font-size:0.9em;"> <tr bgcolor="#efefef" style="text-align:left;font-weight:bold;"> <td>'.$_ADMINLANG['fields']['domain'].'</td> <td>'.$_ADMINLANG['fields']['product'].'</td> <td style="text-align:right;">'.$_ADMINLANG['fields']['nextduedate'].'</td> <td style="text-align:right;">'.$_ADMINLANG['fields']['amount'].'</td> </tr>'; $i=1; $range = "<= ".$numberofdays; $result = mysql_query("SELECT tblhosting.*, tblpaymentgateways.*, tblproducts.name FROM tblhosting INNER JOIN tblpaymentgateways ON tblhosting.paymentmethod = tblpaymentgateways.gateway INNER JOIN tblproducts ON tblhosting.packageid = tblproducts.id WHERE DATEDIFF(tblhosting.nextduedate, NOW()) <= $numberofdays AND tblhosting.domainstatus = 'Active' AND tblpaymentgateways.setting = 'name' ORDER BY tblhosting.nextduedate"); while ($data = @mysql_fetch_array ($result)) { $invoicedate=date($dateformat,strtotime($data['nextduedate'].'-'.$hostinginvdays.' days')); $currency=getCurrency($data['userid']); $content .= ' <tr> <td><a href="clientshosting.php?userid='.$data['userid'].'&id='.$data['id'].'">'.$data['domain'].'</a></td> <td>'.$data['name'].'</td> <td style="text-align:right;">'.fromMySQLDate($data['nextduedate']).'</td> <td style="text-align:right;">'.formatCurrency($data['amount']).'</td> </tr>'; $i=0; } if($i) $content .= ' <tr style="text-align:center;"> <td colspan="4">No Upcoming '.$_ADMINLANG['services']['title'].'</td> </tr>'; $content .= ' </table> </div> <div class="tab-pane" id="domains">'; $content .= ' <table class="table table-condensed" style="font-size:0.9em;"> <tr bgcolor="#efefef" style="text-align:left;font-weight:bold;"> <td>'.$_ADMINLANG['fields']['domain'].'</td> <td style="text-align:right;">'.$_ADMINLANG['fields']['nextduedate'].'</td> <td style="text-align:right;">'.$_ADMINLANG['fields']['expirydate'].'</td> <td style="text-align:right;">'.$_ADMINLANG['fields']['amount'].'</td> </tr>'; $i=1; $range = "<= ".$numberofdays; $result = mysql_query("SELECT tbldomains.*, tblpaymentgateways.* FROM tbldomains INNER JOIN tblpaymentgateways ON tbldomains.paymentmethod = tblpaymentgateways.gateway WHERE DATEDIFF(tbldomains.expirydate, NOW()) <= $numberofdays AND tbldomains.status = 'Active' AND tblpaymentgateways.setting = 'name' ORDER BY tbldomains.expirydate"); while ($data = @mysql_fetch_array ($result)) { $invoicedate=date($dateformat,strtotime($data['nextduedate'].'-'.$domaininvdays.' days')); if ($data['donotrenew']=="1" OR $data['donotrenew']=="on") { $renewdomain = $_ADMINLANG['global']['no']; } else { $renewdomain = $_ADMINLANG['global']['yes']; } $currency=getCurrency($data['userid']); $content .= ' <tr> <td><a href="clientsdomains.php?userid='.$data['userid'].'&id='.$data['id'].'">'.$data['domain'].'</a></td> <td style="text-align:right;">'.fromMySQLDate($data['nextduedate']).'</td> <td style="text-align:right;">'.fromMySQLDate($data['expirydate']).'</td> <td style="text-align:right;">'.formatCurrency($data['recurringamount']).'</td> </tr>'; $i=0; } if($i) $content .= ' <tr style="text-align:center;"> <td colspan="4">No Upcoming '.$_ADMINLANG['domains']['title'].'</td> </tr>'; $content .= ' </table> </div> <div class="tab-pane" id="addons">'; $content .= ' <table class="table table-condensed" style="font-size:0.9em;"> <tr bgcolor="#efefef" style="text-align:left;font-weight:bold;"> <td>'.$_ADMINLANG['fields']['domain'].'</td> <td>'.$_ADMINLANG['fields']['product'].'</td> <td>'.$_ADMINLANG['fields']['addon'].'</td> <td style="text-align:right;">'.$_ADMINLANG['fields']['nextduedate'].'</td> <td style="text-align:right;">'.$_ADMINLANG['fields']['amount'].'</td> </tr>'; $i=1; $range = "<= ".$numberofdays; $result = mysql_query("SELECT tblhostingaddons.*, tblpaymentgateways.*, tblhosting.domain, tblhosting.userid, tblproducts.name as productname, tbladdons.name as addonname FROM tblhostingaddons INNER JOIN tblpaymentgateways ON tblhostingaddons.paymentmethod = tblpaymentgateways.gateway INNER JOIN tbladdons ON tblhostingaddons.addonid = tbladdons.id INNER JOIN tblhosting ON tblhostingaddons.hostingid = tblhosting.id INNER JOIN tblproducts ON tblhosting.packageid = tblproducts.id WHERE DATEDIFF(tblhostingaddons.nextduedate, NOW()) <= $numberofdays AND tblhostingaddons.status = 'Active' AND tblpaymentgateways.setting = 'name' ORDER BY tblhostingaddons.nextduedate"); while ($data = @mysql_fetch_array ($result)) { $invoicedate=date($dateformat,strtotime($data['nextduedate'].'-'.$hostinginvdays.' days')); $content .= ' <tr> <td><a href="clientshosting.php?userid='.$data['userid'].'&id='.$data['hostingid'].'">'.$data['domain'].'</a></td> <td>'.$data['productname'].'</td> <td>'.$data['addonname'].'</td> <td style="text-align:right;">'.fromMySQLDate($data['nextduedate']).'</td> <td style="text-align:right;">'.formatCurrency($data['recurring']).'</td> </tr>'; $i=0; } if($i) $content .= ' <tr style="text-align:center;"> <td colspan="5">No Upcoming '.$_ADMINLANG['addons']['productaddons'].'</td> </tr>'; $content .= ' </table> </div> </div> </div>'; return array('title'=>$title,'content'=>$content); } add_hook("AdminHomeWidgets",1,"widget_upcoming_renewals"); ?> Thanks for the widget
  20. 1 point
    Hi Gazza, here's v1.4 - I think everything is working correctly now. <?php if (!defined("WHMCS")) die("This file cannot be accessed directly"); function widget_upcoming_renewals($vars) { global $_ADMINLANG,$CONFIG,$currency; $title = "Upcoming Renewals"; $numberofdays = '90'; $dateformat = str_replace("y","Y",strtolower(preg_replace("/(.)\\1+/", "$1", $CONFIG["DateFormat"]))); $hostinginvdays = $CONFIG["CreateInvoiceDaysBefore"]; if ($CONFIG["CreateDomainInvoiceDaysBefore"]) { $domaininvdays = $CONFIG["CreateDomainInvoiceDaysBefore"]; } else { $domaininvdays = $CONFIG["CreateInvoiceDaysBefore"]; } $content .= '<h3 align="center">'.$_ADMINLANG['services']['title'].' (Next '.$numberofdays.' Days)</h3> <table bgcolor="#cccccc" align="center" style="margin-bottom:5px;width:100%;font-size:12px;" cellspacing="1"> <tr bgcolor="#efefef" style="text-align:center;font-weight:bold;"><td>'.$_ADMINLANG['fields']['domain'].'</td><td>'.$_ADMINLANG['fields']['product'].'</td><td>'.$_ADMINLANG['fields']['billingcycle'].'</td><td>'.$_ADMINLANG['fields']['nextduedate'].'</td><td>'.$_ADMINLANG['fields']['invoicedate'].'</td><td>'.$_ADMINLANG['fields']['paymentmethod'].'</td><td>'.$_ADMINLANG['fields']['amount'].'</td></tr>'; $i=1; $range = "<= ".$numberofdays; $result = mysql_query("SELECT tblhosting.*, tblpaymentgateways.*, tblproducts.name FROM tblhosting INNER JOIN tblpaymentgateways ON tblhosting.paymentmethod = tblpaymentgateways.gateway INNER JOIN tblproducts ON tblhosting.packageid = tblproducts.id WHERE DATEDIFF(tblhosting.nextduedate, NOW()) <= $numberofdays AND tblhosting.domainstatus = 'Active' AND tblpaymentgateways.setting = 'name' ORDER BY tblhosting.nextduedate"); while ($data = @mysql_fetch_array ($result)) { $invoicedate=date($dateformat,strtotime($data['nextduedate'].'-'.$hostinginvdays.' days')); $content .= '<tr bgcolor="#ffffff" style="text-align:center;"><td><a href="clientshosting.php?userid='.$data['userid'].'&id='.$data['id'].'">'.$data['domain'].'</a></td><td>'.$data['name'].'</td><td>'.$data['billingcycle'].'</td><td>'.fromMySQLDate($data['nextduedate']).'</td><td>'.$invoicedate.'</td><td>'.$data['value'].'</td><td>'.formatCurrency($data['amount']).'</td></tr>'; $i=0; } if($i) $content .= '<tr bgcolor="#ffffff" style="text-align:center;"><td colspan="7">No Upcoming '.$_ADMINLANG['services']['title'].'</td></tr>'; $content .= '</table><br />'; $content = $content .= '<h3 align="center">'.$_ADMINLANG['addons']['productaddons'].' (Next '.$numberofdays.' Days)</h3> <table bgcolor="#cccccc" align="center" style="margin-bottom:5px;width:100%;font-size:12px;" cellspacing="1"> <tr bgcolor="#efefef" style="text-align:center;font-weight:bold;"><td>'.$_ADMINLANG['fields']['domain'].'</td><td>'.$_ADMINLANG['fields']['product'].'</td><td>'.$_ADMINLANG['fields']['addon'].'</td><td>'.$_ADMINLANG['fields']['billingcycle'].'</td><td>'.$_ADMINLANG['fields']['nextduedate'].'</td><td>'.$_ADMINLANG['fields']['invoicedate'].'</td><td>'.$_ADMINLANG['fields']['paymentmethod'].'</td><td>'.$_ADMINLANG['fields']['amount'].'</td></tr>'; $i=1; $range = "<= ".$numberofdays; $result = mysql_query("SELECT tblhostingaddons.*, tblpaymentgateways.*, tblhosting.domain, tblhosting.userid, tblproducts.name as productname, tbladdons.name as addonname FROM tblhostingaddons INNER JOIN tblpaymentgateways ON tblhostingaddons.paymentmethod = tblpaymentgateways.gateway INNER JOIN tbladdons ON tblhostingaddons.addonid = tbladdons.id INNER JOIN tblhosting ON tblhostingaddons.hostingid = tblhosting.id INNER JOIN tblproducts ON tblhosting.packageid = tblproducts.id WHERE DATEDIFF(tblhostingaddons.nextduedate, NOW()) <= $numberofdays AND tblhostingaddons.status = 'Active' AND tblpaymentgateways.setting = 'name' ORDER BY tblhostingaddons.nextduedate"); while ($data = @mysql_fetch_array ($result)) { $invoicedate=date($dateformat,strtotime($data['nextduedate'].'-'.$hostinginvdays.' days')); $content .= '<tr bgcolor="#ffffff" style="text-align:center;"><td><a href="clientshosting.php?userid='.$data['userid'].'&id='.$data['hostingid'].'">'.$data['domain'].'</a></td><td>'.$data['productname'].'</td><td>'.$data['addonname'].'</td><td>'.$data['billingcycle'].'</td><td>'.fromMySQLDate($data['nextduedate']).'</td><td>'.$invoicedate.'</td><td>'.$data['value'].'</td><td>'.formatCurrency($data['recurring']).'</td></tr>'; $i=0; } if($i) $content .= '<tr bgcolor="#ffffff" style="text-align:center;"><td colspan="8">No Upcoming '.$_ADMINLANG['addons']['productaddons'].'</td></tr>'; $content .= '</table><br />'; $content .= '<h3 align="center">'.$_ADMINLANG['domains']['title'].' (Next '.$numberofdays.' Days)</h3> <table bgcolor="#cccccc" align="center" style="margin-bottom:5px;width:100%;font-size:12px;" cellspacing="1"> <tr bgcolor="#efefef" style="text-align:center;font-weight:bold;"><td>'.$_ADMINLANG['fields']['domain'].'</td><td>'.$_ADMINLANG['fields']['registrar'].'</td><td>'.$_ADMINLANG['domains']['years'].'</td><td>'.$_ADMINLANG['fields']['nextduedate'].'</td><td>'.$_ADMINLANG['fields']['expirydate'].'</td><td>'.$_ADMINLANG['fields']['invoicedate'].'</td><td>'.$_ADMINLANG['fields']['paymentmethod'].'</td><td>'.$_ADMINLANG['fields']['amount'].'</td><td>'.$_ADMINLANG['domains']['renew'].'</td></tr>'; $i=1; $range = "<= ".$numberofdays; $result = mysql_query("SELECT tbldomains.*, tblpaymentgateways.* FROM tbldomains INNER JOIN tblpaymentgateways ON tbldomains.paymentmethod = tblpaymentgateways.gateway WHERE DATEDIFF(tbldomains.expirydate, NOW()) <= $numberofdays AND tbldomains.status = 'Active' AND tblpaymentgateways.setting = 'name' ORDER BY tbldomains.expirydate"); while ($data = @mysql_fetch_array ($result)) { $invoicedate=date($dateformat,strtotime($data['nextduedate'].'-'.$domaininvdays.' days')); if ($data['donotrenew']=="1" OR $data['donotrenew']=="on") { $renewdomain = $_ADMINLANG['global']['no']; } else { $renewdomain = $_ADMINLANG['global']['yes']; } $currency=getCurrency($data['userid']); $content .= '<tr bgcolor="#ffffff" style="text-align:center;"><td><a href="clientsdomains.php?userid='.$data['userid'].'&id='.$data['id'].'">'.$data['domain'].'</a></td><td>'.ucwords($data['registrar']).'</td><td>'.$data['registrationperiod'].'</td><td>'.fromMySQLDate($data['nextduedate']).'</td><td>'.fromMySQLDate($data['expirydate']).'</td><td>'.$invoicedate.'</td><td>'.$data['value'].'</td><td>'.formatCurrency($data['recurringamount']).'</td><td>'.$renewdomain.'</td></tr>'; $i=0; } if($i) $content .= '<tr bgcolor="#ffffff" style="text-align:center;"><td colspan="9">No Upcoming '.$_ADMINLANG['domains']['title'].'</td></tr>'; $content .= '</table><br />'; return array('title'=>$title,'content'=>$content); } add_hook("AdminHomeWidgets",1,"widget_upcoming_renewals"); ?>
×

Important Information

By using this site, you agree to our Terms of Use & Guidelines