<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title></title>
  <subtitle></subtitle>
  <id>https://www.endpointdev.com/blog/tags/epitrax/</id>
  <link href="https://www.endpointdev.com/blog/tags/epitrax/"/>
  <link href="https://www.endpointdev.com/blog/tags/epitrax/" rel="self"/>
  <updated>2024-06-03T00:00:00+00:00</updated>
  <author>
    <name>End Point Dev</name>
  </author>
  
    <entry>
      <title>End Point’s CasePointer business acquired by Deloitte</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2024/06/casepointer-acquired-by-deloitte/"/>
      <id>https://www.endpointdev.com/blog/2024/06/casepointer-acquired-by-deloitte/</id>
      <published>2024-06-03T00:00:00+00:00</published>
      <author>
        <name>Rick Peltzman</name>
      </author>
      <content type="html">
        &lt;p&gt;We are proud to announce that Deloitte has acquired the industry-leading public health disease surveillance business, CasePointer, from End Point Corporation as of June 1, 2024. This acquisition brings to Deloitte, End Point’s experienced and skilled software engineers, cloud developers, DevOps engineers, epidemiologists, and former public health officials.&lt;/p&gt;
&lt;p&gt;Since 2008, End Point’s CasePointer business has worked with open-source public health software to modernize tools, automate processes, improve the user experience, and provide better return on investment to state and local public health agencies for their disease surveillance and epidemiologic needs.&lt;/p&gt;
&lt;p&gt;Jon Jensen, End Point’s former chief technical officer, has joined Deloitte with this transaction. He said: “We are excited to work with Deloitte’s team of professionals and serve their broad client base. Together, we expect to make an even greater impact for government health organizations.”&lt;/p&gt;
&lt;p&gt;Deloitte is only acquiring assets, clients, and personnel related to End Point’s CasePointer business. All other business lines remain with End Point, including systems administration, database engineering, e-commerce programming, application development, and our immersive GIS platform, VisionPort.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;https://www.deloitte.com/us/en/Industries/government-public/about/public-health-transformation.html&#34;&gt;Deloitte’s Public Health Transformation&lt;/a&gt; website for further information.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Achieving Healthcare Data Interoperability</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2023/07/achieving-healthcare-data-interoperability/"/>
      <id>https://www.endpointdev.com/blog/2023/07/achieving-healthcare-data-interoperability/</id>
      <published>2023-07-28T00:00:00+00:00</published>
      <author>
        <name>Jarrett Smolarkiewicz</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2023/07/achieving-healthcare-data-interoperability/a_stream_running_between_houses_and_a_road.webp&#34; alt=&#34;An impressionist watercolor scene of two red-roofed farm houses with a tree-lined path leading forward on the left side of the image. The brushstrokes are very loose.&#34;&gt;&lt;/p&gt;
