Pues no veo mal crear la condición por separado de la ejecución de la consulta, lo que creo que trabajas de más es a la hora d e formar la condición, al tratar de concatenarla y al evaluar si existen los parámetros:
Código PHP:
Ver originalif(isset($k['desde']) && $k['desde'] != "" && isset($k['hasta']) && $k['hasta'] != ""): $where.=($inicio)?" WHERE f.fecha BETWEEN'".$k['desde']."' AND '".$k['hasta']."'" : "AND f.fecha BETWEEN'".$k['desde']."' AND '".$k['hasta']."'";
$inicio = false;
endif;
Código PHP:
Ver original $where[]="f.fecha BETWEEN'".$k['desde']."' AND '".$k['hasta'];
al final, la variable $where la juntas con implode
Y sólo habría que tratar el group by de forma independiente para que no lleve el and.
Las diferencias: empty verifica si la variable existe y está o no vacía, con lo que no necesitas comparar dos veces
Y finalmente, en vez de preguntar si la variable $where ya contiene algo, vas almacenando en un arreglo los segmentos de la consulta para al final unirlo con AND entre cada segmento.