@ampath/esm-reports-app 1.0.0-next.7 → 1.0.0-next.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/dist/197.js +1 -1
  2. package/dist/282.js +1 -1
  3. package/dist/282.js.map +1 -1
  4. package/dist/295.css +1 -0
  5. package/dist/295.css.map +1 -0
  6. package/dist/295.js +1 -0
  7. package/dist/295.js.map +1 -0
  8. package/dist/299.js +2 -0
  9. package/dist/299.js.LICENSE.txt +3 -0
  10. package/dist/299.js.map +1 -0
  11. package/dist/300.js +1 -1
  12. package/dist/311.js +1 -1
  13. package/dist/311.js.map +1 -1
  14. package/dist/335.js +1 -1
  15. package/dist/353.js +1 -1
  16. package/dist/353.js.map +1 -1
  17. package/dist/354.js +2 -0
  18. package/dist/354.js.LICENSE.txt +20 -0
  19. package/dist/354.js.map +1 -0
  20. package/dist/410.js +1 -0
  21. package/dist/410.js.map +1 -0
  22. package/dist/457.js +2 -0
  23. package/dist/457.js.LICENSE.txt +261 -0
  24. package/dist/457.js.map +1 -0
  25. package/dist/478.js +1 -1
  26. package/dist/478.js.map +1 -1
  27. package/dist/480.js +1 -0
  28. package/dist/540.js +1 -1
  29. package/dist/540.js.map +1 -1
  30. package/dist/55.js +1 -1
  31. package/dist/580.js +1 -0
  32. package/dist/580.js.map +1 -0
  33. package/dist/600.js +2 -0
  34. package/dist/600.js.LICENSE.txt +35 -0
  35. package/dist/600.js.map +1 -0
  36. package/dist/652.js +1 -1
  37. package/dist/781.js +1 -0
  38. package/dist/781.js.map +1 -0
  39. package/dist/919.css +1 -0
  40. package/dist/919.css.map +1 -0
  41. package/dist/919.js +1 -0
  42. package/dist/919.js.map +1 -0
  43. package/dist/961.js +1 -1
  44. package/dist/961.js.map +1 -1
  45. package/dist/99.js +1 -1
  46. package/dist/99.js.map +1 -0
  47. package/dist/ampath-esm-reports-app.js +1 -1
  48. package/dist/ampath-esm-reports-app.js.map +1 -1
  49. package/dist/routes.json +1 -1
  50. package/package.json +4 -2
  51. package/src/common/daily-summary-table.tsx +55 -0
  52. package/src/common/linelist-table/index.ts +3 -0
  53. package/src/common/linelist-table/linelist-columns.ts +48 -0
  54. package/src/common/linelist-table/linelist-table.component.tsx +442 -0
  55. package/src/common/linelist-table/linelist-table.scss +306 -0
  56. package/src/common/linelist-table/linelist-table.test.tsx +120 -0
  57. package/src/common/linelist-table/use-all-rows.ts +93 -0
  58. package/src/common/linelist-table/use-column-layout.ts +123 -0
  59. package/src/common/report-error/index.ts +1 -0
  60. package/src/common/report-error/show-report-error.ts +25 -0
  61. package/src/common/report-filters/date-range.ts +137 -0
  62. package/src/common/report-filters/index.ts +4 -0
  63. package/src/common/report-filters/report-filters.component.tsx +317 -99
  64. package/src/common/report-filters/report-filters.scss +255 -32
  65. package/src/common/report-filters/types.ts +79 -0
  66. package/src/common/report-filters/use-restore-period.ts +43 -0
  67. package/src/common/report-header/index.ts +1 -0
  68. package/src/common/report-header/use-location-details.ts +58 -0
  69. package/src/common/report-page/download-sheet-pdf.ts +59 -0
  70. package/src/common/report-page/index.ts +3 -0
  71. package/src/common/report-page/report-page.component.tsx +32 -0
  72. package/src/common/report-page/report-page.scss +45 -0
  73. package/src/common/report-page/use-page-scale.ts +60 -0
  74. package/src/common/report-placeholder/has-report-data.ts +15 -0
  75. package/src/common/report-placeholder/index.ts +3 -0
  76. package/src/common/report-placeholder/report-placeholder.component.tsx +81 -0
  77. package/src/common/report-placeholder/report-placeholder.scss +48 -0
  78. package/src/common/report-placeholder/use-generated-location.ts +62 -0
  79. package/src/common/report-register/index.ts +6 -0
  80. package/src/common/report-register/register-columns.ts +46 -0
  81. package/src/common/report-register/register-layout.component.tsx +265 -0
  82. package/src/common/report-register/register-layout.scss +150 -0
  83. package/src/common/report-register/register-table.scss +71 -0
  84. package/src/common/report-register/report-parents.ts +27 -0
  85. package/src/common/report-register/rows-to-csv.ts +89 -0
  86. package/src/common/report-register/use-location-name.ts +54 -0
  87. package/src/common/report-register/use-patient-list.ts +92 -0
  88. package/src/common/report-skeleton/index.ts +1 -0
  89. package/src/common/report-skeleton/report-skeleton.component.tsx +46 -0
  90. package/src/common/report-skeleton/report-skeleton.scss +29 -0
  91. package/src/config-schema.ts +9 -1
  92. package/src/dashboard/report-catalog.ts +173 -0
  93. package/src/dashboard/reports-dasboard.tsx +189 -18
  94. package/src/dashboard/reports-dashboard.module.scss +357 -14
  95. package/src/index.ts +13 -1
  96. package/src/registers/moh-240/moh-240-register.scss +41 -0
  97. package/src/registers/moh-240/moh-240.component.test.tsx +166 -0
  98. package/src/registers/moh-240/moh-240.component.tsx +164 -0
  99. package/src/registers/moh-362/moh-362-lab-register.component.tsx +392 -0
  100. package/src/registers/moh-362/moh-362-linkage-register.component.tsx +120 -0
  101. package/src/registers/moh-362/moh-362-register.scss +222 -0
  102. package/src/registers/moh-362/moh-362.component.tsx +99 -0
  103. package/src/registers/moh-362/moh-362.scss +11 -0
  104. package/src/registers/moh-362/moh-362.types.ts +97 -0
  105. package/src/registers/register-catalog.ts +96 -0
  106. package/src/registers/tb-lab-register/tb-lab-register-table.component.tsx +116 -0
  107. package/src/registers/tb-lab-register/tb-lab-register-table.scss +123 -0
  108. package/src/registers/tb-lab-register/tb-lab-register.columns.ts +164 -0
  109. package/src/registers/tb-lab-register/tb-lab-register.component.test.tsx +232 -0
  110. package/src/registers/tb-lab-register/tb-lab-register.component.tsx +153 -0
  111. package/src/reports/datatable-wrapper/datatable-wrapper.component.tsx +63 -48
  112. package/src/reports/moh-240/moh-240-header.component.tsx +62 -0
  113. package/src/reports/moh-240/moh-240.columns.ts +113 -0
  114. package/src/reports/moh-240/moh-240.component.tsx +72 -9
  115. package/src/reports/moh-240/moh-240.scss +40 -0
  116. package/src/reports/moh-240/sub-reports/moh-240-register.component.tsx +31 -37
  117. package/src/reports/moh-240/sub-reports/page-summary.component.tsx +143 -106
  118. package/src/reports/moh-505/moh-505-header.component.tsx +67 -0
  119. package/src/reports/moh-505/moh-505.component.tsx +441 -0
  120. package/src/reports/moh-505/moh-505.scss +117 -0
  121. package/src/reports/moh-705B/moh-204b-register.component.tsx +244 -0
  122. package/src/reports/moh-705B/moh-204b.columns.ts +39 -0
  123. package/src/reports/moh-705B/moh-705b.component.tsx +659 -0
  124. package/src/reports/moh-705B/moh-705b.scss +172 -0
  125. package/src/reports/moh-705a/moh-705a.component.tsx +661 -0
  126. package/src/reports/moh-705a/moh-705a.scss +172 -0
  127. package/src/reports/moh-705a/registers/moh-204a-register.component.tsx +329 -0
  128. package/src/reports/moh-705a/registers/moh-204a.columns.ts +57 -0
  129. package/src/reports/moh-705a/type.ts +6 -0
  130. package/src/reports/moh-706/moh-706-header.component.tsx +66 -0
  131. package/src/reports/moh-706/moh-706.component.tsx +150 -24
  132. package/src/reports/moh-706/moh-706.scss +119 -11
  133. package/src/reports/moh-706/sub-reports/bacteriology/bacteriology.component.tsx +54 -62
  134. package/src/reports/moh-706/sub-reports/blood-chemistry/blood-chemistry.component.tsx +228 -317
  135. package/src/reports/moh-706/sub-reports/drug-susceptibility-testing/drug-susceptibility-testing.component.tsx +31 -46
  136. package/src/reports/moh-706/sub-reports/haematology/haematology.component.tsx +47 -55
  137. package/src/reports/moh-706/sub-reports/histology-and-cytology/histology-and-cytology.component.tsx +43 -58
  138. package/src/reports/moh-706/sub-reports/parasitology/parasitology.component.tsx +31 -39
  139. package/src/reports/moh-706/sub-reports/serology/serology.component.tsx +26 -34
  140. package/src/reports/moh-706/sub-reports/specimen-referral-to-higher-levels/specimen-referral-to-higher-levels.component.tsx +9 -24
  141. package/src/reports/moh-706/sub-reports/urine-analysis/urine-analysis.component.tsx +43 -51
  142. package/src/reports/moh-710/moh-710.component.tsx +799 -632
  143. package/src/reports/moh-710/moh-710.scss +142 -21
  144. package/src/reports/moh-710/registers/moh-510/moh-510.columns.ts +40 -0
  145. package/src/reports/moh-710/registers/moh-510/moh-510.component.tsx +144 -0
  146. package/src/reports/moh-710/registers/moh-510/moh-510.scss +130 -0
  147. package/src/reports/moh-710/registers/moh-511-710-register.component.tsx +268 -0
  148. package/src/reports/moh-710/registers/moh-511-710.columns.ts +52 -0
  149. package/src/reports/moh-710/registers/type.ts +31 -0
  150. package/src/reports/moh-711/moh-711.component.tsx +138 -1269
  151. package/src/reports/moh-711/moh711.scss +135 -20
  152. package/src/reports/moh-711/registers/moh-333-register.component.tsx +637 -0
  153. package/src/reports/moh-711/registers/moh-333.columns.ts +119 -0
  154. package/src/reports/moh-711/registers/moh-405-register.component.tsx +520 -0
  155. package/src/reports/moh-711/registers/moh-405.columns.ts +120 -0
  156. package/src/reports/moh-711/registers/moh-406-register.component.tsx +530 -0
  157. package/src/reports/moh-711/registers/moh-406.columns.ts +133 -0
  158. package/src/reports/moh-711/registers/moh-510-register.component.tsx +55 -0
  159. package/src/reports/moh-711/registers/moh-511-register.component.tsx +270 -0
  160. package/src/reports/moh-711/registers/moh-511.columns.ts +59 -0
  161. package/src/reports/moh-711/registers/type.ts +192 -0
  162. package/src/reports/moh-711/sections/anc.component.tsx +159 -0
  163. package/src/reports/moh-711/sections/cervical-cancer.component.tsx +148 -0
  164. package/src/reports/moh-711/sections/chanis.component.tsx +366 -0
  165. package/src/reports/moh-711/sections/family-planning.component.tsx +221 -0
  166. package/src/reports/moh-711/sections/gbv.component.tsx +115 -0
  167. package/src/reports/moh-711/sections/maternity.component.tsx +321 -0
  168. package/src/reports/moh-711/sections/medical-social-work.component.tsx +73 -0
  169. package/src/reports/moh-711/sections/other.component.tsx +47 -0
  170. package/src/reports/moh-711/sections/physiotherapy.component.tsx +61 -0
  171. package/src/reports/moh-711/sections/pnc.component.tsx +127 -0
  172. package/src/reports/moh-711/sections/post-abortion.component.tsx +42 -0
  173. package/src/reports/moh-711/sections/rehabilitation.component.tsx +57 -0
  174. package/src/reports/moh-711/sections/report-compiled-by.component.tsx +50 -0
  175. package/src/reports/moh-711/sections/tb-screening.component.tsx +57 -0
  176. package/src/reports/moh-717/moh-717.component.tsx +149 -985
  177. package/src/reports/moh-717/moh717.scss +217 -21
  178. package/src/reports/moh-717/registers/nutrition-register.component.tsx +48 -0
  179. package/src/reports/moh-717/sections/finance.component.tsx +42 -0
  180. package/src/reports/moh-717/sections/inpatient.component.tsx +374 -0
  181. package/src/reports/moh-717/sections/maternity.component.tsx +126 -0
  182. package/src/reports/moh-717/sections/medical-records.component.tsx +35 -0
  183. package/src/reports/moh-717/sections/mortuary.component.tsx +43 -0
  184. package/src/reports/moh-717/sections/operations.component.tsx +53 -0
  185. package/src/reports/moh-717/sections/orthopaedic-trauma.component.tsx +98 -0
  186. package/src/reports/moh-717/sections/outpatient.component.tsx +597 -0
  187. package/src/reports/moh-717/sections/pharmacy.component.tsx +43 -0
  188. package/src/reports/moh-717/sections/preparedby.component.tsx +52 -0
  189. package/src/reports/moh-717/sections/special-services.component.tsx +114 -0
  190. package/src/reports/moh-731/linelist/moh-731-indicators.ts +1122 -0
  191. package/src/reports/moh-731/linelist/moh-731-linelist-sections.ts +472 -0
  192. package/src/reports/moh-731/linelist/moh-731-linelist.component.tsx +102 -0
  193. package/src/reports/moh-731/linelist/use-open-moh-731-linelist.ts +50 -0
  194. package/src/reports/moh-731/moh-731.component.tsx +266 -0
  195. package/src/reports/moh-731/moh-731.scss +499 -0
  196. package/src/reports/moh-731/registers/moh-366.columns.ts +38 -0
  197. package/src/reports/moh-731/registers/moh-366.component.tsx +471 -0
  198. package/src/reports/moh-731/registers/prep-register.component.tsx +284 -0
  199. package/src/reports/moh-731/registers/prep.columns.ts +34 -0
  200. package/src/reports/moh-731/sections/hiv-and-tb-treatment.component.tsx +1206 -0
  201. package/src/reports/moh-731/sections/hiv-testing-and-pre-exposure.component.tsx +727 -0
  202. package/src/reports/moh-731/sections/pmtct.component.tsx +572 -0
  203. package/src/reports/moh-731/summary/moh-731-summary.component.tsx +313 -0
  204. package/src/reports/moh-731/summary/moh-731-summary.config.ts +529 -0
  205. package/src/reports/moh-731/summary/moh-731-summary.scss +242 -0
  206. package/src/reports/moh-740/moh-740.component.scss +202 -0
  207. package/src/reports/moh-740/moh-740.component.tsx +1332 -0
  208. package/src/reports/moh-740/moh-740.resource.ts +54 -0
  209. package/src/reports/moh-740/registers/moh-222-daily-register/moh-222-daily-register.tsx +149 -0
  210. package/src/reports/moh-740/registers/moh-270-permanent-register/moh-270-permanent-register.tsx +123 -0
  211. package/src/reports/moh-740/registers/moh-740-patient-list.scss +0 -0
  212. package/src/reports/moh-740/registers/moh-740-patient-list.tsx +60 -0
  213. package/src/reports/moh-740/registers/moh-740.columns.ts +54 -0
  214. package/src/reports/moh-740/shared/data-cell/data-cell.scss +6 -0
  215. package/src/reports/moh-740/shared/data-cell/data-cell.tsx +23 -0
  216. package/src/reports/moh-740/shared/utils/indicator-register-map.ts +159 -0
  217. package/src/reports/moh-740/types/index.ts +223 -0
  218. package/src/reports/moh-745/moh-745.component.tsx +1021 -0
  219. package/src/reports/moh-745/moh-745.scss +132 -0
  220. package/src/reports/moh-745/registers/moh-412-register.component.tsx +249 -0
  221. package/src/reports/moh-745/registers/moh-412.columns.ts +52 -0
  222. package/src/reports/moh-745/registers/type.ts +181 -0
  223. package/src/reports/table-wrapper/table-row-mapper.component.tsx +57 -0
  224. package/src/reports/table-wrapper/table-wrapper.component.tsx +23 -14
  225. package/src/reports/table-wrapper/table-wrapper.scss +1 -16
  226. package/src/resources/moh-362.resource.ts +27 -0
  227. package/src/resources/moh-505.resource.ts +69 -0
  228. package/src/resources/moh-705.resource.ts +106 -0
  229. package/src/resources/moh-706.resource.ts +80 -0
  230. package/src/resources/moh-710.resource.ts +32 -9
  231. package/src/resources/moh-711.resource.ts +137 -9
  232. package/src/resources/moh-717.resource.ts +26 -9
  233. package/src/resources/moh-731.resource.ts +90 -0
  234. package/src/resources/moh-745.resource.ts +76 -0
  235. package/src/resources/patient-list-page.ts +65 -0
  236. package/src/root.component.tsx +59 -8
  237. package/src/root.scss +36 -0
  238. package/src/routes.json +3 -1
  239. package/src/utils/format-indicator.ts +39 -0
  240. package/src/utils/get-base-url.ts +39 -7
  241. package/src/utils/utils.ts +36 -0
  242. package/tsconfig.json +1 -1
  243. package/webpack.config.js +22 -1
  244. package/dist/138.js +0 -2
  245. package/dist/138.js.LICENSE.txt +0 -20
  246. package/dist/138.js.map +0 -1
  247. package/dist/184.js +0 -2
  248. package/dist/184.js.LICENSE.txt +0 -14
  249. package/dist/184.js.map +0 -1
  250. package/dist/205.js +0 -1
  251. package/dist/205.js.map +0 -1
  252. package/dist/711.js +0 -1
  253. package/dist/711.js.map +0 -1
  254. package/dist/812.js +0 -1
  255. package/dist/812.js.map +0 -1
  256. package/dist/ampath-esm-reports-app.js.buildmanifest.json +0 -539
  257. package/dist/main.js +0 -1
  258. package/dist/main.js.map +0 -1
