Esto es lo que tengo actualmente y funciona, la única duda es si es la mejor opción frente a que otro usuario puede realizar la acción a la misma vez:
$libre = true;
while ($libre) {
//RECUPERAMOS EL CONTADOR SEGUN EL TIPO
$contador = $this->get_contador('0');
//CREAMOS EL NUEVO NUMERO
$num = (int)$contador->co_contador + 1;
$numero = 'PR'.$anio.$num;
//BUSCAMOS UN PRESUPUESTO CON ESTE NUMERO
$aux = $this->get_presupuesto($numero);
//PREGUNTAMOS SI ENCOTRO REGISTROS
if ($aux == null) {
$libre = false;
}
}
$presupuesto['pre_numero'] = $numero;
$this->db->insert('presupuestos',$presupuesto);
//GUARDAMOS EL CONTADOR NUEVO
if ($this->db->trans_status() === TRUE) {
$this->set_contador('0',$num);