Dynamic Plan Documentation Template for Clinical SOAP Notes

Description and Instructions

This Text Blaze snippet serves as a template for creating the Plan section of a clinic SOAP note. It allows users to efficiently document differential diagnoses, investigations, treatments, follow-ups, and discussions tailored to a specific problem or complaint. By importing the template, users can customize the snippet for various clinical conditions while minimizing repetitive typing.


How to Use the Template

1. Plan Template Snippet:

  • Copy and save the Plan Template snippet to your Text Blaze dashboard.
  • This snippet includes placeholders for variables like differential diagnoses (Ddx), investigations, treatments, follow-ups, and discussed items.
  • Use dropdown menus and buttons to select or add options dynamically during note-taking.

2. Create Condition-Specific Snippets:

  • Import the Plan Template snippet into a new snippet.
  • Define the variable lists (e.g., differential diagnoses, treatments, investigations) for a specific condition.
  • Prepopulate selections (if desired) to save time during documentation.

3. Example Usage:

  • Refer to the Acute Sinusitis Snippet provided below the template.
  • The snippet imports the Plan Template and customizes the variables and initial selections for the condition "Acute Sinusitis."

4. Adjust Selections Dynamically:

  • Use dropdown menus to select from predefined lists or manually add new items.
  • Checkboxes let you include or exclude items from the final documentation dynamically.

5. Customize the Text:

  • Input additional details or notes for each section directly into the form fields.

Plan Template Snippet

This is the core template used for defining the plan. Ensure you copy it to your snippet library.

{note: preview=no; trim=yes}
Variables/Lists:
Ddx list: {run: ddx_list= [ ]}
Investigation list: {run: investigations_list = [ ]}
Treatment list: {run: tx_list = [ ]}
Follow-up list: {run: fu_list = [ ]}
Discussed list: {run: discussed_list = [ ]}
{endnote: trim=yes}
{formtext: name=problem} {note}{formtoggle: default=no; name=ddx}{endformtoggle}{formtoggle: name=textbox; default=yes}{endformtoggle} Include in plan: {formmenu: investigation; treatment; discussed; follow-up; multiple=yes; name=plan_selected}{endnote}{if: ddx}
Ddx: {formmenu: values={=ddx_list}; multiple=yes; name=ddx_selected}{note: trim=no; preview=yes} {formtext: name=ddx_add}{button: if ddx_add = ""
notify("ddx_add cannot be blank")
return
endif
ddx_selected = merge(ddx_selected, [ddx_add])
ddx_add = ""
; label=add}{button: ddx_selected = [ ]
; label=unselect all}{button: ddx_selected = ddx_list
; label=select all}{endnote}{endif}
{if: textbox}
{formparagraph: trim=no; name=problem_text}{endif}{if: includes(plan_selected, "investigation")}
Investigation: {note: trim=no}{formmenu: values={=investigations_list}; multiple=yes; name=investigations_selected} {formtext: name=investigation_add}{button: if investigation_add = ""
notify("investigation_add cannot be blank")
return
endif
investigations_selected = merge(investigations_selected, [investigation_add])
investigation_add = ""
; label=add}{button: investigations_selected = [ ]
; label=unselect all}{button: investigations_selected = investigations_list
; label=select all}{endnote}{if: count(investigations_selected) > 0}

  • {repeat: for investigation in investigations_selected}{=investigation}{formtoggle: default=no}- {formtext}{endformtoggle} {if: location(investigations_selected, investigation)<count(investigations_selected)}
  • {endif}{endrepeat}{endif}{endif}{if: includes(plan_selected, "treatment")}

Treatment: {note: trim=no}{formmenu: values={=tx_list}; multiple=yes; name=treatments_selected} {formtext: name=treatment_add}{button: if treatment_add = ""
notify("treatment_add cannot be blank")
return
endif
treatments_selected = merge(treatments_selected, [treatment_add])
treatment_add = ""
; label=add}{button: treatments_selected = [ ]
; label=unselect all}{button: treatments_selected = tx_list
; label=select all}{endnote}{if: count(treatments_selected) > 0}

  • {repeat: for tx in treatments_selected}{=tx}{formtoggle: default=no}- {formtext}{endformtoggle} {if: location(treatments_selected, tx)<count(treatments_selected)}
  • {endif}{endrepeat}{endif}{endif}{if: includes(plan_selected, "discussed")}

