@Override
  public SupplierUpdatedInfoDto<CompanyExtraQuality> getNewCompanyExtraQuality(
      Long userId, CompanyExtraQuality oldCompanyExtraQuality) {

    SupplierUpdatedInfoDto<CompanyExtraQuality> supplierUpdatedInfoDto =
        new SupplierUpdatedInfoDto<CompanyExtraQuality>();
    Map<String, Object> oldValues = Maps.newHashMap();

    boolean qualityChanged =
        supplierChangedInfoRedisDao.tabInfoChanged(userId, ChangedInfoKeys.qualityTab());
    if (!qualityChanged) {
      supplierUpdatedInfoDto.setSupplierInfo(oldCompanyExtraQuality);
      supplierUpdatedInfoDto.setOldValues(oldValues);
      return supplierUpdatedInfoDto;
    }

    Map<String, String> changedInfo = supplierChangedInfoRedisDao.getChangedInfos(userId);

    CompanyExtraQuality newCompanyExtraQuality = new CompanyExtraQuality();
    BeanMapper.copy(oldCompanyExtraQuality, newCompanyExtraQuality);

    if (changedInfo.containsKey(ChangedInfoKeys.qualityRohsId())) {
      newCompanyExtraQuality.setRohsId(changedInfo.get(ChangedInfoKeys.qualityRohsId()));
      oldValues.put(ChangedInfoKeys.qualityRohsId(), oldCompanyExtraQuality.getRohsId());
    }
    if (changedInfo.containsKey(ChangedInfoKeys.qualityRohsAttachUrl())) {
      newCompanyExtraQuality.setRohsAttachUrl(
          changedInfo.get(ChangedInfoKeys.qualityRohsAttachUrl()));
      oldValues.put(
          ChangedInfoKeys.qualityRohsAttachUrl(), oldCompanyExtraQuality.getRohsAttachUrl());
    }
    if (changedInfo.containsKey(ChangedInfoKeys.qualityRohsValidDate())) {
      String rohsValidDate = changedInfo.get(ChangedInfoKeys.qualityRohsValidDate());
      newCompanyExtraQuality.setRohsValidDate(DateTime.parse(rohsValidDate, FORMATTER).toDate());
      oldValues.put(
          ChangedInfoKeys.qualityRohsValidDate(), oldCompanyExtraQuality.getRohsValidDate());
    }

    if (changedInfo.containsKey(ChangedInfoKeys.qualityISO9001Id())) {
      newCompanyExtraQuality.setIso9001Id(changedInfo.get(ChangedInfoKeys.qualityISO9001Id()));
      oldValues.put(ChangedInfoKeys.qualityISO9001Id(), oldCompanyExtraQuality.getIso9001Id());
    }
    if (changedInfo.containsKey(ChangedInfoKeys.qualityISO9001AttachUrl())) {
      newCompanyExtraQuality.setIso9001AttachUrl(
          changedInfo.get(ChangedInfoKeys.qualityISO9001AttachUrl()));
      oldValues.put(
          ChangedInfoKeys.qualityISO9001AttachUrl(), oldCompanyExtraQuality.getIso9001AttachUrl());
    }
    if (changedInfo.containsKey(ChangedInfoKeys.qualityISO9001ValidDate())) {
      String iso900ValidDate = changedInfo.get(ChangedInfoKeys.qualityISO9001ValidDate());
      newCompanyExtraQuality.setIso9001ValidDate(
          DateTime.parse(iso900ValidDate, FORMATTER).toDate());
      oldValues.put(
          ChangedInfoKeys.qualityISO9001ValidDate(), oldCompanyExtraQuality.getIso9001ValidDate());
    }

    if (changedInfo.containsKey(ChangedInfoKeys.qualityISO14001Id())) {
      newCompanyExtraQuality.setIso14001Id(changedInfo.get(ChangedInfoKeys.qualityISO14001Id()));
      oldValues.put(ChangedInfoKeys.qualityISO14001Id(), oldCompanyExtraQuality.getIso14001Id());
    }
    if (changedInfo.containsKey(ChangedInfoKeys.qualityISO14001AttachUrl())) {
      newCompanyExtraQuality.setIso14001AttachUrl(
          changedInfo.get(ChangedInfoKeys.qualityISO14001AttachUrl()));
      oldValues.put(
          ChangedInfoKeys.qualityISO14001AttachUrl(),
          oldCompanyExtraQuality.getIso14001AttachUrl());
    }
    if (changedInfo.containsKey(ChangedInfoKeys.qualityISO14001ValidDate())) {
      String iso1400ValidDate = changedInfo.get(ChangedInfoKeys.qualityISO14001ValidDate());
      newCompanyExtraQuality.setIso14001ValidDate(
          DateTime.parse(iso1400ValidDate, FORMATTER).toDate());
      oldValues.put(
          ChangedInfoKeys.qualityISO14001ValidDate(),
          oldCompanyExtraQuality.getIso14001ValidDate());
    }

    if (changedInfo.containsKey(ChangedInfoKeys.qualityTS16949Id())) {
      newCompanyExtraQuality.setTs16949Id(changedInfo.get(ChangedInfoKeys.qualityTS16949Id()));
      oldValues.put(ChangedInfoKeys.qualityTS16949Id(), oldCompanyExtraQuality.getTs16949Id());
    }
    if (changedInfo.containsKey(ChangedInfoKeys.qualityTS16949AttachUrl())) {
      newCompanyExtraQuality.setTs16949AttachUrl(
          changedInfo.get(ChangedInfoKeys.qualityTS16949AttachUrl()));
      oldValues.put(
          ChangedInfoKeys.qualityTS16949AttachUrl(), oldCompanyExtraQuality.getTs16949AttachUrl());
    }
    if (changedInfo.containsKey(ChangedInfoKeys.qualityTS16949ValidDate())) {
      String ts16949ValidDate = changedInfo.get(ChangedInfoKeys.qualityTS16949ValidDate());
      newCompanyExtraQuality.setTs16949ValidDate(
          DateTime.parse(ts16949ValidDate, FORMATTER).toDate());
      oldValues.put(
          ChangedInfoKeys.qualityTS16949ValidDate(), oldCompanyExtraQuality.getTs16949ValidDate());
    }

    supplierUpdatedInfoDto.setSupplierInfo(newCompanyExtraQuality);
    supplierUpdatedInfoDto.setOldValues(oldValues);
    return supplierUpdatedInfoDto;
  }
  @Override
  public SupplierInfoChangedDto qualityChanged(
      Long userId, CompanyExtraQuality updatedQuality, CompanyExtraQuality oldQuality) {
    SupplierInfoChangedDto supplierInfoChangedDto = new SupplierInfoChangedDto();

    CompanyExtraQuality newQuality =
        getNewCompanyExtraQuality(userId, oldQuality).getSupplierInfo();

    Map<String, String> changedInfo = Maps.newHashMap();

    if (!Objects.equal(updatedQuality.getRohsId(), newQuality.getRohsId())) {
      changedInfo.put(ChangedInfoKeys.qualityRohsId(), updatedQuality.getRohsId());
      updatedQuality.setRohsId(null);
    }
    if (!Objects.equal(updatedQuality.getRohsAttachUrl(), newQuality.getRohsAttachUrl())) {
      changedInfo.put(ChangedInfoKeys.qualityRohsAttachUrl(), updatedQuality.getRohsAttachUrl());
      updatedQuality.setRohsAttachUrl(null);
    }

    if (updatedQuality.getRohsValidDate() != null) {
      DateTime updatedRohsValidDate = new DateTime(updatedQuality.getRohsValidDate());
      if (newQuality.getRohsValidDate() == null) {
        changedInfo.put(
            ChangedInfoKeys.qualityRohsValidDate(), updatedRohsValidDate.toString(FORMATTER));
        updatedQuality.setRohsValidDate(null);
      } else {
        DateTime oldRohsValidDate = new DateTime(newQuality.getRohsValidDate());
        if (!updatedRohsValidDate.equals(oldRohsValidDate)) {
          changedInfo.put(
              ChangedInfoKeys.qualityRohsValidDate(), updatedRohsValidDate.toString(FORMATTER));
          updatedQuality.setRohsValidDate(null);
        }
      }
    }

    if (!Objects.equal(updatedQuality.getIso9001Id(), newQuality.getIso9001Id())) {
      changedInfo.put(ChangedInfoKeys.qualityISO9001Id(), updatedQuality.getIso9001Id());
      updatedQuality.setIso9001Id(null);
    }
    if (!Objects.equal(updatedQuality.getIso9001AttachUrl(), newQuality.getIso9001AttachUrl())) {
      changedInfo.put(
          ChangedInfoKeys.qualityISO9001AttachUrl(), updatedQuality.getIso9001AttachUrl());
      updatedQuality.setIso9001AttachUrl(null);
    }

    if (updatedQuality.getIso9001ValidDate() != null) {
      DateTime updatedIso9001ValidDate = new DateTime(updatedQuality.getIso9001ValidDate());
      if (newQuality.getIso9001ValidDate() == null) {
        changedInfo.put(
            ChangedInfoKeys.qualityISO9001ValidDate(), updatedIso9001ValidDate.toString(FORMATTER));
        updatedQuality.setIso9001ValidDate(null);
      } else {
        DateTime oldIso9001ValidDate = new DateTime(newQuality.getIso9001ValidDate());
        if (!updatedIso9001ValidDate.equals(oldIso9001ValidDate)) {
          changedInfo.put(
              ChangedInfoKeys.qualityISO9001ValidDate(),
              updatedIso9001ValidDate.toString(FORMATTER));
          updatedQuality.setIso9001ValidDate(null);
        }
      }
    }

    if (!Objects.equal(updatedQuality.getIso14001Id(), newQuality.getIso14001Id())) {
      changedInfo.put(ChangedInfoKeys.qualityISO14001Id(), updatedQuality.getIso14001Id());
      updatedQuality.setIso14001Id(null);
    }
    if (!Objects.equal(updatedQuality.getIso14001AttachUrl(), newQuality.getIso14001AttachUrl())) {
      changedInfo.put(
          ChangedInfoKeys.qualityISO14001AttachUrl(), updatedQuality.getIso14001AttachUrl());
      updatedQuality.setIso14001AttachUrl(null);
    }

    if (updatedQuality.getIso14001ValidDate() != null) {
      DateTime updatedIso14001ValidDate = new DateTime(updatedQuality.getIso14001ValidDate());
      if (newQuality.getIso14001ValidDate() == null) {
        changedInfo.put(
            ChangedInfoKeys.qualityISO14001ValidDate(),
            updatedIso14001ValidDate.toString(FORMATTER));
        updatedQuality.setIso14001ValidDate(null);
      } else {
        DateTime oldIso14001ValidDate = new DateTime(newQuality.getIso14001ValidDate());
        if (!updatedIso14001ValidDate.equals(oldIso14001ValidDate)) {
          changedInfo.put(
              ChangedInfoKeys.qualityISO14001ValidDate(),
              updatedIso14001ValidDate.toString(FORMATTER));
          updatedQuality.setIso14001ValidDate(null);
        }
      }
    }

    if (!Objects.equal(updatedQuality.getTs16949Id(), newQuality.getTs16949Id())) {
      changedInfo.put(ChangedInfoKeys.qualityTS16949Id(), updatedQuality.getTs16949Id());
      updatedQuality.setTs16949Id(null);
    }
    if (!Objects.equal(updatedQuality.getTs16949AttachUrl(), newQuality.getTs16949AttachUrl())) {
      changedInfo.put(
          ChangedInfoKeys.qualityTS16949AttachUrl(), updatedQuality.getTs16949AttachUrl());
      updatedQuality.setTs16949AttachUrl(null);
    }

    if (updatedQuality.getTs16949ValidDate() != null) {
      DateTime updatedTs16949ValidDate = new DateTime(updatedQuality.getTs16949ValidDate());
      if (newQuality.getTs16949ValidDate() == null) {
        changedInfo.put(
            ChangedInfoKeys.qualityTS16949ValidDate(), updatedTs16949ValidDate.toString(FORMATTER));
        updatedQuality.setTs16949ValidDate(null);
      } else {
        DateTime oldTs16949ValidDate = new DateTime(newQuality.getTs16949ValidDate());
        if (!updatedTs16949ValidDate.equals(oldTs16949ValidDate)) {
          changedInfo.put(
              ChangedInfoKeys.qualityTS16949ValidDate(),
              updatedTs16949ValidDate.toString(FORMATTER));
          updatedQuality.setTs16949ValidDate(null);
        }
      }
    }

    if (!changedInfo.isEmpty()) {
      supplierInfoChangedDto.setChanged(true);
      supplierInfoChangedDto.setChangedInfo(changedInfo);
    }
    return supplierInfoChangedDto;
  }