Repository: freelawproject/juriscraper
Pull request #1391: feat(ncbizct): new scraper for North Carolina Business Court
Author: login: quevon24
Created: 2025-05-07T23:17:18Z | Merged: 2025-05-21T15:12:28Z

Solves #1375 


Diff:
diff --git a/CHANGES.md b/CHANGES.md
index 381053003..5a80bc267 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -15,7 +15,7 @@ Releases are also tagged in git, if that's helpful.
 The following changes are not yet released, but are code complete:
 
 Features:
--
+- New scraper `ncbizct` for North Carolina Business Court
 
 Changes:
 -
diff --git a/juriscraper/opinions/united_states/state/__init__.py b/juriscraper/opinions/united_states/state/__init__.py
index ba5ff24a6..42759db57 100644
--- a/juriscraper/opinions/united_states/state/__init__.py
+++ b/juriscraper/opinions/united_states/state/__init__.py
@@ -94,6 +94,7 @@
     # "moctapp_western",
     "mont",
     "nc",
+    "ncbizct",
     "ncctapp",
     "neb",
     "nebctapp",
diff --git a/juriscraper/opinions/united_states/state/ncbizct.py b/juriscraper/opinions/united_states/state/ncbizct.py
new file mode 100644
index 000000000..0329bdc20
--- /dev/null
+++ b/juriscraper/opinions/united_states/state/ncbizct.py
@@ -0,0 +1,119 @@
+"""
+CourtID: ncbizct
+Court Short Name: North Carolina Business Court
+Author: Kevin Ramirez
+History:
+    2025-05-06, quevon24: First version
+"""
+
+import re
+from datetime import date
+from urllib.parse import urlencode
+
+from juriscraper.lib.string_utils import titlecase
+from juriscraper.OpinionSiteLinear import OpinionSiteLinear
+
+
+class Site(OpinionSiteLinear):
+    days_interval = 7
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.court_id = self.__module__
+        self.url = "https://www.nccourts.gov/documents/business-court-opinions"
+        self.first_opinion_date = date(1996, 10, 24)
+        self.make_backscrape_iterable(kwargs)
+
+    def _process_html(self):
+        for row in self.html.xpath(
+            ".//div[contains(@class,'list__items')]/article"
+        ):
+            # Extract case name and citation
+            case_string = (
+                row.xpath(".//h5[contains(@class,'list__title')]/a")[0]
+                .text_content()
+                .strip()
+            )
+            case_name, citation = self.extract_case_and_citation(case_string)
+
+            # Extract other data
+            date_filed = row.xpath(".//time")[0].text_content().strip()
+            # In the same span we can find the docket number, the lower court and the author
+            span_text = (
+                row.xpath(".//div[@class='meta']/span[4]")[0]
+                .text_content()
+                .strip()
+            )
+            docket_number = span_text.split("(", 1)[0].strip()
+
+            start_parentheses = span_text.find("(")
+            end_parentheses = span_text.find(")")
+
+            author_str = ""
+            lower_courts = []
+            if start_parentheses != -1 and end_parentheses != -1:
+                text_in_parentheses = span_text[
+                    start_parentheses + 1 : end_parentheses
+                ].strip()
+                parts = text_in_parentheses.split(" - ", 1)
+
+                if len(parts) > 0:
+                    lower_court_parts = parts[0].strip().split(",")
+                    for court in lower_court_parts:
+                        lower_courts.append(f"{court} County Court")
+
+                if len(parts) > 1:
+                    author_str = parts[1].strip()
+
+            status = row.xpath(".//span[6]")[0].text_content().strip()
+            download_url = row.xpath(
+                ".//div[contains(@class,'file file--teaser')]/a/@href"
+            )[0]
+
+            self.cases.append(
+                {
+                    "name": titlecase(case_name),
+                    "docket": docket_number,
+                    "url": download_url,
+                    "date": date_filed,
+                    "citation": citation,
+                    "status": status,
+                    "author": author_str,
+                    "lower_court": ", ".join(lower_courts),
+                }
+            )
+
+    def extract_case_and_citation(self, case_string):
+        """Extract citations and clean up case name
+
+        Possible strings:
+        BRADLEY V. U.S. PACKAGING, INC., et al. 1998 NCBC 3
+        FRAZIER v. BEARD 1996 NCBC 1
+        ATKORE INT'L, INC. v. DINKHELLER, 2025 NCBC 20
+        """
+        case_string = case_string.strip()
+        citation_match = re.search(r"(\d{4} NCBC \d+)$", case_string)
+
+        if citation_match:
+            citation = citation_match.group(1)
+            case_name = case_string[: citation_match.start()].strip()
+            case_name = case_name.rstrip(", ").strip()
+        else:
+            citation = ""
+            case_name = case_string
+
+        return case_name, citation
+
+    def _download_backwards(self, dates: tuple[date, date]) -> None:
+        """Build URL with year input and scrape
+
+        :param dates: (start_date, end_date) tuple
+        :return None
+        """
+        params = {
+            "field_publish_date_value": dates[0].strftime("%m/%d/%Y"),
+            "field_publish_date_value_1": dates[1].strftime("%m/%d/%Y"),
+        }
+        self.url = f"{self.url}?{urlencode(params)}"
+        self.html = self._download()
+        self._process_html()
diff --git a/tests/examples/opinions/united_states/ncbizct_example.compare.json b/tests/examples/opinions/united_states/ncbizct_example.compare.json
new file mode 100644
index 000000000..7ad3e74d2
--- /dev/null
+++ b/tests/examples/opinions/united_states/ncbizct_example.compare.json
@@ -0,0 +1,54 @@
+[
+  {
+    "case_dates": "2025-05-06",
+    "case_names": "Yoder v. Verm",
+    "download_urls": "https://www.nccourts.gov/assets/documents/opinions/2025%20NCBC%2022.pdf?VersionId=NsKchy5ElYXS4QQFeopc0iYQ7hHR17NR",
+    "precedential_statuses": "Published",
+    "blocked_statuses": false,
+    "date_filed_is_approximate": false,
+    "docket_numbers": "23-CVS-1820",
+    "lower_courts": "Henderson County Court",
+    "citations": "2025 NCBC 22",
+    "case_name_shorts": "Yoder",
+    "authors": "A. Todd Brown"
+  },
+  {
+    "case_dates": "2025-04-16",
+    "case_names": "Jackson v. Mh Master Holdings, Lllp",
+    "download_urls": "https://www.nccourts.gov/assets/documents/opinions/2025%20NCBC%2021.pdf?VersionId=AJTKum1KPJolFGBzRuxCmlyGAadQNsvo",
+    "precedential_statuses": "Published",
+    "blocked_statuses": false,
+    "date_filed_is_approximate": false,
+    "docket_numbers": "23-CVS-5013",
+    "lower_courts": "Buncombe County Court",
+    "citations": "2025 NCBC 21",
+    "case_name_shorts": "",
+    "authors": "Julianna Theall Earp"
+  },
+  {
+    "case_dates": "2025-04-10",
+    "case_names": "Atkore Int'l, Inc. v. Dinkheller",
+    "download_urls": "https://www.nccourts.gov/assets/documents/opinions/2025%20NCBC%2020.pdf?VersionId=.Q0i_0F8tud.Xvasy_sZ2kLXWu58V8BH",
+    "precedential_statuses": "Published",
+    "blocked_statuses": false,
+    "date_filed_is_approximate": false,
+    "docket_numbers": "24-CVS-22644",
+    "lower_courts": "Guilford County Court",
+    "citations": "2025 NCBC 20",
+    "case_name_shorts": "Dinkheller",
+    "authors": "Michael L. Robinson"
+  },
+  {
+    "case_dates": "2024-12-19",
+    "case_names": "In Re Se. Eye Ctr. (Pending Matters); In Re Se. Eye Ctr. (Judgments)",
+    "download_urls": "/assets/documents/opinions/2024%20NCBC%2084.pdf?VersionId=7X6TuhqWAhw9BIPBxOhf8BYxurzvLFMV",
+    "precedential_statuses": "Published",
+    "blocked_statuses": false,
+    "date_filed_is_approximate": false,
+    "docket_numbers": "15-CVS-1648 & 12-CVS-11322",
+    "lower_courts": "Guilford County Court, Wake County Court",
+    "citations": "2024 NCBC 84",
+    "case_name_shorts": "",
+    "authors": "Louis A. Bledsoe, III"
+  }
+]
\ No newline at end of file
diff --git a/tests/examples/opinions/united_states/ncbizct_example.html b/tests/examples/opinions/united_states/ncbizct_example.html
new file mode 100644
index 000000000..a8a71fa81
--- /dev/null
+++ b/tests/examples/opinions/united_states/ncbizct_example.html
@@ -0,0 +1,1052 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr" prefix="content: http://purl.org/rss/1.0/modules/content/  dc: http://purl.org/dc/terms/  foaf: http://xmlns.com/foaf/0.1/  og: http://ogp.me/ns#  rdfs: http://www.w3.org/2000/01/rdf-schema#  schema: http://schema.org/  sioc: http://rdfs.org/sioc/ns#  sioct: http://rdfs.org/sioc/types#  skos: http://www.w3.org/2004/02/skos/core#  xsd: http://www.w3.org/2001/XMLSchema# " style="" class=" inputtypes-search inputtypes-tel inputtypes-url inputtypes-email no-inputtypes-datetime inputtypes-date inputtypes-month inputtypes-week inputtypes-time inputtypes-datetime-local inputtypes-number inputtypes-range inputtypes-color details no-touchevents js"><head>
+        <meta charset="utf-8">
+<meta name="description" content="Court’s published decision in a case and explanation written by a judge of the Business Court.">
+<link rel="canonical" href="https://www.nccourts.gov/documents/business-court-opinions">
+<meta name="Generator" content="Drupal 9 (https://www.drupal.org)">
+<meta name="MobileOptimized" content="width">
+<meta name="HandheldFriendly" content="true">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="icon" href="/themes/contrib/nccourts-theme/favicon.ico" type="image/vnd.microsoft.icon">
+<script src="/assets/s3fs-public/google_tag/primary/google_tag.script.js?VersionId=8D9JJ0i1IYC.QWB1GKLMGzDpRqd6IW7j?svwnwr" defer=""></script>
+
+        <title>Business Court Opinions | North Carolina Judicial Branch</title>
+        <link rel="stylesheet" media="all" href="/assets/s3fs-public/css/css_W4QUEEklmaHGF2XAApczWfWV9o-qTaoZVqJFAE_9GJ8.css?VersionId=CUENUqRx1eLDsZc4fnJW0xQuRp.74a88">
+<link rel="stylesheet" media="screen" href="/assets/s3fs-public/css/css_vgM-c--Dm1SokWJtvzGfxExJz17efOI_UuUwsOZBFJw.css?VersionId=iJ.RRekxcXN..lQt_JXs0BVuc50GvlRT">
+<link rel="stylesheet" media="print" href="/assets/s3fs-public/css/css_YGT7RROmAimiv7bIFH-R-dYreKjw92d9LQY6h3VMZtw.css?VersionId=qHH9o3.IUGkVsZ_beEa9_6x1NpzZpWhn">
+
+        <script src="/core/assets/vendor/modernizr/modernizr.min.js?v=3.11.7"></script>
+<script src="/core/misc/modernizr-additional-tests.js?v=3.11.7"></script>
+
+    </head>
+    <body>
+                <a class="shortcut--main" href="#content-container">Skip to main content</a>
+        <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-K24HTP2" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
+          <div class="dialog-off-canvas-main-canvas" data-off-canvas-main-canvas="">
+
+
+
+
+
+
+
+
+
+
+  <header id="header-container" class="header-container" role="banner">
+              <div id="block-sitebranding" class="actions block block-system block-system-branding-block">
+
+  <h1 class="logo logo--header">
+    <a href="/" title="Home" rel="home">
+      <span>North Carolina Judicial Branch</span>
+    </a>
+  </h1>
+
+  <button id="toggle--search" class="toggle toggle--search" aria-controls="panel--search" aria-expanded="false">Search
+  </button>
+  <button id="toggle--menu" class="toggle toggle--menu" aria-controls="panel--menu" aria-expanded="false">Menu
+  </button>
+</div><div id="panel--search" class="panel panel--search" data-panel-search="">
+  <form class="form--search" action="/search-results">
+    <label for="site-search">Search...</label>
+    <input data-search-input="" id="site-search" type="search" name="search_api_fulltext" placeholder="Search..." autocomplete="off">
+    <input type="submit" id="header-search-bar-submit-btn" value="Search...">
+  </form>
+  <div data-search-suggestions-panel="" id="panel--suggestions" class="panel panel--suggestions">
+          <div data-quick-links="" id="links--search-quick" class="links links--search-quick links--active">
+        <div class="links__title">Quick links</div>
+        <ul class="links__list">
+
+                          <li class="links__item">
+                <a href="https://www.nccourts.gov/locations">
+                  Find a courthouse
+                </a>
+              </li>
+
+
+                          <li class="links__item">
+                <a href="https://www.nccourts.gov/court-dates">
+                  Find my court date
+                </a>
+              </li>
+
+
+                          <li class="links__item">
+                <a href="https://www.nccourts.gov/services">
+                  Pay my citation online
+                </a>
+              </li>
+
+
+                          <li class="links__item">
+                <a href="https://www.nccourts.gov/help-topics/jury-service/jury-service">
+                  Prepare for jury service
+                </a>
+              </li>
+
+
+                          <li class="links__item">
+                <a href="https://www.nccourts.gov/documents/forms">
+                  Find a form
+                </a>
+              </li>
+
+                  </ul>
+      </div>
+
+    <div data-suggested-searches="" id="links--search-suggest" class="links links--search-suggest">
+      <div class="links__title">Suggested searches</div>
+      <ul class="links__list">
+      </ul>
+    </div>
+
+    <div data-top-searches="" id="links--search-top" class="links links--search-top">
+      <div class="links__title">Top results</div>
+      <ul class="links__list">
+      </ul>
+    </div>
+
+    <div data-all-results="" id="links--search-all" class="links links--search-all">
+      <ul class="links__list">
+        <li class="links__item"><a href="/search-results?search_api_fulltext=">View all search results</a>
+        </li>
+      </ul>
+    </div>
+
+  </div>
+</div>
+<div id="panel--menu" class="panel panel--menu">
+    <nav id="menu--primary" class="menu menu--primary">
+        <h2 class="menu__title">Menu</h2>
+                      <ul class="menu__list">
+                      <li class="menu__item menu__item--dropdown menu__item--expanded menu__item--active-trail">
+                  <a href="">Courts</a>
+
+                  <div class="menu__dropdown">
+
+                                                                            <div class="menu__subtitle">North Carolina Courts</div>
+                                                                                          <ul>
+                                                  <a href="/courts">
+                                                      Overview of the Courts
+                                  </a>
+                                                                        <a href="/locations">
+                                                      Court Hours and Locations
+                                  </a>
+                                                                        <a href="/courts/supreme-court">
+                                                        <strong>
+                                    Supreme Court
+                                      </strong>
+                                  </a>
+                                                                        <a href="/courts/court-of-appeals">
+                                                        <strong>
+                                    Court of Appeals
+                                      </strong>
+                                  </a>
+                                                                        <a href="/courts/superior-court">
+                                                        <strong>
+                                    Superior Court
+                                      </strong>
+                                  </a>
+                                                                        <a href="/courts/district-court">
+                                                        <strong>
+                                    District Court
+                                      </strong>
+                                  </a>
+                                                                        <a href="/courts/business-court">
+                                                        <strong>
+                                    Business Court
+                                      </strong>
+                                  </a>
+                                                                        <a href="/courts/recovery-courts">
+                                                        <strong>
+                                    Recovery Courts
+                                      </strong>
+                                  </a>
+                                                                          </ul>
+                  <div class="menu__divider"></div>
+                                                                    <div class="menu__subtitle">Related links</div>
+                                                                                          <ul>
+                                                  <a href="/documents/appellate-court-opinions">
+                                                      Appellate Court Opinions
+                                  </a>
+                                                                        <a href="/documents/business-court-opinions">
+                                                      Business Court Opinions
+                                  </a>
+                                                                        <a href="/closings">
+                                                      Closings
+                                  </a>
+                                                                        <a href="/holiday-schedule">
+                                                      Holiday Schedule
+                                  </a>
+                                                                        <a href="/commissions">
+                                                      Commissions
+                                  </a>
+                                                                        <a href="/programs">
+                                                      Programs
+                                  </a>
+                                                                        <a href="/about/about-judicial-branch/careers">
+                                                      Careers
+                                  </a>
+                                                                        <a href="/about/nc-administrative-office-of-the-courts/training#educational-programs-3964">
+                                                      Educational Programs
+                                  </a>
+
+                          </ul>
+                      </div>
+
+      </li>
+                      <li class="menu__item menu__item--dropdown menu__item--expanded">
+                  <a href="">Help Topics</a>
+
+                  <div class="menu__dropdown">
+
+                                                                            <div class="menu__subtitle">Categories</div>
+                                                                                          <ul>
+                                                  <a href="/help-topics/court-records">
+                                                      Court Records
+                                  </a>
+                                                                        <a href="/help-topics/criminal-law">
+                                                      Criminal Law
+                                  </a>
+                                                                        <a href="/help-topics/disability-and-language-access">
+                                                      Disability and Language Access
+                                  </a>
+                                                                        <a href="/help-topics/divorce-and-marriage">
+                                                      Divorce and Marriage
+                                  </a>
+                                                                        <a href="/help-topics/domestic-violence">
+                                                      Domestic Violence
+                                  </a>
+                                                                        <a href="/help-topics/family-and-children">
+                                                      Family and Children
+                                  </a>
+                                                                        <a href="/help-topics/fees-and-payments">
+                                                      Fees and Payments
+                                  </a>
+                                                                        <a href="/help-topics/find-an-attorney">
+                                                      Find an Attorney
+                                  </a>
+                                                                        <a href="/help-topics/guardianship">
+                                                      Guardianship
+                                  </a>
+                                                                        <a href="/help-topics/housing">
+                                                      Housing
+                                  </a>
+                                                                        <a href="/help-topics/jury-service">
+                                                      Jury Service
+                                  </a>
+                                                                        <a href="/help-topics/lawsuits-and-small-claims">
+                                                      Lawsuits and Small Claims
+                                  </a>
+                                                                        <a href="/help-topics/traffic-and-vehicles">
+                                                      Traffic and Vehicles
+                                  </a>
+                                                                        <a href="/help-topics/wills-and-estates">
+                                                      Wills and Estates
+                                  </a>
+                                                                          </ul>
+                  <div class="menu__divider"></div>
+                                                                                                                            <ul>
+                                                  <a href="/help-topics">
+                                                      See All Help Topics
+                                  </a>
+
+                          </ul>
+                      </div>
+
+      </li>
+                      <li class="menu__item menu__item--dropdown menu__item--expanded menu__item--#">
+                  <a href="">Services</a>
+
+                  <div class="menu__dropdown">
+
+                                                                            <div class="menu__subtitle">eCourts</div>
+                                                                                          <ul>
+                                                  <a href="/services">
+                                                      Citation Tickets
+                                  </a>
+                                                                        <a href="/services">
+                                                      Court Collections
+                                  </a>
+                                                                        <a href="/services">
+                                                      Guide &amp; File
+                                  </a>
+                                                                        <a href="/services/ecourts-services#portal-10512">
+                                                      Portal (Court Records / Payments)
+                                  </a>
+                                                                          </ul>
+                  <div class="menu__divider"></div>
+                                                                    <div class="menu__subtitle">eFiling</div>
+                                                                                          <ul>
+                                                  <a href="/services/ecourts-services#efiling-9460">
+                                                      eCourts eFiling (File &amp; Serve)
+                                  </a>
+                                                                        <a href="https://www.ncappellatecourts.org/">
+                                                      Appellate Courts
+                                  </a>
+                                                                        <a href="https://ncbc.nccourts.org/filer/">
+                                                      Business Court
+                                  </a>
+                                                                        <a href="/services/legacy-services#efile-court-documents-9496">
+                                                      Legacy Civil eFiling
+                                  </a>
+                                                                          </ul>
+                  <div class="menu__divider"></div>
+                                                                    <div class="menu__subtitle">Requests</div>
+                                                                                          <ul>
+                                                  <a href="/services">
+                                                      Court Date Notifications
+                                  </a>
+                                                                        <a href="/help-topics/court-records/criminal-background-check">
+                                                      Criminal Background Check
+                                  </a>
+                                                                        <a href="/programs/disability-access">
+                                                      Disability Accommodation
+                                  </a>
+                                                                        <a href="/services/request-a-public-record">
+                                                      Public Record
+                                  </a>
+                                                                        <a href="/services/remote-public-access-program">
+                                                      Remote Public Access
+                                  </a>
+                                                                        <a href="/programs/office-of-language-access-services/do-you-need-a-court-interpreter">
+                                                      Spoken Language Interpreter
+                                  </a>
+                                                                          </ul>
+                  <div class="menu__divider"></div>
+                                                                                                                            <ul>
+                                                  <a href="/services">
+                                                      See All Services
+                                  </a>
+
+                          </ul>
+                      </div>
+
+      </li>
+                      <li class="menu__item">
+                  <a href="/documents/forms">Forms</a>
+
+
+      </li>
+                      <li class="menu__item">
+                  <a href="/court-dates">Court Dates</a>
+
+
+      </li>
+                      <li class="menu__item">
+                  <a href="/contact">Contact</a>
+
+
+      </li>
+                      <li class="menu__item menu__item--last-child">
+                  <a href="/going-to-court">Going to Court</a>
+
+
+      </li>
+      </ul>
+
+            </nav>
+</div>
+
+
+      </header>
+
+<main id="content-container" class="content-container" role="main" tabindex="-1">
+
+        <div>
+    <div id="block-coronaviruscovid19alert">
+
+
+
+  <div aria-live="assertive" class="contextual-region alert alert--global" id="block-alerts" role="alert" hidden="hidden" style="display: none;">
+<div class="wrapper">
+<div class="alert__item" id="389d7ed7-b077-4b16-918b-44cc82a16a4d">
+<div class="alert__category"><span class="badge badge--info">eCourts</span></div>
+<div class="alert__message"><strong><span title="Alamance, Anson, Beaufort, Bertie, Bladen, Brunswick, Buncombe, Cabarrus, Camden, Carteret, Chatham, Cherokee, Chowan, Clay, Columbus, Craven, Cumberland, Currituck, Dare, Duplin, Durham, Edgecombe, Franklin, Gates, Graham, Granville, Greene, Guilford, Halifax, Harnett, Haywood, Henderson, Hertford, Hoke, Hyde, Jackson, Johnston, Jones, Lee, Lenoir, Macon, Martin, Mecklenburg, Montgomery, Moore, Nash, New Hanover, Northampton, Onslow, Orange, Pamlico, Pasquotank, Pender, Perquimans, Person, Pitt, Polk, Randolph, Richmond, Robeson, Sampson, Scotland, Stanly, Swain, Transylvania, Tyrrell, Union, Vance, Wake, Warren, Washington, Wayne, and Wilson">eCourts Now Available in 73 Counties*</span><span style="font-weight: 400;">. Find info, training, resources, and 11 counties now live on April 28.</span></strong>&nbsp;<a class="alert__link" data-entity-substitution="canonical" data-entity-type="node" data-entity-uuid="ff9b05f7-4cf6-4b76-8854-3e4376a52c89" href="/ecourts">Learn more</a></div>
+</div>
+<!--
+<div class="alert__item" id="389d7ed7-b077-4b16-918b-44cc82a16a4d"><div class="alert__category"><span class="badge badge--danger">News</span></div>
+<div class="alert__message">Judicial Branch courts and offices are closed Friday, April 18, for Good Friday holiday. <a class="alert__link" href="/holiday-schedule">View holidays</a></div>
+</div>
+<p>-->
+
+
+      <div class="alert__item" id="closings-321e6abfff520497c0c57026ffc2456d">
+                        <div class="alert__category">
+          <span class="badge badge-pill badge--danger">Court closings</span>
+        </div>
+        <div class="alert__message">
+          <span class="message"><strong><em class="placeholder">1</em> county</strong> is currently reporting closings and/or advisories</span>
+          <a class="alert__link" href="/closings">View active closings</a>
+        </div>
+      </div>
+        </div>
+<p><button class="alert__dismiss">Dismiss alert</button></p>
+</div>
+
+
+  </div>
+
+<div id="block-alerts" class="alert alert--global hidden" hidden="hidden" role="alert" aria-live="assertive">
+
+  <div class="wrapper">
+
+
+  </div>
+
+  <button class="alert__dismiss">Dismiss alert</button>
+
+</div>
+ <div id="block-alerts-alert-template" class="hidden visually-hidden" hidden="">
+
+
+      <div class="alert__item">
+                        <div class="alert__category">
+          <span class="badge badge-pill">Alert Cagertory Placeholder</span>
+        </div>
+        <div class="alert__message">
+          <span class="message"></span>
+          <a class="alert__link" href="#url-placeholder">Link Text Placeholder</a>
+        </div>
+      </div>
+        </div>
+  </div>
+
+      <div>
+    <div id="block-languagesheaderbreadcrumbs">
+
+
+
+  <div class="wrapper">
+<div class="meta" style="padding-left: 0px; padding-right: 0px; padding-top: 10px;">Languages: <a href="/languages/informacion-en-espanol">Español</a> | <a href="/languages/informations-en-francais">Français</a> | <a href="/languages/informaciya-na-russkom-yazyke">Pусский</a> | <a href="/languages/thong-tin-bang-tieng-viet">Tiếng Việt</a> | <a href="/languages/jiantizhongwenxinxi">简体中文信息</a> | <a href="/languages/zhongguochuantongxinxi">中國傳統信息</a> | <a href="/languages/almlwmat-ballght-alrbyt">عربى</a></div>
+</div>
+
+
+  </div>
+<div id="block-breadcrumbs">
+
+
+          <nav class="breadcrumb" role="navigation" aria-labelledby="system-breadcrumb">
+        <h2 id="system-breadcrumb" class="visually-hidden">Navigation</h2>
+        <div class="breadcrumbs">
+            <div class="wrapper">
+                <ol itemscope="" itemtype="http://schema.org/BreadcrumbList">
+                                            <li itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
+                            <span itemscope="" itemtype="http://schema.org/Thing" itemprop="item">
+                                                                    <a href="/"><span itemprop="name" title="Go back to: Home">Home</span></a>
+
+                            </span>
+                            <meta itemprop="position" content="1" loop-length="3">
+                        </li>
+                                            <li class="parent" itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
+                            <span itemscope="" itemtype="http://schema.org/Thing" itemprop="item">
+                                                                    <a href="/documents"><span itemprop="name" title="Go back to: Documents">Documents</span></a>
+
+                            </span>
+                            <meta itemprop="position" content="2" loop-length="3">
+                        </li>
+                                            <li itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
+                            <span itemscope="" itemtype="http://schema.org/Thing" itemprop="item">
+                                                                    <span itemprop="name" title="Currently viewing: Business Court Opinions"> Business Court Opinions</span>
+
+                            </span>
+                            <meta itemprop="position" content="3" loop-length="3">
+                        </li>
+                                    </ol>
+            </div>
+        </div>
+    </nav>
+
+  </div>
+
+  </div>
+
+
+  <article itemscope="" itemtype="http://schema.org/WebPage">
+
+                <header class="title title--primary">
+    <div class="wrapper">
+
+
+
+
+        <div itemprop="publisher" itemscope="" itemtype="https://schema.org/Organization">
+    <div itemprop="logo" itemscope="" itemtype="https://schema.org/ImageObject">
+                  <meta itemprop="url" content="https://www.nccourts.gov/themes/contrib/nccourts-theme/assets/dist/img/l_publisher.png">
+      <meta itemprop="width" content="600">
+      <meta itemprop="height" content="60">
+    </div>
+    <meta itemprop="name" content="North Carolina Judicial Branch">
+  </div>
+
+        <div itemprop="author" itemscope="" itemtype="https://schema.org/Person" hidden="hidden">By <span itemprop="name">North Carolina Judicial Branch</span>
+  </div>
+
+
+            <h1 class="title__label" itemprop="headline">
+        Business Court Opinions       </h1>
+
+
+              <div class="title__description" itemprop="description">
+          Court’s published decision in a case and explanation written by a judge of the Business Court.        </div>
+
+    </div>
+  </header>
+
+
+
+    <div class="zones" data-columns="2" data-layout-reverse="">
+
+            <div class="wrapper">
+
+
+
+                                                      <aside class="zone">
+                                                        <div class="views-exposed-form" data-drupal-selector="views-exposed-form-documents-business-opinions" id="block-exposedformdocumentsbusiness-opinions">
+
+
+
+
+<form region="sidebar_primary" action="/documents/business-court-opinions" method="get" id="views-exposed-form-documents-business-opinions" accept-charset="UTF-8" class="form form--filter-panel" data-once="exposed-form">
+    <h2 class="form__title">Filters</h2>
+    <p class="form__description">You can use the filters to show only results that match your interests.</p>
+    <fieldset>
+        <legend class="sr-only">Filter opinions</legend>
+
+<div class="js-form-item form-item js-form-type-textfield form-item-combine js-form-item-combine formblock">
+      	<label type="textfield" for="edit-combine--3" class="formblock__label">Contains</label>
+
+<input placeholder="search keywords" data-drupal-selector="edit-combine" type="text" id="edit-combine--3" name="combine" value="" size="30" maxlength="128" class="form-text formblock__field">
+
+                    </div>
+
+<div class="js-form-item form-item js-form-type-textfield form-item-field-publish-date-value js-form-item-field-publish-date-value formblock">
+      	<label type="textfield" for="edit-field-publish-date-value--3" class="formblock__label">Filed after</label>
+
+<input placeholder="MM/DD/YYYY (start date)" data-drupal-selector="edit-field-publish-date-value" type="text" id="edit-field-publish-date-value--3" name="field_publish_date_value" value="04/06/2025" size="30" maxlength="128" class="form-text formblock__field">
+
+                    </div>
+
+<div class="js-form-item form-item js-form-type-textfield form-item-field-publish-date-value-1 js-form-item-field-publish-date-value-1 formblock">
+      	<label type="textfield" for="edit-field-publish-date-value-1--3" class="formblock__label">Filed before</label>
+
+<input placeholder="MM/DD/YYYY (end date)" data-drupal-selector="edit-field-publish-date-value-1" type="text" id="edit-field-publish-date-value-1--3" name="field_publish_date_value_1" value="05/06/2025" size="30" maxlength="128" class="form-text formblock__field">
+
+                    </div>
+
+<div class="js-form-item form-item js-form-type-select form-item-field-business-court-author-target-id js-form-item-field-business-court-author-target-id formblock">
+      	<label type="select" for="edit-field-business-court-author-target-id--3" class="formblock__label">Author</label>
+
+<select data-drupal-selector="edit-field-business-court-author-target-id" id="edit-field-business-court-author-target-id--3" name="field_business_court_author_target_id" class="form-select formblock__field"><option value="All" selected="selected">- Any -</option><option value="2510">Louis A. Bledsoe, III</option><option value="2549">A. Todd Brown</option><option value="2514">Adam M. Conrad</option><option value="2540">Mark A. Davis</option><option value="2516">Albert Diaz</option><option value="2539">Julianna Theall Earp</option><option value="2511">James L. Gale</option><option value="2550">Matthew T. Houston</option><option value="2517">John R. Jolly</option><option value="2512">Gregory P. McGuire</option><option value="2518">Calvin E. Murphy</option><option value="2513">Michael L. Robinson</option><option value="2515">Ben F. Tennille</option></select>
+                    </div>
+
+<div class="js-form-item form-item js-form-type-select form-item-field-county-target-id js-form-item-field-county-target-id formblock">
+      	<label type="select" for="edit-field-county-target-id--3" class="formblock__label">County</label>
+
+<select data-drupal-selector="edit-field-county-target-id" id="edit-field-county-target-id--3" name="field_county_target_id" class="form-select formblock__field"><option value="All" selected="selected">- Any -</option><option value="138">Alamance</option><option value="139">Alexander</option><option value="140">Alleghany</option><option value="141">Anson</option><option value="142">Ashe</option><option value="143">Avery</option><option value="144">Beaufort</option><option value="145">Bertie</option><option value="146">Bladen</option><option value="147">Brunswick</option><option value="148">Buncombe</option><option value="149">Burke</option><option value="150">Cabarrus</option><option value="151">Caldwell</option><option value="152">Camden</option><option value="153">Carteret</option><option value="154">Caswell</option><option value="155">Catawba</option><option value="156">Chatham</option><option value="157">Cherokee</option><option value="158">Chowan</option><option value="159">Clay</option><option value="160">Cleveland</option><option value="161">Columbus</option><option value="162">Craven</option><option value="163">Cumberland</option><option value="164">Currituck</option><option value="165">Dare</option><option value="166">Davidson</option><option value="167">Davie</option><option value="168">Duplin</option><option value="169">Durham</option><option value="170">Edgecombe</option><option value="171">Forsyth</option><option value="172">Franklin</option><option value="173">Gaston</option><option value="174">Gates</option><option value="175">Graham</option><option value="176">Granville</option><option value="177">Greene</option><option value="178">Guilford</option><option value="179">Halifax</option><option value="180">Harnett</option><option value="181">Haywood</option><option value="182">Henderson</option><option value="183">Hertford</option><option value="184">Hoke</option><option value="185">Hyde</option><option value="186">Iredell</option><option value="187">Jackson</option><option value="188">Johnston</option><option value="189">Jones</option><option value="190">Lee</option><option value="191">Lenoir</option><option value="192">Lincoln</option><option value="193">Macon</option><option value="194">Madison</option><option value="195">Martin</option><option value="196">McDowell</option><option value="197">Mecklenburg</option><option value="198">Mitchell</option><option value="199">Montgomery</option><option value="200">Moore</option><option value="201">Nash</option><option value="202">New Hanover</option><option value="203">Northampton</option><option value="204">Onslow</option><option value="205">Orange</option><option value="206">Pamlico</option><option value="207">Pasquotank</option><option value="208">Pender</option><option value="209">Perquimans</option><option value="210">Person</option><option value="211">Pitt</option><option value="212">Polk</option><option value="213">Randolph</option><option value="214">Richmond</option><option value="215">Robeson</option><option value="216">Rockingham</option><option value="217">Rowan</option><option value="218">Rutherford</option><option value="219">Sampson</option><option value="220">Scotland</option><option value="221">Stanly</option><option value="222">Stokes</option><option value="223">Surry</option><option value="224">Swain</option><option value="225">Transylvania</option><option value="226">Tyrrell</option><option value="227">Union</option><option value="228">Vance</option><option value="229">Wake</option><option value="230">Warren</option><option value="231">Washington</option><option value="232">Watauga</option><option value="233">Wayne</option><option value="234">Wilkes</option><option value="235">Wilson</option><option value="236">Yadkin</option><option value="237">Yancey</option></select>
+                    </div>
+
+<div class="js-form-item form-item js-form-type-select form-item-sort-by js-form-item-sort-by formblock">
+      	<label type="select" for="edit-sort-by--3" class="formblock__label">Sort by</label>
+
+<select data-drupal-selector="edit-sort-by" id="edit-sort-by--3" name="sort_by" class="form-select formblock__field"><option value="field_publish_date_value" selected="selected">Publish Date (select order below)</option></select>
+                    </div>
+
+<div class="js-form-item form-item js-form-type-select form-item-sort-order js-form-item-sort-order formblock">
+      	<label type="select" for="edit-sort-order--3" class="formblock__label">Order</label>
+
+<select data-drupal-selector="edit-sort-order" id="edit-sort-order--3" name="sort_order" class="form-select formblock__field"><option value="ASC">Ascending</option><option value="DESC" selected="selected">Descending</option></select>
+                    </div>
+<div data-drupal-selector="edit-actions" class="form-actions js-form-wrapper form-wrapper" id="edit-actions--3">
+<input data-drupal-selector="edit-submit-documents-3" type="submit" id="edit-submit-documents--3" value="Apply" class="button js-form-submit form-submit formblock__field">
+</div>
+
+
+    </fieldset>
+</form>
+
+  </div>
+
+
+                              </aside>
+
+
+        <div class="zone" itemprop="">
+                                      <div class="views-element-container">
+<div class="js-view-dom-id-4a1bc2ba8f5b09460794a2771ecd6600e424ec6f5cc706123c9e3648c573b713" data-once="ajax-pager">
+
+
+
+
+      <p align="right">View <a href="/documents/orders-of-significance">Business Court Orders of Significance</a></p>
+<h2 id="title--contextual" class="title title--contextual"><strong>3 Business Court Opinions</strong><div class="filter-settings"></div></h2>
+
+
+
+
+  <section class="list list--documents">
+
+    <div class="list__items">
+
+
+<article role="article" about="/documents/business-court-opinions/yoder-v-verm-2025-ncbc-22" class="list__item" itemscope="" itemtype="http://schema.org/WebPage">
+  <div class="meta">
+    <time datetime="2025-05-06T00:00:00-04:00">
+      May 6, 2025
+    </time>
+    <span class="sr-only">,</span>&nbsp;<span></span>
+          <span class="sr-only">,</span>&nbsp;<span>23-CVS-1820
+                  (Henderson - A. Todd Brown)
+              </span>
+
+              <span class="sr-only">,</span>&nbsp;<span>Published</span>
+            </div>
+  <h5 class="list__title" itemprop="headline">
+    <a href="https://www.nccourts.gov/documents/business-court-opinions/yoder-v-verm-2025-ncbc-22">
+      YODER v. VERM, 2025 NCBC 22
+    </a>
+  </h5>
+  <div itemprop="description">
+
+  <p>ORDER AND OPINION ON PLAINTIFF'S MOTION FOR PARTIAL SUMMARY JUDGMENT</p>
+
+
+
+
+
+
+
+
+
+
+<div class="file file--teaser">
+  <a title="2025 NCBC 22.pdf" itemprop="url" href="https://www.nccourts.gov/assets/documents/opinions/2025%20NCBC%2022.pdf?VersionId=NsKchy5ElYXS4QQFeopc0iYQ7hHR17NR" target="_blank"><span itemprop="fileFormat">view/download</span></a></div>
+
+
+
+  </div>
+
+
+</article>
+
+
+
+<article role="article" about="/documents/business-court-opinions/jackson-v-mh-master-holdings-lllp-2025-ncbc-21" class="list__item" itemscope="" itemtype="http://schema.org/WebPage">
+  <div class="meta">
+    <time datetime="2025-04-16T00:00:00-04:00">
+      April 16, 2025
+    </time>
+    <span class="sr-only">,</span>&nbsp;<span></span>
+          <span class="sr-only">,</span>&nbsp;<span>23-CVS-5013
+                  (Buncombe - Julianna Theall Earp)
+              </span>
+
+              <span class="sr-only">,</span>&nbsp;<span>Published</span>
+            </div>
+  <h5 class="list__title" itemprop="headline">
+    <a href="https://www.nccourts.gov/documents/business-court-opinions/jackson-v-mh-master-holdings-lllp-2025-ncbc-21">
+      JACKSON v. MH MASTER HOLDINGS, LLLP, 2025 NCBC 21
+    </a>
+  </h5>
+  <div itemprop="description">
+
+  <p>ORDER AND OPINION ON DEFENDANT'S MOTION FOR PARTIAL SUMMARY JUDGMENT</p>
+
+
+
+
+
+
+
+
+
+
+<div class="file file--teaser">
+  <a title="2025 NCBC 21.pdf" itemprop="url" href="https://www.nccourts.gov/assets/documents/opinions/2025%20NCBC%2021.pdf?VersionId=AJTKum1KPJolFGBzRuxCmlyGAadQNsvo" target="_blank"><span itemprop="fileFormat">view/download</span></a></div>
+
+
+
+  </div>
+
+
+</article>
+
+
+
+<article role="article" about="/documents/business-court-opinions/atkore-intl-inc-v-dinkheller-2025-ncbc-20" class="list__item" itemscope="" itemtype="http://schema.org/WebPage">
+  <div class="meta">
+    <time datetime="2025-04-10T00:00:00-04:00">
+      April 10, 2025
+    </time>
+    <span class="sr-only">,</span>&nbsp;<span></span>
+          <span class="sr-only">,</span>&nbsp;<span>24-CVS-22644
+                  (Guilford - Michael L. Robinson)
+              </span>
+
+              <span class="sr-only">,</span>&nbsp;<span>Published</span>
+            </div>
+  <h5 class="list__title" itemprop="headline">
+    <a href="https://www.nccourts.gov/documents/business-court-opinions/atkore-intl-inc-v-dinkheller-2025-ncbc-20">
+      ATKORE INT'L, INC. v. DINKHELLER, 2025 NCBC 20
+    </a>
+  </h5>
+  <div itemprop="description">
+
+  <p>ORDER AND OPINION ON DEFENDANTS' MOTION TO DISMISS PLAINTIFF'S FIRST AMENDED COMPLAINT [PUBLIC]</p>
+
+
+
+
+
+
+
+
+
+
+<div class="file file--teaser">
+  <a title="2025 NCBC 20.pdf" itemprop="url" href="https://www.nccourts.gov/assets/documents/opinions/2025%20NCBC%2020.pdf?VersionId=.Q0i_0F8tud.Xvasy_sZ2kLXWu58V8BH" target="_blank"><span itemprop="fileFormat">view/download</span></a></div>
+
+
+
+  </div>
+
+
+</article>
+
+<article role="article" about="/documents/business-court-opinions/in-re-se-eye-ctr-pending-matters-in-re-se-eye-ctr-judgments-2024-ncbc-84" class="list__item" itemscope="" itemtype="http://schema.org/WebPage">
+  <div class="meta">
+    <time datetime="2024-12-19T00:00:00-05:00">
+      December 19, 2024
+    </time>
+    <span class="sr-only">,</span>&nbsp;<span></span>
+          <span class="sr-only">,</span>&nbsp;<span>15-CVS-1648 &amp; 12-CVS-11322
+                  (Guilford,Wake - Louis A. Bledsoe, III)
+              </span>
+
+              <span class="sr-only">,</span>&nbsp;<span>Published</span>
+            </div>
+  <h5 class="list__title" itemprop="headline">
+    <a href="https://www.nccourts.gov/documents/business-court-opinions/in-re-se-eye-ctr-pending-matters-in-re-se-eye-ctr-judgments-2024-ncbc-84">
+      IN RE SE. EYE CTR. (PENDING MATTERS); IN RE SE. EYE CTR. (JUDGMENTS), 2024 NCBC 84
+    </a>
+  </h5>
+  <div itemprop="description">
+
+  <p>ORDER AND OPINION ON DEFENDANT DOUGLAS S. HARRIS'S MOTION TO RECONSIDER</p>
+
+
+
+
+
+
+
+
+
+
+<div class="file file--teaser">
+  <a title="2024 NCBC 84.pdf" itemprop="url" href="/assets/documents/opinions/2024%20NCBC%2084.pdf?VersionId=7X6TuhqWAhw9BIPBxOhf8BYxurzvLFMV" target="_blank"><span itemprop="fileFormat">view/download</span></a></div>
+
+
+
+  </div>
+
+
+</article>
+
+
+    </div>
+
+
+
+
+
+  </section>
+
+
+
+</div>
+</div>
+
+
+                  </div>
+
+
+              </div>
+
+    </div>
+
+  </article>
+
+
+
+</main>
+
+  <footer id="footer-container" class="footer-container" role="contentinfo">
+    <div class="wrapper">
+
+  <div class="logo logo--footer">
+    <a href="https://www.nccourts.gov/" title="Back to home page">
+      <div class="sr-only">
+        <strong>North Carolina Judicial Branch</strong>
+      </div>
+    </a>
+  </div>
+
+  <div class="tagline">
+    Justice for all
+  </div>
+
+  <div class="primary">
+
+                      <div role="tablist" aria-multiselectable="true" class="panel-group panel-group--additional">
+    <div class="panel">
+                        <div id="block-additionalinformation-menu" class="panel__heading" role="tab">
+
+            <h4 class="panel__title">
+                <a role="button" data-toggle="collapse" href="#block-additionalinformation-menu" aria-expanded="true" aria-controls="panel__content-additional">
+                    Additional Information
+                </a>
+            </h4>
+
+        </div>
+
+        <div id="panel__content-additional" class="panel__content" role="tabpanel" aria-hidden="false">
+                        <div class="links">
+
+                        <ul region="footer_primary" class="links__list">
+                                            <li class="links__item">
+                    <a href="/news" data-drupal-link-system-path="news">News</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/programs" data-drupal-link-system-path="node/1416">Programs</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/commissions" data-drupal-link-system-path="node/1414">Commissions</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/documents" data-drupal-link-system-path="node/41718">Documents</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/about" data-drupal-link-system-path="node/1415">About</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/about/about-judicial-branch/careers" data-drupal-link-system-path="node/1110">Careers</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/judicial-directory" data-drupal-link-system-path="judicial-directory">Judicial Directory</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/about/data-and-statistics" data-drupal-link-system-path="node/1461">Data and Statistics</a>
+                                    </li>
+                    </ul>
+
+
+                            </div>
+        </div>
+    </div>
+</div><div role="tablist" aria-multiselectable="true" class="panel-group panel-group--community">
+    <div class="panel">
+                        <div id="block-communitysupport-menu" class="panel__heading" role="tab">
+
+            <h4 class="panel__title">
+                <a role="button" data-toggle="collapse" href="#block-communitysupport-menu" aria-expanded="true" aria-controls="panel__content-community">
+                    Community Support
+                </a>
+            </h4>
+
+        </div>
+
+        <div id="panel__content-community" class="panel__content" role="tabpanel" aria-hidden="false">
+                        <div class="links">
+
+                        <ul region="footer_primary" class="links__list">
+                                            <li class="links__item">
+                    <a href="/general-public" data-drupal-link-system-path="node/1419">General Public</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/legal-community" data-drupal-link-system-path="node/1420">Legal Community</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/judicial-community" data-drupal-link-system-path="node/24120">Judicial Community</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/media" data-drupal-link-system-path="node/1422">Media</a>
+                                    </li>
+                    </ul>
+
+
+                            </div>
+        </div>
+    </div>
+</div><div role="tablist" aria-multiselectable="true" class="panel-group panel-group--help-support">
+    <div class="panel">
+                        <div id="block-helpandsupport-menu" class="panel__heading" role="tab">
+
+            <h4 class="panel__title">
+                <a role="button" data-toggle="collapse" href="#block-helpandsupport-menu" aria-expanded="true" aria-controls="panel__content-help-support">
+                    Help and Support
+                </a>
+            </h4>
+
+        </div>
+
+        <div id="panel__content-help-support" class="panel__content" role="tabpanel" aria-hidden="false">
+                        <div class="links">
+
+                        <ul region="footer_primary" class="links__list">
+                                            <li class="links__item">
+                    <a href="/locations" data-drupal-link-system-path="locations">Hours and Locations</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/services" data-drupal-link-system-path="node/1305">Online Services</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/help-topics" data-drupal-link-system-path="help-topics">Help Topics</a>
+                                    </li>
+                                            <li class="links__item">
+                    <a href="/contact" data-drupal-link-system-path="node/24115">Contact</a>
+                                    </li>
+                    </ul>
+
+
+                            </div>
+        </div>
+    </div>
+</div>
+
+
+  </div>
+
+  <div class="secondary">
+
+                      <div role="tablist" aria-multiselectable="true" class="panel-group panel-group--legal">
+    <div class="panel">
+        <div id="block-siteinformation-menu" class="panel__heading" role="tab">
+
+            <h4 class="panel__title">
+                <a role="button" data-toggle="collapse" href="#block-siteinformation-menu" aria-expanded="true" aria-controls="panel__content-legal">
+                    Site Information
+                </a>
+            </h4>
+
+        </div>
+
+        <div id="panel__content-legal" class="panel__content" role="tabpanel" aria-hidden="false">
+                        <div class="links">
+
+            <ul region="footer_secondary" class="links__list">
+                      <li class="links__item">
+                      <a href="/closings" data-drupal-link-system-path="node/24394">Closings</a>
+                              </li>
+                      <li class="links__item links__item--bullet">
+                  </li>
+                      <li class="links__item">
+                      <a href="/help-topics" data-drupal-link-system-path="help-topics">Help</a>
+                              </li>
+                      <li class="links__item">
+                      <a href="/legal-notices-disclaimers-and-terms-of-use#section-accessibility-information" data-drupal-link-system-path="node/819">Accessibility</a>
+                              </li>
+                      <li class="links__item">
+                      <a href="/legal-notices-disclaimers-and-terms-of-use" data-drupal-link-system-path="node/819">Legal Notices, Disclaimers and Terms of Use</a>
+                              </li>
+                      <li class="links__item links__item--bullet">
+                  </li>
+                      <li class="links__item">
+                      <a href="/sitemap" data-drupal-link-system-path="sitemap">Sitemap</a>
+                              </li>
+          </ul>
+
+
+                            </div>
+        </div>
+    </div>
+</div><div id="block-connectwithus-2" class="block--footer-social">
+
+
+      <div class="links links--connect links--connect-simple">
+  <h4 class="links__title">Connect with us</h4>
+  <ul class="links__list">
+            <li class="links__item links__item--facebook">
+        <a href="https://www.facebook.com/NCcourts" target="_blank"><span>Facebook</span></a>
+      </li>
+                <li class="links__item links__item--linkedin">
+        <a href="https://www.linkedin.com/company/north-carolina-administrative-office-of-the-courts" target="_blank"><span>Linkedin</span></a>
+      </li>
+                <li class="links__item links__item--twitter">
+        <a href="https://x.com/NCCourts" target="_blank"><span>Twitter</span></a>
+      </li>
+                <li class="links__item links__item--youtube">
+        <a href="https://www.youtube.com/@NorthCarolinaCourts" target="_blank"><span>Youtube</span></a>
+      </li>
+                <li class="links__item links__item--instagram">
+        <a href="https://www.nccourts.gov/learn/all-things-judicial-podcast" target="_blank"><span>Podcast</span></a>
+      </li>
+        </ul>
+</div>
+  </div>
+
+
+
+  </div>
+
+            <div class="language">
+            <div id="block-languages" class="block--footer-languages links links--languages">
+
+
+
+            <ul region="footer_language" class="links__list">
+                      <li class="links__item">
+                      <a href="/languages" data-drupal-link-system-path="node/40456">Languages:</a>
+                              </li>
+                      <li class="links__item">
+                      <a href="/languages/informacion-en-espanol" data-drupal-link-system-path="node/24122">Español</a>
+                              </li>
+                      <li class="links__item">
+                      <a href="/languages/informations-en-francais" data-drupal-link-system-path="node/40455">Français</a>
+                              </li>
+                      <li class="links__item">
+                      <a href="/languages/informaciya-na-russkom-yazyke" data-drupal-link-system-path="node/40447">Pусский</a>
+                              </li>
+                      <li class="links__item">
+                      <a href="/languages/thong-tin-bang-tieng-viet" data-drupal-link-system-path="node/24571">Tiếng Việt</a>
+                              </li>
+                      <li class="links__item">
+                      <a href="/languages/jiantizhongwenxinxi" data-drupal-link-system-path="node/40291">简体中文信息</a>
+                              </li>
+                      <li class="links__item">
+                      <a href="/languages/zhongguochuantongxinxi" data-drupal-link-system-path="node/40720">中國傳統信息</a>
+                              </li>
+                      <li class="links__item">
+                      <a href="/languages/almlwmat-ballght-alrbyt" data-drupal-link-system-path="node/40317">عربى</a>
+                              </li>
+          </ul>
+
+
+  </div>
+
+
+      </div>
+
+
+</div>
+  </footer>
+
+  </div>
+
+
+        <a id="shortcut--header" class="shortcut--header" href="#header-container">
+          Back to top
+        </a>
+        <script type="application/json" data-drupal-selector="drupal-settings-json">{"path":{"baseUrl":"\/","scriptPath":null,"pathPrefix":"","currentPath":"documents\/business-court-opinions","currentPathIsAdmin":false,"isFront":false,"currentLanguage":"en","currentQuery":{"field_business_court_author_target_id":"All","field_county_target_id":"All","field_publish_date_value":"04\/06\/2025","field_publish_date_value_1":"05\/06\/2025","sort_by":"field_publish_date_value","sort_order":"DESC"}},"pluralDelimiter":"\u0003","suppressDeprecationErrors":true,"ajaxPageState":{"libraries":"nc_courts\/ajax-throbber-js,nc_courts\/cardswipe-js,nc_courts\/collapse-js,nc_courts\/filter-panels-js,nc_courts\/footer-js,nc_courts\/global-css,nc_courts\/header-js,nc_courts\/pagination-scroll-to-top-js,nc_courts\/search-did-you-mean-js,nc_courts\/search-results-js,nc_courts\/search-suggest-js,nc_courts\/shortcuts-js,nc_courts_alerts\/alerts-banner,system\/base,views\/views.ajax,views\/views.module,views_ajax_history\/history","theme":"nc_courts","theme_token":null},"ajaxTrustedUrl":{"\/documents\/business-court-opinions":true},"timezone_default":"America\/New_York","timezone_default_offset":"-04:00","elasticsearch_connector":{"index_name":"elasticsearch_index_prodaurora_elasticsearch_main","url":"https:\/\/proxy.nccourts.gov"},"nc_courts_alerts":{"cookie_key":"nc_courts_alerts_dimissed_alerts","alerts_backup":{"updateDate":"2025-05-07T15:30:01-0400","newsalerts":[{"id":"closings-321e6abfff520497c0c57026ffc2456d","category":"Court closings","title":"closings alert","level":"danger","description":"\u003Cstrong\u003E\u003Cem class=\u0022placeholder\u0022\u003E1\u003C\/em\u003E county\u003C\/strong\u003E is currently reporting closings and\/or advisories","startdate":1746590400,"enddate":1746676799,"publishdate":1746646201,"link":{"url":"\/closings","text":"View active closings"},"md5":"d45666a535014239aaa551ee71647789"}]},"alerts_endpoint":"\/nc_courts_alerts.json"},"views":{"ajax_path":"\/views\/ajax","ajaxViews":{"views_dom_id:4a1bc2ba8f5b09460794a2771ecd6600e424ec6f5cc706123c9e3648c573b713":{"view_name":"documents","view_display_id":"business_opinions","view_args":"","view_path":"\/documents\/business-court-opinions","view_base_path":"documents\/business-court-opinions","view_dom_id":"4a1bc2ba8f5b09460794a2771ecd6600e424ec6f5cc706123c9e3648c573b713","pager_element":0}},"local_rules_and_forms":"\/rest-export\/documents-taxonomies\/counties?_format=json"},"viewsAjaxHistory":{"renderPageItem":0,"initialExposedInput":{"views_dom_id:4a1bc2ba8f5b09460794a2771ecd6600e424ec6f5cc706123c9e3648c573b713":{"field_publish_date_value":"04\/06\/2025","field_publish_date_value_1":"05\/06\/2025","field_business_court_author_target_id":"All","field_county_target_id":"All","sort_by":"field_publish_date_value","sort_order":"DESC"}}},"user":{"uid":0,"permissionsHash":"0e0fa9922dd08c6b776b640fd88dd212f86517c5ae7eacf4098d089c9d4cf224"}}</script>
+<script src="/assets/s3fs-public/js/js_MjsMRjvolhmBRpE0E7Ld0PTqRodWQyUHpdGbgBGsyoQ.js?VersionId=pxOWxPTNWmdN3SFFvpwx2jFSyISPB1n_"></script>
+<script src="/themes/contrib/nccourts-theme/assets/dist/js/components/collapse.js?svwnwr"></script>
+<script src="/themes/contrib/nccourts-theme/assets/dist/js/components/card-swipe.js?svwnwr"></script>
+<script src="/assets/s3fs-public/js/js_j4ciofBSyJz1LkGisLGj5MAd6_hYtgZhDbl_a6kqh0g.js?VersionId=lhHdAR0XCmG4HmOXVZPWSNUkVxfG1ZaD"></script>
+<script src="/themes/contrib/nccourts-theme/assets/dist/js/components/search-results.js?svwnwr"></script>
+<script src="/themes/contrib/nccourts-theme/assets/dist/js/components/search-did-you-mean.js?svwnwr"></script>
+<script src="/assets/s3fs-public/js/js_GaYY1ePIAwxeWqZXbtXm8sv-GZEYzHBOwcfzYvnLUcA.js?VersionId=qo.fwLtZLbdwgWGVf_AwdlQG1bLzKDa0"></script>
+<script src="/themes/contrib/nccourts-theme/assets/dist/js/components/filter-panels.js?svwnwr"></script>
+
+
+
+</body></html>
\ No newline at end of file


