/**
   * A user with update rights on the conference can set the totalDue to a different amount, but not
   * for his/her own registration.
   *
   * @param apiUpdatedRegistration - the values received from the client via web API
   * @param registrationEntityCopyOfApiRegistration - a database entity copied from
   *     apiUpdatedRegistration. this object will eventually be saved to DB
   * @param originalRegistrationEntity - a copy of the registrationEntity that is in the database at
   *     the time this update was requested
   * @param loggedInAdmin - the user who is logged in.
   */
  private void administratorOverrideTotalDue(
      Registration apiUpdatedRegistration,
      RegistrationEntity registrationEntityCopyOfApiRegistration,
      RegistrationEntity originalRegistrationEntity,
      CrsApplicationUser loggedInAdmin) {
    Preconditions.checkNotNull(originalRegistrationEntity);

    /* Get the original total due from either the originalRegistrationEntity (saved on a previous update)
     * or in regstrationEntityCopyOfApiRegistration (calculated on this updated)
     */
    BigDecimal originalTotalDue =
        originalRegistrationEntity.getTotalDue() != null
            ? originalRegistrationEntity.getTotalDue()
            : registrationEntityCopyOfApiRegistration.getTotalDue();

    /* If the updated registration's total due is null or zero, or if the updated registration
     * and original registraiton's total due match.. then no update is needed
     */
    if (apiUpdatedRegistration.getTotalDue() == null
        || apiUpdatedRegistration.getTotalDue().equals(new BigDecimal("0"))
        || apiUpdatedRegistration.getTotalDue().compareTo(originalTotalDue) == 0) return;

    authorizationService.authorizeConference(
        conferenceService.fetchConferenceBy(apiUpdatedRegistration.getConferenceId()),
        OperationType.UPDATE,
        loggedInAdmin);

    registrationEntityCopyOfApiRegistration.setTotalDue(apiUpdatedRegistration.getTotalDue());
  }
  private void ensureStoredValuesDontGetErased(
      RegistrationEntity registrationEntityCopyOfApiRegistration,
      RegistrationEntity originalRegistrationEntity) {
    if (registrationEntityCopyOfApiRegistration.getCompletedTimestamp() == null
        && originalRegistrationEntity.getCompletedTimestamp() != null) {
      registrationEntityCopyOfApiRegistration.setCompletedTimestamp(
          originalRegistrationEntity.getCompletedTimestamp());
    }

    if (registrationEntityCopyOfApiRegistration.getTotalDue() == null
        && originalRegistrationEntity.getTotalDue() != null) {
      registrationEntityCopyOfApiRegistration.setTotalDue(originalRegistrationEntity.getTotalDue());
    }
  }