Jump to content


  • Content Count

  • Joined

  • Last visited

  • Days Won


Everything posted by Kian

  1. Not all developers implement _deactivate() function that's why you end up with unused tables in database. Of course you can delete all tables prefixed with crm_ but be advised that there's a chance this triggers fatal errors somewhere. It depends on how the module was coded. For example if for some crazy reason the module uses an action hook outside its folder (includes/hooks) and the hook performs a query on a deleted table... Oops something went wrong. Or again if the module needed some file to be included in configuration.php it will probably cause troubles. Simply put, delete all these tables but make sure that front & backend still load correctly.
  2. You better read this before making changes. In essence WHMCS doesn't keep historical currency rates and as we know rates fluctuate on a daily basis. On the invoice you must print the rate in effect on the date on which the invoice is issued. You can't do the math on the fly otherwise your numbers on invoices will fluctuate causing more than one billing error. In fact the same invoice will give different exchange rates depending on when customers download/view it. There are third-party modules that bla bla bla... good luck.
  3. Of course and it is actually really easy. Years ago I had a WHMCS page that was showing on Google Maps the location/address of all the authorized resellers of a provider (it was taking data from a specific client group). Openstreet is pretty much the same.
  4. On one hand numbers don't change but on the other you are left with no information about what rates were used for conversions. From a billing perspective this is a big issue since every accountant needs exchange rates. WHMCS doesn't give this information so in your example your accountant needs to manually retreive EUR/USD rate based on invoice date. The problem is that not only this is a boring process but also doesn't work properly due to currency fluctuations. The thing is that your accoutant should be using your conversion rates (the one set in WHMCS). Same goes for your own customers. They should know what currency rate you are using on their invoices. There are modules that allows to keep track of historical currency rates but that's a story for another time.
  5. That's the plan. The day I get rid of WHMCS and stop supporting all the nonsense I'll open source that. The only two problems are: I need to find a way to ensure that some unethical competitors don't steal the code for scammy stuff or to damage me. I have already experienced it multiple times for things ranging from SEO to my own blog and code I posted for free on Github. Shameless people. They stole my stuff, tried to take me down on Google and few weeks ago they even had the nerve to ask me to link to their website with rel="follow" so that I can pass my SEO juice to them 🤯 It's like the man who stole your car comes back to ask if you can pay for the annual vehicle inspection I'm not proud of my code in BX. The code is stupidly convoluted but that's not my fault. This is what happens when you work with the many bugs and silly things of WHMCS. It's like trying to tune an F1 car for Monaco GP and find out that it will be driven in a rally competition followed by drag race and moto GP 🤦‍♂️ The module is a cluster**** of super-long if() and hacks needed to prevent WHMCS from doing stupid things. I don't see how someone can understand/change it. I have troubles myself and every update of WHMCS forces you to play the russian roulette 😨🔫 I don't think so. How can you do that when WHMCS purposely issues invoices that make absolutely no sense? I mean, it even asks customers to pay wrong amounts. Of course you can find ways to fix such problems externally but the thing is that there will be a disrepancy between what you're recording and the reality. Fines and troubles are just around the corner.
  6. Probably a typo. Check console for js errors.
  7. Every multi-brand is not the same so the right one for you depends on what you're trying to do. Pure cosmetic? SEO? Domain-based restrictions? Invoice from multiple business numbers?
  8. You can find all information about electronic invoicing & WHMCS here. I understand that it's a 10000-words article but there's everything you need to know. There are no alternatives and will never be since the profit / complexity ratio is hugely unbalanced. As brian said, I'm no longer in the mood to work this hard on this platform. I'm focusing on a small group of customers and working on new projects not connected to WHMCS. If you have any question, probably this is the best place to ask 😅
  9. Just in case, here's the link to Price Discrimination section from europa.eu. I don't think so. That's not about server location but you being an EU-based company. Anyway I suppose there's a workaround. As long as you respect Automatic redirection on a website, you can have multiple "versions" of your website with different pricing. You should do like OVH. As an Italian citizen I can freely purchase anything I want from ovh.fr, ovh.de, ovh.it etc. Let's take a look at VPS. The same VPS costs: 5.47 € in Germany 4.60 € in Italy, Netherlands and Portugal 5.52 $ (4.52 euro) in Spain - I have no idea why they use USD in Spain 🤔 In essence you can have different prices for each country but you can't force people to use this or that website (or pricing structure) based on their location.
  10. Do you know when they made this change? I'm curious.
  11. Let me quote something I wrote somewhere else. If you are from Europe... Only very few people are aware of these rules. For sure big companies like GoDaddy and Amazon know that. That's why they operate using multiple websites. As for your other question about how to do that in WHMCS, I confirm you that it is possible but I won't share any details. Nothing against you 🙂
  12. It is a "feature" of WHMCS that causes billing errors. It can't be disabled and there's no workaround. According to WHMCS having empty invoices or ones with wrong amounts is an elegant solution to avoid another problem (I won't explain it). The funny thing is that this crazyness doesn't even anything. The problem they were trying to address with this solution still occurs.
  13. As a quick solution you could hide that line from viewinvoice.tpl and invoicepdf.tpl based on description (or tblinvoiceitems.relid and tblinvoiceitems.type if possible). Probably you should also spread the cost of this line (your 5%) over all other existing items. It's simple math. When foreach() invoice items sum its value to your markup / (number of invoice items - 1).
  14. Tax comes from WHMCS default settings on page load. You can't change that by switching country. You have different options. First. You could .click with jQuery the button that updates estimated tax. You will also need to display:none page body before .click fires to avoid visitors seeing the page loading twice. Second. Override tax name, rate and value in Smarty with ClientAreaPage action hook. You need to retrieve such values manually from database based on your brand. It's pretty boring. Third. This is a bit of overkill but you could replace default estimated tax logic with your custom one. It's super boring and depressing.
  15. With a bit of jQuery magic you can teleport Google Analytics <li> inside a new div with col12, 0 auto whatever it takes to get the job done.
  16. Many still didn't learn the lesson. WebPros can easily acquire every software they think is worth their money. They can literally buy DirectAdmin, Blesta, HostBill or any other software in no time since they're super cheap compared to cPanel, Plesk, WHMCS and SolusVM. They took Plesk. We all moved to cPanel. They took cPanel we moved to DirectAdmin. As soon as DirectAdmin becomes relevant in this industry, it will be a really good snacks to buy. Same goes for people moving from WHMCS to any other panel that comes to mind. No matter what the owner of this or that panel promise you today. People can easily change their mind with money. This "hide and seek" strategy is just stupid and impractical unless you are a small provider willing to invest your time migrating from A to B every three or four years. Large and medium-sized enterprise can't afford this silly game. Not to mention that every time you move from A to B you're basically leaving a better software for a worse one. It doesn't make any sense. As I said in other places, the only way to fight this kind of capitalism and so WebPros, is going for open source and free softwares (GPL license). End of the story. There's no other escape. p.s. In past I've been accused by someone of self-promoting myself just because I happened to have solutions or answers for problems like this one. Unfortunately some people are unable to percieve me as a person but as someone that comes here trying to sell his stuff. I really don't care about selling anything to the point that I removed ads from signature, stopped to bump posts of commercial modules and listings on marketplace as I'm economically independent from WHMCS world. I really hope that this time I won't hurt any feeling for expressing my opinion. They're just words. Remember lifetime? What about unlimited disk space and bandwidth? Or things like "290 EUR / Lifetime"? And anyway any company can be acquired including privately owned. Let's see what this Paul has to say when WebPros comes with a briefcase full of euro and can sit down and relax for the rest of his life.
  17. If that commercial module is mine, that's my fault. I used a chdir() in the wrong place so Smarty thinks that the root is /lang instead of /. Re-download and replace all files. This should fix the problem. Sorry.
  18. You could use two not very stylish workarounds. Override the entire class="" attribute with jQuery (onLoad) so that it always has the right col and col-sm For this specific div override the default col-4 width of Bootstrap so that it's 50% instead of 33.33% via CSS. You chould use !important or a longer selector (longer selector "beats" shorter one)
  19. You should be tuning viewport (the col-sm, col-md, col-lh, col-xl attributes). Croster probably uses col-sm (≥576px) so you should replace: col-{SOMETHING} col-sm-{SOMETHINGELSE} With this: col-6 col-sm-6
  20. Keep in mind that upgrade/downgrade functionality is bugged since always. When the change involves credit, WHMCS uses different formulas to calculate the expected cost and the effective one in the resulting invoice. In short, it says to the customer that he has to pay X. When he confirms, the invoice wants him to pay X + Y instead 😕
  21. I always forgot to include the zip with images. https://github.com/Katamaze/WHMCS-Free-Action-Hooks/files/5320899/katamaze_autologin.zip
  22. The reason why it loads slowly is that ClientAreaPage triggers when WHMCS has already initialized most classes and functions. That's why for example the $vars is not empty and can be used in the hook. In essence when you use header location inside ClientAreaPage, you are effectively loading two pages at once. The one where the user lands and the target of your redirect. You don't notice the first load just because there's no output but WHMCS has already autoloaded a ton of classes. With .htaccess you avoid the redirect bottleneck.
  23. As stated here... $emailTemplates = array('... cut..'); // Email Templates to block (General Messages) ... by default the hook in question works only with General Messages. If you want to prevent other types of emails, you'll need to change the query accordingly. You can use as reference sendEmail API. I quote:
  24. It's just a naming collision. Rename locales_hook with something else like in the following example. <?php # Language Abbreviations Hook # Written by brian! function brianIsSexy($vars) { $mylocal = $vars['locales']; $activelocale = $vars['activeLocale']; foreach ($mylocal as $key => $value) { if ($mylocal[$key]["localisedName"] == "english") { $mylocal[$key]["localisedName"] = "EN"; } else { $mylocal[$key]["localisedName"] = strtoupper($mylocal[$key]["countryCode"]); } } if ($activelocale["language"] == "english") { $activelocale["localisedName"] = "EN"; } else { $activelocale["localisedName"] = strtoupper($activelocale["countryCode"]); } return array("locales" => $mylocal, "activeLocale" => $activelocale); } add_hook("ClientAreaPage", 1, "brianIsSexy"); Or use the "short syntax". <?php # Language Abbreviations Hook # Written by brian! add_hook('ClientAreaPage', 1, function($vars) { $mylocal = $vars['locales']; $activelocale = $vars['activeLocale']; foreach ($mylocal as $key => $value) { if ($mylocal[$key]["localisedName"] == "english") { $mylocal[$key]["localisedName"] = "EN"; } else { $mylocal[$key]["localisedName"] = strtoupper($mylocal[$key]["countryCode"]); } } if ($activelocale["language"] == "english") { $activelocale["localisedName"] = "EN"; } else { $activelocale["localisedName"] = strtoupper($activelocale["countryCode"]); } return array("locales" => $mylocal, "activeLocale" => $activelocale); });
  • 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