Discussed: {note: trim=no}{formmenu: values={=discussed_list}; multiple=yes; name=discussed_selected} {formtext: name=discussed_add}{button: if discussed_add = ""
notify("discussed_add cannot be blank")
return
endif
discussed_selected = merge(discussed_selected, [discussed_add])
discussed_add = ""
; label=add}{button: discussed_selected = [ ]
; label=unselect all}{button: discussed_selected = discussed_list
; label=select all}{endnote}{if: count(discussed_selected) > 0}

  • {repeat: for discuss in discussed_selected}{=discuss}{formtoggle: default=no}- {formtext}{endformtoggle} {if: location(discussed_selected, discuss)<count(discussed_selected)}
  • {endif}{endrepeat}{endif}{endif}{if: includes(plan_selected, "follow-up")}

Follow-up: {note: trim=no}{formmenu: values={=fu_list}; multiple=yes; name=fu_selected} {formtext: name=fu_add}{button: if fu_add = ""
notify("fu_add cannot be blank")
return
endif
fu_selected = merge(fu_selected, [fu_add])
fu_add = ""
; label=add}{button: fu_selected = [ ]
; label=unselect all}{button: fu_selected = fu_list
; label=select all}{endnote}{if: count(fu_selected) > 0}

  • {repeat: for fu in fu_selected}{=fu}{formtoggle: default=no}- {formtext}{endformtoggle} {if: location(fu_selected, fu)<count(fu_selected)}
  • {endif}{endrepeat}{endif}{endif}

Condition-Specific Example: Acute Sinusitis

Here’s an example snippet that uses the Plan Template and customizes it for "Sinus pain." This snippet is ready for use and can be easily modified for other conditions.

{note: preview=no; trim=yes}
Variables/Lists:
Ddx list: {ddx_list=["acute sinusitis", "chronic sinusitis", "viral URTI", "acute pharyngitis", "migraine"]}
Treatment list: {tx_list=["supportive care", "OTC meds", "normal saline rinse", "inhaled nasal steroid", "antibiotics"]}
Investigation list: {investigations_list=["X-Ray", "CT-sinus", "labs"]}
Follow-up list: {fu_list=["if no improvement in 1 week", "if worsening symptoms"]}
Discussed list: {discussed_list=["when to return to clinic / ER", "red flags"]}

Initial selections:
Problems selected: {run: problem = "Sinus pain"}
Toggle Ddx: {run: ddx = yes}
Ddx selected: {run: ddx_selected = ["acute sinusitis", "viral URTI"]}
Treatment selected: {run: treatments_selected = ["supportive care", "OTC meds", "normal saline rinse", "inhaled nasal steroid"]}
Investigations selected: {run: investigations_selected = [ ]}
Follow-up selected: {run: fu_selected = ["if no improvement in 1 week", "if worsening symptoms"]}
Plan selected: {run: plan_selected= ["treatment", "follow-up", "discussed"]}
Discussed selected: {run: discussed_selected = ["when to return to clinic / ER", "red flags"]}
{endnote: trim=yes}
{import: /template-plan; trim=yes}

This is what the resulting snippet would look like:

{note: preview=no; trim=yes}
Variables/Lists:
Ddx list: {ddx_list=["acute sinusitis", "chronic sinusitis", "viral URTI", "acute pharyngitis", "migraine"]}
Treatment list: {tx_list=["supportive care", "OTC meds", "normal saline rinse", "inhaled nasal steroid", "antibiotics"]}
Investigation list: {investigations_list=["X-Ray", "CT-sinus", "labs"]}
Follow-up list: {fu_list=["if no improvement in 1 week", "if worsening symptoms"]}
Discussed list: {discussed_list=["when to return to clinic / ER", "red flags"]}

