
quel
Retired Forum Member-
Posts
17 -
Joined
-
Last visited
Content Type
Profiles
Forums
Events
Hotfixes
Everything posted by quel
-
VAT Update is a free WHMCS addon module that helps changing the VAT tax rules for the new 2015 EU VAT legislation VAT tax Data is obtained online from VIES so that it is always up to date The module will change the Tax Rates in the WHMCS tax configuration for you. It is possible to review these rules in the standard WHMCS Tax Rules page As well, VATUpdate gives the option to update prices of client's products so that the VAT difference is assumed as a cost/benefit to the company and the client keeps paying the same amount each month. This is specially handy in the case of subscriptions where having the client changing the paypal subscription may not be worth or more difficult than assuming the price differences
-
http://www.bricosoftware.com/clients/cart.php?a=add&pid=17 This free addon can send via email, in PDF format, an existing WHMCS report. And additionally it allows scheduling of existing WHMCS reports, so that they are emailed to you or any customer in a daily, weekly or monthly schedule. http://www.bricosoftware.com/clients/cart.php?a=add&pid=17
-
Speak With an allVPS Representative (Available 24/7) What is allVPS? allVPS is a WHMCS integrated virtualization system. Our app manages, creates, suspends, and even terminates (when needed) virtual private servers that you create on your node. Clients can also manage their virtual private server right in their client area. Administrators can also manage the virtual private servers using the WHMCS admin control panel. Why allVPS? allVPS is a high quality virtualization setup and management where both you and your client can manage their VPS right in WHMCS! Not just is our software better than competitors, it is also cheaper than theirs too! What features does allVPS have? allVPS has many features, it would be impossible to list them all. However, we have bulleted some of the main features. If you are looking for a specific feature, feel free to use the above link to speak with an allVPS representitive. CLICK HERE to view the main feature list. Want to test allVPS? allVPS Free Edidition 5 VPSs Maximum $0.00 per month! (FREE) Click here to order! allVPS 25 25 VPSs Maximum $4.00 per month! Click here to order! allVPS 100 100 VPSs Maximum $8.00 per month! Click here to order! allVPS Unlimited Unlimited VPSs Maximum $18.00 per month! Click here to order!
-
No, it does not track usage automatically, but it could be a good thing to add. I guess that you suggest that when one IP is ordered, the package marks it as 'in use'. Right? But I do wonder how one ip is or could be ordered. If you have any ideas, feel free to contact me. It can be a nice addition Regards Quel
-
rsanders Use it at your own will. It is worm free, but obviously you can believe it or simply not use it. However, I would appreciate that you do not bash the script or the coder (that is, me) just because I decided to encode it. I plan to issue more modules, this one is just free because it is simple and of low interest. Take it as a test, but all of them will be encrypted and some paid. Regards Quel
-
Hi I have created a new IP Manager. I needed some way to track which IPs where assigned to whom accross servers so that when the user cancelled I would be able to re-use them. So I did start from scratch and here is the result. If someone finds it useful, feel free to post here. I would love to know it is worth to somebody! Download Ip Manager Install: Just uncompress and upload in whmcs/modules/admin/ip_manager. Go to the WHMCS admin area and click on Utilities, Addon-Modules. You should see the new module. Just click and it will auto-create the database table to hold the IPs information /whmcs/modules/admin Quel
-
You can use this. function myVATNumber($myclientemail){ //$myclientemail can contain the user id or the user email; global $db_name,$db_host, $db_username,$db_password; $myVAT = ""; if(!$myclientemail) return ""; $link = mysql_connect($db_host, $db_username,$db_password) or die('Could not connect: ' . mysql_error()); mysql_select_db($db_name, $link) or die('Could not select database.'); $sql="SELECT B.value from tblclients A, tblcustomfieldsvalues B WHERE B.fieldid=14 and B.relid=A.id and (A.email='$myclientemail' or A.id='$myclientemail')"; $result = mysql_query($sql) or die('Invalid query: ' . mysql_error()); if(mysql_num_rows($result)>0) { $row = mysql_fetch_array($result); if(strlen($row['value'])>0) $myVAT = $row['value']; } mysql_close($link); return $myVAT; } NOTE: the field 14 is my custom one for VAT. in your whmcs that may change, so look at the id where VAT is stored using phpmyadmin and change the number to whatever is ok (B.fieldid=14 <-- this number) Inside the file pdfconfig.php you can just put this function on the top, then add: if($clientsdetails['email']=='') $m=$clientsdetails['id']; else $m=$clientsdetails['email']; //get the VAT from this customer $myVATNumber=myVATNumber($m); Finally, do substitute the clients details for the code: # Clients Details $pdf->Cell(0,4,$_LANG["invoicesinvoicedto"],0,1); $pdf->SetFont('Arial','',; if ($clientsdetails["companyname"]) { $pdf->Cell(0,4,$clientsdetails["companyname"],0,1,'L'); $pdf->Cell(0,4,$_LANG["invoicesattn"].": ".$clientsdetails["firstname"]." ".$clientsdetails["lastname"],0,1,'L'); } e$ $pdf->Cell(0,4,$clientsdetails["firstname"]." ".$clientsdetails["lastname"],0,1,'L'); } $pdf->SetFont('Arial','',; $pdf->Cell(0,4,$clientsdetails["address1"],0,1,'L'); if ($clientsdetails["address2"]) { $pdf->Cell(0,4,$clientsdetails["address2"],0,1,'L'); } $pdf->Cell(0,4,$clientsdetails["city"].", ".$clientsdetails["state"].", ".$clientsdetails["postcode"],0,1,'L'); $pdf->Cell(0,4,$clientsdetails["country"],0,1,'L'); $pdf->Cell(0,4,"VAT/CIF:".$myVATNumber,0,1,'L'); $pdf->Ln(11); Enjoy. Matt, now that you have done the proforma invoice for EU companies (chapeau on that. TX A LOT. You're the 1rst US guy that cares to understand the difficulties we have at the other side of the lake), maybe you could add the VAT number as a default entry, since this is as well required. With VAT number on it, the pdf file could be used directly as invoice to the customer. Q
-
Hi Nick, I do not think saving will be a problem, since saving is done under the folder owner's name. Which it is likely to have rights to do so. Anyway, the add sign in front it won't return any error and hence have no effect. I do have another addition. I have added one Tab to your script to show a complete list of files that are under the WHMCS folder but not included into the test. That will report addons or any files that do not come with the standard installation (I have excluded templates_c, ioncube and attachments folders from the scan). To my surprise, there is a bunch of language files in the Admin/editor, and into the templates, that are not considered into the checksums file. Or some like the admin/config.php one (which, I did verify, it does not come with 3.5.1 release). A sample listing below: I do wonder what does it mean? Where those files delivered on past versions of WHMCS and now Matt has taken them out? Are they needed anymore? If you want to test that modification, I have left the full files here: http://www.comforthost.net/billing/modules/admin/WHMCS_checksums.tar.gz Please let me know on what you think about the files list. Oh... and you will need php5. Regards Q
-
I whish I had paid more attention to this forum long ago. Today I'm getting tons of improvements to WHMCS!! This is a great addition. I just want to thank you for it. I want to suggest one modification: on line 27th of the file WHMCS_checksums.php, add the line @file_put_contents ( "../" . $expfname , $sums ); That will make the script save the file for future requests and avoid unneeded downloads the second time someone visits the addon. For sure your server will appreciate it! Note that I have used a php5 function. But since php4 its going to be deprecated soon... Q
-
I did forget. for the lazy guys, here's the link to the txt version. http://www.comforthost.net/billing/modules/reports/server_revenue_forecasts.txt
-
Hi, I have changed this report a little bit, such as it reflects as well income for dedicated/VPS hosting, while before it reflected only shared hosting income. To properly report dedicated and VPS expenses, I have entered every dedicated server into the Configuration, Manage Servers list (as a Dedicated server group). The report expects that the IP of the server will be the IP assigned to that user, and then matches income and expenses. <?php // Server revenue Forecast v0.2 - 2007-12-21 Quel: Added Dedicated and VPS revenue // Server revenue Forecast v0.2 - 2007-12-22 Quel: Added Dedicated and VPS expenses by matching the ip on the user's Dedicated hosting package and the IP of the server into the Manage Servers configuration. //Questions: please ask them onto the whmcs forum. $reportdata["title"] = "Server Revenue Forecasts"; $reportdata["description"] = "This report shows income broken down into each payment term period for each of your servers. It then uses the monthly cost entered for each server to calculate the gross profit."; $reportdata["tableheadings"] = array("Server Income","Monthly","Quarterly","Semi-Annual","Annual","Biennial","Monthly Costs","Annual Gross Profit"); $query = "SELECT * FROM tblservers ORDER BY name ASC"; $result=mysql_query($query); while ($data = mysql_fetch_array($result)) { $id = $data["id"]; $name = $data["name"]; $monthlycost = $data["monthlycost"]; $monthly = 0; $quarterly = 0; $semiannually = 0; $annually = 0; $biennially = 0; if( $data["ipaddress"]=='') $dedicated=""; else $dedicated=" OR dedicatedip='". $data["ipaddress"]."' "; $query2 = "SELECT * FROM tblhosting WHERE (server='$id' $dedicated) AND domainstatus='Active' AND billingcycle!='Free Account' AND billingcycle!='One Time'"; $result2=mysql_query($query2); while($data = mysql_fetch_array($result2)){ $amount = $data["amount"]; $billingcycle = $data["billingcycle"]; if($billingcycle=="Monthly"){ $monthly+=$amount; }elseif($billingcycle=="Quarterly"){ $quarterly+=$amount; }elseif($billingcycle=="Semi-Annually"){ $semiannually+=$amount; }elseif($billingcycle=="Annually"){ $annually+=$amount; }elseif($billingcycle=="Biennially"){ $biennially+=$amount; } } $monthly=number_format($monthly,2,".",""); $quarterly=number_format($quarterly,2,".",""); $semiannually=number_format($semiannually,2,".",""); $annually=number_format($annually,2,".",""); $biennially=number_format($biennially,2,".",""); $totalserverincome=($monthly*12)+($quarterly*4)+($semiannually*2)+$annually+($biennially/2); $totalserverexpenditure=$monthlycost*12; $servertotal=number_format(($totalserverincome-$totalserverexpenditure),2,".",""); $totalincome+=$totalserverincome; $totalexpenditure+=$totalserverexpenditure; $totalgrossprofit+=$servertotal; $reportdata["tablevalues"][] = array("$name",$CONFIG["CurrencySymbol"]."$monthly",$CONFIG["CurrencySymbol"]."$quarterly",$CONFIG["CurrencySymbol"]."$semiannually",$CONFIG["CurrencySymbol"]."$annually",$CONFIG["CurrencySymbol"]."$biennially",$CONFIG["CurrencySymbol"]."$monthlycost",$CONFIG["CurrencySymbol"]."$servertotal"); } $totalincome=sprintf("%01.2f",$totalincome); $totalexpenditure=sprintf("%01.2f",$totalexpenditure); $totalgrossprofit=sprintf("%01.2f",$totalgrossprofit); $data["footertext"]="<B>Total Income:</B> ".$CONFIG["CurrencySymbol"]."$totalincome<br><B>Total Expenses:</B> ".$CONFIG["CurrencySymbol"]."$totalexpenditure</br><B>Gross Profit:</B> ".$CONFIG["CurrencySymbol"]."$totalgrossprofit"; ?> Enjoy Q
-
Hi It is a nice one. It is really good since we detected one account where billing was stopped because the due date was in the past. I have taken the liberty to modify it a bit to enhance it and add a monthly detail with links. I think this makes the report very useful in order to analyze future income. If you are lazy copying it, I have left a txt version here (wget it and change the file extension back to php) http://www.comforthost.net/billing/modules/reports/Hosting_Forecast_monthly.txt <?php // Monthly Income Forecast v0.1 - Developed by sgpaul -- 2007-12-26 // Monthly Income Forecast v0.1 - 2007-12-29 Quel: corrected a couple of bugs. changed aggregation=on by default // Monthly Income Forecast v0.2 - 2007-12-30 Quel: added monthly detail $months = array('', 'January','February','March','April','May','June','July','August','September','October','November','December'); if ($year=="") { $year=date("Y"); } if ( !isset( $aggregate) ) $aggregate = true; $reportdata["title"] = "Monthly Income Forecast for ".$year; $reportdata["description"] = "This report shows forecast income for all year by month"; $reportdata["tableheadings"] = array("Month", "Renewals","Monthly","Annual","Biennially", "Other", "Total"); $grandtotal = 0; $total_renewals = 0; $monthly = 0; for ( $month = 1; $month <= 12; $month ++ ) { $sql = 'select id,userid, domain,amount, billingcycle, nextduedate from tblhosting where domainstatus="active" and nextduedate LIKE "'.$year.'-'.str_pad($month,2,"0",STR_PAD_LEFT).'-%"'; $result = mysql_query($sql); $renewals = mysql_num_rows( $result ) ; if ( ! $aggregate ) $monthly = 0; $annually = 0; $biennually = 0; $other = 0; $total = 0; if($openmonth==$month){ $reportdata["tablevalues"][] = array('','', '', '', '', '', ''); } while ( $data = mysql_fetch_assoc( $result ) ) { $thisdomainMonthly=0; $thisdomainAnnually=0; $thisdomainBiannually=0; $thisdomainOther=0; switch( $data['billingcycle'] ) { case 'Monthly': $monthly += $data['amount']; $thisdomainMonthly=$data['amount']; break; case 'Annually': $annually += $data['amount'];$thisdomainAnnually=$data['amount']; break; case 'Biennially': $biennually += $data['amount'];$thisdomainBiannually=$data['amount']; break; default: $other += $data['amount'];$thisdomainOther=$data['amount']; break; } if($openmonth==$month){ $reportdata["tablevalues"][] = array($months[ $month ], "<a href=".substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))."/clientshosting.php?userid=".$data['userid']."&hostingid=".$data['id'].">".$data['domain'].'</a>', number_format($thisdomainMonthly,2), number_format($thisdomainAnnually,2), number_format($thisdomainBiannually,2), number_format($thisdomainOther,2), ''); } } $total += $monthly + $annually + $biennually + $other; $grandtotal += $total; $total_renewals += $renewals; if($openmonth==$month){ $reportdata["tablevalues"][] = array('','', '', '', '', '', ''); } $reportdata["tablevalues"][] = array("<b>".$months[ $month ]."</b>", "<a href=$PHP_SELF?report=$report&aggregate=$aggregate&year=$year&openmonth=".$month .">".number_format($renewals,0).'</a>', number_format($monthly,2), number_format($annually,2), number_format($biennually,2), number_format($other,2), number_format($total,2)); } //<--end of while $reportdata["headertext"] = "Total Renewals: $total_renewals"; $reportdata["headertext"] .= "<br><a href=\"$PHP_SELF?report=$report&year=$year&aggregate=".( ! $aggregate)."\">Toggle monthly aggregation</a>"; if($openmonth>0){ $reportdata["headertext"] .= " <a href=\"$PHP_SELF?report=$report&year=$year&aggregate=".( ! $aggregate)."&openmonth=0\">Close Monthly detail</a>"; } $data['footertext'] = "<p style=\"text-align:center\"><span style=\"font-size:2em; margin:10px auto; font-weight:bold;\">Total: ".$CONFIG["CurrencySymbol"].number_format( $grandtotal, 2 )."</span> "; $data['footertext'] .= " </p>"; $data["footertext"].="<table width=90% align=center><tr><td>"; $data["footertext"].="<a href=\"$PHP_SELF?report=$report&aggregate=$aggregate&year=".($year-1)."\"><< ".($year-1)."</a>"; $data["footertext"].="</td><td align=right>"; $data["footertext"].="<a href=\"$PHP_SELF?report=$report&aggregate=$aggregate&year=".($year+1)."\"> ".($year+1)." >></a>"; $data["footertext"].="</td></tr></table>"; ?>