Theme call for block returning as an empty string
Assuming your template file can be found at theme/block-projectinfo.tpl.php, you just need to change the file property to template in hook_theme():

function generic_theme() {
  return array(
    'block_projectinfo' =&gt; array(
        'variables' =&gt; array(
            'completionPct' =&gt; NULL,
        ),
        'template' =&gt; 'theme/block-projectinfo'
    )
  );
}


file is


  The file the implementation resides in. This file will be included prior to the theme being rendered, to make sure that the function or preprocess function (as needed) is actually loaded; this makes it possible to split theme functions out into separate files quite easily.


And refers to situations where you implement a theme_foo() function, rather than a template file.