@@ -0,0 +1,529 @@
1
+ /**
2
+ * The layout of the MOH 731 Summary tab: each section as a set of tables, each
3
+ * cell a figure from the sheet, by its MOH 731 code.
4
+ *
5
+ * A table's Total column and Total row are sums of figures that never overlap
6
+ * -- male and female, or population by sex, or age band by sex -- so each total
7
+ * equals the clients behind it, and its linelist is its figures' linelists
8
+ * together. Rows that are part of another row (`ofWhich`: KVP, pregnant and
9
+ * breastfeeding women) or a different count altogether (`excluded`:
10
+ * inconclusive results, the testing setting) are shown but never added in.
11
+ */
12
+
13
+ /** A figure's MOH 731 code, or null where the form has no box */
14
+ export type SummaryCell = string | null;
15
+
16
+ export interface SummaryRow {
17
+ label: string;
18
+ /** One code per column of the table (Total excluded) */
19
+ cells?: SummaryCell[];
20
+ /** A single figure shown in the Total column only, e.g. Tests_Facility */
21
+ only?: string;
22
+ /** Shown indented and never added into the table's total */
23
+ ofWhich?: boolean;
24
+ /** A different count, shown for reference and never added into the total */
25
+ excluded?: boolean;
26
+ /** Small caption shown before the label, e.g. `By setting` */
27
+ group?: string;
28
+ }
29
+
30
+ export interface SummaryTable {
31
+ /** Optional heading within the sub-section, e.g. `Other results` */
32
+ title?: string;
33
+ /** Column headings, Total excluded */
34
+ columns: string[];
35
+ rows: SummaryRow[];
36
+ /** Label of the Total row, e.g. `Total tests`; omitted for no Total row */
37
+ totalLabel?: string;
38
+ /** false where a row's figures overlap (e.g. SAM and SAM on therapeutic
39
+ foods), so the row has no Total column */
40
+ rowTotals?: false;
41
+ }
42
+
43
+ export interface SummarySubsection {
44
+ /** As printed on the form, e.g. `1.1 HIV Tests`; also the linelist caption */
45
+ block: string;
46
+ /** Short caveat shown under the heading */
47
+ note?: string;
48
+ tables: SummaryTable[];
49
+ }
50
+
51
+ export interface SummarySection {
52
+ id: string;
53
+ /** Full title, e.g. `1. HIV Testing Services & Pre-Exposure Prophylaxis` */
54
+ title: string;
55
+ /** Tab label, e.g. `1. HTS & PrEP` */
56
+ tab: string;
57
+ /** Totals shown in the strip above the section, by the sub-section they total */
58
+ headlines: Array<{ label: string; block: string }>;
59
+ subsections: SummarySubsection[];
60
+ }
61
+
62
+ const SEX = ['Male', 'Female'];
63
+
64
+ /* Section 4: nothing reports these figures yet, on the form or here */
65
+ const NOT_REPORTED = 'Not yet reported by the system; these boxes show – on the form too.';
66
+
67
+ /* 3.7: the earlier figures were misleading, so they are withheld, here and on the form */
68
+ const TB_CLINIC_NOT_REPORTED =
69
+ "Not reported until this section's queries are corrected: the earlier figures were misleading, so these boxes show – on the form too.";
70
+
71
+ const prepPopulations = (codes: Record<string, [SummaryCell, SummaryCell]>): SummaryRow[] => [
72
+ { label: 'General population', cells: codes.general },
73
+ { label: 'MSM / MSW', cells: codes.msm },
74
+ { label: 'FSW', cells: codes.fsw },
75
+ { label: 'PWID / PWUD', cells: codes.pwid },
76
+ { label: 'Discordant couple', cells: codes.discordant },
77
+ { label: 'Vulnerable population', cells: codes.vulnerable },
78
+ { label: 'AYP (10–24 yrs)', cells: codes.ayp },
79
+ { label: 'Pregnant & breastfeeding women', cells: codes.pbfw, ofWhich: true },
80
+ ];
81
+
82
+ export const MOH_731_SUMMARY: SummarySection[] = [
83
+ {
84
+ id: 'hts-prep',
85
+ title: '1. HIV Testing Services & Pre-Exposure Prophylaxis',
86
+ tab: '1. HTS & PrEP',
87
+ headlines: [
88
+ { label: 'Tested', block: '1.1 HIV Tests' },
89
+ { label: 'New positives', block: '1.2 HIV Positive Results' },
90
+ { label: 'Initiated on PrEP', block: '1.3 No. Initiated on PrEP (NEW)' },
91
+ ],
92
+ subsections: [
93
+ {
94
+ block: '1.1 HIV Tests',
95
+ tables: [
96
+ {
97
+ columns: SEX,
98
+ totalLabel: 'Total tests',
99
+ rows: [
100
+ { label: 'Tests', cells: ['HV01-01', 'HV01-02'] },
101
+ { label: 'Facility', group: 'By setting', only: 'HV01-03', excluded: true },
102
+ { label: 'Community', group: 'By setting', only: 'HV01-04', excluded: true },
103
+ { label: 'Tested KVP', only: 'HV01-05', ofWhich: true },
104
+ ],
105
+ },
106
+ ],
107
+ },
108
+ {
109
+ block: '1.2 HIV Positive Results',
110
+ tables: [
111
+ {
112
+ columns: ['2–9', '10–14', '15–19', '20–24', '25+'],
113
+ totalLabel: 'Total positives',
114
+ rows: [
115
+ { label: 'Male', cells: ['HV01-06', 'HV01-08', 'HV01-10', 'HV01-12', 'HV01-14'] },
116
+ { label: 'Female', cells: ['HV01-07', 'HV01-09', 'HV01-11', 'HV01-13', 'HV01-15'] },
117
+ ],
118
+ },
119
+ {
120
+ title: 'Other results',
121
+ columns: SEX,
122
+ rows: [
123
+ { label: 'Discordant', cells: ['HV01-17', 'HV01-18'], ofWhich: true },
124
+ { label: 'Positive KVP', only: 'HV01-16', ofWhich: true },
125
+ { label: 'Inconclusive', cells: ['HV01-47', 'HV01-48'], excluded: true },
126
+ ],
127
+ },
128
+ ],
129
+ },
130
+ {
131
+ block: '1.3 No. Initiated on PrEP (NEW)',
132
+ tables: [
133
+ {
134
+ columns: SEX,
135
+ totalLabel: 'Total initiated (new)',
136
+ rows: prepPopulations({
137
+ general: ['HV01-19', 'HV01-20'],
138
+ msm: ['HV01-21', null],
139
+ fsw: [null, 'HV01-22'],
140
+ pwid: ['HV01-23', 'HV01-24'],
141
+ discordant: ['HV01-25', 'HV01-26'],
142
+ vulnerable: ['HV01-27', 'HV01-28'],
143
+ ayp: ['HV01-29', 'HV01-30'],
144
+ pbfw: [null, 'HV01-31'],
145
+ }),
146
+ },
147
+ ],
148
+ },
149
+ {
150
+ block: '1.4 No. on PrEP Diagnosed with STI',
151
+ tables: [
152
+ {
153
+ columns: SEX,
154
+ totalLabel: 'Total diagnosed with STI',
155
+ rows: prepPopulations({
156
+ general: ['HV01-32', 'HV01-33'],
157
+ msm: ['HV01-34', null],
158
+ fsw: [null, 'HV01-35'],
159
+ pwid: ['HV01-36', 'HV01-37'],
160
+ discordant: ['HV01-38', 'HV01-39'],
161
+ vulnerable: ['HV01-40', 'HV01-41'],
162
+ ayp: ['HV01-42', 'HV01-43'],
163
+ pbfw: [null, 'HV01-44'],
164
+ }),
165
+ },
166
+ ],
167
+ },
168
+ {
169
+ block: '1.5 No. Seroconverted while on PrEP',
170
+ tables: [
171
+ {
172
+ columns: SEX,
173
+ totalLabel: 'Total seroconverted',
174
+ rows: [{ label: 'HIV positive', cells: ['HV01-45', 'HV01-46'] }],
175
+ },
176
+ ],
177
+ },
178
+ ],
179
+ },
180
+ {
181
+ id: 'emtct',
182
+ title: '2. Elimination of Mother-to-Child Transmission (EMTCT)',
183
+ tab: '2. EMTCT',
184
+ headlines: [
185
+ { label: 'Tested (ANC, L&D, PNC)', block: '2.1 Maternal HIV Testing' },
186
+ { label: 'New positives', block: '2.2 HIV Positive Results' },
187
+ { label: 'Started HAART', block: '2.3 Maternal HAART' },
188
+ ],
189
+ subsections: [
190
+ {
191
+ block: '2.1 Maternal HIV Testing',
192
+ note: 'PNC with no delivery date: PNC tests that fit neither PNC box (no delivery date, or one after the test), for data cleanup. Not on the form, so not in the total.',
193
+ tables: [
194
+ {
195
+ columns: ['Initial test', 'Retest'],
196
+ totalLabel: 'Total tests',
197
+ rows: [
198
+ { label: 'ANC', cells: ['HV02-02', 'HV02-03'] },
199
+ { label: 'L&D', cells: ['HV02-04', 'HV02-05'] },
200
+ { label: 'PNC ≤6 weeks', cells: ['HV02-06', 'HV02-07'] },
201
+ { label: 'PNC >6 weeks', cells: ['HV02-08', 'HV02-09'] },
202
+ /* not on the form: PNC tests no delivery date places either side of six weeks */
203
+ { label: 'PNC with no delivery date', cells: ['PNC-NODD-I', 'PNC-NODD-R'], excluded: true },
204
+ /* known positives are not tested, so they are not tests */
205
+ { label: 'Known positive at 1st ANC', only: 'HV02-01', excluded: true },
206
+ ],
207
+ },
208
+ ],
209
+ },
210
+ {
211
+ block: '2.2 HIV Positive Results',
212
+ tables: [
213
+ {
214
+ columns: [],
215
+ totalLabel: 'Total positives',
216
+ rows: [
217
+ { label: 'ANC', only: 'HV02-10' },
218
+ { label: 'L&D', only: 'HV02-11' },
219
+ { label: 'PNC ≤6 weeks', only: 'HV02-12' },
220
+ { label: 'PNC >6 weeks', only: 'HV02-13' },
221
+ ],
222
+ },
223
+ ],
224
+ },
225
+ {
226
+ block: '2.3 Maternal HAART',
227
+ tables: [
228
+ {
229
+ columns: [],
230
+ totalLabel: 'Total started HAART',
231
+ rows: [
232
+ { label: 'Started at ANC', only: 'HV02-15' },
233
+ { label: 'Started at L&D', only: 'HV02-16' },
234
+ { label: 'Started at PNC ≤6 weeks', only: 'HV02-17' },
235
+ { label: 'Started at PNC >6 weeks', only: 'HV02-18' },
236
+ /* known positives already on HAART: a different group, not started here */
237
+ { label: 'On HAART at 1st ANC (known positive)', only: 'HV02-14', excluded: true },
238
+ ],
239
+ },
240
+ ],
241
+ },
242
+ {
243
+ block: '2.4 HBV Screening at ANC',
244
+ tables: [
245
+ {
246
+ columns: [],
247
+ rows: [
248
+ { label: 'Screened for HBV', only: 'HV02-19' },
249
+ { label: 'Positive', only: 'HV02-20', ofWhich: true },
250
+ ],
251
+ },
252
+ ],
253
+ },
254
+ {
255
+ /* parts of 2.1-2.3 by age; the rows overlap (on HAART is part of known
256
+ positive), so each row has its own total and the table none */
257
+ block: '2.5 Adolescents girls & Young Women (10-24 Yrs)',
258
+ tables: [
259
+ {
260
+ columns: ['10–19', '20–24'],
261
+ rows: [
262
+ { label: 'Known positive at 1st ANC', cells: ['HV02-21', 'HV02-22'] },
263
+ { label: 'On HAART at 1st ANC', cells: ['HV02-25', 'HV02-26'], ofWhich: true },
264
+ { label: 'New HIV positive', cells: ['HV02-23', 'HV02-24'] },
265
+ { label: 'Started HAART', cells: ['HV02-27', 'HV02-28'], ofWhich: true },
266
+ ],
267
+ },
268
+ ],
269
+ },
270
+ {
271
+ block: '2.6 Infant Prophylaxis',
272
+ tables: [
273
+ {
274
+ columns: [],
275
+ totalLabel: 'Total given infant prophylaxis',
276
+ rows: [
277
+ { label: 'ANC', only: 'HV02-29' },
278
+ { label: 'L&D', only: 'HV02-30' },
279
+ { label: 'PNC', only: 'HV02-31' },
280
+ ],
281
+ },
282
+ ],
283
+ },
284
+ {
285
+ block: '2.7 Infant Feeding',
286
+ tables: [
287
+ {
288
+ columns: [],
289
+ totalLabel: 'Total with feeding status',
290
+ rows: [
291
+ { label: 'Exclusive breastfeeding (EBF)', only: 'HV02-32' },
292
+ { label: 'Breastfeeding (BF)', only: 'HV02-33' },
293
+ { label: 'Not breastfeeding (NBF)', only: 'HV02-34' },
294
+ ],
295
+ },
296
+ ],
297
+ },
298
+ ],
299
+ },
300
+ {
301
+ id: 'hiv-tb-treatment',
302
+ title: '3. HIV and TB Treatment',
303
+ tab: '3. HIV & TB Treatment',
304
+ headlines: [
305
+ { label: 'Started ART', block: '3.1 Starting ART' },
306
+ { label: 'Currently on ART', block: '3.2 Curently on ART ([ALL])' },
307
+ { label: 'Screened for TB', block: '3.3 TB Screening' },
308
+ ],
309
+ subsections: [
310
+ {
311
+ block: '3.1 Starting ART',
312
+ tables: [
313
+ {
314
+ columns: SEX,
315
+ totalLabel: 'Total started ART',
316
+ rows: [
317
+ { label: '<1', cells: ['HV03-01', 'HV03-02'] },
318
+ { label: '1–4', cells: ['HV03-03', 'HV03-04'] },
319
+ { label: '5–9', cells: ['HV03-05', 'HV03-06'] },
320
+ { label: '10–14', cells: ['HV03-07', 'HV03-08'] },
321
+ { label: '15–19', cells: ['HV03-09', 'HV03-10'] },
322
+ { label: '20–24', cells: ['HV03-11', 'HV03-12'] },
323
+ { label: '25+', cells: ['HV03-013', 'HV03-014'] },
324
+ ],
325
+ },
326
+ ],
327
+ },
328
+ {
329
+ block: '3.2 Curently on ART ([ALL])',
330
+ tables: [
331
+ {
332
+ columns: SEX,
333
+ totalLabel: 'Total currently on ART',
334
+ rows: [
335
+ { label: '<1', cells: ['HV03-015', 'HV03-016'] },
336
+ { label: '1–4', cells: ['HV03-017', 'HV03-018'] },
337
+ { label: '5–9', cells: ['HV03-019', 'HV03-020'] },
338
+ { label: '10–14', cells: ['HV03-021', 'HV03-022'] },
339
+ { label: '15–19', cells: ['HV03-023', 'HV03-024'] },
340
+ { label: '20–24', cells: ['HV03-025', 'HV03-026'] },
341
+ { label: '25+', cells: ['HV03-027', 'HV03-028'] },
342
+ ],
343
+ },
344
+ ],
345
+ },
346
+ {
347
+ block: '3.3 TB Screening',
348
+ tables: [
349
+ {
350
+ columns: [],
351
+ totalLabel: 'Total screened for TB',
352
+ rows: [
353
+ { label: '<15 years', only: 'HV03-029' },
354
+ { label: '15+ years', only: 'HV03-030' },
355
+ ],
356
+ },
357
+ ],
358
+ },
359
+ {
360
+ block: '3.4 Starting TPT',
361
+ tables: [
362
+ {
363
+ columns: [],
364
+ totalLabel: 'Total started TPT',
365
+ rows: [
366
+ { label: '<15 years', only: 'HV03-031' },
367
+ { label: '15+ years', only: 'HV03-032' },
368
+ ],
369
+ },
370
+ ],
371
+ },
372
+ {
373
+ /* two splits of the same clients, each with its own total */
374
+ block: '3.5 Differentiated Service Delivery',
375
+ note: 'Both tables are the clients on ART and add up to 3.2 Currently on ART. Not categorized: no stability, or no DSD model, recorded.',
376
+ tables: [
377
+ {
378
+ title: 'By stability',
379
+ columns: [],
380
+ totalLabel: 'Total by stability',
381
+ rows: [
382
+ { label: 'Established', only: 'HV03-033' },
383
+ { label: 'Not established', only: 'DSD-NE' },
384
+ { label: 'Not categorized', only: 'DSD-NC' },
385
+ ],
386
+ },
387
+ {
388
+ title: 'By model',
389
+ columns: [],
390
+ totalLabel: 'Total by model',
391
+ rows: [
392
+ { label: 'Community', only: 'DSD-CO' },
393
+ { label: 'Facility', only: 'DSD-FA' },
394
+ { label: 'Not categorized', only: 'DSD-MNC' },
395
+ ],
396
+ },
397
+ ],
398
+ },
399
+ {
400
+ block: '3.6 Nutrition and HIV',
401
+ note: 'Clients on ART by their latest SAM / MAM status in the period, by age at the period end. Pregnant & lactating women are counted in their own row only, not in an age band.',
402
+ tables: [
403
+ {
404
+ columns: ['SAM+', 'MAM+', 'SAM+ on therapeutic foods', 'MAM+ on supplemental foods'],
405
+ totalLabel: 'Total',
406
+ /* a client is SAM or MAM, and food is of the same clients: no row total */
407
+ rowTotals: false,
408
+ rows: [
409
+ { label: '0–5 months', cells: ['HV03-037', 'HV03-043', 'HV03-049', 'HV03-055'] },
410
+ { label: '6–59 months', cells: ['HV03-038', 'HV03-044', 'HV03-050', 'HV03-056'] },
411
+ { label: '5–9 years', cells: ['HV03-039', 'HV03-045', 'HV03-051', 'HV03-057'] },
412
+ { label: '10–17 years', cells: ['HV03-040', 'HV03-046', 'HV03-052', 'HV03-058'] },
413
+ { label: '18+ years', cells: ['HV03-041', 'HV03-047', 'HV03-053', 'HV03-059'] },
414
+ { label: 'Pregnant & lactating', cells: ['HV03-042', 'HV03-048', 'HV03-054', 'HV03-060'] },
415
+ ],
416
+ },
417
+ ],
418
+ },
419
+ {
420
+ block: '3.7 HIV in TB Clinic',
421
+ note: TB_CLINIC_NOT_REPORTED,
422
+ tables: [
423
+ {
424
+ columns: [],
425
+ rows: [
426
+ { label: 'New TB cases' },
427
+ { label: 'Known HIV positive' },
428
+ { label: 'on HAART', ofWhich: true },
429
+ { label: 'Newly tested HIV positive' },
430
+ { label: 'started HAART', ofWhich: true },
431
+ ],
432
+ },
433
+ ],
434
+ },
435
+ ],
436
+ },
437
+ {
438
+ /* no figures behind these boxes yet: rows are listed so the section reads
439
+ as on the form, each shown as – */
440
+ id: 'vmmc',
441
+ title: '4. Medical Male Circumcision',
442
+ tab: '4. VMMC',
443
+ headlines: [],
444
+ subsections: [
445
+ {
446
+ block: '4.1 Number circumcised',
447
+ note: NOT_REPORTED,
448
+ tables: [
449
+ {
450
+ columns: [],
451
+ rows: [
452
+ { label: '0–60 days' },
453
+ { label: '61 days – 9 years' },
454
+ { label: '10–14 years' },
455
+ { label: '15+ years' },
456
+ { label: 'Tested HIV+' },
457
+ { label: 'Tested HIV−' },
458
+ ],
459
+ },
460
+ ],
461
+ },
462
+ {
463
+ block: '4.2 Type of circumcission',
464
+ note: NOT_REPORTED,
465
+ tables: [
466
+ {
467
+ columns: [],
468
+ rows: [{ label: 'Surgical' }, { label: 'Devices' }],
469
+ },
470
+ ],
471
+ },
472
+ {
473
+ block: '4.3 Circumcission Adverse Events',
474
+ note: NOT_REPORTED,
475
+ tables: [
476
+ {
477
+ columns: ['Moderate', 'Severe'],
478
+ rowTotals: false,
479
+ rows: [
480
+ { label: 'During', cells: [null, null] },
481
+ { label: 'Post', cells: [null, null] },
482
+ ],
483
+ },
484
+ {
485
+ columns: [],
486
+ rows: [{ label: 'Follow up visit < 14 days' }],
487
+ },
488
+ ],
489
+ },
490
+ ],
491
+ },
492
+ {
493
+ id: 'pep',
494
+ title: '5. Post Exposure Prophylaxis',
495
+ tab: '5. PEP',
496
+ headlines: [{ label: 'Exposed', block: '5. Post Exposure Prophylaxis' }],
497
+ subsections: [
498
+ {
499
+ block: '5. Post Exposure Prophylaxis',
500
+ note: 'Other includes sexual assault. Given PEP is of the exposed.',
501
+ tables: [
502
+ {
503
+ title: 'Exposed',
504
+ columns: [],
505
+ totalLabel: 'Total exposed',
506
+ rows: [
507
+ { label: 'Occupational', only: 'HV05-01' },
508
+ { label: 'Other', only: 'HV05-02' },
509
+ ],
510
+ },
511
+ {
512
+ title: 'Given PEP',
513
+ columns: [],
514
+ totalLabel: 'Total given PEP',
515
+ rows: [
516
+ { label: 'Occupational', only: 'HV05-03' },
517
+ { label: 'Other', only: 'HV05-04' },
518
+ ],
519
+ },
520
+ ],
521
+ },
522
+ ],
523
+ },
524
+ ];
525
+
526
+ /** Codes a row adds into its table's total: none for `ofWhich` / `excluded` rows */
527
+ export function rowTotalCodes(row: SummaryRow): string[] {
528
+ return row.only ? [row.only] : (row.cells ?? []).filter((cell): cell is string => Boolean(cell));
529
+ }