&lt;!-- Image: Johan Barthold Jongkind, A Stream Running between Houses and a Road, 19th century. Public domain under CC0. --&gt;
&lt;p&gt;(Co-authored by &lt;a href=&#34;/team/jon-jensen/&#34;&gt;Jon Jensen&lt;/a&gt;.)&lt;/p&gt;
&lt;h3 id=&#34;background&#34;&gt;Background&lt;/h3&gt;
&lt;p&gt;For many years, healthcare providers, public health experts, and software developers have been hard at work on standards and methods for interconnecting systems to share vast and ever-expanding patient and lab data.&lt;/p&gt;
&lt;p&gt;In the late 1980s the non-profit organization Health Level Seven International released the HL7 data standard. That was updated many times up to the year 2007 with &lt;a href=&#34;https://www.hl7.org/implement/standards/product_brief.cfm?product_id=144&#34;&gt;HL7 v2.5.1&lt;/a&gt; which is still widely used today.&lt;/p&gt;
&lt;p&gt;New healthcare data standards have emerged, including &lt;a href=&#34;https://www.hl7.org/implement/standards/product_section.cfm?section=14&#34;&gt;HL7 v3&lt;/a&gt;, the Consolidated Clinical Document Architecture (&lt;a href=&#34;https://www.hl7.org/implement/standards/product_brief.cfm?product_id=492&#34;&gt;C-CDA&lt;/a&gt;), the Fast Healthcare Interoperability Resource (&lt;a href=&#34;https://www.hl7.org/implement/standards/product_brief.cfm?product_id=491&#34;&gt;FHIR&lt;/a&gt;, pronounced &amp;ldquo;fire&amp;rdquo;), and more. These are not yet as broadly adopted as HL7 v2.5.1.&lt;/p&gt;
&lt;p&gt;Under the Health Insurance Portability and Accountability Act of 1996 (&lt;a href=&#34;https://www.hhs.gov/sites/default/files/ocr/privacy/hipaa/understanding/consumers/privacy-security-electronic-records.pdf&#34;&gt;HIPAA&lt;/a&gt;), most of this data is classified as PII (personally identifiable information) and/or PHI (personal health information) and must be kept secure and protected at all times, so that it will not be accessed without proper authorization or patient consent.&lt;/p&gt;
&lt;h3 id=&#34;the-data-dilemma&#34;&gt;The data dilemma&lt;/h3&gt;
&lt;p&gt;Healthcare data systems now routinely communicate in many ways, but there are sometimes incompatibilities when patient data travels from one system to another.&lt;/p&gt;
&lt;p&gt;The U.S. Centers for Disease Control (CDC) encourages and sometimes incentivizes, but does not mandate, adoption and implementation of common standards. So each jurisdiction&amp;rsquo;s public health agency (PHA), lab, and vendor may be using different and only partially overlapping standards.&lt;/p&gt;
&lt;p&gt;Different labs, doctors, and public health workers use varying conventions for things like facility names and lab codes, which presents problems for interpreting and reporting data. For example, “KU MAIN” may be recognized as the main campus of the University of Kansas Medical Center in nearby communities or states, while providers elsewhere may not recognize this code, or may mistake it for a similarly named facility in their area. The University of Kansas Health System consists of a large network of satellite facilities that span the states of Kansas and Missouri, rather than just one location in a single state. This may create additional confusion about which state jurisdictions should be involved.&lt;/p&gt;
&lt;p&gt;This semantic category is called a vocabulary, and if two systems use incompatible vocabulary, one of them, or an intermediary, must have a mapping from the terms in one vocabulary to another.&lt;/p&gt;
&lt;p&gt;The syntactic category of challenge is called a grammar, and covers the kinds of message types and actions a system works with.&lt;/p&gt;
&lt;p&gt;An article published in December 2022 by Dr. Naheed Ali identifies “inconsistent data and lack of standardized data structure” as the number one issue to be overcome regarding the &lt;a href=&#34;https://www.healthit.gov/faq/what-electronic-health-record-ehr&#34;&gt;Electronic Health Record (EHR)&lt;/a&gt; interoperability challenges facing healthcare professions today:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One of the biggest EHR interoperability challenges in healthcare interoperability is managing inconsistent data from multiple sources. Information stored in different databases can have a variety of formats and data types that are not easily compatible with one another. A single record may contain different information about a patient&amp;rsquo;s medical history or treatment plan, making it more difficult for different systems to interpret correctly.
—Dr. Naheed Ali, &lt;a href=&#34;https://www.ehrinpractice.com/ehr-interoperability-challenges-solutions.html&#34;&gt;EHR Interoperability Challenges and Solutions&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;cooperating-for-a-healthier-future&#34;&gt;Cooperating for a healthier future&lt;/h3&gt;
&lt;p&gt;Although great strides have been made to digitize healthcare data and improve interoperability, much remains to be done. Newer standards (like HL7 FHIR, released in 2014) face an uphill battle for industry adoption to become as widely utilized as HL7 v2.5.1 (from 2007) and C-CDA (from 2011).&lt;/p&gt;
&lt;p&gt;While networks of hospitals and laboratories typically set up EHR platforms built by companies like Cerner or Epic to manage patient data, public health agencies require additional applications to aid in the identification, tracking, and reporting of reportable health conditions from those patient EHRs.&lt;/p&gt;
&lt;p&gt;Public health services in the United States are provided by various federal, state, tribal, territorial, regional, municipal, and other bodies that decide which software they will use to support their communities. Some look to software offered by the CDC or software firms to provide the application functions they require. Others contract with consulting firms to develop custom software. Still others opt to develop and maintain everything in house.&lt;/p&gt;
&lt;p&gt;Getting so many diverse software systems to work together is difficult due to a phenomenon known as the quadratic cost problem. This occurs when the need for bi-directional connections between software applications increases exponentially, instead of linearly, with each component added to a system.&lt;/p&gt;
&lt;p&gt;An organization called TechChange explains this concept and more in their video &lt;a href=&#34;https://www.youtube.com/watch?v=KSEUh-wj7Y0&#34;&gt;Standards and Interoperability in Digital Health: Explained&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The book &lt;a href=&#34;https://www.ncbi.nlm.nih.gov/books/NBK216088/&#34;&gt;Patient Safety: Achieving a New Standard for Care&lt;/a&gt; identifies in chapter 4 this concern:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The fact that there is no standard means of representing the data for any of these datasets or requirements is astonishing and highlights the amount of unnecessary work performed by health care and regulatory organizations to prepare, transmit, and use what amount to custom reports.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Nearly 20 years after those words were written, and almost a decade after the FHIR standard was introduced, the variety of standards and systems has not narrowed. Change is difficult.&lt;/p&gt;
&lt;h3 id=&#34;health-information-exchanges&#34;&gt;Health Information Exchanges&lt;/h3&gt;
&lt;p&gt;One architectural attempt to simplify data sharing is by connecting applications of each jurisdictional segment within a larger governing body to a centralized &lt;a href=&#34;https://www.healthit.gov/topic/health-it-and-health-information-exchange-basics/what-hie&#34;&gt;Health Information Exchange (HIE)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;An example of this would be an individual state public health organization connecting its own software to an HIE, along with the software currently in use by each local jurisdiction within that state. Each jurisdiction does not have to use the same software, but can communicate by using its connection to the HIE rather than individual bi-directional connections to every other application used throughout the state.&lt;/p&gt;
&lt;p&gt;This sounds like just what is needed, and likely is for some use cases.&lt;/p&gt;
&lt;p&gt;But HIEs generally work at the syntactic (grammar) level. Many HIEs have agreements with the facilities they serve, that they will not change the content of messages in any way. Unfortunately that means most HIEs essentially work as a passthrough.&lt;/p&gt;
&lt;p&gt;They thus are helpless when it comes to the wide variety of nonstandard content semantics that they encounter, and have no way of correcting vocabularies, so they pass on junk data.&lt;/p&gt;
&lt;p&gt;Even a small, steady volume of unusable messages can at best clog up manual review queues and overwhelm already overworked staff, and at worst give a false sense that all data are being ingested and reported on, when they are not.&lt;/p&gt;
&lt;p&gt;Something like an HIE that is capable of semantic (vocabulary) inspection, translation, and rule-based routing, customizable per reporter for the jurisdiction&amp;rsquo;s changing needs, is called for.&lt;/p&gt;
&lt;h3 id=&#34;the-casepointer-software-suite&#34;&gt;The CasePointer software suite&lt;/h3&gt;
&lt;p&gt;We at End Point are solving the interoperability problem for our client jurisdictions’ public health disease surveillance with CasePointer, a new suite of proven open source software. It interoperates with many other systems, including HIEs, and is configurable to map varying local data conventions into a single system that routes messages and reporting as needed.&lt;/p&gt;
&lt;h4 id=&#34;epitrax-disease-surveillance-system&#34;&gt;EpiTrax disease surveillance system&lt;/h4&gt;
&lt;p&gt;We began in 2008 to work with software for public health using the open-source TriSano disease surveillance system.&lt;/p&gt;
&lt;p&gt;In 2017, the Utah Department of Health and Human Services (DHHS) released a new open source disease surveillance application called EpiTrax to replace their use of TriSano. EpiTrax is a more capable, comprehensive, and supportable application that supports &lt;a href=&#34;https://ndc.services.cdc.gov/&#34;&gt;all 170+ reportable health conditions&lt;/a&gt; identified by the &lt;a href=&#34;https://health.gov/healthypeople/objectives-and-data/data-sources-and-methods/data-sources/national-notifiable-diseases-surveillance-system-nndss&#34;&gt;National Notifiable Disease Surveillance System (NNDSS)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As open source software, we and others can use it, extend its capabilities, and contribute back to a shared source code repository.&lt;/p&gt;
&lt;p&gt;Today EpiTrax serves as the central application within the CasePointer suite.&lt;/p&gt;
&lt;h4 id=&#34;emsa-preprocessing-powerhouse&#34;&gt;EMSA preprocessing powerhouse&lt;/h4&gt;
&lt;p&gt;The separate application Electronic Message Staging Area (EMSA) was also designed by the team at Utah DHHS to work in tandem with EpiTrax. EMSA ingests electronic case and lab reports (eCRs &amp;amp; ELRs) from various reporters and allows public health organizations to create extremely powerful custom configurations capable of message inspection, semantic (vocabulary) mapping and transformation, and routing, tailored to each jurisdiction&amp;rsquo;s needs and preferences.&lt;/p&gt;
&lt;p&gt;Once these EMSA rules are set up, the healthcare data can flow continuously while automatically being pre-processed by EMSA according to its matching jurisdiction with minimal manual intervention by the area&amp;rsquo;s public health agency. PHA staff can focus on their primary objective: investigating and tracking disease to protect the health of their community.&lt;/p&gt;
&lt;p&gt;Investigators can customize their individual dashboards within EpiTrax to analyze, sort, trace, and process the data prepared by EMSA in the way that is most efficient for them. Working together, these two powerhouse applications provide the cost and time saving benefits that public health organizations around the country need.&lt;/p&gt;
&lt;h4 id=&#34;nmi-automatic-cdc-reporting&#34;&gt;NMI automatic CDC reporting&lt;/h4&gt;
&lt;p&gt;Once a public health case reaches a certain status within EpiTrax, certain data must be reported per current requirements of the CDC. Historically, this has been a manual and tedious process for investigators involving referencing a text file with the latest CDC guidelines as they process these reports.&lt;/p&gt;
&lt;p&gt;More recently, the &lt;a href=&#34;https://www.cdc.gov/nndss/about/history.html&#34;&gt;NNDSS Modernization Initiative (NMI)&lt;/a&gt; by the CDC has provided options for a much more automated method of reporting the necessary case data. This is a critical part of the process for PHAs, as they receive funding for their organization based on their ability to meet CDC reporting requirements and interoperability standards.&lt;/p&gt;
&lt;p&gt;The NMI module is integrated into the CasePointer workflow to ensure that once data reporting has been configured for a case, any updates will be automatically sent to the CDC without additional manual processing.&lt;/p&gt;
&lt;h4 id=&#34;casepointer-disease-reporting-portal&#34;&gt;CasePointer Disease Reporting Portal&lt;/h4&gt;
&lt;p&gt;During COVID-19, nontraditional reporters such as pharmacies, university health centers, community drive-up testing centers, and others not part of our state clients&amp;rsquo; formal public health infrastructure, needed to be able to submit test results to the state.&lt;/p&gt;
&lt;p&gt;We developed a specialized disease reporting portal, initially focusing on COVID-19, to accept simple batch uploads of test results and, based on changing policy, to forward test data to the disease surveillance system. This separate system had no access to the main EpiTrax disease surveillance system, or to any other reporters&amp;rsquo; data.&lt;/p&gt;
&lt;h3 id=&#34;bringing-it-all-together&#34;&gt;Bringing it all together&lt;/h3&gt;
&lt;p&gt;CasePointer provides two prominent strengths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, its ability to map the endless local conventions used by those reporting the data into a unified standard for the rest of the workflow.&lt;/li&gt;
&lt;li&gt;Second, the customizability and agility of the CasePointer applications are unique among available disease surveillance solutions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CasePointer puts the ability to customize data collection and surveillance in the hands of the public health experts. New fields can be added into an investigation form with the click of a button. The ability to quickly pivot and document disease information is critical in a quickly changing public health landscape.&lt;/p&gt;
&lt;h3 id=&#34;join-the-evolution-of-public-health-technology&#34;&gt;Join the evolution of public health technology&lt;/h3&gt;
&lt;p&gt;Such highly configurable, unified, robust tools can be a game changer for public health jurisdictions in need of an affordable, extensible solution that meet all their needs. CasePointer can even work to further streamline systems that are already integrated with an HIE.&lt;/p&gt;
&lt;p&gt;Within the United States, four states have already partnered with us to implement EpiTrax. We are helping them reduce unnecessary manual data processing costs, more effectively manage caseloads, and further automate their data workflows.&lt;/p&gt;
&lt;p&gt;If this piqued your curiosity, &lt;a href=&#34;/contact/&#34;&gt;contact us&lt;/a&gt; to learn more about CasePointer and how our team is evolving public health support with customized data solutions.&lt;/p&gt;
&lt;p&gt;We would love to support your efforts to protect the well-being of people and communities you care about!&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>CSTE Conference 2023 Retrospective</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2023/07/cste-conference-2023-retrospective/"/>
      <id>https://www.endpointdev.com/blog/2023/07/cste-conference-2023-retrospective/</id>
      <published>2023-07-14T00:00:00+00:00</published>
      <author>
        <name>Samuel Stern</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2023/07/cste-conference-2023-retrospective/end-point-cste-team.webp&#34; alt=&#34;Seven members of the End Point CasePointer team standing in front of the CSTE 2023 press wall&#34;&gt;&lt;/p&gt;
&lt;p&gt;End Point is proud to have been an exhibitor at the 2023 Council of State and Territorial Epidemiologists (CSTE) conference in Salt Lake City, Utah.&lt;/p&gt;
&lt;p&gt;We are grateful to have had the opportunity to showcase our public health software suite offering, CasePointer, to numerous state, tribal, territorial, and international epidemiologists.&lt;/p&gt;
&lt;p&gt;The conference served as a meeting place to hear about the latest research in the fields of informatics and disease surveillance, and discuss the future of data management on state and national levels, with many talks exploring the technologies that will become future standards and practices.&lt;/p&gt;
&lt;p&gt;The End Point booth was abuzz with visitors getting hands-on demos using the EpiTrax software as well as learning about the other aspects of the CasePointer suite, such as the Electronic Message Staging Area (EMSA), our new disease reporting portal, and the EpiTrax NMI module.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2023/07/cste-conference-2023-retrospective/20230625_124940.webp&#34; alt=&#34;Trade show booth for CasePointer by End Point, featuring EpiTrax&#34;&gt;&lt;/p&gt;
&lt;p&gt;The CasePointer demo highlighted its capability of streamlining the management of epidemiological data with a user-friendly and highly customizable interface.&lt;/p&gt;
&lt;p&gt;The CSTE conference provides a valuable opportunity to engage with epidemiologists and gain insights into the daily obstacles they encounter in data reception, management, and sharing. It offers a platform to learn about their strategies for overcoming these challenges within their respective jurisdictions.&lt;/p&gt;
&lt;p&gt;One of the common topics that came up was tackling the challenge of file transfers using current protocols and systems in place. We were happy to share our successes using EMSA to customize how data is received and uploaded to EpiTrax, making transfers faster, more reliable, and easier to manage.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2023/07/cste-conference-2023-retrospective/20230627_154336.webp&#34; alt=&#34;Booth close-up with flyers, pens, etc. offered by End Point staffer whose name Samuel shows on his conference lanyard&#34;&gt;&lt;/p&gt;
&lt;p&gt;We look forward to further conversations with the visitors that stopped by our booth, and hope that you enjoyed the locally crafted chocolates and caramels and saved some for the trip home!&lt;/p&gt;
&lt;p&gt;Are you interested in a demo of the CasePointer suite? Reach out to us at &lt;a href=&#34;mailto:ask@endpointdev.com&#34;&gt;ask@endpointdev.com&lt;/a&gt; to set up a meeting.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Announcing CasePointer</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2023/06/announcing-casepointer-epitrax/"/>
      <id>https://www.endpointdev.com/blog/2023/06/announcing-casepointer-epitrax/</id>
      <published>2023-06-20T00:00:00+00:00</published>
      <author>
        <name>Jon Jensen</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2023/06/announcing-casepointer-epitrax/pexels-diva-plavalaguna-6147381.webp&#34; alt=&#34;Overhead view of 4 people standing on opposite sides of a table holding huge puzzle pieces&#34;&gt;&lt;br&gt;
Photo by &lt;a href=&#34;https://www.pexels.com/photo/close-up-photo-of-people-holding-puzzle-pieces-6147381/&#34;&gt;Diva Plavalaguna&lt;/a&gt;, Pexels license&lt;/p&gt;
&lt;p&gt;End Point is pleased to announce CasePointer, the expanded branding of our line of public health systems and services. Before this we referred to it simply by the name of one of its components, EpiTrax.&lt;/p&gt;
&lt;p&gt;The name CasePointer more appropriately reflects the broad scope of services we provide within the disease reporting and surveillance sector.&lt;/p&gt;
&lt;p&gt;This change coincides with the launching of the dedicated CasePointer website at www.casepointer.com and our participation next week in this year’s conference of CSTE (Council of State and Territorial Epidemiologists) in Salt Lake City, Utah. We will be staffing a booth there on the exhibition floor. Come visit us!&lt;/p&gt;
&lt;p&gt;Starting in 2008, End Point helped develop and maintain the TriSano open source disease surveillance system. In 2019 we migrated our customer, the Kansas Department of Health and Environment, from TriSano to a new disease surveillance system called EpiTrax, which was developed by the state of Utah, and is also open source.&lt;/p&gt;
&lt;p&gt;This timeline shows those and other key points on our journey:&lt;/p&gt;
&lt;p&gt;&lt;object style=&#34;max-width:100%&#34; type=&#34;image/svg+xml&#34; data=&#34;/blog/2023/06/announcing-casepointer-epitrax/casepointer-timeline-20230620.svg&#34;&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Due to the need for major additional features and capabilities, especially since the onset of the COVID-19 pandemic, End Point is now integrally involved with public health agencies in four states. For each of them we configured, deployed, maintain, and enhance the cloud hosting, relevant software, and databases to run those components they need, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the EpiTrax disease surveillance system&lt;/li&gt;
&lt;li&gt;EMSA (the Electronic Message Staging Area)&lt;/li&gt;
&lt;li&gt;the NMI (NNDSS Modernization Initiative) module&lt;/li&gt;
&lt;li&gt;End Point’s Disease Reporting Portal&lt;/li&gt;
&lt;li&gt;End Point’s merge tool&lt;/li&gt;
&lt;li&gt;Mirth Connect&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of these interoperate harmoniously around the central EpiTrax application and database.&lt;/p&gt;
&lt;p&gt;Our team is composed of public health professionals, software engineers, database specialists, and security experts. We are committed to our public health clients and their needs. We are here to help you help our communities and look forward to discussing the CasePointer approach with you and your team.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>eCR Coordinator job opening</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2023/05/ecr-coordinator-job/"/>
      <id>https://www.endpointdev.com/blog/2023/05/ecr-coordinator-job/</id>
      <published>2023-05-23T00:00:00+00:00</published>
      <author>
        <name>Shannon Sandall</name>
      </author>
      <content type="html">
        &lt;img src=&#34;/blog/2020/11/job-java-javascript-developer/20201107-124658-crop.jpg&#34; alt=&#34;Person on boulder overlooking valley with lake&#34; /&gt;
&lt;!-- Photo by Jon Jensen --&gt;
&lt;p&gt;We are seeking a full-time &lt;strong&gt;Electronic Case Reporting (eCR) Coordinator&lt;/strong&gt; to provide high-level expertise in the validation and automation of eCR messages.&lt;/p&gt;
&lt;p&gt;This position is responsible for establishing complete, up-to-date, timely, and automated reporting of individual-level data, and automation of incoming EHR data. &lt;strong&gt;Position is remote, in the United States only.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The person in this role will be responsible for coordinating and overseeing the eCR onboarding process for our clients. Additionally, the person will become our subject matter expert for the NNDSS Modernization Initiative (NMI) and how systems in place within EpiTrax can be configured to report through the NMI module.&lt;/p&gt;
&lt;h3 id=&#34;job-responsibilities&#34;&gt;Job responsibilities&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;eCR onboarding—40%&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Assist the on-boarding team with eCR reporters.&lt;/li&gt;
&lt;li&gt;Develop Structure, Dictionary, LOINC and SNOMED codes in EMSA.&lt;/li&gt;
&lt;li&gt;Assist in eCR message structure approval.&lt;/li&gt;
&lt;li&gt;Assist with EMSA management.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Troubleshooting—30%&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Issues found by the program epis and the LHDs.&lt;/li&gt;
&lt;li&gt;Issues found by the surveillance team.&lt;/li&gt;
&lt;li&gt;Create trouble tickets for issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Testing—15%&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test the structure for incoming messages.&lt;/li&gt;
&lt;li&gt;Test new enhancement functionality.&lt;/li&gt;
&lt;li&gt;Test bug fixes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Grant document development—5%&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Assist with determining next steps in development to be included in grants.&lt;/li&gt;
&lt;li&gt;Develop documentation for grants.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Process documentation—5%&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thoroughly document changes and the processes put in place.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NMI—5%&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Work with state and CDC teams to determine MMG onboarding schedule.&lt;/li&gt;
&lt;li&gt;Map EpiTrax variables to PHIN VAD variables in the NMI module.&lt;/li&gt;
&lt;li&gt;Document all mappings and changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;skills-required&#34;&gt;Skills required&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Working knowledge of public health surveillance or EHR and healthcare data&lt;/li&gt;
&lt;li&gt;Good communication skills, both spoken and written&lt;/li&gt;
&lt;li&gt;Ability to analyze problems&lt;/li&gt;
&lt;li&gt;Good testing skills&lt;/li&gt;
&lt;li&gt;Ability to multitask and set priorities&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;skills-to-have-or-to-learn-on-the-job&#34;&gt;Skills to have, or to learn on the job&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;In-depth knowledge of eCR messaging&lt;/li&gt;
&lt;li&gt;In-depth knowledge of EMSA&lt;/li&gt;
&lt;li&gt;In-depth knowledge of EpiTrax&lt;/li&gt;
&lt;li&gt;Working knowledge of NMI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For some of our clients you will need to submit to and pass a criminal background check.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;what-work-here-offers&#34;&gt;What work here offers:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Starting annual salary range: $50k–$85k&lt;/li&gt;
&lt;li&gt;Paid holidays (10 per year) and vacation (2 weeks per year)&lt;/li&gt;
&lt;li&gt;Health insurance subsidy and 401(k) retirement savings plan&lt;/li&gt;
&lt;li&gt;Collaboration with knowledgeable, friendly, helpful, and diligent co-workers around the world&lt;/li&gt;
&lt;li&gt;Freedom from being tied to one office location&lt;/li&gt;
&lt;li&gt;Flexible, sane work hours&lt;/li&gt;
&lt;li&gt;Annual bonus opportunity&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;get-in-touch-with-us&#34;&gt;Get in touch with us:&lt;/h3&gt;
&lt;p&gt;&lt;del&gt;Please email us an introduction to jobs@endpointdev.com to apply.&lt;/del&gt;
&lt;strong&gt;(This job has been filled.)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Include your location, a resume, your LinkedIn URL if you have one, and whatever else may help us get to know you.&lt;/p&gt;
&lt;p&gt;We look forward to hearing from you! Direct work seekers only, please—​this role is not for agencies or subcontractors.&lt;/p&gt;
&lt;p&gt;We are an equal opportunity employer and value diversity at our company. We do not discriminate on the basis of sex/​gender, race, religion, color, national origin, sexual orientation, age, marital status, veteran status, or disability status.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>How To Set Up pgTAP for Writing PostgreSQL Database Unit Tests</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2023/04/pgtap-for-database-unit-tests/"/>
      <id>https://www.endpointdev.com/blog/2023/04/pgtap-for-database-unit-tests/</id>
      <published>2023-04-12T00:00:00+00:00</published>
      <author>
        <name>Edgar Mlowe</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2023/04/pgtap-for-database-unit-tests/georgian-mountains.webp&#34; alt=&#34;A steep, green mountain slope divides the image with a steep diagonal downwards and to the right, reaching the bottom of the frame two thirds of the way to the right edge of the image. A small, red-roofed Georgian church sits on it. Another hill sinks down and to the left, creating an apex at the bottom. In the background, framed by these asymmetrical diagonals, is a tall, rocky ridgeline lined with snow anywhere the rocks aren&amp;rsquo;t too steep to hold it.&#34;&gt;&lt;/p&gt;
&lt;!-- Image by Seth Jensen, 2019 --&gt;
&lt;p&gt;In a previous blog post, my colleague Josh Tolley &lt;a href=&#34;/blog/2022/03/using-pgtap-automate-database-testing/&#34;&gt;introduced the concept&lt;/a&gt; of using pgTAP, a set of Postgres functions designed for writing unit tests within the database. This post will serve as a supplement to Josh&amp;rsquo;s post, focusing on the process of setting up pgTAP for testing a Postgres database.&lt;/p&gt;
&lt;h3 id=&#34;installing--setting-up-pgtap&#34;&gt;Installing &amp;amp; setting up pgTAP&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: make sure you have Postgres installed on your system. If you don&amp;rsquo;t have it, you can follow the &lt;a href=&#34;https://www.postgresql.org/download/&#34;&gt;Postgres documentation&lt;/a&gt; to learn how to install it.&lt;/p&gt;
&lt;p&gt;To install pgTAP for Postgres, you will need to follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download the pgTAP source code from its GitHub repository.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/pgtap/pgtap.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the &lt;code&gt;pgtap&lt;/code&gt; directory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd pgtap&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install with &lt;code&gt;make&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make &amp;amp;&amp;amp; make install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, connect to your Postgres database using psql or any other Postgres client and run the following SQL command to create the pgTAP extension.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;CREATE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;EXTENSION&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;pgtap;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now you should have pgTAP installed and ready to use in your Postgres database. If you face issues with installation, visit the &lt;a href=&#34;https://pgtap.org/documentation.html#installation&#34;&gt;pgTAP documentation&lt;/a&gt; for further help.&lt;/p&gt;
&lt;h3 id=&#34;writing-simple-database-tests-with-pgtap&#34;&gt;Writing simple database tests with pgTAP&lt;/h3&gt;
&lt;p&gt;Test to check if a table exists:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;plan(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;has_table(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;public&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;your_table&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Table your_table should exist&amp;#39;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;finish();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Test to check if a column exists in a table:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;plan(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;has_column(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;public&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;your_table&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;your_column&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Column your_column should exist in your_table&amp;#39;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;finish();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Test to check if a function returns the expected result:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;plan(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;is&lt;/span&gt;(your_function(),&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;expected_result,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;your_function() should return expected_result&amp;#39;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;finish();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;more-pgtap-tests&#34;&gt;More pgTAP tests&lt;/h3&gt;
&lt;h4 id=&#34;test-to-check-if-a-trigger-is-triggered&#34;&gt;Test to check if a trigger is triggered&lt;/h4&gt;
&lt;p&gt;Consider the following example. We have a table named &lt;code&gt;employees&lt;/code&gt; and a table named &lt;code&gt;audit_log&lt;/code&gt;. When a new employee is added to the &lt;code&gt;employees&lt;/code&gt; table, a trigger named &lt;code&gt;insert_employee_trigger&lt;/code&gt; fires and logs the new employee&amp;rsquo;s ID and creation timestamp in the &lt;code&gt;audit_log&lt;/code&gt; table. Let&amp;rsquo;s test if the trigger gets fired and produces the expected outcome.&lt;/p&gt;
&lt;p&gt;Create the tables.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;CREATE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TABLE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;employees&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;SERIAL&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;PRIMARY&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;KEY&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;255&lt;/span&gt;)&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;NOT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;CREATE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TABLE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;audit_log&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;SERIAL&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;PRIMARY&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;KEY&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;employee_id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;INTEGER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;NOT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;NULL&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;created_at&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TIMESTAMP&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;NOT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Create the trigger and trigger function.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;CREATE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;OR&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;REPLACE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;FUNCTION&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;insert_employee_trigger_function()&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;RETURNS&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TRIGGER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;AS&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;$$&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;BEGIN&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;INSERT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;INTO&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;audit_log&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(employee_id,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;created_at)&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;VALUES&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;NEW&lt;/span&gt;.id,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;NOW());&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;RETURN&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;NEW&lt;/span&gt;;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;END&lt;/span&gt;;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;$$&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;LANGUAGE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;plpgsql;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;CREATE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TRIGGER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;insert_employee_trigger&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;AFTER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;INSERT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ON&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;employees&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;FOR&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;EACH&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ROW&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;EXECUTE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;FUNCTION&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;insert_employee_trigger_function();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now, write a test using pgTAP to test the trigger.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;-- Set the test plan
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;plan(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#888&#34;&gt;-- Prepare test data and perform operations that should fire the trigger
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;INSERT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;INTO&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;employees&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(name)&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;VALUES&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;John Doe&amp;#39;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#888&#34;&gt;-- Check if the desired outcome of the trigger has occurred
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;is&lt;/span&gt;(&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;(&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;employees&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;WHERE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;=&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;employee_id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;audit_log&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ORDER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;BY&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;DESC&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;LIMIT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1&lt;/span&gt;)),&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;John Doe&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;The insert_employee_trigger should have been fired and produced the expected outcome&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id=&#34;test-to-check-if-a-constraint-is-enforced&#34;&gt;Test to check if a constraint is enforced&lt;/h4&gt;
&lt;p&gt;For this example, we&amp;rsquo;ll use the following two tables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;customers&lt;/code&gt; table with columns &lt;code&gt;id&lt;/code&gt; and &lt;code&gt;name&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;orders&lt;/code&gt; table with columns &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;customer_id&lt;/code&gt;, and &lt;code&gt;amount&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There is a foreign key constraint between the &lt;code&gt;orders&lt;/code&gt; table and the &lt;code&gt;customers&lt;/code&gt; table on the &lt;code&gt;customer_id&lt;/code&gt; column.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First, create the two tables and add the foreign key constraint.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;CREATE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TABLE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;customers&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;SERIAL&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;PRIMARY&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;KEY&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;name&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;VARCHAR&lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;255&lt;/span&gt;)&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;NOT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;CREATE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;TABLE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;orders&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;SERIAL&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;PRIMARY&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;KEY&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;customer_id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;INTEGER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;REFERENCES&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;customers(id),&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;amount&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#038&#34;&gt;INTEGER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now, create a test script named &lt;code&gt;fk_test.sql&lt;/code&gt; with the following content.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;BEGIN&lt;/span&gt;;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#888&#34;&gt;-- Create test data in customers table
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;INSERT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;INTO&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;customers&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(id,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;name)&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;VALUES&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;Customer 1&amp;#39;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#888&#34;&gt;-- Declare the number of tests
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;plan(&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#888&#34;&gt;-- Attempt to insert an order with an invalid customer_id
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;-- This should fail due to the foreign key constraint
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;throws_ok(&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;INSERT INTO orders (id, customer_id, amount) VALUES (1, 969, 100);&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;23503&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;insert or update on table &amp;#34;orders&amp;#34; violates foreign key constraint &amp;#34;orders_customer_id_fkey&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#888&#34;&gt;-- Conclude the test and discard changes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;finish();&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;ROLLBACK&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;organizing-and-naming-your-test-files-based-on-test-anything-protocol-tap&#34;&gt;Organizing and naming your test files based on Test Anything Protocol (TAP)&lt;/h3&gt;
&lt;p&gt;Test Anything Protocol (TAP) is a convention for naming test files and organizing them within a project directory structure. The naming convention involves adding a numeric prefix to the test file name to indicate the order in which the tests should be run. For example, &lt;code&gt;00-test.sql&lt;/code&gt; is the first test file to be executed, followed by &lt;code&gt;01-another-test.sql&lt;/code&gt;, and so on.&lt;/p&gt;
&lt;p&gt;The project directory structure usually includes a directory called &lt;code&gt;t&lt;/code&gt; (short for &amp;ldquo;test&amp;rdquo;) under the project root directory. This &lt;code&gt;t&lt;/code&gt; directory contains all the test files following the TAP naming convention.&lt;/p&gt;
&lt;p&gt;Using this structure makes it easier to maintain and organize tests, as well as to run them in the correct order. This is especially important when tests depend on the results of previous tests, or when you want to ensure that tests are executed in a specific sequence.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example of a project directory structure using the TAP-related naming convention:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;my_project/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─ src/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── function1.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── function2.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── function3.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└─ t/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── 00-test.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── 01-another-test.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── 02-yet-another-test.sql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In this example, the project contains a &lt;code&gt;src&lt;/code&gt; directory for the source code (database functions) and a &lt;code&gt;t&lt;/code&gt; directory for the test files following the TAP naming convention.&lt;/p&gt;
&lt;h3 id=&#34;running-your-tests-using-pg_prove&#34;&gt;Running your tests using pg_prove&lt;/h3&gt;
&lt;p&gt;Now that we have written some tests using pgTAP, let&amp;rsquo;s see how we can run them. We&amp;rsquo;ll use pg_prove, a utility included with pgTAP, to automate the process and get a summary of the results.&lt;/p&gt;
&lt;p&gt;To run your tests with pg_prove, you&amp;rsquo;ll need to specify the name of the database you want to connect to and the path to your test file. For example, if your test file is located at &lt;code&gt;t/00-test.sql&lt;/code&gt; and your database is named &lt;code&gt;epitrax_db&lt;/code&gt;, you can run the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pg_prove -d epitrax_db t/00-test.sql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When you run this command, pg_prove will execute all the tests in the specified file and print a summary of the results. The output will include the number of tests run, the number of tests passed, the number of tests failed, and any diagnostic messages or errors that were encountered.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example of what the output might look like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t/00-test.sql .. ok
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;All tests successful.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#369&#34;&gt;Files&lt;/span&gt;=1, &lt;span style=&#34;color:#369&#34;&gt;Tests&lt;/span&gt;=5,  &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;0&lt;/span&gt; wallclock secs ( 0.01 usr  0.00 sys +  0.02 cusr  0.00 &lt;span style=&#34;color:#369&#34;&gt;csys&lt;/span&gt; =  0.03 CPU)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Result: PASS&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In this example, pg_prove ran one test file (&lt;code&gt;00-test.sql&lt;/code&gt;) and executed 5 tests. All of the tests passed, so the output shows that the result was PASS.&lt;/p&gt;
&lt;p&gt;If any of the tests fail, pg_prove will print a detailed report of the failures, including any error messages or diagnostic information. This can help you quickly identify and fix any issues in your code.&lt;/p&gt;
&lt;p&gt;Using pg_prove to automate your tests can save you a lot of time and effort, especially if you have a large number of tests to run. It also makes it easy to integrate your tests into your build process or continuous integration pipeline.&lt;/p&gt;
&lt;h3 id=&#34;pgtap-in-epitrax&#34;&gt;pgTAP in EpiTrax&lt;/h3&gt;
&lt;p&gt;EpiTrax relies on Postgres and its functions, making pgTAP an ideal tool for testing the platform&amp;rsquo;s database functions, ensuring data integrity, and maintaining the robustness of the system. By utilizing pgTAP, EpiTrax efficiently validates various aspects of its database structure and behavior.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;pgTAP database unit tests provide numerous benefits, including ensuring code quality and simplifying the testing process. This guide should serve as a starting point for setting up pgTAP, and we encourage you to explore the &lt;a href=&#34;https://pgtap.org/documentation.html#usingpgtap&#34;&gt;pgTAP documentation&lt;/a&gt; and read the &lt;a href=&#34;/blog/2022/03/using-pgtap-automate-database-testing/&#34;&gt;aforementioned blog post&lt;/a&gt; on automated database testing with pgTAP for more in-depth information on writing and running tests with pgTAP. By integrating pgTAP in projects like EpiTrax, it&amp;rsquo;s possible to improve overall database performance, stability, and security.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Identifying Vulnerabilities in Code Using Horusec</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2023/03/identifying-vulnerabilities-using-horusec/"/>
      <id>https://www.endpointdev.com/blog/2023/03/identifying-vulnerabilities-using-horusec/</id>
      <published>2023-03-28T00:00:00+00:00</published>
      <author>
        <name>Indra Pranesh Palanisamy</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2023/03/identifying-vulnerabilities-using-horusec/pexels-indra-pranesh-palanisamy-15837790.webp&#34; alt=&#34;The sun has just started to rise over the horizon. A group of fishermen can be seen pushing their small wooden boats into the water, preparing to start their day&amp;rsquo;s work. The air is still cool and quiet, with only the sound of waves gently lapping against the shore as the fishermen row out into the open sea, ready to begin their early morning fishing expedition.&#34;&gt;&lt;/p&gt;
&lt;!-- Photo by Indra Pranesh Palanisamy, 2022 --&gt;
&lt;p&gt;&lt;a href=&#34;https://horusec.io/site/&#34;&gt;Horusec&lt;/a&gt; is an open source tool which, by orchestrating other security tools, identifies security flaws and vulnerabilities in source code. It puts all the possible vulnerabilities it finds into a database for analysis.&lt;/p&gt;
&lt;p&gt;Currently, Horusec supports C#, Java, Kotlin, Python, Ruby, Go, JavaScript, TypeScript, PHP, Swift, C, Dart, Elixir, shell, Terraform, Kubernetes, nginx, HTML, and JSON. You can see an up-to-date list of &lt;a href=&#34;https://docs.horusec.io/docs/cli/analysis-tools/overview/#available-programming-languages-and-tools&#34;&gt;supported languages&lt;/a&gt; in Horusec&amp;rsquo;s docs.&lt;/p&gt;
&lt;p&gt;It can also be integrated with CI/CD to execute the scan every time a developer creates a pull request or merge request.&lt;/p&gt;
&lt;h3 id=&#34;horusec-cli-installation&#34;&gt;Horusec CLI Installation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;: Docker, Git.&lt;/p&gt;
&lt;p&gt;The easiest installation method listed in the docs is &lt;code&gt;curl&lt;/code&gt;ing Horusec&amp;rsquo;s install script and piping it into &lt;code&gt;bash&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -fsSL https://raw.githubusercontent.com/ZupIT/horusec/main/deployments/scripts/install.sh | bash -s latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Be aware that there is risk to piping unseen commands into the shell like this: It can lead to unintended consequences and it is a bad security practice.&lt;/p&gt;
&lt;p&gt;If a user blindly pipes the output of a website response to be run by a shell without fully understanding what each command does, they may inadvertently execute malicious code or perform actions that could compromise the security of the system.&lt;/p&gt;
&lt;p&gt;To mitigate these risks, one solution is to use a virtual machine specifically set up for code scanning. This virtual machine should have no production data, no secret keys, and no other sensitive information. It should be used only for the purpose of scanning source code and nothing else.&lt;/p&gt;
&lt;p&gt;To instead download an executable directly, as well as for instructions for different platforms, see the &lt;a href=&#34;https://docs.horusec.io/docs/cli/installation/&#34;&gt;installation docs&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;vs-code-extension&#34;&gt;VS Code Extension&lt;/h3&gt;
&lt;p&gt;Horusec has a &lt;a href=&#34;https://docs.horusec.io/docs/extensions/visual-studio-code/&#34;&gt;VS Code extension&lt;/a&gt; which is helpful for making complete code analysis with a single click.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2023/03/identifying-vulnerabilities-using-horusec/horusec-vscode.webp&#34; alt=&#34;Screenshot of Horusec VS Code extension&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;usage&#34;&gt;Usage&lt;/h3&gt;
&lt;p&gt;Navigate to the application directory and run the &lt;code&gt;generate&lt;/code&gt; command to make a configuration file called &lt;code&gt;horusec-config.json&lt;/code&gt; which has a set of &lt;a href=&#34;https://docs.horusec.io/docs/cli/commands-and-flags/#global-flags&#34;&gt;customisations&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /path/to/project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;horusec generate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;start&lt;/code&gt; command executes the code scan throughout the repository, searching for possible vulnerabilities:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;horusec start -p . --output-format=json --json-output-file=&amp;lt;filename&amp;gt;.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;All the detected vulnerabilities are stored in the named JSON output file.&lt;/p&gt;
&lt;h3 id=&#34;classification-of-vulnerabilities&#34;&gt;Classification of Vulnerabilities&lt;/h3&gt;
&lt;p&gt;Horusec may identify (or, as the docs say, accuse) possible vulnerabilities that aren&amp;rsquo;t vulnerabilities at all. Possible vulnerabilites need to be classified to sort out those that are wrong.&lt;/p&gt;
&lt;p&gt;Here are the classification types from &lt;a href=&#34;https://docs.horusec.io/docs/tutorials/how-to-classify-a-vulnerability/#classification-types&#34;&gt;Horusec&amp;rsquo;s docs&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;False positive:&lt;/strong&gt; Vulnerability found is wrong, because it is accused in a test file or it is not a vulnerability in fact, and is safe code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accepted Risk:&lt;/strong&gt; Vulnerability that was accused, but at the moment, you don&amp;rsquo;t have the option to correct it, so it is classified as an accepted risk to not raise alarms in future runs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Corrected:&lt;/strong&gt; Vulnerability that doesn&amp;rsquo;t exist and can be considered as corrected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vulnerability:&lt;/strong&gt; A possible security problem found and accused by the analysis.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The hashes to be ignored can be added to the configuration file, &lt;code&gt;horusec-config.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;#34;horusecCliFalsePositiveHashes&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;f9e5abe187ad4246daa4e9113e0a11a175347e793fbc40acd7663df67b2f89d2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;878c35116d043311403a0a2e8a64f2c8d00479a1c23373dcd50372ff35e123c8&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;#34;horusecCliRiskAcceptHashes&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;5c9af42834ca77233a0e7afc98df317fb0e6041ea69a109754f278331039f844&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;b494003277bcd7792390f032ba39e9a860da66ddb1ccfcd8a581978eab744561&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id=&#34;ignore-files&#34;&gt;Ignore Files&lt;/h4&gt;
&lt;p&gt;To entirely ignore a file or certain paths under the directory, add the paths to the configuration file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;&amp;#34;horusecCliFilesOrPathsToIgnore&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;**/tmp/**&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;**/.vscode/**&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;code-scanning-in-epitrax&#34;&gt;Code Scanning in EpiTrax&lt;/h3&gt;
&lt;p&gt;The use of a code scan tool has become an integral part of our work with the EpiTrax disease surveillance system for public health.&lt;/p&gt;
&lt;p&gt;By integrating Horusec into our software development process, we have been able to identify potential security vulnerabilities, code quality issues, and other problems before they can cause any significant harm.&lt;/p&gt;
&lt;p&gt;Moreover, it has helped us reduce the overall cost and time associated with bug-fixing and maintenance tasks, making our projects more efficient and effective. By automating the scanning process, we can identify problems quickly and accurately, allowing us to prioritize and address the most critical ones first.&lt;/p&gt;
&lt;p&gt;By leveraging the power of code scans, we can ensure that our code is of the highest quality, and our projects are as secure and reliable as possible.&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;em&gt;Special thanks to my colleagues Kürşat Kutlu Aydemir and Edgar Mlowe for their insights and feedback on this blog post.&lt;/em&gt;&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Nevada State EpiTrax Launch</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2022/12/nevada-state-epitrax-launch/"/>
      <id>https://www.endpointdev.com/blog/2022/12/nevada-state-epitrax-launch/</id>
      <published>2022-12-01T00:00:00+00:00</published>
      <author>
        <name>Katrease Hale</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2022/12/nevada-state-epitrax-launch/desert.webp&#34; alt=&#34;Weathered red rocks jut out from the desert into the foreground, while a blue haze covers a mountain range in the background.&#34;&gt;
Photo by Adrien Drj&lt;/p&gt;
&lt;!-- Photo from Pexels: https://www.pexels.com/photo/signage-on-ground-near-brown-mountains-12965227/ --&gt;
&lt;p&gt;If COVID-19 has taught us anything, it is that the public health landscape can change quickly, and we need a disease surveillance system that is adaptable to support our ever-evolving climate.&lt;/p&gt;
&lt;p&gt;Having access to surveillance data for purposes of contact tracing, following trends, and monitoring evolving disease conditions allows health departments to be agile in response. This is a critical component in providing communities with a robust public health infrastructure.&lt;/p&gt;
&lt;p&gt;For all these reasons and many more, the State of Nevada embarked on a journey to migrate away from their surveillance system, NBS, to the open-source EpiTrax system created by the Utah Department of Health. Ultimately, the Nevada decisionmakers made this change because they needed to be on one state-wide system and wanted autonomy to customize the system.&lt;/p&gt;
&lt;p&gt;Nevada had been exploring this change for a while but due to unforeseen problems the window of time for implementation was incredibly narrow. In the first four months of End Point&amp;rsquo;s partnership with Nevada, the team was able to accomplish what was believed to be impossible in so short a time.&lt;/p&gt;
&lt;h3 id=&#34;the-four-month-sprint&#34;&gt;The Four Month Sprint&lt;/h3&gt;
&lt;p&gt;Some of the major milestones on the way to the new EpiTrax system included the following:&lt;/p&gt;
&lt;h4 id=&#34;building-out-custom-forms&#34;&gt;Building Out Custom Forms&lt;/h4&gt;
&lt;p&gt;EpiTrax is composed of core and form fields. Core fields are consistent across all conditions. Form fields allow jurisdictions to customize the data system to collect data specific to the needs of their area or the reporting requirements of their funders.&lt;/p&gt;
&lt;p&gt;In Nevada, we framed these forms to collect the data outlined in the Message Mapping Guide set forth by the CDC. Collecting form data is the first step in configuring the system to use the NMI module which allows for seamless reporting.&lt;/p&gt;
&lt;h4 id=&#34;configuring-the-system&#34;&gt;Configuring the System&lt;/h4&gt;
&lt;p&gt;EpiTrax is an intuitive system that is highly configurable. For example, EpiTrax will show specific fields by condition or condition type, allowing an investigator working on a COVID record to only see vaccines and treatments for COVID which reduces time and error in data entry.&lt;/p&gt;
&lt;p&gt;These parameters need to be defined and set up in the system for a large number of items. End Point was able to provide templates and examples from other states and having a framework for this documentation was vital.&lt;/p&gt;
&lt;h4 id=&#34;testing-the-system&#34;&gt;Testing the System&lt;/h4&gt;
&lt;p&gt;Testing sounds easy: “You just log in and make sure the functionality is there.” However, to adequately test a new environment with multiple jurisdictions and a variety of user groups takes time, attention, and follow-through.&lt;/p&gt;
&lt;p&gt;Nevada worked with End Point to bring in users from across the state to test both the functionality of the system and disease-specific variables. Then the test failures were discussed daily and the programmers provided options and support for resolving problems. After modifications were made to the environment the second round of testing was implemented.&lt;/p&gt;
&lt;p&gt;Given the tight window of time to launch EpiTrax we were building (testing) the ship as we were sailing it and this was only possible given the commitment of everyone on the team.&lt;/p&gt;
&lt;h4 id=&#34;training&#34;&gt;Training&lt;/h4&gt;
&lt;p&gt;You cannot launch a statewide system without training the end users, answering questions, and providing a mechanism for ongoing support. End Point provided countless trainings ranging from general use to administrative functionality of the system, and also provided Nevada with a user manual template that they were able to build on and grow to fit their needs.&lt;/p&gt;
&lt;h4 id=&#34;electronic-messaging-staging-area-emsa&#34;&gt;Electronic Messaging Staging Area (EMSA)&lt;/h4&gt;
&lt;p&gt;EMSA is an application that processes lab messages and delivers them into EpiTrax. The delivery of these messages is what creates the record for investigation in EpiTrax. Since this was a new process and system to Nevada, End Point worked with the Nevada team to configure the various vocabularies and rules.&lt;/p&gt;
&lt;h4 id=&#34;going-live&#34;&gt;Going Live&lt;/h4&gt;
&lt;p&gt;On September 12 EpiTrax officially launched in Nevada. End Point staff were there both in person and with a consistent virtual presence to work through user concerns, login issues, and workflow questions.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The customization and scope of EpiTrax are crucial components in allowing Nevada to optimize work processes, streamline the multiple data systems being used into one cohesive system, and greatly reduce redundancy.&lt;/p&gt;
&lt;p&gt;While switching systems can seem like a daunting and time-consuming task, so is continuing to operate in crisis mode with a system that stops your team from being dynamic. Any change for the better involving hundreds of people and a lot of data is going to take time, normally much longer than 4 months.&lt;/p&gt;
&lt;p&gt;The partnership between Nevada and End Point during this fast-paced launch has better positioned the state to use their data to support well-coordinated public health responses to emerging diseases or outbreaks.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>CSTE Conference EpiTrax retrospective</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2022/06/cste-conference-epitrax-retrospective/"/>
      <id>https://www.endpointdev.com/blog/2022/06/cste-conference-epitrax-retrospective/</id>
      <published>2022-06-29T00:00:00+00:00</published>
      <author>
        <name>Steve Yoman</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2022/06/cste-conference-epitrax-retrospective/end-pointers-booth-cste.webp&#34; alt=&#34;Banner photo of 4 End Pointers in our conference booth&#34;&gt;&lt;/p&gt;
&lt;p&gt;Last week we were in Louisville, Kentucky for the CSTE Conference. End Point staffed a conference booth to represent the EpiTrax public health surveillance system to a wonderful group of public health experts.&lt;/p&gt;
&lt;p&gt;You can read some background about the conference and CSTE in &lt;a href=&#34;/blog/2022/06/booth-at-cste-conference/&#34;&gt;our earlier blog post announcing our plans&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2022/06/cste-conference-epitrax-retrospective/attendees.webp&#34; alt=&#34;Photo of attendees at a CSTE conference session&#34;&gt;&lt;/p&gt;
&lt;p&gt;We really enjoyed meeting new friends in person after two years of canceled events due to the pandemic. We spoke with staff from health departments and disease surveillance teams from several state and local jurisdictions, as well as with experts from the CDC and other software and service vendors.&lt;/p&gt;
&lt;p&gt;One of the highlights was going around to meet other people staffing booths at the conference. It charged us up to see and hear about all of the interesting and innovative things going on in the public health space at a time when there is so much that needs to be done. We were particularly struck by the efforts being made in onboarding and distributing ELRs and eCRs, areas where the Electronic Message Staging Area (EMSA, which we deploy and support) can complement and enrich those activities.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2022/06/cste-conference-epitrax-retrospective/conference-hall.webp&#34; alt=&#34;Photo of CSTE conference hall&#34;&gt;&lt;/p&gt;
&lt;p&gt;The open-source disease surveillance and reporting software EMSA and EpiTrax both enjoyed well-deserved attention as we demonstrated them to numerous groups seeking better solutions to serve people in their jurisdictions. People were very interested in the functionality EpiTrax has for case management, encounters, and NMI reporting.&lt;/p&gt;
&lt;p&gt;Of course there is a lot more we could say about EpiTrax and EMSA. So, if you didn’t find us at the conference or if you are interested in what EpiTrax and EMSA can do, &lt;a href=&#34;/contact/&#34;&gt;contact us&lt;/a&gt; here online. We are happy to give you a demo!&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>End Point booth at CSTE 2022 conference</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2022/06/booth-at-cste-conference/"/>
      <id>https://www.endpointdev.com/blog/2022/06/booth-at-cste-conference/</id>
      <published>2022-06-09T00:00:00+00:00</published>
      <author>
        <name>Shannon Sandall</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2022/06/booth-at-cste-conference/david-barajas-RIQyCVb5IQY-unsplash.webp&#34; alt=&#34;Divided interstate highway in lush green trees and fields&#34;&gt;
&lt;a href=&#34;https://unsplash.com/photos/RIQyCVb5IQY&#34;&gt;Photo by David Barajas&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;converging-on-kentucky&#34;&gt;Converging on Kentucky&lt;/h3&gt;
&lt;p&gt;We are excited to announce that End Point will be attending the &lt;a href=&#34;https://www.csteconference.org/&#34;&gt;CSTE (Council of State and Territorial Epidemiologists) conference&lt;/a&gt; in less than two weeks!&lt;/p&gt;
&lt;p&gt;We will be running a booth during the 3-day conference in Louisville, Kentucky from Monday, June 20 through Wednesday, June 22, 2022. Our crew is scheduled to include Steve Yoman, Linda King, Ben Goldstein, and me.&lt;/p&gt;
&lt;p&gt;Please come visit us in booth #35 to learn more about the EpiTrax Disease Surveillance System and EMSA (Electronic Message Staging Area). Now is the time for public health entities to turn to modern systems to perform disease surveillance, automate the ingestion of electronic laboratory records (ELRs) and electronic case reports (eCRs), report to the CDC through NMI reporting methods, track outbreaks, perform contact management, and do it all with a highly configurable system.&lt;/p&gt;
&lt;p&gt;Our booth will feature a VisionPort Mini to showcase EpiTrax and EMSA! &lt;a href=&#34;https://www.visionport.com/&#34;&gt;VisionPort&lt;/a&gt; is our product combining hardware and software to give organizations the ability to create dynamic, shared immersive multimedia experiences. We are delighted when we have opportunities like this to use VisionPort to inform conference attendees about our own offerings such as EpiTrax and EMSA.&lt;/p&gt;
&lt;p&gt;We will be happy to demonstrate EpiTrax to you there. Here is a preview screenshot of the application&amp;rsquo;s disease outbreaks list view:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/epitrax-outbreaks-demo.webp&#34; alt=&#34;Screenshot of EpiTrax web application showing a list of disease outbreaks&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cste&#34;&gt;CSTE&lt;/h3&gt;
&lt;p&gt;What is CSTE? The &lt;a href=&#34;https://www.cste.org/&#34;&gt;Council of State and Territorial Epidemiologists&lt;/a&gt; is an organization that works to advance public health policy and epidemiologic capacity. They also provide information, education, and developmental support of practicing epidemiologists in a wide range of areas as well as expertise for program and surveillance efforts.&lt;/p&gt;
&lt;p&gt;Here are some of the conference sessions we plan to attend:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Monday, 2:00–3:15 PM:&lt;/strong&gt; In-Person Concurrent Breakout Sessions: Surveillance / Informatics I: Not Your Grandma’s Old-Fashioned: Data Modernization&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monday, 5:45–6:30 PM:&lt;/strong&gt; Virtual Concurrent Roundtable Sessions / Networking Surveillance / Informatics II: Electronic Case Reporting and Public Health Agencies—Needs and Directions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tuesday, 8:45–10:00 AM:&lt;/strong&gt; In-Person Concurrent Breakout Sessions: Surveillance / Informatics I: Taking off the Blinders: Innovative Methods for Detection and Surveillance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tuesday, 5:45–6:30 PM:&lt;/strong&gt; In-Person Concurrent Roundtable Sessions / Networking: Surveillance / Informatics I: CSTE National ELR Workgroup Meet and Greet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wednesday, 7:30–8:15 AM:&lt;/strong&gt; In-Person Concurrent Roundtable Sessions / Networking: Surveillance Informatics I: National Notifiable Disease Surveillance System (NNDSS): A Comprehensive Review&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Come see what End Point and EpiTrax can do for you! We would love to meet with you in person, a privilege we don&amp;rsquo;t take for granted these days.&lt;/p&gt;
&lt;p&gt;Or if you can&amp;rsquo;t make the conference, &lt;a href=&#34;/contact/&#34;&gt;contact us&lt;/a&gt; here online.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Data Reporting with EpiTrax</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2022/02/data-reporting-with-epitrax/"/>
      <id>https://www.endpointdev.com/blog/2022/02/data-reporting-with-epitrax/</id>
      <published>2022-02-16T00:00:00+00:00</published>
      <author>
        <name>Shannon Sandall</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2022/02/data-reporting-with-epitrax/20220107_002143-sm.webp&#34; alt=&#34;Sunset view from mountain height overlooking valley with city, lake, mountains with some snow, below yellow horizon and orange clouds under a blue sky&#34;&gt;&lt;/p&gt;
&lt;!-- Photo by Jon Jensen --&gt;
&lt;h3 id=&#34;early-covid-19-form-building-in-kansas&#34;&gt;Early COVID-19 form-building in Kansas&lt;/h3&gt;
&lt;p&gt;In March of 2020, many states struggled with disease surveillance systems that were not ready for the COVID-19 pandemic. States were forced to wait lengthy periods for their vendors or systems administrators to stand up customized forms for COVID-19 investigations.&lt;/p&gt;
&lt;p&gt;State of Kansas informatics staff were able to configure their form within a matter of hours. When the first COVID-19 records came rolling in, the state was ready to go. The Kansas Department of Health and Environment (KDHE) was using EpiTrax, a National Electronic Disease Surveillance System (NEDSS) compliant application created by the state of Utah.&lt;/p&gt;
&lt;p&gt;EpiTrax contains a powerful form-building utility that was easily customizable, allowing jurisdictional users to create forms for investigation and reporting purposes. Users could configure questions and value sets based on configurable lists, cutting down on free-text entries and ensuring data quality. Forms could be attached automatically or manually and assigned to specified agencies and conditions.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2022/02/data-reporting-with-epitrax/screenshot1.webp&#34; alt=&#34;Screenshot of form builder on Form Attributes tab with checkbox lists for Agencies and Conditions&#34;&gt;&lt;br&gt;
Screenshot of the form builder&lt;/p&gt;
&lt;h3 id=&#34;december-2021-updates&#34;&gt;December 2021 updates&lt;/h3&gt;
&lt;p&gt;Flash forward to December 2021. State of Utah developers rolled out an update to the EpiTrax form builder utility. All the previous version features, such as quick configurability and use of lists, remain, with additions to make investigators’ and informaticians’ lives easier. While the old form module was configurable, it did have room for improvement.&lt;/p&gt;
&lt;p&gt;The latest updates include question banks and value set banks that can be used across disease forms. This option allows for consistency across all forms and in reporting and analyzing data. State jurisdictions use system forms and core fields to pull data for CDC reporting purposes. The CDC NMI message mapping guides (MMGs) are the new generation of data transfer. These MMGs often require repeating fields, one option now available in the EpiTrax form builder.&lt;/p&gt;
&lt;p&gt;Users can configure forms based on the guide formats. Forms can be shared across conditions, aiding in the use of forms across comorbidities. The new form builder allows users to relate fields to existing core fields and sections. This allows the system to be more flexible and aids in creating a better flow in the user interface. The question formats accommodate many data types including address, phone and dates.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2022/02/data-reporting-with-epitrax/screenshot2.webp&#34; alt=&#34;Screenshot of select box drop-down showing widget type options&#34;&gt;&lt;br&gt;
Screenshot of the field type selector&lt;/p&gt;
&lt;h3 id=&#34;utahs-experience&#34;&gt;Utah&amp;rsquo;s experience&lt;/h3&gt;
&lt;p&gt;End Point staff discussed the new form builder with the Utah Department of Health’s (UDOH) Health Informatics Program Manager, Rachelle Boulton. Rachelle related that UDOH was able to add form fields and configure those fields in the EpiTrax NMI Module within one day when the CDC recently released version 1.1 of their COVID-19 MMG. They reached out to the CDC on December 13th to announce their readiness and were the first state to onboard on December 29th.&lt;/p&gt;
&lt;p&gt;She attributed the quick turnaround to the new form builder’s ease of use and to their use of the NMI Module. Rachelle said, “The form builder gives us the opportunity to collect data for CDC reporting requirements and allows us to make changes quickly and send data out quickly.”&lt;/p&gt;
&lt;p&gt;When asked what she likes most about the new form builder, Rachelle stated that she appreciates the new question and answer banks and their ability to quickly and efficiently create new forms that are appealing on the user interface.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2022/02/data-reporting-with-epitrax/screenshot3.webp&#34; alt=&#34;Screenshot of Manage Questions page showing value sets tab and list of values that can be used in form responses&#34;&gt;&lt;br&gt;
Screenshot of the question manager&lt;/p&gt;
&lt;h3 id=&#34;summary&#34;&gt;Summary&lt;/h3&gt;
&lt;p&gt;End Point is collaborating with our current clients to migrate data from the old form builder to the new. We are excited to help them use the new functionality.&lt;/p&gt;
&lt;p&gt;Along with this effort, we hope to build a form repository for future clients using the new form enhancements which will allow users to quickly onboard for CDC MMG reporting. These new forms would accommodate any needed state workflow changes or additions and would allow states to implement EpiTrax in a timelier manner.&lt;/p&gt;
&lt;p&gt;When asked if she had anything else to add, Rachelle said, “I really like that we try to make EpiTrax not just a surveillance system, but a change management system. We embed these changes in the workflow to make users’ lives easier.”&lt;/p&gt;
&lt;p&gt;We at End Point agree with Rachelle. We look forward to the future of EpiTrax and what we can do to help it continue to improve moving forward.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>EMSA: Electronic Messaging Staging Area</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2020/10/electronic-messaging-staging-area/"/>
      <id>https://www.endpointdev.com/blog/2020/10/electronic-messaging-staging-area/</id>
      <published>2020-10-30T00:00:00+00:00</published>
      <author>
        <name>Elizabeth Garrett Christensen</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2020/10/electronic-messaging-staging-area/emsa-banner.jpg&#34; alt=&#34;Sunset&#34;&gt;
&lt;a href=&#34;https://flic.kr/p/pnRYaf&#34;&gt;Photo&lt;/a&gt; by &lt;a href=&#34;https://flic.kr/ps/2bXFPr&#34;&gt;Lee Roberts&lt;/a&gt;, &lt;a href=&#34;https://creativecommons.org/licenses/by-sa/2.0/&#34;&gt;CC BY-SA 2.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;End Point has been involved with developing disease surveillance software for over a decade. One component of that work is EMSA, short for “Electronic Messaging Staging Area”.&lt;/p&gt;
&lt;p&gt;The EMSA system we’re currently using was developed by a consortium of states led by Utah, Kansas, and Nevada. It is a PHP web application and can be hosted in the cloud or on-premises as you would any other PHP application.&lt;/p&gt;
&lt;h3 id=&#34;emsa&#34;&gt;EMSA:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Is an ingest system for HL7 or CSV-formatted lab reports from doctor offices, labs, and other official reporting groups.&lt;/li&gt;
&lt;li&gt;Allows exporting XML output to your disease surveillance system.&lt;/li&gt;
&lt;li&gt;Is a web console for managing messages.&lt;/li&gt;
&lt;li&gt;Allows you to see messages that are malformed.&lt;/li&gt;
&lt;li&gt;Has configurable rules for disease types and message routing; some messages may go directly into a surveillance system while others may be stored for later.&lt;/li&gt;
&lt;li&gt;Has configurable “automated workflows” to validate message information and perform tasks.&lt;/li&gt;
&lt;li&gt;Can be connected to a BI (Business Intelligence) tool for reporting, or the database can be queried directly.&lt;/li&gt;
&lt;li&gt;Works with integration packages like Rhapsody to bring in data from other systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;End Point has also made custom modifications to EMSA allowing address validation for incoming messages.&lt;/p&gt;
&lt;p&gt;EMSA can be deployed along with EpiTrax, the open source tracking system, or as a standalone application connected to a different disease surveillance system.&lt;/p&gt;
&lt;h3 id=&#34;benefits-of-emsa&#34;&gt;Benefits of EMSA&lt;/h3&gt;
&lt;p&gt;Aside from all the features mentioned above, EMSA as an open-source solution brings other benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reduced cost: Other than development and consulting to help set it up, there are no ongoing licensing costs.&lt;/li&gt;
&lt;li&gt;Designed to work as part of the open-source EpiTrax disease surveillance system.&lt;/li&gt;
&lt;li&gt;Participating in the open source community that is growing in the healthcare industry.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;help-is-available&#34;&gt;Help is available!&lt;/h3&gt;
&lt;p&gt;Interested in talking to us more about EMSA for your disease tracking? &lt;a href=&#34;/contact/&#34;&gt;Reach out today.&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;references&#34;&gt;References&lt;/h3&gt;
&lt;p&gt;Emily Roberts, Rachelle Boulton, Josh Ridderhoff, Theron Jeppson. “Automated Processing of Electronic Data for Disease Surveillance.” &lt;em&gt;Online Journal of Public Health Informatics, 10(1):e2, May 22, 2018.&lt;/em&gt; &lt;a href=&#34;https://doi.org/10.5210/ojphi.v10i1.8903&#34;&gt;https://doi.org/10.5210/ojphi.v10i1.8903&lt;/a&gt;&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>COVID-19 Support for the Kansas Department of Health and Environment</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2020/09/covid-19-support-kansas-dept-health/"/>
      <id>https://www.endpointdev.com/blog/2020/09/covid-19-support-kansas-dept-health/</id>
      <published>2020-09-14T00:00:00+00:00</published>
      <author>
        <name>Steve Yoman</name>
      </author>
      <content type="html">
        &lt;h3 id=&#34;kansass-existing-epitrax-system&#34;&gt;Kansas’s existing EpiTrax system&lt;/h3&gt;
&lt;p&gt;End Point has worked on Kansas’s disease surveillance systems since 2011. In 2018 we migrated them from their legacy TriSano application to the open source EpiTrax surveillance system created by Utah’s Department of Health. The new EpiTrax system had been in full production for about eight months when COVID-19 cases started to grow in the United States.&lt;/p&gt;
&lt;h3 id=&#34;covid-19-help-needed&#34;&gt;COVID-19: Help needed&lt;/h3&gt;
&lt;p&gt;In March 2020, the Director of Surveillance Systems at the Kansas Department of Health and Environment (KDHE) asked us at End Point to create a web-based portal where labs, hospitals, and ad-hoc testing locations could enter COVID-19 test data. While systems existed for gathering data from labs and hospitals, they needed a way to quickly gather data from the many new and atypical sites collecting COVID-19 test information.&lt;/p&gt;
&lt;h3 id=&#34;our-approach&#34;&gt;Our approach&lt;/h3&gt;
&lt;p&gt;Since the portal was intended for people who were unfamiliar with the existing EpiTrax application, we were able to create a new design that was simple and direct, unconstrained by other applications. It required a self-registration function so users could access the system quickly and without administrative overhead, and users needed to understand how to use it without extensive training.&lt;/p&gt;
&lt;p&gt;We at End Point agreed to create the portal and dashboard for test results reporters immediately, while planning for later development of additional administrative functions. We used Ruby on Rails and Vue.js to build the portal due to their usefulness for rapid development. The Vue.js front-end JavaScript framework allowed us to quickly put together the portal UI and integrate it with the Rails back-end web services.&lt;/p&gt;
&lt;p&gt;Once approved, our team got to work setting up the environment, developing the portal application, and rigorously testing it.&lt;/p&gt;
&lt;p&gt;Here are some screenshots of the application:&lt;/p&gt;
&lt;h3 id=&#34;portal-home-page&#34;&gt;Portal home page&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2020/09/covid-19-support-kansas-dept-health/Home-Screen.jpg&#34; alt=&#34;Kansas Reportable Disease Portal home page&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;user-registration-page&#34;&gt;User registration page&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2020/09/covid-19-support-kansas-dept-health/newuser.png&#34; alt=&#34;Create New User Account page&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;dashboard&#34;&gt;Dashboard&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2020/09/covid-19-support-kansas-dept-health/dashboard.jpg&#34; alt=&#34;Dashboard for searching and browsing cases&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;reporters-entry-screens&#34;&gt;Reporters’ entry screens&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2020/09/covid-19-support-kansas-dept-health/Reporter-Data-Entry.jpg&#34; alt=&#34;Forms collecting information about reporter and patient&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2020/09/covid-19-support-kansas-dept-health/form-part-2.png&#34; alt=&#34;Forms collecting information about disease, speciment, and testing results&#34;&gt;&lt;/p&gt;
&lt;p&gt;The portal was launched on April 30.&lt;/p&gt;
&lt;h3 id=&#34;contact-tracers-support&#34;&gt;Contact tracers support&lt;/h3&gt;
&lt;p&gt;After the EpiTrax portal for COVID-19 was up and running, Kansas made urgent plans to hire 400 contact tracers. We updated the EpiTrax portal to accommodate this new type of user, showing contact tracers only the data they are authorized to view, while providing them the ability to make limited contact record updates and to create tasks. The project is ongoing, and eventually will be used for all diseases.&lt;/p&gt;
&lt;h3 id=&#34;epitrax-for-missouri&#34;&gt;EpiTrax for Missouri&lt;/h3&gt;
&lt;p&gt;Late this Spring, after learning of Kansas’s use of the EpiTrax platform and the powerful capabilities that it provides to the Kansas public health system, the State of Missouri reached out to us at End Point to request their own EpiTrax implementation. End Point and Missouri quickly came to agreement, and since July we have been working together build out a full production EpiTrax surveillance system for them.&lt;/p&gt;
&lt;h3 id=&#34;contact-us&#34;&gt;Contact us!&lt;/h3&gt;
&lt;p&gt;To discuss an EpiTrax project, &lt;a href=&#34;/contact/&#34;&gt;contact&lt;/a&gt; us. Our expert team is ready to help you meet your requirements.&lt;/p&gt;

      </content>
    </entry>
  
</feed>
