Jump to content

NETLINK

Members
  • Posts

    125
  • Joined

  • Last visited

  • Days Won

    7

Reputation Activity

  1. Like
    NETLINK got a reaction from activa in Client Billing Statement   
    I'm almost done integrating this with the client dashboard. I have it working right now, I just need to clean up the code and push it to the Git repo. Should have that done tonight. Then, you can give it a test drive.
  2. Like
    NETLINK reacted to Blesta Addons in Reload Plugin / Refresh Code   
    just increase the version number . 
     
    the upgrade proccess for plugin always remove from database all events/task/navigation and add the new ones in plugin file  .
  3. Like
    NETLINK reacted to activa in Reload Plugin / Refresh Code   
    i think navigation , events, task need the upgrade process to see the change .
     
    we have the same issue, and naja7host has send me a tips to avoid this , just increment the plugin version , then upgrade the plugin from manager , you will see the change .
  4. Like
    NETLINK got a reaction from Michael in Client Billing Statement   
    Yeah, I'll work on it when I get a moment. I can probably hook it into the client interface. The mail template will take longer, I think. For me, personally, the mail thing is more important because most of my clients never log in to Blesta. They get their invoices via email and then either pay by credit car or cheque. But I'll see what I can do about hooking the statement into the client menu. I don't think it should take too long to do that.
  5. Like
    NETLINK got a reaction from Michael in Client Billing Statement   
    Okay, guys. Here we go...
    https://github.com/NETLINK/BlestaClientStatements
     
    I've tested it a bit and it seems to be working well. Right now, it's a standalone script. Would just have to figure out how to create the access key and maybe create an email template with the link and access hash included.
     
    It's an MD5 hash made up of:
    [ClientID][ClientFirstName ClientLastName (ClientCompany)][ClientEmailAddress][salt]
    Line 48: $md5 = md5( $d['id'] . $d['client'] . $d['email'] . $salt ); But obviously, it would be a lot better to have it integrated with Blesta, like a plugin, as Naja suggested. Looking forward to thoughts/ideas.
  6. Like
    NETLINK reacted to Blesta Addons in Client Billing Statement   
    or maybe we can all make it as a plugin
  7. Like
    NETLINK reacted to Michael in Client Billing Statement   
    Wow looks a mobile statement +1
  8. Like
    NETLINK got a reaction from PauloV in Client Billing Statement   
    A few years ago, WHMCS didn't have client statements. Not sure if it does now. So I wrote this code and uploaded it to one of my servers. It's a set of custom mysql queries to calculate the amount owed, amount paid and amount of credits. Kind of like a simple bank statement - amount in and amount out, with balance. It takes all the information and uses FPDF to generate a downloadable PDF document.
     
    I then made an email template in WHMCS that included the link to the page on my server that served my script.
     
    I created MD5 hash from some of the user information, to check against, so that clients wouldn't have to log in when opening the link.
     
    When the link is openend, the user gets a download prompt from their browser, asking if they want to download or open the PDF document. The filename is "Statement_YYYY-mm-dd". All these variables can be changed easily, of course, including the date range.
     
    I'm attaching the code and a screenshot of what the statement looks like.
     
    It's definitely not perfect and probably has some flaws, but maybe it can be modified to work with Blesta.
     

    <?php ini_set( 'display_errors', 1 ); ## Path to logo $logo = 'logo_vector_2.jpg'; ## Company/organistion information # Name $org_name = 'Acme'; # Address $org_addr_1 = "Address 1"; $org_addr_2 = "Address 2"; $org_addr_3 = "Ireland"; # Contact information 1 $org_contact_1 = 'Phone: +353 xxxx'; # Tax ID $org_tax_id = "VAT ID: 1234567M"; ## Database information $dbhost = "example.com"; $dbuser = "xxx"; $dbpass = "xxx"; $dbname = "xxx"; $uid = isset( $_REQUEST['uid'] ) ? (int)$_REQUEST['uid'] : NULL; $key = isset( $_REQUEST['key'] ) ? $_REQUEST['key'] : NULL; if ( empty( $uid ) || empty( $key ) ) { die( 'Error: no user ID or access key supplied. The link you entered may have expired.' ); } $mysqli = new mysqli( $dbhost, $dbuser, $dbpass, $dbname ); if ( $mysqli->connect_errno ) { echo "Failed to connect to MySQL: ( " . $mysqli->connect_errno . " ) " . $mysqli->connect_error; exit; } $result = $mysqli->query( "SELECT *, CONCAT( firstname, ' ', lastname, ' (', companyname, ')' ) AS client FROM tblclients WHERE id='$uid' LIMIT 1" ); if ( $result->num_rows !== 1 ) { die( 'Error: we could not access any account data with the information that was provided.' ); } $d = $result->fetch_assoc(); $result->free_result(); $md5 = md5( $d['id'] . ' : ' . $d['client'] . ' : ' . $d['email'] ); if ( $key !== $md5 ) { die( 'Error: the access key provided could not be validated. The link you followed may have expired.' ); } $date = date( 'Y-m-d', mktime( 0, 0, 0, date( 'm' ), date( 'd' ), date( 'Y' ) -6 ) ); $result = $mysqli->query( "SELECT SUM(total) AS total FROM tblinvoices WHERE userid = '$uid' AND DATE_FORMAT(`date`, '%Y-%m-%d') < '$date' AND status != 'Cancelled'" ); $balforward = $result->fetch_array()[0]; $result->free_result(); $result = $mysqli->query( "SELECT SUM(amountin) FROM tblaccounts WHERE userid='$uid' AND DATE_FORMAT(`date`, '%Y-%m-%d') < '$date'" ); $balforward -= $result->fetch_array()[0]; $result->free_result(); $result = $mysqli->query( "SELECT SUM(amount) FROM tblcredit WHERE clientid='$uid' AND DATE_FORMAT(`date`, '%Y-%m-%d') < '$date'" ); $balforward += $result->fetch_array()[0]; $result->free_result(); $result = $mysqli->query( " (SELECT id, ( subtotal + tax ) AS `amount`, DATE_FORMAT(`date`, '%Y-%m-%d') AS `date`, 'Invoice' AS txtype FROM tblinvoices WHERE userid='$uid' AND `date` >= '$date' AND status != 'Cancelled' AND ( subtotal + tax ) != 0) UNION (SELECT id, amountin AS `amount`, DATE_FORMAT(`date`, '%Y-%m-%d') AS `date`, 'Payment' AS txtype FROM tblaccounts WHERE userid='$uid' AND `date` >= '$date') UNION (SELECT id, amount AS `amount`, DATE_FORMAT(`date`, '%Y-%m-%d') AS `date`, 'Credit' AS txtype FROM tblcredit WHERE clientid='$uid' AND `date` >= '$date') ORDER BY `date` ASC " ); $i = array(); $n = 0; $balance = $balforward; while( $r = $result->fetch_assoc() ) { $i[$n] = $r; if ( $r['txtype'] === 'Invoice' ) { $balance += $r['amount']; } else { $balance -= $r['amount']; } $i[$n]['balance'] = number_format( $balance, 2, '.', ',' ); $n++; } $result->free_result(); $mysqli->close(); define( 'FPDF_FONTPATH', '../includes/font/' ); require( '../includes/fpdf.php' ); $pdf = new FPDF(); //Column titles $header = array( 'Date', 'Type', 'ID', 'Amount', 'Balance' ); //Data loading //$data=$pdf->LoadData($i); //$pdf->AddPage(); //$pdf->BasicTable($header,$data); //$pdf->AddPage(); //$pdf->ImprovedTable($header,$data); $pdf->AddPage(); $pdf->Image( $logo, 0, 0 ); $pdf->SetFont( 'Arial', 'B', 10 ); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_name, 0, 0, 'L' ); $pdf->Ln(); $pdf->SetFont( 'Arial', '', 10 ); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_addr_1, 0, 0, 'L' ); $pdf->Ln(); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_addr_2, 0, 0, 'L' ); $pdf->Ln(); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_addr_3, 0, 0, 'L' ); $pdf->Ln( 8 ); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_contact_1, 0, 0, 'L' ); $pdf->Ln(); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_tax_id, 0, 0, 'L' ); $pdf->Ln( 18 ); $pdf->SetFont( 'Arial', '', 14 ); $pdf->Cell( 80, 6, 'Account Statement', 0, 0, 'L' ); $pdf->Cell( 80, 6, gmdate( 'Y-m-d'), 0, 0, 'R' ); $pdf->Ln(10); $pdf->SetFont( 'Arial', 'B', 10 ); $pdf->Cell( 0, 6, $d['client'] ); $pdf->Ln(); $pdf->SetFont( 'Arial', '', 10 ); $pdf->Cell( 0, 6, $d['address1'] . ', '. $d['city'] . ', ' . $d['state'] ); $pdf->Ln( 20 ); //$pdf->FancyTable($header,$data); $data = $i; //Colors, line width and bold font $pdf->SetFillColor( 90, 135, 190 ); $pdf->SetTextColor( 255 ); $pdf->SetDrawColor( 128, 0, 0 ); $pdf->SetLineWidth( .3 ); $pdf->SetFont( '', 'B', 11 ); //Header $w = array( 30, 40, 30, 40, 40 ); for ( $i = 0; $i < count( $header ); $i++ ) $pdf->Cell( $w[$i], 7, $header[$i], 1, 0, 'C', true ); $pdf->Ln(); //Color and font restoration $pdf->SetFillColor( 224, 235, 255 ); $pdf->SetTextColor( 0 ); $pdf->SetFont( '' ); //Data $fill = false; $pdf->Cell( 30, 6, $date, 0, 0, 'L', $fill ); $pdf->Cell( 40, 6, 'Balance Forward', 0, 0, 'C', $fill ); $pdf->Cell( 30, 6, '-', 0, 0, 'L', $fill ); $pdf->Cell( 40, 6, number_format( $balforward, 2, '.', ',' ), 0, 0, 'R', $fill ); $pdf->Cell( 40, 6, number_format( $balforward, 2, '.', ',' ), 0, 0, 'R', $fill ); $pdf->Ln(); foreach( $data as $row ) { $pdf->Cell( 30, 6, $row['date'], 0, 0, 'L', $fill ); $pdf->Cell (40, 6, $row['txtype'], 0, 0, 'C', $fill ); $pdf->Cell( 30, 6, $row['id'], 0, 0, 'L', $fill ); if ( $row['txtype'] === 'Payment' || $row['txtype'] === 'Credit' ) { $pdf->Cell( 40, 6, '-' . $row['amount'], 0, 0, 'R', $fill ); } else { $pdf->Cell( 40, 6, $row['amount'], 0, 0, 'R', $fill ); } $pdf->Cell( 40, 6, $row['balance'], 0, 0, 'R', $fill ); $pdf->Ln(); $fill =! $fill; } $pdf->Cell( array_sum( $w ), 0, '', 'T' ); $pdf->Ln( 20 ); $pdf->Cell( 80, 6, 'Your current account balance is:', 0, 0, 'L' ); $pdf->SetFont( 'Arial', 'B', 13 ); $pdf->Cell( 80, 6, number_format( $balance, 2, '.', ',' ), 0, 0, 'L' ); $pdf->Ln( 8 ); $pdf->SetFont( 'Arial', '', 8 ); $pdf->MultiCell( 150, 6, 'Please note this is not an official invoice. Errors and omissions excepted. Please refer to your invoice for transaction details and tax information. Please contact us with any questions.' ); $pdf->Ln(5); $pdf->Ln(1); header( "Cache-Control: no-cache, must-revalidate" ); // HTTP/1.1 header( "Expires: Sat, 26 Jul 1997 05:00:00 GMT" ); // Date in the past header( "Content-type: application/pdf" ); header( 'Content-Disposition: attachment; filename="Statement_' . gmdate( 'Y_m_d' ) . '.pdf"' ); $pdf->Output( 'Statement_' .gmdate( 'Y_m_d' ) . '.pdf', 'D' );
  9. Like
    NETLINK got a reaction from Michael in Client Billing Statement   
    A few years ago, WHMCS didn't have client statements. Not sure if it does now. So I wrote this code and uploaded it to one of my servers. It's a set of custom mysql queries to calculate the amount owed, amount paid and amount of credits. Kind of like a simple bank statement - amount in and amount out, with balance. It takes all the information and uses FPDF to generate a downloadable PDF document.
     
    I then made an email template in WHMCS that included the link to the page on my server that served my script.
     
    I created MD5 hash from some of the user information, to check against, so that clients wouldn't have to log in when opening the link.
     
    When the link is openend, the user gets a download prompt from their browser, asking if they want to download or open the PDF document. The filename is "Statement_YYYY-mm-dd". All these variables can be changed easily, of course, including the date range.
     
    I'm attaching the code and a screenshot of what the statement looks like.
     
    It's definitely not perfect and probably has some flaws, but maybe it can be modified to work with Blesta.
     

    <?php ini_set( 'display_errors', 1 ); ## Path to logo $logo = 'logo_vector_2.jpg'; ## Company/organistion information # Name $org_name = 'Acme'; # Address $org_addr_1 = "Address 1"; $org_addr_2 = "Address 2"; $org_addr_3 = "Ireland"; # Contact information 1 $org_contact_1 = 'Phone: +353 xxxx'; # Tax ID $org_tax_id = "VAT ID: 1234567M"; ## Database information $dbhost = "example.com"; $dbuser = "xxx"; $dbpass = "xxx"; $dbname = "xxx"; $uid = isset( $_REQUEST['uid'] ) ? (int)$_REQUEST['uid'] : NULL; $key = isset( $_REQUEST['key'] ) ? $_REQUEST['key'] : NULL; if ( empty( $uid ) || empty( $key ) ) { die( 'Error: no user ID or access key supplied. The link you entered may have expired.' ); } $mysqli = new mysqli( $dbhost, $dbuser, $dbpass, $dbname ); if ( $mysqli->connect_errno ) { echo "Failed to connect to MySQL: ( " . $mysqli->connect_errno . " ) " . $mysqli->connect_error; exit; } $result = $mysqli->query( "SELECT *, CONCAT( firstname, ' ', lastname, ' (', companyname, ')' ) AS client FROM tblclients WHERE id='$uid' LIMIT 1" ); if ( $result->num_rows !== 1 ) { die( 'Error: we could not access any account data with the information that was provided.' ); } $d = $result->fetch_assoc(); $result->free_result(); $md5 = md5( $d['id'] . ' : ' . $d['client'] . ' : ' . $d['email'] ); if ( $key !== $md5 ) { die( 'Error: the access key provided could not be validated. The link you followed may have expired.' ); } $date = date( 'Y-m-d', mktime( 0, 0, 0, date( 'm' ), date( 'd' ), date( 'Y' ) -6 ) ); $result = $mysqli->query( "SELECT SUM(total) AS total FROM tblinvoices WHERE userid = '$uid' AND DATE_FORMAT(`date`, '%Y-%m-%d') < '$date' AND status != 'Cancelled'" ); $balforward = $result->fetch_array()[0]; $result->free_result(); $result = $mysqli->query( "SELECT SUM(amountin) FROM tblaccounts WHERE userid='$uid' AND DATE_FORMAT(`date`, '%Y-%m-%d') < '$date'" ); $balforward -= $result->fetch_array()[0]; $result->free_result(); $result = $mysqli->query( "SELECT SUM(amount) FROM tblcredit WHERE clientid='$uid' AND DATE_FORMAT(`date`, '%Y-%m-%d') < '$date'" ); $balforward += $result->fetch_array()[0]; $result->free_result(); $result = $mysqli->query( " (SELECT id, ( subtotal + tax ) AS `amount`, DATE_FORMAT(`date`, '%Y-%m-%d') AS `date`, 'Invoice' AS txtype FROM tblinvoices WHERE userid='$uid' AND `date` >= '$date' AND status != 'Cancelled' AND ( subtotal + tax ) != 0) UNION (SELECT id, amountin AS `amount`, DATE_FORMAT(`date`, '%Y-%m-%d') AS `date`, 'Payment' AS txtype FROM tblaccounts WHERE userid='$uid' AND `date` >= '$date') UNION (SELECT id, amount AS `amount`, DATE_FORMAT(`date`, '%Y-%m-%d') AS `date`, 'Credit' AS txtype FROM tblcredit WHERE clientid='$uid' AND `date` >= '$date') ORDER BY `date` ASC " ); $i = array(); $n = 0; $balance = $balforward; while( $r = $result->fetch_assoc() ) { $i[$n] = $r; if ( $r['txtype'] === 'Invoice' ) { $balance += $r['amount']; } else { $balance -= $r['amount']; } $i[$n]['balance'] = number_format( $balance, 2, '.', ',' ); $n++; } $result->free_result(); $mysqli->close(); define( 'FPDF_FONTPATH', '../includes/font/' ); require( '../includes/fpdf.php' ); $pdf = new FPDF(); //Column titles $header = array( 'Date', 'Type', 'ID', 'Amount', 'Balance' ); //Data loading //$data=$pdf->LoadData($i); //$pdf->AddPage(); //$pdf->BasicTable($header,$data); //$pdf->AddPage(); //$pdf->ImprovedTable($header,$data); $pdf->AddPage(); $pdf->Image( $logo, 0, 0 ); $pdf->SetFont( 'Arial', 'B', 10 ); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_name, 0, 0, 'L' ); $pdf->Ln(); $pdf->SetFont( 'Arial', '', 10 ); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_addr_1, 0, 0, 'L' ); $pdf->Ln(); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_addr_2, 0, 0, 'L' ); $pdf->Ln(); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_addr_3, 0, 0, 'L' ); $pdf->Ln( 8 ); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_contact_1, 0, 0, 'L' ); $pdf->Ln(); $pdf->Cell( 120, 6, '', 0, 0, 'L' ); $pdf->Cell( 0, 6, $org_tax_id, 0, 0, 'L' ); $pdf->Ln( 18 ); $pdf->SetFont( 'Arial', '', 14 ); $pdf->Cell( 80, 6, 'Account Statement', 0, 0, 'L' ); $pdf->Cell( 80, 6, gmdate( 'Y-m-d'), 0, 0, 'R' ); $pdf->Ln(10); $pdf->SetFont( 'Arial', 'B', 10 ); $pdf->Cell( 0, 6, $d['client'] ); $pdf->Ln(); $pdf->SetFont( 'Arial', '', 10 ); $pdf->Cell( 0, 6, $d['address1'] . ', '. $d['city'] . ', ' . $d['state'] ); $pdf->Ln( 20 ); //$pdf->FancyTable($header,$data); $data = $i; //Colors, line width and bold font $pdf->SetFillColor( 90, 135, 190 ); $pdf->SetTextColor( 255 ); $pdf->SetDrawColor( 128, 0, 0 ); $pdf->SetLineWidth( .3 ); $pdf->SetFont( '', 'B', 11 ); //Header $w = array( 30, 40, 30, 40, 40 ); for ( $i = 0; $i < count( $header ); $i++ ) $pdf->Cell( $w[$i], 7, $header[$i], 1, 0, 'C', true ); $pdf->Ln(); //Color and font restoration $pdf->SetFillColor( 224, 235, 255 ); $pdf->SetTextColor( 0 ); $pdf->SetFont( '' ); //Data $fill = false; $pdf->Cell( 30, 6, $date, 0, 0, 'L', $fill ); $pdf->Cell( 40, 6, 'Balance Forward', 0, 0, 'C', $fill ); $pdf->Cell( 30, 6, '-', 0, 0, 'L', $fill ); $pdf->Cell( 40, 6, number_format( $balforward, 2, '.', ',' ), 0, 0, 'R', $fill ); $pdf->Cell( 40, 6, number_format( $balforward, 2, '.', ',' ), 0, 0, 'R', $fill ); $pdf->Ln(); foreach( $data as $row ) { $pdf->Cell( 30, 6, $row['date'], 0, 0, 'L', $fill ); $pdf->Cell (40, 6, $row['txtype'], 0, 0, 'C', $fill ); $pdf->Cell( 30, 6, $row['id'], 0, 0, 'L', $fill ); if ( $row['txtype'] === 'Payment' || $row['txtype'] === 'Credit' ) { $pdf->Cell( 40, 6, '-' . $row['amount'], 0, 0, 'R', $fill ); } else { $pdf->Cell( 40, 6, $row['amount'], 0, 0, 'R', $fill ); } $pdf->Cell( 40, 6, $row['balance'], 0, 0, 'R', $fill ); $pdf->Ln(); $fill =! $fill; } $pdf->Cell( array_sum( $w ), 0, '', 'T' ); $pdf->Ln( 20 ); $pdf->Cell( 80, 6, 'Your current account balance is:', 0, 0, 'L' ); $pdf->SetFont( 'Arial', 'B', 13 ); $pdf->Cell( 80, 6, number_format( $balance, 2, '.', ',' ), 0, 0, 'L' ); $pdf->Ln( 8 ); $pdf->SetFont( 'Arial', '', 8 ); $pdf->MultiCell( 150, 6, 'Please note this is not an official invoice. Errors and omissions excepted. Please refer to your invoice for transaction details and tax information. Please contact us with any questions.' ); $pdf->Ln(5); $pdf->Ln(1); header( "Cache-Control: no-cache, must-revalidate" ); // HTTP/1.1 header( "Expires: Sat, 26 Jul 1997 05:00:00 GMT" ); // Date in the past header( "Content-type: application/pdf" ); header( 'Content-Disposition: attachment; filename="Statement_' . gmdate( 'Y_m_d' ) . '.pdf"' ); $pdf->Output( 'Statement_' .gmdate( 'Y_m_d' ) . '.pdf', 'D' );
  10. Like
    NETLINK reacted to Paul in Client Billing Statement   
    Just a note on this. Since this thread was started, we added a setting under Settings > Company > Billing/Payments > Invoice Customization called "Payments/Credits". If this is checked, invoices will show any payments already applied to the invoice.
     
    If sending all open invoices to a client, they will be able to see how much is effectively due for each invoice when payments/credits are displayed. The only issue I think, is that it does not show a summary of the total due across all open invoices.
  11. Like
    NETLINK reacted to RonG in Client Billing Statement   
    It was suggested that I post a request for a Statement Feature by a Besta Support staffer. We genertae a number of recuring invoices per client, per month - AND we also genertate invoices for break/fix site repairs and on-site and off-site support functions - a statement that rolls up all charges in a given billing cycle would be most beneficial to clients
  12. Like
    NETLINK reacted to mrrsm in Client Billing Statement   
    The code snippit is not that useful unless I am adding it to an existing email or something similar.  I am hoping for some client reports that would be editable in the email section.
    I guess another way it could work would be a plugin that allows you to create email templates, then allow you to email them out to customers on demand or at an interval.  That would be more work I would have to do but it would be more flexible.
  13. Like
    NETLINK reacted to Paul in Stripe - Invoice Number In Description   
    Why not? See CORE-2119. Thank you for the suggestion!
  14. Like
    NETLINK got a reaction from Blesta Addons in Stripe - Invoice Number In Description   
    Hello! Stripe has a "Description" field for transactions. I was wondering if it's possible to get a description entered for this field - for example a list of invoice numbers the transaction was used to pay.
  15. Like
    NETLINK reacted to Michael in Stripe - Invoice Number In Description   
    +1 if possible, I personally search Blesta for transactions using their transaction ID.
  16. Like
    NETLINK reacted to Michael in [Universal Module] Service Details   
    I would like a way to add Service details with the Universal module, at the moment they say: "This service has no details."
     
    So maybe:
     
    If you have three rows in the Universal module with labels:
     
    - IP Address - text 
    - License Key - text 
    - Status - dropdown (Status) not able to be changed by the clients but only by staff (Read me)
     
     
    Table:
     

    IP Address                                                       License Key                                                       Status

    1.0.0.0.0                                                     monthly-000000000000000                                    Active

     
     
    At the moment they are like:
     

  17. Like
    NETLINK got a reaction from PauloV in Enom Module - Nameservers   
    The expected output returned by the module is a list of nameservers associated with the domain, which is converted into a PHP array:
    https://reseller.enom.com/interface.asp <?xml version="1.0" encoding="utf-8"?> <interface-response> <dns>ns1.example.com</dns> <dns>ns2.example.com</dns> <UseDNS></UseDNS> However, the actual result I got was just 1 nameserver, which resulted in a fatal PHP error:
    Invalid argument supplied for foreach() https://reseller.enom.com/interface.asp <?xml version="1.0" encoding="utf-8"?> <interface-response> <dns>ns1.example.com</dns> <UseDNS></UseDNS> I added "&& is_array( $data->dns )", which checks if $data->dns is an array, and prevents a fatal error in this scenario.
  18. Like
    NETLINK got a reaction from PauloV in Enom Module - Nameservers   
    The following change will prevent an error if, for some reason, Enom is only returning one nameserver, which happened me today.
                if ($response->status() == "OK") {                 $data = $response->response();                 if ( isset( $data->dns ) && is_array( $data->dns ) ) {                     foreach ($data->dns as $ns)                         $vars->ns[] = $ns;                 }                              } Blesta Version 3.6.1
    Enom (ver 2.2.1)
     
    File: components/modules/enom/enom.php
    Line: 1151
  19. Like
    NETLINK reacted to mrrsm in Client Billing Statement   
    I did some brief searching and could find any threads even though I thought this was talked about before.
     
    There should be a way to print out a current statement for a customer.  For example if they have 2 invoices, 1 is partially paid, I should be able to print out a statement that shows the total from both invoices minus the amount paid and the total they owe.
     
    I looked in reporting and couldn't find anything either although I would figure I would find this on the clients page in the admin section.
  20. Like
    NETLINK got a reaction from PauloV in Pro Forma Invoices   
    You're right. But I'm not sure if it technically indicates it directly. See point 2.1 on the following resource:
    http://www.taxdonut.co.uk/tax/vat/vat-problems/common-vat-problems
     
    Also here:
    https://www.e-conomic.com/accountingsoftware/accounting-words/pro-forma-invoice
     
    And after a ruling by the Federal Finance Court of Germany (Az. V R 44/09), it is recommended to clearly state on pro-forma invoices that the document does not authorize any kind of pre-tax deductions.
     
    And here it is directly from HMRC (see very bottom in bold):
    http://www.hmrc.gov.uk/manuals/vatrecmanual/VATREC9010.htm
     
    I can't seem to find an official reference that's valid for all EU member states.
     
    Adding it to the terms would resolve the issue. But I think it has the potential to cause confusion if it were mentioned on both Pro Forma and VAT invoices.
     
    Perhaps an extra text area under settings for adding terms specific to PF invoices? Or maybe a separate text-area for each type of invoice. That way, it would give more flexibility and wouldn't have to be hardcoded. Since non-EU countries may use PF invoicing but not VAT.
  21. Like
    NETLINK got a reaction from PauloV in Pro Forma Invoices   
    Hello,
     
    A pro forma invoice is a document that states a commitment on part of the seller to deliver the products or services as notified to the buyer for a specific price. It is thus not a true invoice.
     
    Therefore, for EU businesses, if an invoice is a pro forma invoice, it should include the words "This is not a VAT invoice", or "Pro forma invoices should not be treated as VAT invoices".
     
    Would it be possible to add this as a feature? To add this text below or above the Terms. Or possibly in small font underneath where it says "Pro Forma Invoice".
  22. Like
    NETLINK got a reaction from Blesta Addons in Pro Forma Invoices   
    You're right. But I'm not sure if it technically indicates it directly. See point 2.1 on the following resource:
    http://www.taxdonut.co.uk/tax/vat/vat-problems/common-vat-problems
     
    Also here:
    https://www.e-conomic.com/accountingsoftware/accounting-words/pro-forma-invoice
     
    And after a ruling by the Federal Finance Court of Germany (Az. V R 44/09), it is recommended to clearly state on pro-forma invoices that the document does not authorize any kind of pre-tax deductions.
     
    And here it is directly from HMRC (see very bottom in bold):
    http://www.hmrc.gov.uk/manuals/vatrecmanual/VATREC9010.htm
     
    I can't seem to find an official reference that's valid for all EU member states.
     
    Adding it to the terms would resolve the issue. But I think it has the potential to cause confusion if it were mentioned on both Pro Forma and VAT invoices.
     
    Perhaps an extra text area under settings for adding terms specific to PF invoices? Or maybe a separate text-area for each type of invoice. That way, it would give more flexibility and wouldn't have to be hardcoded. Since non-EU countries may use PF invoicing but not VAT.
  23. Like
    NETLINK got a reaction from Sokaris07 in Namesilo Plugin   
    Hello,
    I've started this project here:
    https://github.com/NETLINK/Blesta-Namesilo
    Still a fair bit of work left, and any help would be appreciated.
    For testing purposes, an already registered domain in a Namesilo account can be added through the admin backend and then managed from the client section. Nameserver and Whois management, registrar lock and EPP functions should be working, however, improvements are still possible.
  24. Like
    NETLINK reacted to franksidebottom in Namesilo Plugin   
    THIS.
     
     
    Works like a charm now, will continue to do more testing and will get back to you if I have any further problems.
     
    Thanks again.
  25. Like
    NETLINK reacted to hadzo in Merge Invoices   
    Sometimes you have multiple invoices for a client that are regarding the same task and are still pending/not paid and it would be good to pay them all at once - merge the into one invoice and the client get's an email notification about the invoices being merged.
×
×
  • Create New...