Jump to content

Recommended Posts

whmcs dismisses the best ideas?

for developers trying to create a better ecosystem for whmcs "they discard the best ideas"

to get into context, some time ago while working with the whmcs API, I noticed that whmcs does not allow including "custom files within /includes/api"

I'll leave a link on what I had to do to achieve it: 

which is absurd if you think about it.

if they allowed to include files (within the api roles) they would allow other developers to join the project and add new functions that WHMCS does not yet have.

now I take it that someone posted the exact same question but it was discarded:  https://requests.whmcs.com/idea/custom-api-support

it is very obnoxious that the WHMCS team does not allow one to create their own api functions.

it is unfortunate that they do not listen to users.

It is unfortunate that the vision of whmcs is not to allow the use of its software as a means of administration, but that we generate our own functions for our projects (in the case of my company, a laravel project).

I wonder if the WHMCS team really listens to users.

I wonder if they ever have ...

I am very disappointed that whmcs does not allow the newly added files to appear in the api folder as shown in these images:

 

api_roles.jpg.69d2c321465dfe7a79d840971bb2256e.jpg

 

get_roles.thumb.png.d7d7dc50cbc4a877e65f315b7f430706.png

 

as you can see from the images, we are unable to assign the role of the new file.

instead I had to modify the table: tblapi_roles within my database directly to manually give the file permissions.

WHMCS DOES NOT LISTEN TO ITS CUSTOMERS, WHMCS IS NOT INTERESTED IN THAT WE DO BETTER PROJECT, NOR THAT THE ECOSYSTEM IS IMPROVED!

If an admin reads this topic, please understand that I am looking for WHMCS to be used more by developers.

Currently we live very limited, the documentation and all the files written in / includes/api lack many features that we developers could include.

We could provide more external functionalities. and we would have the ability to develop our own characteristics.

this would open the doors much more for new customers to join in purchasing whmcs licenses.

In addition to increasing sales of whmcs, it would also allow the possibility of writing our own characteristics, developing new modules that we would publish in the marketplace ecosystem, increasing the number of modules and characteristics that WHMCS currently has.

I hope this topic has relevance to both whmcs and external developers.

my point of view is that if they allow "Role Management" to detect the files included in /includes/api as roles. (similar to how it works when we add modules and plugins that automatically appear in the whmcs module manager). it would open new doors for developers.

I am sure that this functionality could be done with a few lines and in a short time. as a developer I know that this would not take too much work.

I hope they understand me. my english is not very good. 🙂

 

