private UserPolicyAnswersHistoryRecord CopyForHistory(UserPolicyAnswersRecord originalRecord) { UserPolicyAnswersHistoryRecord recordForHistory = new UserPolicyAnswersHistoryRecord(); recordForHistory.Accepted = originalRecord.Accepted; recordForHistory.AnswerDate = originalRecord.AnswerDate; recordForHistory.EndValidity = DateTime.UtcNow.AddSeconds(-1); recordForHistory.PolicyTextInfoPartRecord = originalRecord.PolicyTextInfoPartRecord; recordForHistory.UserPolicyPartRecord = originalRecord.UserPolicyPartRecord; recordForHistory.UserPartRecord = originalRecord.UserPartRecord; return(recordForHistory); }
public void PolicyForItemUpdate(PolicyForUserViewModel viewModel, ContentItem item) { if (item.As <UserPolicyPart>() == null) { return; // if the content item has not the UserPolicyPart, i cannot save the answers, so we skip the update. } UserPolicyAnswersRecord record = null; var currentUser = _workContext.GetContext().CurrentUser; UserPartRecord currentUserPartRecord = null; if (currentUser != null) { currentUserPartRecord = currentUser.ContentItem.As <UserPart>().Record; } else if (item.ContentType == "User") { // in fase di registrazione di un nuovo utente currentUserPartRecord = item.As <UserPart>().Record; } // Recupero la risposta precedente, se esiste if (viewModel.AnswerId > 0) { record = _userPolicyAnswersRepository.Get(viewModel.AnswerId); } else { record = _userPolicyAnswersRepository.Table.Where(w => w.PolicyTextInfoPartRecord.Id == viewModel.PolicyTextId && w.UserPolicyPartRecord.Id == item.Id).SingleOrDefault(); } bool oldAnswer = record != null ? record.Accepted : false; // Entro nella funzione solo se il valore della nuova risposta è diverso da quello della precedente o se si tratta della prima risposta if ((oldAnswer != viewModel.Accepted) || (record == null)) { var policyText = _contentManager.Get <PolicyTextInfoPart>(viewModel.PolicyTextId).Record; if ((policyText.UserHaveToAccept && viewModel.Accepted) || !policyText.UserHaveToAccept) { var shouldCreateRecord = false; if (item != null) { if (viewModel.AnswerId <= 0 && record == null) { record = new UserPolicyAnswersRecord(); shouldCreateRecord = true; } UserPolicyAnswersHistoryRecord recordForHistory = CopyForHistory(record); //date and user should be updated only if it is a new record, or the answer has actually changed record.AnswerDate = (shouldCreateRecord || oldAnswer != viewModel.Accepted) ? DateTime.UtcNow : record.AnswerDate; if (shouldCreateRecord || oldAnswer != viewModel.Accepted) { if (currentUserPartRecord == null && viewModel.UserId.HasValue) { // utilizza il valore del viewModel var userPart = _contentManager.Get <UserPart>(viewModel.UserId.Value); currentUserPartRecord = (userPart == null) ? null : userPart.Record; } record.UserPartRecord = currentUserPartRecord; } record.Accepted = viewModel.Accepted; record.UserPolicyPartRecord = item.As <UserPolicyPart>().Record; record.PolicyTextInfoPartRecord = policyText; if (shouldCreateRecord) { _userPolicyAnswersRepository.Create(record); _policyEventHandler.PolicyChanged(new PolicyEventViewModel { policyType = record.PolicyTextInfoPartRecord.PolicyType, accepted = record.Accepted, ItemPolicyPartRecordId = item.Id }); } else if (record.Accepted != recordForHistory.Accepted) { _userPolicyAnswersHistoryRepository.Create(recordForHistory); _userPolicyAnswersRepository.Update(record); _policyEventHandler.PolicyChanged(new PolicyEventViewModel { policyType = record.PolicyTextInfoPartRecord.PolicyType, accepted = record.Accepted, ItemPolicyPartRecordId = item.Id }); } } } else if (policyText.UserHaveToAccept && !viewModel.Accepted && record != null) { UserPolicyAnswersHistoryRecord recordForHistory = CopyForHistory(record); _userPolicyAnswersHistoryRepository.Create(recordForHistory); _userPolicyAnswersRepository.Delete(record); _policyEventHandler.PolicyChanged(new PolicyEventViewModel { policyType = recordForHistory.PolicyTextInfoPartRecord.PolicyType, accepted = false, ItemPolicyPartRecordId = item.Id }); } } }