Alterações iTarefa:

--> quando o aluno tentava acessar uma atividade que foi removida, era gerado um bug
:: com as alterações, o aluno recebe um alerta.

SOLUÇÃO:
* locallib.php
   função: view_iassign_current() 
   if (!$iassign_statement_activity_item) {
       print $OUTPUT->header();
       \core\notification::error(get_string('activity_not_found', 'iassign'));
       print $OUTPUT->footer();
       exit;
     }


--> quando o aluno finalizava uma tarefa no iFractions, a tela do iMA ficava preta
problema: ao carregar a página inicial, o iTarefa entrega um código para acessar o ilm_security,
mas com a finalização da atividade, o mesmo código era mantido, portanto, não tinha como acessar, 
pois o código do ilm_security só pode ser usado uma única vez.

SOLUÇÃO: 
* iFractions/index.html:
   função: finish_redirect()
     parent.location.reload(true); // Ao passar o "true", o navegador não usa o cache e busca um novo código ilm_security


--> manter selecionado o iLM que foi usado recentemente para criar a última atividade, a fim de melhorar a usabilidade e produtividade
* arquivo alterado: iassign_form.php

-->  Gerenciamento de arquivos:

1. Criação da atividade:
- O campo itemid passa a receber o statementid.
- Função: new_iassign //locallib.php
 // IGOR: itemid do arquivo é o mesmo que o id do statemente registrado acima:
      $itemid = $id;

2. Alteração da atividade:
- Atualmente, o arquivo anterior é removido, mas não remove também as entradas de diretórios.

3. Exclusão da atividade:
- O iTarefa não removia as entradas do files, que estão associadas àquela atividade excluída.
- Para corrigir, as linhas abaixo foram adicionadas:

função deleteyes: // locallib.php

   $fs = get_file_storage(); 
      $fs->delete_area_files(
        $iassign->context->id, 
        'mod_iassign', 
        'exercise', 
        $this->activity->id
      );

4. Cópia de atividade: 
- Com a alteração feita para a criação, a cópia também passou a registrar o itemid com o statementid.

5. Mover atividade:
- Para preservar o itemid do arquivo, a seguinte linha foi atualizada:

função move_activity: //locallib.php
$newfile = $fs->create_file_from_storedfile(array('contextid' => $id_context, 'component' => 'mod_iassign', 'filearea' => 'exercise', 'itemid' => $iassign_id), $value);
  

5. No update: 

..> Testar na nossa base:

if ($oldversion < 2020102800) {
      // 1. encontrar os contextos dos arquivos do itarefa:
      $iassign_contexts_list = $DB->get_records_sql("SELECT contextid FROM {files} f " .
        " WHERE component='mod_iassign'");
      // 2. compor um array com todos os contextos encontrados: 
      $contexts = array();
      foreach ($iassign_contexts_list as $iassign_context_item) {
        array_push($contexts, $iassign_context_item->contextid);
      }
      // 3. encontrar todas as atividades do itarefa, em que o arquivo não tenha o mesmo id do statement:
      $iassign_statement_list = $DB->get_records_sql("SELECT * FROM {iassign_statement} s " .
        " WHERE s.id != s.file");
      $fs = get_file_storage();

      // 4. percorrer o conjunto de atividades:
      foreach ($iassign_statement_list as $iassign_statement_activity_item) {
        
        // 5. encontrar o arquivo, considerando os possíveis contextos:
        $files = array();
        foreach ($contexts as $context) {

          $files = $fs->get_area_files($context, 'mod_iassign', 'exercise', $iassign_statement_activity_item->file);

          // 6. se o arquivo for encontrado, fazer uma cópia do conteúdo, 
          // com o itemid novo, atualizar o iassign_statement, e apagar o arquivo antigo:
          if ($files) {
            foreach ($files as $value) {
              if ($value != null && $value->get_filename() != ".") {
                // 6.A. Fazer uma cópia:
                $newfile = $fs->create_file_from_storedfile(array('contextid' => $context, 'component' => 'mod_iassign', 'filearea' => 'exercise', 'itemid' => $iassign_statement_activity_item->id), $value);

                // 6.B. Atualizar o registro da atividade para o arquivo novo:
                $update_entry = new stdClass();
                $update_entry->id = $iassign_statement_activity_item->id;
                $update_entry->file = $newfile->get_itemid();
                $DB->update_record("iassign_statement", $update_entry);

                // 6.C. Remover o arquivo antigo:
                $value->delete();
              } else if ($value != null && $value->get_filename() == ".") {
                // 6.C.I. Remover também os indicadores de diretório:
                $value->delete();
              }
            }
            break;
          }
        }
                  
      }
    } // if ($oldversion < 2020102800)