Initial selections:
Problems selected: {run: problem = "Sinus pain"}
Toggle Ddx: {run: ddx = yes}
Ddx selected: {run: ddx_selected = ["acute sinusitis", "viral URTI"]}
Treatment selected: {run: treatments_selected = ["supportive care", "OTC meds", "normal saline rinse", "inhaled nasal steroid"]}
Investigations selected: {run: investigations_selected = [ ]}
Follow-up selected: {run: fu_selected = ["if no improvement in 1 week", "if worsening symptoms"]}
Plan selected: {run: plan_selected= ["treatment", "follow-up", "discussed"]}
Discussed selected: {run: discussed_selected = ["when to return to clinic / ER", "red flags"]}
{endnote: trim=yes}
{formtext: name=problem} {note}{formtoggle: default=no; name=ddx}{endformtoggle}{formtoggle: name=textbox; default=yes}{endformtoggle} Include in plan: {formmenu: investigation; treatment; discussed; follow-up; multiple=yes; name=plan_selected}{endnote}{if: ddx}
Ddx: {formmenu: values={=ddx_list}; multiple=yes; name=ddx_selected}{note: trim=no; preview=yes} {formtext: name=ddx_add}{button: if ddx_add = ""
notify("ddx_add cannot be blank")
return
endif
ddx_selected = merge(ddx_selected, [ddx_add])
ddx_add = ""
; label=add}{button: ddx_selected = [ ]
; label=unselect all}{button: ddx_selected = ddx_list
; label=select all}{endnote}{endif}
{if: textbox}
{formparagraph: trim=no; name=problem_text}{endif}{if: includes(plan_selected, "investigation")}
Investigation: {note: trim=no}{formmenu: values={=investigations_list}; multiple=yes; name=investigations_selected} {formtext: name=investigation_add}{button: if investigation_add = ""
notify("investigation_add cannot be blank")
return
endif
investigations_selected = merge(investigations_selected, [investigation_add])
investigation_add = ""
; label=add}{button: investigations_selected = [ ]
; label=unselect all}{button: investigations_selected = investigations_list
; label=select all}{endnote}{if: count(investigations_selected) > 0}

  • {repeat: for investigation in investigations_selected}{=investigation}{formtoggle: default=no}- {formtext}{endformtoggle} {if: location(investigations_selected, investigation)<count(investigations_selected)}
  • {endif}{endrepeat}{endif}{endif}{if: includes(plan_selected, "treatment")}

Treatment: {note: trim=no}{formmenu: values={=tx_list}; multiple=yes; name=treatments_selected} {formtext: name=treatment_add}{button: if treatment_add = ""
notify("treatment_add cannot be blank")
return
endif
treatments_selected = merge(treatments_selected, [treatment_add])
treatment_add = ""
; label=add}{button: treatments_selected = [ ]
; label=unselect all}{button: treatments_selected = tx_list
; label=select all}{endnote}{if: count(treatments_selected) > 0}

  • {repeat: for tx in treatments_selected}{=tx}{formtoggle: default=no}- {formtext}{endformtoggle} {if: location(treatments_selected, tx)<count(treatments_selected)}
  • {endif}{endrepeat}{endif}{endif}{if: includes(plan_selected, "discussed")}

Discussed: {note: trim=no}{formmenu: values={=discussed_list}; multiple=yes; name=discussed_selected} {formtext: name=discussed_add}{button: if discussed_add = ""
notify("discussed_add cannot be blank")
return
endif
discussed_selected = merge(discussed_selected, [discussed_add])
discussed_add = ""
; label=add}{button: discussed_selected = [ ]
; label=unselect all}{button: discussed_selected = discussed_list
; label=select all}{endnote}{if: count(discussed_selected) > 0}

  • {repeat: for discuss in discussed_selected}{=discuss}{formtoggle: default=no}- {formtext}{endformtoggle} {if: location(discussed_selected, discuss)<count(discussed_selected)}
  • {endif}{endrepeat}{endif}{endif}{if: includes(plan_selected, "follow-up")}

Follow-up: {note: trim=no}{formmenu: values={=fu_list}; multiple=yes; name=fu_selected} {formtext: name=fu_add}{button: if fu_add = ""
notify("fu_add cannot be blank")
return
endif
fu_selected = merge(fu_selected, [fu_add])
fu_add = ""
; label=add}{button: fu_selected = [ ]
; label=unselect all}{button: fu_selected = fu_list
; label=select all}{endnote}{if: count(fu_selected) > 0}

  • {repeat: for fu in fu_selected}{=fu}{formtoggle: default=no}- {formtext}{endformtoggle} {if: location(fu_selected, fu)<count(fu_selected)}
  • {endif}{endrepeat}{endif}{endif}

Future Plans: Incorporating Data Blaze

To make it even easier to define and manage lists (e.g., differential diagnoses, treatments, investigations), I plan to incorporate Data Blaze into this workflow. This integration will allow the lists to be dynamically pulled from a centralized database, removing the need to hard-code them into each snippet. This approach will streamline updates, ensure consistency across snippets, and provide a more scalable solution for managing clinical templates.

If you have questions or suggestions about this snippet, feel free to reply!

Note:

  • Full disclosure: I used ChatGPT to help write this post.
  • The snippet itself was written by me, using the Text Blaze documentation and valuable insights I’ve learned from forum members (special thanks to Scott!).
1 Like