private boolean fillModelFromUI() {
    // Champs dynamiques CRM
    boolean isComplete = true;

    boolean capturedBool;
    String capturedStr;

    int crmFieldIndex = 0;
    for (CrmFileFieldDesc fd : mCrmFieldDescs) {
      CrmFileFieldValue record = mCrmFileRecord.recordData.get(fd.fieldCode);

      switch (fd.fieldType) {
        case FIELD_BIBLE:
          // bible capturée en direct : BibleListener => rien à faire
          break;

        case FIELD_BOOLEAN:
          capturedBool =
              ((CheckBox) mCrmFieldViews.get(crmFieldIndex).findViewById(R.id.crm_checkbox))
                  .isChecked();
          record.valueBoolean = capturedBool;
          record.displayStr = capturedBool ? "true" : "false";
          break;

        case FIELD_TEXT:
          capturedStr =
              ((EditText) mCrmFieldViews.get(crmFieldIndex).findViewById(R.id.crm_text))
                  .getText()
                  .toString();
          if (fd.fieldIsMandatory && capturedStr.equals("")) {
            isComplete = false;
          }
          record.valueString = capturedStr;
          record.displayStr = capturedStr;
          break;

        case FIELD_NUMBER:
          capturedStr =
              ((EditText) mCrmFieldViews.get(crmFieldIndex).findViewById(R.id.crm_text))
                  .getText()
                  .toString();
          float num = Float.parseFloat(capturedStr);
          record.valueFloat = num;
          if (num == Math.ceil(num)) {
            record.displayStr = String.valueOf((int) num);
          } else {
            record.displayStr = String.valueOf(num);
          }
          break;

        default:
          // non supporté => skip
          break;
      }

      crmFieldIndex++;
    }

    return isComplete;
  }