Edited by JesusSuarz

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By JesusSuarz
      I hope someone has knowledge about this ..
      I find very little information about it. I hope someone helps me.
      I am trying to prevent users from being able to change some fields in their profile.
      I found the following function:
      https://developers.whmcs.com/hooks-reference/everything-else/#customfieldsave
      <?php add_hook('CustomFieldSave', 1, function($vars) { return array('value' => 'overridden value',); }); this prevents any field from being editable,
      however, how can I select a specific field?
      img: 

      someone posted an idea in 2019.
      however it doesn't work, because fieldid and relid return NULL from $vars
      any idea?
      I just need to select the fields that I want to prevent from being edited.
       
       
    • By Huseyin Telli
      Hello, I am designing a custom order form for myself in whmcs. I changed the domain name selection part when purchasing hosting. I did as in the attached image. The transfer part is not working. In the transfer part, it performs the domain inquiry part. However, when I click the continue button, the domain configuration page does not appear. In other words, the page where I will enter the transfer code does not open, it transfers it directly to the cart. The domain name I selected for the product does not appear in the cart. I will show them all in the appendices below. If it is a javascript-related problem, if there is javascript code that I need to share, if you let me know in the comments, I will share it. I don't know exactly what is causing the problem. I would be glad if you help. Thanks in advance.. 
       



    • By Abubakar Wahla
      Hi there all!

      Please help me with this issue. I changed the nav bar with my own customized navbar but now its position in mobile screen is like this. can anyone here help me to solve it.

    • By Nguyen Tien Minh
      Hellow everyone,
      1. Currently I want to add a button to reset the client's cPanel in the "action" hook. As I want, when I click on it, a confirmation button will appear, just click on "confirm", the system will automatically run the module "terminate account" then run the module "create account" with the domain name first. there, user and password unlock.
      2. I'd like to find a module or a way for customers to manually change the primary domain name within WHMCS. But I couldn't find it. Can anyone share it with me? I have no money. Hope everybody help please
      3. I see there are some websites that can let customers restart cPanel account (but not the whole server) I still can't understand the principle of it. Does anyone know how to integrate it into WHMCS? Or if anyone knows the reason why, they can share so everyone can learn.
      In short, the above modules and utilities I have not seen anyone ask about them. If anyone can make a module, they can use this idea to code more modules 🙂 But remember to share it with me. I don't have the money so I can't do it, and I'm not a developer so I can't. Please don't scold me. Thank you for everything
    • By Cubeboy
      this is a snippet of my quote/contract script
      it seems to know the recurring but not the onetime, it shows the "unit price" but no the "total price
      I need to have the one time and payments show up in the contract
      the 2 hooks you need to add in
      //term is the call 
      // 1 displays the number of months
      [term: 1]
      [recur:36]
      <?php
      $pdf->Image(ROOTDIR.'/assets/img/rwclogo.png', 63,10,75,'c');
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','B',11);
      $pdf->Cell(175,40,"CONTRACT FOR $subject ONLINE MARKETING SERVICES",25,1,'C');
      $total_onetime = 0;
      $total_recur = array();
      foreach ($lineitems AS $item) {
       
      $description = $item["description"]; 

      # find term 
      $matches = array();
      preg_match('/\[term:(.*?)\]/i', $description, $matches); 
      if (empty($matches)) { 
      $term = ''; 
      }
      else { 
      $term = strtolower(trim($matches[1])); 
      $description = str_replace($matches[0], '', $description); 
      }

      # find recur 
      $matches = array();
      preg_match('/\[recur:(.*?)\]/i', $description, $matches); 
      if (empty($matches)) { 
      $recur = ''; 
      }
      else { 
      $recur = strtolower(trim($matches[1])); 
      $description = trim(str_replace($matches[0], '', $description)); 
      }

      # get unit price and total price 
      $matches = array(); 
      preg_match('/\d+\.\d+/', $item['unitprice'], $matches); 
      $item_unitprice = (float)$matches[0];
      $matches = array(); 
      preg_match('/\d+\.\d+/', $item['total'], $matches); 
      $item_total = (float)$matches[0];
       
      # add onetime and recurring totals
       
      if ($recur == '') { 
      $total_onetime += $item_total; 
      }
      else { 
      if (!array_key_exists($recur, $total_recur)) { 

      $total_recur[$recur] = 0; 
      }

      $total_recur[$recur] += $item_total; 
      }
      }
      $pdf->SetFont('freesans','B',9);
      if ($total_onetime > 0) { 
      }
      foreach (array('monthly', 'quarterly', 'semi-annually', 'annually', 'biennially') as $recur) { 
      if (isset($total_recur[$recur]) && $total_recur[$recur] > 0) { 
      }
      unset($total_recur[$recur]);
      }
      # any remaining recurs
      foreach ($total_recur as $recur => $amount) { 
      }
      #==========================================================================
      # determine weather to show the ONE TIME payment or not
      #if ( $total_onetime < 100 ) {
      #$ot_show = false;
      #} 
      #else {
      #$ot_show = true;
      #}

      #==========================================================================
      # determines weather or not to split the initial payment in half
      #if ( $total_onetime >= 10000 ) {
      #$bulk = $total_onetime / 2;
      #$addtl_payment_msg = 'and the second half of $' .$bulk. ', will be due within 60 days. ';
      #} else {
      #$bulk = $total_onetime;
      #$addtl_payment_msg = '';
      }
      #==========================================================================
      #calculate One time payment using monthly pymts as a varible
      #==========================================================================
      #$otpp = ( $total_recur[$recur] * $recur );
      #$ots = ( $otpp * .1);
      #$ots = round( $ots, 2, PHP_ROUND_HALF_UP );
      #$otp = $otpp - ($otpp * .1);
      #$otp = round( $otp, 2, PHP_ROUND_HALF_UP );
      #==========================================================================
      #calculate One time payment and monthly payment to come up with a total
      #$totalot = ( $total_recur[$recur] * $recur + $bulk );
      #$totalot10 = ( $totalot - $ots );
      #==========================================================================
      $pdf->SetDrawColor(255);
      $pdf->SetFillColor(255);
      $pdf->SetFont('freesans','B',9);
      $pdf->Cell(170,5,"Authorization:",0,0,'L');
      $pdf->SetFont('freesans','',9);
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','',9,C); 
      $pdf->MultiCell(170,5,"
      This document defines the TERMS AND CONDITIONS (T&C) of our working relationship. All projects or services (“the work”) that AGENCY (or “we”) RWC ME 04401 may be contracted to produce or provide for CLIENT ($clientsdetails[companyname]) will be subject to and you the undersigned agree to the following:
      The CLIENT authorizes the AGENCY access CLIENT's current website, webhost, and all digital materials to transfer as needed from the CLIENT for the purposes of completeing the work on the domain $subject. The CLIENT authorizes use of CLIENT's logo and all brand identification in the creation of the website. The CLIENT understands they are entering into a$pdf->Cell $recur month contract with THE AGENCY.    
      The Agency will only begin work after CLIENT’s approval of the project authorization to proceed,(ATP) and the terms and conditions,(T&C) and after receipt of payment of the initial invoice $".$total_onetime.  ". Your signature/execution of the ATP and the T&C will constitute an AGREEMENT between us. 
                                                                                                                       ");
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','B',9);
      $pdf->Cell(170,5,"Description of the work:",0,0,'L');
      $pdf->SetFont('freesans','',9);
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','',9,L); 
      $pdf->MultiCell(170,5,"$notes",0,1,'C');

      if ($proposal) {
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','B',9);
      $pdf->Cell(170,5,"Installment Plan:",0,0,'L');
      $pdf->SetFont('freesans','',9);
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','',9,L); 
      $pdf->MultiCell(170,5,$proposal                  );
      }
      $pdf->AddPage();
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','B',9);
      $pdf->Cell(170,5,"Approvals:",0,0,'L');
      $pdf->SetFont('freesans','',9);
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','',9,L); 
      $pdf->MultiCell(170,5,"
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','B',9);
      $pdf->Cell(170,5,"Additions and Alterations:",0,0,'L');
      $pdf->SetFont('freesans','',9);
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','',9,C); 
      $pdf->MultiCell(170,5,"                              ");
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','B',9);
      $pdf->Cell(170,5,"Payments:",0,0,'L');
      $pdf->SetFont('freesans','',9);
      $pdf->MultiCell(170,5,"");
      $pdf->SetFont('freesans','',9,L); 
      $pdf->MultiCell(170,5,"The AGENCY is providing Online Marketing Services in advance of total payment. The CLIENT will have an initial down payment of $" . $bulk . ". that is due at the signing of this contract, " .$addtl_payment_msg. "Then an ongoing payment of $pdf->Cell $$total_recur[$recur], on a monthly basis for the following$pdf->Cell $recur months, starting from the date of signing this agreement.                                " );
      $pdf->MultiCell(170,5,"");
      $pdf->AddPage();
      $pdf->Image(ROOTDIR.'/assets/img/rwclogo.png', 63,10,75,'c');
      $pdf->SetFont('freesans','B',11);
      $pdf->Ln();

      $pdf->SetFont('freesans','B',9);
      $pdf->Ln();
      $pdf->SetFont('freesans','',9);
      $pdf->MultiCell(39,5,"");
      $pdf->Ln();
      $pdf->SetFont('freesans','B',9);
      $pdf->SetDrawColor(200);
      $pdf->SetFillColor(239);
      $pdf->SetFont('freesans','',9);
      $pdf->Cell(10,6,"Qty",1,0,'C','1');
      $pdf->Cell(80,6,"Description",1,0,'C','1');
      $pdf->Cell(20,6,"Recur",1,0,'C','1');
      $pdf->Cell(20,6,"Term",1,0,'C','1');
      $pdf->Cell(20,6,"Unit Price",1,0,'C','1');
      $pdf->Cell(20,6,"Total",1,0,'C','1');
      $pdf->Ln();
      $pdf->SetFont('freesans','B',9);
      $total_onetime = 0;
      $total_recur = array();
      foreach ($lineitems AS $item) {
       
      $description = $item["description"]; 
      #==========================================================================
      # find term 
      #==========================================================================
      $matches = array();
      preg_match('/\[term:(.*?)\]/i', $description, $matches); 
      if (empty($matches)) { 
      $term = ''; 
      }
      else { 
      $term = strtolower(trim($matches[1])); 
      $description = str_replace($matches[0], '', $description); 
      }
      #==========================================================================
      # find recur 
      #==========================================================================
      $matches = array();
      preg_match('/\[recur:(.*?)\]/i', $description, $matches); 
      if (empty($matches)) { 
      $recur = ''; 
      }
      else { 
      $recur = strtolower(trim($matches[1])); 
      $description = trim(str_replace($matches[0], '', $description)); 
      }
      #==========================================================================
      # get unit price and total price 
      #==========================================================================
      $matches = array(); 
      preg_match('/\d+\.\d+/', $item['unitprice'], $matches); 
      $item_unitprice = (float)$matches[0];
      $matches = array(); 
      preg_match('/\d+\.\d+/', $item['total'], $matches); 
      $item_total = (float)$matches[0];
      #==========================================================================
      # add onetime and recurring totals
      #========================================================================== 
      if ($recur == '') { 
      $total_onetime += $item_total; 
      }
      else { 
      if (!array_key_exists($recur, $total_recur)) { 

      $total_recur[$recur] = 0; 
      }

      $total_recur[$recur] += $item_total; 
      }
      #==========================================================================
      # display line items
      #==========================================================================
      $numlines = ceil(strlen($description)/55); 
      $cellheight = $numlines * 8;
      $pdf->MultiCell(10,$cellheight,$item["qty"],1,'C','',0);
      $pdf->MultiCell(80,$cellheight,$description,1,'L','',0);
      $pdf->MultiCell(20,$cellheight,$recur,'1','C','',0);
      $pdf->MultiCell(20,$cellheight,$term,'1','C','',0);
      $pdf->MultiCell(20,$cellheight,sprintf('$%.2f',$item_unitprice),1,'C','',0);
      $pdf->MultiCell(20,$cellheight,sprintf('$%.2f',$item_total),1,'C','',1);
      }
      $pdf->SetFont('freesans','B',9);
      /*
      $pdf->Cell(145,6,"Subtotal",1,0,'R','1');
      $pdf->Cell(25,6,$currencysymbol.$subtotal,1,0,'C','1');
      $pdf->Ln();
      if ($taxlevel1["rate"]>0) {
          $pdf->Cell(145,6,$taxlevel1["name"]." @ ".$taxlevel1["rate"]."%",1,0,'R','1');
          $pdf->Cell(25,6,$currencysymbol.$tax1,1,0,'C','1');
          $pdf->Ln();
      }
      if ($taxlevel2["rate"]>0) {
          $pdf->Cell(145,6,$taxlevel2["name"]." @ ".$taxlevel2["rate"]."%",1,0,'R','1');
          $pdf->Cell(25,6,$currencysymbol.$tax2,1,0,'C','1');
          $pdf->Ln();
      }
      $pdf->Cell(145,6,"Total",1,0,'R','1');
      $pdf->Cell(25,6,$currencysymbol.$total,1,0,'C','1');
      $pdf->Ln();
      */
      if ($total_onetime > 0) { 
      $pdf->Cell(150,6,'Pre-Pay',1,0,'R',1);
      $pdf->Cell(20,6,sprintf('$%.2f',$total_onetime),1,0,'C',1);
      $pdf->Ln();
      }
      foreach (array('monthly', 'quarterly', 'semi-annually', 'annually', 'biennially') as $recur) { 
      if (isset($total_recur[$recur]) && $total_recur[$recur] > 0) { 
      $pdf->Cell(150,6,ucfirst($recur) . ' Monthly Payments',1,0,'R',1);

      $pdf->Cell(20,6,sprintf('$%.2f',$total_recur[$recur]),1,0,'C',1);

      $pdf->Ln();
      }
      unset($total_recur[$recur]);
      }
      #==========================================================================
      # any remaining recurs
      #==========================================================================
      foreach ($total_recur as $recur => $amount) { 
      $pdf->Cell(150,6,ucfirst($recur) . ' Monthly Payments',1,0,'R',1); 
      $pdf->Cell(20,6,sprintf('$%.2f',$amount),1,0,'C',1);
      $pdf->Ln();
      }

      $pdf->SetFont('freesans','',9,l);
      $pdf->MultiCell(170,5,"
       
       
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • 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