diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e592ec0cf..e821de09b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,10 +32,10 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 diff --git a/.github/workflows/delete-neon-branch.yml b/.github/workflows/delete-neon-branch.yml index cbfb58807..7a5faba0c 100644 --- a/.github/workflows/delete-neon-branch.yml +++ b/.github/workflows/delete-neon-branch.yml @@ -21,7 +21,7 @@ jobs: id: get_branch_id # list all branches and filter by name run: | - branch_id=$(curl --silent \ + branch_id=$(curl --silent --fail-with-body \ "https://console.neon.tech/api/v2/projects/${{ secrets.NEON_PROJECT_ID }}/branches" \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ @@ -32,7 +32,7 @@ jobs: echo "branch_id=${branch_id}" >> $GITHUB_OUTPUT - name: Delete Neon Branch - uses: neondatabase/delete-branch-action@v2 + uses: neondatabase/delete-branch-action@v3 with: project_id: ${{ secrets.NEON_PROJECT_ID }} branch_id: ${{ steps.get_branch_id.outputs.branch_id }} diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml index bb95fae60..bede01947 100644 --- a/.github/workflows/deploy-preview.yml +++ b/.github/workflows/deploy-preview.yml @@ -18,10 +18,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Neon Database Create Branch Action - uses: neondatabase/create-branch-action@v3 + uses: neondatabase/create-branch-action@v4 id: create_branch with: project_id: ${{ secrets.NEON_PROJECT_ID }} @@ -39,7 +39,7 @@ jobs: preview_url=$(vercel deploy \ --env DATABASE_URL="${{ steps.create_branch.outputs.db_url_with_pooler}}/neondb?pgbouncer=true&connect_timeout=15&pool_timeout=15" \ --build-env DIRECT_DATABASE_URL="${{ steps.create_branch.outputs.db_url}}/neondb?connect_timeout=10" \ - --public --yes --token=${{ secrets.VERCEL_TOKEN }}) + --public --yes --token="${{ secrets.VERCEL_TOKEN }}") echo preview_url=$preview_url >> $GITHUB_OUTPUT - name: Comment on Pull Request diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 40e8ebaf9..d1d7c6691 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -13,10 +13,10 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ea5cf7edc..f4ba5b717 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -70,7 +70,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Python3.11 uses: actions/setup-python@v4 @@ -91,7 +91,7 @@ jobs: mongodb-port: 27017 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 @@ -111,10 +111,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 diff --git a/.github/workflows/validator_test.yml b/.github/workflows/validator_test.yml index 8f78c2e20..a410dc8b9 100644 --- a/.github/workflows/validator_test.yml +++ b/.github/workflows/validator_test.yml @@ -15,7 +15,7 @@ jobs: working-directory: validator steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: diff --git a/.github/workflows/versioning.yml b/.github/workflows/versioning.yml index 2989c45b1..906c851a9 100644 --- a/.github/workflows/versioning.yml +++ b/.github/workflows/versioning.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: diff --git a/package-lock.json b/package-lock.json index d09c69cdc..7affaac18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "@mui/material": "^5.4.0", "@next-auth/prisma-adapter": "^1.0.5", "@next/bundle-analyzer": "^13.1.6", - "@prisma/client": "^5.0.0", "@radix-ui/react-checkbox": "^1.0.1", "@radix-ui/react-dialog": "^1.0.3", "@radix-ui/react-dropdown-menu": "2.0.2", @@ -39,8 +38,8 @@ "intro.js": "^6.0.0", "intro.js-react": "^0.7.1", "next": "^13.5.4", - "next-auth": "^4.20.1", - "nodemailer": "^6.8.0", + "next-auth": "^4.24.5", + "nodemailer": "^6.9.9", "nprogress": "^0.2.0", "pdfjs-dist": "^3.3.122", "prettier-eslint": "^13.0.0", @@ -57,6 +56,7 @@ "devDependencies": { "@babel/core": "^7.20.12", "@jest/globals": "^29.6.1", + "@prisma/client": "^5.9.1", "@storybook/addon-essentials": "^7.5.2", "@storybook/addon-interactions": "^7.5.2", "@storybook/addon-links": "^7.5.2", @@ -89,7 +89,7 @@ "postcss": "^8.4.31", "prettier": "^2.3.2", "prettier-plugin-tailwindcss": "^0.2.2", - "prisma": "^5.0.0", + "prisma": "^5.9.1", "react-styleguidist": "^13.0.0", "start-server-and-test": "^2.0.0", "storybook": "^7.5.2", @@ -2768,54 +2768,6 @@ "version": "0.3.0", "license": "MIT" }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/darwin-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", @@ -2832,294 +2784,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -4676,13 +4340,10 @@ } }, "node_modules/@prisma/client": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.0.0.tgz", - "integrity": "sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.9.1.tgz", + "integrity": "sha512-caSOnG4kxcSkhqC/2ShV7rEoWwd3XrftokxJqOCMVvia4NYV/TPtJlS9C2os3Igxw/Qyxumj9GBQzcStzECvtQ==", "hasInstallScript": true, - "dependencies": { - "@prisma/engines-version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584" - }, "engines": { "node": ">=16.13" }, @@ -4695,17 +4356,50 @@ } } }, + "node_modules/@prisma/debug": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.9.1.tgz", + "integrity": "sha512-yAHFSFCg8KVoL0oRUno3m60GAjsUKYUDkQ+9BA2X2JfVR3kRVSJFc/GpQ2fSORi4pSHZR9orfM4UC9OVXIFFTA==", + "devOptional": true + }, "node_modules/@prisma/engines": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.0.0.tgz", - "integrity": "sha512-kyT/8fd0OpWmhAU5YnY7eP31brW1q1YrTGoblWrhQJDiN/1K+Z8S1kylcmtjqx5wsUGcP1HBWutayA/jtyt+sg==", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.9.1.tgz", + "integrity": "sha512-gkdXmjxQ5jktxWNdDA5aZZ6R8rH74JkoKq6LD5mACSvxd2vbqWeWIOV0Py5wFC8vofOYShbt6XUeCIUmrOzOnQ==", "devOptional": true, - "hasInstallScript": true + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "5.9.1", + "@prisma/engines-version": "5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64", + "@prisma/fetch-engine": "5.9.1", + "@prisma/get-platform": "5.9.1" + } }, "node_modules/@prisma/engines-version": { - "version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584.tgz", - "integrity": "sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==" + "version": "5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64.tgz", + "integrity": "sha512-HFl7275yF0FWbdcNvcSRbbu9JCBSLMcurYwvWc8WGDnpu7APxQo2ONtZrUggU3WxLxUJ2uBX+0GOFIcJeVeOOQ==", + "devOptional": true + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.9.1.tgz", + "integrity": "sha512-l0goQOMcNVOJs1kAcwqpKq3ylvkD9F04Ioe1oJoCqmz05mw22bNAKKGWuDd3zTUoUZr97va0c/UfLNru+PDmNA==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.9.1", + "@prisma/engines-version": "5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64", + "@prisma/get-platform": "5.9.1" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.9.1.tgz", + "integrity": "sha512-6OQsNxTyhvG+T2Ksr8FPFpuPeL4r9u0JF0OZHUBI/Uy9SS43sPyAIutt4ZEAyqWQt104ERh70EZedkHZKsnNbg==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.9.1" + } }, "node_modules/@radix-ui/number": { "version": "1.0.0", @@ -9299,150 +8993,6 @@ "node": ">=10" } }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.96.tgz", - "integrity": "sha512-mFp9GFfuPg+43vlAdQZl0WZpZSE8sEzqL7sr/7Reul5McUHP0BaLsEzwjvD035ESfkY8GBZdLpMinblIbFNljQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.96.tgz", - "integrity": "sha512-8UEKkYJP4c8YzYIY/LlbSo8z5Obj4hqcv/fUTHiEePiGsOddgGf7AWjh56u7IoN/0uEmEro59nc1ChFXqXSGyg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.96.tgz", - "integrity": "sha512-c/IiJ0s1y3Ymm2BTpyC/xr6gOvoqAVETrivVXHq68xgNms95luSpbYQ28rqaZC8bQC8M5zdXpSc0T8DJu8RJGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.96.tgz", - "integrity": "sha512-i5/UTUwmJLri7zhtF6SAo/4QDQJDH2fhYJaBIUhrICmIkRO/ltURmpejqxsM/ye9Jqv5zG7VszMC0v/GYn/7BQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.96.tgz", - "integrity": "sha512-USdaZu8lTIkm4Yf9cogct/j5eqtdZqTgcTib4I+NloUW0E/hySou3eSyp3V2UAA1qyuC72ld1otXuyKBna0YKQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.96.tgz", - "integrity": "sha512-QYErutd+G2SNaCinUVobfL7jWWjGTI0QEoQ6hqTp7PxCJS/dmKmj3C5ZkvxRYcq7XcZt7ovrYCTwPTHzt6lZBg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.96.tgz", - "integrity": "sha512-hjGvvAduA3Un2cZ9iNP4xvTXOO4jL3G9iakhFsgVhpkU73SGmK7+LN8ZVBEu4oq2SUcHO6caWvnZ881cxGuSpg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.96.tgz", - "integrity": "sha512-Far2hVFiwr+7VPCM2GxSmbh3ikTpM3pDombE+d69hkedvYHYZxtTF+2LTKl/sXtpbUnsoq7yV/32c9R/xaaWfw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.96", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.96.tgz", - "integrity": "sha512-4VbSAniIu0ikLf5mBX81FsljnfqjoVGleEkCQv4+zRlyZtO3FHoDPkeLVoy6WRlj7tyrRcfUJ4mDdPkbfTO14g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, "node_modules/@swc/counter": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", @@ -13400,8 +12950,9 @@ } }, "node_modules/crypto-js": { - "version": "4.1.1", - "license": "MIT" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, "node_modules/crypto-random-string": { "version": "2.0.0", @@ -20354,8 +19905,9 @@ } }, "node_modules/next-auth": { - "version": "4.20.1", - "license": "ISC", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.5.tgz", + "integrity": "sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og==", "dependencies": { "@babel/runtime": "^7.20.13", "@panva/hkdf": "^1.0.2", @@ -20368,7 +19920,7 @@ "uuid": "^8.3.2" }, "peerDependencies": { - "next": "^12.2.5 || ^13", + "next": "^12.2.5 || ^13 || ^14", "nodemailer": "^6.6.5", "react": "^17.0.2 || ^18", "react-dom": "^17.0.2 || ^18" @@ -20594,8 +20146,9 @@ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/nodemailer": { - "version": "6.8.0", - "license": "MIT", + "version": "6.9.9", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.9.tgz", + "integrity": "sha512-dexTll8zqQoVJEZPwQAKzxxtFn0qTnjdQTchoU6Re9BUUGBJiOy3YMn/0ShTW6J5M0dfQ1NeDeRTTl4oIWgQMA==", "engines": { "node": ">=6.0.0" } @@ -22199,13 +21752,13 @@ } }, "node_modules/prisma": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.0.0.tgz", - "integrity": "sha512-KYWk83Fhi1FH59jSpavAYTt2eoMVW9YKgu8ci0kuUnt6Dup5Qy47pcB4/TLmiPAbhGrxxSz7gsSnJcCmkyPANA==", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.9.1.tgz", + "integrity": "sha512-Hy/8KJZz0ELtkw4FnG9MS9rNWlXcJhf98Z2QMqi0QiVMoS8PzsBkpla0/Y5hTlob8F3HeECYphBjqmBxrluUrQ==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/engines": "5.0.0" + "@prisma/engines": "5.9.1" }, "bin": { "prisma": "build/index.js" diff --git a/package.json b/package.json index d94c49672..2da84b6bc 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,6 @@ "@mui/material": "^5.4.0", "@next-auth/prisma-adapter": "^1.0.5", "@next/bundle-analyzer": "^13.1.6", - "@prisma/client": "^5.0.0", "@radix-ui/react-checkbox": "^1.0.1", "@radix-ui/react-dialog": "^1.0.3", "@radix-ui/react-dropdown-menu": "2.0.2", @@ -63,8 +62,8 @@ "intro.js": "^6.0.0", "intro.js-react": "^0.7.1", "next": "^13.5.4", - "next-auth": "^4.20.1", - "nodemailer": "^6.8.0", + "nodemailer": "^6.9.9", + "next-auth": "^4.24.5", "nprogress": "^0.2.0", "pdfjs-dist": "^3.3.122", "prettier-eslint": "^13.0.0", @@ -81,6 +80,7 @@ "devDependencies": { "@babel/core": "^7.20.12", "@jest/globals": "^29.6.1", + "@prisma/client": "^5.9.1", "@storybook/addon-essentials": "^7.5.2", "@storybook/addon-interactions": "^7.5.2", "@storybook/addon-links": "^7.5.2", @@ -113,7 +113,7 @@ "postcss": "^8.4.31", "prettier": "^2.3.2", "prettier-plugin-tailwindcss": "^0.2.2", - "prisma": "^5.0.0", + "prisma": "^5.9.1", "react-styleguidist": "^13.0.0", "start-server-and-test": "^2.0.0", "storybook": "^7.5.2", diff --git a/src/components/planner/Sidebar/RecursiveRequirement.tsx b/src/components/planner/Sidebar/RecursiveRequirement.tsx index 163f96aa6..799415bd2 100644 --- a/src/components/planner/Sidebar/RecursiveRequirement.tsx +++ b/src/components/planner/Sidebar/RecursiveRequirement.tsx @@ -1,4 +1,4 @@ -import React, { useMemo } from 'react'; +import React, { useMemo, Fragment } from 'react'; import { v4 as uuidv4 } from 'uuid'; import { trpc } from '@/utils/trpc'; @@ -36,15 +36,14 @@ export function RecursiveRequirement({ > <> {req.requirements.map((req2, idx) => ( - <> +
Option {idx + 1}
- +
))} @@ -58,15 +57,13 @@ export function RecursiveRequirement({ filled={req.filled} > <> - {req.requirements.map((req2, idx) => ( - <> - - + {req.requirements.map((req2) => ( + ))} @@ -85,15 +82,14 @@ export function RecursiveRequirement({ > <> {req.requirements.map((req2, idx) => ( - <> +
Option {idx + 1}
- +
))} @@ -112,15 +108,14 @@ export function RecursiveRequirement({ > <> {req.requirements.map((req2, idx) => ( - <> +
Option {idx + 1}
- +
))} @@ -140,7 +135,7 @@ export function RecursiveRequirement({ <> {req.prefix_groups.map((req2, idx) => ( NOT SUPPORTED; } }; - return <>{getRequirement()}; + return getRequirement(); } function CourseRequirementComponent({ diff --git a/src/components/planner/Sidebar/RequirementsContainer.tsx b/src/components/planner/Sidebar/RequirementsContainer.tsx index b1cb2603e..b7593fce4 100644 --- a/src/components/planner/Sidebar/RequirementsContainer.tsx +++ b/src/components/planner/Sidebar/RequirementsContainer.tsx @@ -155,7 +155,9 @@ const getRequirementGroup = ( course: `${c.subject_prefix} ${c.course_number}`, matcher: 'Course', filled: courses.includes(`${c.subject_prefix} ${c.course_number}`), - metadata: {}, + metadata: { + id: `course-${c.id}`, + }, })) : [], filterFunction: filterFunc, @@ -200,12 +202,12 @@ const getRequirementGroup = ( }; export const ProgressComponent2 = ({ value, max }: { value: number; max: number }) => { - const heh = `${(value * 100) / max}%`; + const width = `${(value * 100) / max}%`; return (
-
+
); @@ -220,7 +222,7 @@ export const ProgressComponent = ({ max: number; unit?: string; }) => { - const heh = `${(value * 100) / max}%`; + const width = `${(value * 100) / max}%`; return (
@@ -228,7 +230,7 @@ export const ProgressComponent = ({ {value}/{max} {unit}
-
+
); diff --git a/src/components/planner/Sidebar/types.ts b/src/components/planner/Sidebar/types.ts index f1d82d381..a94b1c1a3 100644 --- a/src/components/planner/Sidebar/types.ts +++ b/src/components/planner/Sidebar/types.ts @@ -17,7 +17,7 @@ export type DegreeRequirement = Requirement & { export interface Requirement { matcher: string; - metadata: { [key: string]: string }; + metadata: { id: string; [key: string]: string }; filled: boolean; } @@ -36,7 +36,6 @@ export type AndRequirementGroup = Requirement & { export type HoursRequirementGroup = Requirement & { matcher: 'Hours'; - metadata: { [key: string]: string }; required_hours: number; fulfilled_hours: number; requirements: RequirementTypes[]; diff --git a/src/components/planner/Tiles/SemesterTile.tsx b/src/components/planner/Tiles/SemesterTile.tsx index 79f1cda7a..2a41c7e00 100644 --- a/src/components/planner/Tiles/SemesterTile.tsx +++ b/src/components/planner/Tiles/SemesterTile.tsx @@ -1,10 +1,11 @@ import { UniqueIdentifier, useDroppable } from '@dnd-kit/core'; -import React, { FC, forwardRef, useState, useRef } from 'react'; +import React, { FC, forwardRef, useState, useRef, useImperativeHandle } from 'react'; import AnalyticsWrapper from '@/components/common/AnalyticsWrapper'; import ChevronIcon from '@/icons/ChevronIcon'; import LockIcon from '@/icons/LockIcon'; import UnlockedIcon from '@/icons/UnlockedIcon'; +import useAccordionAnimation from '@/shared/useAccordionAnimation'; import { displaySemesterCode, getSemesterHourFromCourseCode } from '@/utils/utilFunctions'; import DraggableSemesterCourseItem from './SemesterCourseItem'; @@ -26,11 +27,17 @@ export interface SemesterTileProps { export const MemoizedSemesterTile = React.memo( forwardRef(function SemesterTile( { semester, getDragId }, - ref, + outerRef, ) { - const [open, setOpen] = useState(true); + const innerRef = useRef(null); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + useImperativeHandle(outerRef, () => innerRef.current!, []); + const [hoverOpen, setHoverOpen] = useState(false); const hoverTimer = useRef>(); + const { toggle, open } = useAccordionAnimation(innerRef, () => + semester.courses.length === 0 ? '140px' : '170px', + ); const { handleSelectCourses, @@ -96,8 +103,8 @@ export const MemoizedSemesterTile = React.memo( // QUESTION: isValid color? return (
@@ -110,7 +117,7 @@ export const MemoizedSemesterTile = React.memo( open ? '-rotate-90' : 'rotate-90' } ml-auto h-3 w-3 transform cursor-pointer text-neutral-500 transition-all duration-500`} fontSize="inherit" - onClick={() => setOpen(!open)} + onClick={toggle} />
@@ -153,8 +160,8 @@ export const MemoizedSemesterTile = React.memo( /> )}
{semester.courses.map((course) => ( diff --git a/src/components/planner/TransferBank.tsx b/src/components/planner/TransferBank.tsx index b36e6155f..80b55a24e 100644 --- a/src/components/planner/TransferBank.tsx +++ b/src/components/planner/TransferBank.tsx @@ -1,16 +1,21 @@ -import React, { FC, useState } from 'react'; +import { FC, useRef, useState } from 'react'; import ChevronIcon from '@/icons/ChevronIcon'; +import useAccordionAnimation from '@/shared/useAccordionAnimation'; interface TransferBankProps { transferCredits: string[]; } const TransferBank: FC = ({ transferCredits }) => { - const [open, setOpen] = useState(true); + const bankRef = useRef(null); + const { toggle, open } = useAccordionAnimation(bankRef, () => '50px'); return ( -
+
Transfer Credits
= ({ transferCredits }) => { open ? '-rotate-90' : 'rotate-90' } h-3 w-3 transform cursor-pointer text-neutral-500 transition-all duration-500`} fontSize="inherit" - onClick={() => setOpen(!open)} + onClick={toggle} />
@@ -31,9 +36,7 @@ const TransferBank: FC = ({ transferCredits }) => {
    {transferCredits.map((credit, i) => (
  1. void }) { } } } + // TODO: Consider whether credit was earned or not before adding to credits list const credits: Credit[] = []; let isTransfer = true; @@ -158,6 +159,7 @@ export default function CustomPlan({ onDismiss }: { onDismiss: () => void }) { } } } + const dedupedCredits = credits.reduce((acc, curr) => { if (!acc.some((i) => i.courseCode === curr.courseCode)) { acc.push(curr); diff --git a/src/shared/useAccordionAnimation.tsx b/src/shared/useAccordionAnimation.tsx new file mode 100644 index 000000000..ee06a8b7d --- /dev/null +++ b/src/shared/useAccordionAnimation.tsx @@ -0,0 +1,40 @@ +import { useState, useCallback } from 'react'; + +const useAccordionAnimation = ( + ref: React.RefObject | null, + getClosedHeight: () => string, +) => { + const [open, setOpen] = useState(true); + function collapseSection(element: HTMLElement, closedHeight: string) { + const sectionHeight = element.scrollHeight; + element.style.height = sectionHeight + 'px'; + setTimeout(() => { + element.style.height = closedHeight; + }, 100); + } + function expandSection(element: HTMLElement) { + const zero = performance.now(); + function animate() { + const value = (performance.now() - zero) / 700; + if (value < 1) { + element.style.height = element.scrollHeight + 8 + 'px'; + requestAnimationFrame(animate); + } + } + requestAnimationFrame(animate); + } + + const toggle = useCallback(() => { + if (!ref || !ref.current) return; + setOpen((prev) => !prev); + if (open) { + collapseSection(ref.current, getClosedHeight()); + } else { + expandSection(ref.current); + } + }, [open, ref, getClosedHeight]); + + return { toggle, open }; +}; + +export default useAccordionAnimation; diff --git a/validator/.vscode/major.schema.json b/validator/.vscode/major.schema.json index 32e310a58..169c7b4d1 100644 --- a/validator/.vscode/major.schema.json +++ b/validator/.vscode/major.schema.json @@ -61,15 +61,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -90,15 +86,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -119,15 +111,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -151,15 +139,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -183,15 +167,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -215,15 +195,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -241,15 +217,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -267,15 +239,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -302,15 +270,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -337,15 +301,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -366,15 +326,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -401,15 +357,11 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -436,18 +388,14 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] }, "required_4000_level_courses": { "type": "integer" } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] }, { "type": "object", @@ -471,17 +419,13 @@ "type": "string" } }, - "requirements": [ - "id" - ] + "requirements": ["id"] } }, "additionalProperties": false, - "requirements": [ - "metadata" - ] + "requirements": ["metadata"] } ] } } -} \ No newline at end of file +} diff --git a/validator/.vscode/requirements.code-snippets b/validator/.vscode/requirements.code-snippets index f20d22521..8dd5d3778 100644 --- a/validator/.vscode/requirements.code-snippets +++ b/validator/.vscode/requirements.code-snippets @@ -1,129 +1,87 @@ { "CourseRequirement": { - "prefix": [ - "cr", - "CourseRequirement" - ], + "prefix": ["cr", "CourseRequirement"], "description": "Empty body of CourseRequirement", "body": "{\n \"matcher\": \"CourseRequirement\",\n \"course\": \"\",\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "AndRequirement": { - "prefix": [ - "ar", - "AndRequirement" - ], + "prefix": ["ar", "AndRequirement"], "description": "Empty body of AndRequirement", "body": "{\n \"matcher\": \"AndRequirement\",\n \"requirements\": [],\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "OrRequirement": { - "prefix": [ - "or", - "OrRequirement" - ], + "prefix": ["or", "OrRequirement"], "description": "Empty body of OrRequirement", "body": "{\n \"matcher\": \"OrRequirement\",\n \"requirements\": [],\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "FreeElectiveRequirement": { - "prefix": [ - "fer", - "FreeElectiveRequirement" - ], + "prefix": ["fer", "FreeElectiveRequirement"], "description": "Empty body of FreeElectiveRequirement", "body": "{\n \"matcher\": \"FreeElectiveRequirement\",\n \"excluded_courses\": [],\n \"required_hours\": 0,\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "SelectRequirement": { - "prefix": [ - "sr", - "SelectRequirement" - ], + "prefix": ["sr", "SelectRequirement"], "description": "Empty body of SelectRequirement", "body": "{\n \"matcher\": \"SelectRequirement\",\n \"requirements\": [],\n \"required_count\": 0,\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "HoursRequirement": { - "prefix": [ - "hr", - "HoursRequirement" - ], + "prefix": ["hr", "HoursRequirement"], "description": "Empty body of HoursRequirement", "body": "{\n \"matcher\": \"HoursRequirement\",\n \"required_hours\": 0,\n \"requirements\": [],\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "PrefixBucketRequirement": { - "prefix": [ - "pbr", - "PrefixBucketRequirement" - ], + "prefix": ["pbr", "PrefixBucketRequirement"], "description": "Empty body of PrefixBucketRequirement", "body": "{\n \"matcher\": \"PrefixBucketRequirement\",\n \"prefix\": \"\",\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "OtherRequirement": { - "prefix": [ - "or", - "OtherRequirement" - ], + "prefix": ["or", "OtherRequirement"], "description": "Empty body of OtherRequirement", "body": "{\n \"matcher\": \"OtherRequirement\",\n \"description\": \"\",\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "CSGuidedElectiveRequirement": { - "prefix": [ - "csger", - "CSGuidedElectiveRequirement" - ], + "prefix": ["csger", "CSGuidedElectiveRequirement"], "description": "Empty body of CSGuidedElectiveRequirement", "body": "{\n \"matcher\": \"CSGuidedElectiveRequirement\",\n \"required_count\": 0,\n \"starts_with\": \"\",\n \"also_fulfills\": [],\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "BAGuidedElectiveRequirement": { - "prefix": [ - "bager", - "BAGuidedElectiveRequirement" - ], + "prefix": ["bager", "BAGuidedElectiveRequirement"], "description": "Empty body of BAGuidedElectiveRequirement", "body": "{\n \"matcher\": \"BAGuidedElectiveRequirement\",\n \"required_count\": 0,\n \"required_hours\": 0,\n \"prefix_groups\": [],\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "SomeRequirement": { - "prefix": [ - "sr", - "SomeRequirement" - ], + "prefix": ["sr", "SomeRequirement"], "description": "Empty body of SomeRequirement", "body": "{\n \"matcher\": \"SomeRequirement\",\n \"requirements\": [],\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "MultiGroupElectiveRequirement": { - "prefix": [ - "mger", - "MultiGroupElectiveRequirement" - ], + "prefix": ["mger", "MultiGroupElectiveRequirement"], "description": "Empty body of MultiGroupElectiveRequirement", "body": "{\n \"matcher\": \"MultiGroupElectiveRequirement\",\n \"requirement_count\": 0,\n \"requirements\": [],\n \"minimum_hours_in_area\": 0,\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "ATECPrescribedElectiveRequirement": { - "prefix": [ - "atecper", - "ATECPrescribedElectiveRequirement" - ], + "prefix": ["atecper", "ATECPrescribedElectiveRequirement"], "description": "Empty body of ATECPrescribedElectiveRequirement", "body": "{\n \"matcher\": \"ATECPrescribedElectiveRequirement\",\n \"requirement_count\": 0,\n \"requirements\": [],\n \"minimum_hours_in_area\": 0,\n \"metadata\": {\n \"id\": \"$UUID\"\n },\n \"required_4000_level_courses\": 0\n}", "scope": "json" }, "PsychologyPrefixesOrCourses": { - "prefix": [ - "ppoc", - "PsychologyPrefixesOrCourses" - ], + "prefix": ["ppoc", "PsychologyPrefixesOrCourses"], "description": "Empty body of PsychologyPrefixesOrCourses", "body": "{\n \"matcher\": \"PsychologyPrefixesOrCourses\",\n \"required_hours\": 0,\n \"accepted_courses\": [],\n \"accepted_prefixes\": [],\n \"metadata\": {\n \"id\": \"$UUID\"\n }\n}", "scope": "json" }, "$comment": "Generated by gen_schema.py on 2023-08-04 18:20:08.360644" -} \ No newline at end of file +} diff --git a/validator/.vscode/settings.json b/validator/.vscode/settings.json index 0cc661165..ee68d46c5 100644 --- a/validator/.vscode/settings.json +++ b/validator/.vscode/settings.json @@ -8,10 +8,8 @@ "python.analysis.typeCheckingMode": "basic", "json.schemas": [ { - "fileMatch": [ - "/degree_data/**.json" - ], - "url": ".vscode/major.schema.json" + "fileMatch": ["/degree_data/**.json"], + "url": ".vscode/major.schema.json" } ], "python.formatting.provider": "black" diff --git a/validator/.vscode/utils.code-snippets b/validator/.vscode/utils.code-snippets index 2bbaf97b3..844de0a60 100644 --- a/validator/.vscode/utils.code-snippets +++ b/validator/.vscode/utils.code-snippets @@ -1,22 +1,22 @@ { - // Place your degree-validator workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and - // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope - // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is - // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: - // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. - // Placeholders with the same ids are connected. - // Example: - // "Print to console": { - // "scope": "javascript,typescript", - // "prefix": "log", - // "body": [ - // "console.log('$1');", - // "$2" - // ], - // "description": "Log output to console" - // } - "gen": { - "prefix": "gen", - "body": "$UUID" - } -} \ No newline at end of file + // Place your degree-validator workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and + // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope + // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is + // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: + // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. + // Placeholders with the same ids are connected. + // Example: + // "Print to console": { + // "scope": "javascript,typescript", + // "prefix": "log", + // "body": [ + // "console.log('$1');", + // "$2" + // ], + // "description": "Log output to console" + // } + "gen": { + "prefix": "gen", + "body": "$UUID" + } +} diff --git a/validator/degree_data/2023/Business Administration Energy Management Concentration(BS).json b/validator/degree_data/2023/Business Administration Energy Management Concentration(BS).json new file mode 100644 index 000000000..df0dedd3d --- /dev/null +++ b/validator/degree_data/2023/Business Administration Energy Management Concentration(BS).json @@ -0,0 +1,550 @@ +{ + "catalog_uri": "https://catalog.utdallas.edu/2022/undergraduate/programs/jsom/business-administration", + "minimum_credit_hours": 120, + "school": "Naveen Jindal School of Management", + "subtype": "Major", + "year": "2023-2024", + "requirements": { + "core": "@import ./core.json", + "major": [ + { + "matcher": "AndRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-0", + "name": "Major Preparatory Courses" + }, + "requirements": [ + { + "course": "ACCT 2301", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-1" + } + }, + { + "course": "ACCT 2302", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-2" + } + }, + { + "course": "BLAW 2301", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-3" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "course": "MATH 1325", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-5" + } + }, + { + "course": "MATH 2413", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-6" + } + }, + { + "course": "MATH 2417", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-7" + } + } + ], + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-4" + } + }, + { + "matcher": "OrRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-8" + }, + "requirements": [ + { + "course": "OPRE 3360", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-9" + } + }, + { + "course": "STAT 3360", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-10" + } + } + ] + }, + { + "matcher": "SelectRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-11" + }, + "required_count": 2, + "requirements": [ + { + "course": "BA 1310", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-12" + } + }, + { + "course": "BA 1320", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-13" + } + }, + { + "course": "ECON 2301", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-14" + } + }, + { + "course": "ECON 2302", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-15" + } + } + ] + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-16", + "name": "Major Core Courses" + }, + "requirements": [ + { + "matcher": "OrRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-17" + }, + "requirements": [ + { + "course": "BCOM 1300", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-18" + } + }, + { + "course": "BCOM 3300", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-19" + } + } + ] + }, + { + "course": "BA 3300", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-20" + } + }, + { + "course": "BCOM 4300", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-21" + } + }, + { + "matcher": "OrRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-22" + }, + "requirements": [ + { + "course": "BPS 4305", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-23" + } + }, + { + "course": "ENTP 3320", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-24" + } + } + ] + }, + { + "matcher": "OrRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-25" + }, + "requirements": [ + { + "course": "BPS 4395", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-26" + } + }, + { + "course": "ENTP 4395", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-27" + } + } + ] + }, + { + "course": "FIN 3320", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-28" + } + }, + { + "course": "IMS 3310", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-29" + } + }, + { + "course": "ITSS 3300", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-30" + } + }, + { + "course": "MKT 3300", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-31" + } + }, + { + "matcher": "OrRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-32" + }, + "requirements": [ + { + "course": "OBHR 3310", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-33" + } + }, + { + "course": "OBHR 3330", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-34" + } + } + ] + }, + { + "course": "OPRE 3310", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-35" + } + }, + { + "course": "OPRE 3330", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-36" + } + }, + { + "matcher": "OrRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-37" + }, + "requirements": [ + { + "course": "BPS 4396", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-38" + } + }, + { + "course": "ENTP 4340", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-39" + } + }, + { + "course": "MKT 4360", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-40" + } + }, + { + "course": "BA 4095", + "matcher": "CourseRequirement", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-41" + } + } + ] + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Related Courses", + "id": "Business Administration(BS) Energy Management Concentration-42" + }, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ENGY 3301", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-43" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENGY 3302", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-44" + } + }, + { + "matcher": "SelectRequirement", + "required_count": 2, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ENGY 3340", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-47" + } + }, + { + "matcher": "CourseRequirement", + "course": "BLAW 4301", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-48" + } + } + ], + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-46" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "FIN 4313", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-50" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENGY 4313", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-51" + } + } + ], + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-49" + } + }, + { + "matcher": "CourseRequirement", + "course": "MECO 4342", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-52" + } + } + ], + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-45" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BA 4V90", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-54" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4090", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-55" + } + } + ], + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-53" + } + }, + { + "matcher": "HoursRequirement", + "required_hours": 12, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BA 4V90", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-57" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4090", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-58" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ENGY 3340", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-60" + } + }, + { + "matcher": "CourseRequirement", + "course": "BLAW 4301", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-61" + } + } + ], + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-59" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENGY 4313", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-62" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4340", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-63" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4345", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-64" + } + }, + { + "matcher": "CourseRequirement", + "course": "GEOS 1303", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-65" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MECO 3330", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-67" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENGY 3330", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-68" + } + } + ], + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-66" + } + }, + { + "matcher": "CourseRequirement", + "course": "MECO 4342", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-69" + } + }, + { + "matcher": "CourseRequirement", + "course": "NATS 2333", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-70" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4330", + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-71" + } + } + ], + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-56" + } + } + ] + }, + { + "matcher": "FreeElectiveRequirement", + "required_hours": 6, + "excluded_courses": [], + "metadata": { + "id": "Business Administration(BS) Energy Management Concentration-72" + } + } + ] + }, + "display_name": "Business Administration(BS) Energy Management Concentration", + "id": "21dc5715-5b1b-4c02-99ce-32eb8bc90325" +} diff --git a/validator/degree_data/2023/Electrical Engineering(BS).json b/validator/degree_data/2023/Electrical Engineering(BS).json new file mode 100644 index 000000000..90465e4cb --- /dev/null +++ b/validator/degree_data/2023/Electrical Engineering(BS).json @@ -0,0 +1,586 @@ +{ + "catalog_uri": "https://catalog.utdallas.edu/2022/undergraduate/programs/ecs/electrical-engineering", + "minimum_credit_hours": 128, + "school": "Erik Jonsson School of Engineering and Computer Science", + "subtype": "Major", + "year": "2023-2024", + "requirements": { + "core": "@import ./core.json", + "major": [ + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Preparatory Courses", + "id": "Electrical Engineering(BSEE)-0" + }, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "CHEM 1111", + "metadata": { + "id": "Electrical Engineering(BSEE)-1" + } + }, + { + "matcher": "CourseRequirement", + "course": "CHEM 1311", + "metadata": { + "id": "Electrical Engineering(BSEE)-2" + } + }, + { + "matcher": "CourseRequirement", + "course": "CS 1325", + "metadata": { + "id": "Electrical Engineering(BSEE)-3" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 1100", + "metadata": { + "id": "Electrical Engineering(BSEE)-4" + } + }, + { + "matcher": "CourseRequirement", + "course": "ECS 1100", + "metadata": { + "id": "Electrical Engineering(BSEE)-5" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 1202", + "metadata": { + "id": "Electrical Engineering(BSEE)-6" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENGR 2300", + "metadata": { + "id": "Electrical Engineering(BSEE)-7" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 2310", + "metadata": { + "id": "Electrical Engineering(BSEE)-8" + } + }, + { + "matcher": "CourseRequirement", + "course": "PHYS 2125", + "metadata": { + "id": "Electrical Engineering(BSEE)-9" + } + }, + { + "matcher": "CourseRequirement", + "course": "PHYS 2126", + "metadata": { + "id": "Electrical Engineering(BSEE)-10" + } + }, + { + "matcher": "CourseRequirement", + "course": "PHYS 2325", + "metadata": { + "id": "Electrical Engineering(BSEE)-11" + } + }, + { + "matcher": "CourseRequirement", + "course": "PHYS 2326", + "metadata": { + "id": "Electrical Engineering(BSEE)-12" + } + }, + { + "matcher": "CourseRequirement", + "course": "RHET 1302", + "metadata": { + "id": "Electrical Engineering(BSEE)-13" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "AndRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MATH 2413", + "metadata": { + "id": "Electrical Engineering(BSEE)-16" + } + }, + { + "matcher": "CourseRequirement", + "course": "MATH 2414", + "metadata": { + "id": "Electrical Engineering(BSEE)-17" + } + }, + { + "matcher": "CourseRequirement", + "course": "MATH 2415", + "metadata": { + "id": "Electrical Engineering(BSEE)-18" + } + } + ], + "metadata": { + "id": "Electrical Engineering(BSEE)-15" + } + }, + { + "matcher": "AndRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MATH 2417", + "metadata": { + "id": "Electrical Engineering(BSEE)-20" + } + }, + { + "matcher": "CourseRequirement", + "course": "MATH 2419", + "metadata": { + "id": "Electrical Engineering(BSEE)-21" + } + } + ], + "metadata": { + "id": "Electrical Engineering(BSEE)-19" + } + } + ], + "metadata": { + "id": "Electrical Engineering(BSEE)-14" + } + }, + { + "matcher": "CourseRequirement", + "course": "MATH 2420", + "metadata": { + "id": "Electrical Engineering(BSEE)-22" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Core Courses", + "id": "Electrical Engineering(BSEE)-23" + }, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "EE 3161", + "metadata": { + "id": "Electrical Engineering(BSEE)-24" + } + }, + { + "matcher": "CourseRequirement", + "course": "ECS 3390", + "metadata": { + "id": "Electrical Engineering(BSEE)-25" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 3201", + "metadata": { + "id": "Electrical Engineering(BSEE)-26" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 3202", + "metadata": { + "id": "Electrical Engineering(BSEE)-27" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENGR 3300", + "metadata": { + "id": "Electrical Engineering(BSEE)-28" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 2301", + "metadata": { + "id": "Electrical Engineering(BSEE)-29" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 3302", + "metadata": { + "id": "Electrical Engineering(BSEE)-30" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 3310", + "metadata": { + "id": "Electrical Engineering(BSEE)-31" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 3311", + "metadata": { + "id": "Electrical Engineering(BSEE)-32" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 3320", + "metadata": { + "id": "Electrical Engineering(BSEE)-33" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENGR 3341", + "metadata": { + "id": "Electrical Engineering(BSEE)-34" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4301", + "metadata": { + "id": "Electrical Engineering(BSEE)-35" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4310", + "metadata": { + "id": "Electrical Engineering(BSEE)-36" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4370", + "metadata": { + "id": "Electrical Engineering(BSEE)-37" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4388", + "metadata": { + "id": "Electrical Engineering(BSEE)-38" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4389", + "metadata": { + "id": "Electrical Engineering(BSEE)-39" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "EE 4201", + "metadata": { + "id": "Electrical Engineering(BSEE)-41" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4202", + "metadata": { + "id": "Electrical Engineering(BSEE)-42" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4203", + "metadata": { + "id": "Electrical Engineering(BSEE)-43" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4204", + "metadata": { + "id": "Electrical Engineering(BSEE)-44" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4205", + "metadata": { + "id": "Electrical Engineering(BSEE)-45" + } + } + ], + "metadata": { + "id": "Electrical Engineering(BSEE)-40" + } + } + ] + }, + { + "matcher": "HoursRequirement", + "required_hours": 12, + "metadata": { + "name": "Major Guided Electives", + "id": "Electrical Engineering(BSEE)-46" + }, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "EE 4V97", + "metadata": { + "id": "Electrical Engineering(BSEE)-47" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4V98", + "metadata": { + "id": "Electrical Engineering(BSEE)-48" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4399", + "metadata": { + "id": "Electrical Engineering(BSEE)-49" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4168", + "metadata": { + "id": "Electrical Engineering(BSEE)-50" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4325", + "metadata": { + "id": "Electrical Engineering(BSEE)-51" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4340", + "metadata": { + "id": "Electrical Engineering(BSEE)-52" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4368", + "metadata": { + "id": "Electrical Engineering(BSEE)-53" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4V95", + "metadata": { + "id": "Electrical Engineering(BSEE)-54" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4202", + "metadata": { + "id": "Electrical Engineering(BSEE)-55" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4304", + "metadata": { + "id": "Electrical Engineering(BSEE)-56" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4V95", + "metadata": { + "id": "Electrical Engineering(BSEE)-57" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4201", + "metadata": { + "id": "Electrical Engineering(BSEE)-58" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4330", + "metadata": { + "id": "Electrical Engineering(BSEE)-59" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4391", + "metadata": { + "id": "Electrical Engineering(BSEE)-60" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4371", + "metadata": { + "id": "Electrical Engineering(BSEE)-61" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4V95", + "metadata": { + "id": "Electrical Engineering(BSEE)-62" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4204", + "metadata": { + "id": "Electrical Engineering(BSEE)-63" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4362", + "metadata": { + "id": "Electrical Engineering(BSEE)-64" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4363", + "metadata": { + "id": "Electrical Engineering(BSEE)-65" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4V95", + "metadata": { + "id": "Electrical Engineering(BSEE)-66" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4205", + "metadata": { + "id": "Electrical Engineering(BSEE)-67" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 3350", + "metadata": { + "id": "Electrical Engineering(BSEE)-68" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4331", + "metadata": { + "id": "Electrical Engineering(BSEE)-69" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4342", + "metadata": { + "id": "Electrical Engineering(BSEE)-70" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4360", + "metadata": { + "id": "Electrical Engineering(BSEE)-71" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4361", + "metadata": { + "id": "Electrical Engineering(BSEE)-72" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4365", + "metadata": { + "id": "Electrical Engineering(BSEE)-73" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4367", + "metadata": { + "id": "Electrical Engineering(BSEE)-74" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4V95", + "metadata": { + "id": "Electrical Engineering(BSEE)-75" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4203", + "metadata": { + "id": "Electrical Engineering(BSEE)-76" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4399", + "metadata": { + "id": "Electrical Engineering(BSEE)-77" + } + }, + { + "matcher": "CourseRequirement", + "course": "EE 4V98", + "metadata": { + "id": "Electrical Engineering(BSEE)-78" + } + } + ] + }, + { + "matcher": "FreeElectiveRequirement", + "required_hours": 9, + "excluded_courses": [], + "metadata": { + "id": "Electrical Engineering(BSEE)-79" + } + } + ] + }, + "display_name": "Electrical Engineering(BSEE)", + "id": "2abe1b82-15a2-4854-8875-8b4c5a812610" +} diff --git a/validator/degree_data/2023/Global Business(BS).json b/validator/degree_data/2023/Global Business(BS).json new file mode 100644 index 000000000..8a4b53aaf --- /dev/null +++ b/validator/degree_data/2023/Global Business(BS).json @@ -0,0 +1,1245 @@ +{ + "catalog_uri": "https://catalog.utdallas.edu/2022/undergraduate/programs/jsom/global-business", + "minimum_credit_hours": 120, + "school": "Naveen Jindal School of Management", + "subtype": "Major", + "year": "2023-2024", + "requirements": { + "core": "@import ./core.json", + "major": [ + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Preparatory Courses", + "id": "Global Business(BS)-0" + }, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ACCT 2301", + "metadata": { + "id": "Global Business(BS)-1" + } + }, + { + "matcher": "CourseRequirement", + "course": "ACCT 2302", + "metadata": { + "id": "Global Business(BS)-2" + } + }, + { + "matcher": "CourseRequirement", + "course": "BLAW 2301", + "metadata": { + "id": "Global Business(BS)-3" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "course": "MATH 1325", + "matcher": "CourseRequirement", + "metadata": { + "id": "Global Business(BS)-5" + } + }, + { + "course": "MATH 2413", + "matcher": "CourseRequirement", + "metadata": { + "id": "Global Business(BS)-6" + } + }, + { + "course": "MATH 2417", + "matcher": "CourseRequirement", + "metadata": { + "id": "Global Business(BS)-7" + } + } + ], + "metadata": { + "id": "Global Business(BS)-4" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OPRE 3360", + "metadata": { + "id": "Global Business(BS)-9" + } + }, + { + "matcher": "CourseRequirement", + "course": "STAT 3360", + "metadata": { + "id": "Global Business(BS)-10" + } + } + ], + "metadata": { + "id": "Global Business(BS)-8" + } + }, + { + "matcher": "SelectRequirement", + "required_count": 2, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BA 1310", + "metadata": { + "id": "Global Business(BS)-12" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 1320", + "metadata": { + "id": "Global Business(BS)-13" + } + }, + { + "matcher": "CourseRequirement", + "course": "ECON 2301", + "metadata": { + "id": "Global Business(BS)-14" + } + }, + { + "matcher": "CourseRequirement", + "course": "ECON 2302", + "metadata": { + "id": "Global Business(BS)-15" + } + } + ], + "metadata": { + "id": "Global Business(BS)-11" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Core Courses", + "id": "Global Business(BS)-16" + }, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BCOM 1300", + "metadata": { + "id": "Global Business(BS)-18" + } + }, + { + "matcher": "CourseRequirement", + "course": "BCOM 3300", + "metadata": { + "id": "Global Business(BS)-19" + } + } + ], + "metadata": { + "id": "Global Business(BS)-17" + } + }, + { + "matcher": "CourseRequirement", + "course": "BCOM 4300", + "metadata": { + "id": "Global Business(BS)-20" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3320", + "metadata": { + "id": "Global Business(BS)-21" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 3310", + "metadata": { + "id": "Global Business(BS)-22" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "IMS 4395", + "metadata": { + "id": "Global Business(BS)-24" + } + }, + { + "matcher": "CourseRequirement", + "course": "BPS 4395", + "metadata": { + "id": "Global Business(BS)-25" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4395", + "metadata": { + "id": "Global Business(BS)-26" + } + } + ], + "metadata": { + "id": "Global Business(BS)-23" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 3300", + "metadata": { + "id": "Global Business(BS)-27" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 3300", + "metadata": { + "id": "Global Business(BS)-28" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OBHR 3310", + "metadata": { + "id": "Global Business(BS)-30" + } + }, + { + "matcher": "CourseRequirement", + "course": "OBHR 3330", + "metadata": { + "id": "Global Business(BS)-31" + } + } + ], + "metadata": { + "id": "Global Business(BS)-29" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 3310", + "metadata": { + "id": "Global Business(BS)-32" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Related Courses", + "id": "Global Business(BS)-33" + }, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BLAW 4301", + "metadata": { + "id": "Global Business(BS)-34" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3380", + "metadata": { + "id": "Global Business(BS)-35" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "IMS 4320", + "metadata": { + "id": "Global Business(BS)-37" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4320", + "metadata": { + "id": "Global Business(BS)-38" + } + } + ], + "metadata": { + "id": "Global Business(BS)-36" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 4330", + "metadata": { + "id": "Global Business(BS)-39" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 4350", + "metadata": { + "id": "Global Business(BS)-40" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 4373", + "metadata": { + "id": "Global Business(BS)-41" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "IMS 4310", + "metadata": { + "id": "Global Business(BS)-43" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 4340", + "metadata": { + "id": "Global Business(BS)-44" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 4v94", + "metadata": { + "id": "Global Business(BS)-45" + } + } + ], + "metadata": { + "id": "Global Business(BS)-42" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Elective Requirements", + "id": "Global Business(BS)-46" + }, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "IMS 4V90", + "metadata": { + "id": "Global Business(BS)-48" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 4090", + "metadata": { + "id": "Global Business(BS)-49" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4090", + "metadata": { + "id": "Global Business(BS)-50" + } + } + ], + "metadata": { + "id": "Global Business(BS)-47" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "IMS 4335", + "metadata": { + "id": "Global Business(BS)-52" + } + }, + { + "matcher": "CourseRequirement", + "course": "BPS 4396", + "metadata": { + "id": "Global Business(BS)-53" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4340", + "metadata": { + "id": "Global Business(BS)-54" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4360", + "metadata": { + "id": "Global Business(BS)-55" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4095", + "metadata": { + "id": "Global Business(BS)-56" + } + } + ], + "metadata": { + "id": "Global Business(BS)-51" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "AndRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "FIN 3350", + "metadata": { + "id": "Global Business(BS)-59" + } + }, + { + "matcher": "CourseRequirement", + "course": "MECO 4303", + "metadata": { + "id": "Global Business(BS)-60" + } + }, + { + "matcher": "CourseRequirement", + "course": "MECO 4351", + "metadata": { + "id": "Global Business(BS)-61" + } + }, + { + "matcher": "CourseRequirement", + "course": "MECHO 4352", + "metadata": { + "id": "Global Business(BS)-62" + } + } + ], + "metadata": { + "id": "Global Business(BS)-58" + } + }, + { + "matcher": "AndRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ENGY 3301", + "metadata": { + "id": "Global Business(BS)-64" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENGY 3302", + "metadata": { + "id": "Global Business(BS)-65" + } + }, + { + "matcher": "SelectRequirement", + "required_count": 2, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ENGY 3340", + "metadata": { + "id": "Global Business(BS)-68" + } + }, + { + "matcher": "CourseRequirement", + "course": "BLAW 4301", + "metadata": { + "id": "Global Business(BS)-69" + } + } + ], + "metadata": { + "id": "Global Business(BS)-67" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "FIN 4313", + "metadata": { + "id": "Global Business(BS)-71" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENGY 4313", + "metadata": { + "id": "Global Business(BS)-72" + } + } + ], + "metadata": { + "id": "Global Business(BS)-70" + } + }, + { + "matcher": "CourseRequirement", + "course": "MECO 4342", + "metadata": { + "id": "Global Business(BS)-73" + } + } + ], + "metadata": { + "id": "Global Business(BS)-66" + } + } + ], + "metadata": { + "id": "Global Business(BS)-63" + } + }, + { + "matcher": "AndRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ENTP 3301", + "metadata": { + "id": "Global Business(BS)-75" + } + }, + { + "matcher": "HoursRequirement", + "required_hours": 9, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ENTP 3320", + "metadata": { + "id": "Global Business(BS)-78" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 3321", + "metadata": { + "id": "Global Business(BS)-79" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 3360", + "metadata": { + "id": "Global Business(BS)-80" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3360", + "metadata": { + "id": "Global Business(BS)-81" + } + } + ], + "metadata": { + "id": "Global Business(BS)-77" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4311", + "metadata": { + "id": "Global Business(BS)-82" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ENTP 4320", + "metadata": { + "id": "Global Business(BS)-84" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4350", + "metadata": { + "id": "Global Business(BS)-85" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4360", + "metadata": { + "id": "Global Business(BS)-86" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4398", + "metadata": { + "id": "Global Business(BS)-87" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4399", + "metadata": { + "id": "Global Business(BS)-88" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4V00", + "metadata": { + "id": "Global Business(BS)-89" + } + } + ], + "metadata": { + "id": "Global Business(BS)-83" + } + } + ], + "metadata": { + "id": "Global Business(BS)-76" + } + } + ], + "metadata": { + "id": "Global Business(BS)-74" + } + }, + { + "matcher": "AndRequirement", + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "RMIS 3370", + "metadata": { + "id": "Global Business(BS)-92" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3370", + "metadata": { + "id": "Global Business(BS)-93" + } + } + ], + "metadata": { + "id": "Global Business(BS)-91" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "RMIS 4331", + "metadata": { + "id": "Global Business(BS)-95" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4331", + "metadata": { + "id": "Global Business(BS)-96" + } + } + ], + "metadata": { + "id": "Global Business(BS)-94" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "RMIS 4332", + "metadata": { + "id": "Global Business(BS)-98" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4332", + "metadata": { + "id": "Global Business(BS)-99" + } + } + ], + "metadata": { + "id": "Global Business(BS)-97" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "RMIS 4333", + "metadata": { + "id": "Global Business(BS)-101" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4333", + "metadata": { + "id": "Global Business(BS)-102" + } + } + ], + "metadata": { + "id": "Global Business(BS)-100" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "RMIS 4334", + "metadata": { + "id": "Global Business(BS)-104" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4334", + "metadata": { + "id": "Global Business(BS)-105" + } + } + ], + "metadata": { + "id": "Global Business(BS)-103" + } + } + ], + "metadata": { + "id": "Global Business(BS)-90" + } + }, + { + "matcher": "AndRequirement", + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "REAL 3305", + "metadata": { + "id": "Global Business(BS)-108" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3305", + "metadata": { + "id": "Global Business(BS)-109" + } + } + ], + "metadata": { + "id": "Global Business(BS)-107" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "REAL 3358", + "metadata": { + "id": "Global Business(BS)-111" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3358", + "metadata": { + "id": "Global Business(BS)-112" + } + } + ], + "metadata": { + "id": "Global Business(BS)-110" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "REAL 3365", + "metadata": { + "id": "Global Business(BS)-114" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3365", + "metadata": { + "id": "Global Business(BS)-115" + } + } + ], + "metadata": { + "id": "Global Business(BS)-113" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "REAL 4321", + "metadata": { + "id": "Global Business(BS)-117" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4321", + "metadata": { + "id": "Global Business(BS)-118" + } + } + ], + "metadata": { + "id": "Global Business(BS)-116" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "REAL 4332", + "metadata": { + "id": "Global Business(BS)-120" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4332", + "metadata": { + "id": "Global Business(BS)-121" + } + } + ], + "metadata": { + "id": "Global Business(BS)-119" + } + } + ], + "metadata": { + "id": "Global Business(BS)-106" + } + } + ], + "metadata": { + "id": "Global Business(BS)-57" + } + }, + { + "matcher": "AndRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MKT 3330", + "metadata": { + "id": "Global Business(BS)-123" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MKT 3331", + "metadata": { + "id": "Global Business(BS)-125" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4332", + "metadata": { + "id": "Global Business(BS)-126" + } + } + ], + "metadata": { + "id": "Global Business(BS)-124" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MKT 4331", + "metadata": { + "id": "Global Business(BS)-128" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4331", + "metadata": { + "id": "Global Business(BS)-129" + } + } + ], + "metadata": { + "id": "Global Business(BS)-127" + } + }, + { + "matcher": "CourseRequirement", + "course": "OBHR 4352", + "metadata": { + "id": "Global Business(BS)-130" + } + } + ], + "metadata": { + "id": "Global Business(BS)-122" + } + }, + { + "matcher": "HoursRequirement", + "required_hours": 18, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "IMS 4V90", + "metadata": { + "id": "Global Business(BS)-132" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 4090", + "metadata": { + "id": "Global Business(BS)-133" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4090", + "metadata": { + "id": "Global Business(BS)-134" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 4335", + "metadata": { + "id": "Global Business(BS)-135" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4340", + "metadata": { + "id": "Global Business(BS)-136" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4360", + "metadata": { + "id": "Global Business(BS)-137" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4095", + "metadata": { + "id": "Global Business(BS)-138" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 3301", + "metadata": { + "id": "Global Business(BS)-139" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 3360", + "metadata": { + "id": "Global Business(BS)-140" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3360", + "metadata": { + "id": "Global Business(BS)-141" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4311", + "metadata": { + "id": "Global Business(BS)-142" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4320", + "metadata": { + "id": "Global Business(BS)-143" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4350", + "metadata": { + "id": "Global Business(BS)-144" + } + }, + { + "matcher": "CourseRequirement", + "course": "RMIS 3370", + "metadata": { + "id": "Global Business(BS)-145" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3370", + "metadata": { + "id": "Global Business(BS)-146" + } + }, + { + "matcher": "CourseRequirement", + "course": "RMIS 4331", + "metadata": { + "id": "Global Business(BS)-147" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4331", + "metadata": { + "id": "Global Business(BS)-148" + } + }, + { + "matcher": "CourseRequirement", + "course": "RMIS 4332", + "metadata": { + "id": "Global Business(BS)-149" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4332", + "metadata": { + "id": "Global Business(BS)-150" + } + }, + { + "matcher": "CourseRequirement", + "course": "RMIS 4333", + "metadata": { + "id": "Global Business(BS)-151" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4333", + "metadata": { + "id": "Global Business(BS)-152" + } + }, + { + "matcher": "CourseRequirement", + "course": "RMIS 4334", + "metadata": { + "id": "Global Business(BS)-153" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4334", + "metadata": { + "id": "Global Business(BS)-154" + } + }, + { + "matcher": "CourseRequirement", + "course": "REAL 3305", + "metadata": { + "id": "Global Business(BS)-155" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3305", + "metadata": { + "id": "Global Business(BS)-156" + } + }, + { + "matcher": "CourseRequirement", + "course": "REAL 3365", + "metadata": { + "id": "Global Business(BS)-157" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3365", + "metadata": { + "id": "Global Business(BS)-158" + } + }, + { + "matcher": "CourseRequirement", + "course": "REAL 4321", + "metadata": { + "id": "Global Business(BS)-159" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4321", + "metadata": { + "id": "Global Business(BS)-160" + } + }, + { + "matcher": "CourseRequirement", + "course": "REAL 4328", + "metadata": { + "id": "Global Business(BS)-161" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 4328", + "metadata": { + "id": "Global Business(BS)-162" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 3330", + "metadata": { + "id": "Global Business(BS)-163" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 3331", + "metadata": { + "id": "Global Business(BS)-164" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4332", + "metadata": { + "id": "Global Business(BS)-165" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4331", + "metadata": { + "id": "Global Business(BS)-166" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4331", + "metadata": { + "id": "Global Business(BS)-167" + } + }, + { + "matcher": "CourseRequirement", + "course": "OBHR 4352", + "metadata": { + "id": "Global Business(BS)-168" + } + } + ], + "metadata": { + "id": "Global Business(BS)-131" + } + } + ] + } + ] + }, + "display_name": "Global Business(BS)", + "id": "e2a06098-9169-457d-b1e4-bc726295f777" +} diff --git a/validator/degree_data/2023/Information Technology And Systems(BS).json b/validator/degree_data/2023/Information Technology And Systems(BS).json new file mode 100644 index 000000000..0016c4248 --- /dev/null +++ b/validator/degree_data/2023/Information Technology And Systems(BS).json @@ -0,0 +1,644 @@ +{ + "catalog_uri": "https://catalog.utdallas.edu/2022/undergraduate/programs/jsom/information-technology-systems", + "minimum_credit_hours": 120, + "school": "Naveen Jindal School of Management", + "subtype": "Major", + "year": "2023-2024", + "requirements": { + "core": "@import ./core.json", + "major": [ + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Preparatory Courses", + "id": "Information Technology and Systems(BS)-0" + }, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ACCT 2301", + "metadata": { + "id": "Information Technology and Systems(BS)-1" + } + }, + { + "matcher": "CourseRequirement", + "course": "ACCT 2302", + "metadata": { + "id": "Information Technology and Systems(BS)-2" + } + }, + { + "matcher": "CourseRequirement", + "course": "BLAW 2301", + "metadata": { + "id": "Information Technology and Systems(BS)-3" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 3311", + "metadata": { + "id": "Information Technology and Systems(BS)-4" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ITSS 3312", + "metadata": { + "id": "Information Technology and Systems(BS)-6" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4381", + "metadata": { + "id": "Information Technology and Systems(BS)-7" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-5" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "course": "MATH 1325", + "matcher": "CourseRequirement", + "metadata": { + "id": "Information Technology and Systems(BS)-9" + } + }, + { + "course": "MATH 2413", + "matcher": "CourseRequirement", + "metadata": { + "id": "Information Technology and Systems(BS)-10" + } + }, + { + "course": "MATH 2417", + "matcher": "CourseRequirement", + "metadata": { + "id": "Information Technology and Systems(BS)-11" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-8" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MATH 1326", + "metadata": { + "id": "Information Technology and Systems(BS)-13" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 3340", + "metadata": { + "id": "Information Technology and Systems(BS)-14" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-12" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OPRE 3333", + "metadata": { + "id": "Information Technology and Systems(BS)-16" + } + }, + { + "matcher": "CourseRequirement", + "course": "MATH 2333", + "metadata": { + "id": "Information Technology and Systems(BS)-17" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-15" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OPRE 3360", + "metadata": { + "id": "Information Technology and Systems(BS)-19" + } + }, + { + "matcher": "CourseRequirement", + "course": "STAT 3360", + "metadata": { + "id": "Information Technology and Systems(BS)-20" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-18" + } + }, + { + "matcher": "SelectRequirement", + "required_count": 2, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BA 1310", + "metadata": { + "id": "Information Technology and Systems(BS)-22" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 1320", + "metadata": { + "id": "Information Technology and Systems(BS)-23" + } + }, + { + "matcher": "CourseRequirement", + "course": "ECON 2301", + "metadata": { + "id": "Information Technology and Systems(BS)-24" + } + }, + { + "matcher": "CourseRequirement", + "course": "ECON 2302", + "metadata": { + "id": "Information Technology and Systems(BS)-25" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-21" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Core Courses", + "id": "Information Technology and Systems(BS)-26" + }, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BCOM 1300", + "metadata": { + "id": "Information Technology and Systems(BS)-28" + } + }, + { + "matcher": "CourseRequirement", + "course": "BCOM 3300", + "metadata": { + "id": "Information Technology and Systems(BS)-29" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-27" + } + }, + { + "matcher": "CourseRequirement", + "course": "BCOM 4300", + "metadata": { + "id": "Information Technology and Systems(BS)-30" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3320", + "metadata": { + "id": "Information Technology and Systems(BS)-31" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 3310", + "metadata": { + "id": "Information Technology and Systems(BS)-32" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 3300", + "metadata": { + "id": "Information Technology and Systems(BS)-33" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 3300", + "metadata": { + "id": "Information Technology and Systems(BS)-34" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OBHR 3310", + "metadata": { + "id": "Information Technology and Systems(BS)-36" + } + }, + { + "matcher": "CourseRequirement", + "course": "OBHR 3330", + "metadata": { + "id": "Information Technology and Systems(BS)-37" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-35" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 3310", + "metadata": { + "id": "Information Technology and Systems(BS)-38" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4095", + "metadata": { + "id": "Information Technology and Systems(BS)-39" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Related Courses", + "id": "Information Technology and Systems(BS)-40" + }, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ITSS 4300", + "metadata": { + "id": "Information Technology and Systems(BS)-41" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4330", + "metadata": { + "id": "Information Technology and Systems(BS)-42" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4351", + "metadata": { + "id": "Information Technology and Systems(BS)-43" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4360", + "metadata": { + "id": "Information Technology and Systems(BS)-44" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4370", + "metadata": { + "id": "Information Technology and Systems(BS)-45" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ITSS 4395", + "metadata": { + "id": "Information Technology and Systems(BS)-47" + } + }, + { + "matcher": "CourseRequirement", + "course": "BPS 4395", + "metadata": { + "id": "Information Technology and Systems(BS)-48" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-46" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ITSS 4090", + "metadata": { + "id": "Information Technology and Systems(BS)-50" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4090", + "metadata": { + "id": "Information Technology and Systems(BS)-51" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-49" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Guided Electives", + "id": "Information Technology and Systems(BS)-52" + }, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "HoursRequirement", + "required_hours": 12, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ITSS 4352", + "metadata": { + "id": "Information Technology and Systems(BS)-55" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4353", + "metadata": { + "id": "Information Technology and Systems(BS)-56" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4354", + "metadata": { + "id": "Information Technology and Systems(BS)-57" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4355", + "metadata": { + "id": "Information Technology and Systems(BS)-58" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-54" + } + }, + { + "matcher": "HoursRequirement", + "required_hours": 12, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ITSS 4340", + "metadata": { + "id": "Information Technology and Systems(BS)-60" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4343", + "metadata": { + "id": "Information Technology and Systems(BS)-61" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4344", + "metadata": { + "id": "Information Technology and Systems(BS)-62" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ACCT 4342", + "metadata": { + "id": "Information Technology and Systems(BS)-64" + } + }, + { + "matcher": "CourseRequirement", + "course": "ACCT 3322", + "metadata": { + "id": "Information Technology and Systems(BS)-65" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-63" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-59" + } + }, + { + "matcher": "HoursRequirement", + "required_hours": 12, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ITSS 4340", + "metadata": { + "id": "Information Technology and Systems(BS)-67" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 3330", + "metadata": { + "id": "Information Technology and Systems(BS)-68" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MKT 4331", + "metadata": { + "id": "Information Technology and Systems(BS)-70" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4332", + "metadata": { + "id": "Information Technology and Systems(BS)-71" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-69" + } + }, + { + "matcher": "PrefixBucketRequirement", + "prefix": "ITSS", + "metadata": { + "id": "Information Technology and Systems(BS)-72" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-66" + } + }, + { + "matcher": "HoursRequirement", + "required_hours": 12, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ENTP 3301", + "metadata": { + "id": "Information Technology and Systems(BS)-74" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 3320", + "metadata": { + "id": "Information Technology and Systems(BS)-75" + } + }, + { + "matcher": "PrefixBucketRequirement", + "prefix": "ITSS", + "metadata": { + "id": "Information Technology and Systems(BS)-76" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-73" + } + }, + { + "matcher": "HoursRequirement", + "required_hours": 12, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ITSS 4356", + "metadata": { + "id": "Information Technology and Systems(BS)-78" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4361", + "metadata": { + "id": "Information Technology and Systems(BS)-79" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4362", + "metadata": { + "id": "Information Technology and Systems(BS)-80" + } + }, + { + "matcher": "PrefixBucketRequirement", + "prefix": "ITSS", + "metadata": { + "id": "Information Technology and Systems(BS)-81" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-77" + } + }, + { + "matcher": "HoursRequirement", + "required_hours": 12, + "requirements": [ + { + "matcher": "PrefixBucketRequirement", + "prefix": "ITSS", + "metadata": { + "id": "Information Technology and Systems(BS)-83" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-82" + } + } + ], + "metadata": { + "id": "Information Technology and Systems(BS)-53" + } + } + ] + }, + { + "matcher": "FreeElectiveRequirement", + "required_hours": 0, + "excluded_courses": [], + "metadata": { + "id": "Information Technology and Systems(BS)-84" + } + } + ] + }, + "display_name": "Information Technology and Systems(BS)", + "id": "1b43a1ff-ea55-42c5-b702-b75b489e5cfb" +} diff --git a/validator/degree_data/2023/Marketing(BS).json b/validator/degree_data/2023/Marketing(BS).json new file mode 100644 index 000000000..521bceb0a --- /dev/null +++ b/validator/degree_data/2023/Marketing(BS).json @@ -0,0 +1,524 @@ +{ + "catalog_uri": "https://catalog.utdallas.edu/2022/undergraduate/programs/jsom/marketing", + "minimum_credit_hours": 120, + "school": "Naveen Jindal School of Management", + "subtype": "Major", + "year": "2023-2024", + "requirements": { + "core": "@import ./core.json", + "major": [ + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Preparatory Courses", + "id": "Marketing(BS)-0" + }, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ACCT 2301", + "metadata": { + "id": "Marketing(BS)-1" + } + }, + { + "matcher": "CourseRequirement", + "course": "ACCT 2302", + "metadata": { + "id": "Marketing(BS)-2" + } + }, + { + "matcher": "CourseRequirement", + "course": "BLAW 2301", + "metadata": { + "id": "Marketing(BS)-3" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MATH 1325", + "metadata": { + "id": "Marketing(BS)-5" + } + }, + { + "matcher": "CourseRequirement", + "course": "MATH 2413", + "metadata": { + "id": "Marketing(BS)-6" + } + }, + { + "matcher": "CourseRequirement", + "course": "MATH 2417", + "metadata": { + "id": "Marketing(BS)-7" + } + } + ], + "metadata": { + "id": "Marketing(BS)-4" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OPRE 3360", + "metadata": { + "id": "Marketing(BS)-9" + } + }, + { + "matcher": "CourseRequirement", + "course": "STAT 3360", + "metadata": { + "id": "Marketing(BS)-10" + } + } + ], + "metadata": { + "id": "Marketing(BS)-8" + } + }, + { + "matcher": "SelectRequirement", + "required_count": 2, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BA 1310", + "metadata": { + "id": "Marketing(BS)-12" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 1320", + "metadata": { + "id": "Marketing(BS)-13" + } + }, + { + "matcher": "CourseRequirement", + "course": "ECON 2301", + "metadata": { + "id": "Marketing(BS)-14" + } + }, + { + "matcher": "CourseRequirement", + "course": "ECON 2302", + "metadata": { + "id": "Marketing(BS)-15" + } + } + ], + "metadata": { + "id": "Marketing(BS)-11" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Core Courses", + "id": "Marketing(BS)-16" + }, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BCOM 1300", + "metadata": { + "id": "Marketing(BS)-18" + } + }, + { + "matcher": "CourseRequirement", + "course": "BCOM 3300", + "metadata": { + "id": "Marketing(BS)-19" + } + } + ], + "metadata": { + "id": "Marketing(BS)-17" + } + }, + { + "matcher": "CourseRequirement", + "course": "BCOM 4300", + "metadata": { + "id": "Marketing(BS)-20" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3320", + "metadata": { + "id": "Marketing(BS)-21" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 3310", + "metadata": { + "id": "Marketing(BS)-22" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 3300", + "metadata": { + "id": "Marketing(BS)-23" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 3300", + "metadata": { + "id": "Marketing(BS)-24" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OBHR 3330", + "metadata": { + "id": "Marketing(BS)-26" + } + }, + { + "matcher": "CourseRequirement", + "course": "OBHR 3310", + "metadata": { + "id": "Marketing(BS)-27" + } + } + ], + "metadata": { + "id": "Marketing(BS)-25" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 3310", + "metadata": { + "id": "Marketing(BS)-28" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Related Courses", + "id": "Marketing(BS)-29" + }, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MKT 3330", + "metadata": { + "id": "Marketing(BS)-30" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 3340", + "metadata": { + "id": "Marketing(BS)-31" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4330", + "metadata": { + "id": "Marketing(BS)-32" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4337", + "metadata": { + "id": "Marketing(BS)-33" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MKT 4395", + "metadata": { + "id": "Marketing(BS)-35" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 3320", + "metadata": { + "id": "Marketing(BS)-36" + } + }, + { + "matcher": "CourseRequirement", + "course": "BPS 4395", + "metadata": { + "id": "Marketing(BS)-37" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4395", + "metadata": { + "id": "Marketing(BS)-38" + } + } + ], + "metadata": { + "id": "Marketing(BS)-34" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Guided Electives", + "id": "Marketing(BS)-39" + }, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MKT 4V90", + "metadata": { + "id": "Marketing(BS)-41" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4090", + "metadata": { + "id": "Marketing(BS)-42" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4090", + "metadata": { + "id": "Marketing(BS)-43" + } + } + ], + "metadata": { + "id": "Marketing(BS)-40" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BPS 4396", + "metadata": { + "id": "Marketing(BS)-45" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4340", + "metadata": { + "id": "Marketing(BS)-46" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4360", + "metadata": { + "id": "Marketing(BS)-47" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4095", + "metadata": { + "id": "Marketing(BS)-48" + } + } + ], + "metadata": { + "id": "Marketing(BS)-44" + } + }, + { + "matcher": "HoursRequirement", + "required_hours": 12, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MKT 3320", + "metadata": { + "id": "Marketing(BS)-50" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 3331", + "metadata": { + "id": "Marketing(BS)-51" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4331", + "metadata": { + "id": "Marketing(BS)-52" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4332", + "metadata": { + "id": "Marketing(BS)-53" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4333", + "metadata": { + "id": "Marketing(BS)-54" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4334", + "metadata": { + "id": "Marketing(BS)-55" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4335", + "metadata": { + "id": "Marketing(BS)-56" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4336", + "metadata": { + "id": "Marketing(BS)-57" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4338", + "metadata": { + "id": "Marketing(BS)-58" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4339", + "metadata": { + "id": "Marketing(BS)-59" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4340", + "metadata": { + "id": "Marketing(BS)-60" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4341", + "metadata": { + "id": "Marketing(BS)-61" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4350", + "metadata": { + "id": "Marketing(BS)-62" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4360", + "metadata": { + "id": "Marketing(BS)-63" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4370", + "metadata": { + "id": "Marketing(BS)-64" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4390", + "metadata": { + "id": "Marketing(BS)-65" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4V83", + "metadata": { + "id": "Marketing(BS)-66" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4V90", + "metadata": { + "id": "Marketing(BS)-67" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4V93", + "metadata": { + "id": "Marketing(BS)-68" + } + } + ], + "metadata": { + "id": "Marketing(BS)-49" + } + } + ] + }, + { + "matcher": "FreeElectiveRequirement", + "required_hours": 15, + "excluded_courses": [], + "metadata": { + "id": "Marketing(BS)-69" + } + } + ] + }, + "display_name": "Marketing(BS)", + "id": "e7ba4ce4-dcbc-44f1-9382-e106d38fc311" +} diff --git a/validator/degree_data/2023/Supply Chain Management(BS).json b/validator/degree_data/2023/Supply Chain Management(BS).json new file mode 100644 index 000000000..48b120673 --- /dev/null +++ b/validator/degree_data/2023/Supply Chain Management(BS).json @@ -0,0 +1,619 @@ +{ + "catalog_uri": "https://catalog.utdallas.edu/2022/undergraduate/programs/jsom/supply-chain-management", + "minimum_credit_hours": 120, + "school": "Naveen Jindal School of Management", + "subtype": "Major", + "year": "2023-2024", + "requirements": { + "core": "@import ./core.json", + "major": [ + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Preparatory Courses", + "id": "Supply Chain Management(BS)-0" + }, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "ACCT 2301", + "metadata": { + "id": "Supply Chain Management(BS)-1" + } + }, + { + "matcher": "CourseRequirement", + "course": "ACCT 2302", + "metadata": { + "id": "Supply Chain Management(BS)-2" + } + }, + { + "matcher": "CourseRequirement", + "course": "BLAW 2301", + "metadata": { + "id": "Supply Chain Management(BS)-3" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "MATH 1325", + "metadata": { + "id": "Supply Chain Management(BS)-5" + } + }, + { + "matcher": "CourseRequirement", + "course": "MATH 2413", + "metadata": { + "id": "Supply Chain Management(BS)-6" + } + }, + { + "matcher": "CourseRequirement", + "course": "MATH 2417", + "metadata": { + "id": "Supply Chain Management(BS)-7" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-4" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OPRE 3340", + "metadata": { + "id": "Supply Chain Management(BS)-9" + } + }, + { + "matcher": "CourseRequirement", + "course": "MATH 1326", + "metadata": { + "id": "Supply Chain Management(BS)-10" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-8" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OPRE 3333", + "metadata": { + "id": "Supply Chain Management(BS)-12" + } + }, + { + "matcher": "CourseRequirement", + "course": "STAT 2333", + "metadata": { + "id": "Supply Chain Management(BS)-13" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-11" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OPRE 3360", + "metadata": { + "id": "Supply Chain Management(BS)-15" + } + }, + { + "matcher": "CourseRequirement", + "course": "STAT 3360", + "metadata": { + "id": "Supply Chain Management(BS)-16" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-14" + } + }, + { + "matcher": "SelectRequirement", + "required_count": 2, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BA 1310", + "metadata": { + "id": "Supply Chain Management(BS)-18" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 1320", + "metadata": { + "id": "Supply Chain Management(BS)-19" + } + }, + { + "matcher": "CourseRequirement", + "course": "ECON 2301", + "metadata": { + "id": "Supply Chain Management(BS)-20" + } + }, + { + "matcher": "CourseRequirement", + "course": "ECON 2302", + "metadata": { + "id": "Supply Chain Management(BS)-21" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-17" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Core Courses", + "id": "Supply Chain Management(BS)-22" + }, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BCOM 1300", + "metadata": { + "id": "Supply Chain Management(BS)-24" + } + }, + { + "matcher": "CourseRequirement", + "course": "BCOM 3300", + "metadata": { + "id": "Supply Chain Management(BS)-25" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-23" + } + }, + { + "matcher": "CourseRequirement", + "course": "BCOM 4300", + "metadata": { + "id": "Supply Chain Management(BS)-26" + } + }, + { + "matcher": "CourseRequirement", + "course": "FIN 3320", + "metadata": { + "id": "Supply Chain Management(BS)-27" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 3310", + "metadata": { + "id": "Supply Chain Management(BS)-28" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 3300", + "metadata": { + "id": "Supply Chain Management(BS)-29" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 3300", + "metadata": { + "id": "Supply Chain Management(BS)-30" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OBHR 3310", + "metadata": { + "id": "Supply Chain Management(BS)-32" + } + }, + { + "matcher": "CourseRequirement", + "course": "OBHR 3330", + "metadata": { + "id": "Supply Chain Management(BS)-33" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-31" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 3310", + "metadata": { + "id": "Supply Chain Management(BS)-34" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Related Courses", + "id": "Supply Chain Management(BS)-35" + }, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OPRE 4395", + "metadata": { + "id": "Supply Chain Management(BS)-37" + } + }, + { + "matcher": "CourseRequirement", + "course": "BPS 4395", + "metadata": { + "id": "Supply Chain Management(BS)-38" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4395", + "metadata": { + "id": "Supply Chain Management(BS)-39" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-36" + } + }, + { + "matcher": "SelectRequirement", + "required_count": 6, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OPRE 3320", + "metadata": { + "id": "Supply Chain Management(BS)-41" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 3330", + "metadata": { + "id": "Supply Chain Management(BS)-42" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4310", + "metadata": { + "id": "Supply Chain Management(BS)-43" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4320", + "metadata": { + "id": "Supply Chain Management(BS)-44" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4330", + "metadata": { + "id": "Supply Chain Management(BS)-45" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4340", + "metadata": { + "id": "Supply Chain Management(BS)-46" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4362", + "metadata": { + "id": "Supply Chain Management(BS)-47" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-40" + } + } + ] + }, + { + "matcher": "AndRequirement", + "metadata": { + "name": "Major Guided Electives", + "id": "Supply Chain Management(BS)-48" + }, + "requirements": [ + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OPRE 4V90", + "metadata": { + "id": "Supply Chain Management(BS)-50" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4090", + "metadata": { + "id": "Supply Chain Management(BS)-51" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4090", + "metadata": { + "id": "Supply Chain Management(BS)-52" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-49" + } + }, + { + "matcher": "OrRequirement", + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "BPS 4396", + "metadata": { + "id": "Supply Chain Management(BS)-54" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4340", + "metadata": { + "id": "Supply Chain Management(BS)-55" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4360", + "metadata": { + "id": "Supply Chain Management(BS)-56" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4095", + "metadata": { + "id": "Supply Chain Management(BS)-57" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-53" + } + }, + { + "matcher": "HoursRequirement", + "required_hours": 12, + "requirements": [ + { + "matcher": "CourseRequirement", + "course": "OPRE 4V90", + "metadata": { + "id": "Supply Chain Management(BS)-59" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4090", + "metadata": { + "id": "Supply Chain Management(BS)-60" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4090", + "metadata": { + "id": "Supply Chain Management(BS)-61" + } + }, + { + "matcher": "CourseRequirement", + "course": "IMS 4335", + "metadata": { + "id": "Supply Chain Management(BS)-62" + } + }, + { + "matcher": "CourseRequirement", + "course": "ENTP 4340", + "metadata": { + "id": "Supply Chain Management(BS)-63" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4360", + "metadata": { + "id": "Supply Chain Management(BS)-64" + } + }, + { + "matcher": "CourseRequirement", + "course": "BA 4095", + "metadata": { + "id": "Supply Chain Management(BS)-65" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4350", + "metadata": { + "id": "Supply Chain Management(BS)-66" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4357", + "metadata": { + "id": "Supply Chain Management(BS)-67" + } + }, + { + "matcher": "CourseRequirement", + "course": "ITSS 4340", + "metadata": { + "id": "Supply Chain Management(BS)-68" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4330", + "metadata": { + "id": "Supply Chain Management(BS)-69" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4355", + "metadata": { + "id": "Supply Chain Management(BS)-70" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 3320", + "metadata": { + "id": "Supply Chain Management(BS)-71" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 3330", + "metadata": { + "id": "Supply Chain Management(BS)-72" + } + }, + { + "matcher": "CourseRequirement", + "course": "OBHR 4352", + "metadata": { + "id": "Supply Chain Management(BS)-73" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4337", + "metadata": { + "id": "Supply Chain Management(BS)-74" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4350", + "metadata": { + "id": "Supply Chain Management(BS)-75" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4353", + "metadata": { + "id": "Supply Chain Management(BS)-76" + } + }, + { + "matcher": "CourseRequirement", + "course": "MKT 4341", + "metadata": { + "id": "Supply Chain Management(BS)-77" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 3370", + "metadata": { + "id": "Supply Chain Management(BS)-78" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4345", + "metadata": { + "id": "Supply Chain Management(BS)-79" + } + }, + { + "matcher": "CourseRequirement", + "course": "OPRE 4362", + "metadata": { + "id": "Supply Chain Management(BS)-80" + } + }, + { + "matcher": "CourseRequirement", + "course": "BPS 4305", + "metadata": { + "id": "Supply Chain Management(BS)-81" + } + } + ], + "metadata": { + "id": "Supply Chain Management(BS)-58" + } + } + ] + }, + { + "matcher": "FreeElectiveRequirement", + "required_hours": 6, + "excluded_courses": [], + "metadata": { + "id": "Supply Chain Management(BS)-82" + } + } + ] + }, + "display_name": "Supply Chain Management(BS)", + "id": "a1525a33-2c07-4300-be04-5ef54fa79c98" +} diff --git a/validator/requirements.txt b/validator/requirements.txt index fe24f0ca6..398743593 100644 --- a/validator/requirements.txt +++ b/validator/requirements.txt @@ -17,7 +17,7 @@ gunicorn==20.1.0 idna==3.4 iniconfig==2.0.0 itsdangerous==2.1.2 -Jinja2==3.1.2 +Jinja2==3.1.3 jira==3.5.2 jsonschema==4.17.3 limits==2.8.0