solveguide / solveguide

Solve Guide is meant to help individuals and groups resolve conflicts faster
https://solve.guide
1 stars 0 forks source link

[FEATURE] SMART Solves #92

Open solveguide opened 2 months ago

solveguide commented 2 months ago

BDD Scenario

Scenario: 
  Given [context]
  When [event]
  Then [outcome]

Description

After a solve has been confirmed but before the Solve Summary is displayed, the user will be prompted to enter information about the solve to make it actionable and specific.

Solutions will have types: Resolution - An agreement with yourself Discussion - The issue is solved by sharing information you have or need. Meeting - The issue is solved by making a group decision. Action Item - The issue is solved by accomplishing defined tasks.

Specific

Assign a specific stakeholder (with an option to assign to someone else?) I'd recommend that a stakeholder own the solve, even if they are delegating parts of it.

Include an action item check list?

Measurable

This will be pre-populated with the seed-statement and or root issue. Perhaps the users should be asked if this solve is expected to resolve the root issue completely, partially, or as a prerequisite.

Depending on the answer, ask the user how they will know if it worked.

Achievable

Make this only enabled once everything else is set. The assigned user should affirm they can achieve it.

Relevant

This is handled by including the seed-statement & root issue in the measurable section.

Time-bound

Due Date (Look at Tusk to think about the various types of task shapes)

User Story

As a [type of user], I want [some goal] so that [some reason].

Design & Copy Requirements

Design Details

If design is required, add initial design notes here or attach files.

Copy Details

If copywriting is needed, specify the text or content changes here.

solveguide commented 2 months ago
enum SolutionType {
  resolution,
  discussion,
  meeting,
  actionItem,
}

class ActionItem {
  final String description;
  bool isCompleted;

  ActionItem({
    required this.description,
    this.isCompleted = false,
  });

  // Convert an ActionItem to a Map
  Map<String, dynamic> toJson() => {
        'description': description,
        'isCompleted': isCompleted,
      };

  // Create an ActionItem from a Map
  factory ActionItem.fromJson(Map<String, dynamic> json) => ActionItem(
        description: json['description'],
        isCompleted: json['isCompleted'] ?? false,
      );
}

class Solution {
  final String desc;
  bool isSolve;
  int rank;
  List<String>? provenIssueIds;
  List<String>? disprovenIssueIds;
  SolutionType type;
  String stakeholder;
  List<ActionItem>? actionItems;
  String measurableOutcome;
  bool isExpectedToResolveCompletely;
  String successCriteria;
  bool isAchievableConfirmed;
  DateTime? dueDate;

  Solution({
    required this.desc,
    this.isSolve = false,
    this.rank = 0,
    this.provenIssueIds = const [],
    this.disprovenIssueIds = const [],
    required this.type,
    required this.stakeholder,
    this.actionItems = const [],
    required this.measurableOutcome,
    this.isExpectedToResolveCompletely = false,
    required this.successCriteria,
    this.isAchievableConfirmed = false,
    this.dueDate,
  });

  // Convert a Solution to a Map
  Map<String, dynamic> toJson() => {
        'desc': desc,
        'isSolve': isSolve,
        'rank': rank,
        'provenIssueIds': provenIssueIds,
        'disprovenIssueIds': disprovenIssueIds,
        'type': type.index,
        'stakeholder': stakeholder,
        'actionItems': actionItems?.map((item) => item.toJson()).toList(),
        'measurableOutcome': measurableOutcome,
        'isExpectedToResolveCompletely': isExpectedToResolveCompletely,
        'successCriteria': successCriteria,
        'isAchievableConfirmed': isAchievableConfirmed,
        'dueDate': dueDate?.toIso8601String(),
      };

  // Create a Solution from a Map
  factory Solution.fromJson(Map<String, dynamic> json) => Solution(
        desc: json['desc'],
        isSolve: json['isSolve'] ?? false,
        rank: json['rank'] ?? 0,
        provenIssueIds: List<String>.from(json['provenIssueIds'] ?? []),
        disprovenIssueIds: List<String>.from(json['disprovenIssueIds'] ?? []),
        type: SolutionType.values[json['type'] ?? 0],
        stakeholder: json['stakeholder'] ?? '',
        actionItems: (json['actionItems'] as List<dynamic>?)
            ?.map((item) => ActionItem.fromJson(item))
            .toList(),
        measurableOutcome: json['measurableOutcome'] ?? '',
        isExpectedToResolveCompletely:
            json['isExpectedToResolveCompletely'] ?? false,
        successCriteria: json['successCriteria'] ?? '',
        isAchievableConfirmed: json['isAchievableConfirmed'] ?? false,
        dueDate: json['dueDate'] != null
            ? DateTime.parse(json['dueDate'])
            : null,
      );
}