anchor.diff:  
   Can't place this concept - synonym Woodwardia aspera (R.Br.) Mett. is part of accepted concept
   Doodia aspera R.Br.CHAH (2014), Australian Plant Census
  +
  +== Fixup edits
  +
  +We need to be able to edit past annotations and possibly synonomy that have been erroneously entered. These minor edits
  +are considered errata to a published tree (see https://www.anbg.gov.au/25jira/browse/NSL-2550[NSL-2550]).
  +
  +.From NSL-2550 Kirsten Kowley
  +----
  +    We would like the following to be included in "minor edits":
  +    1. deletion or edit of distribution
  +    2. deletion or edit of comment
  +    3. addition of a basionym
  +    4. addition of autonyms
  +    5. addition of orthographic variants
  +    6. addition of isonyms
  +
  +    We do not consider any of these to be a change of concept and therefore do not need a new instance.
  +
  +    We like the idea of having to provide a reason for the change and would like to suggest the following:
  +    1. Change in distribution
  +    2. Comment deleted
  +    3. Comment edited
  +    4. Basionym added
  +    5. Autonym added
  +    6. Orthographic variant added
  +    7. Isonym added
  +----
  +
  +Presenting the User Interface for making a fix like these needs to be consistent across the types of change and obvious
  +that you are changing the historical data.
  +
  +Accessing the historical data such as the Distribution and Comment data in the editor will potentially be a challenge as
  +they may be stored in older versions. We currently only edit the current version and a draft. It would be logical to use
  +previously used instances as the vector to the previous versions in the editor, as that works in a similar way to the
  +previous use of Instance Notes to provide this information.
  +
  +icon:question-circle[2x, role='yellow'] | Not an immediate problem, but: How do we handle other attributes people may need to edit for different trees?
  
positive.code: [source:groovy]
  .Validate New Element Placement groovy
  ----
     protected List<String> validateNewElementPlacement(TreeVersionElement parentElement, TaxonData taxonData) {
  
          TreeVersion treeVersion = parentElement.treeVersion
  
          List<String> warnings = checkNameValidity(taxonData)   // test 1
          checkInstanceOnTree(taxonData, treeVersion)            // test 2
          checkNameAlreadyOnTree(taxonData, treeVersion)         // test 3
  
          NameRank taxonRank = NameRank.findByName(taxonData.rank)
          NameRank parentRank = NameRank.findByName(parentElement.treeElement.rank)
  
          //is rank below parent                                 // test 4
          if (!RankUtils.rankHigherThan(parentRank, taxonRank)) {
              throw new BadArgumentsException("Name $taxonData.simpleName of rank $taxonRank.name is not below rank $parentRank.name of $parentElement.treeElement.simpleName.")
          }
  
          //polynomials must be placed under parent              // test 5
          checkPolynomialsBelowNameParent(taxonData.simpleName, taxonData.excluded, taxonRank, parentElement.namePath.split('/'))
          checkSynonymsOfThisTaxonNotOnTree(taxonData, treeVersion) // test 6
          checkForExistingSynonyms(taxonData, treeVersion, [])      // test 7
  
          return warnings
      }
  
  ----
  
negative.code: = Tree Placement and Editing Rules
  v1.0, March 2018
  :imagesdir: resources/images/
  :toc: left
  