 Great. Well, thank you all for having us. So we're going to be talking about scripting custom forms today, which is using external scripting languages to bring forms into DHIS2. I'm Ben Geraldi. I'm the development team leader for Datum, and that's the PEPFAR installation of DHIS2. If you're unfamiliar with PEPFAR, it's the United States of America's program to do AIDS interventions internationally. It was started under the Bush administration almost 20 years ago now. And Datum is sort of a branded installation of DHIS2, so it's not to be confused with, say, the Ministry of Health installation in the various countries that PEPFAR is active. And then I will let Jim introduce himself if he can come off with me. I'm Jim Grace. I've been a DHIS2 core developer since 2013. And before that, worked in medical records for five years for PEPFAR in Kasumu, Kenya, through the University of California, San Francisco. And before that, done a lot of other things. And now, Tim Harding. Hello, good morning. I'm Tim with the Harding. I'm a senior systems analyst for BAO Systems, and I've been working as an architect and metadata manager for Datum since 2015. I've been working with ministries of health for a lot longer. So, hello and welcome. So, yeah, okay. So the first thing we're going to talk about is default forms. So in DHIS2, it's possible to make a form. And we're going to be talking about aggregate forms here because they've been sort of the most significant lift for PEPFAR. We do use tracker forms and event forms as well, but we haven't devoted as much time to their manufacturer as we use less of them and collect less data from them. So, the default aggregate form. It brings all of the Datum elements in alphabetically and then also applies the category option combos to them and then just separates out all the fields. So just take a look at what that looks like. So we'll pick an organization unit. Well, right. And they're not here now. Interesting. Okay. I'm prepared for that. Well, I'll just present and we can talk about what they look like. We've got a graphic of them right here. And as you can see, it breaks out the positive and the male here. And displays them sort of separately. And I may attempt at a later point to actually bring the presentation in that portion of the presentation. So that's how the default form works. And that is good if you've got sort of a simple set of data elements and a simple set of category option combos. If you've got something more complicated, you might want a section form. And a section form enables you to put sections in to the form. And so it gives you sort of horizontal tabs, but it still keeps the category combos separate. And the example for that is not present either. But instead of get a sense of it here, the horizontal tabs go up at the top. And then you can see that the less than 10 age is separated into female and male and you enter each option in separately. So those didn't work for us. So because what we wanted was something a lot more complicated. And so we ended up going with a custom form, which is an option in DHS to you basically write your own HTML. And you can write JavaScript and you can write all sorts of other pieces to it. You can write your own cascading style sheets. It's like designing a web page. It's you can make it exactly how you want it, but it's a very difficult to maintain and keep in sync with the data elements and the category option combos that are loaded in your system. So let's take a look at the form that we put together. Where is this going to be? Let me just download the metadata. The presentation will be here afterwards. So you can take a look at this. This is a previous version of the presentation at the moment, but we will put the new version up here soon. So let's look at this in raw. So this is what our forms look like. And we put the year 2015 in so it wouldn't be confused with any present years. So as you can see, these numbers get automatically totaled in the JavaScript. Yeah, so let me, so this is, let's just give you an example of this and then we'll talk through what the features are so coming back to here. Okay, so what features do we have? So the main thing that we needed that was not available in the standard DHIS2 forms was an additional set of navigation. So the DHIS2 section forms come with horizontal tab navigations, but we needed a vertical navigation too along the side. Or actually, I guess the reverse they come with a vertical navigation and we needed a horizontal tab navigation and you can see that here. These tabs are not available in the default form and so we created them with our custom HTML. Auto calculation. So as you were seeing as I was entering these numbers, it would, it was using JavaScript to total them here. Mutual exclusion. So when certain numbers are entered, certain other numbers become unavailable. I'll make fun of a good example of that here. I guess that isn't on this form. But it will, it will cross out certain numbers when you enter other numbers and other portions of the form. I guess we don't have an example of that here. It also generates DHIS2 validation rules that get loaded into the system separately. So when you hit the, the run validation button, it will run those validation rules. And as we're looking at right now, it creates drafts in the static HTML. So those drafts can be sent to our program team to approve how the HTML looks. And so the form, when it's actually deployed to DHIS2 will look identical. So this is what we needed. We also had a complicated process. There were lots of changes coming fast and furious from our, from our program staff that needed a lot of things to be changed as, as, as the process went on. And often the changes were frequent, like they would change the forms from quarter to quarter to quarter and from year to year to year. As you can see in that small version of our form, there are many entry fields and our actual form is much larger than that. And there are more forms than that that we have to maintain. There's lots of interactivity, the mutual exclusion and the auto, the auto summing happen as, as the data entry clerk enters data. And then the requirements are very precise, like things need to be exactly where they're supposed to be. They need to look a certain way. They need to have certain tabs and things like that. And then oftentimes there would be changes at the very last minute that would come to us and then we would have to be able to roll with. So while we developed these HTML forms originally just in static HTML, we didn't have a good way of handling the numerous changes, the frequent changes, the urgent changes, as well as the precise requirements and the back and forth with our program staff. All right, so here's where we got to the approach. So Jim is going to tell you a story of finding Tim in a hotel room. Tim, do you want to start or shall I start? I mean, this was, what is it, how many symposiums ago? And I was unable to attend. I was stuck in a hotel room working on my related forms and metadata. And Jim felt sorry for me and decided to drop by. So Tim was saying, no, I can't go to the presentations. We're in this conference and I bought a pizza and brought it up to Tim's hotel room and said, what's going on? And he was showing me what he was trying to do with all this HTML. And I said, I bet we could script that so that we could come up with the fields you need in a spreadsheet and we could write some software to generate these forms for you. And we would have to be slaving over the HTML. So that's, that's how the software product that we're talking about today came to be. So again, our original approach was for Tim to do this all by hand and then Jim came up with the idea of having a control file processed by script. So the control file, as we call it, is just a simple spreadsheet. We use it in a CSV, although it could be anything, it could be an Excel file, it could be a Google sheet. And that spreadsheet gives us from that spreadsheet and HTML templates that we use for each individual data element. We take those two and a Python script process them both. So looks through the control file to get instructions in the HTML templates to get the exact formatting to create assets to upload to DHS to. And so all together, these three things, the control file, the HTML templates on the Python script are called Mer tide and Mer is a PEPFAR term. Well, I guess it's broader than that. But that's a monitoring evaluation and reporting for those who are familiar with that. Okay, so how does the control file look. So let's pull up a control file. Sorry, I recently switched computers so not everything is where I was expecting it to be. And so again, the control file is normally in CSV, but we're going to look at an Excel one because it's slightly better format. Let me make that a little bit more reasonable. Okay, so here's basically what we're looking at. So we come with a type and then it sort of cascades down through these various objects. So there's a type, which is the form, and then it's got all sorts of information about the form. Then it goes to the vertical tab. Or actually, rather it goes to the, it can process multiple forms. So here are two different forms that are in this, this file, then it can do vertical tabs. And then it goes through a variety of indicator names. And it's got a frequency for them and we'll talk about that in a minute. And then it's also got these rules here. So that the form, the vertical tab, the indicator and the sub indicator. And then the HTML templates, which could show you to, I guess, let me go look at that. And this is what an HTML template does. And it pulls this in and replaces anything in these curly braces with the appropriate values by the Python file. And just so you've seen it, this is what the, what Myrtite itself looks like. So it pulls in mutual exclusive rules, auto calculation rules, and then also the DHIS2 rules. The mutual exclusive rules appear in both the JavaScript and get loaded into DHIS2. The auto calculation rules are just in JavaScript. And then there are other kinds of rules, like greater than rules that get loaded into DHIS2. And then also frequency locks. Now when we were looking at the, the file, you notice that some of these things happen quarterly, annually, and semi-annually. So when we load the forms, the forms get loaded quarterly, but the semi-annually and annually are locked by JavaScript. Which means that, you know, theoretically, if you knew how to do it, you could enter data into those, but you would have to use something other than the form because the form has them locked. Okay. So what files are generated? So actually, let's do a quick run of this too. So this is what it looks like as it's running. So we tell it which CSV we're using, we tell it which DSAG files we're using, and then it gives some output, like these warnings here, and then it creates a form. And then if we open the output directory, you'll see the files that it just generated. All of those are 1016 AM, which is what time it is here on the east coast of the United States. So let's walk through what these forms are. So there's a file to import the forms into DHIS-2. That's data sets.xml. There's three files to import validation rules to DHIS-2. We could put them all in one file, but we separate them out in case you want to just load the new ones or just load the modified ones or load all of them. And then it creates static HTML versions of the forms. So we can see that right here, which can just load in your browser. And it's just one file. It's got all of the image assets and things like that pulled into it. And then it looks better if you do it here. So this is the vertical tab and the horizontal tab. And then it has a bunch of other files that probably only make sense for data, but I'm not going to go into it. And it also creates a log file. Okay. So we've given this presentation several times. We've given it at the symposium back in 2018, and we also gave it at the annual conference back in 2018. And we've talked to some of you who are on this call about this code. And we've open sourced the code in Myrtide. That repository that I was looking at to download the code for this presentation is freely accessible and no link will be at the end of this presentation. But so far we haven't found a second use case like anybody else to use this code. It is possible that that's just the way that it should be. That this approach only makes sense for PEPFAR and doesn't make sense for anyone else. But it's possible that it makes sense for other folks as well. It just needs an adaptation of the Myrtide code itself. So we wanted to put together just a little survey to determine how folks might use this code. And so we've put together a Mentimeter presentation for this. So let me see if I can do this. So if you could go to menti.com and punch in the code 7301-225. Cool. And then start answering the what country do you work in question. We've got somebody from Yemen. Working to FASO, Kenya, cool. Trying to log in myself on my phone so I can see where I am. Great. If anybody hasn't had a chance to reply, can you raise your hand? Okay. I'll give you a couple more seconds. Using the hand raising feature. Once more time. Just give a few more seconds. People are still answering. I guess I'll give it a couple more seconds. And Tim is looking at how to activate those forms so that we can see them a little bit later in the presentation. I forgot that there's a SQL script that unassigns forms that are not automatically assigned running on that server. Which ones are you looking for? They all start with myrrh tide. So there's myrrh tide section form. Or actually, I guess it's one period myrrh tide section form. And you probably have to assign them using the SQL just to sign them to global. What server is this test? Oh, it's on Ben. I hope you have SSH to that. Good luck. I can assign them anyway. I tried that and didn't work. Okay. But you feel free to try it again. Okay. I think it might be that I'm using an older version of Chrome. Okay. And Brian is in Brian. Great. Okay. So we're going to go to the next slide. Okay. So what kind of organization do you work for? I put some options. NGO, non-governmental organization, for-profit, government, military, other. If you don't want to tell us, that's fine. Yeah. And don't forget to hit the submit button. Your option won't appear until you do that. Okay. I'll go to the next slide. Okay. That's probably good. They are assigned. Great. Thank you. Could you kill the data set assignments? Just so they don't get unassigned during the presentation. Sure. Thanks. All right. Do you folks need more time? We've got 50 participants and 15 answers. So I'm guessing yes. Maybe I'll wait until we get to 20. Okay. This presentation is being recorded. You probably know that already. So if for some reason, it is awkward for you to admit to working for an NGO, not that these are identifiable in any way. Feel free to skip a question and go to the next one. All right. Cool. We'll go to the next slide. Okay. So how many people work for your organization? And because of the way Mentimeter is set up, you have to enter the number twice. It's okay. It'll just look a little weird like that. One on the right. Okay. Great. So we're mostly in the range of sort of small to 500-ish with a bunch of folks at the very large organization range. All right. Okay. So now let's get into forms. How many forms does your organization have or want to have in DHDS? Okay. Some large numbers there. Where's the greater than 100? Oh, well, greater than 100 is also greater than 20. So it's greater than 20. We could have added some more. Yeah. I didn't want to. I honestly thought there would be a few zeros at once. Oh, well, I'm glad that there aren't any zeros at once because if there were you all would probably be in the wrong presentation. And as I say that somebody logs a zero. No. Okay. Okay. So that gives us some sense. Oh, I'll give folks another second. So how many forms have you personally been involved in creating? Wow. Okay. Folks have done a lot of forms. I'll give another second for this one. I mean, most of us and some of us have done very few, which is totally cool to. Okay. Okay. So. And you can select multiple of these. Does your organization use aggregate tracker or event forms? So pick whichever ones you use. And just to be clear, the aggregate forms are in the data entry app in DHS to the tracker ones are in tracker capture. At least at least until two, three, three. I think it's supposed to move to capture at some point, but I think it hasn't. And the event forms are in capture around two through three. And before that we're in event capture. And then if you use Android tracker, those forms would be tracker forms. I guess I probably should have put a separate category for that. Cool. So folks are using the aggregate forms a lot, but the amount of forms in the tracker forms too. Okay. So how often does your organization make or revise forms? So make new forms or revise forms. Because the process of revising a form, it can be almost as complicated as the process of making a new form. I envy that person who just put just once and never revised. All right. So quarterly and the annual are the main ones. Fortunately, nobody has to deal with more than monthly. Folks, another second on this one. Right. Cool. I've been told my mic is a little quiet. So I'm going to turn it off. I'm going to turn it off. I'm going to turn it off. I'm going to turn it off. I'm going to turn it off. I've been told my mic is a little quiet. So I will try to speak up. Moving on to the next one. Okay. What programming languages would you would be most likely to be used in your organization for scripting forms or other tasks? It's fine if you don't know. You can answer multiple answers. The answers are not case sensitive. So just write whatever might be used. It's a duel between Python and order. Yeah. It just seemed to be, oh no, look at that. Yeah. Cool. Some JavaScript kicking in there. I don't think I know. Tableau. Oh, Tableau. Sorry. I couldn't read that. It's the font. It makes things harder to read. Cool. So that's a JavaScript. And of course, in the forms themselves, you would need to use JavaScript to do any of the complicated interactivity. But then creating the forms could be done in a variety of languages. And JavaScript is a great option for that. And also the forms would need HTML in order to sort of position the objects, et cetera. I don't know how you would use HTML to sort of duplicate something like what Merty does. But it's a, it could be possible. Probably you'd be using JavaScript in that case too. Okay. What features would your organization need in forms? So some possible features might be horizontal tabs, like come by default in DHS2, vertical tabs, like we put in our forms, auto calculation, automatic creation of validation rules, drafts and static HTML. And I mean, basically I have no idea what other folks would want. And it's got three options. Feel free to put, put in more than three. You'll have to submit and then reload. While we do this, I'm going to up my mic volume. Is that too loud? I'll assume not. I would, I would lower it another pip. Is that better? Yeah. We especially want to know if there are features that PEPFAR did not need, but that you need. Oh, responsive HTML. That's a good one. That's not something we have to think about for PEPFAR. Because as far as we know, pretty much people are filtered by municipality. Okay. As far as we know, people are in filtering of options. Okay. As far as we know, sorry, I keep not finishing that sentence. As far as we know, people are doing this only on desktops. The PEPFAR forms. Or we, as far as we hope, I guess, probably. Whoever wrote API for default form HTML. I'm going to put you on the spot. Feel free to just ignore this request. But if you could tell us what you meant by that, I'd be very interested. Okay. So, you can do it either in the chat or. In the community of practice about the session. The zoom chat, whichever is easiest for you. There is an API for grabbing the default form HTML. It's not. Yeah. It's not clear to me that that's what they mean though. Yeah. The desire to use that API. So I'm just curious, maybe, maybe Tim's right. We could, we could talk about that later too. Okay. Great. Let's go to the next one. Okay. So those are the features that are essential. Is there anything additional that would be nice to have and, you know, same examples apply here. Maybe. Maybe everything is essential and nothing is nice to have. So that's definitely the situation we have in, in with PEPFAR forms. All right. I'm not seeing any answers. Let's move on. It seems like it. Cool. Okay. So what are the pain points involved in making a form? If you've attempted to make a form or if you've heard about folks making a form in your organization, what, what has gone wrong? What's been difficult? No pain points. That's awesome. Go ahead. Logic edition. Double entries. Okay. Logic. What's that? That's probably skip logic. Which is doable in events and track. Yeah. Yeah. I was assuming it was like adding things like the auto calculation and the usual exclusion. Maintaining the forms. That is a good thing to be thinking about. And definitely a pain point. Document ready doesn't work. Yep. That's a thing. Is that a JavaScript joke? It's not exactly a joke. So, um, You have to use the custom DHS to events to make things happen in the forms. Um, and so if you try to use something like document ready, which is, uh, I think that's a standard J query function, but it's definitely used frequently in JavaScript. It might be a standard JavaScript collection. I forget. Um, it doesn't work because the form is already using the document ready. The DHS to code is so you can't use it. You have to use their codes. It's, which, which it's some, as you may know, sometimes doesn't fire under certain circumstances. Cool. All right. I think we should give this one another minute or two. We're running pretty far ahead of schedule. So think of all of your pain, share it with us. Data element changes as in the, the forms need to plug into different data elements. Is that what that one is? It's probably just changes in general. Okay. Last call. Okay. So what resources are available in your organization for form creation? So some possibilities or visual design, user interface design, computer programming, maybe none, maybe money. Like, I don't know. Um, and it, there's no wrong answer to this question. And, uh, as far as I know, Mentimeter can't tell, like, can't tell who you are from your various questions. So you're probably safe, but, um, I wouldn't write, um, you know, something specific about your organization. All right. We'll go with it on then. Oh, we've got some computer programmers. Okay. It was like to blow a computer. I'm sorry. I'm laughing at some half filled out wiki. That's pretty funny. I like whoever wrote me. We've all been. Well, not all of us have been there, but Tim definitely has. Oh, explain the question, please. Um, so we're just trying to sort of evaluate, um, what folks are trying to do with the forms and then what folks have as an ability to do that thing. Um, so one of the obstacles, I think that has come in terms of people using merge type for their own purposes is, you know, just resources. Like if there are no developers in your organization or, I mean, sort of computer programmers in your organization, then it's going to be hard to like adapt this computer program for your use. And it doesn't. You know, as those of you who have looked at the code, no, it doesn't work out of the box. Um, You definitely will need to make changes that work for you. Um, some of the changes are feature based. Like maybe you don't need like, um, the variety of data and specific files. Maybe you don't need vertical tabs. Um, But maybe, uh, and then some of it is just like getting it to work with your DHS to environment and things like that. So does that, I hope that helps explain the question. Learning deployment procedures, learning the, um, ins and outs of deploying to, you know, potentially six different revisions of DHS to. Yeah. And so that's, that's another point about my time. Murtite creates the deployment artifacts, but then you have to actually deploy them to the server, which could be as simple as like loading them in the input output, the import export, um, App in DHS to, but, uh, it could be more complicated than that, um, depending on your installation. Cool. All right. Okay. So if your organization has solicited outside assistance for forms, who have you hired? What have they done? You haven't. What are the obstacles? Um, For money and security are obstacles before. I'm sure there are others money being like, there's no money to hire people security being like, we can't tell people what's in our forms because of security clearances. I'm sure there are others. And I just want to say, I'm pretty sure this is true of you, Tim, and I'm really sure this is true of me and I'm pretty sure Jim as well. We're not available to hire. We're too busy. Um, with our work with back far. Um, but, um, it's possible that other people are, um, under certain circumstances. First at that BAO was the obstacle. But yeah. Um, lack of the experts. This one might be a little bit hard to parse because we have positive and negative. Yeah. I think I'm seeing where people are going with it though. Yeah. It's having difficulty answering the question. So you can write something in the form and we can explain further. We have a couple of people talking about maintenance afterwards. Yeah, that was definitely an issue that I've seen before too. Where an outside contractor creates a form, but then the local staff at the NGO are not trained in maintenance. So I think there might be one more. Yeah. Okay. So, um, just trying to figure out what are the, what are the, what are the, what are the, what are the important factors in form creation for your organization. And so I've put some down ease of entering the data for the data entry folks. Um, once the form was created ease of creating the form. Is verizing the form. Um, ability to create the form without programming. Uh, complexity of the form. If your forms are very complex. And then maintaining data quality. So, which can often be in tension with ease of creating the form needs of entering data. So data quality can take on a couple of different forms here. We're thinking. Some of the JavaScript based restrictions we have in place for timing. Uh, JavaScript based restrictions we have in place for picking specific, uh, disaggregations. Uh, It could be validation. It could be validation rules that are embedded in DHS to, it could be validation rules that are embedded into the form. It could be dual data entry. It could be min and max values. So. Give people another couple of minutes. A couple of moments to fill out this one. Thanks, Barton. I'll speak up. Right. Um, So you should. Now we're at the end of the mentor year. Oh, it's not actually happening. Um, you should be able to code to the end. And then it will allow you to download results. So here we are. Um, so actually let's just jump back to here. See if we can load those forms that were, I was going to show at the very beginning. So, um, Here's the data. Um, and as you can see, um, It's putting in a bunch of different indicators. And, um, the different category option is just sort of listing them. So. So that's the default form. And then. A section form. Gives you these horizontal tabs. But as you can see is still just listing each disaggregate. And that certainly works under some circumstances. Um, especially for smaller forms. Or simpler forms. Definitely. But then if you want to look at, Um, a simpler version of our MRT form. Um, this one, do this one. Okay. Here we go. And this, Now you can see the mutually exclusive stuff too. Which I guess wasn't working in that issue. Now version of the form. So when you enter something in this 30 to 49. It blocks out 30 to 49 here. To clear this. It opens them up again. And then, and that relates to the data quality that we're talking about there. The vertical tabs as well. Okay. So, um, I guess my next question is. Is anybody game to, um, talk about their organizations or needs. Again, this being recorded. Um, so keep that in mind. If that's, um, that's going to be problematic. Um, but. Is anybody willing to, um, to do that? And I'll, I'll sort of, um, Go through here. I guess raise your hand if you'd like to be unmuted. Maybe you can unmute yourself. Does anybody want to talk about their organizations for needs? It would be helpful to us. Um, just so you know, the participants cannot unmute themselves. So they have to raise their hand. Yeah. And if they raise their hand, then do we unmute them? Uh, yeah, I can, I can unmute the participant. Great. Thank you. Okay. We're not seeing anybody. We're not seeing anybody. We're not seeing anybody. We're not seeing anybody. We're not seeing anybody. We're not seeing anybody. We're not seeing anybody. Um, I'm new to the participants. Great. Thank you. Okay. We're not seeing anybody raise their hand if you, do you want to, if you know, I see one. Oh, okay. Yeah. Please. Yes. Good afternoon. Good evening. My name is Arafat. I'm working for W to Yemen. Uh, in Sana'a. Uh, we have a very high demand. Uh, information system. That would be like a repository for everything. I mean, we have a very complex emergency in Yemen. So we have a lot of outbreaks. We have a lot of projects that are being supported by different partners. So we are working currently to collect data for health, health cluster support for the facilities and also from the health facilities supported by W to and work bank. So we are collecting directly the data directly from the facilities and also through the partners as well. So we have over 3000 health facilities with the partners. And for W to, we have almost 200 plus hospitals, which are directly sending using the capture app. So the, the, the future it has a lot of, you know, complexity because we need a lot of programs to be integrated. Like we have the surveillance system to be integrated as they are using the custom app, which is having a lot of difficulties in terms of quality and chicken. However, they, they are interested in having workflow. So the data will be sent from one level to another and will be validated by the different level. So this was a challenge for us as well. We have also, for example, we will be implementing for the nutrition. We have implemented the pilot for the nutrition surveillance. However, we have a lot of severe, a few malnutrition children. So we need to implement the tracker for those children and to see how the referral, because the SAM cases need to be, when they are treated, they go to be like MAM. So we need to build that link to have an integrated system for all, I mean, the NGOs working in that. So we have WFP, USF and WTO. So WFP in charge of the supplies and things like that. And the USF is working on the moderate malnutrition and WTO is working on the severe malnutrition. And this will be under the umbrella of the Ministry of Health. But this is to be implemented in the future. I think this will be a very good tool. There is a very high demand for the supplies. For example, by WFP, where they want to have like an alert of SMS when the stock has decreased below the minimum level. We have also other use cases that will be implemented. But the issue as- I'm going to pause you for just a second. So this is great to know about the context that the forms are in. And a lot of the things you're talking about can be done with DHS too. But what do the forms themselves look like? Their event forms. I got that. I think I missed anything else though. Yes. So we have aggregate form and we have event form. For aggregates it's more complex. People need to better understand and we have to advocate more for the use of data rather than the data collection itself. So with the aggregate form, does it have like, I don't know, how many data elements? Oh, go ahead. Yeah. 255 elements. Data elements. And then are all those disaggregated as well? No, this is including the disaggregation. Including the disaggregation is cool. And then do you put them all on one form or do you tab them? Yeah, it's in tabs. It is well organized. It is used to capture data from the field. So people with the mobile, with the new, with the new capture app, I think it's a revolution I would say. So that is the, I'm a little unfamiliar with the Android sort of interfaces to DHS just because we don't deal with that over at PEPFAR. Does the new Android capture app do aggregate data capture? Yes. The previous one, it was not, but the new update, I think it was updated like four or five months ago. It was excellent. And I suppose that, I suppose that it has difficulty dealing with custom forms, I would think. Yes. So we're not using custom forms. That's what we're doing. Yeah. Yeah. Certainly if, in your use case, like using something like MerTide would have to mean that you could use custom forms in general, which would sort of pull you away from the capture app, which sounds like it's working for you. So then maybe you would actually want something like MerTide that was just creating, creating section, regular section forms to be deployed. And that, that could make sense under certain circumstances. And it could put together the validation rules and things like that. Yeah, I could see that. That makes sense. And some of the issues that we are facing in Yemen, so we don't have a big technical support here. Right. So what we have, for example, in one of the, in two instances, my analytics has stopped and we are struggling with that. So we created visualizations outside of DHIS. Right. Yep. Use direct query to the data, the data values, which is, which is, I think it's making a lot of resources being used. And I think it should not be the case. Yeah. Yeah. Makes sense. Cool. All right. Great. That was really helpful. Thank you. Yeah. Yeah. Does anybody else want to follow this lead? If there are any other hands up, you can invite them to speak. Cool. Right. Last call. Tim and Jim, I think that you've been looking at the questions in the chat and in the, in the, in the community of practice. It's one of you want to mention one of those questions now. We can talk about that. I haven't seen any questions in the community of practice. So I'm missing something. Tim, have you seen anything in the chat? Tim, is this one for me in the, in somewhere? How does Mertite deal with the changing forms? Yeah, I can answer that. Yeah. Yeah, that'd be great. So if you want to open up one of the control files. So this has been a more recent addition to Mertite since the first couple of, first couple of times we've presented this. This is an older control file that's not going to work. That is probably fine. So one of the things that are, that happens with PEPFAR as anybody who has worked with PEPFAR knows is that the metadata changes quite often. And so we are currently working on Mert 2.5, which is the next set of changes that will be released in January. The guidance for that should be out in October. So, so one of the things that happens is, is that we change our disaggregates. They started adding what are known as the five year age groups. So we went from having 25 to 49 to having 25 to 29 and 30 to 34. So rather than start making updates to creating new data elements, because we're at a little bit over 2000 now for Mert, we just started reusing our old ones. They added a feature to DHIS 2 that allows us to have multiple category combos per data element. But as you can guess, that sounds like a mess to keep track of. So if we scroll over to the right in this form, say to one of the DE column headers, there we go, you'll see that we have our different data elements that are going to appear for each of our different disaggregates and up to three per disaggregate file, because we have some more complex type of indicative questions. So what's interesting here is that we can also override the category combo. That would be column O, column Q, column S all the way over. And if we don't override it, but we should, Mertide will actually contact the server and say, hey, does the category option combo match with the category combo that you've selected? And if it doesn't, we'll throw an error. Yep. And so that helps us keep track, especially when we write new HTML files, which would be column I, especially when we write new HTML files is making sure that those line up with the category combos that we've assigned our data elements. Not only will it check this file, but it will also check what's assigned on the server itself. So that helps us keep our category combos in sync with our HTML files, especially because we're updating them all the time. So let's go look at the next steps. I guess, like where we would go from here, if your organization as a software developer that would like to work on scripting forms, like to adapt portions of Burtide, anything like that, let us know. This is our contact information. It'll obviously be in the recording of the presentation. And then it'll be in the slides, which are on that GitHub repo. We also want to We had a question about the GitHub repo. Let me just, let me do this first. We want to thank Kyle Pittleman and Greg Wilson, who work pretty closely with us. Greg wrote most of the JavaScripts in these forms. And Kyle Pittleman has done lots of changes to the HTML and CSV and Python sort of taking over Tim's work in maintaining the forms. So yeah, okay. Yes, let's talk. Here are these. Is that visible with this? That should answer the question about where the GitHub repo is. Yep. We can, I could paste this link in the chat. Maybe I can. Let's see. Ben, I have a question for you. Yes. Do you know of anything that PEPFAR would like to add to Burtide in the future? I try not to think about it. And the slides, an old version of the slides is available here. And we'll update with this version soon here. I don't know, Tim, do you? Well, I know we had discussed many times before starting to integrate the validation roles into the JavaScript. We have talked about that yet. And so what that would look like is, so we have integrated the mutual exclusion, the exclusive validation roles into the JavaScript. But we could also flag people when they violate other validation roles, like the greater than validation rule and things like that. So we haven't done that yet. It's a bit of a lift. And we had to figure out exactly what that would look like. But it's definitely a possibility for the future. I have a question if I may ask it up, Tim. Ben, if you could go back to the control file and scroll back over to column one. You'll see column A. You'll see some, some instructions and this may have something to do with the fact that I used to program in assembly language way back when, but in that hotel room when Tim and I first started working on this idea, we sat down and started designing what would be a spreadsheet. What do we need to capture? How do we represent all the varieties of things that we need to, to put in a form? And over the days and months and years since we started, this format has expanded. But Tim, I wonder if you could just give a brief introduction to what are those things in column A and what do they need and what do they tell Murtine to do as far as generating forms. This is only one way of representing what a form looks like. There are many, many, many possibilities, but this is, this is what we did. So for version one, if you look column A through column F were just column A and B. So the whole tree was then squished down to just two columns. And so you had to have a very keen eye to tell the difference between a form and a V tab and an indicator and a sub indicator. So for version two, we kind of spread it out into this tree like structure so that it was a lot, it was a lot easier to find, you know, form number two inside a control file. So, but what are those things in column A actually mean? So every time you see a form, that's when Murtine knows to create a new data set. And way over on the right is all the data sets information. And I hide it over on the right because we don't really need it on the left because it barely comes up. I believe that Murtite is capable of having these things out of order, but I wouldn't try it. And then right below form, we have our very first vertical tab. And so that's our V tab. So here's prevention, one of the major arms of PEPFAR. And below the vertical tab, then we've listed. So I'm just going to swap back to here for just a second so that folks can see this. So here's the form and here are the V tabs. Yep. See V tabs. And then right below there, we have our indicators and our indicators are those major groupings or major questions that we're asking to report on such as BMC CERC or key pops preventative or gender based violence. And then you see those here. And so we find that we have a lot of partners that work in only one indicator or just a subset of indicators. So logically grouping them that way so that the partner can just say, this is the only one I need to report on. Close all the rest is helpful. Then below the indicators, we have the different disaggregations that we ask the user for or the partner for. Okay. Before you go on, and then as you could see this one's quarterly, so it's always unlocked, but these are sent annually and annually. And so they're locked for this quarter, but maybe are unlocked for this quarter. So yes, because we are asking questions that have a different cadence than the data set is set for, the data set is set to be quarterly, but some of our indicators are only reported semi-annually or quarterly. So most of the time, if we got data in for the wrong quarter, it was user error and it wasn't anything delicious. So what we did to mitigate that was to create a JavaScript block that just hides those when you're selecting the wrong quarter. So keep you prepped will only show up in quarters two and four and Gen GBV will only show up in quarter four. And you can expand it, but then you can't enter anything. A lot of people like to see the forms, even if they're not allowed to enter data into them. So they know what they should be collecting. Some people prefer to both read the guidance and look at the forms. So below each of our indicators, we have what are known as sub indicators, sub indicators are just the different ways that you ask the question. So how many people did you circumcise? Okay, tell me that answer again, but tell me how many tested positive for HIV when you circumcised? How many were known HIV positive? How many were known HIV negative? How many were newly HIV negative? And so you can see over on the right that we have our text right here that just asks the user, hey, can you report this number in a couple of different ways to prevent double counting? However, we only use one of them as our numerator. And so data and all of our downstream applications that we use for presenting the results. We know that only one of these is going to be the numerator. The easy way for us to know inside here is I believe through column I or the column break before I. I thought it was L. Oh, no. So column H will tell us what that numerator is. No, H is the rules. Yep. Oh, does it tell you through here? Okay. And so it'll tell you that this row should equal another row. And so if we have any sort of auto calculates, this is how we send the data around inside of my tight. We say, here's our unique ID for this indicator. That's column F. And then in column H, we say pull that data from column F and put it in here. And F is just used within my tight. It doesn't make it to DHIS 2 at all, but it's the way that we refer to each thing in these rules. So R is the row that we're on. And any other unique indicators are from here. So you can see VMCC, VMMC's circumnumerator in both places. And so this one's a unique one that it doesn't have a auto calculate top. But there might be, there is one for KP Prev. And so KP Prev's auto numerator is pulling from there. So yeah, those are what those four commands are in column A. And then we've just spread it out in a tree like structure so that it's easy for us to quickly scroll through the control files and find what we're looking for. All right. If nobody else wants to talk about their form needs and there aren't any other questions, I guess we could end 15 minutes early. If anybody wants to post a question in the chat or raise your hand to talk about your form, you're more than welcome. Great. Well, thank you so much for coming. Feel free to ask us questions on the community of practice and we're happy to answer them. And have a great rest of your day.