09/11/2020:


:: editingbehavior ::

editingbehavior = 0: para iGeom, iHanoi => ter que clicar no "Refazer atividade" : desabilita botao "enviar" ao entrar em atividade feita
editingbehavior = 1: para iVProg => permite continuar edicao (do ponto que parou) : deixa habilitado o botao "enviar" em qq situacao
title do botão
editingbehavior = 2: para iFraction => não tem o botão enviar, o envio é contínuo

:: submissionbehavior ::

se editingbehavior=0, entao: trocar 'title' para 
'Este iMA nao permite continuar edicao de solucao enviada. 
Para editar, por favor, clique no botao 'Refazer atividade'"


iassign_ilm: 2 novos campos 'editingbehavior' e 'submissionbehavior'

Sendo:
 id name version type editingbehavior  description url extension parent file_jar file_class width height enable timemodified author timecreated evaluate reevaluate
 editingbehavior = 0: para iGeom, iHanoi => ter que clicar no "Refazer atividade"          : desabilita botao "enviar" ao entrar em atividade feita
 editingbehavior = 1: para iVProg        => permite continuar edicao (do ponto que parou)  : deixa habilitado o botao "enviar" em qq situacao

 submissionbehavior = 0: para iGeom, iVprog, iHanoi  => NAO trocar de pagina        
 submissionbehavior = 1: para iFractions             => ao finalizar deve invocar iTarefa.finish_and_redirect()


:: iassign_allsubmissions ::

Criar nova tabela 'iassign_allsubmissions'.  Se a atividade estiver marcada para gravar todas, qdo aluno clicar no "avaliar", gravar nova entrada.

No formulario para criar atividade, se o iMA for do tipo (1,0), mostrar opcao para gravar tudo
No 'locallib', sempre que o aluno clicar no "avaliar"


No iVProg

-> mensagem de fechar a janela com edição


-->> AFAZERES:













iassign_ilm: 2 novos campos 'editingbehavior' e 'submissionbehavior'
Sendo:
 id name version type editingbehavior  description url extension parent file_jar file_class width height enable timemodified author timecreated evaluate reevaluate

 editingbehavior = 0: para iGeom, iHanoi, iFractions => ter que clicar no "Refazer atividade"          : desabilita botao "enviar" ao entrar em atividade feita

 editingbehavior = 1: para iVProg        => permite continuar edicao (do ponto que parou)  : deixa habilitado o botao "enviar" em qq situacao


 @Igor: 
  Finalizada a implementação do 'editingbehavior'


 submissionbehavior = 0: para iGeom, iVprog, iHanoi  => NAO trocar de pagina        
 submissionbehavior = 1: para iFractions             => ao finalizar deve invocar iTarefa.finish_and_redirect()


Criar nova tabela 'iassign_allsubmissions'. Se a atividade estiver marcada para gravar todas, qdo aluno clicar no "avaliar", gravar nova entrada.

No formulario para criar atividade, se o iMA for do tipo (1,0), mostrar opcao para gravar tudo
No 'locallib', sempre que o aluno clicar no "avaliar"



TODO

1. 1 tabela nova: iassign_allsubmissions

  @Igor:
  Campos na tabela iassign_allsubmissions:
    1. id
    2. iassign_statementid
    3. userid
    4. timecreated
    5. grade
    6. answer


2. 2 campos novos na tabela 'iassign_ilm': editingbehavior, submissionbehavior
  
3. 1 campo novo na tabela 'iassign_statement': store_all_submissions

iMA:
- getEvaluation(): tem que chamar o 'getEvaluation()' do iTarefa
iTarefa:
- Alterar com sua funcao 'getEvaluation()' com eventual codigo para gravar (senao ela e' vazia)




30/11/2020:
--> tabela ilm:
- action_button
  0: submission desabilitado
  1: padrão. submission habilitado.

--> se o ima possui autoavaliador e é do tipo exercício,
trocar o rótulo do botão para 'Avaliar':
  'roda o avaliador e envia o registro, 
    clicando no avaliar, automaticamente vai ser registrado'
  Verificar se a nota é maior ou menor