Reviews:
user: login: grossir
body: The court_id `ncbizct` [does not exist](https://www.courtlistener.com/admin/search/court/?q=north+carolina) in courtlistener. It will have to be added before we merge this; otherwise use `ncsuperct` as noted on the issue

```
courtlistener=> select * from search_court where id = 'ncbizct';
 id | date_modified | in_use | has_opinion_scraper | has_oral_argument_scraper | position | citation_string | short_name | full_name | url | start_date | end_date | jurisdiction | notes | pacer_court_id | fjc_co
urt_id | pacer_has_rss_feed | date_last_pacer_contact | pacer_rss_entry_types | parent_court_id 
----+---------------+--------+---------------------+---------------------------+----------+-----------------+------------+-----------+-----+------------+----------+--------------+-------+----------------+-------
-------+--------------------+-------------------------+-----------------------+-----------------
(0 rows)


```
I we could use @flooie 's input on 3 points:
- should we create `ncbizct` or just use `ncsuperct`?
- should we discard the "summary" field? see comment below
- should we collect "lower_court_str"?


state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T14:04:15Z
user: login: quevon24
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-12T17:16:46Z
user: login: quevon24
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-12T17:19:35Z
user: login: grossir
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T15:22:49Z
user: login: grossir
body: This is mostly ready, we are missing the court_id input. See the requested change below
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T00:05:32Z
user: login: grossir
body: Great, thanks Kevin. Everything is set to deploy this 

```sql
courtlistener=> select * from search_court where id = 'ncbizct';
-[ RECORD 1 ]-------------+------------------------------
id                        | ncbizct
date_modified             | 2025-05-20 18:54:04.786775+00
in_use                    | t
has_opinion_scraper       | t
has_oral_argument_scraper | f
position                  | 366.986
citation_string           | N.C. Bus. Ct.
short_name                | North Carolina Business Court
full_name                 | North Carolina Business Court
url                       | 
start_date                | 
end_date                  | 
jurisdiction              | SS
notes                     | 
pacer_court_id            | 
fjc_court_id              | 
pacer_has_rss_feed        | 
date_last_pacer_contact   | 
pacer_rss_entry_types     | 
parent_court_id           | 

```
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T15:12:12Z

Review comments:
diff_hunk: @@ -0,0 +1,123 @@
+"""
+CourtID: ncbizct
+Court Short Name: North Carolina Business Court
+Author: Kevin Ramirez
+History:
+    2025-05-06, quevon24: First version
+"""
+
+import re
+from datetime import date, datetime
+from typing import Dict
+from urllib.parse import urlencode
+
+from juriscraper.lib.date_utils import make_date_range_tuples
+from juriscraper.lib.string_utils import titlecase
+from juriscraper.OpinionSiteLinear import OpinionSiteLinear
+
+
+class Site(OpinionSiteLinear):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.court_id = self.__module__
+        self.url = "https://www.nccourts.gov/documents/business-court-opinions"
+        self.first_opinion_date = datetime(1996, 10, 24).date()
path: juriscraper/opinions/united_states/state/ncbizct.py
user: login: grossir
body: you can use `date(1996, 10, 24)`
created_at: 2025-05-08T13:40:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,38 @@
+[
+  {
+    "case_dates": "2025-05-06",
+    "case_names": "Yoder v. Verm",
+    "download_urls": "https://www.nccourts.gov/assets/documents/opinions/2025%20NCBC%2022.pdf?VersionId=NsKchy5ElYXS4QQFeopc0iYQ7hHR17NR",
+    "precedential_statuses": "Published",
+    "blocked_statuses": false,
+    "date_filed_is_approximate": false,
+    "docket_numbers": "23-CVS-1820",
+    "citations": "2025 NCBC 22",
+    "summaries": "ORDER AND OPINION ON PLAINTIFF'S MOTION FOR PARTIAL SUMMARY JUDGMENT",
path: tests/examples/opinions/united_states/ncbizct_example.compare.json
user: login: grossir
body: I think this is not a "summary" as we know it in Courtlistener; not sure where to fit it, probably just discard it
created_at: 2025-05-08T13:43:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,123 @@
+"""
+CourtID: ncbizct
+Court Short Name: North Carolina Business Court
+Author: Kevin Ramirez
+History:
+    2025-05-06, quevon24: First version
+"""
+
+import re
+from datetime import date, datetime
+from typing import Dict
+from urllib.parse import urlencode
+
+from juriscraper.lib.date_utils import make_date_range_tuples
+from juriscraper.lib.string_utils import titlecase
+from juriscraper.OpinionSiteLinear import OpinionSiteLinear
+
+
+class Site(OpinionSiteLinear):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.court_id = self.__module__
+        self.url = "https://www.nccourts.gov/documents/business-court-opinions"
+        self.first_opinion_date = datetime(1996, 10, 24).date()
+        self.make_backscrape_iterable(kwargs)
+
+    def _process_html(self):
+        for row in self.html.xpath(
+            ".//div[contains(@class,'list__items')]/article"
+        ):
+            # Extract case name and citation
+            case_string = (
+                row.xpath(f".//h5[contains(@class,'list__title')]/a")[0]
+                .text_content()
+                .strip()
+            )
+            case_name, citation = self.extract_case_and_citation(case_string)
+
+            # Extract other data
+            date_filed = row.xpath(f".//time")[0].text_content().strip()
+            docket_number = (
+                row.xpath(f".//span[4]")[0]
+                .text_content()
+                .split("(", 1)[0]
+                .strip()
+            )
path: juriscraper/opinions/united_states/state/ncbizct.py
user: login: grossir
body: In the same container as the docket number you can pick up 2 more data points
- author_str; in the example below is "A. Todd Brown"

- lower_court_str; in the example below is "Henderson", which should be filled to "Henderson County Superior Court" (you can confirm this by searching within the opinion itself). However, some opinions come from dockets in 2 lower courts; so I am not sure if this field will be precise (see 2nd screenshot)

![image](https://github.com/user-attachments/assets/171c6368-abc2-4424-9123-aaf40909c039)

![image](https://github.com/user-attachments/assets/96f930dc-34f0-4cd0-bafd-e0c9f743a390)

created_at: 2025-05-08T13:53:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,123 @@
+"""
+CourtID: ncbizct
+Court Short Name: North Carolina Business Court
+Author: Kevin Ramirez
+History:
+    2025-05-06, quevon24: First version
+"""
+
+import re
+from datetime import date, datetime
+from typing import Dict
+from urllib.parse import urlencode
+
+from juriscraper.lib.date_utils import make_date_range_tuples
+from juriscraper.lib.string_utils import titlecase
+from juriscraper.OpinionSiteLinear import OpinionSiteLinear
+
+
+class Site(OpinionSiteLinear):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.court_id = self.__module__
+        self.url = "https://www.nccourts.gov/documents/business-court-opinions"
+        self.first_opinion_date = datetime(1996, 10, 24).date()
+        self.make_backscrape_iterable(kwargs)
+
+    def _process_html(self):
+        for row in self.html.xpath(
+            ".//div[contains(@class,'list__items')]/article"
+        ):
+            # Extract case name and citation
+            case_string = (
+                row.xpath(f".//h5[contains(@class,'list__title')]/a")[0]
path: juriscraper/opinions/united_states/state/ncbizct.py
user: login: grossir
body: f-string not needed
created_at: 2025-05-08T13:59:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,123 @@
+"""
+CourtID: ncbizct
+Court Short Name: North Carolina Business Court
+Author: Kevin Ramirez
+History:
+    2025-05-06, quevon24: First version
+"""
+
+import re
+from datetime import date, datetime
+from typing import Dict
+from urllib.parse import urlencode
+
+from juriscraper.lib.date_utils import make_date_range_tuples
+from juriscraper.lib.string_utils import titlecase
+from juriscraper.OpinionSiteLinear import OpinionSiteLinear
+
+
+class Site(OpinionSiteLinear):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.court_id = self.__module__
+        self.url = "https://www.nccourts.gov/documents/business-court-opinions"
+        self.first_opinion_date = datetime(1996, 10, 24).date()
+        self.make_backscrape_iterable(kwargs)
+
+    def _process_html(self):
+        for row in self.html.xpath(
+            ".//div[contains(@class,'list__items')]/article"
+        ):
+            # Extract case name and citation
+            case_string = (
+                row.xpath(f".//h5[contains(@class,'list__title')]/a")[0]
+                .text_content()
+                .strip()
+            )
+            case_name, citation = self.extract_case_and_citation(case_string)
+
+            # Extract other data
+            date_filed = row.xpath(f".//time")[0].text_content().strip()
path: juriscraper/opinions/united_states/state/ncbizct.py
user: login: grossir
body: f-string not needed
created_at: 2025-05-08T13:59:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,123 @@
+"""
+CourtID: ncbizct
+Court Short Name: North Carolina Business Court
+Author: Kevin Ramirez
+History:
+    2025-05-06, quevon24: First version
+"""
+
+import re
+from datetime import date, datetime
+from typing import Dict
+from urllib.parse import urlencode
+
+from juriscraper.lib.date_utils import make_date_range_tuples
+from juriscraper.lib.string_utils import titlecase
+from juriscraper.OpinionSiteLinear import OpinionSiteLinear
+
+
+class Site(OpinionSiteLinear):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.court_id = self.__module__
+        self.url = "https://www.nccourts.gov/documents/business-court-opinions"
+        self.first_opinion_date = datetime(1996, 10, 24).date()
+        self.make_backscrape_iterable(kwargs)
+
+    def _process_html(self):
+        for row in self.html.xpath(
+            ".//div[contains(@class,'list__items')]/article"
+        ):
+            # Extract case name and citation
+            case_string = (
+                row.xpath(f".//h5[contains(@class,'list__title')]/a")[0]
+                .text_content()
+                .strip()
+            )
+            case_name, citation = self.extract_case_and_citation(case_string)
+
+            # Extract other data
+            date_filed = row.xpath(f".//time")[0].text_content().strip()
+            docket_number = (
+                row.xpath(f".//span[4]")[0]
path: juriscraper/opinions/united_states/state/ncbizct.py
user: login: grossir
body: f-string not needed
created_at: 2025-05-08T13:59:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,123 @@
+"""
+CourtID: ncbizct
+Court Short Name: North Carolina Business Court
+Author: Kevin Ramirez
+History:
+    2025-05-06, quevon24: First version
+"""
+
+import re
+from datetime import date, datetime
+from typing import Dict
+from urllib.parse import urlencode
+
+from juriscraper.lib.date_utils import make_date_range_tuples
+from juriscraper.lib.string_utils import titlecase
+from juriscraper.OpinionSiteLinear import OpinionSiteLinear
+
+
+class Site(OpinionSiteLinear):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.court_id = self.__module__
+        self.url = "https://www.nccourts.gov/documents/business-court-opinions"
+        self.first_opinion_date = datetime(1996, 10, 24).date()
+        self.make_backscrape_iterable(kwargs)
+
+    def _process_html(self):
+        for row in self.html.xpath(
+            ".//div[contains(@class,'list__items')]/article"
+        ):
+            # Extract case name and citation
+            case_string = (
+                row.xpath(f".//h5[contains(@class,'list__title')]/a")[0]
+                .text_content()
+                .strip()
+            )
+            case_name, citation = self.extract_case_and_citation(case_string)
+
+            # Extract other data
+            date_filed = row.xpath(f".//time")[0].text_content().strip()
+            docket_number = (
+                row.xpath(f".//span[4]")[0]
+                .text_content()
+                .split("(", 1)[0]
+                .strip()
+            )
+            status = row.xpath(f".//span[6]")[0].text_content().strip()
+            download_url = row.xpath(
+                f".//div[contains(@class,'file file--teaser')]/a/@href"
+            )[0]
+            description = row.xpath(
+                f".//div[contains(@itemprop,'description')]/p"
+            )
+            summary_text = (
+                description[0].text_content().strip() if description else ""
+            )
+
+            self.cases.append(
+                {
+                    "name": titlecase(case_name),
+                    "docket": docket_number,
+                    "url": download_url,
+                    "summary": summary_text,
+                    "date": date_filed,
+                    "citation": citation,
+                    "status": status,
+                }
+            )
+
+    def extract_case_and_citation(self, case_string):
+        """Extract citations and clean up case name
+
+        Possible strings:
+        BRADLEY V. U.S. PACKAGING, INC., et al. 1998 NCBC 3
+        FRAZIER v. BEARD 1996 NCBC 1
+        ATKORE INT'L, INC. v. DINKHELLER, 2025 NCBC 20
+        """
+        case_string = case_string.strip()
+        citation_match = re.search(r"(\d{4} NCBC \d+)$", case_string)
+
+        if citation_match:
+            citation = citation_match.group(1)
+            case_name = case_string[: citation_match.start()].strip()
+            case_name = case_name.rstrip(", ").strip()
+        else:
+            citation = ""
+            case_name = case_string
+
+        return case_name, citation
+
+    def _download_backwards(self, dates: tuple[date, date]) -> None:
+        """Build URL with year input and scrape
+
+        :param dates: (start_date, end_date) tuple
+        :return None
+        """
+        params = {
+            "field_publish_date_value": dates[0].strftime("%m/%d/%Y"),
+            "field_publish_date_value_1": dates[1].strftime("%m/%d/%Y"),
+        }
+        self.url = f"{self.url}?{urlencode(params)}"
+        self.html = self._download()
+        self._process_html()
+
+    def make_backscrape_iterable(self, kwargs: Dict) -> None:
+        """Checks if backscrape start and end arguments have been passed
+        by caller, and parses them accordingly
+
+        :return None
+        """
+        start = kwargs.get("backscrape_start")
+        end = kwargs.get("backscrape_end")
+
+        if start:
+            start = datetime.strptime(start, "%Y/%m/%d").date()
+        else:
+            start = self.first_opinion_date
+        if end:
+            end = datetime.strptime(end, "%Y/%m/%d").date()
+        else:
+            end = datetime.now().date()
+
+        self.back_scrape_iterable = make_date_range_tuples(start, end, 1)
path: juriscraper/opinions/united_states/state/ncbizct.py
user: login: grossir
body: the back_scrape_iterable is behaving strangely, making 1 tick per each day 
This is not desirable. I think you should just use the default `make_backscrape_iterable`; for that, you will need to add a class attribute `days_interval`, to a sensible value; say 30 days; and delete this method. 

I printed the iterable and...
```
...
(datetime.date(2010, 1, 1), datetime.date(2010, 1, 1)),
 (datetime.date(2010, 1, 2), datetime.date(2010, 1, 2)),
 (datetime.date(2010, 1, 3), datetime.date(2010, 1, 3)),
 (datetime.date(2010, 1, 4), datetime.date(2010, 1, 4)),
 (datetime.date(2010, 1, 5), datetime.date(2010, 1, 5)),
 (datetime.date(2010, 1, 6), datetime.date(2010, 1, 6)),
 (datetime.date(2010, 1, 7), datetime.date(2010, 1, 7)),
 (datetime.date(2010, 1, 8), datetime.date(2010, 1, 8)),
 (datetime.date(2010, 1, 9), datetime.date(2010, 1, 9)),
 (datetime.date(2010, 1, 10), datetime.date(2010, 1, 10)),
 (datetime.date(2010, 1, 11), datetime.date(2010, 1, 11)),
 (datetime.date(2010, 1, 12), datetime.date(2010, 1, 12)),
 (datetime.date(2010, 1, 13), datetime.date(2010, 1, 13)),
 (datetime.date(2010, 1, 14), datetime.date(2010, 1, 14)),
 (datetime.date(2010, 1, 15), datetime.date(2010, 1, 15)),
 (datetime.date(2010, 1, 16), datetime.date(2010, 1, 16)),
 (datetime.date(2010, 1, 17), datetime.date(2010, 1, 17)),
 (datetime.date(2010, 1, 18), datetime.date(2010, 1, 18)),
 (datetime.date(2010, 1, 19), datetime.date(2010, 1, 19)),
 (datetime.date(2010, 1, 20), datetime.date(2010, 1, 20)),
 (datetime.date(2010, 1, 21), datetime.date(2010, 1, 21)),
 (datetime.date(2010, 1, 22), datetime.date(2010, 1, 22)),
 (datetime.date(2010, 1, 23), datetime.date(2010, 1, 23)),
 (datetime.date(2010, 1, 24), datetime.date(2010, 1, 24)),
 (datetime.date(2010, 1, 25), datetime.date(2010, 1, 25)),
 (datetime.date(2010, 1, 26), datetime.date(2010, 1, 26)),
 (datetime.date(2010, 1, 27), datetime.date(2010, 1, 27)),
 (datetime.date(2010, 1, 28), datetime.date(2010, 1, 28)),
 (datetime.date(2010, 1, 29), datetime.date(2010, 1, 29)),
 (datetime.date(2010, 1, 30), datetime.date(2010, 1, 30)),
 (datetime.date(2010, 1, 31), datetime.date(2010, 1, 31)),
 (datetime.date(2010, 2, 1), datetime.date(2010, 2, 1)),
 (datetime.date(2010, 2, 2), datetime.date(2010, 2, 2)),
 (datetime.date(2010, 2, 3), datetime.date(2010, 2, 3)),
 (datetime.date(2010, 2, 4), datetime.date(2010, 2, 4)),
 (datetime.date(2010, 2, 5), datetime.date(2010, 2, 5)),
 (datetime.date(2010, 2, 6), datetime.date(2010, 2, 6)),
 (datetime.date(2010, 2, 7), datetime.date(2010, 2, 7)),
 (datetime.date(2010, 2, 8), datetime.date(2010, 2, 8)),
 (datetime.date(2010, 2, 9), datetime.date(2010, 2, 9)),
 (datetime.date(2010, 2, 10), datetime.date(2010, 2, 10)),
 (datetime.date(2010, 2, 11), datetime.date(2010, 2, 11)),
 (datetime.date(2010, 2, 12), datetime.date(2010, 2, 12)),
 (datetime.date(2010, 2, 13), datetime.date(2010, 2, 13)),
 (datetime.date(2010, 2, 14), datetime.date(2010, 2, 14)),
 (datetime.date(2010, 2, 15), datetime.date(2010, 2, 15)),
 (datetime.date(2010, 2, 16), datetime.date(2010, 2, 16)),
 (datetime.date(2010, 2, 17), datetime.date(2010, 2, 17)),
 (datetime.date(2010, 2, 18), datetime.date(2010, 2, 18)),
 (datetime.date(2010, 2, 19), datetime.date(2010, 2, 19)),
 (datetime.date(2010, 2, 20), datetime.date(2010, 2, 20)),
 (datetime.date(2010, 2, 21), datetime.date(2010, 2, 21)),
 (datetime.date(2010, 2, 22), datetime.date(2010, 2, 22)),
 (datetime.date(2010, 2, 23), datetime.date(2010, 2, 23)),
 (datetime.date(2010, 2, 24), datetime.date(2010, 2, 24)),
 (datetime.date(2010, 2, 25), datetime.date(2010, 2, 25)),
 (datetime.date(2010, 2, 26), datetime.date(2010, 2, 26)),
 (datetime.date(2010, 2, 27), datetime.date(2010, 2, 27)),
 (datetime.date(2010, 2, 28), datetime.date(2010, 2, 28)),
 (datetime.date(2010, 3, 1), datetime.date(2010, 3, 1)),
 (datetime.date(2010, 3, 2), datetime.date(2010, 3, 2)),
 (datetime.date(2010, 3, 3), datetime.date(2010, 3, 3)),
 (datetime.date(2010, 3, 4), datetime.date(2010, 3, 4)),
 (datetime.date(2010, 3, 5), datetime.date(2010, 3, 5)),
 (datetime.date(2010, 3, 6), datetime.date(2010, 3, 6)),
 (datetime.date(2010, 3, 7), datetime.date(2010, 3, 7)),
 (datetime.date(2010, 3, 8), datetime.date(2010, 3, 8)),
 (datetime.date(2010, 3, 9), datetime.date(2010, 3, 9)),
 (datetime.date(2010, 3, 10), datetime.date(2010, 3, 10)),
 ...
```
created_at: 2025-05-08T14:03:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,123 @@
+"""
+CourtID: ncbizct
+Court Short Name: North Carolina Business Court
+Author: Kevin Ramirez
+History:
+    2025-05-06, quevon24: First version
+"""
+
+import re
+from datetime import date, datetime
+from typing import Dict
+from urllib.parse import urlencode
+
+from juriscraper.lib.date_utils import make_date_range_tuples
+from juriscraper.lib.string_utils import titlecase
+from juriscraper.OpinionSiteLinear import OpinionSiteLinear
+
+
+class Site(OpinionSiteLinear):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.court_id = self.__module__
+        self.url = "https://www.nccourts.gov/documents/business-court-opinions"
+        self.first_opinion_date = datetime(1996, 10, 24).date()
+        self.make_backscrape_iterable(kwargs)
+
+    def _process_html(self):
+        for row in self.html.xpath(
+            ".//div[contains(@class,'list__items')]/article"
+        ):
+            # Extract case name and citation
+            case_string = (
+                row.xpath(f".//h5[contains(@class,'list__title')]/a")[0]
+                .text_content()
+                .strip()
+            )
+            case_name, citation = self.extract_case_and_citation(case_string)
+
+            # Extract other data
+            date_filed = row.xpath(f".//time")[0].text_content().strip()
+            docket_number = (
+                row.xpath(f".//span[4]")[0]
+                .text_content()
+                .split("(", 1)[0]
+                .strip()
+            )
+            status = row.xpath(f".//span[6]")[0].text_content().strip()
+            download_url = row.xpath(
+                f".//div[contains(@class,'file file--teaser')]/a/@href"
+            )[0]
+            description = row.xpath(
+                f".//div[contains(@itemprop,'description')]/p"
+            )
+            summary_text = (
+                description[0].text_content().strip() if description else ""
+            )
+
+            self.cases.append(
+                {
+                    "name": titlecase(case_name),
+                    "docket": docket_number,
+                    "url": download_url,
+                    "summary": summary_text,
+                    "date": date_filed,
+                    "citation": citation,
+                    "status": status,
+                }
+            )
+
+    def extract_case_and_citation(self, case_string):
+        """Extract citations and clean up case name
+
+        Possible strings:
+        BRADLEY V. U.S. PACKAGING, INC., et al. 1998 NCBC 3
+        FRAZIER v. BEARD 1996 NCBC 1
+        ATKORE INT'L, INC. v. DINKHELLER, 2025 NCBC 20
+        """
+        case_string = case_string.strip()
+        citation_match = re.search(r"(\d{4} NCBC \d+)$", case_string)
+
+        if citation_match:
+            citation = citation_match.group(1)
+            case_name = case_string[: citation_match.start()].strip()
+            case_name = case_name.rstrip(", ").strip()
+        else:
+            citation = ""
+            case_name = case_string
+
+        return case_name, citation
+
+    def _download_backwards(self, dates: tuple[date, date]) -> None:
+        """Build URL with year input and scrape
+
+        :param dates: (start_date, end_date) tuple
+        :return None
+        """
+        params = {
+            "field_publish_date_value": dates[0].strftime("%m/%d/%Y"),
+            "field_publish_date_value_1": dates[1].strftime("%m/%d/%Y"),
+        }
+        self.url = f"{self.url}?{urlencode(params)}"
+        self.html = self._download()
+        self._process_html()
+
+    def make_backscrape_iterable(self, kwargs: Dict) -> None:
+        """Checks if backscrape start and end arguments have been passed
+        by caller, and parses them accordingly
+
+        :return None
+        """
+        start = kwargs.get("backscrape_start")
+        end = kwargs.get("backscrape_end")
+
+        if start:
+            start = datetime.strptime(start, "%Y/%m/%d").date()
+        else:
+            start = self.first_opinion_date
+        if end:
+            end = datetime.strptime(end, "%Y/%m/%d").date()
+        else:
+            end = datetime.now().date()
+
+        self.back_scrape_iterable = make_date_range_tuples(start, end, 1)
path: juriscraper/opinions/united_states/state/ncbizct.py
user: login: quevon24
body: I set it to 7 days and deleted the method
created_at: 2025-05-12T17:16:46Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,123 @@
+"""
+CourtID: ncbizct
+Court Short Name: North Carolina Business Court
+Author: Kevin Ramirez
+History:
+    2025-05-06, quevon24: First version
+"""
+
+import re
+from datetime import date, datetime
+from typing import Dict
+from urllib.parse import urlencode
+
+from juriscraper.lib.date_utils import make_date_range_tuples
+from juriscraper.lib.string_utils import titlecase
+from juriscraper.OpinionSiteLinear import OpinionSiteLinear
+
+
+class Site(OpinionSiteLinear):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.court_id = self.__module__
+        self.url = "https://www.nccourts.gov/documents/business-court-opinions"
+        self.first_opinion_date = datetime(1996, 10, 24).date()
+        self.make_backscrape_iterable(kwargs)
+
+    def _process_html(self):
+        for row in self.html.xpath(
+            ".//div[contains(@class,'list__items')]/article"
+        ):
+            # Extract case name and citation
+            case_string = (
+                row.xpath(f".//h5[contains(@class,'list__title')]/a")[0]
+                .text_content()
+                .strip()
+            )
+            case_name, citation = self.extract_case_and_citation(case_string)
+
+            # Extract other data
+            date_filed = row.xpath(f".//time")[0].text_content().strip()
+            docket_number = (
+                row.xpath(f".//span[4]")[0]
+                .text_content()
+                .split("(", 1)[0]
+                .strip()
+            )
path: juriscraper/opinions/united_states/state/ncbizct.py
user: login: quevon24
body: I added what is necessary to extract the court, although I think it would first be necessary to add them to courts-db, then it would be necessary to decide which court to use in case more than one appears
created_at: 2025-05-12T17:19:35Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,123 @@
+"""
+CourtID: ncbizct
+Court Short Name: North Carolina Business Court
+Author: Kevin Ramirez
+History:
+    2025-05-06, quevon24: First version
+"""
+
+import re
+from datetime import date, datetime
+from typing import Dict
+from urllib.parse import urlencode
+
+from juriscraper.lib.date_utils import make_date_range_tuples
+from juriscraper.lib.string_utils import titlecase
+from juriscraper.OpinionSiteLinear import OpinionSiteLinear
+
+
+class Site(OpinionSiteLinear):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.court_id = self.__module__
+        self.url = "https://www.nccourts.gov/documents/business-court-opinions"
+        self.first_opinion_date = datetime(1996, 10, 24).date()
+        self.make_backscrape_iterable(kwargs)
+
+    def _process_html(self):
+        for row in self.html.xpath(
+            ".//div[contains(@class,'list__items')]/article"
+        ):
+            # Extract case name and citation
+            case_string = (
+                row.xpath(f".//h5[contains(@class,'list__title')]/a")[0]
+                .text_content()
+                .strip()
+            )
+            case_name, citation = self.extract_case_and_citation(case_string)
+
+            # Extract other data
+            date_filed = row.xpath(f".//time")[0].text_content().strip()
+            docket_number = (
+                row.xpath(f".//span[4]")[0]
+                .text_content()
+                .split("(", 1)[0]
+                .strip()
+            )
path: juriscraper/opinions/united_states/state/ncbizct.py
user: login: grossir
body: we can store it as `"Docket.appeal_from_str"` and keep it a string; we would need a proper court id for `Docket.appeal_from_id`
created_at: 2025-05-13T15:22:49Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,41 @@
+[
+  {
+    "case_dates": "2025-05-06",
+    "case_names": "Yoder v. Verm",
+    "download_urls": "https://www.nccourts.gov/assets/documents/opinions/2025%20NCBC%2022.pdf?VersionId=NsKchy5ElYXS4QQFeopc0iYQ7hHR17NR",
+    "precedential_statuses": "Published",
+    "blocked_statuses": false,
+    "date_filed_is_approximate": false,
+    "docket_numbers": "23-CVS-1820",
+    "lower_courts": "Henderson",
+    "citations": "2025 NCBC 22",
+    "case_name_shorts": "Yoder",
+    "authors": "A. Todd Brown"
+  },
+  {
+    "case_dates": "2025-04-16",
+    "case_names": "Jackson v. Mh Master Holdings, Lllp",
+    "download_urls": "https://www.nccourts.gov/assets/documents/opinions/2025%20NCBC%2021.pdf?VersionId=AJTKum1KPJolFGBzRuxCmlyGAadQNsvo",
+    "precedential_statuses": "Published",
+    "blocked_statuses": false,
+    "date_filed_is_approximate": false,
+    "docket_numbers": "23-CVS-5013",
+    "lower_courts": "Buncombe",
+    "citations": "2025 NCBC 21",
+    "case_name_shorts": "",
+    "authors": "Julianna Theall Earp"
+  },
+  {
+    "case_dates": "2025-04-10",
+    "case_names": "Atkore Int'l, Inc. v. Dinkheller",
+    "download_urls": "https://www.nccourts.gov/assets/documents/opinions/2025%20NCBC%2020.pdf?VersionId=.Q0i_0F8tud.Xvasy_sZ2kLXWu58V8BH",
+    "precedential_statuses": "Published",
+    "blocked_statuses": false,
+    "date_filed_is_approximate": false,
+    "docket_numbers": "24-CVS-22644",
+    "lower_courts": "Guilford",
path: tests/examples/opinions/united_states/ncbizct_example.compare.json
user: login: grossir
body: I think we should complete the lower court name for this field, for easier resolution in the future, to something like `f"{county} County Court"`, which in this example would yield "Guilford County Court"
created_at: 2025-05-14T00:04:02Z
author_association: CONTRIBUTOR

PR comments:
user: login: grossir
created_at: 2025-05-13T23:55:18Z
body: This is still missing @flooie's input, mainly about the court_id to use for this scraper
author_association: CONTRIBUTOR
user: login: flooie
created_at: 2025-05-20T18:55:46Z
body: @grossir @quevon24 I have created the courthouse and court for the North Carolina Business Court using the courts-db id and added it to CL 
author_association: CONTRIBUTOR