Author Archive

InvoicePlane v1.4.10 – Enabling Date Parameters

November 29, 2016 Leave a comment

As an update to

File: Application\helpers\pdf_helper.php
    $items = $CI->mdl_items->where(‘invoice_id’, $invoice_id)->get()->result();   
    $items = $CI->mdl_items->get_items_and_replace_vars($invoice_id, $invoice->invoice_date_due);


File: application\modules\guest\controllers\view.php
    ‘items’ => $this->mdl_items->where(‘invoice_id’, $invoice->invoice_id)->get()->result(),
    ‘items’ => $this->mdl_items->get_items_and_replace_vars($invoice->invoice_id, $invoice->invoice_date_due),


File: application\modules\invoices\models\mdl_items.php
Add the following lines after "class Mdl_Items extends Response_Model {"

    ///Modify – ADDED
    public function get_items_and_replace_vars($invoice_id, $invoice_date_created = ‘now’)
         $items = array();
         $query = $this->where(‘invoice_id’, $invoice_id)->get();

         foreach($query->result() as $item) {
             $item->item_name = $this->parse_item($item->item_name, $invoice_date_created);
             $item->item_description = $this->parse_item($item->item_description, $invoice_date_created);
             $items[] = $item;
         return $items;

    //Modify – ADDED
    private function parse_item($string, $invoice_date_created)
        if (preg_match_all(‘/{{{(?<format>[yYmMdD])(?:(?<=[Yy])ear|(?<=[Mm])onth|(?<=[Dd])ay)(?:(?<operation>[-+])(?<amount>[1-9]+))?}}}/m’, $string, $template_vars, PREG_SET_ORDER)) {
              try {
                $formattedDate = new DateTime($invoice_date_created);
              catch(Exception $e) { // If creating a date based on the invoice_date_created isn’t possible, use current date
                $formattedDate = new DateTime();

              /* Calculate the date first, before starting replacing the variables */
              foreach($template_vars as $var) {
                  if(!isset($var[‘operation’], $var[‘amount’])) continue;

                  if($var[‘operation’] == ‘-‘) {
                      $formattedDate->sub( new DateInterval(‘P’ . $var[‘amount’] . strtoupper($var[‘format’])) );
                  else if($var[‘operation’] == ‘+’) {
                      $formattedDate->add( new DateInterval(‘P’ . $var[‘amount’] . strtoupper($var[‘format’])) );

              /* Let’s replace all variables */
              foreach($template_vars as $var) {
                  $string = str_replace($var[0], $formattedDate->format($var[‘format’]), $string);

        return $string;


Categories: Invoice Plane, Open Source

Changing the default folder path for Outlook

November 2, 2016 Leave a comment

By default, Microsoft Outlook saves the email files in \User\[UserName]\AppData\Local\Microsoft\Outlook

If you want to change it to a different folder,

  1. Open registry editor
  2. Goto HKCU\Software\Microsoft\Office\xx.0\Outlook
  3. Add a new string value called ForceOSTPath and set the value to the folder path where the data files should be stored


Categories: Microsoft Office

Enabling Search for Local Administrator Account in Windows Server 2016

November 2, 2016 Leave a comment

By default, Windows Server 2016 will severely limit the access rights of the local administrator account.

Here are the steps to promote the account so that you can use it as a normal account

Run gpedit.msc

Goto Computer Configuration > Administrative Template > Windows Components > Search

Set Allow Cortana to Disabled


Next goto Computer Configuration > Windows Settings > Security Settings > Local Policies > Security Options

Set User Account Control: Admin Approval Mode for the Built-in Administrator Account to Enabled


Now reset the machine and the local administrator will behave like a normal user account

Enabling CI for .net core using TFS Build

October 10, 2016 Leave a comment

At the moment there is no easy way to implement CI for .net core projects. Ideally it should be published and deployed to individual instances of nano servers, but that might be something beyond the capability of TFS Build.

Should you wish to implement CI for .net core projects on TFS 2015, here are the build steps and scripts that you need.

  1. Step 1: Install .net core
    Download and either place it inside TFS or else in a central location. This will install and setup the .net Core CLI Runtime for the service account that is used by the build servers
  2. Step 2: Run dotnet restore and dotnet publish
    Download and modify the powershell script found at It assumes that each folder is an individual .net core project that needs to be published. Modify accordingly to your environment

    It is important to add in the OutputDir argument as that defines where the published project goes

    As this builds all the projects, you may also want to check “Continue on error”

  3. Step 3: Deploy to the servers
    You can find the script I use at Important thing to note is that you need to first stop IIS on the target server before copying the files over as running net core on IIS locks the dll files

ASP.NET Core–IIS gives 502.5

October 7, 2016 Leave a comment

Running .net core apps on IIS can be a tricky if not done correctly.


In order to be sure you will need to wait up to 6 minutes for IIS to time out to get the true error message.

Here are some quick tips

  1. Make sure the IIS user has access to the folder where the published files are
  2. The application pool serving the core website should have CLR = no managed code
  3. In your code, ensure that UseUrls comes BEFORE UseIISIntegration 
    While running it in development is straightforward using the UseUrls function, if it appear after UseIISIntegration, it will override the IIS setup and your website will not work, what is worse is that you will have to wait a full 6 minutes before you see the actual error
Categories: Uncategorized

Adobe Photoshop CS2

August 23, 2016 Leave a comment

For those that can no longer find the link to the free download of Adobe Photoshop CS2, the URL to download it is


The free license codes are

Windows Serial number: 1045-1412-5685-1654-6343-1431
Mac OS X Serial number: 1045-0410-5403-3188-5429-0639

Categories: Uncategorized

CentOS 7, VestaCP and the Irritating clamd

July 9, 2016 1 comment

Here is the step by step guide in getting clamav to work in CentOS 7 for a VestaCP setup

Install Updated ClamAV components
yum install clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd -y

Link scan.conf to the default VestaCP clamd config file
rm -f /etc/clamd.d/scan.conf
ln -s /etc/clamd.conf /etc/clamd.d/scan.conf

Create freshclam service (Running it as a service will automatically update your AV definitions)
vi /usr/lib/systemd/system/clam-freshclam.service

Description = freshclam scanner
After =
Type = forking
ExecStartPre=/usr/bin/mkdir -p /var/lib/clamav/
ExecStartPre=/usr/bin/chown -R clam.clam /var/lib/clamav
ExecStartPre=/usr/bin/chmod 755 /var/lib/clamav
ExecStart = /usr/bin/freshclam -d -c 4
Restart = on-failure
PrivateTmp = true

Register and start freshclam service
systemctl enable clam-freshclam.service
systemctl restart clam-freshclam.service
systemctl status clam-freshclam.service -l

Update clamd@ service to create the neccessary folders
vi /usr/lib/systemd/system/clamd@.service
Description = clamd scanner (%i) daemon
After =

Type = simple
***ADD these 2 lines below, they must be before ExecStart
ExecStartPre = /usr/bin/mkdir -p /var/log/clamav/
ExecStartPre = /usr/bin/chown -R clam:clam /var/log/clamav/
ExecStart = …

Update startup to use the new clamd service
cd /usr/lib/systemd/system

systemctl disable clamd.service

systemctl enable clamd@scan.service
systemctl restart clamd@scan.service
systemctl status clamd@scan.service

Test scan, make sure it is successful
clamdscan -c /etc/clamd.d/scan.conf –fdpass


Categories: CentOS, Vesta